Skip to content

Commit c9058ab

Browse files
authored
feat: add fromTuples and fromStringTuples methods (#397)
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
1 parent 58d442f commit c9058ab

File tree

3 files changed

+86
-2
lines changed

3 files changed

+86
-2
lines changed

src/codec.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,26 @@ export function bytesToMultiaddrParts (bytes: Uint8Array): MultiaddrParts {
124124
}
125125

126126
/**
127-
* [[str name, str addr]... ] -> string
127+
* [[num code, str value?]... ] -> Tuple[]
128+
*/
129+
export function stringTuplesToTuples (stringTuples: StringTuple[]): Tuple[] {
130+
const tuples: Tuple[] = []
131+
132+
stringTuples.forEach(([code, value]) => {
133+
const tuple: Tuple = [code]
134+
135+
if (value != null) {
136+
tuple[1] = convertToBytes(code, value)
137+
}
138+
139+
tuples.push(tuple)
140+
})
141+
142+
return tuples
143+
}
144+
145+
/**
146+
* [[num code, str value?]... ] -> string
128147
*/
129148
function stringTuplesToString (tuples: StringTuple[]): string {
130149
const parts: string[] = []

src/index.ts

+43
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
* ```
9494
*/
9595

96+
import { stringTuplesToTuples, tuplesToBytes } from './codec.js'
9697
import { Multiaddr as MultiaddrClass, symbol } from './multiaddr.js'
9798
import { getProtocol } from './protocols-table.js'
9899
import type { Resolver } from './resolvers/index.js'
@@ -526,6 +527,48 @@ export function fromNodeAddress (addr: NodeAddress, transport: string): Multiadd
526527
return new MultiaddrClass('/' + [ip, host, transport, addr.port].join('/'))
527528
}
528529

530+
/**
531+
* Create a {@link Multiaddr} from an array of {@link Tuple}s
532+
*
533+
* @example
534+
*
535+
* ```ts
536+
* import { fromTuples, multiaddr } from '@multiformats/multiaddr'
537+
*
538+
* const ma = multiaddr('/ip4/127.0.0.1')
539+
* const tuples = ma.tuples()
540+
*
541+
* const ma2 = fromTuples(tuples)
542+
*
543+
* console.info(ma2)
544+
* // '/ip4/127.0.0.1'
545+
* ```
546+
*/
547+
export function fromTuples (tuples: Tuple[]): Multiaddr {
548+
return multiaddr(tuplesToBytes(tuples))
549+
}
550+
551+
/**
552+
* Create a {@link Multiaddr} from an array of {@link StringTuple}s
553+
*
554+
* @example
555+
*
556+
* ```ts
557+
* import { fromStringTuples, multiaddr } from '@multiformats/multiaddr'
558+
*
559+
* const ma = multiaddr('/ip4/127.0.0.1')
560+
* const tuples = ma.stringTuples()
561+
*
562+
* const ma2 = fromStringTuples(tuples)
563+
*
564+
* console.info(ma2)
565+
* // '/ip4/127.0.0.1'
566+
* ```
567+
*/
568+
export function fromStringTuples (tuples: StringTuple[]): Multiaddr {
569+
return fromTuples(stringTuplesToTuples(tuples))
570+
}
571+
529572
/**
530573
* Returns if something is a {@link Multiaddr} that is a resolvable name
531574
*

test/index.spec.ts

+23-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/* eslint-env mocha */
33
import { expect } from 'aegir/chai'
44
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
5-
import { multiaddr, isMultiaddr, fromNodeAddress, isName } from '../src/index.js'
5+
import { multiaddr, isMultiaddr, fromNodeAddress, isName, fromTuples, fromStringTuples } from '../src/index.js'
66
import { codes } from '../src/protocols-table.js'
77
import type { Multiaddr } from '../src/index.js'
88

@@ -949,6 +949,28 @@ describe('helpers', () => {
949949
})
950950
})
951951

952+
describe('.fromTuples', () => {
953+
it('should create a multiaddr from a list of tuples', () => {
954+
const ma = multiaddr('/ip4/0.0.0.0')
955+
const tuples = ma.tuples()
956+
tuples.push([0x06, Uint8Array.from([0, 100])])
957+
958+
const ma2 = fromTuples(tuples)
959+
expect(ma2.toString()).to.equal('/ip4/0.0.0.0/tcp/100')
960+
})
961+
})
962+
963+
describe('.fromStringTuples', () => {
964+
it('should create a multiaddr from a list of string tuples', () => {
965+
const ma = multiaddr('/ip4/0.0.0.0')
966+
const tuples = ma.stringTuples()
967+
tuples.push([0x06, '100'])
968+
969+
const ma2 = fromStringTuples(tuples)
970+
expect(ma2.toString()).to.equal('/ip4/0.0.0.0/tcp/100')
971+
})
972+
})
973+
952974
describe('.isThinWaistAddress', () => {
953975
const families = ['ip4', 'ip6']
954976
const transports = ['tcp', 'udp']

0 commit comments

Comments
 (0)