Multiaddr.toMs() supports tunnels

This commit is contained in:
Andre Staltz 2024-01-16 12:44:33 +02:00
parent c2d1adb19e
commit e979aa0a9d
No known key found for this signature in database
GPG Key ID: 9EDE23EA7E8A4890
2 changed files with 89 additions and 1 deletions

View File

@ -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}"`)

64
test/multiaddr.test.js Normal file
View File

@ -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`
)
})
})