refactor: clean up dial timeout abort

This commit is contained in:
Jacob Heun 2019-12-04 16:59:38 +01:00
parent a5b54a7017
commit b6cd48b798
4 changed files with 12 additions and 14 deletions

View File

@ -81,24 +81,18 @@ class Dialer {
const signals = [timeoutController.signal] const signals = [timeoutController.signal]
options.signal && signals.push(options.signal) options.signal && signals.push(options.signal)
const signal = anySignal(signals) const signal = anySignal(signals)
const timeoutPromise = delay.reject(this.timeout, { const timeoutId = setTimeout(() => timeoutController.abort(), this.timeout)
value: errCode(new Error('Dial timed out'), codes.ERR_TIMEOUT)
})
try { try {
// Race the dial request and the timeout const dialResult = await dialRequest.run({ ...options, signal })
const dialResult = await Promise.race([ clearTimeout(timeoutId)
dialRequest.run({
...options,
signal
}),
timeoutPromise
])
timeoutPromise.clear()
return dialResult return dialResult
} catch (err) { } catch (err) {
// Error is a timeout
if (timeoutController.signal.aborted) {
err = errCode(err, codes.ERR_TIMEOUT)
}
log.error(err) log.error(err)
timeoutController.abort()
throw err throw err
} }
} }

View File

@ -54,7 +54,7 @@ class DialRequest {
try { try {
const signal = dialAbortControllers[i].signal const signal = dialAbortControllers[i].signal
conn = await this.dialAction(addr, { ...options, signal: anySignal([signal, options.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) dialAbortControllers.splice(i, 1)
} catch (err) { } catch (err) {
throw err throw err

View File

@ -16,6 +16,7 @@ const delay = require('delay')
const pDefer = require('p-defer') const pDefer = require('p-defer')
const pipe = require('it-pipe') const pipe = require('it-pipe')
const AggregateError = require('aggregate-error') const AggregateError = require('aggregate-error')
const { AbortError } = require('libp2p-interfaces/src/transport/errors')
const Libp2p = require('../../src') const Libp2p = require('../../src')
const Dialer = require('../../src/dialer') const Dialer = require('../../src/dialer')
@ -142,6 +143,7 @@ describe('Dialing (direct, TCP)', () => {
expect(addr.toString()).to.eql(remoteAddr.toString()) expect(addr.toString()).to.eql(remoteAddr.toString())
await delay(60) await delay(60)
expect(options.signal.aborted).to.equal(true) expect(options.signal.aborted).to.equal(true)
throw new AbortError()
}) })
await expect(dialer.connectToMultiaddr(remoteAddr)) await expect(dialer.connectToMultiaddr(remoteAddr))

View File

@ -16,6 +16,7 @@ const multiaddr = require('multiaddr')
const PeerId = require('peer-id') const PeerId = require('peer-id')
const PeerInfo = require('peer-info') const PeerInfo = require('peer-info')
const AggregateError = require('aggregate-error') const AggregateError = require('aggregate-error')
const { AbortError } = require('libp2p-interfaces/src/transport/errors')
const { codes: ErrorCodes } = require('../../src/errors') const { codes: ErrorCodes } = require('../../src/errors')
const Constants = require('../../src/constants') const Constants = require('../../src/constants')
@ -130,6 +131,7 @@ describe('Dialing (direct, WebSockets)', () => {
expect(addr.toString()).to.eql(remoteAddr.toString()) expect(addr.toString()).to.eql(remoteAddr.toString())
await delay(60) await delay(60)
expect(options.signal.aborted).to.equal(true) expect(options.signal.aborted).to.equal(true)
throw new AbortError()
}) })
await expect(dialer.connectToMultiaddr(remoteAddr)) await expect(dialer.connectToMultiaddr(remoteAddr))