From 1a0d39cdb63c5a5dd4b386beedcb51b4fefe9e44 Mon Sep 17 00:00:00 2001 From: Andre Staltz Date: Tue, 16 Jan 2024 15:47:29 +0200 Subject: [PATCH] fix Multiaddr.fromMs to support tunnel --- lib/multiaddr.js | 26 +++++++++----- test/multiaddr.test.js | 80 +++++++++++++++++++++--------------------- 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/lib/multiaddr.js b/lib/multiaddr.js index 3255dc9..007db36 100644 --- a/lib/multiaddr.js +++ b/lib/multiaddr.js @@ -9,16 +9,24 @@ const Multiaddr = { */ fromMs(msaddr) { const [msTransport, msTransform] = msaddr.split('~') - const [label1, host, port] = msTransport.split(':') + const [label1, ...pieces] = 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}` + /**@type {string}*/ + let soFar + if (label1 === 'tunnel') { + const [hubPubkey, targetPubkey] = pieces + soFar = `tunnel/${hubPubkey}.${targetPubkey}` + } else { + const transport = label1 === 'net' ? 'tcp' : label1 === 'ws' ? 'ws' : null + if (!transport) throw new Error(`Unknown transport "${label1}"`) + const [host, port] = pieces + const hostFormat = IP.isV4Format(host) + ? 'ip4' + : IP.isV6Format('ipv6') + ? 'ip6' + : 'dns' + soFar = `${hostFormat}/${host}/${transport}/${port}` + } if (msTransform) { const [label2, pubkey, token] = msTransform.split(':') diff --git a/test/multiaddr.test.js b/test/multiaddr.test.js index b8862e7..a428981 100644 --- a/test/multiaddr.test.js +++ b/test/multiaddr.test.js @@ -6,59 +6,59 @@ const PUBKEY = 'EqTMFv7zm8hpPyAkj789qdJgqtz81AEbcinpAs24RRUC' const PUBKEY2 = 'EqTMFv7zm8hpPyAkj789qdJgqtz81AEbcinpAs35RRUC' test('Multiaddr', async (t) => { - await t.test('toMs ip4+tcp', async () => { - assert.equal( - Multiaddr.toMs('/ip4/127.0.0.1/tcp/8008'), - 'net:127.0.0.1:8008' - ) + await t.test('ip4+tcp', async () => { + const multiaddr = '/ip4/127.0.0.1/tcp/8008' + const ms = 'net:127.0.0.1:8008' + assert.equal(Multiaddr.toMs(multiaddr), ms) + assert.equal(Multiaddr.fromMs(ms), multiaddr) }) - await t.test('toMs ip4+tcp+shse', async () => { - assert.equal( - Multiaddr.toMs(`/ip4/127.0.0.1/tcp/8008/shse/${PUBKEY}`), - `net:127.0.0.1:8008~shse:${PUBKEY}` - ) + await t.test('ip4+tcp+shse', async () => { + const multiaddr = `/ip4/127.0.0.1/tcp/8008/shse/${PUBKEY}` + const ms = `net:127.0.0.1:8008~shse:${PUBKEY}` + assert.equal(Multiaddr.toMs(multiaddr), ms) + assert.equal(Multiaddr.fromMs(ms), multiaddr) }) - await t.test('toMs ip4+tcp+shse+token', async () => { - assert.equal( - Multiaddr.toMs(`/ip4/127.0.0.1/tcp/8008/shse/${PUBKEY}.TOKEN`), - `net:127.0.0.1:8008~shse:${PUBKEY}:TOKEN` - ) + await t.test('ip4+tcp+shse+token', async () => { + const multiaddr = `/ip4/127.0.0.1/tcp/8008/shse/${PUBKEY}.TOKEN` + const ms = `net:127.0.0.1:8008~shse:${PUBKEY}:TOKEN` + assert.equal(Multiaddr.toMs(multiaddr), ms) + assert.equal(Multiaddr.fromMs(ms), multiaddr) }) - await t.test('toMs dns+tcp+shse', async () => { - assert.equal( - Multiaddr.toMs(`/dns/staltz.com/tcp/8008/shse/${PUBKEY}`), - `net:staltz.com:8008~shse:${PUBKEY}` - ) + await t.test('dns+tcp+shse', async () => { + const multiaddr = `/dns/staltz.com/tcp/8008/shse/${PUBKEY}` + const ms = `net:staltz.com:8008~shse:${PUBKEY}` + assert.equal(Multiaddr.toMs(multiaddr), ms) + assert.equal(Multiaddr.fromMs(ms), multiaddr) }) - await t.test('toMs dns+tcp+shse+token', async () => { - assert.equal( - Multiaddr.toMs(`/dns/staltz.com/tcp/8008/shse/${PUBKEY}.TOKEN`), - `net:staltz.com:8008~shse:${PUBKEY}:TOKEN` - ) + await t.test('dns+tcp+shse+token', async () => { + const multiaddr = `/dns/staltz.com/tcp/8008/shse/${PUBKEY}.TOKEN` + const ms = `net:staltz.com:8008~shse:${PUBKEY}:TOKEN` + assert.equal(Multiaddr.toMs(multiaddr), ms) + assert.equal(Multiaddr.fromMs(ms), multiaddr) }) - await t.test('toMs tunnel', async () => { - assert.equal( - Multiaddr.toMs(`/tunnel/${PUBKEY}.${PUBKEY2}`), - `tunnel:${PUBKEY}:${PUBKEY2}` - ) + await t.test('tunnel', async () => { + const multiaddr = `/tunnel/${PUBKEY}.${PUBKEY2}` + const ms = `tunnel:${PUBKEY}:${PUBKEY2}` + assert.equal(Multiaddr.toMs(multiaddr), ms) + assert.equal(Multiaddr.fromMs(ms), multiaddr) }) - await t.test('toMs tunnel+shse', async () => { - assert.equal( - Multiaddr.toMs(`/tunnel/${PUBKEY}.${PUBKEY2}/shse/${PUBKEY2}`), - `tunnel:${PUBKEY}:${PUBKEY2}~shse:${PUBKEY2}` - ) + await t.test('tunnel+shse', async () => { + const multiaddr = `/tunnel/${PUBKEY}.${PUBKEY2}/shse/${PUBKEY2}` + const ms = `tunnel:${PUBKEY}:${PUBKEY2}~shse:${PUBKEY2}` + assert.equal(Multiaddr.toMs(multiaddr), ms) + assert.equal(Multiaddr.fromMs(ms), multiaddr) }) - await t.test('toMs tunnel+shse+token', async () => { - assert.equal( - Multiaddr.toMs(`/tunnel/${PUBKEY}.${PUBKEY2}/shse/${PUBKEY2}.TOKEN`), - `tunnel:${PUBKEY}:${PUBKEY2}~shse:${PUBKEY2}:TOKEN` - ) + await t.test('tunnel+shse+token', async () => { + const multiaddr = `/tunnel/${PUBKEY}.${PUBKEY2}/shse/${PUBKEY2}.TOKEN` + const ms = `tunnel:${PUBKEY}:${PUBKEY2}~shse:${PUBKEY2}:TOKEN` + assert.equal(Multiaddr.toMs(multiaddr), ms) + assert.equal(Multiaddr.fromMs(ms), multiaddr) }) })