diff --git a/lib/glue.js b/lib/glue.js index f136acc..b8ebfbf 100644 --- a/lib/glue.js +++ b/lib/glue.js @@ -47,44 +47,54 @@ function glue(infos, connections) { * @param {Event} ev */ function onConnectingFailed(ev) { - infos.updateStats(ev.multiaddr, (prevStats) => ({ - failure: (prevStats?.failure ?? 0) + 1, - stateChange: Date.now(), - duration: stats(prevStats?.duration, 0), - })) + if (!ev.multiaddr.startsWith('/tunnel/')) { + infos.updateStats(ev.multiaddr, (prevStats) => ({ + failure: (prevStats?.failure ?? 0) + 1, + stateChange: Date.now(), + duration: stats(prevStats?.duration, 0), + })) + } } /** * @param {Event} ev */ function onConnected(ev) { - infos.updateStats(ev.multiaddr, () => ({ - stateChange: Date.now(), - failure: 0, - })) - if (ev.details.weAreClient) setupPing(ev.multiaddr, ev.details.rpc) + if (!ev.multiaddr.startsWith('/tunnel/')) { + infos.updateStats(ev.multiaddr, () => ({ + stateChange: Date.now(), + failure: 0, + })) + } + if (ev.details.weAreClient) { + setupPing(ev.multiaddr, ev.details.rpc) + } } /** * @param {Event} ev */ function bumpStateChange(ev) { - infos.updateStats(ev.multiaddr, () => ({ - stateChange: Date.now(), - })) + if (!ev.multiaddr.startsWith('/tunnel/')) { + infos.updateStats(ev.multiaddr, () => ({ + stateChange: Date.now(), + })) + } } /** * @param {Event} ev */ function onDisconnected(ev) { - infos.updateStats(ev.multiaddr, (prevStats) => ({ - stateChange: Date.now(), - duration: stats( - prevStats?.duration, - Date.now() - (prevStats?.stateChange ?? PROGRAM_STARTUP) - ), - })) + if (!ev.multiaddr.startsWith('/tunnel/')) { + infos.updateStats(ev.multiaddr, (prevStats) => ({ + stateChange: Date.now(), + duration: stats( + prevStats?.duration, + Date.now() - (prevStats?.stateChange ?? PROGRAM_STARTUP) + ), + })) + } } pull( diff --git a/lib/stats.js b/lib/stats.js index 22f137d..77b2781 100644 --- a/lib/stats.js +++ b/lib/stats.js @@ -114,18 +114,15 @@ class Stats { return } else if (fileContents) { const vals = SelfHealingJSONCodec.decode(fileContents) - for (const [multiaddr, statsInfo] of Object.entries(vals)) { - this.#infos.update(/**@type {`/${string}`}*/ (multiaddr), { - stats: statsInfo, - }) + for (const [multiaddr, stats] of Object.entries(vals)) { + this.#infos.update(/**@type {`/${string}`}*/ (multiaddr), { stats }) } this.#loadedResolve(true) - debug('Loaded conn.json into ConnDB in memory') + debug(`Loaded existing ${Stats.FILENAME}`) } else { atomic.writeFile(this.#path, '{}', 'utf8', () => {}) this.#loadedResolve(true) - // prettier-ignore - debug(`Created new ${Stats.FILENAME} because there was no existing one.`); + debug(`Created ${Stats.FILENAME} because there was none yet`) return } }) diff --git a/test/glue.test.js b/test/glue.test.js index 0259651..3ad4bcc 100644 --- a/test/glue.test.js +++ b/test/glue.test.js @@ -6,7 +6,9 @@ const p = require('node:util').promisify const { createPeerMock } = require('./util') const PUBKEY = 'EqTMFv7zm8hpPyAkj789qdJgqtz81AEbcinpAs24RRUC' +const PUBKEY2 = 'FqTMFv7zm8hpPyAkj789qdJgqtz81AEbcinpAs24RRUC' const TEST_ADDR = `/ip4/127.0.0.1/tcp/9752/shse/${PUBKEY}` +const TEST_TUNNEL_ADDR = `/tunnel/${PUBKEY}.${PUBKEY2}/shse/${PUBKEY2}` test('Glueing together stats with connections', async (t) => { await t.test('stage() is ignored when peer already connected', async () => { @@ -66,6 +68,25 @@ test('Glueing together stats with connections', async (t) => { assert.deepEqual(Object.keys(json[TEST_ADDR]), ['stateChange']) }) + await t.test('tunnel connections are not stats-persisted', async (t) => { + const peer = createPeerMock() + const address = TEST_TUNNEL_ADDR + + const entriesBefore = await p(peer.net.peers())(null) + assert.equal(entriesBefore.length, 0, 'there is no entry in peers()') + + const rpc = await p(peer.net.connect)(address) + assert.ok(rpc, 'connect() successful') + + const statsJSONPath = Path.join(peer.mockDir, 'net', './stats.json') + while (FS.existsSync(statsJSONPath) === false) { + await p(setTimeout)(1) + } + const fileContents = FS.readFileSync(statsJSONPath, 'utf8') + const json = JSON.parse(fileContents) + assert.deepEqual(Object.keys(json), []) + }) + await t.test('forget() will remove stats', async (t) => { const peer = createPeerMock() const address = TEST_ADDR