From c2d1adb19e3ecf69235e94ab0ae58ba8d448fe91 Mon Sep 17 00:00:00 2001 From: Andre Staltz Date: Tue, 16 Jan 2024 10:58:57 +0200 Subject: [PATCH] use multiaddr instead of multiserver addresses --- lib/connections.js | 94 ++++++++++++++++-------------- lib/glue.js | 20 +++---- lib/index.js | 42 ++++++------- lib/infos.js | 54 ++++++++--------- lib/multiaddr.js | 67 +++++++++++++++++++++ lib/stats.js | 18 +++--- test/fixtures/corrupted/stats.json | 2 +- test/fixtures/present/stats.json | 2 +- test/glue.test.js | 4 +- test/index.test.js | 6 +- test/stats.test.js | 4 +- 11 files changed, 194 insertions(+), 119 deletions(-) create mode 100644 lib/multiaddr.js diff --git a/lib/connections.js b/lib/connections.js index 667ea6b..daeaead 100644 --- a/lib/connections.js +++ b/lib/connections.js @@ -2,10 +2,11 @@ const debug = require('debug')('ppppp:net:connections') const createNotify = require('pull-notify') const run = require('promisify-tuple') const IP = require('ip') +const Multiaddr = require('./multiaddr') /** * @typedef {import('./index').RpcConnectListener} RpcConnectListener - * @typedef {import('./index').Address} Address + * @typedef {import('./index').Multiaddr} Multiaddr * @typedef {import('./index').RPC} RPC * @typedef {import('./index').Peer} Peer * @typedef {import('./infos').Info} Info @@ -17,7 +18,7 @@ const IP = require('ip') * | 'connecting-failed' * | 'disconnecting' * | 'disconnected'; - * address: Address; + * multiaddr: Multiaddr; * pubkey: string | undefined; * details?: any; * }} ConnectionEvent @@ -37,12 +38,12 @@ class Connections { #closed /** @type {NotifyEvent} */ #notifyEvent - /** @type {Map} */ + /** @type {Map} */ #rpcs /** * Used only to schedule a connect when a disconnect is in progress. - * @type {Set
} + * @type {Set} */ #connectRetries @@ -62,7 +63,7 @@ class Connections { } /** - * @param {Address} address + * @param {string} address * @returns {Info['inferredType']} */ static inferPeerType(address) { @@ -111,28 +112,29 @@ class Connections { } /** - * @type {(address: Address, rpc: RPC, weAreClient: boolean) => void} + * @type {(address: string, rpc: RPC, weAreClient: boolean) => void} */ #prepareConnectedRPC = (address, rpc, weAreClient) => { const initiator = weAreClient ? 'we' : 'they' - debug('Connected to %s, %s initiated it', address, initiator) + const multiaddr = Multiaddr.fromMs(address) + debug('Connected to %s, %s initiated it', multiaddr, initiator) const pubkey = Connections.extractSHSEPubkey(address) - this.#rpcs.set(address, rpc) + this.#rpcs.set(multiaddr, rpc) rpc.once('closed', () => { - debug('Disconnected from %s', address) - this.#rpcs.delete(address) - this.#infos.update(address, { state: 'disconnected' }) - this.#notifyEvent({ type: 'disconnected', address, pubkey }) + debug('Disconnected from %s', multiaddr) + this.#rpcs.delete(multiaddr) + this.#infos.update(multiaddr, { state: 'disconnected' }) + this.#notifyEvent({ type: 'disconnected', multiaddr, pubkey }) this.#infos.emit() }) const state = /**@type {Info['state']}*/ ('connected') const inferredType = Connections.inferPeerType(address) - this.#infos.update(address, { state, inferredType }) + this.#infos.update(multiaddr, { state, inferredType }) this.#notifyEvent({ type: state, - address, + multiaddr, pubkey, details: { rpc, weAreClient }, }) @@ -140,37 +142,38 @@ class Connections { } /** - * @param {string} address + * @param {Multiaddr} multiaddr * @returns {Promise} */ - async connect(address) { + async connect(multiaddr) { this.#assertNotClosed() - const prevInfo = this.#infos.get(address) + const address = Multiaddr.toMs(multiaddr) + const prevInfo = this.#infos.get(multiaddr) switch (prevInfo?.state ?? 'disconnected') { case 'connected': { - const rpc = this.#rpcs.get(address) + const rpc = this.#rpcs.get(multiaddr) if (!rpc) { // prettier-ignore - throw new Error(`Failed to connect to ${address} due to inconsistent internal state`); + throw new Error(`Failed to connect to ${multiaddr} due to inconsistent internal state`); } return rpc } case 'disconnecting': { // If disconnecting, schedule a connect() after disconnection completed - this.#connectRetries.add(address) + this.#connectRetries.add(multiaddr) // note: control flow should fall through below! } case 'connecting': { return new Promise((resolve, reject) => { let timeout = 100 const checkAgain = () => { - const rpc = this.#rpcs.get(address) + const rpc = this.#rpcs.get(multiaddr) if (rpc) resolve(rpc) else if (timeout > 5 * 60e3) { // prettier-ignore - reject(new Error(`Failed to connect to ${address} after waiting a long time`)) + reject(new Error(`Failed to connect to ${multiaddr} after waiting a long time`)) } else { timeout *= 2 setTimeout(checkAgain, timeout) @@ -181,20 +184,20 @@ class Connections { } case 'disconnected': { - debug('Connecting to %s', address) + debug('Connecting to %s', multiaddr) const state = /**@type {Info['state']}*/ ('connecting') const pubkey = Connections.extractSHSEPubkey(address) - this.#infos.update(address, { state }) - this.#notifyEvent({ type: state, address, pubkey }) + this.#infos.update(multiaddr, { state }) + this.#notifyEvent({ type: state, multiaddr, pubkey }) this.#infos.emit() const [err, rpc] = await run(this.#peer.connect)(address) if (err) { - this.#infos.update(address, { state: 'disconnected' }) - debug('Failed to connect to %s because: %s', address, err.message) + this.#infos.update(multiaddr, { state: 'disconnected' }) + debug('Failed to connect to %s because: %s', multiaddr, err.message) this.#notifyEvent({ type: 'connecting-failed', - address, + multiaddr, pubkey, details: err, }) @@ -202,15 +205,15 @@ class Connections { throw err } - const concurrentInfo = this.#infos.get(address) + const concurrentInfo = this.#infos.get(multiaddr) if (!concurrentInfo || concurrentInfo.state !== 'connected') { this.#prepareConnectedRPC(address, rpc, true) return rpc } else { - const rpc2 = this.#rpcs.get(address) + const rpc2 = this.#rpcs.get(multiaddr) if (!rpc2) { // prettier-ignore - throw new Error(`Failed to connect to ${address} due to inconsistent internal state`); + throw new Error(`Failed to connect to ${multiaddr} due to inconsistent internal state`); } return rpc2 } @@ -218,20 +221,21 @@ class Connections { default: { // prettier-ignore - debug('Unexpected control flow, peer %s has bad state %o', address, prevInfo) + debug('Unexpected control flow, peer %s has bad state %o', multiaddr, prevInfo) // prettier-ignore - throw new Error(`Unexpected control flow, peer ${address} has bad state "${prevInfo?.state ?? '?'}"`) + throw new Error(`Unexpected control flow, peer ${multiaddr} has bad state "${prevInfo?.state ?? '?'}"`) } } } /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @returns {Promise} */ - async disconnect(address) { + async disconnect(multiaddr) { this.#assertNotClosed() - const prevInfo = this.#infos.get(address) + const address = Multiaddr.toMs(multiaddr) + const prevInfo = this.#infos.get(multiaddr) if (!prevInfo || prevInfo?.state === 'disconnected') return false if (prevInfo.state === 'disconnecting') return false @@ -241,7 +245,7 @@ class Connections { rpc = await new Promise((resolve) => { let timeout = 100 const checkAgain = () => { - const rpc = this.#rpcs.get(address) + const rpc = this.#rpcs.get(multiaddr) if (rpc) resolve(rpc) else { timeout *= 2 @@ -252,20 +256,20 @@ class Connections { checkAgain() }) } else if (prevInfo.state === 'connected') { - const maybeRPC = this.#rpcs.get(address) + const maybeRPC = this.#rpcs.get(multiaddr) if (!maybeRPC) { // prettier-ignore - throw new Error(`Failed to disconnect from ${address} due to inconsistent internal state`); + throw new Error(`Failed to disconnect from ${multiaddr} due to inconsistent internal state`); } else { rpc = maybeRPC } } - debug('Disconnecting from %s', address) + debug('Disconnecting from %s', multiaddr) const state = /**@type {Info['state']}*/ ('disconnecting') const pubkey = Connections.extractSHSEPubkey(address) - this.#infos.update(address, { state }) - this.#notifyEvent({ type: state, address, pubkey }) + this.#infos.update(multiaddr, { state }) + this.#notifyEvent({ type: state, multiaddr, pubkey }) this.#infos.emit() // @ts-ignore await run(rpc.close)(true) @@ -273,9 +277,9 @@ class Connections { // Re-connect because while disconnect() was running, // someone called connect() - if (this.#connectRetries.has(address)) { - this.#connectRetries.delete(address) - this.connect(address) + if (this.#connectRetries.has(multiaddr)) { + this.#connectRetries.delete(multiaddr) + this.connect(multiaddr) } return true diff --git a/lib/glue.js b/lib/glue.js index b7b0327..f136acc 100644 --- a/lib/glue.js +++ b/lib/glue.js @@ -3,7 +3,7 @@ const stats = require('statistics') const ping = require('pull-ping') /** - * @typedef {import('./index').Address} Address + * @typedef {import('./index').Multiaddr} Multiaddr * @typedef {import('./index').RPC} RPC * @typedef {import('./index').Peer} Peer * @typedef {import('./connections')} Connections @@ -19,13 +19,13 @@ const PROGRAM_STARTUP = Date.now() */ function glue(infos, connections) { /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @param {RPC} rpc */ - function setupPing(address, rpc) { + function setupPing(multiaddr, rpc) { const PING_TIMEOUT = 5 * 6e4 // 5 minutes const pp = ping({ serve: true, timeout: PING_TIMEOUT }, () => {}) - infos.updateStats(address, () => ({ + infos.updateStats(multiaddr, () => ({ ping: { rtt: pp.rtt, skew: pp.skew, @@ -36,7 +36,7 @@ function glue(infos, connections) { rpc.net.ping({ timeout: PING_TIMEOUT }, (err, _) => { console.warn('remote peer ping err', err) // if (err?.name === 'TypeError') { - // infos.update(address, {stats: {ping: {fail: true}}}); + // infos.update(multiaddr, {stats: {ping: {fail: true}}}); // } }), pp @@ -47,7 +47,7 @@ function glue(infos, connections) { * @param {Event} ev */ function onConnectingFailed(ev) { - infos.updateStats(ev.address, (prevStats) => ({ + infos.updateStats(ev.multiaddr, (prevStats) => ({ failure: (prevStats?.failure ?? 0) + 1, stateChange: Date.now(), duration: stats(prevStats?.duration, 0), @@ -58,18 +58,18 @@ function glue(infos, connections) { * @param {Event} ev */ function onConnected(ev) { - infos.updateStats(ev.address, () => ({ + infos.updateStats(ev.multiaddr, () => ({ stateChange: Date.now(), failure: 0, })) - if (ev.details.weAreClient) setupPing(ev.address, ev.details.rpc) + if (ev.details.weAreClient) setupPing(ev.multiaddr, ev.details.rpc) } /** * @param {Event} ev */ function bumpStateChange(ev) { - infos.updateStats(ev.address, () => ({ + infos.updateStats(ev.multiaddr, () => ({ stateChange: Date.now(), })) } @@ -78,7 +78,7 @@ function glue(infos, connections) { * @param {Event} ev */ function onDisconnected(ev) { - infos.updateStats(ev.address, (prevStats) => ({ + infos.updateStats(ev.multiaddr, (prevStats) => ({ stateChange: Date.now(), duration: stats( prevStats?.duration, diff --git a/lib/index.js b/lib/index.js index 5f8c0e0..0cc5242 100644 --- a/lib/index.js +++ b/lib/index.js @@ -9,7 +9,7 @@ const glue = require('./glue') /** * @typedef {import('pull-stream').Duplex} Duplex * @typedef {import('./connections').ConnectionEvent} ConnectionEvent - * @typedef {string} Address + * @typedef {`/${string}`} Multiaddr * @typedef {(rpc: RPC, weAreClient: boolean) => void} RpcConnectListener * @typedef {{ * shse: {pubkey: string}; @@ -24,12 +24,14 @@ const glue = require('./glue') * multiserver: { * parse(address: string): any * }, + * }} Peer + * @typedef {Peer & { + * stream: {address: string} * net: { * ping(opts: {timeout: number}, cb: CB): Duplex; * listen(): import('pull-stream').Source; * }, - * }} Peer - * @typedef {Peer & {stream: {address: string}}} RPC + * }} RPC * @typedef {{ * global: { * path?: string @@ -97,56 +99,56 @@ function initNet(peer, config) { } /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @param {Partial} info */ - function stage(address, info) { + function stage(multiaddr, info) { if (info.state) throw new Error('Cannot stage peer info with "state" field') - if (infos.has(address)) { + if (infos.has(multiaddr)) { return false } else { - infos.update(address, info) + infos.update(multiaddr, info) return true } } /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @param {CB=} cb */ - function connect(address, cb) { - connections.connect(address).then( + function connect(multiaddr, cb) { + connections.connect(multiaddr).then( (result) => cb?.(null, result), (err) => cb?.(err) ) } /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @param {CB=} cb */ - function disconnect(address, cb) { - return connections.disconnect(address).then( + function disconnect(multiaddr, cb) { + return connections.disconnect(multiaddr).then( (result) => cb?.(null, result), (err) => cb?.(err) ) } /** - * @param {Address} address + * @param {Multiaddr} multiaddr */ - function forget(address) { - disconnect(address, () => { - infos.remove(address) + function forget(multiaddr) { + disconnect(multiaddr, () => { + infos.remove(multiaddr) }) } /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @param {Info} info */ - function updateInfo(address, info) { - infos.update(address, info) + function updateInfo(multiaddr, info) { + infos.update(multiaddr, info) } function listen() { diff --git a/lib/infos.js b/lib/infos.js index 78c2c59..25a78bc 100644 --- a/lib/infos.js +++ b/lib/infos.js @@ -9,7 +9,7 @@ const Obz = require('obz') */ /** - * @typedef {import('./index').Address} Address + * @typedef {import('./index').Multiaddr} Multiaddr * @typedef {import('./stats').StatsInfo} StatsInfo * @typedef {{ * state: 'connected' | 'disconnected' | 'connecting' | 'disconnecting', @@ -19,11 +19,11 @@ const Obz = require('obz') */ class Infos { - /** @type {Map} */ + /** @type {Map} */ #map /** @type {ReturnType} */ #notify - /** @type {Obz
} */ + /** @type {Obz} */ #onStatsUpdated constructor() { @@ -33,76 +33,76 @@ class Infos { } /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @returns {Info | undefined} */ - get(address) { - return this.#map.get(address) + get(multiaddr) { + return this.#map.get(multiaddr) } /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @returns {boolean} */ - has(address) { - return this.#map.has(address) + has(multiaddr) { + return this.#map.has(multiaddr) } /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @param {Partial} info * @returns {void} */ - update(address, info) { + update(multiaddr, info) { const hasNewStats = !!info.stats - const prevInfo = this.#map.get(address) + const prevInfo = this.#map.get(multiaddr) if (prevInfo) { for (const key of Object.keys(info)) { const k = /**@type {keyof Info}*/ (key) if (typeof info[k] === 'undefined') delete info[k] } - this.#map.set(address, { ...prevInfo, ...info }) + this.#map.set(multiaddr, { ...prevInfo, ...info }) } else if (!info.state) { - this.#map.set(address, { ...info, state: 'disconnected' }) + this.#map.set(multiaddr, { ...info, state: 'disconnected' }) } else { - this.#map.set(address, /**@type {Info}*/ (info)) + this.#map.set(multiaddr, /**@type {Info}*/ (info)) } if (hasNewStats) { - this.#onStatsUpdated.set(address) + this.#onStatsUpdated.set(multiaddr) } } /** - * @param {Address} address + * @param {Multiaddr} multiaddr * @param {(prevStats: Partial) => Partial} getStats * @returns {void} */ - updateStats(address, getStats) { - const prevInfo = this.#map.get(address) + updateStats(multiaddr, getStats) { + const prevInfo = this.#map.get(multiaddr) if (!prevInfo) return - this.#map.set(address, { + this.#map.set(multiaddr, { ...prevInfo, stats: { ...prevInfo?.stats, ...getStats(prevInfo?.stats), }, }) - this.#onStatsUpdated.set(address) + this.#onStatsUpdated.set(multiaddr) } /** - * @param {Parameters>[0]} listener + * @param {Parameters>[0]} listener */ onStatsUpdated(listener) { return this.#onStatsUpdated(listener) } /** - * @param {Address} address + * @param {Multiaddr} multiaddr */ - remove(address) { - this.#map.delete(address) - this.#onStatsUpdated.set(address) + remove(multiaddr) { + this.#map.delete(multiaddr) + this.#onStatsUpdated.set(multiaddr) } size() { @@ -118,7 +118,7 @@ class Infos { } /** - * @returns {pull.Source<[Address, Info]>} + * @returns {pull.Source<[Multiaddr, Info]>} */ liveEntries() { return pullConcat([ diff --git a/lib/multiaddr.js b/lib/multiaddr.js new file mode 100644 index 0000000..269c945 --- /dev/null +++ b/lib/multiaddr.js @@ -0,0 +1,67 @@ +const IP = require('ip') + +const Multiaddr = { + /** + * Converts (legacy) [multiserver](https://github.com/ssbc/multiserver-address) + * addresses to [multiaddr](https://multiformats.io/multiaddr/) (modern). + * @param {string} msaddr + * @returns {`/${string}`} + */ + fromMs(msaddr) { + const [msTransport, msTransform] = msaddr.split('~') + const [label1, host, port] = msTransport.split(':') + + const hostFormat = IP.isV4Format(host) + ? 'ip4' + : IP.isV6Format('ipv6') + ? 'ip6' + : 'dns' + const transport = label1 === 'net' ? 'tcp' : label1 === 'ws' ? 'ws' : null + if (!transport) throw new Error(`Unknown transport "${label1}"`) + const soFar = `${hostFormat}/${host}/${transport}/${port}` + + if (msTransform) { + const [label2, pubkey, token] = msTransform.split(':') + if (label2 !== 'shse') throw new Error(`Unknown transform "${label2}"`) + if (token) { + return `/${soFar}/shse/${pubkey}.${token}` + } else { + return `/${soFar}/shse/${pubkey}` + } + } else { + return `/${soFar}` + } + }, + + /** + * Converts [multiaddr](https://multiformats.io/multiaddr/) (modern) to + * [multiserver](https://github.com/ssbc/multiserver-address) address (legacy). + * @param {`/${string}`} multiaddr + * @returns {string} + */ + toMs(multiaddr) { + if (!multiaddr.startsWith('/')) { + // prettier-ignore + throw new Error(`Invalid multiaddr "${multiaddr}"`) + } + const [, , host, transport, port, transform, cred] = multiaddr.split('/') + const label1 = + transport === 'tcp' ? 'net' : transport === 'ws' ? 'ws' : null + if (!label1) throw new Error(`Unknown transport "${transport}"`) + const soFar = `${label1}:${host}:${port}` + if (transform) { + // prettier-ignore + if (transform !== 'shse') throw new Error(`Unknown transform "${transform}"`) + const [pubkey, token] = cred.split('.') + if (token) { + return `${soFar}~shse:${pubkey}:${token}` + } else { + return `${soFar}~shse:${pubkey}` + } + } else { + return soFar + } + }, +} + +module.exports = Multiaddr diff --git a/lib/stats.js b/lib/stats.js index 5a3188c..22f137d 100644 --- a/lib/stats.js +++ b/lib/stats.js @@ -4,7 +4,7 @@ const debug = require('debug')('ppppp:net:stats') const atomic = require('atomic-file-rw') /** - * @typedef {import('./index').Address} Address + * @typedef {import('./index').Multiaddr} Multiaddr * @typedef {import('./infos')} Infos * @typedef {import('statistics').Statistics} Statistics * @typedef {{ @@ -42,7 +42,7 @@ const SelfHealingJSONCodec = { }, /** * @param {any} input - * @returns {Record} + * @returns {Record<`/${string}`, any>} */ decode(input) { if (!input) return {} @@ -114,8 +114,10 @@ class Stats { return } else if (fileContents) { const vals = SelfHealingJSONCodec.decode(fileContents) - for (const [address, statsInfo] of Object.entries(vals)) { - this.#infos.update(address, { stats: statsInfo }) + for (const [multiaddr, statsInfo] of Object.entries(vals)) { + this.#infos.update(/**@type {`/${string}`}*/ (multiaddr), { + stats: statsInfo, + }) } this.#loadedResolve(true) debug('Loaded conn.json into ConnDB in memory') @@ -180,10 +182,10 @@ class Stats { */ #writeToDisk(cb) { debug(`Begun serializing and writing ${Stats.FILENAME}`) - const record = /**@type {Record}*/ ({}) - for (let [address, info] of this.#infos.entries()) { + const record = /**@type {Record}*/ ({}) + for (let [multiaddr, info] of this.#infos.entries()) { if (info.stats) { - record[address] = info.stats + record[multiaddr] = info.stats } } const json = SelfHealingJSONCodec.encode(record) @@ -198,7 +200,7 @@ class Stats { this.#closed = true this.#cancelScheduleWrite() this.#writeToDisk() - ;/**@type {any}*/ (this).#infos = void 0 + ;/**@type {any}*/ (this.#infos) = void 0 debug('Closed the Stats instance') } diff --git a/test/fixtures/corrupted/stats.json b/test/fixtures/corrupted/stats.json index 6157e97..7def36b 100644 --- a/test/fixtures/corrupted/stats.json +++ b/test/fixtures/corrupted/stats.json @@ -1,5 +1,5 @@ { - "net:staltz.com:8008~noauth": { + "/dns/staltz.com/tcp/8008": { "source": "stored" } }, diff --git a/test/fixtures/present/stats.json b/test/fixtures/present/stats.json index 81590e0..59d9a64 100644 --- a/test/fixtures/present/stats.json +++ b/test/fixtures/present/stats.json @@ -1,5 +1,5 @@ { - "net:staltz.com:8008~noauth": { + "/dns/staltz.com/tcp/8008": { "duration": { "mean": 0, "stdev": 0, diff --git a/test/glue.test.js b/test/glue.test.js index 1c40e53..0259651 100644 --- a/test/glue.test.js +++ b/test/glue.test.js @@ -5,8 +5,8 @@ const Path = require('node:path') const p = require('node:util').promisify const { createPeerMock } = require('./util') -const TEST_ADDR = - 'net:localhost:9752~shse:EqTMFv7zm8hpPyAkj789qdJgqtz81AEbcinpAs24RRUC' +const PUBKEY = 'EqTMFv7zm8hpPyAkj789qdJgqtz81AEbcinpAs24RRUC' +const TEST_ADDR = `/ip4/127.0.0.1/tcp/9752/shse/${PUBKEY}` test('Glueing together stats with connections', async (t) => { await t.test('stage() is ignored when peer already connected', async () => { diff --git a/test/index.test.js b/test/index.test.js index 91cb2e8..7b96e39 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -5,7 +5,7 @@ const pull = require('pull-stream') const { createPeer } = require('./util') const PUBKEY = 'EqTMFv7zm8hpPyAkj789qdJgqtz81AEbcinpAs24RRUC' -const TEST_ADDR = `net:localhost:9752~shse:${PUBKEY}` +const TEST_ADDR = `/ip4/127.0.0.1/tcp/9752/shse/${PUBKEY}` test('net', async (t) => { await t.test('connect() rejects given unreachable address', async () => { @@ -68,11 +68,11 @@ test('net', async (t) => { ++i if (i === 1) { assert.equal(ev.type, 'connecting', 'event.type ok') - assert.equal(ev.address, TEST_ADDR, 'event.address ok') + assert.equal(ev.multiaddr, TEST_ADDR, 'event.address ok') assert.equal(ev.pubkey, PUBKEY, 'event.pubkey ok') } else if (i === 2) { assert.equal(ev.type, 'connecting-failed', 'event.type ok') - assert.equal(ev.address, TEST_ADDR, 'event.address ok') + assert.equal(ev.multiaddr, TEST_ADDR, 'event.address ok') assert.ok(ev.details, 'event.details ok') assert.equal(ev.details.code, 'ECONNREFUSED', 'event.details err') queueMicrotask(resolve) diff --git a/test/stats.test.js b/test/stats.test.js index 4fe5a18..2d25865 100644 --- a/test/stats.test.js +++ b/test/stats.test.js @@ -24,7 +24,7 @@ test('Stats', async (t) => { const entriesAfter = Array.from(infos.entries()) assert.equal(entriesAfter.length, 1, 'after loaded(), there is data') const [address, info] = entriesAfter[0] - assert.equal(address, 'net:staltz.com:8008~noauth', 'the address looks ok') + assert.equal(address, '/dns/staltz.com/tcp/8008', 'the address looks ok') assert.equal(info.stats.source, 'stored', 'the info looks ok') stats.close() @@ -64,7 +64,7 @@ test('Stats', async (t) => { const entries = Array.from(infos.entries()) assert.equal(entries.length === 1, true, 'stats has one entry') - assert.equal(entries[0][0], 'net:staltz.com:8008~noauth', 'entry addr ok') + assert.equal(entries[0][0], '/dns/staltz.com/tcp/8008', 'entry addr ok') assert.ok(entries[0][1].stats.duration, 'entry stats.duration ok') })