UNPKG

multiaddr

Version:

multiaddr implementation (binary + string representation of network addresses)

106 lines (95 loc) 2.38 kB
'use strict' /** @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