libp2p 0.46.8 → 0.46.9-10cbc8fa

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/index.min.js +22 -22
  2. package/dist/src/autonat/index.d.ts.map +1 -1
  3. package/dist/src/autonat/index.js +18 -9
  4. package/dist/src/autonat/index.js.map +1 -1
  5. package/dist/src/circuit-relay/transport/reservation-store.js +1 -1
  6. package/dist/src/circuit-relay/transport/reservation-store.js.map +1 -1
  7. package/dist/src/circuit-relay/utils.d.ts.map +1 -1
  8. package/dist/src/circuit-relay/utils.js +14 -7
  9. package/dist/src/circuit-relay/utils.js.map +1 -1
  10. package/dist/src/config.js +2 -2
  11. package/dist/src/config.js.map +1 -1
  12. package/dist/src/connection-manager/auto-dial.d.ts +2 -0
  13. package/dist/src/connection-manager/auto-dial.d.ts.map +1 -1
  14. package/dist/src/connection-manager/auto-dial.js +19 -2
  15. package/dist/src/connection-manager/auto-dial.js.map +1 -1
  16. package/dist/src/connection-manager/constants.defaults.d.ts +4 -0
  17. package/dist/src/connection-manager/constants.defaults.d.ts.map +1 -1
  18. package/dist/src/connection-manager/constants.defaults.js +4 -0
  19. package/dist/src/connection-manager/constants.defaults.js.map +1 -1
  20. package/dist/src/connection-manager/dial-queue.js +2 -2
  21. package/dist/src/connection-manager/dial-queue.js.map +1 -1
  22. package/dist/src/connection-manager/index.d.ts +7 -0
  23. package/dist/src/connection-manager/index.d.ts.map +1 -1
  24. package/dist/src/connection-manager/index.js +2 -2
  25. package/dist/src/connection-manager/index.js.map +1 -1
  26. package/dist/src/fetch/index.d.ts.map +1 -1
  27. package/dist/src/fetch/index.js +7 -3
  28. package/dist/src/fetch/index.js.map +1 -1
  29. package/dist/src/identify/consts.d.ts +1 -1
  30. package/dist/src/identify/consts.d.ts.map +1 -1
  31. package/dist/src/libp2p.js +1 -1
  32. package/dist/src/libp2p.js.map +1 -1
  33. package/dist/src/ping/index.d.ts.map +1 -1
  34. package/dist/src/ping/index.js +7 -3
  35. package/dist/src/ping/index.js.map +1 -1
  36. package/dist/src/upgrader.d.ts.map +1 -1
  37. package/dist/src/upgrader.js +5 -4
  38. package/dist/src/upgrader.js.map +1 -1
  39. package/dist/src/version.d.ts +1 -1
  40. package/dist/src/version.d.ts.map +1 -1
  41. package/dist/src/version.js +1 -1
  42. package/dist/src/version.js.map +1 -1
  43. package/package.json +21 -22
  44. package/src/autonat/index.ts +20 -7
  45. package/src/circuit-relay/transport/reservation-store.ts +1 -1
  46. package/src/circuit-relay/utils.ts +18 -7
  47. package/src/config.ts +2 -2
  48. package/src/connection-manager/auto-dial.ts +22 -2
  49. package/src/connection-manager/constants.defaults.ts +5 -0
  50. package/src/connection-manager/dial-queue.ts +2 -2
  51. package/src/connection-manager/index.ts +10 -2
  52. package/src/fetch/index.ts +8 -3
  53. package/src/libp2p.ts +1 -1
  54. package/src/ping/index.ts +8 -3
  55. package/src/upgrader.ts +8 -5
  56. package/src/version.ts +1 -1
  57. package/dist/typedoc-urls.json +0 -58
@@ -20,17 +20,18 @@
20
20
  */
21
21
 
22
22
  import { setMaxListeners } from 'events'
23
+ import { CodeError } from '@libp2p/interface/errors'
23
24
  import { logger } from '@libp2p/logger'
24
25
  import { peerIdFromBytes } from '@libp2p/peer-id'
