libp2p 0.37.2 → 0.37.3-de30c2c

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 (150) hide show
  1. package/dist/src/address-manager/index.d.ts +2 -2
  2. package/dist/src/address-manager/index.d.ts.map +1 -1
  3. package/dist/src/circuit/auto-relay.d.ts +4 -4
  4. package/dist/src/circuit/auto-relay.d.ts.map +1 -1
  5. package/dist/src/circuit/circuit/hop.d.ts +2 -2
  6. package/dist/src/circuit/circuit/hop.d.ts.map +1 -1
  7. package/dist/src/circuit/circuit/hop.js +2 -2
  8. package/dist/src/circuit/circuit/hop.js.map +1 -1
  9. package/dist/src/circuit/circuit/stop.d.ts +1 -1
  10. package/dist/src/circuit/circuit/stop.d.ts.map +1 -1
  11. package/dist/src/circuit/circuit/stop.js +1 -1
  12. package/dist/src/circuit/circuit/stop.js.map +1 -1
  13. package/dist/src/circuit/circuit/stream-handler.d.ts +1 -1
  14. package/dist/src/circuit/circuit/stream-handler.d.ts.map +1 -1
  15. package/dist/src/circuit/index.d.ts +2 -2
  16. package/dist/src/circuit/index.d.ts.map +1 -1
  17. package/dist/src/circuit/listener.d.ts +3 -3
  18. package/dist/src/circuit/listener.d.ts.map +1 -1
  19. package/dist/src/circuit/transport.d.ts +5 -5
  20. package/dist/src/circuit/transport.d.ts.map +1 -1
  21. package/dist/src/circuit/transport.js +2 -2
  22. package/dist/src/circuit/transport.js.map +1 -1
  23. package/dist/src/config.d.ts.map +1 -1
  24. package/dist/src/config.js +11 -3
  25. package/dist/src/config.js.map +1 -1
  26. package/dist/src/connection-manager/auto-dialler.d.ts +1 -1
  27. package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
  28. package/dist/src/connection-manager/dialer/auto-dialer.d.ts +2 -2
  29. package/dist/src/connection-manager/dialer/auto-dialer.d.ts.map +1 -1
  30. package/dist/src/connection-manager/dialer/dial-request.d.ts +1 -1
  31. package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -1
  32. package/dist/src/connection-manager/dialer/index.d.ts +5 -5
  33. package/dist/src/connection-manager/dialer/index.d.ts.map +1 -1
  34. package/dist/src/connection-manager/dialer/index.js +1 -1
  35. package/dist/src/connection-manager/dialer/index.js.map +1 -1
  36. package/dist/src/connection-manager/index.d.ts +9 -9
  37. package/dist/src/connection-manager/index.d.ts.map +1 -1
  38. package/dist/src/connection-manager/index.js +42 -32
  39. package/dist/src/connection-manager/index.js.map +1 -1
  40. package/dist/src/content-routing/index.d.ts +4 -4
  41. package/dist/src/content-routing/index.d.ts.map +1 -1
  42. package/dist/src/content-routing/utils.d.ts +2 -2
  43. package/dist/src/content-routing/utils.d.ts.map +1 -1
  44. package/dist/src/dht/dht-content-routing.d.ts +3 -3
  45. package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
  46. package/dist/src/dht/dht-peer-routing.d.ts +5 -5
  47. package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
  48. package/dist/src/dht/dummy-dht.d.ts +3 -3
  49. package/dist/src/dht/dummy-dht.d.ts.map +1 -1
  50. package/dist/src/dht/dummy-dht.js +1 -1
  51. package/dist/src/dht/dummy-dht.js.map +1 -1
  52. package/dist/src/errors.d.ts +4 -1
  53. package/dist/src/errors.d.ts.map +1 -1
  54. package/dist/src/errors.js +3 -0
  55. package/dist/src/errors.js.map +1 -1
  56. package/dist/src/fetch/index.d.ts +7 -4
  57. package/dist/src/fetch/index.d.ts.map +1 -1
  58. package/dist/src/fetch/index.js +61 -39
  59. package/dist/src/fetch/index.js.map +1 -1
  60. package/dist/src/get-peer.d.ts +2 -2
  61. package/dist/src/get-peer.d.ts.map +1 -1
  62. package/dist/src/get-peer.js +1 -1
  63. package/dist/src/get-peer.js.map +1 -1
  64. package/dist/src/identify/index.d.ts +7 -7
  65. package/dist/src/identify/index.d.ts.map +1 -1
  66. package/dist/src/identify/index.js +15 -23
  67. package/dist/src/identify/index.js.map +1 -1
  68. package/dist/src/index.d.ts +17 -17
  69. package/dist/src/index.d.ts.map +1 -1
  70. package/dist/src/insecure/index.d.ts +2 -2
  71. package/dist/src/insecure/index.d.ts.map +1 -1
  72. package/dist/src/insecure/index.js +1 -1
  73. package/dist/src/insecure/index.js.map +1 -1
  74. package/dist/src/keychain/index.d.ts +2 -2
  75. package/dist/src/keychain/index.d.ts.map +1 -1
  76. package/dist/src/libp2p.d.ts +14 -14
  77. package/dist/src/libp2p.d.ts.map +1 -1
  78. package/dist/src/libp2p.js +14 -4
  79. package/dist/src/libp2p.js.map +1 -1
  80. package/dist/src/metrics/index.d.ts +2 -2
  81. package/dist/src/metrics/index.d.ts.map +1 -1
  82. package/dist/src/metrics/moving-average.d.ts +1 -1
  83. package/dist/src/metrics/moving-average.d.ts.map +1 -1
  84. package/dist/src/metrics/stats.d.ts +1 -1
  85. package/dist/src/metrics/stats.d.ts.map +1 -1
  86. package/dist/src/nat-manager.d.ts +1 -1
  87. package/dist/src/nat-manager.d.ts.map +1 -1
  88. package/dist/src/peer-record-updater.d.ts +1 -1
  89. package/dist/src/peer-record-updater.d.ts.map +1 -1
  90. package/dist/src/peer-routing.d.ts +4 -4
  91. package/dist/src/peer-routing.d.ts.map +1 -1
  92. package/dist/src/ping/index.d.ts +6 -3
  93. package/dist/src/ping/index.d.ts.map +1 -1
  94. package/dist/src/ping/index.js +6 -2
  95. package/dist/src/ping/index.js.map +1 -1
  96. package/dist/src/pnet/index.d.ts +1 -2
  97. package/dist/src/pnet/index.d.ts.map +1 -1
  98. package/dist/src/pnet/index.js.map +1 -1
  99. package/dist/src/pubsub/dummy-pubsub.d.ts +2 -2
  100. package/dist/src/pubsub/dummy-pubsub.d.ts.map +1 -1
  101. package/dist/src/registrar.d.ts +10 -8
  102. package/dist/src/registrar.d.ts.map +1 -1
  103. package/dist/src/registrar.js +63 -44
  104. package/dist/src/registrar.js.map +1 -1
  105. package/dist/src/transport-manager.d.ts +3 -3
  106. package/dist/src/transport-manager.d.ts.map +1 -1
  107. package/dist/src/upgrader.d.ts +6 -6
  108. package/dist/src/upgrader.d.ts.map +1 -1
  109. package/dist/src/upgrader.js +69 -8
  110. package/dist/src/upgrader.js.map +1 -1
  111. package/package.json +51 -29
  112. package/src/address-manager/index.ts +2 -2
  113. package/src/circuit/auto-relay.ts +4 -4
  114. package/src/circuit/circuit/hop.ts +4 -4
  115. package/src/circuit/circuit/stop.ts +2 -2
  116. package/src/circuit/circuit/stream-handler.ts +1 -1
  117. package/src/circuit/index.ts +2 -2
  118. package/src/circuit/listener.ts +3 -3
  119. package/src/circuit/transport.ts +5 -5
  120. package/src/config.ts +11 -3
  121. package/src/connection-manager/auto-dialler.ts +1 -1
  122. package/src/connection-manager/dialer/auto-dialer.ts +2 -2
  123. package/src/connection-manager/dialer/dial-request.ts +1 -1
  124. package/src/connection-manager/dialer/index.ts +5 -5
  125. package/src/connection-manager/index.ts +55 -39
  126. package/src/content-routing/index.ts +2 -2
  127. package/src/content-routing/utils.ts +2 -2
  128. package/src/dht/dht-content-routing.ts +2 -2
  129. package/src/dht/dht-peer-routing.ts +3 -3
  130. package/src/dht/dummy-dht.ts +3 -3
  131. package/src/errors.ts +4 -1
  132. package/src/fetch/index.ts +91 -50
  133. package/src/get-peer.ts +3 -3
  134. package/src/identify/index.ts +24 -29
  135. package/src/index.ts +17 -17
  136. package/src/insecure/index.ts +3 -3
  137. package/src/keychain/index.ts +2 -2
  138. package/src/libp2p.ts +31 -15
  139. package/src/metrics/index.ts +2 -2
  140. package/src/metrics/moving-average.ts +1 -1
  141. package/src/metrics/stats.ts +1 -1
  142. package/src/nat-manager.ts +1 -1
  143. package/src/peer-record-updater.ts +1 -1
  144. package/src/peer-routing.ts +4 -4
  145. package/src/ping/index.ts +12 -5
  146. package/src/pnet/index.ts +1 -2
  147. package/src/pubsub/dummy-pubsub.ts +2 -2
  148. package/src/registrar.ts +79 -55
  149. package/src/transport-manager.ts +3 -3
  150. package/src/upgrader.ts +94 -16
