From ed2c0e0821b25c30389e98488d2e790055c331a6 Mon Sep 17 00:00:00 2001 From: Amy Yan Date: Thu, 9 Nov 2023 11:01:11 +1100 Subject: [PATCH] fix: timeout for `findNodeLocal` is now based on `nodeConnectionManager.connectionConnectTimeoutTime` --- src/nodes/NodeConnectionManager.ts | 33 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/nodes/NodeConnectionManager.ts b/src/nodes/NodeConnectionManager.ts index 2299957a0..e3a91a458 100644 --- a/src/nodes/NodeConnectionManager.ts +++ b/src/nodes/NodeConnectionManager.ts @@ -1387,7 +1387,7 @@ class NodeConnectionManager { */ public findNodeLocal( targetNodeId: NodeId, - ctx?: Partial, + ctx?: Partial, ): PromiseCancellable>; @ready(new nodesErrors.ErrorNodeConnectionManagerNotRunning()) @timedCancellable( @@ -1407,17 +1407,17 @@ class NodeConnectionManager { } // First check if we already have an existing MDNS Service const mdnsOptions = { type: 'polykey', protocol: 'udp' } as const; - let service = this.mdns.networkServices.get( + let service: ServicePOJO | void = this.mdns.networkServices.get( mdnsUtils.toFqdn({ name: encodedNodeId, ...mdnsOptions }), ); if (service == null) { // Setup promises - ctx.signal.throwIfAborted(); - const { p: abortP, rejectP: rejectAbortP } = utils.promise(); + const { p: endedP, resolveP: resolveEndedP } = utils.promise(); const abortHandler = () => { - rejectAbortP(ctx.signal.reason); + resolveEndedP(); }; ctx.signal.addEventListener('abort', abortHandler, { once: true }); + ctx.timer.catch(() => {}).finally(() => abortHandler()); const { p: serviceP, resolveP: resolveServiceP } = utils.promise(); const handleEventMDNSService = (evt: mdnsEvents.EventMDNSService) => { @@ -1434,17 +1434,13 @@ class NodeConnectionManager { this.mdns.stopQuery(mdnsOptions); this.mdns.startQuery(mdnsOptions); // Race promises to find node or timeout - try { - service = await Promise.race([serviceP, abortP]); - } catch { - this.mdns.removeEventListener( - mdnsEvents.EventMDNSService.name, - handleEventMDNSService, - ); - } finally { - this.mdns.stopQuery(mdnsOptions); - ctx.signal.removeEventListener('abort', abortHandler); - } + service = await Promise.race([serviceP, endedP]); + this.mdns.removeEventListener( + mdnsEvents.EventMDNSService.name, + handleEventMDNSService, + ); + this.mdns.stopQuery(mdnsOptions); + ctx.signal.removeEventListener('abort', abortHandler); } // If the service is not found, just return no addresses if (service == null) { @@ -1506,7 +1502,10 @@ class NodeConnectionManager { @context ctx: ContextTimed, ): Promise> { const [localAddresses, kademliaAddress] = await Promise.allSettled([ - this.findNodeLocal(targetNodeId, ctx), + this.findNodeLocal(targetNodeId, { + signal: ctx.signal, + timer: pingTimeoutTime ?? this.connectionConnectTimeoutTime, + }), this.findNode(targetNodeId, pingTimeoutTime, ctx), ]); const addresses =