diff --git a/src/codec.ts b/src/codec.ts index 72711907..ca4a3c7f 100644 --- a/src/codec.ts +++ b/src/codec.ts @@ -124,7 +124,26 @@ export function bytesToMultiaddrParts (bytes: Uint8Array): MultiaddrParts { } /** - * [[str name, str addr]... ] -> string + * [[num code, str value?]... ] -> Tuple[] + */ +export function stringTuplesToTuples (stringTuples: StringTuple[]): Tuple[] { + const tuples: Tuple[] = [] + + stringTuples.forEach(([code, value]) => { + const tuple: Tuple = [code] + + if (value != null) { + tuple[1] = convertToBytes(code, value) + } + + tuples.push(tuple) + }) + + return tuples +} + +/** + * [[num code, str value?]... ] -> string */ function stringTuplesToString (tuples: StringTuple[]): string { const parts: string[] = [] diff --git a/src/index.ts b/src/index.ts index 34150aa7..f4e5e607 100644 --- a/src/index.ts +++ b/src/index.ts @@ -93,6 +93,7 @@ * ``` */ +import { stringTuplesToTuples, tuplesToBytes } from './codec.js' import { Multiaddr as MultiaddrClass, symbol } from './multiaddr.js' import { getProtocol } from './protocols-table.js' import type { Resolver } from './resolvers/index.js' @@ -526,6 +527,48 @@ export function fromNodeAddress (addr: NodeAddress, transport: string): Multiadd return new MultiaddrClass('/' + [ip, host, transport, addr.port].join('/')) } +/** + * Create a {@link Multiaddr} from an array of {@link Tuple}s + * + * @example + * + * ```ts + * import { fromTuples, multiaddr } from '@multiformats/multiaddr' + * + * const ma = multiaddr('/ip4/127.0.0.1') + * const tuples = ma.tuples() + * + * const ma2 = fromTuples(tuples) + * + * console.info(ma2) + * // '/ip4/127.0.0.1' + * ``` + */ +export function fromTuples (tuples: Tuple[]): Multiaddr { + return multiaddr(tuplesToBytes(tuples)) +} + +/** + * Create a {@link Multiaddr} from an array of {@link StringTuple}s + * + * @example + * + * ```ts + * import { fromStringTuples, multiaddr } from '@multiformats/multiaddr' + * + * const ma = multiaddr('/ip4/127.0.0.1') + * const tuples = ma.stringTuples() + * + * const ma2 = fromStringTuples(tuples) + * + * console.info(ma2) + * // '/ip4/127.0.0.1' + * ``` + */ +export function fromStringTuples (tuples: StringTuple[]): Multiaddr { + return fromTuples(stringTuplesToTuples(tuples)) +} + /** * Returns if something is a {@link Multiaddr} that is a resolvable name * diff --git a/test/index.spec.ts b/test/index.spec.ts index 18bf5845..523fc0d5 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -2,7 +2,7 @@ /* eslint-env mocha */ import { expect } from 'aegir/chai' import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' -import { multiaddr, isMultiaddr, fromNodeAddress, isName } from '../src/index.js' +import { multiaddr, isMultiaddr, fromNodeAddress, isName, fromTuples, fromStringTuples } from '../src/index.js' import { codes } from '../src/protocols-table.js' import type { Multiaddr } from '../src/index.js' @@ -949,6 +949,28 @@ describe('helpers', () => { }) }) + describe('.fromTuples', () => { + it('should create a multiaddr from a list of tuples', () => { + const ma = multiaddr('/ip4/0.0.0.0') + const tuples = ma.tuples() + tuples.push([0x06, Uint8Array.from([0, 100])]) + + const ma2 = fromTuples(tuples) + expect(ma2.toString()).to.equal('/ip4/0.0.0.0/tcp/100') + }) + }) + + describe('.fromStringTuples', () => { + it('should create a multiaddr from a list of string tuples', () => { + const ma = multiaddr('/ip4/0.0.0.0') + const tuples = ma.stringTuples() + tuples.push([0x06, '100']) + + const ma2 = fromStringTuples(tuples) + expect(ma2.toString()).to.equal('/ip4/0.0.0.0/tcp/100') + }) + }) + describe('.isThinWaistAddress', () => { const families = ['ip4', 'ip6'] const transports = ['tcp', 'udp']