package/src/errors.ts CHANGED
@@ -70,5 +70,8 @@ export enum codes {
70
70
  ERR_NOT_IMPLEMENTED = 'ERR_NOT_IMPLEMENTED',
71
71
  ERR_WRONG_PING_ACK = 'ERR_WRONG_PING_ACK',
72
72
  ERR_INVALID_RECORD = 'ERR_INVALID_RECORD',
73
- ERR_ALREADY_SUCCEEDED = 'ERR_ALREADY_SUCCEEDED'
73
+ ERR_ALREADY_SUCCEEDED = 'ERR_ALREADY_SUCCEEDED',
74
+ ERR_NO_HANDLER_FOR_PROTOCOL = 'ERR_NO_HANDLER_FOR_PROTOCOL',
75
+ ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS = 'ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS',
76
+ ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS = 'ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS'
74
77
  }
@@ -3,21 +3,24 @@ import errCode from 'err-code'
3
3
  import { codes } from '../errors.js'
4
4
  import * as lp from 'it-length-prefixed'
5
5
  import { FetchRequest, FetchResponse } from './pb/proto.js'
6
- import { handshake } from 'it-handshake'
7
6
  import { PROTOCOL_NAME, PROTOCOL_VERSION } from './constants.js'
8
- import type { PeerId } from '@libp2p/interfaces/peer-id'
7
+ import type { PeerId } from '@libp2p/interface-peer-id'
9
8
  import type { Startable } from '@libp2p/interfaces/startable'
