Skip to content

Commit

Permalink
feat: add fromTuples and fromStringTuples methods (#397)
Browse files Browse the repository at this point in the history
Adds methods to create Multiaddr instances from arrays of tuples
so it's possible to insert tuples into Multiaddrs without having
to stringify/parse them
  • Loading branch information
achingbrain authored Feb 20, 2025
1 parent 58d442f commit c9058ab
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 2 deletions.
21 changes: 20 additions & 1 deletion src/codec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = []
Expand Down
43 changes: 43 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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
*
Expand Down
24 changes: 23 additions & 1 deletion test/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand Down Expand Up @@ -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']
Expand Down

0 comments on commit c9058ab

Please sign in to comment.