libp2p 2.9.0 → 2.10.0-8484de8a2

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 (119) hide show
  1. package/dist/index.min.js +13 -17
  2. package/dist/index.min.js.map +4 -4
  3. package/dist/src/address-manager/dns-mappings.d.ts +1 -2
  4. package/dist/src/address-manager/dns-mappings.d.ts.map +1 -1
  5. package/dist/src/address-manager/dns-mappings.js +40 -44
  6. package/dist/src/address-manager/dns-mappings.js.map +1 -1
  7. package/dist/src/address-manager/index.d.ts.map +1 -1
  8. package/dist/src/address-manager/index.js +31 -14
  9. package/dist/src/address-manager/index.js.map +1 -1
  10. package/dist/src/address-manager/ip-mappings.d.ts +1 -0
  11. package/dist/src/address-manager/ip-mappings.d.ts.map +1 -1
  12. package/dist/src/address-manager/ip-mappings.js +51 -40
  13. package/dist/src/address-manager/ip-mappings.js.map +1 -1
  14. package/dist/src/address-manager/observed-addresses.d.ts.map +1 -1
  15. package/dist/src/address-manager/observed-addresses.js +1 -3
  16. package/dist/src/address-manager/observed-addresses.js.map +1 -1
  17. package/dist/src/address-manager/transport-addresses.d.ts.map +1 -1
  18. package/dist/src/address-manager/transport-addresses.js +6 -8
  19. package/dist/src/address-manager/transport-addresses.js.map +1 -1
  20. package/dist/src/config/connection-gater.browser.d.ts.map +1 -1
  21. package/dist/src/config/connection-gater.browser.js +3 -9
  22. package/dist/src/config/connection-gater.browser.js.map +1 -1
  23. package/dist/src/config.js +1 -1
  24. package/dist/src/config.js.map +1 -1
  25. package/dist/src/connection-manager/address-sorter.d.ts.map +1 -1
  26. package/dist/src/connection-manager/address-sorter.js +1 -2
  27. package/dist/src/connection-manager/address-sorter.js.map +1 -1
  28. package/dist/src/connection-manager/connection-pruner.d.ts.map +1 -1
  29. package/dist/src/connection-manager/connection-pruner.js +7 -3
  30. package/dist/src/connection-manager/connection-pruner.js.map +1 -1
  31. package/dist/src/connection-manager/constants.defaults.d.ts +4 -0
  32. package/dist/src/connection-manager/constants.defaults.d.ts.map +1 -1
  33. package/dist/src/connection-manager/constants.defaults.js +4 -0
  34. package/dist/src/connection-manager/constants.defaults.js.map +1 -1
  35. package/dist/src/connection-manager/dial-queue.d.ts +2 -2
  36. package/dist/src/connection-manager/dial-queue.d.ts.map +1 -1
  37. package/dist/src/connection-manager/dial-queue.js +13 -25
  38. package/dist/src/connection-manager/dial-queue.js.map +1 -1
  39. package/dist/src/connection-manager/index.d.ts +10 -2
  40. package/dist/src/connection-manager/index.d.ts.map +1 -1
  41. package/dist/src/connection-manager/index.js +45 -27
  42. package/dist/src/connection-manager/index.js.map +1 -1
  43. package/dist/src/connection-manager/reconnect-queue.js +1 -1
  44. package/dist/src/connection-manager/reconnect-queue.js.map +1 -1
  45. package/dist/src/connection-manager/utils.d.ts +31 -3
  46. package/dist/src/connection-manager/utils.d.ts.map +1 -1
  47. package/dist/src/connection-manager/utils.js +99 -18
  48. package/dist/src/connection-manager/utils.js.map +1 -1
  49. package/dist/src/connection-monitor.d.ts +1 -1
  50. package/dist/src/connection-monitor.d.ts.map +1 -1
  51. package/dist/src/connection-monitor.js +2 -3
  52. package/dist/src/connection-monitor.js.map +1 -1
  53. package/dist/src/connection.d.ts +62 -0
  54. package/dist/src/connection.d.ts.map +1 -0
  55. package/dist/src/connection.js +239 -0
  56. package/dist/src/connection.js.map +1 -0
  57. package/dist/src/get-peer.js +3 -3
  58. package/dist/src/get-peer.js.map +1 -1
  59. package/dist/src/index.d.ts +2 -2
  60. package/dist/src/index.js +2 -2
  61. package/dist/src/libp2p.d.ts.map +1 -1
  62. package/dist/src/libp2p.js +5 -5
  63. package/dist/src/libp2p.js.map +1 -1
  64. package/dist/src/peer-routing.js +1 -1
  65. package/dist/src/peer-routing.js.map +1 -1
  66. package/dist/src/random-walk.d.ts.map +1 -1
  67. package/dist/src/random-walk.js +13 -3
  68. package/dist/src/random-walk.js.map +1 -1
  69. package/dist/src/registrar.d.ts +3 -3
  70. package/dist/src/registrar.d.ts.map +1 -1
  71. package/dist/src/registrar.js +50 -41
  72. package/dist/src/registrar.js.map +1 -1
  73. package/dist/src/transport-manager.js +15 -2
  74. package/dist/src/transport-manager.js.map +1 -1
  75. package/dist/src/upgrader.d.ts +27 -25
  76. package/dist/src/upgrader.d.ts.map +1 -1
  77. package/dist/src/upgrader.js +97 -336
  78. package/dist/src/upgrader.js.map +1 -1
  79. package/dist/src/utils.d.ts +3 -0
  80. package/dist/src/utils.d.ts.map +1 -0
  81. package/dist/src/utils.js +25 -0
  82. package/dist/src/utils.js.map +1 -0
  83. package/dist/src/version.d.ts +1 -1
  84. package/dist/src/version.d.ts.map +1 -1
  85. package/dist/src/version.js +1 -1
  86. package/dist/src/version.js.map +1 -1
  87. package/package.json +26 -30
  88. package/src/address-manager/dns-mappings.ts +51 -51
  89. package/src/address-manager/index.ts +37 -17
  90. package/src/address-manager/ip-mappings.ts +64 -44
  91. package/src/address-manager/observed-addresses.ts +1 -3
  92. package/src/address-manager/transport-addresses.ts +7 -9
  93. package/src/config/connection-gater.browser.ts +3 -12
  94. package/src/config.ts +1 -1
  95. package/src/connection-manager/address-sorter.ts +1 -2
  96. package/src/connection-manager/connection-pruner.ts +8 -3
  97. package/src/connection-manager/constants.defaults.ts +5 -0
  98. package/src/connection-manager/dial-queue.ts +14 -29
  99. package/src/connection-manager/index.ts +62 -29
  100. package/src/connection-manager/reconnect-queue.ts +1 -1
  101. package/src/connection-manager/utils.ts +129 -21
  102. package/src/connection-monitor.ts +3 -4
  103. package/src/connection.ts +316 -0
  104. package/src/get-peer.ts +3 -3
  105. package/src/index.ts +2 -2
  106. package/src/libp2p.ts +5 -6
  107. package/src/peer-routing.ts +1 -1
  108. package/src/random-walk.ts +13 -3
  109. package/src/registrar.ts +67 -54
  110. package/src/transport-manager.ts +18 -2
  111. package/src/upgrader.ts +143 -421
  112. package/src/utils.ts +31 -0
  113. package/src/version.ts +1 -1
  114. package/dist/src/connection/index.d.ts +0 -84
  115. package/dist/src/connection/index.d.ts.map +0 -1
  116. package/dist/src/connection/index.js +0 -144
  117. package/dist/src/connection/index.js.map +0 -1
  118. package/dist/typedoc-urls.json +0 -24
  119. package/src/connection/index.ts +0 -199
