From 3e79e5acda5e9f4c46bb65a874ca612d8414c94a Mon Sep 17 00:00:00 2001 From: Bojan Mojsilovic Date: Wed, 19 Jul 2023 15:14:34 +0200 Subject: [PATCH] Connect to relays in parallel --- src/lib/relays.ts | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/lib/relays.ts b/src/lib/relays.ts index 5fe30cf..6af3541 100644 --- a/src/lib/relays.ts +++ b/src/lib/relays.ts @@ -22,22 +22,22 @@ export const closeRelays = async (relays: Relay[], success = () => {}, fail = () } }; -const connectToRelay = (relay: Relay) => new Promise( +const connectToRelay: (relay: Relay) => Promise = (relay: Relay) => new Promise( (resolve, reject) => { const timeout = setTimeout(() => { relay.close(); logError(relay, null, true); - reject(); + reject(relay); }, relayConnectingTimeout); relay.connect() .then(() => { clearTimeout(timeout); - resolve(true); + resolve(relay); }) .catch((e: any) => { logError(relay, e); - reject(); + reject(relay); }); }, ); @@ -49,19 +49,28 @@ export const connectRelays = async ( const urls = Object.keys(relaySettings); const relays = urls.map(u => relayInit(u)); - const connected: Relay[] = []; + let promisses: Promise[] = []; for (let i=0; i < relays.length; i++) { const relay = relays[i]; if (relay.status === WebSocket.CLOSED) { try { - await connectToRelay(relay); - connected.push(relay); + promisses.push(connectToRelay(relay)); } catch(e){ logError(relay, e); }; } } + + const result: PromiseSettledResult[] = await Promise.allSettled(promisses); + + const connected: Relay[] = result.reduce((acc, r) => + r.status === 'fulfilled' ? + [...acc, r.value] : + [...acc], + [] as Relay[], + ); + onConnect(connected); };