1+ import * as eventBus from "../eventBus" ;
12import { ReturnData } from "../route-types/fetchDirectory" ;
23import getDirectory from "../modules/release/getDirectory" ;
34import getRelease from "../modules/release/getRelease" ;
45import isSyncing from "../utils/isSyncing" ;
56import { RpcHandlerReturnWithResult , DirectoryItem } from "../types" ;
67import Logs from "../logs" ;
78import { listContainers } from "../modules/docker/listContainers" ;
8- import { notUndefined } from "../utils/typingHelpers" ;
99import { getIsInstalled , getIsUpdated } from "./fetchDnpRequest" ;
1010import { fileToGatewayUrl } from "../utils/distributedFile" ;
11+ import { throttle } from "lodash" ;
1112const logs = Logs ( module ) ;
1213
14+ const loadThrottle = 500 ; // 0.5 seconds
15+
1316/**
1417 * Fetches all package names in the custom dappnode directory.
1518 */
@@ -24,34 +27,54 @@ export default async function fetchDirectory(): RpcHandlerReturnWithResult<
2427 } ;
2528 }
2629
30+ // Prevent sending way to many updates in case the fetching process is fast
31+ const emitDirectoryUpdate = throttle ( eventBus . directory . emit , loadThrottle ) ;
32+
2733 const dnpList = await listContainers ( ) ;
2834
29- // const directoryItemsUnordered: DirectoryItem[] = [];
35+ // Returns already sorted by: feat#0, feat#1, dnp#0, dnp#1, dnp#2
36+ const directory = await getDirectory ( ) ;
37+ const directoryDnps : DirectoryItem [ ] = directory . map (
38+ ( { name, isFeatured } ) => ( {
39+ status : "loading" ,
40+ name,
41+ whitelisted : true ,
42+ isFeatured
43+ } )
44+ ) ;
45+ emitDirectoryUpdate ( directoryDnps ) ;
3046
31- const directoryDnps = ( await Promise . all (
32- // Returns already sorted by: feat#0, feat#1, dnp#0, dnp#1, dnp#2
33- ( await getDirectory ( ) ) . map ( async ( { name, isFeatured } ) => {
47+ await Promise . all (
48+ directory . map ( async ( { name, isFeatured } , idx ) => {
49+ const whitelisted = true ;
50+ const directoryItemBasic = { name, whitelisted, isFeatured } ;
3451 try {
3552 // Now resolve the last version of the package
3653 const release = await getRelease ( name ) ;
3754 const { metadata, avatarFile } = release ;
3855
39- return {
40- name,
56+ directoryDnps [ idx ] = {
57+ ...directoryItemBasic ,
58+ status : "ok" ,
4159 description : getShortDescription ( metadata ) ,
4260 avatarUrl : fileToGatewayUrl ( avatarFile ) , // Must be URL to a resource in a DAPPMANAGER API
4361 isInstalled : getIsInstalled ( release , dnpList ) ,
4462 isUpdated : getIsUpdated ( release , dnpList ) ,
45- whitelisted : true ,
46- isFeatured,
4763 featuredStyle : metadata . style ,
4864 categories : metadata . categories || getFallBackCategories ( name ) || [ ]
49- } as DirectoryItem ;
65+ } ;
5066 } catch ( e ) {
5167 logs . error ( `Error fetching ${ name } release: ${ e . message } ` ) ;
68+ directoryDnps [ idx ] = {
69+ ...directoryItemBasic ,
70+ status : "error" ,
71+ message : e . message
72+ } ;
73+ } finally {
74+ emitDirectoryUpdate ( directoryDnps ) ;
5275 }
5376 } )
54- ) ) . filter ( notUndefined ) ;
77+ ) ;
5578
5679 return {
5780 message : `Listed directory of ${ directoryDnps . length } DNPs` ,
0 commit comments