25
26
  import { createEd25519PeerId } from '@libp2p/peer-id-factory'
26
27
  import { multiaddr, protocols } from '@multiformats/multiaddr'
27
- import { abortableDuplex } from 'abortable-iterator'
28
28
  import first from 'it-first'
29
29
  import * as lp from 'it-length-prefixed'
30
30
  import map from 'it-map'
31
31
  import parallel from 'it-parallel'
32
32
  import { pipe } from 'it-pipe'
33
33
  import isPrivateIp from 'private-ip'
34
+ import { codes } from '../errors.js'
34
35
  import {
35
36
  MAX_INBOUND_STREAMS,
36
37
  MAX_OUTBOUND_STREAMS,
@@ -155,6 +156,12 @@ class DefaultAutoNATService implements Startable {
155
156
  async handleIncomingAutonatStream (data: IncomingStreamData): Promise<void> {
156
157
  const signal = AbortSignal.timeout(this.timeout)
157
158
 
159
+ const onAbort = (): void => {
160
+ data.stream.abort(new CodeError('handleIncomingAutonatStream timeout', codes.ERR_TIMEOUT))
161
+ }
162
+
163
+ signal.addEventListener('abort', onAbort, { once: true })
164
+
158
165
  // this controller may be used while dialing lots of peers so prevent MaxListenersExceededWarning
159
166
  // appearing in the console
160
167
  try {
@@ -166,11 +173,10 @@ class DefaultAutoNATService implements Startable {
166
173
  .map(ma => ma.toOptions().host)
167
174
 
168
175
  try {
169
- const source = abortableDuplex(data.stream, signal)
170
176
  const self = this
171
177
 
172
178
  await pipe(
173
- source,
179
+ data.stream,
174
180
  (source) => lp.decode(source),
175
181
  async function * (stream) {
176
182
  const buf = await first(stream)
@@ -379,12 +385,12 @@ class DefaultAutoNATService implements Startable {
379
385
  })
380
386
  },
381
387
  (source) => lp.encode(source),
382
- // pipe to the stream, not the abortable source other wise we
383
- // can't tell the remote when a dial timed out..
384
388
  data.stream
385
389
  )
386
390
  } catch (err) {
387
391
  log.error('error handling incoming autonat stream', err)
392
+ } finally {
393
+ signal.removeEventListener('abort', onAbort)
388
394
  }
389
395
  }
390
396
 
@@ -453,6 +459,8 @@ class DefaultAutoNATService implements Startable {
453
459
  const networkSegments: string[] = []
454
460
 
455
461
  const verifyAddress = async (peer: PeerInfo): Promise<Message.DialResponse | undefined> => {
462
+ let onAbort = (): void => {}
463
+
456
464
  try {
457
465
  log('asking %p to verify multiaddr', peer.id)
458
466
 
@@ -463,12 +471,15 @@ class DefaultAutoNATService implements Startable {
463
471
  const stream = await connection.newStream(this.protocol, {
464
472
  signal
465
473
  })
466
- const source = abortableDuplex(stream, signal)
474
+
475
+ onAbort = () => { stream.abort(new CodeError('verifyAddress timeout', codes.ERR_TIMEOUT)) }
476
+
477
+ signal.addEventListener('abort', onAbort, { once: true })
467
478
 
468
479
  const buf = await pipe(
469
480
  [request],
470
481
  (source) => lp.encode(source),
471
- source,
482
+ stream,
472
483
  (source) => lp.decode(source),
473
484
  async (stream) => first(stream)
474
485
  )
@@ -510,6 +521,8 @@ class DefaultAutoNATService implements Startable {
510
521
  return response.dialResponse
511
522
  } catch (err) {
512
523
  log.error('error asking remote to verify multiaddr', err)
524
+ } finally {
525
+ signal.removeEventListener('abort', onAbort)
513
526
  }
514
527
  }
515
528
 
@@ -261,7 +261,7 @@ export class ReservationStore extends EventEmitter<ReservationStoreEvents> imple
261
261
  options.signal?.throwIfAborted()
262
262
 
263
263
  log('requesting reservation from %p', connection.remotePeer)
264
- const stream = await connection.newStream(RELAY_V2_HOP_CODEC)
264
+ const stream = await connection.newStream(RELAY_V2_HOP_CODEC, options)
265
265
  const pbstr = pbStream(stream)
266
266
  const hopstr = pbstr.pb(HopMessage)
267
267
  await hopstr.write({ type: HopMessage.Type.RESERVE }, options)
@@ -1,8 +1,9 @@
1
+ import { CodeError } from '@libp2p/interface/errors'
1
2
  import { logger } from '@libp2p/logger'
2
- import { abortableSource } from 'abortable-iterator'
3
3
  import { anySignal } from 'any-signal'
4
4
  import { CID } from 'multiformats/cid'
5
5
  import { sha256 } from 'multiformats/hashes/sha2'
6
+ import { codes } from '../errors.js'
6
7
  import { DEFAULT_DATA_LIMIT, DEFAULT_DURATION_LIMIT } from './constants.js'
7
8
  import type { Limit } from './pb/index.js'
8
9
  import type { Stream } from '@libp2p/interface/connection'
@@ -58,9 +59,13 @@ const doRelay = (src: Stream, dst: Stream, abortSignal: AbortSignal, limit: Requ
58
59
  }
59
60
 
60
61
  queueMicrotask(() => {
61
- void dst.sink(countStreamBytes(abortableSource(src.source, signal, {
62
- abortMessage: 'duration limit exceeded'
63
- }), dataLimit))
62
+ const onAbort = (): void => {
63
+ dst.abort(new CodeError('duration limit exceeded', codes.ERR_TIMEOUT))
64
+ }
65
+
66
+ signal.addEventListener('abort', onAbort, { once: true })
67
+
68
+ void dst.sink(countStreamBytes(src.source, dataLimit))
64
69
  .catch(err => {
65
70
  log.error('error while relaying streams src -> dst', err)
66
71
  abortStreams(err)
@@ -69,6 +74,7 @@ const doRelay = (src: Stream, dst: Stream, abortSignal: AbortSignal, limit: Requ
69
74
  srcDstFinished = true
70
75
 
71
76
  if (dstSrcFinished) {
77
+ signal.removeEventListener('abort', onAbort)
72
78
  signal.clear()
73
79
  clearTimeout(timeout)
74
80
  }
@@ -76,9 +82,13 @@ const doRelay = (src: Stream, dst: Stream, abortSignal: AbortSignal, limit: Requ
76
82
  })
77
83
 
78
84
  queueMicrotask(() => {
79
- void src.sink(countStreamBytes(abortableSource(dst.source, signal, {
80
- abortMessage: 'duration limit exceeded'
81
- }), dataLimit))
85
+ const onAbort = (): void => {
86
+ src.abort(new CodeError('duration limit exceeded', codes.ERR_TIMEOUT))
87
+ }
88
+
89
+ signal.addEventListener('abort', onAbort, { once: true })
90
+
91
+ void src.sink(countStreamBytes(dst.source, dataLimit))
82
92
  .catch(err => {
83
93
  log.error('error while relaying streams dst -> src', err)
84
94
  abortStreams(err)
@@ -87,6 +97,7 @@ const doRelay = (src: Stream, dst: Stream, abortSignal: AbortSignal, limit: Requ
87
97
  dstSrcFinished = true
88
98
 
89
99
  if (srcDstFinished) {
100
+ signal.removeEventListener('abort', onAbort)
90
101
  signal.clear()
91
102
  clearTimeout(timeout)
92
103
  }
package/src/config.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { CodeError } from '@libp2p/interface/errors'
2
2
  import { FaultTolerance } from '@libp2p/interface/transport'
3
- import { publicAddressesFirst } from '@libp2p/utils/address-sort'
3
+ import { defaultAddressSort } from '@libp2p/utils/address-sort'
4
4
  import { dnsaddrResolver } from '@multiformats/multiaddr/resolvers'
5
5
  import mergeOptions from 'merge-options'
6
6
  import { codes, messages } from './errors.js'
@@ -19,7 +19,7 @@ const DefaultConfig: Partial<Libp2pInit> = {
19
19
  resolvers: {
20
20
  dnsaddr: dnsaddrResolver
21
21
  },
22
- addressSorter: publicAddressesFirst
22
+ addressSorter: defaultAddressSort
23
23
  },
24
24
  transportManager: {
25
25
  faultTolerance: FaultTolerance.FATAL_ALL
@@ -2,7 +2,7 @@ import { logger } from '@libp2p/logger'
2
2
  import { PeerMap, PeerSet } from '@libp2p/peer-collections'
3
3
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
4
4
  import { PeerJobQueue } from '../utils/peer-job-queue.js'
5
- import { AUTO_DIAL_CONCURRENCY, AUTO_DIAL_INTERVAL, AUTO_DIAL_MAX_QUEUE_LENGTH, AUTO_DIAL_PEER_RETRY_THRESHOLD, AUTO_DIAL_PRIORITY, LAST_DIAL_FAILURE_KEY, MIN_CONNECTIONS } from './constants.js'
5
+ import { AUTO_DIAL_CONCURRENCY, AUTO_DIAL_DISCOVERED_PEERS_DEBOUNCE, AUTO_DIAL_INTERVAL, AUTO_DIAL_MAX_QUEUE_LENGTH, AUTO_DIAL_PEER_RETRY_THRESHOLD, AUTO_DIAL_PRIORITY, LAST_DIAL_FAILURE_KEY, MIN_CONNECTIONS } from './constants.js'
6
6
  import type { Libp2pEvents } from '@libp2p/interface'
7
7
  import type { EventEmitter } from '@libp2p/interface/events'
8
8
  import type { PeerStore } from '@libp2p/interface/peer-store'
@@ -18,6 +18,7 @@ interface AutoDialInit {
18
18
  autoDialPriority?: number
19
19
  autoDialInterval?: number
20
20
  autoDialPeerRetryThreshold?: number
21
+ autoDialDiscoveredPeersDebounce?: number
21
22
  }
22
23
 
23
24
  interface AutoDialComponents {
@@ -32,7 +33,8 @@ const defaultOptions = {
32
33
  autoDialConcurrency: AUTO_DIAL_CONCURRENCY,
33
34
  autoDialPriority: AUTO_DIAL_PRIORITY,
34
35
  autoDialInterval: AUTO_DIAL_INTERVAL,
35
- autoDialPeerRetryThreshold: AUTO_DIAL_PEER_RETRY_THRESHOLD
36
+ autoDialPeerRetryThreshold: AUTO_DIAL_PEER_RETRY_THRESHOLD,
37
+ autoDialDiscoveredPeersDebounce: AUTO_DIAL_DISCOVERED_PEERS_DEBOUNCE
36
38
  }
37
39
 
38
40
  export class AutoDial implements Startable {
@@ -44,6 +46,7 @@ export class AutoDial implements Startable {
44
46
  private readonly autoDialIntervalMs: number
45
47
  private readonly autoDialMaxQueueLength: number
46
48
  private readonly autoDialPeerRetryThresholdMs: number
49
+ private readonly autoDialDiscoveredPeersDebounce: number
47
50
  private autoDialInterval?: ReturnType<typeof setInterval>
48
51
  private started: boolean
49
52
  private running: boolean
@@ -61,6 +64,7 @@ export class AutoDial implements Startable {
61
64
  this.autoDialIntervalMs = init.autoDialInterval ?? defaultOptions.autoDialInterval
62
65
  this.autoDialMaxQueueLength = init.maxQueueLength ?? defaultOptions.maxQueueLength
63
66
  this.autoDialPeerRetryThresholdMs = init.autoDialPeerRetryThreshold ?? defaultOptions.autoDialPeerRetryThreshold
67
+ this.autoDialDiscoveredPeersDebounce = init.autoDialDiscoveredPeersDebounce ?? defaultOptions.autoDialDiscoveredPeersDebounce
64
68
  this.started = false
65
69
  this.running = false
66
70
  this.queue = new PeerJobQueue({
@@ -77,6 +81,22 @@ export class AutoDial implements Startable {
77
81
  log.error(err)
78
82
  })
79
83
  })
84
+
85
+ // sometimes peers are discovered in quick succession so add a small
86
+ // debounce to ensure all eligible peers are autodialed
87
+ let debounce: ReturnType<typeof setTimeout>
88
+
89
+ // when new peers are discovered, dial them if we don't have
90
+ // enough connections
91
+ components.events.addEventListener('peer:discovery', () => {
92
+ clearTimeout(debounce)
93
+ debounce = setTimeout(() => {
94
+ this.autoDial()
95
+ .catch(err => {
96
+ log.error(err)
97
+ })
98
+ }, this.autoDialDiscoveredPeersDebounce)
99
+ })
80
100
  }
81
101
 
82
102
  isStarted (): boolean {
@@ -38,6 +38,11 @@ export const AUTO_DIAL_MAX_QUEUE_LENGTH = 100
38
38
  */
39
39
  export const AUTO_DIAL_PEER_RETRY_THRESHOLD = 1000 * 60
40
40
 
41
+ /**
42
+ * @see https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.ConnectionManagerInit.html#autoDialDiscoveredPeersDebounce
43
+ */
44
+ export const AUTO_DIAL_DISCOVERED_PEERS_DEBOUNCE = 10
45
+
41
46
  /**
42
47
  * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#inboundConnectionThreshold
43
48
  */
@@ -1,7 +1,7 @@
1
1
  import { setMaxListeners } from 'events'
2
2
  import { AbortError, CodeError } from '@libp2p/interface/errors'
3
3
  import { logger } from '@libp2p/logger'
4
- import { publicAddressesFirst } from '@libp2p/utils/address-sort'
4
+ import { defaultAddressSort } from '@libp2p/utils/address-sort'
5
5
  import { type Multiaddr, type Resolver, resolvers } from '@multiformats/multiaddr'
6
6
  import { dnsaddrResolver } from '@multiformats/multiaddr/resolvers'
7
7
  import { type ClearableSignal, anySignal } from 'any-signal'
@@ -51,7 +51,7 @@ interface DialerInit {
51
51
  }
52
52
 
53
53
  const defaultOptions = {
54
- addressSorter: publicAddressesFirst,
54
+ addressSorter: defaultAddressSort,
55
55
  maxParallelDials: MAX_PARALLEL_DIALS,
56
56
  maxPeerAddrsToDial: MAX_PEER_ADDRS_TO_DIAL,
57
57
  maxParallelDialsPerPeer: MAX_PARALLEL_DIALS_PER_PEER,
@@ -2,7 +2,7 @@ import { CodeError } from '@libp2p/interface/errors'
2
2
  import { KEEP_ALIVE } from '@libp2p/interface/peer-store/tags'
3
3
  import { logger } from '@libp2p/logger'
4
4
  import { PeerMap } from '@libp2p/peer-collections'
5
- import { publicAddressesFirst } from '@libp2p/utils/address-sort'
5
+ import { defaultAddressSort } from '@libp2p/utils/address-sort'
6
6
  import { type Multiaddr, type Resolver, multiaddr } from '@multiformats/multiaddr'
7
7
  import { dnsaddrResolver } from '@multiformats/multiaddr/resolvers'
8
8
  import { RateLimiterMemory } from 'rate-limiter-flexible'
@@ -72,6 +72,14 @@ export interface ConnectionManagerInit {
72
72
  */
73
73
  autoDialPeerRetryThreshold?: number
74
74
 
75
+ /**
76
+ * Newly discovered peers may be auto-dialed to increase the number of open
77
+ * connections, but they can be discovered in quick succession so add a small
78
+ * delay before attempting to dial them in case more peers have been
79
+ * discovered. (default: 10ms)
80
+ */
81
+ autoDialDiscoveredPeersDebounce?: number
82
+
75
83
  /**
76
84
  * Sort the known addresses of a peer before trying to dial, By default public
77
85
  * addresses will be dialled before private (e.g. loopback or LAN) addresses.
@@ -246,7 +254,7 @@ export class DefaultConnectionManager implements ConnectionManager, Startable {
246
254
  transportManager: components.transportManager,
247
255
  connectionGater: components.connectionGater
248
256
  }, {
249
- addressSorter: init.addressSorter ?? publicAddressesFirst,
257
+ addressSorter: init.addressSorter ?? defaultAddressSort,
250
258
  maxParallelDials: init.maxParallelDials ?? MAX_PARALLEL_DIALS,
251
259
  maxPeerAddrsToDial: init.maxPeerAddrsToDial ?? MAX_PEER_ADDRS_TO_DIAL,
252
260
  dialTimeout: init.dialTimeout ?? DIAL_TIMEOUT,
@@ -1,7 +1,6 @@
1
1
  import { setMaxListeners } from 'events'
2
2
  import { CodeError } from '@libp2p/interface/errors'
3
3
  import { logger } from '@libp2p/logger'
4
- import { abortableDuplex } from 'abortable-iterator'
5
4
  import first from 'it-first'
6
5
  import * as lp from 'it-length-prefixed'
7
6
  import { pipe } from 'it-pipe'
@@ -140,6 +139,7 @@ class DefaultFetchService implements Startable, FetchService {
140
139
  const connection = await this.components.connectionManager.openConnection(peer, options)
141
140
  let signal = options.signal
142
141
  let stream: Stream | undefined
142
+ let onAbort = (): void => {}
143
143
 
144
144
  // create a timeout if no abort signal passed
145
145
  if (signal == null) {
@@ -157,15 +157,19 @@ class DefaultFetchService implements Startable, FetchService {
157
157
  signal
158
158
  })
159
159
 
160
+ onAbort = () => {
161
+ stream?.abort(new CodeError('fetch timeout', codes.ERR_TIMEOUT))
162
+ }
163
+
160
164
  // make stream abortable
161
- const source = abortableDuplex(stream, signal)
165
+ signal.addEventListener('abort', onAbort, { once: true })
162
166
 
163
167
  log('fetch %s', key)
164
168
 
165
169
  const result = await pipe(
166
170
  [FetchRequest.encode({ identifier: key })],
167
171
  (source) => lp.encode(source),
168
- source,
172
+ stream,
169
173
  (source) => lp.decode(source),
170
174
  async function (source) {
171
175
  const buf = await first(source)
@@ -200,6 +204,7 @@ class DefaultFetchService implements Startable, FetchService {
200
204
 
201
205
  return result ?? null
202
206
  } finally {
207
+ signal.removeEventListener('abort', onAbort)
203
208
  if (stream != null) {
204
209
  await stream.close()
205
210
  }
package/src/libp2p.ts CHANGED
@@ -105,7 +105,7 @@ export class Libp2pNode<T extends ServiceMap = Record<string, unknown>> extends
105
105
  protocols: evt.detail.peer.protocols
106
106
  }
107
107
 
108
- this.safeDispatchEvent('peer:discovery', { detail: peerInfo })
108
+ components.events.safeDispatchEvent('peer:discovery', { detail: peerInfo })
109
109
  }
110
110
  })
111
111
 
package/src/ping/index.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { randomBytes } from '@libp2p/crypto'
2
2
  import { CodeError } from '@libp2p/interface/errors'
3
3
  import { logger } from '@libp2p/logger'
4
- import { abortableDuplex } from 'abortable-iterator'
5
4
  import first from 'it-first'
6
5
  import { pipe } from 'it-pipe'
7
6
  import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
@@ -108,6 +107,7 @@ class DefaultPingService implements Startable, PingService {
108
107
  const data = randomBytes(PING_LENGTH)
109
108
  const connection = await this.components.connectionManager.openConnection(peer, options)
110
109
  let stream: Stream | undefined
110
+ let onAbort = (): void => {}
111
111
 
112
112
  options.signal = options.signal ?? AbortSignal.timeout(this.timeout)
113
113
 
@@ -117,12 +117,16 @@ class DefaultPingService implements Startable, PingService {
117
117
  runOnTransientConnection: this.runOnTransientConnection
118
118
  })
119
119
 
120
+ onAbort = () => {
121
+ stream?.abort(new CodeError('ping timeout', codes.ERR_TIMEOUT))
122
+ }
123
+
120
124
  // make stream abortable
121
- const source = abortableDuplex(stream, options.signal)
125
+ options.signal.addEventListener('abort', onAbort, { once: true })
122
126
 
123
127
  const result = await pipe(
124
128
  [data],
125
- source,
129
+ stream,
126
130
  async (source) => first(source)
127
131
  )
128
132
 
@@ -146,6 +150,7 @@ class DefaultPingService implements Startable, PingService {
146
150
 
147
151
  throw err
148
152
  } finally {
153
+ options.signal.removeEventListener('abort', onAbort)
149
154
  if (stream != null) {
150
155
  await stream.close()
151
156
  }
package/src/upgrader.ts CHANGED
@@ -3,7 +3,6 @@ import { CodeError } from '@libp2p/interface/errors'
3
3
  import { logger } from '@libp2p/logger'
4
4
  import * as mss from '@libp2p/multistream-select'
5
5
  import { peerIdFromString } from '@libp2p/peer-id'
6
- import { abortableDuplex } from 'abortable-iterator'
7
6
  import { createConnection } from './connection/index.js'
8
7
  import { INBOUND_UPGRADE_TIMEOUT } from './connection-manager/constants.js'
9
8
  import { codes } from './errors.js'
@@ -165,16 +164,18 @@ export class DefaultUpgrader implements Upgrader {
165
164
 
166
165
  const signal = AbortSignal.timeout(this.inboundUpgradeTimeout)
167
166
 
167
+ const onAbort = (): void => {
168
+ maConn.abort(new CodeError('inbound upgrade timeout', codes.ERR_TIMEOUT))
169
+ }
170
+
171
+ signal.addEventListener('abort', onAbort, { once: true })
172
+
168
173
  try {
169
174
  // fails on node < 15.4
170
175
  setMaxListeners?.(Infinity, signal)
171
176
  } catch { }
172
177
 
173
178
  try {
174
- const abortableStream = abortableDuplex(maConn, signal)
175
- maConn.source = abortableStream.source
176
- maConn.sink = abortableStream.sink
177
-
178
179
  if ((await this.components.connectionGater.denyInboundConnection?.(maConn)) === true) {
179
180
  throw new CodeError('The multiaddr connection is blocked by gater.acceptConnection', codes.ERR_CONNECTION_INTERCEPTED)
180
181
  }
@@ -255,6 +256,8 @@ export class DefaultUpgrader implements Upgrader {
255
256
  transient: opts?.transient
256
257
  })
257
258
  } finally {
259
+ signal.removeEventListener('abort', onAbort)
260
+
258
261
  this.components.connectionManager.afterUpgradeInbound()
259
262
  }
260
263
  }
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- export const version = '0.46.8'
1
+ export const version = '0.46.9-10cbc8fa'
2
2
  export const name = 'libp2p'
@@ -1,58 +0,0 @@
1
- {
2
- "AutoNATComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.autonat.AutoNATComponents.html",
3
- "AutoNATServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.autonat.AutoNATServiceInit.html",
4
- "autoNATService": "https://libp2p.github.io/js-libp2p/functions/libp2p.autonat.autoNATService.html",
5
- "codec": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.unknown.Limit.codec.html",
6
- "decode": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.unknown.Limit.decode.html",
7
- "encode": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.unknown.Limit.encode.html",
8
- "Limit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.circuit_relay.unknown.Limit-1.html",
9
- "CircuitRelayService": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.circuit_relay.CircuitRelayService.html",
10
- "CircuitRelayServiceEvents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.circuit_relay.CircuitRelayServiceEvents.html",
11
- "RelayReservation": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.circuit_relay.RelayReservation.html",
12
- "circuitRelayServer": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.circuitRelayServer.html",
13
- "circuitRelayTransport": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.circuitRelayTransport.html",
14
- "FetchService": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.FetchService.html",
15
- "FetchServiceComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.FetchServiceComponents.html",
16
- "FetchServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.FetchServiceInit.html",
17
- "HandleMessageOptions": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.HandleMessageOptions.html",
18
- "LookupFunction": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.LookupFunction.html",
19
- "fetchService": "https://libp2p.github.io/js-libp2p/functions/libp2p.fetch.fetchService-1.html",
20
- "Identify": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.identify.unknown.Identify-1.html",
21
- "IdentifyService": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.identify.IdentifyService.html",
22
- "IdentifyServiceComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.identify.IdentifyServiceComponents.html",
23
- "IdentifyServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.identify.IdentifyServiceInit.html",
24
- "Message": "https://libp2p.github.io/js-libp2p/variables/libp2p.identify.Message.html",
25
- "multicodecs": "https://libp2p.github.io/js-libp2p/variables/libp2p.identify.multicodecs.html",
26
- "identifyService": "https://libp2p.github.io/js-libp2p/functions/libp2p.identify.identifyService-1.html",
27
- "AddressFilter": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.AddressFilter.html",
28
- "AddressManagerInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.AddressManagerInit.html",
29
- "Components": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.Components.html",
30
- "ConnectionManagerInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.ConnectionManagerInit.html",
31
- "TransportManagerInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.TransportManagerInit.html",
32
- "Libp2pInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.Libp2pInit.html",
33
- "Libp2pOptions": "https://libp2p.github.io/js-libp2p/types/libp2p.index.Libp2pOptions.html",
34
- "ServiceFactoryMap": "https://libp2p.github.io/js-libp2p/types/libp2p.index.ServiceFactoryMap.html",
35
- "createLibp2p": "https://libp2p.github.io/js-libp2p/functions/libp2p.index.createLibp2p.html",
36
- "plaintext": "https://libp2p.github.io/js-libp2p/functions/libp2p.insecure.plaintext.html",
37
- "PingService": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.ping.PingService.html",
38
- "PingServiceComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.ping.PingServiceComponents.html",
39
- "PingServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.ping.PingServiceInit.html",
40
- "pingService": "https://libp2p.github.io/js-libp2p/functions/libp2p.ping.pingService-1.html",
41
- "ProtectorInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.pnet.ProtectorInit.html",
42
- "generateKey": "https://libp2p.github.io/js-libp2p/functions/libp2p.pnet.generateKey.html",
43
- "preSharedKey": "https://libp2p.github.io/js-libp2p/functions/libp2p.pnet.preSharedKey.html",
44
- "UPnPNAT": "https://libp2p.github.io/js-libp2p/classes/libp2p.upnp_nat.unknown.UPnPNAT.html",
45
- "AdvertServiceComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.AdvertServiceComponents.html",
46
- "AdvertServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.AdvertServiceInit.html",
47
- "CircuitRelayServerComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.CircuitRelayServerComponents.html",
48
- "CircuitRelayServerInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.CircuitRelayServerInit.html",
49
- "CircuitRelayTransportComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.CircuitRelayTransportComponents.html",
50
- "CircuitRelayTransportInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.CircuitRelayTransportInit.html",
51
- "RelayDiscoveryComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.RelayDiscoveryComponents.html",
52
- "RelayStoreInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.RelayStoreInit.html",
53
- "ReservationStoreInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.ReservationStoreInit.html",
54
- "PMPOptions": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.PMPOptions.html",
55
- "UPnPNATComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.UPnPNATComponents.html",
56
- "UPnPNATInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.UPnPNATInit.html",
57
- "uPnPNATService": "https://libp2p.github.io/js-libp2p/functions/libp2p.upnp_nat.uPnPNATService.html"
58
- }