libp2p 0.43.4 → 0.44.0-17eb162a

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 (162) hide show
  1. package/dist/index.min.js +29 -29
  2. package/dist/src/address-manager/index.d.ts +4 -4
  3. package/dist/src/address-manager/index.d.ts.map +1 -1
  4. package/dist/src/address-manager/index.js +9 -6
  5. package/dist/src/address-manager/index.js.map +1 -1
  6. package/dist/src/autonat/index.d.ts +1 -2
  7. package/dist/src/autonat/index.d.ts.map +1 -1
  8. package/dist/src/autonat/index.js +4 -6
  9. package/dist/src/autonat/index.js.map +1 -1
  10. package/dist/src/circuit-relay/server/advert-service.d.ts.map +1 -1
  11. package/dist/src/circuit-relay/server/advert-service.js +2 -2
  12. package/dist/src/circuit-relay/server/advert-service.js.map +1 -1
  13. package/dist/src/circuit-relay/server/index.d.ts.map +1 -1
  14. package/dist/src/circuit-relay/server/index.js +7 -3
  15. package/dist/src/circuit-relay/server/index.js.map +1 -1
  16. package/dist/src/circuit-relay/transport/discovery.d.ts.map +1 -1
  17. package/dist/src/circuit-relay/transport/discovery.js +3 -1
  18. package/dist/src/circuit-relay/transport/discovery.js.map +1 -1
  19. package/dist/src/circuit-relay/transport/index.d.ts +3 -0
  20. package/dist/src/circuit-relay/transport/index.d.ts.map +1 -1
  21. package/dist/src/circuit-relay/transport/index.js +6 -2
  22. package/dist/src/circuit-relay/transport/index.js.map +1 -1
  23. package/dist/src/circuit-relay/transport/listener.d.ts +3 -0
  24. package/dist/src/circuit-relay/transport/listener.d.ts.map +1 -1
  25. package/dist/src/circuit-relay/transport/listener.js +5 -4
  26. package/dist/src/circuit-relay/transport/listener.js.map +1 -1
  27. package/dist/src/circuit-relay/transport/reservation-store.d.ts +4 -1
  28. package/dist/src/circuit-relay/transport/reservation-store.d.ts.map +1 -1
  29. package/dist/src/circuit-relay/transport/reservation-store.js +11 -6
  30. package/dist/src/circuit-relay/transport/reservation-store.js.map +1 -1
  31. package/dist/src/circuit-relay/utils.d.ts.map +1 -1
  32. package/dist/src/circuit-relay/utils.js +3 -1
  33. package/dist/src/circuit-relay/utils.js.map +1 -1
  34. package/dist/src/components.d.ts +8 -6
  35. package/dist/src/components.d.ts.map +1 -1
  36. package/dist/src/components.js +10 -10
  37. package/dist/src/components.js.map +1 -1
  38. package/dist/src/config.d.ts.map +1 -1
  39. package/dist/src/config.js +0 -9
  40. package/dist/src/config.js.map +1 -1
  41. package/dist/src/connection-manager/auto-dial.d.ts +39 -0
  42. package/dist/src/connection-manager/auto-dial.d.ts.map +1 -0
  43. package/dist/src/connection-manager/auto-dial.js +131 -0
  44. package/dist/src/connection-manager/auto-dial.js.map +1 -0
  45. package/dist/src/connection-manager/connection-pruner.d.ts +32 -0
  46. package/dist/src/connection-manager/connection-pruner.d.ts.map +1 -0
  47. package/dist/src/connection-manager/connection-pruner.js +111 -0
  48. package/dist/src/connection-manager/connection-pruner.js.map +1 -0
  49. package/dist/src/connection-manager/constants.d.ts +49 -0
  50. package/dist/src/connection-manager/constants.d.ts.map +1 -0
  51. package/dist/src/connection-manager/constants.js +49 -0
  52. package/dist/src/connection-manager/constants.js.map +1 -0
  53. package/dist/src/connection-manager/dial-queue.d.ts +78 -0
  54. package/dist/src/connection-manager/dial-queue.d.ts.map +1 -0
  55. package/dist/src/connection-manager/dial-queue.js +374 -0
  56. package/dist/src/connection-manager/dial-queue.js.map +1 -0
  57. package/dist/src/connection-manager/index.d.ts +70 -73
  58. package/dist/src/connection-manager/index.d.ts.map +1 -1
  59. package/dist/src/connection-manager/index.js +116 -248
  60. package/dist/src/connection-manager/index.js.map +1 -1
  61. package/dist/src/connection-manager/utils.d.ts +9 -0
  62. package/dist/src/connection-manager/utils.d.ts.map +1 -0
  63. package/dist/src/connection-manager/utils.js +66 -0
  64. package/dist/src/connection-manager/utils.js.map +1 -0
  65. package/dist/src/content-routing/index.js +1 -1
  66. package/dist/src/content-routing/index.js.map +1 -1
  67. package/dist/src/content-routing/utils.d.ts.map +1 -1
  68. package/dist/src/content-routing/utils.js +3 -1
  69. package/dist/src/content-routing/utils.js.map +1 -1
  70. package/dist/src/fetch/index.js +3 -3
  71. package/dist/src/fetch/index.js.map +1 -1
  72. package/dist/src/identify/index.d.ts +4 -0
  73. package/dist/src/identify/index.d.ts.map +1 -1
  74. package/dist/src/identify/index.js +104 -128
  75. package/dist/src/identify/index.js.map +1 -1
  76. package/dist/src/index.d.ts +2 -19
  77. package/dist/src/index.d.ts.map +1 -1
  78. package/dist/src/index.js.map +1 -1
  79. package/dist/src/insecure/index.d.ts.map +1 -1
  80. package/dist/src/insecure/index.js +3 -1
  81. package/dist/src/insecure/index.js.map +1 -1
  82. package/dist/src/libp2p.d.ts +5 -3
  83. package/dist/src/libp2p.d.ts.map +1 -1
  84. package/dist/src/libp2p.js +47 -50
  85. package/dist/src/libp2p.js.map +1 -1
  86. package/dist/src/registrar.d.ts +5 -2
  87. package/dist/src/registrar.d.ts.map +1 -1
  88. package/dist/src/registrar.js +25 -23
  89. package/dist/src/registrar.js.map +1 -1
  90. package/dist/src/transport-manager.d.ts +9 -3
  91. package/dist/src/transport-manager.d.ts.map +1 -1
  92. package/dist/src/transport-manager.js +23 -9
  93. package/dist/src/transport-manager.js.map +1 -1
  94. package/dist/src/upgrader.d.ts +14 -11
  95. package/dist/src/upgrader.d.ts.map +1 -1
  96. package/dist/src/upgrader.js +14 -10
  97. package/dist/src/upgrader.js.map +1 -1
  98. package/package.json +46 -45
  99. package/src/address-manager/index.ts +12 -8
  100. package/src/autonat/index.ts +6 -9
  101. package/src/circuit-relay/server/advert-service.ts +2 -2
  102. package/src/circuit-relay/server/index.ts +7 -3
  103. package/src/circuit-relay/transport/discovery.ts +3 -1
  104. package/src/circuit-relay/transport/index.ts +10 -2
  105. package/src/circuit-relay/transport/listener.ts +8 -4
  106. package/src/circuit-relay/transport/reservation-store.ts +15 -7
  107. package/src/circuit-relay/utils.ts +3 -1
  108. package/src/components.ts +19 -17
  109. package/src/config.ts +0 -9
  110. package/src/connection-manager/auto-dial.ts +183 -0
  111. package/src/connection-manager/connection-pruner.ts +157 -0
  112. package/src/connection-manager/constants.ts +60 -0
  113. package/src/connection-manager/dial-queue.ts +512 -0
  114. package/src/connection-manager/index.ts +191 -340
  115. package/src/connection-manager/utils.ts +76 -0
  116. package/src/content-routing/index.ts +1 -1
  117. package/src/content-routing/utils.ts +3 -1
  118. package/src/fetch/index.ts +4 -4
  119. package/src/identify/index.ts +100 -140
  120. package/src/index.ts +2 -20
  121. package/src/insecure/index.ts +9 -5
  122. package/src/libp2p.ts +54 -60
  123. package/src/registrar.ts +29 -25
  124. package/src/transport-manager.ts +31 -11
  125. package/src/upgrader.ts +31 -22
  126. package/src/version.ts +1 -1
  127. package/dist/src/connection-manager/auto-dialler.d.ts +0 -42
  128. package/dist/src/connection-manager/auto-dialler.d.ts.map +0 -1
  129. package/dist/src/connection-manager/auto-dialler.js +0 -105
  130. package/dist/src/connection-manager/auto-dialler.js.map +0 -1
  131. package/dist/src/connection-manager/dialer/dial-request.d.ts +0 -27
  132. package/dist/src/connection-manager/dialer/dial-request.d.ts.map +0 -1
  133. package/dist/src/connection-manager/dialer/dial-request.js +0 -114
  134. package/dist/src/connection-manager/dialer/dial-request.js.map +0 -1
  135. package/dist/src/connection-manager/dialer/index.d.ts +0 -121
  136. package/dist/src/connection-manager/dialer/index.d.ts.map +0 -1
  137. package/dist/src/connection-manager/dialer/index.js +0 -324
  138. package/dist/src/connection-manager/dialer/index.js.map +0 -1
  139. package/dist/src/connection-manager/latency-monitor.d.ts +0 -120
  140. package/dist/src/connection-manager/latency-monitor.d.ts.map +0 -1
  141. package/dist/src/connection-manager/latency-monitor.js +0 -220
  142. package/dist/src/connection-manager/latency-monitor.js.map +0 -1
  143. package/dist/src/connection-manager/visibility-change-emitter.d.ts +0 -66
  144. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +0 -1
  145. package/dist/src/connection-manager/visibility-change-emitter.js +0 -118
  146. package/dist/src/connection-manager/visibility-change-emitter.js.map +0 -1
  147. package/dist/src/constants.d.ts +0 -27
  148. package/dist/src/constants.d.ts.map +0 -1
  149. package/dist/src/constants.js +0 -31
  150. package/dist/src/constants.js.map +0 -1
  151. package/dist/src/peer-record-updater.d.ts +0 -24
  152. package/dist/src/peer-record-updater.d.ts.map +0 -1
  153. package/dist/src/peer-record-updater.js +0 -44
  154. package/dist/src/peer-record-updater.js.map +0 -1
  155. package/dist/typedoc-urls.json +0 -41
  156. package/src/connection-manager/auto-dialler.ts +0 -158
  157. package/src/connection-manager/dialer/dial-request.ts +0 -144
  158. package/src/connection-manager/dialer/index.ts +0 -461
  159. package/src/connection-manager/latency-monitor.ts +0 -319
  160. package/src/connection-manager/visibility-change-emitter.ts +0 -135
  161. package/src/constants.ts +0 -36
  162. package/src/peer-record-updater.ts +0 -65
