multiaddr
Version:
multiaddr implementation (binary + string representation of network addresses)
106 lines (95 loc) • 2.38 kB
JavaScript
/** @typedef {import("./types").Protocol} Protocol */
/**
* Protocols
*
* @param {number | string} proto
* @returns {Protocol}
*/
function Protocols (proto) {
if (typeof (proto) === 'number') {
if (Protocols.codes[proto]) {
return Protocols.codes[proto]
}
throw new Error('no protocol with code: ' + proto)
} else if (typeof (proto) === 'string') {
if (Protocols.names[proto]) {
return Protocols.names[proto]
}
throw new Error('no protocol with name: ' + proto)
}
throw new Error('invalid protocol id type: ' + proto)
}
const V = -1
Protocols.lengthPrefixedVarSize = V
Protocols.V = V
/** @type {Array<[number, number, string, (string|boolean)?, string?]>} */
Protocols.table = [
[4, 32, 'ip4'],
[6, 16, 'tcp'],
[33, 16, 'dccp'],
[41, 128, 'ip6'],
[42, V, 'ip6zone'],
[53, V, 'dns', 'resolvable'],
[54, V, 'dns4', 'resolvable'],
[55, V, 'dns6', 'resolvable'],
[56, V, 'dnsaddr', 'resolvable'],
[132, 16, 'sctp'],
[273, 16, 'udp'],
[275, 0, 'p2p-webrtc-star'],
[276, 0, 'p2p-webrtc-direct'],
[277, 0, 'p2p-stardust'],
[290, 0, 'p2p-circuit'],
[301, 0, 'udt'],
[302, 0, 'utp'],
[400, V, 'unix', false, 'path'],
// `ipfs` is added before `p2p` for legacy support.
// All text representations will default to `p2p`, but `ipfs` will
// still be supported
[421, V, 'ipfs'],
// `p2p` is the preferred name for 421, and is now the default
[421, V, 'p2p'],
[443, 0, 'https'],
[444, 96, 'onion'],
[445, 296, 'onion3'],
[446, V, 'garlic64'],
[460, 0, 'quic'],
[477, 0, 'ws'],
[478, 0, 'wss'],
[479, 0, 'p2p-websocket-star'],
[480, 0, 'http'],
[777, V, 'memory']
]
/** @type {Record<string,Protocol>} */
Protocols.names = {}
/** @type {Record<number,Protocol>} */
Protocols.codes = {}
// populate tables
Protocols.table.map(row => {
const proto = p.apply(null, row)
Protocols.codes[proto.code] = proto
Protocols.names[proto.name] = proto
return null
})
Protocols.object = p
/**
*
* Create a protocol
*
* @param {number} code
* @param {number} size
* @param {string} name
* @param {any} [resolvable]
* @param {any} [path]
* @returns {Protocol}
*/
function p (code, size, name, resolvable, path) {
return {
code,
size,
name,
resolvable: Boolean(resolvable),
path: Boolean(path)
}
}
module.exports = Protocols