mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-04-25 18:42:15 +00:00
refactor: clean up dial timeout abort
This commit is contained in:
parent
a5b54a7017
commit
b6cd48b798
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user