From 6f9d82843aa8222d5e928d55ebb60fddbb1cbadb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 10:07:36 +0000 Subject: [PATCH 1/3] deps: bump node-datachannel from 0.29.0 to 0.30.0 Bumps [node-datachannel](https://github.com/murat-dogan/node-datachannel) from 0.29.0 to 0.30.0. - [Release notes](https://github.com/murat-dogan/node-datachannel/releases) - [Commits](https://github.com/murat-dogan/node-datachannel/compare/v0.29.0...v0.30.0) --- updated-dependencies: - dependency-name: node-datachannel dependency-version: 0.30.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/transport-webrtc/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transport-webrtc/package.json b/packages/transport-webrtc/package.json index c931ccad94..8a20e46499 100644 --- a/packages/transport-webrtc/package.json +++ b/packages/transport-webrtc/package.json @@ -65,7 +65,7 @@ "it-stream-types": "^2.0.2", "main-event": "^1.0.1", "multiformats": "^13.4.0", - "node-datachannel": "^0.29.0", + "node-datachannel": "^0.30.0", "p-defer": "^4.0.1", "p-event": "^7.0.0", "p-timeout": "^7.0.0", From 5f324e2dd4909289758e40986a65acb2eb648a73 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 2 Oct 2025 13:33:25 +0300 Subject: [PATCH 2/3] chore: remove ts-expect-errors --- .../src/private-to-private/initiate-connection.ts | 2 -- packages/transport-webrtc/src/private-to-private/transport.ts | 3 --- .../transport-webrtc/src/private-to-public/utils/connect.ts | 1 - .../src/private-to-public/utils/get-rtcpeerconnection.ts | 1 - packages/transport-webrtc/test/maconn.spec.ts | 1 - 5 files changed, 8 deletions(-) diff --git a/packages/transport-webrtc/src/private-to-private/initiate-connection.ts b/packages/transport-webrtc/src/private-to-private/initiate-connection.ts index 2e8d895fdc..fef8b83473 100644 --- a/packages/transport-webrtc/src/private-to-private/initiate-connection.ts +++ b/packages/transport-webrtc/src/private-to-private/initiate-connection.ts @@ -81,7 +81,6 @@ export async function initiateConnection ({ rtcConfiguration, dataChannel, signa }) const muxerFactory = new DataChannelMuxerFactory({ - // @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370 peerConnection, dataChannelOptions: dataChannel }) @@ -209,7 +208,6 @@ export async function initiateConnection ({ rtcConfiguration, dataChannel, signa return { remoteAddress: ma, - // @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370 peerConnection, muxerFactory } diff --git a/packages/transport-webrtc/src/private-to-private/transport.ts b/packages/transport-webrtc/src/private-to-private/transport.ts index ace1163d89..cda69ab00d 100644 --- a/packages/transport-webrtc/src/private-to-private/transport.ts +++ b/packages/transport-webrtc/src/private-to-private/transport.ts @@ -211,7 +211,6 @@ export class WebRTCTransport implements Transport, Startable { } }) const muxerFactory = new DataChannelMuxerFactory({ - // @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370 peerConnection, dataChannelOptions: this.init.dataChannel }) @@ -229,7 +228,6 @@ export class WebRTCTransport implements Transport, Startable { }) const webRTCConn = toMultiaddrConnection({ - // @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370 peerConnection, remoteAddr: remoteAddress, metrics: this.metrics?.listenerEvents, @@ -246,7 +244,6 @@ export class WebRTCTransport implements Transport, Startable { }) // close the connection on shut down - // @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370 this._closeOnShutdown(peerConnection, webRTCConn) } catch (err: any) { this.log.error('incoming signaling error - %e', err) diff --git a/packages/transport-webrtc/src/private-to-public/utils/connect.ts b/packages/transport-webrtc/src/private-to-public/utils/connect.ts index 4538362a35..3a84ab7410 100644 --- a/packages/transport-webrtc/src/private-to-public/utils/connect.ts +++ b/packages/transport-webrtc/src/private-to-public/utils/connect.ts @@ -127,7 +127,6 @@ export async function connect (peerConnection: RTCPeerConnection | DirectRTCPeer // Creating the connection before completion of the noise // handshake ensures that the stream opening callback is set up const maConn = toMultiaddrConnection({ - // @ts-expect-error types are broken peerConnection, remoteAddr: options.remoteAddr, metrics: options.events, diff --git a/packages/transport-webrtc/src/private-to-public/utils/get-rtcpeerconnection.ts b/packages/transport-webrtc/src/private-to-public/utils/get-rtcpeerconnection.ts index 700d288e03..5e4d909128 100644 --- a/packages/transport-webrtc/src/private-to-public/utils/get-rtcpeerconnection.ts +++ b/packages/transport-webrtc/src/private-to-public/utils/get-rtcpeerconnection.ts @@ -129,7 +129,6 @@ export async function createDialerRTCPeerConnection (role: 'client' | 'server', }) const muxerFactory = new DataChannelMuxerFactory({ - // @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370 peerConnection, metrics: options.events, dataChannelOptions: options.dataChannel diff --git a/packages/transport-webrtc/test/maconn.spec.ts b/packages/transport-webrtc/test/maconn.spec.ts index 6905f5ca47..81c3f8a970 100644 --- a/packages/transport-webrtc/test/maconn.spec.ts +++ b/packages/transport-webrtc/test/maconn.spec.ts @@ -18,7 +18,6 @@ describe('Multiaddr Connection', () => { reset: () => {} }) const maConn = toMultiaddrConnection({ - // @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370 peerConnection, remoteAddr, metrics, From 0f3ab9e617ab10fc09b108923c9d6e0fadd106a3 Mon Sep 17 00:00:00 2001 From: Alex Potsides Date: Tue, 28 Oct 2025 17:05:03 +0200 Subject: [PATCH 3/3] feat: add routing field to providers (#3340) To better debug which routing system supplied a given provider, add a string field to the return type of `findProviders` which allows this information to be reported. --- .../integration-tests/test/fixtures/utils.ts | 9 ++--- packages/interface/src/content-routing.ts | 9 ++++- packages/kad-dht/src/kad-dht.ts | 9 +++-- .../src/connection-manager/dial-queue.ts | 4 +-- packages/libp2p/src/content-routing.ts | 4 +-- .../content-routing/content-routing.spec.ts | 34 ++++++++++++------- packages/logger/src/index.ts | 2 +- .../transport-circuit-relay-v2/test/utils.ts | 9 ++--- 8 files changed, 51 insertions(+), 29 deletions(-) diff --git a/packages/integration-tests/test/fixtures/utils.ts b/packages/integration-tests/test/fixtures/utils.ts index ae6006d507..cb0905ef70 100644 --- a/packages/integration-tests/test/fixtures/utils.ts +++ b/packages/integration-tests/test/fixtures/utils.ts @@ -5,7 +5,7 @@ import { Circuit } from '@multiformats/multiaddr-matcher' import { detect } from 'detect-browser' import pWaitFor from 'p-wait-for' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' -import type { Libp2p, AbortOptions, ContentRouting, PeerId, PeerInfo } from '@libp2p/interface' +import type { Libp2p, AbortOptions, ContentRouting, PeerId, Provider } from '@libp2p/interface' import type { AddressManager } from '@libp2p/interface-internal' import type { Multiaddr } from '@multiformats/multiaddr' import type { CID, Version } from 'multiformats' @@ -153,7 +153,7 @@ export interface MockContentRoutingComponents { } export class MockContentRouting implements ContentRouting { - static providers = new Map() + static providers = new Map() static data = new Map() static reset (): void { @@ -175,7 +175,8 @@ export class MockContentRouting implements ContentRouting { providers.push({ id: this.peerId, - multiaddrs: this.addressManager.getAddresses() + multiaddrs: this.addressManager.getAddresses(), + routing: 'mock-content-routing' }) MockContentRouting.providers.set(cid.toString(), providers) @@ -185,7 +186,7 @@ export class MockContentRouting implements ContentRouting { } - async * findProviders (cid: CID, options?: AbortOptions | undefined): AsyncGenerator { + async * findProviders (cid: CID, options?: AbortOptions | undefined): AsyncGenerator { yield * MockContentRouting.providers.get(cid.toString()) ?? [] } diff --git a/packages/interface/src/content-routing.ts b/packages/interface/src/content-routing.ts index fea438cfe8..9a7df19430 100644 --- a/packages/interface/src/content-routing.ts +++ b/packages/interface/src/content-routing.ts @@ -2,6 +2,13 @@ import type { RoutingOptions } from './index.js' import type { PeerInfo } from './peer-info.js' import type { CID } from 'multiformats/cid' +export interface Provider extends PeerInfo { + /** + * Which routing subsystem found the provider + */ + routing: string +} + /** * Any object that implements this Symbol as a property should return a * Partial instance as the property value, similar to how @@ -64,7 +71,7 @@ export interface ContentRouting { * } * ``` */ - findProviders(cid: CID, options?: RoutingOptions): AsyncIterable + findProviders(cid: CID, options?: RoutingOptions): AsyncIterable /** * Puts a value corresponding to the passed key in a way that can later be diff --git a/packages/kad-dht/src/kad-dht.ts b/packages/kad-dht/src/kad-dht.ts index 6ab6d68e40..5fb8b0d89b 100644 --- a/packages/kad-dht/src/kad-dht.ts +++ b/packages/kad-dht/src/kad-dht.ts @@ -24,7 +24,7 @@ import { timeOperationGenerator } from './utils.js' import type { KadDHTComponents, KadDHTInit, Validators, Selectors, KadDHT as KadDHTInterface, QueryEvent, PeerInfoMapper, SetModeOptions } from './index.js' -import type { ContentRouting, CounterGroup, Logger, MetricGroup, PeerDiscovery, PeerDiscoveryEvents, PeerId, PeerInfo, PeerRouting, RoutingOptions, Startable } from '@libp2p/interface' +import type { ContentRouting, CounterGroup, Logger, MetricGroup, PeerDiscovery, PeerDiscoveryEvents, PeerId, PeerInfo, PeerRouting, Provider, RoutingOptions, Startable } from '@libp2p/interface' import type { AbortOptions } from 'it-pushable' import type { CID } from 'multiformats/cid' @@ -46,10 +46,13 @@ class DHTContentRouting implements ContentRouting { await this.dht.cancelReprovide(key) } - async * findProviders (cid: CID, options: RoutingOptions = {}): AsyncGenerator { + async * findProviders (cid: CID, options: RoutingOptions = {}): AsyncGenerator { for await (const event of this.dht.findProviders(cid, options)) { if (event.name === 'PROVIDER') { - yield * event.providers + yield * event.providers.map(peer => ({ + ...peer, + routing: 'kad-dht' + })) } } } diff --git a/packages/libp2p/src/connection-manager/dial-queue.ts b/packages/libp2p/src/connection-manager/dial-queue.ts index 7ef478e27c..12125fe68d 100644 --- a/packages/libp2p/src/connection-manager/dial-queue.ts +++ b/packages/libp2p/src/connection-manager/dial-queue.ts @@ -515,8 +515,8 @@ export class DialQueue { } return true - } catch (err) { - this.log.trace('error calculating if multiaddr(s) were dialable', err) + } catch { + } return false diff --git a/packages/libp2p/src/content-routing.ts b/packages/libp2p/src/content-routing.ts index a0f58ca136..f75bc4d719 100644 --- a/packages/libp2p/src/content-routing.ts +++ b/packages/libp2p/src/content-routing.ts @@ -3,7 +3,7 @@ import { PeerSet } from '@libp2p/peer-collections' import merge from 'it-merge' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' import { NoContentRoutersError } from './errors.js' -import type { AbortOptions, ComponentLogger, ContentRouting, Metrics, PeerInfo, PeerRouting, PeerStore, RoutingOptions, Startable } from '@libp2p/interface' +import type { AbortOptions, ComponentLogger, ContentRouting, Metrics, PeerRouting, PeerStore, Provider, RoutingOptions, Startable } from '@libp2p/interface' import type { CID } from 'multiformats/cid' export interface CompoundContentRoutingInit { @@ -95,7 +95,7 @@ export class CompoundContentRouting implements ContentRouting, Startable { /** * Iterates over all content routers in parallel to find providers of the given key */ - async * findProviders (key: CID, options: RoutingOptions = {}): AsyncGenerator { + async * findProviders (key: CID, options: RoutingOptions = {}): AsyncGenerator { if (this.routers.length === 0) { throw new NoContentRoutersError('No content routers available') } diff --git a/packages/libp2p/test/content-routing/content-routing.spec.ts b/packages/libp2p/test/content-routing/content-routing.spec.ts index 71a75d0689..5fccca9ca3 100644 --- a/packages/libp2p/test/content-routing/content-routing.spec.ts +++ b/packages/libp2p/test/content-routing/content-routing.spec.ts @@ -13,7 +13,7 @@ import sinon from 'sinon' import { stubInterface } from 'sinon-ts' import { createLibp2p } from '../../src/index.js' import type { Libp2p } from '../../src/index.js' -import type { ContentRouting, PeerInfo } from '@libp2p/interface' +import type { ContentRouting, Provider } from '@libp2p/interface' import type { StubbedInstance } from 'sinon-ts' describe('content-routing', () => { @@ -87,7 +87,8 @@ describe('content-routing', () => { id: peerIdFromPrivateKey(await generateKeyPair('Ed25519')), multiaddrs: [ multiaddr('/ip4/123.123.123.123/tcp/4001') - ] + ], + routing: 'test' } deferred.resolve() }) @@ -136,7 +137,8 @@ describe('content-routing', () => { delegate.findProviders.returns(async function * () { yield { id: node.peerId, - multiaddrs: [] + multiaddrs: [], + routing: 'test' } deferred.resolve() }()) @@ -173,7 +175,8 @@ describe('content-routing', () => { id: peerIdFromString(provider), multiaddrs: [ multiaddr('/ip4/0.0.0.0/tcp/0') - ] + ], + routing: 'test' } }()) @@ -224,11 +227,12 @@ describe('content-routing', () => { it('should store the multiaddrs of a peer', async () => { const providerPeerId = peerIdFromPrivateKey(await generateKeyPair('Ed25519')) - const result: PeerInfo = { + const result: Provider = { id: providerPeerId, multiaddrs: [ multiaddr('/ip4/123.123.123.123/tcp/49320') - ] + ], + routing: 'test' } router.findProviders.callsFake(async function * () {}) @@ -252,7 +256,8 @@ describe('content-routing', () => { id: providerPeerId, multiaddrs: [ multiaddr('/ip4/123.123.123.123/tcp/49320') - ] + ], + routing: 'test' } const defer = pDefer() @@ -278,7 +283,8 @@ describe('content-routing', () => { id: providerPeerId, multiaddrs: [ multiaddr('/ip4/123.123.123.123/tcp/49320') - ] + ], + routing: 'test' } router.findProviders.callsFake(async function * () { @@ -299,13 +305,15 @@ describe('content-routing', () => { id: providerPeerId, multiaddrs: [ multiaddr('/ip4/123.123.123.123/tcp/49320') - ] + ], + routing: 'test' } const result2 = { id: providerPeerId, multiaddrs: [ multiaddr('/ip4/213.213.213.213/tcp/2344') - ] + ], + routing: 'test' } router.findProviders.callsFake(async function * () { @@ -352,7 +360,8 @@ describe('content-routing', () => { id: providerPeerId, multiaddrs: [ multiaddr('/ip4/123.123.123.123/tcp/2341') - ] + ], + routing: 'test' }] router.findProviders.callsFake(async function * () { @@ -377,7 +386,8 @@ describe('content-routing', () => { id: providerPeerId, multiaddrs: [ multiaddr('/ip4/123.123.123.123/tcp/2341') - ] + ], + routing: 'test' }] router.findProviders.callsFake(async function * () {}) diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts index 1313fc7fb8..c4aac5b4e6 100644 --- a/packages/logger/src/index.ts +++ b/packages/logger/src/index.ts @@ -107,7 +107,7 @@ function formatError (v: Error): string { } function isAggregateError (err?: any): err is AggregateError { - return err?.name === 'AggregateError' + return err instanceof AggregateError || (err?.name === 'AggregateError' && Array.isArray(err.errors)) } // Add a formatter for stringifying Errors diff --git a/packages/transport-circuit-relay-v2/test/utils.ts b/packages/transport-circuit-relay-v2/test/utils.ts index 6d24b0b582..64d7177b68 100644 --- a/packages/transport-circuit-relay-v2/test/utils.ts +++ b/packages/transport-circuit-relay-v2/test/utils.ts @@ -4,7 +4,7 @@ import { Circuit } from '@multiformats/multiaddr-matcher' import pWaitFor from 'p-wait-for' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' import { RELAY_V2_HOP_CODEC } from '../../../packages/transport-circuit-relay-v2/src/constants.js' -import type { Libp2p, AbortOptions, ContentRouting, PeerId, PeerInfo } from '@libp2p/interface' +import type { Libp2p, AbortOptions, ContentRouting, PeerId, Provider } from '@libp2p/interface' import type { AddressManager } from '@libp2p/interface-internal' import type { Multiaddr } from '@multiformats/multiaddr' import type { CID, Version } from 'multiformats' @@ -133,7 +133,7 @@ export interface MockContentRoutingComponents { } export class MockContentRouting implements ContentRouting { - static providers = new Map() + static providers = new Map() static data = new Map() static reset (): void { @@ -155,7 +155,8 @@ export class MockContentRouting implements ContentRouting { providers.push({ id: this.peerId, - multiaddrs: this.addressManager.getAddresses() + multiaddrs: this.addressManager.getAddresses(), + routing: 'mock-content-routing' }) MockContentRouting.providers.set(cid.toString(), providers) @@ -165,7 +166,7 @@ export class MockContentRouting implements ContentRouting { } - async * findProviders (cid: CID, options?: AbortOptions | undefined): AsyncGenerator { + async * findProviders (cid: CID, options?: AbortOptions | undefined): AsyncGenerator { yield * MockContentRouting.providers.get(cid.toString()) ?? [] }