package/src/registrar.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { InvalidParametersError } from '@libp2p/interface'
2
- import { mergeOptions } from '@libp2p/utils/merge-options'
3
- import { trackedMap } from '@libp2p/utils/tracked-map'
4
- import * as errorsJs from './errors.js'
2
+ import { mergeOptions, trackedMap } from '@libp2p/utils'
3
+ import { DuplicateProtocolHandlerError, UnhandledProtocolError } from './errors.js'
5
4
  import type { IdentifyResult, Libp2pEvents, Logger, PeerUpdate, PeerId, PeerStore, Topology, StreamHandler, StreamHandlerRecord, StreamHandlerOptions, AbortOptions, Metrics } from '@libp2p/interface'
6
5
  import type { Registrar as RegistrarInterface } from '@libp2p/interface-internal'
7
6
  import type { ComponentLogger } from '@libp2p/logger'
@@ -68,7 +67,7 @@ export class Registrar implements RegistrarInterface {
68
67
  const handler = this.handlers.get(protocol)
69
68
 
70
69
  if (handler == null) {
71
- throw new errorsJs.UnhandledProtocolError(`No handler registered for protocol ${protocol}`)
70
+ throw new UnhandledProtocolError(`No handler registered for protocol ${protocol}`)
72
71
  }
73
72
 
74
73
  return handler
@@ -91,7 +90,7 @@ export class Registrar implements RegistrarInterface {
91
90
  */
92
91
  async handle (protocol: string, handler: StreamHandler, opts?: StreamHandlerOptions): Promise<void> {
93
92
  if (this.handlers.has(protocol) && opts?.force !== true) {
94
- throw new errorsJs.DuplicateProtocolHandlerError(`Handler already registered for protocol ${protocol}`)
93
+ throw new DuplicateProtocolHandlerError(`Handler already registered for protocol ${protocol}`)
95
94
  }
96
95
 
97
96
  const options = mergeOptions.bind({ ignoreUndefined: true })({
@@ -168,66 +167,74 @@ export class Registrar implements RegistrarInterface {
168
167
  /**
169
168
  * Remove a disconnected peer from the record
170
169
  */
171
- _onDisconnect (evt: CustomEvent<PeerId>): void {
170
+ async _onDisconnect (evt: CustomEvent<PeerId>): Promise<void> {
172
171
  const remotePeer = evt.detail
173
172
  const options = {
174
173
  signal: AbortSignal.timeout(5_000)
175
174
  }
176
175
 
177
- void this.components.peerStore.get(remotePeer, options)
178
- .then(peer => {
179
- for (const protocol of peer.protocols) {
180
- const topologies = this.topologies.get(protocol)
176
+ try {
177
+ const peer = await this.components.peerStore.get(remotePeer, options)
181
178
 
182
- if (topologies == null) {
183
- // no topologies are interested in this protocol
184
- continue
185
- }
179
+ for (const protocol of peer.protocols) {
180
+ const topologies = this.topologies.get(protocol)
186
181
 
187
- for (const topology of topologies.values()) {
182
+ if (topologies == null) {
183
+ // no topologies are interested in this protocol
184
+ continue
185
+ }
186
+
187
+ await Promise.all(
188
+ [...topologies.values()].map(async topology => {
188
189
  if (topology.filter?.has(remotePeer) === false) {
189
- continue
190
+ return
190
191
  }
191
192
 
192
193
  topology.filter?.remove(remotePeer)
193
- topology.onDisconnect?.(remotePeer)
194
- }
195
- }
196
- })
197
- .catch(err => {
198
- if (err.name === 'NotFoundError') {
199
- // peer has not completed identify so they are not in the peer store
200
- return
201
- }
194
+ await topology.onDisconnect?.(remotePeer)
195
+ })
196
+ )
197
+ }
198
+ } catch (err: any) {
199
+ if (err.name === 'NotFoundError') {
200
+ // peer has not completed identify so they are not in the peer store
201
+ return
202
+ }
202
203
 
203
- this.log.error('could not inform topologies of disconnecting peer %p', remotePeer, err)
204
- })
204
+ this.log.error('could not inform topologies of disconnecting peer %p - %e', remotePeer, err)
205
+ }
205
206
  }
206
207
 
207
208
  /**
208
209
  * When a peer is updated, if they have removed supported protocols notify any
209
210
  * topologies interested in the removed protocols.
210
211
  */
211
- _onPeerUpdate (evt: CustomEvent<PeerUpdate>): void {
212
+ async _onPeerUpdate (evt: CustomEvent<PeerUpdate>): Promise<void> {
212
213
  const { peer, previous } = evt.detail
213
214
  const removed = (previous?.protocols ?? []).filter(protocol => !peer.protocols.includes(protocol))
214
215
 
215
- for (const protocol of removed) {
216
- const topologies = this.topologies.get(protocol)
217
-
218
- if (topologies == null) {
219
- // no topologies are interested in this protocol
220
- continue
221
- }
216
+ try {
217
+ for (const protocol of removed) {
218
+ const topologies = this.topologies.get(protocol)
222
219
 
223
- for (const topology of topologies.values()) {
224
- if (topology.filter?.has(peer.id) === false) {
220
+ if (topologies == null) {
221
+ // no topologies are interested in this protocol
225
222
  continue
226
223
  }
227
224
 
228
- topology.filter?.remove(peer.id)
229
- topology.onDisconnect?.(peer.id)
225
+ await Promise.all(
226
+ [...topologies.values()].map(async topology => {
227
+ if (topology.filter?.has(peer.id) === false) {
228
+ return
229
+ }
230
+
231
+ topology.filter?.remove(peer.id)
232
+ await topology.onDisconnect?.(peer.id)
233
+ })
234
+ )
230
235
  }
236
+ } catch (err: any) {
237
+ this.log.error('could not inform topologies of updated peer %p - %e', peer.id, err)
231
238
  }
232
239
  }
233
240
 
@@ -235,31 +242,37 @@ export class Registrar implements RegistrarInterface {
235
242
  * After identify has completed and we have received the list of supported
236
243
  * protocols, notify any topologies interested in those protocols.
237
244
  */
238
- _onPeerIdentify (evt: CustomEvent<IdentifyResult>): void {
245
+ async _onPeerIdentify (evt: CustomEvent<IdentifyResult>): Promise<void> {
239
246
  const protocols = evt.detail.protocols
240
247
  const connection = evt.detail.connection
241
248
  const peerId = evt.detail.peerId
242
249
 
243
- for (const protocol of protocols) {
244
- const topologies = this.topologies.get(protocol)
250
+ try {
251
+ for (const protocol of protocols) {
252
+ const topologies = this.topologies.get(protocol)
245
253
 
246
- if (topologies == null) {
247
- // no topologies are interested in this protocol
248
- continue
249
- }
250
-
251
- for (const topology of topologies.values()) {
252
- if (connection.limits != null && topology.notifyOnLimitedConnection !== true) {
254
+ if (topologies == null) {
255
+ // no topologies are interested in this protocol
253
256
  continue
254
257
  }
255
258
 
256
- if (topology.filter?.has(peerId) === true) {
257
- continue
258
- }
259
+ await Promise.all(
260
+ [...topologies.values()].map(async topology => {
261
+ if (connection.limits != null && topology.notifyOnLimitedConnection !== true) {
262
+ return
263
+ }
264
+
265
+ if (topology.filter?.has(peerId) === true) {
266
+ return
267
+ }
259
268
 
260
- topology.filter?.add(peerId)
261
- topology.onConnect?.(peerId, connection)
269
+ topology.filter?.add(peerId)
270
+ await topology.onConnect?.(peerId, connection)
271
+ })
272
+ )
262
273
  }
274
+ } catch (err: any) {
275
+ this.log.error('could not inform topologies of updated peer after identify %p - %e', peerId, err)
263
276
  }
264
277
  }
265
278
  }
@@ -1,5 +1,5 @@
1
1
  import { FaultTolerance, InvalidParametersError, NotStartedError } from '@libp2p/interface'
2
- import { trackedMap } from '@libp2p/utils/tracked-map'
2
+ import { trackedMap } from '@libp2p/utils'
3
3
  import { IP4, IP6 } from '@multiformats/multiaddr-matcher'
4
4
  import { CustomProgressEvent } from 'progress-events'
5
5
  import { TransportUnavailableError, UnsupportedListenAddressError, UnsupportedListenAddressesError } from './errors.js'
@@ -318,7 +318,7 @@ export class DefaultTransportManager implements TransportManager, Startable {
318
318
  throw new UnsupportedListenAddressesError(`Some configured addresses failed to be listened on, you may need to remove one or more listen addresses from your configuration or set \`transportManager.faultTolerance\` to NO_FATAL:\n${
319
319
  [...listenStats.errors.entries()].map(([addr, err]) => {
320
320
  return `
321
- ${addr}: ${`${err.stack ?? err}`.split('\n').join('\n ')}
321
+ ${addr}: ${`${getErrorMessage(err)}`.split('\n').join('\n ')}
322
322
  `
323
323
  }).join('')
324
324
  }`)
@@ -376,3 +376,19 @@ export class DefaultTransportManager implements TransportManager, Startable {
376
376
  await Promise.all(tasks)
377
377
  }
378
378
  }
379
+
380
+ /**
381
+ * Not every error has useful fields, browsers particularly often have an empty
382
+ * string for the "stack" so try a few different fields here.
383
+ */
384
+ function getErrorMessage (err: Error): string {
385
+ if (err.stack != null && err.stack.trim() !== '') {
386
+ return err.stack
387
+ }
388
+
389
+ if (err.message != null) {
390
+ return err.message
391
+ }
392
+
393
+ return err.toString()
394
+ }