diff --git a/src/dialer.js b/src/dialer.js index 3306af07..3cb7ae00 100644 --- a/src/dialer.js +++ b/src/dialer.js @@ -81,24 +81,18 @@ class Dialer { const signals = [timeoutController.signal] options.signal && signals.push(options.signal) const signal = anySignal(signals) - const timeoutPromise = delay.reject(this.timeout, { - value: errCode(new Error('Dial timed out'), codes.ERR_TIMEOUT) - }) + const timeoutId = setTimeout(() => timeoutController.abort(), this.timeout) try { - // Race the dial request and the timeout - const dialResult = await Promise.race([ - dialRequest.run({ - ...options, - signal - }), - timeoutPromise - ]) - timeoutPromise.clear() + const dialResult = await dialRequest.run({ ...options, signal }) + clearTimeout(timeoutId) return dialResult } catch (err) { + // Error is a timeout + if (timeoutController.signal.aborted) { + err = errCode(err, codes.ERR_TIMEOUT) + } log.error(err) - timeoutController.abort() throw err } } diff --git a/src/dialer/dial-request.js b/src/dialer/dial-request.js index 02a6675a..d4e952e8 100644 --- a/src/dialer/dial-request.js +++ b/src/dialer/dial-request.js @@ -54,7 +54,7 @@ class DialRequest { try { const signal = dialAbortControllers[i].signal conn = await this.dialAction(addr, { ...options, signal: anySignal([signal, options.signal]) }) - // Remove the successful AbortController so it is no aborted + // Remove the successful AbortController so it is not aborted dialAbortControllers.splice(i, 1) } catch (err) { throw err diff --git a/test/dialing/direct.node.js b/test/dialing/direct.node.js index a24a39ac..bac268c6 100644 --- a/test/dialing/direct.node.js +++ b/test/dialing/direct.node.js @@ -16,6 +16,7 @@ const delay = require('delay') const pDefer = require('p-defer') const pipe = require('it-pipe') const AggregateError = require('aggregate-error') +const { AbortError } = require('libp2p-interfaces/src/transport/errors') const Libp2p = require('../../src') const Dialer = require('../../src/dialer') @@ -142,6 +143,7 @@ describe('Dialing (direct, TCP)', () => { expect(addr.toString()).to.eql(remoteAddr.toString()) await delay(60) expect(options.signal.aborted).to.equal(true) + throw new AbortError() }) await expect(dialer.connectToMultiaddr(remoteAddr)) diff --git a/test/dialing/direct.spec.js b/test/dialing/direct.spec.js index 0b6a9276..6626d54d 100644 --- a/test/dialing/direct.spec.js +++ b/test/dialing/direct.spec.js @@ -16,6 +16,7 @@ const multiaddr = require('multiaddr') const PeerId = require('peer-id') const PeerInfo = require('peer-info') const AggregateError = require('aggregate-error') +const { AbortError } = require('libp2p-interfaces/src/transport/errors') const { codes: ErrorCodes } = require('../../src/errors') const Constants = require('../../src/constants') @@ -130,6 +131,7 @@ describe('Dialing (direct, WebSockets)', () => { expect(addr.toString()).to.eql(remoteAddr.toString()) await delay(60) expect(options.signal.aborted).to.equal(true) + throw new AbortError() }) await expect(dialer.connectToMultiaddr(remoteAddr))