From 8402f3ea68e6d9567b4847cfbdf0e5982c49825b Mon Sep 17 00:00:00 2001 From: chad Date: Fri, 10 Mar 2023 18:09:46 -0500 Subject: [PATCH 1/8] feat: support batch dialing (#1616) --- packages/interface-connection-manager/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/interface-connection-manager/src/index.ts b/packages/interface-connection-manager/src/index.ts index 50954988b..9530e975a 100644 --- a/packages/interface-connection-manager/src/index.ts +++ b/packages/interface-connection-manager/src/index.ts @@ -81,9 +81,9 @@ export interface ConnectionManager extends EventEmitter export interface Dialer { /** - * Dial a peer or multiaddr and return the promise of a connection + * Dial a peer or multiaddr, or multiple multiaddrs and return the promise of a connection */ - dial: (peer: PeerId | Multiaddr, options?: AbortOptions) => Promise + dial: (peer: PeerId | Multiaddr | Multiaddr[], options?: AbortOptions) => Promise /** * Request `num` dial tokens. Only the returned number of dials may be attempted. From 7de2446ac7cf4c075aceacb6a884fc883aac5242 Mon Sep 17 00:00:00 2001 From: chad Date: Mon, 13 Mar 2023 20:54:32 -0500 Subject: [PATCH 2/8] feat: added multiple multiaddr to libp2p dial method (#351) --- packages/interface-connection-manager/src/index.ts | 2 +- packages/interface-libp2p/src/index.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/interface-connection-manager/src/index.ts b/packages/interface-connection-manager/src/index.ts index 9530e975a..987fa617c 100644 --- a/packages/interface-connection-manager/src/index.ts +++ b/packages/interface-connection-manager/src/index.ts @@ -58,7 +58,7 @@ export interface ConnectionManager extends EventEmitter * const connection = await libp2p.connectionManager.openConnection(peerId) * ``` */ - openConnection: (peer: PeerId | Multiaddr, options?: AbortOptions) => Promise + openConnection: (peer: PeerId | Multiaddr | Multiaddr[], options?: AbortOptions) => Promise /** * Close our connections to a peer diff --git a/packages/interface-libp2p/src/index.ts b/packages/interface-libp2p/src/index.ts index 037dd0a33..9d6bffcc6 100644 --- a/packages/interface-libp2p/src/index.ts +++ b/packages/interface-libp2p/src/index.ts @@ -348,7 +348,7 @@ export interface Libp2p extends Startable, EventEmitter { * await conn.close() * ``` */ - dial: (peer: PeerId | Multiaddr, options?: AbortOptions) => Promise + dial: (peer: PeerId | Multiaddr | Multiaddr[], options?: AbortOptions) => Promise /** * Dials to the provided peer and tries to handshake with the given protocols in order. @@ -366,7 +366,7 @@ export interface Libp2p extends Startable, EventEmitter { * pipe([1, 2, 3], stream, consume) * ``` */ - dialProtocol: (peer: PeerId | Multiaddr, protocols: string | string[], options?: AbortOptions) => Promise + dialProtocol: (peer: PeerId | Multiaddr | Multiaddr[], protocols: string | string[], options?: AbortOptions) => Promise /** * Attempts to gracefully close an open connection to the given peer. If the connection is not closed in the grace period, it will be forcefully closed. From 2d305d3f8806e0977c6448864315d6a9740e8874 Mon Sep 17 00:00:00 2001 From: chad Date: Mon, 27 Mar 2023 14:38:49 -0500 Subject: [PATCH 3/8] fix: updated broken methods in mocks --- packages/interface-mocks/src/connection-manager.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/interface-mocks/src/connection-manager.ts b/packages/interface-mocks/src/connection-manager.ts index 1f30c5227..5c35d0465 100644 --- a/packages/interface-mocks/src/connection-manager.ts +++ b/packages/interface-mocks/src/connection-manager.ts @@ -8,6 +8,7 @@ import { CodeError } from '@libp2p/interfaces/errors' import type { Registrar } from '@libp2p/interface-registrar' import type { PubSub } from '@libp2p/interface-pubsub' import { isMultiaddr, Multiaddr } from '@multiformats/multiaddr' +import { peerIdFromString } from '@libp2p/peer-id' export interface MockNetworkComponents { peerId: PeerId @@ -23,7 +24,12 @@ class MockNetwork { this.components.push(components) } - getNode (peerId: PeerId): MockNetworkComponents { + getNode (peerId: PeerId | Multiaddr []): MockNetworkComponents { + + if (Array.isArray(peerId)) { + peerId = peerIdFromString(peerId[0].getPeerId() ?? "") + } + for (const components of this.components) { if (peerId.equals(components.peerId)) { return components @@ -72,7 +78,7 @@ class MockConnectionManager extends EventEmitter implem this.started = false } - getConnections (peerId?: PeerId): Connection[] { + getConnections (peerId?: PeerId | Multiaddr[]): Connection[] { if (peerId != null) { return this.connections .filter(c => c.remotePeer.toString() === peerId.toString()) @@ -81,7 +87,7 @@ class MockConnectionManager extends EventEmitter implem return this.connections } - async openConnection (peerId: PeerId | Multiaddr): Promise { + async openConnection (peerId: PeerId | Multiaddr | Multiaddr[]): Promise { if (this.components == null) { throw new CodeError('Not initialized', 'ERR_NOT_INITIALIZED') } From 599aecb23c32ea052fb9caf769b48ef5c40b02f3 Mon Sep 17 00:00:00 2001 From: chad Date: Mon, 27 Mar 2023 14:49:46 -0500 Subject: [PATCH 4/8] lint: fix linting issues --- packages/interface-mocks/src/connection-manager.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/interface-mocks/src/connection-manager.ts b/packages/interface-mocks/src/connection-manager.ts index 5c35d0465..b00777f0f 100644 --- a/packages/interface-mocks/src/connection-manager.ts +++ b/packages/interface-mocks/src/connection-manager.ts @@ -25,9 +25,8 @@ class MockNetwork { } getNode (peerId: PeerId | Multiaddr []): MockNetworkComponents { - if (Array.isArray(peerId)) { - peerId = peerIdFromString(peerId[0].getPeerId() ?? "") + peerId = peerIdFromString(peerId[0].getPeerId() ?? '') } for (const components of this.components) { From 65abaf5c4834e6f4bfca493d06d1ed66e4b53333 Mon Sep 17 00:00:00 2001 From: chad Date: Tue, 28 Mar 2023 09:47:22 -0500 Subject: [PATCH 5/8] fix: remove unnecessary argument type from get connections --- packages/interface-mocks/src/connection-manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/interface-mocks/src/connection-manager.ts b/packages/interface-mocks/src/connection-manager.ts index b00777f0f..94083f05a 100644 --- a/packages/interface-mocks/src/connection-manager.ts +++ b/packages/interface-mocks/src/connection-manager.ts @@ -77,7 +77,7 @@ class MockConnectionManager extends EventEmitter implem this.started = false } - getConnections (peerId?: PeerId | Multiaddr[]): Connection[] { + getConnections (peerId?: PeerId): Connection[] { if (peerId != null) { return this.connections .filter(c => c.remotePeer.toString() === peerId.toString()) From bccf7ca0e055881cd700970ed0196ef2a29ff009 Mon Sep 17 00:00:00 2001 From: chad Date: Tue, 28 Mar 2023 19:40:00 -0500 Subject: [PATCH 6/8] fix: added guard against empty arrays --- packages/interface-mocks/src/connection-manager.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/interface-mocks/src/connection-manager.ts b/packages/interface-mocks/src/connection-manager.ts index 94083f05a..d2c8a8361 100644 --- a/packages/interface-mocks/src/connection-manager.ts +++ b/packages/interface-mocks/src/connection-manager.ts @@ -25,8 +25,10 @@ class MockNetwork { } getNode (peerId: PeerId | Multiaddr []): MockNetworkComponents { - if (Array.isArray(peerId)) { + if (Array.isArray(peerId) && peerId.length > 0) { peerId = peerIdFromString(peerId[0].getPeerId() ?? '') + } else { + peerId = peerId as PeerId } for (const components of this.components) { From c9ce428aec64a7df809ddd989900267cab32709e Mon Sep 17 00:00:00 2001 From: chad Date: Tue, 28 Mar 2023 19:43:59 -0500 Subject: [PATCH 7/8] fix: updated mocks for Multiaddr arrays --- packages/interface-mocks/src/connection-manager.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/interface-mocks/src/connection-manager.ts b/packages/interface-mocks/src/connection-manager.ts index d2c8a8361..b457098c6 100644 --- a/packages/interface-mocks/src/connection-manager.ts +++ b/packages/interface-mocks/src/connection-manager.ts @@ -97,7 +97,13 @@ class MockConnectionManager extends EventEmitter implem throw new CodeError('Dialing multiaddrs not supported', 'ERR_NOT_SUPPORTED') } - const existingConnections = this.getConnections(peerId) + let existingConnections + + if (Array.isArray(peerId)) { + existingConnections = this.getConnections(peerIdFromString(peerId[0].getPeerId() ?? '')) + } else { + existingConnections = this.getConnections(peerId) + } if (existingConnections.length > 0) { return existingConnections[0] From ce630cfa2f03871475e92981901ed661209ceeef Mon Sep 17 00:00:00 2001 From: chad Date: Wed, 29 Mar 2023 11:42:34 -0500 Subject: [PATCH 8/8] fix: added guards based on feedback --- .../interface-mocks/src/connection-manager.ts | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/interface-mocks/src/connection-manager.ts b/packages/interface-mocks/src/connection-manager.ts index b457098c6..6165f7988 100644 --- a/packages/interface-mocks/src/connection-manager.ts +++ b/packages/interface-mocks/src/connection-manager.ts @@ -1,7 +1,7 @@ import { EventEmitter } from '@libp2p/interfaces/events' import type { Startable } from '@libp2p/interfaces/startable' import type { Connection } from '@libp2p/interface-connection' -import type { PeerId } from '@libp2p/interface-peer-id' +import { isPeerId, PeerId } from '@libp2p/interface-peer-id' import type { ConnectionManager, ConnectionManagerEvents } from '@libp2p/interface-connection-manager' import { connectionPair } from './connection.js' import { CodeError } from '@libp2p/interfaces/errors' @@ -27,13 +27,11 @@ class MockNetwork { getNode (peerId: PeerId | Multiaddr []): MockNetworkComponents { if (Array.isArray(peerId) && peerId.length > 0) { peerId = peerIdFromString(peerId[0].getPeerId() ?? '') - } else { - peerId = peerId as PeerId - } - - for (const components of this.components) { - if (peerId.equals(components.peerId)) { - return components + } else if (isPeerId(peerId)) { + for (const components of this.components) { + if (peerId.equals(components.peerId)) { + return components + } } } @@ -97,11 +95,11 @@ class MockConnectionManager extends EventEmitter implem throw new CodeError('Dialing multiaddrs not supported', 'ERR_NOT_SUPPORTED') } - let existingConnections + let existingConnections: Connection[] = [] - if (Array.isArray(peerId)) { + if (Array.isArray(peerId) && peerId.length > 0) { existingConnections = this.getConnections(peerIdFromString(peerId[0].getPeerId() ?? '')) - } else { + } else if (isPeerId(peerId)) { existingConnections = this.getConnections(peerId) }