From 90bfc6d9b39e573632bdd8236e48b6d81a4c0f92 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Fri, 8 Sep 2023 18:19:34 +0100 Subject: [PATCH 1/3] feat: track failed/successful dials per-address Instead of tracking which peer we failed to dial, track dial success or failure on a per-address basis. This will let us detect when IPv6 is unsupported or certain transports (e.g. UDP ones) are blocked. Refs: 2010 --- packages/interface/src/peer-store/index.ts | 10 ++++ .../src/connection-manager/dial-queue.ts | 52 +++++++++++++++++-- packages/peer-store/src/pb/peer.proto | 6 +++ packages/peer-store/src/pb/peer.ts | 18 +++++++ .../peer-store/src/utils/bytes-to-peer.ts | 6 ++- .../peer-store/src/utils/dedupe-addresses.ts | 12 +++-- .../src/utils/peer-data-to-datastore-peer.ts | 6 ++- 7 files changed, 99 insertions(+), 11 deletions(-) diff --git a/packages/interface/src/peer-store/index.ts b/packages/interface/src/peer-store/index.ts index 93ad16e103..b0612229a9 100644 --- a/packages/interface/src/peer-store/index.ts +++ b/packages/interface/src/peer-store/index.ts @@ -14,6 +14,16 @@ export interface Address { * Obtained from a signed peer record */ isCertified: boolean + + /** + * A timestamp of the last successful dial of this multiaddr + */ + lastSuccess?: number + + /** + * A timestamp of the last unsuccessful dial of this multiaddr + */ + lastFailure?: number } /** diff --git a/packages/libp2p/src/connection-manager/dial-queue.ts b/packages/libp2p/src/connection-manager/dial-queue.ts index 54a387e14c..c6ee6ea85b 100644 --- a/packages/libp2p/src/connection-manager/dial-queue.ts +++ b/packages/libp2p/src/connection-manager/dial-queue.ts @@ -464,10 +464,54 @@ export class DialQueue { // update dial status pendingDial.status = 'active' - const conn = await this.transportManager.dial(addr, { - ...options, - signal - }) + let conn: Connection + + try { + conn = await this.transportManager.dial(addr, { + ...options, + signal + }) + + const peerData = await this.peerStore.get(conn.remotePeer) + const addresses = peerData.addresses.map((address) => { + if (address.multiaddr.equals(addr)) { + return { + ...address, + lastSuccess: Date.now() + } + } + + return address + }) + + // mark multiaddr dial as successful + await this.peerStore.merge(conn.remotePeer, { + addresses + }) + } catch (err: any) { + if (pendingDial.peerId != null) { + // mark multiaddr dial as failure + const peerData = await this.peerStore.get(pendingDial.peerId) + const addresses = peerData.addresses.map((address) => { + if (address.multiaddr.equals(addr)) { + return { + ...address, + lastFailure: Date.now() + } + } + + return address + }) + + // mark multiaddr dial as failed + await this.peerStore.merge(pendingDial.peerId, { + addresses + }) + } + + // rethrow error + throw err + } if (controller.signal.aborted) { // another dial succeeded faster than this one diff --git a/packages/peer-store/src/pb/peer.proto b/packages/peer-store/src/pb/peer.proto index 01c3be1990..474153fdd9 100644 --- a/packages/peer-store/src/pb/peer.proto +++ b/packages/peer-store/src/pb/peer.proto @@ -26,6 +26,12 @@ message Address { // Flag to indicate if the address comes from a certified source optional bool isCertified = 2; + + // ms timestamp when we last succesfully dialed this address + optional uint64 lastSuccess = 3; + + // ms timestamp when we last failed to dial this address + optional uint64 lastFailure = 4; } message Tag { diff --git a/packages/peer-store/src/pb/peer.ts b/packages/peer-store/src/pb/peer.ts index 9ceb63f5ee..70ab8dd766 100644 --- a/packages/peer-store/src/pb/peer.ts +++ b/packages/peer-store/src/pb/peer.ts @@ -264,6 +264,8 @@ export namespace Peer { export interface Address { multiaddr: Uint8Array isCertified?: boolean + lastSuccess?: bigint + lastFailure?: bigint } export namespace Address { @@ -286,6 +288,16 @@ export namespace Address { w.bool(obj.isCertified) } + if (obj.lastSuccess != null) { + w.uint32(24) + w.uint64(obj.lastSuccess) + } + + if (obj.lastFailure != null) { + w.uint32(32) + w.uint64(obj.lastFailure) + } + if (opts.lengthDelimited !== false) { w.ldelim() } @@ -306,6 +318,12 @@ export namespace Address { case 2: obj.isCertified = reader.bool() break + case 3: + obj.lastSuccess = reader.uint64() + break + case 4: + obj.lastFailure = reader.uint64() + break default: reader.skipType(tag & 7) break diff --git a/packages/peer-store/src/utils/bytes-to-peer.ts b/packages/peer-store/src/utils/bytes-to-peer.ts index 3b723efcbe..15b98a5f3a 100644 --- a/packages/peer-store/src/utils/bytes-to-peer.ts +++ b/packages/peer-store/src/utils/bytes-to-peer.ts @@ -30,10 +30,12 @@ export function bytesToPeer (peerId: PeerId, buf: Uint8Array): Peer { return { ...peer, id: peerId, - addresses: peer.addresses.map(({ multiaddr: ma, isCertified }) => { + addresses: peer.addresses.map(({ multiaddr: ma, isCertified, lastFailure, lastSuccess }) => { return { multiaddr: multiaddr(ma), - isCertified: isCertified ?? false + isCertified: isCertified ?? false, + lastFailure: lastFailure != null ? Number(lastFailure) : undefined, + lastSuccess: lastSuccess != null ? Number(lastSuccess) : undefined } }), metadata: peer.metadata, diff --git a/packages/peer-store/src/utils/dedupe-addresses.ts b/packages/peer-store/src/utils/dedupe-addresses.ts index d6f55d7120..306948afb0 100644 --- a/packages/peer-store/src/utils/dedupe-addresses.ts +++ b/packages/peer-store/src/utils/dedupe-addresses.ts @@ -32,10 +32,14 @@ export async function dedupeFilterAndSortAddresses (peerId: PeerId, filter: Addr if (existingAddr != null) { addr.isCertified = existingAddr.isCertified || isCertified + addr.lastFailure = existingAddr.lastFailure != null ? BigInt(existingAddr.lastFailure) : undefined + addr.lastSuccess = existingAddr.lastSuccess != null ? BigInt(existingAddr.lastSuccess) : undefined } else { addressMap.set(maStr, { multiaddr: addr.multiaddr, - isCertified + isCertified, + lastFailure: addr.lastFailure != null ? Number(addr.lastFailure) : undefined, + lastSuccess: addr.lastSuccess != null ? Number(addr.lastSuccess) : undefined }) } } @@ -44,8 +48,10 @@ export async function dedupeFilterAndSortAddresses (peerId: PeerId, filter: Addr .sort((a, b) => { return a.multiaddr.toString().localeCompare(b.multiaddr.toString()) }) - .map(({ isCertified, multiaddr }) => ({ + .map(({ isCertified, multiaddr, lastFailure, lastSuccess }) => ({ isCertified, - multiaddr: multiaddr.bytes + multiaddr: multiaddr.bytes, + lastFailure: lastFailure != null ? BigInt(lastFailure) : undefined, + lastSuccess: lastSuccess != null ? BigInt(lastSuccess) : undefined })) } diff --git a/packages/peer-store/src/utils/peer-data-to-datastore-peer.ts b/packages/peer-store/src/utils/peer-data-to-datastore-peer.ts index fa7ad930ed..c0d72828be 100644 --- a/packages/peer-store/src/utils/peer-data-to-datastore-peer.ts +++ b/packages/peer-store/src/utils/peer-data-to-datastore-peer.ts @@ -36,9 +36,11 @@ export function toDatastorePeer (peerId: PeerId, data: PeerData): PeerPB { .sort((a, b) => { return a.multiaddr.toString().localeCompare(b.multiaddr.toString()) }) - .map(({ multiaddr, isCertified }) => ({ + .map(({ multiaddr, isCertified, lastFailure, lastSuccess }) => ({ multiaddr: multiaddr.bytes, - isCertified + isCertified, + lastFailure: lastFailure != null ? BigInt(lastFailure) : undefined, + lastSuccess: lastSuccess != null ? BigInt(lastSuccess) : undefined })), protocols: (data.protocols ?? []).sort(), metadata: new Map(), From 3b31fdd28234ec92bb074c6ca747a99b6050c848 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Sun, 10 Sep 2023 10:05:14 +0100 Subject: [PATCH 2/3] chore: allow patching individual addreseses --- packages/interface/src/peer-store/index.ts | 2 +- .../src/connection-manager/dial-queue.ts | 68 +++++++------------ packages/libp2p/src/identify/identify.ts | 1 - .../test/connection-manager/direct.spec.ts | 2 +- .../content-routing/content-routing.node.ts | 3 - packages/libp2p/test/identify/index.spec.ts | 1 - .../peer-store/src/utils/bytes-to-peer.ts | 23 +++++-- .../peer-store/src/utils/dedupe-addresses.ts | 59 ++++++++++------ .../src/utils/peer-data-to-datastore-peer.ts | 2 +- packages/peer-store/src/utils/to-peer-pb.ts | 2 - packages/peer-store/test/merge.spec.ts | 58 ++++++++++++++-- packages/peer-store/test/patch.spec.ts | 3 +- packages/peer-store/test/save.spec.ts | 7 +- .../test/utils/dedupe-addresses.spec.ts | 36 ++++------ packages/utils/API.md | 55 ++++++++------- packages/utils/test/address-sort.spec.ts | 39 ++++------- 16 files changed, 192 insertions(+), 169 deletions(-) diff --git a/packages/interface/src/peer-store/index.ts b/packages/interface/src/peer-store/index.ts index b0612229a9..8a7ec601b9 100644 --- a/packages/interface/src/peer-store/index.ts +++ b/packages/interface/src/peer-store/index.ts @@ -13,7 +13,7 @@ export interface Address { /** * Obtained from a signed peer record */ - isCertified: boolean + isCertified?: true /** * A timestamp of the last successful dial of this multiaddr diff --git a/packages/libp2p/src/connection-manager/dial-queue.ts b/packages/libp2p/src/connection-manager/dial-queue.ts index c6ee6ea85b..d299618bc5 100644 --- a/packages/libp2p/src/connection-manager/dial-queue.ts +++ b/packages/libp2p/src/connection-manager/dial-queue.ts @@ -170,8 +170,7 @@ export class DialQueue { const { peerId, multiaddrs } = getPeerAddress(peerIdOrMultiaddr) const addrs: Address[] = multiaddrs.map(multiaddr => ({ - multiaddr, - isCertified: false + multiaddr })) // create abort conditions - need to do this before `calculateMultiaddrs` as we may be about to @@ -317,8 +316,7 @@ export class DialQueue { } return result.map(multiaddr => ({ - multiaddr, - isCertified: false + multiaddr })) }) )) @@ -346,12 +344,6 @@ export class DialQueue { for (const addr of filteredAddrs) { const maStr = addr.multiaddr.toString() - const existing = dedupedAddrs.get(maStr) - - if (existing != null) { - existing.isCertified = existing.isCertified || addr.isCertified || false - continue - } dedupedAddrs.set(maStr, addr) } @@ -472,41 +464,12 @@ export class DialQueue { signal }) - const peerData = await this.peerStore.get(conn.remotePeer) - const addresses = peerData.addresses.map((address) => { - if (address.multiaddr.equals(addr)) { - return { - ...address, - lastSuccess: Date.now() - } - } - - return address - }) - // mark multiaddr dial as successful - await this.peerStore.merge(conn.remotePeer, { - addresses - }) + await this._updateAddressStatus(conn.remotePeer, addr, true) } catch (err: any) { if (pendingDial.peerId != null) { // mark multiaddr dial as failure - const peerData = await this.peerStore.get(pendingDial.peerId) - const addresses = peerData.addresses.map((address) => { - if (address.multiaddr.equals(addr)) { - return { - ...address, - lastFailure: Date.now() - } - } - - return address - }) - - // mark multiaddr dial as failed - await this.peerStore.merge(pendingDial.peerId, { - addresses - }) + await this._updateAddressStatus(pendingDial.peerId, addr, false) } // rethrow error @@ -558,7 +521,9 @@ export class DialQueue { signal.clear() }) - return deferred.promise + const connection = await deferred.promise + + return connection })) // dial succeeded or failed @@ -581,6 +546,25 @@ export class DialQueue { throw err } } + + /** + * Record the last dial success/failure status of the passed multiaddr + */ + private async _updateAddressStatus (peerId: PeerId, multiaddr: Multiaddr, success: boolean): Promise { + const addr: Address = { + multiaddr + } + + if (success) { + addr.lastSuccess = Date.now() + } else { + addr.lastFailure = Date.now() + } + + await this.peerStore.merge(peerId, { + addresses: [addr] + }) + } } /** diff --git a/packages/libp2p/src/identify/identify.ts b/packages/libp2p/src/identify/identify.ts index caa5248b45..53c75f800f 100644 --- a/packages/libp2p/src/identify/identify.ts +++ b/packages/libp2p/src/identify/identify.ts @@ -430,7 +430,6 @@ export class DefaultIdentifyService implements Startable, IdentifyService { const peer = { addresses: message.listenAddrs.map(buf => ({ - isCertified: false, multiaddr: multiaddr(buf) })), protocols: message.protocols, diff --git a/packages/libp2p/test/connection-manager/direct.spec.ts b/packages/libp2p/test/connection-manager/direct.spec.ts index 780c45f605..86bba75ea2 100644 --- a/packages/libp2p/test/connection-manager/direct.spec.ts +++ b/packages/libp2p/test/connection-manager/direct.spec.ts @@ -212,7 +212,7 @@ describe('dialing (direct, WebSockets)', () => { await connectionManager.openConnection(remoteComponents.peerId) const sortedAddresses = peerMultiaddrs - .map((m) => ({ multiaddr: m, isCertified: false })) + .map((m) => ({ multiaddr: m })) .sort(defaultAddressSort) expect(localTMDialStub.getCall(0).args[0].equals(sortedAddresses[0].multiaddr)) diff --git a/packages/libp2p/test/content-routing/content-routing.node.ts b/packages/libp2p/test/content-routing/content-routing.node.ts index 66967667ea..a88048094c 100644 --- a/packages/libp2p/test/content-routing/content-routing.node.ts +++ b/packages/libp2p/test/content-routing/content-routing.node.ts @@ -269,7 +269,6 @@ describe('content-routing', () => { await drain(node.contentRouting.findProviders(CID.parse('QmU621oD8AhHw6t25vVyfYKmL9VV3PTgc52FngEhTGACFB'))) await expect(node.peerStore.get(providerPeerId)).to.eventually.have.property('addresses').that.deep.include({ - isCertified: false, multiaddr: result.multiaddrs[0] }) }) @@ -376,10 +375,8 @@ describe('content-routing', () => { await drain(node.contentRouting.findProviders(CID.parse('QmU621oD8AhHw6t25vVyfYKmL9VV3PTgc52FngEhTGACFB'))) await expect(node.peerStore.get(providerPeerId)).to.eventually.have.property('addresses').that.deep.include({ - isCertified: false, multiaddr: result1.multiaddrs[0] }).and.to.deep.include({ - isCertified: false, multiaddr: result2.multiaddrs[0] }) }) diff --git a/packages/libp2p/test/identify/index.spec.ts b/packages/libp2p/test/identify/index.spec.ts index ed7d54ff09..46525769ba 100644 --- a/packages/libp2p/test/identify/index.spec.ts +++ b/packages/libp2p/test/identify/index.spec.ts @@ -444,7 +444,6 @@ describe('identify', () => { expect(peer.metadata.get('ProtocolVersion')).to.equalBytes(uint8ArrayFromString(message.protocolVersion)) expect(peer.protocols).to.deep.equal(message.protocols) expect(peer.addresses).to.deep.equal([{ - isCertified: false, multiaddr: multiaddr('/ip4/127.0.0.1/tcp/1234') }]) expect(peer.id.publicKey).to.equalBytes(remoteComponents.peerId.publicKey) diff --git a/packages/peer-store/src/utils/bytes-to-peer.ts b/packages/peer-store/src/utils/bytes-to-peer.ts index 15b98a5f3a..579380b572 100644 --- a/packages/peer-store/src/utils/bytes-to-peer.ts +++ b/packages/peer-store/src/utils/bytes-to-peer.ts @@ -2,7 +2,7 @@ import { peerIdFromPeerId } from '@libp2p/peer-id' import { multiaddr } from '@multiformats/multiaddr' import { Peer as PeerPB } from '../pb/peer.js' import type { PeerId } from '@libp2p/interface/peer-id' -import type { Peer, Tag } from '@libp2p/interface/peer-store' +import type { Address, Peer, Tag } from '@libp2p/interface/peer-store' export function bytesToPeer (peerId: PeerId, buf: Uint8Array): Peer { const peer = PeerPB.decode(buf) @@ -31,12 +31,23 @@ export function bytesToPeer (peerId: PeerId, buf: Uint8Array): Peer { ...peer, id: peerId, addresses: peer.addresses.map(({ multiaddr: ma, isCertified, lastFailure, lastSuccess }) => { - return { - multiaddr: multiaddr(ma), - isCertified: isCertified ?? false, - lastFailure: lastFailure != null ? Number(lastFailure) : undefined, - lastSuccess: lastSuccess != null ? Number(lastSuccess) : undefined + const addr: Address = { + multiaddr: multiaddr(ma) } + + if (isCertified) { + addr.isCertified = true + } + + if (lastFailure != null) { + addr.lastFailure = Number(lastFailure) + } + + if (lastSuccess != null) { + addr.lastSuccess = Number(lastSuccess) + } + + return addr }), metadata: peer.metadata, peerRecordEnvelope: peer.peerRecordEnvelope ?? undefined, diff --git a/packages/peer-store/src/utils/dedupe-addresses.ts b/packages/peer-store/src/utils/dedupe-addresses.ts index 306948afb0..7efc96f283 100644 --- a/packages/peer-store/src/utils/dedupe-addresses.ts +++ b/packages/peer-store/src/utils/dedupe-addresses.ts @@ -26,21 +26,27 @@ export async function dedupeFilterAndSortAddresses (peerId: PeerId, filter: Addr continue } - const isCertified = addr.isCertified ?? false const maStr = addr.multiaddr.toString() - const existingAddr = addressMap.get(maStr) - - if (existingAddr != null) { - addr.isCertified = existingAddr.isCertified || isCertified - addr.lastFailure = existingAddr.lastFailure != null ? BigInt(existingAddr.lastFailure) : undefined - addr.lastSuccess = existingAddr.lastSuccess != null ? BigInt(existingAddr.lastSuccess) : undefined - } else { - addressMap.set(maStr, { - multiaddr: addr.multiaddr, - isCertified, - lastFailure: addr.lastFailure != null ? Number(addr.lastFailure) : undefined, - lastSuccess: addr.lastSuccess != null ? Number(addr.lastSuccess) : undefined - }) + let existingAddr = addressMap.get(maStr) + + if (existingAddr == null) { + existingAddr = { + multiaddr: addr.multiaddr + } + + addressMap.set(maStr, existingAddr) + } + + if (addr.isCertified) { + existingAddr.isCertified = true + } + + if (addr.lastFailure != null) { + existingAddr.lastFailure = Number(addr.lastFailure) + } + + if (addr.lastSuccess != null) { + existingAddr.lastSuccess = Number(addr.lastSuccess) } } @@ -48,10 +54,23 @@ export async function dedupeFilterAndSortAddresses (peerId: PeerId, filter: Addr .sort((a, b) => { return a.multiaddr.toString().localeCompare(b.multiaddr.toString()) }) - .map(({ isCertified, multiaddr, lastFailure, lastSuccess }) => ({ - isCertified, - multiaddr: multiaddr.bytes, - lastFailure: lastFailure != null ? BigInt(lastFailure) : undefined, - lastSuccess: lastSuccess != null ? BigInt(lastSuccess) : undefined - })) + .map(({ isCertified, multiaddr, lastFailure, lastSuccess }) => { + const addr: AddressPB = { + multiaddr: multiaddr.bytes, + } + + if (isCertified) { + addr.isCertified = true + } + + if (lastFailure != null) { + addr.lastFailure = BigInt(lastFailure) + } + + if (lastSuccess != null) { + addr.lastSuccess = BigInt(lastSuccess) + } + + return addr + }) } diff --git a/packages/peer-store/src/utils/peer-data-to-datastore-peer.ts b/packages/peer-store/src/utils/peer-data-to-datastore-peer.ts index c0d72828be..7b945a4edc 100644 --- a/packages/peer-store/src/utils/peer-data-to-datastore-peer.ts +++ b/packages/peer-store/src/utils/peer-data-to-datastore-peer.ts @@ -20,7 +20,7 @@ export function toDatastorePeer (peerId: PeerId, data: PeerData): PeerPB { const output: PeerPB = { addresses: (data.addresses ?? []) - .concat((data.multiaddrs ?? []).map(multiaddr => ({ multiaddr, isCertified: false }))) + .concat((data.multiaddrs ?? []).map(multiaddr => ({ multiaddr }))) .filter(address => { if (!isMultiaddr(address.multiaddr)) { throw new CodeError('Invalid mulitaddr', codes.ERR_INVALID_PARAMETERS) diff --git a/packages/peer-store/src/utils/to-peer-pb.ts b/packages/peer-store/src/utils/to-peer-pb.ts index a3a3c92763..29e3a9aefa 100644 --- a/packages/peer-store/src/utils/to-peer-pb.ts +++ b/packages/peer-store/src/utils/to-peer-pb.ts @@ -40,7 +40,6 @@ export async function toPeerPB (peerId: PeerId, data: Partial, strateg if (data.multiaddrs != null) { addresses.push(...data.multiaddrs.map(multiaddr => ({ - isCertified: false, multiaddr }))) } @@ -80,7 +79,6 @@ export async function toPeerPB (peerId: PeerId, data: Partial, strateg if (strategy === 'merge') { if (data.multiaddrs != null) { addresses.push(...data.multiaddrs.map(multiaddr => ({ - isCertified: false, multiaddr }))) } diff --git a/packages/peer-store/test/merge.spec.ts b/packages/peer-store/test/merge.spec.ts index 304512781f..8a0f6e8475 100644 --- a/packages/peer-store/test/merge.spec.ts +++ b/packages/peer-store/test/merge.spec.ts @@ -75,14 +75,11 @@ describe('merge', () => { }) expect(updated).to.have.property('addresses').that.deep.equals([{ - multiaddr: addr1, - isCertified: false + multiaddr: addr1 }, { - multiaddr: addr3, - isCertified: false + multiaddr: addr3 }, { - multiaddr: addr2, - isCertified: false + multiaddr: addr2 }]) // other fields should be untouched @@ -244,4 +241,53 @@ describe('merge', () => { expect(updated).to.have.property('tags').that.deep.equals(original.tags) expect(updated).to.have.property('protocols').that.deep.equals(original.protocols) }) + + it('merges addresses', async () => { + const peer: PeerData = { + addresses: [{ + multiaddr: addr1, + isCertified: true + }, { + multiaddr: addr2, + lastFailure: 5 + }], + metadata: { + foo: Uint8Array.from([0, 1, 2]) + }, + tags: { + tag1: { value: 10 } + }, + protocols: [ + '/foo/bar' + ], + peerRecordEnvelope: Uint8Array.from([3, 4, 5]) + } + + const original = await peerStore.save(otherPeerId, peer) + const updated = await peerStore.merge(otherPeerId, { + addresses: [{ + multiaddr: addr1, + lastFailure: 10 + }, { + multiaddr: addr2, + lastSuccess: 10 + }] + }) + + expect(updated).to.have.property('addresses').that.deep.equals([{ + multiaddr: addr1, + isCertified: true, + lastFailure: 10 + }, { + multiaddr: addr2, + lastFailure: 5, + lastSuccess: 10 + }]) + + // other fields should be untouched + expect(updated).to.have.property('metadata').that.deep.equals(original.metadata) + expect(updated).to.have.property('tags').that.deep.equals(original.tags) + expect(updated).to.have.property('protocols').that.deep.equals(original.protocols) + expect(updated).to.have.property('peerRecordEnvelope').that.deep.equals(original.peerRecordEnvelope) + }) }) diff --git a/packages/peer-store/test/patch.spec.ts b/packages/peer-store/test/patch.spec.ts index a30e22e872..2800fc71fb 100644 --- a/packages/peer-store/test/patch.spec.ts +++ b/packages/peer-store/test/patch.spec.ts @@ -76,8 +76,7 @@ describe('patch', () => { // upated field expect(updated).to.have.property('addresses').that.deep.equals([{ - multiaddr: addr3, - isCertified: false + multiaddr: addr3 }]) // other fields should be untouched diff --git a/packages/peer-store/test/save.spec.ts b/packages/peer-store/test/save.spec.ts index 43552cb883..dde76aa979 100644 --- a/packages/peer-store/test/save.spec.ts +++ b/packages/peer-store/test/save.spec.ts @@ -66,7 +66,6 @@ describe('save', () => { expect(peer.addresses).to.deep.equal( supportedMultiaddrs.map((multiaddr) => ({ - isCertified: false, multiaddr })) ) @@ -230,11 +229,9 @@ describe('save', () => { const saved = await peerStore.save(otherPeerId, peer) expect(saved).to.have.property('addresses').that.deep.equals([{ - multiaddr: addr1, - isCertified: false + multiaddr: addr1 }, { - multiaddr: addr2, - isCertified: false + multiaddr: addr2 }]) expect(saved).to.have.property('metadata').that.deep.equals( new Map([ diff --git a/packages/peer-store/test/utils/dedupe-addresses.spec.ts b/packages/peer-store/test/utils/dedupe-addresses.spec.ts index 233e576239..8f3f42e98d 100644 --- a/packages/peer-store/test/utils/dedupe-addresses.spec.ts +++ b/packages/peer-store/test/utils/dedupe-addresses.spec.ts @@ -18,39 +18,29 @@ describe('dedupe-addresses', () => { it('should dedupe addresses', async () => { expect(await dedupeFilterAndSortAddresses(peerId, async () => true, [{ - multiaddr: addr1, - isCertified: false + multiaddr: addr1 }, { - multiaddr: addr1, - isCertified: false + multiaddr: addr1 }, { - multiaddr: addr2, - isCertified: false + multiaddr: addr2 }])).to.deep.equal([{ - multiaddr: addr1.bytes, - isCertified: false + multiaddr: addr1.bytes }, { - multiaddr: addr2.bytes, - isCertified: false + multiaddr: addr2.bytes }]) }) it('should sort addresses', async () => { expect(await dedupeFilterAndSortAddresses(peerId, async () => true, [{ - multiaddr: addr2, - isCertified: false + multiaddr: addr2 }, { - multiaddr: addr1, - isCertified: false + multiaddr: addr1 }, { - multiaddr: addr1, - isCertified: false + multiaddr: addr1 }])).to.deep.equal([{ - multiaddr: addr1.bytes, - isCertified: false + multiaddr: addr1.bytes }, { - multiaddr: addr2.bytes, - isCertified: false + multiaddr: addr2.bytes }]) }) @@ -59,8 +49,7 @@ describe('dedupe-addresses', () => { multiaddr: addr1, isCertified: true }, { - multiaddr: addr1, - isCertified: false + multiaddr: addr1 }])).to.deep.equal([{ multiaddr: addr1.bytes, isCertified: true @@ -72,8 +61,7 @@ describe('dedupe-addresses', () => { multiaddr: addr1, isCertified: true }, { - multiaddr: addr1, - isCertified: false + multiaddr: addr1 }])).to.deep.equal([]) }) }) diff --git a/packages/utils/API.md b/packages/utils/API.md index 3dbf66d3e6..6da79e94a4 100644 --- a/packages/utils/API.md +++ b/packages/utils/API.md @@ -1,29 +1,30 @@ # API -* [addressSort.publicAddressesFirst(addresses)](#addresssortpublicaddressesfirstaddresses) - * [Parameters](#parameters) - * [Returns](#returns) - * [Example](#example) -* [arrayEquals(a, b)](#arrayequalsa-b) - * [Parameters](#parameters) - * [Returns](#returns) - * [Example](#example) -* [multiaddr .isLoopback(ma)](#multiaddr-isloopbackma) - * [Parameters](#parameters-1) - * [Returns](#returns-1) - * [Example](#example-1) -* [multiaddr .isPrivate(ma)](#multiaddr-isprivatema) - * [Parameters](#parameters-2) - * [Returns](#returns-2) - * [Example](#example-2) -* [ipPortToMultiaddr(ip, port)](#ipporttomultiaddrip-port) - * [Parameters](#parameters-3) - * [Returns](#returns-3) - * [Example](#example-3) -* [streamToMaConnection(streamProperties, options)](#streamtomaconnectionstreamproperties-options) - * [Parameters](#parameters-4) - * [Returns](#returns-4) - * [Example](#example-4) +- [API](#api) + - [addressSort.publicAddressesFirst(addresses)](#addresssortpublicaddressesfirstaddresses) + - [Parameters](#parameters) + - [Returns](#returns) + - [Example](#example) + - [arrayEquals(a, b)](#arrayequalsa-b) + - [Parameters](#parameters-1) + - [Returns](#returns-1) + - [Example](#example-1) + - [multiaddr `.isLoopback(ma)`](#multiaddr-isloopbackma) + - [Parameters](#parameters-2) + - [Returns](#returns-2) + - [Example](#example-2) + - [multiaddr `.isPrivate(ma)`](#multiaddr-isprivatema) + - [Parameters](#parameters-3) + - [Returns](#returns-3) + - [Example](#example-3) + - [ipPortToMultiaddr(ip, port)](#ipporttomultiaddrip-port) + - [Parameters](#parameters-4) + - [Returns](#returns-4) + - [Example](#example-4) + - [streamToMaConnection(streamProperties, options)](#streamtomaconnectionstreamproperties-options) + - [Parameters](#parameters-5) + - [Returns](#returns-5) + - [Example](#example-5) ## addressSort.publicAddressesFirst(addresses) @@ -49,12 +50,10 @@ const { publicAddressesFirst } = require('libp2p-utils/src/address-sort') const addresses = [ { - multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000'), - isCertified: false + multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000') }, { - multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000'), - isCertified: false + multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000') } ] diff --git a/packages/utils/test/address-sort.spec.ts b/packages/utils/test/address-sort.spec.ts index 0e901d8978..0e7cdc8074 100644 --- a/packages/utils/test/address-sort.spec.ts +++ b/packages/utils/test/address-sort.spec.ts @@ -8,12 +8,10 @@ describe('address-sort', () => { describe('public addresses first', () => { it('should sort public addresses first', () => { const publicAddress = { - multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000'), - isCertified: false + multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000') } const privateAddress = { - multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000'), - isCertified: false + multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000') } const addresses = [ @@ -36,16 +34,13 @@ describe('address-sort', () => { isCertified: true } const publicAddress = { - multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000'), - isCertified: false + multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000') } const certifiedPrivateAddress = { - multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4001'), - isCertified: true + multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4001') } const privateAddress = { - multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000'), - isCertified: false + multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000') } const addresses = [ @@ -68,12 +63,10 @@ describe('address-sort', () => { describe('circuit relay addresses last', () => { it('should sort circuit relay addresses last', () => { const publicAddress = { - multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000'), - isCertified: false + multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000') } const publicRelay = { - multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm'), - isCertified: false + multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm') } const addresses = [ @@ -96,32 +89,28 @@ describe('address-sort', () => { isCertified: true } const publicAddress = { - multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000'), - isCertified: false + multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000') } const certifiedPublicRelay = { multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4001/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm'), isCertified: true } const publicRelay = { - multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm'), - isCertified: false + multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm') } const certifiedPrivateAddress = { multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4001'), isCertified: true } const privateAddress = { - multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000'), - isCertified: false + multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000') } const certifiedPrivateRelay = { multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4001/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm'), isCertified: true } const privateRelay = { - multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm'), - isCertified: false + multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm') } const addresses = [ @@ -152,12 +141,10 @@ describe('address-sort', () => { it('should sort WebRTC over relay addresses before relay addresses', () => { const publicRelay = { - multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm'), - isCertified: false + multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm') } const webRTCOverRelay = { - multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm/webrtc'), - isCertified: false + multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN/p2p-circuit/p2p/QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm/webrtc') } const addresses = [ From 7836623a00d1df90c716db78f7dd145854f16cbd Mon Sep 17 00:00:00 2001 From: achingbrain Date: Sun, 10 Sep 2023 16:19:40 +0100 Subject: [PATCH 3/3] chore: fix linting --- packages/peer-store/src/utils/bytes-to-peer.ts | 2 +- packages/peer-store/src/utils/dedupe-addresses.ts | 4 ++-- packages/utils/test/address-sort.spec.ts | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/peer-store/src/utils/bytes-to-peer.ts b/packages/peer-store/src/utils/bytes-to-peer.ts index 579380b572..a4ef476d64 100644 --- a/packages/peer-store/src/utils/bytes-to-peer.ts +++ b/packages/peer-store/src/utils/bytes-to-peer.ts @@ -35,7 +35,7 @@ export function bytesToPeer (peerId: PeerId, buf: Uint8Array): Peer { multiaddr: multiaddr(ma) } - if (isCertified) { + if (isCertified === true) { addr.isCertified = true } diff --git a/packages/peer-store/src/utils/dedupe-addresses.ts b/packages/peer-store/src/utils/dedupe-addresses.ts index 7efc96f283..473a26927a 100644 --- a/packages/peer-store/src/utils/dedupe-addresses.ts +++ b/packages/peer-store/src/utils/dedupe-addresses.ts @@ -37,7 +37,7 @@ export async function dedupeFilterAndSortAddresses (peerId: PeerId, filter: Addr addressMap.set(maStr, existingAddr) } - if (addr.isCertified) { + if (addr.isCertified === true) { existingAddr.isCertified = true } @@ -56,7 +56,7 @@ export async function dedupeFilterAndSortAddresses (peerId: PeerId, filter: Addr }) .map(({ isCertified, multiaddr, lastFailure, lastSuccess }) => { const addr: AddressPB = { - multiaddr: multiaddr.bytes, + multiaddr: multiaddr.bytes } if (isCertified) { diff --git a/packages/utils/test/address-sort.spec.ts b/packages/utils/test/address-sort.spec.ts index c51c77c69a..41cf434616 100644 --- a/packages/utils/test/address-sort.spec.ts +++ b/packages/utils/test/address-sort.spec.ts @@ -37,7 +37,8 @@ describe('address-sort', () => { multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000') } const certifiedPrivateAddress = { - multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4001') + multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4001'), + isCertified: true } const privateAddress = { multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000')