From e979aa0a9df33b126ab8ec02b9d8009f51ea10d6 Mon Sep 17 00:00:00 2001 From: Andre Staltz Date: Tue, 16 Jan 2024 12:44:33 +0200 Subject: [PATCH] Multiaddr.toMs() supports tunnels --- lib/multiaddr.js | 26 ++++++++++++++++- test/multiaddr.test.js | 64 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 test/multiaddr.test.js diff --git a/lib/multiaddr.js b/lib/multiaddr.js index 269c945..3255dc9 100644 --- a/lib/multiaddr.js +++ b/lib/multiaddr.js @@ -44,7 +44,31 @@ const Multiaddr = { // prettier-ignore throw new Error(`Invalid multiaddr "${multiaddr}"`) } - const [, , host, transport, port, transform, cred] = multiaddr.split('/') + const pieces = multiaddr.split('/') + + // Parse tunnel multiaddr + if (pieces[1] === 'tunnel') { + const [, , pubkeys, transform, cred] = pieces + const [hubPubkey, targetPubkey] = pubkeys.split('.') + // prettier-ignore + if (!hubPubkey || !targetPubkey) throw new Error(`Invalid tunnel multiaddr "${multiaddr}"`) + const soFar = `tunnel:${hubPubkey}:${targetPubkey}` + 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 + } + } + + // Parse host+transport multiaddr + const [, , host, transport, port, transform, cred] = pieces const label1 = transport === 'tcp' ? 'net' : transport === 'ws' ? 'ws' : null if (!label1) throw new Error(`Unknown transport "${transport}"`) diff --git a/test/multiaddr.test.js b/test/multiaddr.test.js new file mode 100644 index 0000000..b8862e7 --- /dev/null +++ b/test/multiaddr.test.js @@ -0,0 +1,64 @@ +const test = require('node:test') +const assert = require('node:assert') +const Multiaddr = require('../lib/multiaddr') + +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('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('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('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('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('toMs tunnel', async () => { + assert.equal( + Multiaddr.toMs(`/tunnel/${PUBKEY}.${PUBKEY2}`), + `tunnel:${PUBKEY}:${PUBKEY2}` + ) + }) + + await t.test('toMs tunnel+shse', async () => { + assert.equal( + Multiaddr.toMs(`/tunnel/${PUBKEY}.${PUBKEY2}/shse/${PUBKEY2}`), + `tunnel:${PUBKEY}:${PUBKEY2}~shse:${PUBKEY2}` + ) + }) + + await t.test('toMs tunnel+shse+token', async () => { + assert.equal( + Multiaddr.toMs(`/tunnel/${PUBKEY}.${PUBKEY2}/shse/${PUBKEY2}.TOKEN`), + `tunnel:${PUBKEY}:${PUBKEY2}~shse:${PUBKEY2}:TOKEN` + ) + }) +})