10
- import type { Stream } from '@libp2p/interfaces/connection'
11
- import type { IncomingStreamData } from '@libp2p/interfaces/registrar'
12
- import type { Components } from '@libp2p/interfaces/components'
9
+ import type { Stream } from '@libp2p/interface-connection'
10
+ import type { IncomingStreamData } from '@libp2p/interface-registrar'
11
+ import type { Components } from '@libp2p/components'
13
12
  import type { AbortOptions } from '@libp2p/interfaces'
14
13
  import type { Duplex } from 'it-stream-types'
15
14
  import { abortableDuplex } from 'abortable-iterator'
15
+ import { pipe } from 'it-pipe'
16
+ import first from 'it-first'
16
17
 
17
18
  const log = logger('libp2p:fetch')
18
19
 
19
20
  export interface FetchServiceInit {
20
21
  protocolPrefix: string
22
+ maxInboundStreams: number
23
+ maxOutboundStreams: number
21
24
  }
22
25
 
23
26
  export interface HandleMessageOptions {
@@ -40,6 +43,7 @@ export class FetchService implements Startable {
40
43
  private readonly components: Components
41
44
  private readonly lookupFunctions: Map<string, LookupFunction>
42
45
  private started: boolean
46
+ private readonly init: FetchServiceInit
43
47
 
44
48
  constructor (components: Components, init: FetchServiceInit) {
45
49
  this.started = false
@@ -47,13 +51,21 @@ export class FetchService implements Startable {
47
51
  this.protocol = `/${init.protocolPrefix ?? 'libp2p'}/${PROTOCOL_NAME}/${PROTOCOL_VERSION}`
48
52
  this.lookupFunctions = new Map() // Maps key prefix to value lookup function
49
53
  this.handleMessage = this.handleMessage.bind(this)
54
+ this.init = init
50
55
  }
51
56
 
52
57
  async start () {
53
58
  await this.components.getRegistrar().handle(this.protocol, (data) => {
54
- void this.handleMessage(data).catch(err => {
55
- log.error(err)
56
- })
59
+ void this.handleMessage(data)
60
+ .catch(err => {
61
+ log.error(err)
62
+ })
63
+ .finally(() => {
64
+ data.stream.close()
65
+ })
66
+ }, {
67
+ maxInboundStreams: this.init.maxInboundStreams,
68
+ maxOutboundStreams: this.init.maxOutboundStreams
57
69
  })
58
70
  this.started = true
59
71
  }
@@ -74,7 +86,7 @@ export class FetchService implements Startable {
74
86
  log('dialing %s to %p', this.protocol, peer)
75
87
 
76
88
  const connection = await this.components.getConnectionManager().openConnection(peer, options)
77
- const { stream } = await connection.newStream([this.protocol], options)
89
+ const stream = await connection.newStream([this.protocol], options)
78
90
  let source: Duplex<Uint8Array> = stream
79
91
 
80
92
  // make stream abortable if AbortSignal passed
@@ -82,28 +94,42 @@ export class FetchService implements Startable {
82
94
  source = abortableDuplex(stream, options.signal)
83
95
  }
84
96
 
85
- const shake = handshake(source)
86
-
87
- // send message
88
- shake.write(lp.encode.single(FetchRequest.encode({ identifier: key })).slice())
89
-
90
- // read response
91
- // @ts-expect-error fromReader returns a Source which has no .next method
92
- const response = FetchResponse.decode((await lp.decode.fromReader(shake.reader).next()).value.slice())
93
- switch (response.status) {
94
- case (FetchResponse.StatusCode.OK): {
95
- return response.data
96
- }
97
- case (FetchResponse.StatusCode.NOT_FOUND): {
98
- return null
99
- }
100
- case (FetchResponse.StatusCode.ERROR): {
101
- const errmsg = (new TextDecoder()).decode(response.data)
102
- throw errCode(new Error('Error in fetch protocol response: ' + errmsg), codes.ERR_INVALID_PARAMETERS)
103
- }
104
- default: {
105
- throw errCode(new Error('Unknown response status'), codes.ERR_INVALID_MESSAGE)
106
- }
97
+ try {
98
+ const result = await pipe(
99
+ [FetchRequest.encode({ identifier: key })],
100
+ lp.encode(),
101
+ source,
102
+ lp.decode(),
103
+ async function (source) {
104
+ const buf = await first(source)
105
+
106
+ if (buf == null) {
107
+ throw errCode(new Error('No data received'), codes.ERR_INVALID_MESSAGE)
108
+ }
109
+
110
+ const response = FetchResponse.decode(buf)
111
+
112
+ switch (response.status) {
113
+ case (FetchResponse.StatusCode.OK): {
114
+ return response.data
115
+ }
116
+ case (FetchResponse.StatusCode.NOT_FOUND): {
117
+ return null
118
+ }
119
+ case (FetchResponse.StatusCode.ERROR): {
120
+ const errmsg = (new TextDecoder()).decode(response.data)
121
+ throw errCode(new Error('Error in fetch protocol response: ' + errmsg), codes.ERR_INVALID_PARAMETERS)
122
+ }
123
+ default: {
124
+ throw errCode(new Error('Unknown response status'), codes.ERR_INVALID_MESSAGE)
125
+ }
126
+ }
127
+ }
128
+ )
129
+
130
+ return result ?? null
131
+ } finally {
132
+ stream.close()
107
133
  }
108
134
  }
109
135
 
@@ -114,25 +140,40 @@ export class FetchService implements Startable {
114
140
  */
115
141
  async handleMessage (data: IncomingStreamData) {
116
142
  const { stream } = data
117
- const shake = handshake(stream)
118
- // @ts-expect-error fromReader returns a Source which has no .next method
119
- const request = FetchRequest.decode((await lp.decode.fromReader(shake.reader).next()).value.slice())
120
-
121
- let response: FetchResponse
122
- const lookup = this._getLookupFunction(request.identifier)
123
- if (lookup != null) {
124
- const data = await lookup(request.identifier)
125
- if (data != null) {
126
- response = { status: FetchResponse.StatusCode.OK, data }
127
- } else {
128
- response = { status: FetchResponse.StatusCode.NOT_FOUND, data: new Uint8Array(0) }
129
- }
130
- } else {
131
- const errmsg = (new TextEncoder()).encode('No lookup function registered for key: ' + request.identifier)
132
- response = { status: FetchResponse.StatusCode.ERROR, data: errmsg }
133
- }
134
-
135
- shake.write(lp.encode.single(FetchResponse.encode(response)).slice())
143
+ const self = this
144
+
145
+ await pipe(
146
+ stream,
147
+ lp.decode(),
148
+ async function * (source) {
149
+ const buf = await first(source)
150
+
151
+ if (buf == null) {
152
+ throw errCode(new Error('No data received'), codes.ERR_INVALID_MESSAGE)
153
+ }
154
+
155
+ // for await (const buf of source) {
156
+ const request = FetchRequest.decode(buf)
157
+
158
+ let response: FetchResponse
159
+ const lookup = self._getLookupFunction(request.identifier)
160
+ if (lookup != null) {
161
+ const data = await lookup(request.identifier)
162
+ if (data != null) {
163
+ response = { status: FetchResponse.StatusCode.OK, data }
164
+ } else {
165
+ response = { status: FetchResponse.StatusCode.NOT_FOUND, data: new Uint8Array(0) }
166
+ }
167
+ } else {
168
+ const errmsg = (new TextEncoder()).encode('No lookup function registered for key: ' + request.identifier)
169
+ response = { status: FetchResponse.StatusCode.ERROR, data: errmsg }
170
+ }
171
+
172
+ yield FetchResponse.encode(response)
173
+ },
174
+ lp.encode(),
175
+ stream
176
+ )
136
177
  }
137
178
 
138
179
  /**
package/src/get-peer.ts CHANGED
@@ -2,9 +2,9 @@ import { peerIdFromString } from '@libp2p/peer-id'
2
2
  import { Multiaddr } from '@multiformats/multiaddr'
3
3
  import errCode from 'err-code'
4
4
  import { codes } from './errors.js'
5
- import { isPeerId } from '@libp2p/interfaces/peer-id'
6
- import type { PeerId } from '@libp2p/interfaces/peer-id'
7
- import type { PeerInfo } from '@libp2p/interfaces/peer-info'
5
+ import { isPeerId } from '@libp2p/interface-peer-id'
6
+ import type { PeerId } from '@libp2p/interface-peer-id'
7
+ import type { PeerInfo } from '@libp2p/interface-peer-info'
8
8
 
9
9
  function peerIdFromMultiaddr (ma: Multiaddr) {
10
10
  const idStr = ma.getPeerId()
@@ -18,11 +18,11 @@ import {
18
18
  MULTICODEC_IDENTIFY_PUSH_PROTOCOL_VERSION
19
19
  } from './consts.js'
20
20
  import { codes } from '../errors.js'
21
- import type { IncomingStreamData } from '@libp2p/interfaces/registrar'
22
- import type { Connection, Stream } from '@libp2p/interfaces/connection'
21
+ import type { IncomingStreamData } from '@libp2p/interface-registrar'
22
+ import type { Connection, Stream } from '@libp2p/interface-connection'
23
23
  import type { Startable } from '@libp2p/interfaces/startable'
24
24
  import { peerIdFromKeys } from '@libp2p/peer-id'
25
- import type { Components } from '@libp2p/interfaces/components'
25
+ import type { Components } from '@libp2p/components'
26
26
  import { TimeoutController } from 'timeout-abort-controller'
27
27
  import type { AbortOptions } from '@libp2p/interfaces'
28
28
  import { abortableDuplex } from 'abortable-iterator'
@@ -60,6 +60,12 @@ export interface IdentifyServiceInit {
60
60
  * Identify responses larger than this in bytes will be rejected (default: 8192)
61
61
  */
62
62
  maxIdentifyMessageSize?: number
63
+
64
+ maxInboundStreams: number
65
+ maxOutboundStreams: number
66
+
67
+ maxPushIncomingStreams: number
68
+ maxPushOutgoingStreams: number
63
69
  }
64
70
 
65
71
  export class IdentifyService implements Startable {
@@ -79,8 +85,6 @@ export class IdentifyService implements Startable {
79
85
  this.started = false
80
86
  this.init = init
81
87
 
82
- this.handleMessage = this.handleMessage.bind(this)
83
-
84
88
  this.identifyProtocolStr = `/${init.protocolPrefix}/${MULTICODEC_IDENTIFY_PROTOCOL_NAME}/${MULTICODEC_IDENTIFY_PROTOCOL_VERSION}`
85
89
  this.identifyPushProtocolStr = `/${init.protocolPrefix}/${MULTICODEC_IDENTIFY_PUSH_PROTOCOL_NAME}/${MULTICODEC_IDENTIFY_PUSH_PROTOCOL_VERSION}`
86
90
 
@@ -127,13 +131,21 @@ export class IdentifyService implements Startable {
127
131
  await this.components.getPeerStore().metadataBook.setValue(this.components.getPeerId(), 'AgentVersion', uint8ArrayFromString(this.host.agentVersion))
128
132
  await this.components.getPeerStore().metadataBook.setValue(this.components.getPeerId(), 'ProtocolVersion', uint8ArrayFromString(this.host.protocolVersion))
129
133
 
130
- await this.components.getRegistrar().handle([
131
- this.identifyProtocolStr,
132
- this.identifyPushProtocolStr
133
- ], (data) => {
134
- void this.handleMessage(data)?.catch(err => {
134
+ await this.components.getRegistrar().handle(this.identifyProtocolStr, (data) => {
135
+ void this._handleIdentify(data).catch(err => {
136
+ log.error(err)
137
+ })
138
+ }, {
139
+ maxInboundStreams: this.init.maxInboundStreams,
140
+ maxOutboundStreams: this.init.maxOutboundStreams
141
+ })
142
+ await this.components.getRegistrar().handle(this.identifyPushProtocolStr, (data) => {
143
+ void this._handlePush(data).catch(err => {
135
144
  log.error(err)
136
145
  })
146
+ }, {
147
+ maxInboundStreams: this.init.maxPushIncomingStreams,
148
+ maxOutboundStreams: this.init.maxPushOutgoingStreams
137
149
  })
138
150
 
139
151
  this.started = true
@@ -159,10 +171,9 @@ export class IdentifyService implements Startable {
159
171
  let stream: Stream | undefined
160
172
 
161
173
  try {
162
- const data = await connection.newStream([this.identifyPushProtocolStr], {
174
+ stream = await connection.newStream([this.identifyPushProtocolStr], {
163
175
  signal: timeoutController.signal
164
176
  })
165
- stream = data.stream
166
177
 
167
178
  // make stream abortable
168
179
  const source: Duplex<Uint8Array> = abortableDuplex(stream, timeoutController.signal)
@@ -218,7 +229,7 @@ export class IdentifyService implements Startable {
218
229
  }
219
230
 
220
231
  async _identify (connection: Connection, options: AbortOptions = {}): Promise<Identify> {
221
- const { stream } = await connection.newStream([this.identifyProtocolStr], options)
232
+ const stream = await connection.newStream([this.identifyProtocolStr], options)
222
233
  let source: Duplex<Uint8Array> = stream
223
234
  let timeoutController
224
235
  let signal = options.signal
@@ -353,22 +364,6 @@ export class IdentifyService implements Startable {
353
364
  // this.components.getAddressManager().addObservedAddr(observedAddr)
354
365
  }
355
366
 
356
- /**
357
- * A handler to register with Libp2p to process identify messages
358
- */
359
- handleMessage (data: IncomingStreamData) {
360
- const { protocol } = data
361
-
362
- switch (protocol) {
363
- case this.identifyProtocolStr:
364
- return this._handleIdentify(data)
365
- case this.identifyPushProtocolStr:
366
- return this._handlePush(data)
367
- default:
368
- log.error('cannot handle unknown protocol %s', protocol)
369
- }
370
- }
371
-
372
367
  /**
373
368
  * Sends the `Identify` response with the Signed Peer Record
374
369
  * to the requesting peer over the given `connection`
package/src/index.ts CHANGED
@@ -5,23 +5,23 @@ import type { Startable } from '@libp2p/interfaces/startable'
5
5
  import type { Multiaddr } from '@multiformats/multiaddr'
6
6
  import type { FaultTolerance } from './transport-manager.js'
7
7
  import type { IdentifyServiceInit } from './identify/index.js'
8
- import type { DualDHT } from '@libp2p/interfaces/dht'
8
+ import type { DualDHT } from '@libp2p/interface-dht'
9
9
  import type { Datastore } from 'interface-datastore'
10
- import type { PeerStore, PeerStoreInit } from '@libp2p/interfaces/peer-store'
11
- import type { PeerId } from '@libp2p/interfaces/peer-id'
10
+ import type { PeerStore, PeerStoreInit } from '@libp2p/interface-peer-store'
11
+ import type { PeerId } from '@libp2p/interface-peer-id'
12
12
  import type { AutoRelayConfig, RelayAdvertiseConfig } from './circuit/index.js'
13
- import type { PeerDiscovery } from '@libp2p/interfaces/peer-discovery'
14
- import type { Connection, ConnectionGater, ConnectionProtector, ProtocolStream } from '@libp2p/interfaces/connection'
15
- import type { Transport } from '@libp2p/interfaces/transport'
16
- import type { StreamMuxerFactory } from '@libp2p/interfaces/stream-muxer'
17
- import type { ConnectionEncrypter } from '@libp2p/interfaces/connection-encrypter'
18
- import type { PeerRouting } from '@libp2p/interfaces/peer-routing'
19
- import type { ContentRouting } from '@libp2p/interfaces/content-routing'
20
- import type { PubSub } from '@libp2p/interfaces/pubsub'
21
- import type { Registrar, StreamHandler } from '@libp2p/interfaces/registrar'
22
- import type { ConnectionManager } from '@libp2p/interfaces/connection-manager'
23
- import type { Metrics, MetricsInit } from '@libp2p/interfaces/metrics'
24
- import type { PeerInfo } from '@libp2p/interfaces/peer-info'
13
+ import type { PeerDiscovery } from '@libp2p/interface-peer-discovery'
14
+ import type { Connection, ConnectionGater, ConnectionProtector, Stream } from '@libp2p/interface-connection'
15
+ import type { Transport } from '@libp2p/interface-transport'
16
+ import type { StreamMuxerFactory } from '@libp2p/interface-stream-muxer'
17
+ import type { ConnectionEncrypter } from '@libp2p/interface-connection-encrypter'
18
+ import type { PeerRouting } from '@libp2p/interface-peer-routing'
19
+ import type { ContentRouting } from '@libp2p/interface-content-routing'
20
+ import type { PubSub } from '@libp2p/interface-pubsub'
21
+ import type { Registrar, StreamHandler, StreamHandlerOptions } from '@libp2p/interface-registrar'
22
+ import type { ConnectionManager } from '@libp2p/interface-connection-manager'
23
+ import type { Metrics, MetricsInit } from '@libp2p/interface-metrics'
24
+ import type { PeerInfo } from '@libp2p/interface-peer-info'
25
25
  import type { KeyChain } from './keychain/index.js'
26
26
  import type { ConnectionManagerInit } from './connection-manager/index.js'
27
27
  import type { PingServiceInit } from './ping/index.js'
@@ -177,7 +177,7 @@ export interface Libp2p extends Startable, EventEmitter<Libp2pEvents> {
177
177
  * If successful, the known metadata of the peer will be added to the nodes `peerStore`,
178
178
  * and the `MuxedStream` will be returned together with the successful negotiated protocol.
179
179
  */
180
- dialProtocol: (peer: PeerId | Multiaddr, protocols: string | string[], options?: AbortOptions) => Promise<ProtocolStream>
180
+ dialProtocol: (peer: PeerId | Multiaddr, protocols: string | string[], options?: AbortOptions) => Promise<Stream>
181
181
 
182
182
  /**
183
183
  * Disconnects all connections to the given `peer`
@@ -187,7 +187,7 @@ export interface Libp2p extends Startable, EventEmitter<Libp2pEvents> {
187
187
  /**
188
188
  * Registers the `handler` for each protocol
189
189
  */
190
- handle: (protocol: string | string[], handler: StreamHandler) => Promise<void>
190
+ handle: (protocol: string | string[], handler: StreamHandler, options?: StreamHandlerOptions) => Promise<void>
191
191
 
192
192
  /**
193
193
  * Removes the handler for each protocol. The protocol
@@ -1,11 +1,11 @@
1
1
  import { logger } from '@libp2p/logger'
2
2
  import { handshake } from 'it-handshake'
3
3
  import * as lp from 'it-length-prefixed'
4
- import { UnexpectedPeerError, InvalidCryptoExchangeError } from '@libp2p/interfaces/connection-encrypter/errors'
4
+ import { UnexpectedPeerError, InvalidCryptoExchangeError } from '@libp2p/interface-connection-encrypter/errors'
5
5
  import { Exchange, KeyType } from './pb/proto.js'
6
- import type { PeerId } from '@libp2p/interfaces/peer-id'
6
+ import type { PeerId } from '@libp2p/interface-peer-id'
7
7
  import { peerIdFromBytes, peerIdFromKeys } from '@libp2p/peer-id'
8
- import type { ConnectionEncrypter, SecuredConnection } from '@libp2p/interfaces/connection-encrypter'
8
+ import type { ConnectionEncrypter, SecuredConnection } from '@libp2p/interface-connection-encrypter'
9
9
  import type { Duplex } from 'it-stream-types'
10
10
 
11
11
  const log = logger('libp2p:plaintext')
@@ -10,8 +10,8 @@ import { codes } from '../errors.js'
10
10
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
11
11
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
12
12
  import { generateKeyPair, importKey, unmarshalPrivateKey } from '@libp2p/crypto/keys'
13
- import type { PeerId } from '@libp2p/interfaces/peer-id'
14
- import type { Components } from '@libp2p/interfaces/components'
13
+ import type { PeerId } from '@libp2p/interface-peer-id'
14
+ import type { Components } from '@libp2p/components'
15
15
  import { pbkdf2, randomBytes } from '@libp2p/crypto'
16
16
 
17
17
  const log = logger('libp2p:keychain')
package/src/libp2p.ts CHANGED
@@ -27,25 +27,25 @@ import { DHTPeerRouting } from './dht/dht-peer-routing.js'
27
27
  import { PersistentPeerStore } from '@libp2p/peer-store'
28
28
  import { DHTContentRouting } from './dht/dht-content-routing.js'
29
29
  import { AutoDialer } from './connection-manager/dialer/auto-dialer.js'
30
- import { Initializable, Components, isInitializable } from '@libp2p/interfaces/components'
31
- import type { PeerId } from '@libp2p/interfaces/peer-id'
32
- import type { Connection } from '@libp2p/interfaces/connection'
33
- import type { PeerRouting } from '@libp2p/interfaces/peer-routing'
34
- import type { ContentRouting } from '@libp2p/interfaces/content-routing'
35
- import type { PubSub } from '@libp2p/interfaces/pubsub'
36
- import type { Registrar, StreamHandler } from '@libp2p/interfaces/registrar'
37
- import type { ConnectionManager } from '@libp2p/interfaces/connection-manager'
38
- import type { PeerInfo } from '@libp2p/interfaces/peer-info'
30
+ import { Initializable, Components, isInitializable } from '@libp2p/components'
31
+ import type { PeerId } from '@libp2p/interface-peer-id'
32
+ import type { Connection } from '@libp2p/interface-connection'
33
+ import type { PeerRouting } from '@libp2p/interface-peer-routing'
34
+ import type { ContentRouting } from '@libp2p/interface-content-routing'
35
+ import type { PubSub } from '@libp2p/interface-pubsub'
36
+ import type { Registrar, StreamHandler, StreamHandlerOptions } from '@libp2p/interface-registrar'
37
+ import type { ConnectionManager } from '@libp2p/interface-connection-manager'
38
+ import type { PeerInfo } from '@libp2p/interface-peer-info'
39
39
  import type { Libp2p, Libp2pEvents, Libp2pInit, Libp2pOptions } from './index.js'
40
40
  import { validateConfig } from './config.js'
41
41
  import { createEd25519PeerId } from '@libp2p/peer-id-factory'
42
- import type { PeerStore } from '@libp2p/interfaces/peer-store'
43
- import type { DualDHT } from '@libp2p/interfaces/dht'
42
+ import type { PeerStore } from '@libp2p/interface-peer-store'
43
+ import type { DualDHT } from '@libp2p/interface-dht'
44
44
  import { concat as uint8ArrayConcat } from 'uint8arrays/concat'
45
45
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
46
46
  import errCode from 'err-code'
47
47
  import { unmarshalPublicKey } from '@libp2p/crypto/keys'
48
- import type { Metrics } from '@libp2p/interfaces/metrics'
48
+ import type { Metrics } from '@libp2p/interface-metrics'
49
49
  import { DummyDHT } from './dht/dummy-dht.js'
50
50
  import { DummyPubSub } from './pubsub/dummy-pubsub.js'
51
51
  import { PeerSet } from '@libp2p/peer-collections'
@@ -490,12 +490,28 @@ export class Libp2pNode extends EventEmitter<Libp2pEvents> implements Libp2p {
490
490
  return await this.pingService.ping(id, options)
491
491
  }
492
492
 
493
- async handle (protocols: string | string[], handler: StreamHandler): Promise<void> {
494
- return await this.components.getRegistrar().handle(protocols, handler)
493
+ async handle (protocols: string | string[], handler: StreamHandler, options?: StreamHandlerOptions): Promise<void> {
494
+ if (!Array.isArray(protocols)) {
495
+ protocols = [protocols]
496
+ }
497
+
498
+ await Promise.all(
499
+ protocols.map(async protocol => {
500
+ await this.components.getRegistrar().handle(protocol, handler, options)
501
+ })
502
+ )
495
503
  }
496
504
 
497
505
  async unhandle (protocols: string[] | string): Promise<void> {
498
- return await this.components.getRegistrar().unhandle(protocols)
506
+ if (!Array.isArray(protocols)) {
507
+ protocols = [protocols]
508
+ }
509
+
510
+ await Promise.all(
511
+ protocols.map(async protocol => {
512
+ await this.components.getRegistrar().unhandle(protocol)
513
+ })
514
+ )
499
515
  }
500
516
 
501
517
  /**
@@ -3,8 +3,8 @@ import each from 'it-foreach'
3
3
  import LRU from 'hashlru'
4
4
  import { METRICS as defaultOptions } from '../constants.js'
5
5
  import { DefaultStats, StatsInit } from './stats.js'
6
- import type { ComponentMetricsUpdate, Metrics, Stats, TrackStreamOptions } from '@libp2p/interfaces/metrics'
7
- import type { PeerId } from '@libp2p/interfaces/peer-id'
6
+ import type { ComponentMetricsUpdate, Metrics, Stats, TrackStreamOptions } from '@libp2p/interface-metrics'
7
+ import type { PeerId } from '@libp2p/interface-peer-id'
8
8
  import type { Startable } from '@libp2p/interfaces/startable'
9
9
  import type { Duplex } from 'it-stream-types'
10
10
 
@@ -1,4 +1,4 @@
1
- import type { MovingAverage } from '@libp2p/interfaces/metrics'
1
+ import type { MovingAverage } from '@libp2p/interface-metrics'
2
2
 
3
3
  export class DefaultMovingAverage {
4
4
  public movingAverage: number
@@ -2,7 +2,7 @@ import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events'
2
2
  import { createMovingAverage } from './moving-average.js'
3
3
  // @ts-expect-error no types
4
4
  import retimer from 'retimer'
5
- import type { MovingAverages, Stats, TransferStats } from '@libp2p/interfaces/metrics'
5
+ import type { MovingAverages, Stats, TransferStats } from '@libp2p/interface-metrics'
6
6
 
7
7
  export interface StatsEvents {
8
8
  'update': CustomEvent<TransferStats>
@@ -8,7 +8,7 @@ import errCode from 'err-code'
8
8
  import { codes } from './errors.js'
9
9
  import { isLoopback } from '@libp2p/utils/multiaddr/is-loopback'
10
10
  import type { Startable } from '@libp2p/interfaces/startable'
11
- import type { Components } from '@libp2p/interfaces/components'
11
+ import type { Components } from '@libp2p/components'
12
12
 
13
13
  const log = logger('libp2p:nat')
14
14
  const DEFAULT_TTL = 7200
@@ -1,5 +1,5 @@
1
1
  import { RecordEnvelope, PeerRecord } from '@libp2p/peer-record'
2
- import type { Components } from '@libp2p/interfaces/components'
2
+ import type { Components } from '@libp2p/components'
3
3
  import type { Startable } from '@libp2p/interfaces/startable'
4
4
  import { logger } from '@libp2p/logger'
5
5
  import { protocols } from '@multiformats/multiaddr'
@@ -18,12 +18,12 @@ import {
18
18
  // @ts-expect-error module with no types
19
19
  } from 'set-delayed-interval'
20
20
  import { setMaxListeners } from 'events'
21
- import type { PeerId } from '@libp2p/interfaces/peer-id'
22
- import type { PeerRouting } from '@libp2p/interfaces/peer-routing'
21
+ import type { PeerId } from '@libp2p/interface-peer-id'
22
+ import type { PeerRouting } from '@libp2p/interface-peer-routing'
23
23
  import type { AbortOptions } from '@libp2p/interfaces'
24
24
  import type { Startable } from '@libp2p/interfaces/startable'
25
- import type { PeerInfo } from '@libp2p/interfaces/peer-info'
26
- import type { Components } from '@libp2p/interfaces/components'
25
+ import type { PeerInfo } from '@libp2p/interface-peer-info'
26
+ import type { Components } from '@libp2p/components'
27
27
 
28
28
  const log = logger('libp2p:peer-routing')
29
29
 
package/src/ping/index.ts CHANGED
@@ -6,10 +6,10 @@ import { pipe } from 'it-pipe'
6
6
  import first from 'it-first'
7
7
  import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
8
8
  import { PROTOCOL_NAME, PING_LENGTH, PROTOCOL_VERSION } from './constants.js'
9
- import type { IncomingStreamData } from '@libp2p/interfaces/registrar'
10
- import type { PeerId } from '@libp2p/interfaces/peer-id'
9
+ import type { IncomingStreamData } from '@libp2p/interface-registrar'
10
+ import type { PeerId } from '@libp2p/interface-peer-id'
11
11
  import type { Startable } from '@libp2p/interfaces/startable'
12
- import type { Components } from '@libp2p/interfaces/components'
12
+ import type { Components } from '@libp2p/components'
13
13
  import type { AbortOptions } from '@libp2p/interfaces'
14
14
  import type { Duplex } from 'it-stream-types'
15
15
  import { abortableDuplex } from 'abortable-iterator'
@@ -18,21 +18,28 @@ const log = logger('libp2p:ping')
18
18
 
19
19
  export interface PingServiceInit {
20
20
  protocolPrefix: string
21
+ maxInboundStreams: number
22
+ maxOutboundStreams: number
21
23
  }
22
24
 
23
25
  export class PingService implements Startable {
24
26
  public readonly protocol: string
25
27
  private readonly components: Components
26
28
  private started: boolean
29
+ private readonly init: PingServiceInit
27
30
 
28
31
  constructor (components: Components, init: PingServiceInit) {
29
32
  this.components = components
30
33
  this.started = false
31
34
  this.protocol = `/${init.protocolPrefix}/${PROTOCOL_NAME}/${PROTOCOL_VERSION}`
35
+ this.init = init
32
36
  }
33
37
 
34
38
  async start () {
35
- await this.components.getRegistrar().handle(this.protocol, this.handleMessage)
39
+ await this.components.getRegistrar().handle(this.protocol, this.handleMessage, {
40
+ maxInboundStreams: this.init.maxInboundStreams,
41
+ maxOutboundStreams: this.init.maxOutboundStreams
42
+ })
36
43
  this.started = true
37
44
  }
38
45
 
@@ -67,7 +74,7 @@ export class PingService implements Startable {
67
74
  log('dialing %s to %p', this.protocol, peer)
68
75
 
69
76
  const connection = await this.components.getConnectionManager().openConnection(peer, options)
70
- const { stream } = await connection.newStream([this.protocol], options)
77
+ const stream = await connection.newStream([this.protocol], options)
71
78
  const start = Date.now()
72
79
  const data = randomBytes(PING_LENGTH)
73
80
 
package/src/pnet/index.ts CHANGED
@@ -12,8 +12,7 @@ import {
12
12
  } from './crypto.js'
13
13
  import { handshake } from 'it-handshake'
14
14
  import { NONCE_LENGTH } from './key-generator.js'
15
- import type { MultiaddrConnection } from '@libp2p/interfaces/transport'
16
- import type { ConnectionProtector } from '@libp2p/interfaces/connection'
15
+ import type { ConnectionProtector, MultiaddrConnection } from '@libp2p/interface-connection'
17
16
 
18
17
  const log = logger('libp2p:pnet')
19
18
 
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter } from '@libp2p/interfaces/events'
2
- import type { PeerId } from '@libp2p/interfaces/peer-id'
3
- import type { PublishResult, PubSub, PubSubEvents, StrictNoSign, StrictSign } from '@libp2p/interfaces/pubsub'
2
+ import type { PeerId } from '@libp2p/interface-peer-id'
3
+ import type { PublishResult, PubSub, PubSubEvents, StrictNoSign, StrictSign } from '@libp2p/interface-pubsub'
4
4
  import errCode from 'err-code'
5
5
  import { messages, codes } from '../errors.js'
6
6