@@ -1,158 +0,0 @@
1
- import { logger } from '@libp2p/logger'
2
- import mergeOptions from 'merge-options'
3
- // @ts-expect-error retimer does not have types
4
- import retimer from 'retimer'
5
- import type { Startable } from '@libp2p/interfaces/startable'
6
- import type { PeerId } from '@libp2p/interface-peer-id'
7
- import type { ConnectionManager } from '@libp2p/interface-connection-manager'
8
- import type { PeerStore } from '@libp2p/interface-peer-store'
9
-
10
- const log = logger('libp2p:connection-manager:auto-dialler')
11
-
12
- export interface AutoDiallerInit {
13
- /**
14
- * The minimum number of connections to avoid pruning
15
- */
16
- minConnections?: number
17
-
18
- /**
19
- * How often, in milliseconds, it should preemptively guarantee connections are above the low watermark
20
- */
21
- autoDialInterval?: number
22
- }
23
-
24
- export interface AutoDiallerComponents {
25
- peerId: PeerId
26
- connectionManager: ConnectionManager
27
- peerStore: PeerStore
28
- }
29
-
30
- const defaultOptions: Partial<AutoDiallerInit> = {
31
- minConnections: 0,
32
- autoDialInterval: 10000
33
- }
34
-
35
- export class AutoDialler implements Startable {
36
- private readonly components: AutoDiallerComponents
37
- private readonly options: Required<AutoDiallerInit>
38
- private running: boolean
39
- private autoDialTimeout?: ReturnType<retimer>
40
-
41
- /**
42
- * Proactively tries to connect to known peers stored in the PeerStore.
43
- * It will keep the number of connections below the upper limit and sort
44
- * the peers to connect based on wether we know their keys and protocols.
45
- */
46
- constructor (components: AutoDiallerComponents, init: AutoDiallerInit) {
47
- this.components = components
48
- this.options = mergeOptions.call({ ignoreUndefined: true }, defaultOptions, init)
49
- this.running = false
50
- this._autoDial = this._autoDial.bind(this)
51
-
52
- log('options: %j', this.options)
53
- }
54
-
55
- isStarted (): boolean {
56
- return this.running
57
- }
58
-
59
- /**
60
- * Starts the auto dialer
61
- */
62
- async start (): Promise<void> {
63
- this.running = true
64
-
65
- void this._autoDial().catch(err => {
66
- log.error('could not start autodial', err)
67
- })
68
-
69
- log('started')
70
- }
71
-
72
- /**
73
- * Stops the auto dialler
74
- */
75
- async stop (): Promise<void> {
76
- this.running = false
77
-
78
- if (this.autoDialTimeout != null) {
79
- this.autoDialTimeout.clear()
80
- }
81
-
82
- log('stopped')
83
- }
84
-
85
- async _autoDial (): Promise<void> {
86
- if (this.autoDialTimeout != null) {
87
- this.autoDialTimeout.clear()
88
- }
89
-
90
- const minConnections = this.options.minConnections
91
-
92
- // Already has enough connections
93
- if (this.components.connectionManager.getConnections().length >= minConnections) {
94
- this.autoDialTimeout = retimer(this._autoDial, this.options.autoDialInterval)
95
-
96
- return
97
- }
98
-
99
- // Sort peers on whether we know protocols or public keys for them
100
- let peers = await this.components.peerStore.all()
101
-
102
- peers = peers.filter((peer) => {
103
- // do not dial ourselves
104
- if (peer.id.equals(this.components.peerId)) {
105
- return false
106
- }
107
-
108
- // do not dial peers without multiaddrs
109
- if (peer.addresses.length === 0) {
110
- return false
111
- }
112
-
113
- return true
114
- })
115
-
116
- // shuffle the peers
117
- peers = peers.sort(() => Math.random() > 0.5 ? 1 : -1)
118
-
119
- peers = peers.sort((a, b) => {
120
- // dial peers with the most protocols first
121
- if (b.protocols.length > a.protocols.length) {
122
- return 1
123
- }
124
-
125
- // dial peers with public keys first
126
- if (b.id.publicKey != null && a.id.publicKey == null) {
127
- return 1
128
- }
129
-
130
- return -1
131
- })
132
-
133
- for (let i = 0; this.running && i < peers.length && this.components.connectionManager.getConnections().length < minConnections; i++) {
134
- // Connection Manager was stopped during async dial
135
- if (!this.running) {
136
- return
137
- }
138
-
139
- const peer = peers[i]
140
-
141
- if (this.components.connectionManager.getConnections(peer.id).length === 0) {
142
- log('connecting to a peerStore stored peer %p', peer.id)
143
- try {
144
- await this.components.connectionManager.openConnection(peer.id)
145
- } catch (err: any) {
146
- log.error('could not connect to peerStore stored peer', err)
147
- }
148
- }
149
- }
150
-
151
- // Connection Manager was stopped
152
- if (!this.running) {
153
- return
154
- }
155
-
156
- this.autoDialTimeout = retimer(this._autoDial, this.options.autoDialInterval)
157
- }
158
- }
@@ -1,144 +0,0 @@
1
- import { CodeError } from '@libp2p/interfaces/errors'
2
- import { anySignal } from 'any-signal'
3
- import FIFO from 'p-fifo'
4
- import { setMaxListeners } from 'events'
5
- import { codes } from '../../errors.js'
6
- import { logger } from '@libp2p/logger'
7
- import type { Multiaddr } from '@multiformats/multiaddr'
8
- import type { Connection } from '@libp2p/interface-connection'
9
- import type { AbortOptions } from '@libp2p/interfaces'
10
- import type { Dialer } from '@libp2p/interface-connection-manager'
11
-
12
- const log = logger('libp2p:dialer:dial-request')
13
-
14
- export interface DialAction {
15
- (m: Multiaddr, options: AbortOptions): Promise<Connection>
16
- }
17
-
18
- export interface DialRequestOptions {
19
- addrs: Multiaddr[]
20
- dialAction: DialAction
21
- dialer: Dialer
22
- }
23
-
24
- export class DialRequest {
25
- private readonly addrs: Multiaddr[]
26
- private readonly dialer: Dialer
27
- private readonly dialAction: DialAction
28
-
29
- /**
30
- * Manages running the `dialAction` on multiple provided `addrs` in parallel
31
- * up to a maximum determined by the number of tokens returned
32
- * from `dialer.getTokens`. Once a DialRequest is created, it can be
33
- * started using `DialRequest.run(options)`. Once a single dial has succeeded,
34
- * all other dials in the request will be cancelled.
35
- */
36
- constructor (options: DialRequestOptions) {
37
- const {
38
- addrs,
39
- dialAction,
40
- dialer
41
- } = options
42
-
43
- this.addrs = addrs
44
- this.dialer = dialer
45
- this.dialAction = dialAction
46
- }
47
-
48
- async run (options: AbortOptions = {}): Promise<Connection> {
49
- const tokens = this.dialer.getTokens(this.addrs.length)
50
-
51
- // If no tokens are available, throw
52
- if (tokens.length < 1) {
53
- throw new CodeError('No dial tokens available', codes.ERR_NO_DIAL_TOKENS)
54
- }
55
-
56
- const tokenHolder = new FIFO<number>()
57
-
58
- for (const token of tokens) {
59
- void tokenHolder.push(token).catch(err => {
60
- log.error(err)
61
- })
62
- }
63
-
64
- const dialAbortControllers: Array<(AbortController | undefined)> = this.addrs.map(() => {
65
- const controller = new AbortController()
66
- try {
67
- // fails on node < 15.4
68
- setMaxListeners?.(Infinity, controller.signal)
69
- } catch {}
70
-
71
- return controller
72
- })
73
-
74
- if (options.signal != null) {
75
- try {
76
- // fails on node < 15.4
77
- setMaxListeners?.(Infinity, options.signal)
78
- } catch {}
79
- }
80
-
81
- let completedDials = 0
82
- let done = false
83
-
84
- try {
85
- return await Promise.any(this.addrs.map(async (addr, i) => {
86
- const token = await tokenHolder.shift() // get token
87
- // End attempt once another attempt succeeded
88
- if (done) {
89
- this.dialer.releaseToken(tokens.splice(tokens.indexOf(token), 1)[0])
90
- throw new CodeError('dialAction already succeeded', codes.ERR_ALREADY_SUCCEEDED)
91
- }
92
-
93
- const controller = dialAbortControllers[i]
94
- if (controller == null) {
95
- throw new CodeError('dialAction did not come with an AbortController', codes.ERR_INVALID_PARAMETERS)
96
- }
97
- let conn
98
- try {
99
- const signal = controller.signal
100
- conn = await this.dialAction(addr, { ...options, signal: (options.signal != null) ? anySignal([signal, options.signal]) : signal })
101
- // Remove the successful AbortController so it is not aborted
102
- dialAbortControllers[i] = undefined
103
- } finally {
104
- completedDials++
105
- // If we have more or equal dials remaining than tokens, recycle the token, otherwise release it
106
- if (this.addrs.length - completedDials >= tokens.length) {
107
- void tokenHolder.push(token).catch(err => {
108
- log.error(err)
109
- })
110
- } else {
111
- this.dialer.releaseToken(tokens.splice(tokens.indexOf(token), 1)[0])
112
- }
113
- }
114
-
115
- if (conn == null) {
116
- // Notify Promise.any that attempt was not successful
117
- // to prevent from returning undefined despite there
118
- // were successful dial attempts
119
- throw new CodeError('dialAction led to empty object', codes.ERR_TRANSPORT_DIAL_FAILED)
120
- } else {
121
- // This dial succeeded, don't attempt anything else
122
- done = true
123
- }
124
-
125
- return conn
126
- }))
127
- } catch (err: any) {
128
- // if we only dialed one address, unwrap the AggregateError
129
- if (this.addrs.length === 1 && err.name === 'AggregateError') {
130
- throw err.errors[0]
131
- }
132
-
133
- throw err
134
- } finally {
135
- // success/failure happened, abort everything else
136
- dialAbortControllers.forEach(c => {
137
- if (c !== undefined) {
138
- c.abort()
139
- }
140
- })
141
- tokens.forEach(token => { this.dialer.releaseToken(token) }) // release tokens back to the dialer
142
- }
143
- }
144
- }