libp2p 2.2.1 → 2.3.0

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.
@@ -1,8 +1,8 @@
1
1
  import { peerIdFromString } from '@libp2p/peer-id'
2
- import { multiaddr } from '@multiformats/multiaddr'
3
- import { debounce } from './utils.js'
2
+ import { debounce } from '@libp2p/utils/debounce'
3
+ import { multiaddr, protocols } from '@multiformats/multiaddr'
4
4
  import type { ComponentLogger, Libp2pEvents, Logger, TypedEventTarget, PeerId, PeerStore } from '@libp2p/interface'
5
- import type { TransportManager } from '@libp2p/interface-internal'
5
+ import type { AddressManager as AddressManagerInterface, TransportManager } from '@libp2p/interface-internal'
6
6
  import type { Multiaddr } from '@multiformats/multiaddr'
7
7
 
8
8
  export interface AddressManagerInit {
@@ -28,7 +28,7 @@ export interface AddressManagerInit {
28
28
  noAnnounce?: string[]
29
29
  }
30
30
 
31
- export interface DefaultAddressManagerComponents {
31
+ export interface AddressManagerComponents {
32
32
  peerId: PeerId
33
33
  transportManager: TransportManager
34
34
  peerStore: PeerStore
@@ -69,14 +69,22 @@ function stripPeerId (ma: Multiaddr, peerId: PeerId): Multiaddr {
69
69
  return ma
70
70
  }
71
71
 
72
- export class DefaultAddressManager {
72
+ const CODEC_IP4 = 0x04
73
+ const CODEC_IP6 = 0x29
74
+ const CODEC_DNS4 = 0x36
75
+ const CODEC_DNS6 = 0x37
76
+
77
+ export class AddressManager implements AddressManagerInterface {
73
78
  private readonly log: Logger
74
- private readonly components: DefaultAddressManagerComponents
79
+ private readonly components: AddressManagerComponents
75
80
  // this is an array to allow for duplicates, e.g. multiples of `/ip4/0.0.0.0/tcp/0`
76
81
  private readonly listen: string[]
77
82
  private readonly announce: Set<string>
78
83
  private readonly observed: Map<string, ObservedAddressMetadata>
79
84
  private readonly announceFilter: AddressFilter
85
+ private readonly ipDomainMappings: Map<string, string>
86
+
87
+ private readonly where: Error
80
88
 
81
89
  /**
82
90
  * Responsible for managing the peer addresses.
@@ -84,7 +92,7 @@ export class DefaultAddressManager {
84
92
  * The listen addresses will be used by the libp2p transports to listen for new connections,
85
93
  * while the announce addresses will be used for the peer addresses' to other peers in the network.
86
94
  */
87
- constructor (components: DefaultAddressManagerComponents, init: AddressManagerInit = {}) {
95
+ constructor (components: AddressManagerComponents, init: AddressManagerInit = {}) {
88
96
  const { listen = [], announce = [] } = init
89
97
 
90
98
  this.components = components
@@ -92,6 +100,7 @@ export class DefaultAddressManager {
92
100
  this.listen = listen.map(ma => ma.toString())
93
101
  this.announce = new Set(announce.map(ma => ma.toString()))
94
102
  this.observed = new Map()
103
+ this.ipDomainMappings = new Map()
95
104
  this.announceFilter = init.announceFilter ?? defaultAddressFilter
96
105
 
97
106
  // this method gets called repeatedly on startup when transports start listening so
@@ -106,6 +115,8 @@ export class DefaultAddressManager {
106
115
  components.events.addEventListener('transport:close', () => {
107
116
  this._updatePeerStoreAddresses()
108
117
  })
118
+
119
+ this.where = new Error('where')
109
120
  }
110
121
 
111
122
  readonly [Symbol.toStringTag] = '@libp2p/address-manager'
@@ -200,37 +211,109 @@ export class DefaultAddressManager {
200
211
  }
201
212
 
202
213
  getAddresses (): Multiaddr[] {
203
- let addrs = this.getAnnounceAddrs().map(ma => ma.toString())
214
+ let multiaddrs = this.getAnnounceAddrs()
204
215
 
205
- if (addrs.length === 0) {
216
+ if (multiaddrs.length === 0) {
206
217
  // no configured announce addrs, add configured listen addresses
207
- addrs = this.components.transportManager.getAddrs().map(ma => ma.toString())
218
+ multiaddrs = this.components.transportManager.getAddrs()
208
219
  }
209
220
 
210
221
  // add observed addresses we are confident in
211
- addrs = addrs.concat(
212
- Array.from(this.observed)
213
- .filter(([ma, metadata]) => metadata.confident)
214
- .map(([ma]) => ma)
215
- )
222
+ multiaddrs = multiaddrs
223
+ .concat(
224
+ Array.from(this.observed)
225
+ .filter(([ma, metadata]) => metadata.confident)
226
+ .map(([ma]) => multiaddr(ma))
227
+ )
228
+
229
+ const mappedMultiaddrs: Multiaddr[] = []
230
+
231
+ // add ip->domain mappings
232
+ for (const ma of multiaddrs) {
233
+ const tuples = [...ma.stringTuples()]
234
+ let mappedIp = false
235
+
236
+ for (const [ip, domain] of this.ipDomainMappings.entries()) {
237
+ for (let i = 0; i < tuples.length; i++) {
238
+ if (tuples[i][1] !== ip) {
239
+ continue
240
+ }
241
+
242
+ if (tuples[i][0] === CODEC_IP4) {
243
+ tuples[i][0] = CODEC_DNS4
244
+ tuples[i][1] = domain
245
+ mappedIp = true
246
+ }
247
+
248
+ if (tuples[i][0] === CODEC_IP6) {
249
+ tuples[i][0] = CODEC_DNS6
250
+ tuples[i][1] = domain
251
+ mappedIp = true
252
+ }
253
+ }
254
+ }
255
+
256
+ if (mappedIp) {
257
+ mappedMultiaddrs.push(
258
+ multiaddr(`/${
259
+ tuples.map(tuple => {
260
+ return [
261
+ protocols(tuple[0]).name,
262
+ tuple[1]
263
+ ].join('/')
264
+ }).join('/')
265
+ }`)
266
+ )
267
+ }
268
+ }
269
+
270
+ multiaddrs = multiaddrs.concat(mappedMultiaddrs)
216
271
 
217
272
  // dedupe multiaddrs
218
- const addrSet = new Set(addrs)
273
+ const addrSet = new Set<string>()
274
+ multiaddrs = multiaddrs.filter(ma => {
275
+ const maStr = ma.toString()
276
+
277
+ if (addrSet.has(maStr)) {
278
+ return false
279
+ }
280
+
281
+ addrSet.add(maStr)
282
+
283
+ return true
284
+ })
219
285
 
220
286
  // Create advertising list
221
- return this.announceFilter(Array.from(addrSet)
222
- .map(str => multiaddr(str)))
223
- .map(ma => {
224
- // do not append our peer id to a path multiaddr as it will become invalid
225
- if (ma.protos().pop()?.path === true) {
226
- return ma
227
- }
287
+ return this.announceFilter(
288
+ Array.from(addrSet)
289
+ .map(str => {
290
+ const ma = multiaddr(str)
291
+
292
+ // do not append our peer id to a path multiaddr as it will become invalid
293
+ if (ma.protos().pop()?.path === true) {
294
+ return ma
295
+ }
296
+
297
+ if (ma.getPeerId() === this.components.peerId.toString()) {
298
+ return ma
299
+ }
300
+
301
+ return ma.encapsulate(`/p2p/${this.components.peerId.toString()}`)
302
+ })
303
+ )
304
+ }
228
305
 
229
- if (ma.getPeerId() === this.components.peerId.toString()) {
230
- return ma
231
- }
306
+ addDNSMapping (domain: string, addresses: string[]): void {
307
+ addresses.forEach(ip => {
308
+ this.ipDomainMappings.set(ip, domain)
309
+ })
310
+ }
232
311
 
233
- return ma.encapsulate(`/p2p/${this.components.peerId.toString()}`)
234
- })
312
+ removeDNSMapping (domain: string): void {
313
+ for (const [key, value] of this.ipDomainMappings.entries()) {
314
+ if (value === domain) {
315
+ this.ipDomainMappings.delete(key)
316
+ }
317
+ }
235
318
  }
236
319
  }
package/src/index.ts CHANGED
@@ -18,7 +18,7 @@ import { generateKeyPair } from '@libp2p/crypto/keys'
18
18
  import { peerIdFromPrivateKey } from '@libp2p/peer-id'
19
19
  import { validateConfig } from './config.js'
20
20
  import { Libp2p as Libp2pClass } from './libp2p.js'
21
- import type { AddressManagerInit, AddressFilter } from './address-manager/index.js'
21
+ import type { AddressManagerInit, AddressFilter } from './address-manager.js'
22
22
  import type { Components } from './components.js'
23
23
  import type { ConnectionManagerInit } from './connection-manager/index.js'
24
24
  import type { ConnectionMonitorInit } from './connection-monitor.js'
package/src/libp2p.ts CHANGED
@@ -8,7 +8,7 @@ import { isMultiaddr, type Multiaddr } from '@multiformats/multiaddr'
8
8
  import { MemoryDatastore } from 'datastore-core/memory'
9
9
  import { concat as uint8ArrayConcat } from 'uint8arrays/concat'
10
10
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
11
- import { DefaultAddressManager } from './address-manager/index.js'
11
+ import { AddressManager } from './address-manager.js'
12
12
  import { checkServiceDependencies, defaultComponents } from './components.js'
13
13
  import { connectionGater } from './config/connection-gater.js'
14
14
  import { DefaultConnectionManager } from './connection-manager/index.js'
@@ -129,7 +129,7 @@ export class Libp2p<T extends ServiceMap = ServiceMap> extends TypedEventEmitter
129
129
  this.configureComponent('registrar', new DefaultRegistrar(this.components))
130
130
 
131
131
  // Addresses {listen, announce, noAnnounce}
132
- this.configureComponent('addressManager', new DefaultAddressManager(this.components, init.addresses))
132
+ this.configureComponent('addressManager', new AddressManager(this.components, init.addresses))
133
133
 
134
134
  // Peer routers
135
135
  const peerRouters: PeerRouting[] = (init.peerRouters ?? []).map((fn, index) => this.configureComponent(`peer-router-${index}`, fn(this.components)))
package/src/registrar.ts CHANGED
@@ -2,7 +2,7 @@ import { InvalidParametersError } from '@libp2p/interface'
2
2
  import merge from 'merge-options'
3
3
  import * as errorsJs from './errors.js'
4
4
  import type { IdentifyResult, Libp2pEvents, Logger, PeerUpdate, TypedEventTarget, PeerId, PeerStore, Topology } from '@libp2p/interface'
5
- import type { ConnectionManager, StreamHandlerOptions, StreamHandlerRecord, Registrar, StreamHandler } from '@libp2p/interface-internal'
5
+ import type { StreamHandlerOptions, StreamHandlerRecord, Registrar, StreamHandler } from '@libp2p/interface-internal'
6
6
  import type { ComponentLogger } from '@libp2p/logger'
7
7
 
8
8
  export const DEFAULT_MAX_INBOUND_STREAMS = 32
@@ -10,7 +10,6 @@ export const DEFAULT_MAX_OUTBOUND_STREAMS = 64
10
10
 
11
11
  export interface RegistrarComponents {
12
12
  peerId: PeerId
13
- connectionManager: ConnectionManager
14
13
  peerStore: PeerStore
15
14
  events: TypedEventTarget<Libp2pEvents>
16
15
  logger: ComponentLogger
package/src/upgrader.ts CHANGED
@@ -181,7 +181,7 @@ export class DefaultUpgrader implements Upgrader {
181
181
  /**
182
182
  * Upgrades an inbound connection
183
183
  */
184
- async upgradeInbound (maConn: MultiaddrConnection, opts: UpgraderOptions = {}): Promise<Connection> {
184
+ async upgradeInbound (maConn: MultiaddrConnection, opts: UpgraderOptions = {}): Promise<void> {
185
185
  let accepted = false
186
186
 
187
187
  try {
@@ -192,12 +192,12 @@ export class DefaultUpgrader implements Upgrader {
192
192
  accepted = await this.components.connectionManager.acceptIncomingConnection(maConn)
193
193
 
194
194
  if (!accepted) {
195
- throw new ConnectionDeniedError('connection denied')
195
+ throw new ConnectionDeniedError('Connection denied')
196
196
  }
197
197
 
198
198
  await this.shouldBlockConnection('denyInboundConnection', maConn)
199
199
 
200
- return await this._performUpgrade(maConn, 'inbound', opts)
200
+ await this._performUpgrade(maConn, 'inbound', opts)
201
201
  } catch (err) {
202
202
  this.metrics.errors?.increment({
203
203
  inbound: true
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- export const version = '2.2.1'
1
+ export const version = '2.3.0'
2
2
  export const name = 'libp2p'
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/address-manager/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAU,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACnH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,aAAa,CAAA;IAE9B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAA;IACtC,MAAM,EAAE,eAAe,CAAA;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAAA;CAClC;AA2BD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAE5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;IAE9C;;;;;OAKG;gBACU,UAAU,EAAE,+BAA+B,EAAE,IAAI,GAAE,kBAAuB;IAwBvF,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,6BAA4B;IAEzD,yBAAyB,IAAK,IAAI;IAwBlC;;OAEG;IACH,cAAc,IAAK,SAAS,EAAE;IAI9B;;OAEG;IACH,gBAAgB,IAAK,SAAS,EAAE;IAIhC;;OAEG;IACH,gBAAgB,IAAK,SAAS,EAAE;IAIhC;;OAEG;IACH,eAAe,CAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAcvC,mBAAmB,CAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAoB3C,kBAAkB,CAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAO1C,YAAY,IAAK,SAAS,EAAE;CAkC7B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/address-manager/index.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function debounce(func: () => void, wait: number): () => void;
2
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/address-manager/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAE,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAYpE"}
@@ -1,12 +0,0 @@
1
- export function debounce(func, wait) {
2
- let timeout;
3
- return function () {
4
- const later = function () {
5
- timeout = undefined;
6
- func();
7
- };
8
- clearTimeout(timeout);
9
- timeout = setTimeout(later, wait);
10
- };
11
- }
12
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/address-manager/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAE,IAAgB,EAAE,IAAY;IACtD,IAAI,OAAkD,CAAA;IAEtD,OAAO;QACL,MAAM,KAAK,GAAG;YACZ,OAAO,GAAG,SAAS,CAAA;YACnB,IAAI,EAAE,CAAA;QACR,CAAC,CAAA;QAED,YAAY,CAAC,OAAO,CAAC,CAAA;QACrB,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC,CAAA;AACH,CAAC"}
@@ -1,43 +0,0 @@
1
- # Address Manager
2
-
3
- The Address manager is responsible for keeping an updated register of the peer's addresses. It includes 2 different types of Addresses: `Listen Addresses` and `Announce Addresses`.
4
-
5
- These Addresses should be specified in your libp2p [configuration](../../../../doc/CONFIGURATION.md) when you create your node.
6
-
7
- ## Listen Addresses
8
-
9
- A libp2p node should have a set of listen addresses, which will be used by libp2p underlying transports to listen for dials from other nodes in the network.
10
-
11
- Before a libp2p node starts, its configured listen addresses will be passed to the AddressManager, so that during startup the libp2p transports can use them to listen for connections. Accordingly, listen addresses should be specified through the libp2p configuration, in order to have the `AddressManager` created with them.
12
-
13
- It is important pointing out that libp2p accepts ephemeral listening addresses. In this context, the provided listen addresses might not be exactly the same as the ones used by the transports. For example TCP may replace `/ip4/0.0.0.0/tcp/0` with something like `/ip4/127.0.0.1/tcp/8989`. As a consequence, libp2p should take into account this when determining its advertised addresses.
14
-
15
- ## Announce Addresses
16
-
17
- In some scenarios, a libp2p node will need to announce addresses that it is not listening on. In other words, Announce Addresses are an amendment to the Listen Addresses that aim to enable other nodes to achieve connectivity to this node.
18
-
19
- Scenarios for Announce Addresses include:
20
- - when you setup a libp2p node in your private network at home, but you need to announce your public IP Address to the outside world;
21
- - when you want to announce a DNS address, which maps to your public IP Address.
22
-
23
- ## Implementation
24
-
25
- When a libp2p node is created, the Address Manager will be populated from the provided addresses through the libp2p configuration. Once the node is started, the Transport Manager component will gather the listen addresses from the Address Manager, so that the libp2p transports can attempt to bind to them.
26
-
27
- Libp2p will use the Address Manager as the source of truth when advertising the peers addresses. After all transports are ready, other libp2p components/subsystems will kickoff, namely the Identify Service and the DHT. Both of them will announce the node addresses to the other peers in the network. The announce addresses will have an important role here and will be gathered by libp2p to compute its current addresses to advertise everytime it is needed.
28
-
29
- ## Future Considerations
30
-
31
- ### Dynamic address modifications
32
-
33
- In a future iteration, we can enable these addresses to be modified in runtime. For this, the Address Manager should be responsible for notifying interested subsystems of these changes, through an Event Emitter.
34
-
35
- #### Modify Listen Addresses
36
-
37
- While adding new addresses to listen on runtime should be trivial, removing a listen address might have bad implications for the node, since all the connections using that listen address will be closed. However, libp2p should provide a mechanism for both adding and removing listen addresses in the future.
38
-
39
- Every time a new listen address is added, the Address Manager should emit an event with the new multiaddrs to listen. The Transport Manager should listen to this events and act accordingly.
40
-
41
- #### Modify Announce Addresses
42
-
43
- When the announce addresses are modified, the Address Manager should emit an event so that other subsystems can act accordingly. For example, libp2p identify service should use the libp2p push protocol to inform other peers about these changes.
@@ -1,13 +0,0 @@
1
- export function debounce (func: () => void, wait: number): () => void {
2
- let timeout: ReturnType<typeof setTimeout> | undefined
3
-
4
- return function () {
5
- const later = function (): void {
6
- timeout = undefined
7
- func()
8
- }
9
-
10
- clearTimeout(timeout)
11
- timeout = setTimeout(later, wait)
12
- }
13
- }