Skip to content

Commit eeb5822

Browse files
committed
chore: address review
1 parent e309d53 commit eeb5822

File tree

8 files changed

+57
-26
lines changed

8 files changed

+57
-26
lines changed

README.md

+20
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ js-multiaddr
3030
- [Browser: `<script>` Tag](#browser-script-tag)
3131
- [Usage](#usage)
3232
- [API](#api)
33+
- [Resolvers](#resolvers)
3334
- [Contribute](#contribute)
3435
- [License](#license)
3536

@@ -117,6 +118,25 @@ $ node
117118

118119
https://multiformats.github.io/js-multiaddr/
119120

121+
## Resolvers
122+
123+
`multiaddr` allows multiaddrs to be resolved when appropriate resolvers are provided. This module already has resolvers available, but you can also create your own. To provide multiaddr resolvers you can do:
124+
125+
```js
126+
const multiaddr = require('multiaddr')
127+
const resolvers = require('multiaddr/src/resolvers')
128+
129+
multiaddr.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
130+
```
131+
132+
The available resolvers are:
133+
134+
| Name | type | Description |
135+
|-------------|------|-------------|
136+
| `dnsaddrResolver` | `dnsaddr` | dnsaddr resolution with TXT Records |
137+
138+
A resolver receives a `Multiaddr` as a parameter and returns a `Promise<Array<string>>`.
139+
120140
## Contribute
121141

122142
Contributions welcome. Please check out [the issues](https://github.com/multiformats/js-multiaddr/issues).

package.json

-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@
1818
"docs": "aegir docs",
1919
"size": "aegir build -b"
2020
},
21-
"browser": {
22-
"./src/resolvers/dns.js": "./src/resolvers/dns.browser.js"
23-
},
2421
"files": [
2522
"src",
2623
"dist"

src/index.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ declare class Multiaddr {
5252

5353
bytes: Uint8Array;
5454

55-
resolvers: Map<string, (addr: Multiaddr) => Promise<Array<string>>>
56-
5755
/**
5856
* Returns Multiaddr as a String
5957
*/
@@ -162,6 +160,8 @@ declare class Multiaddr {
162160
}
163161

164162
declare namespace Multiaddr {
163+
const resolvers: Map < string, (addr: Multiaddr) => Promise < Array < string >>>
164+
165165
/**
166166
* Creates a Multiaddr from a node-friendly address object
167167
*/

src/index.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ const inspect = Symbol.for('nodejs.util.inspect.custom')
1010
const uint8ArrayToString = require('uint8arrays/to-string')
1111
const uint8ArrayEquals = require('uint8arrays/equals')
1212

13+
const resolvers = new Map()
14+
1315
/**
1416
* Creates a [multiaddr](https://github.com/multiformats/multiaddr) from
1517
* a Uint8Array, String or another Multiaddr instance
@@ -46,8 +48,6 @@ const Multiaddr = withIs.proto(function (addr) {
4648
} else {
4749
throw new Error('addr must be a string, Buffer, or another Multiaddr')
4850
}
49-
50-
this.resolvers = new Map()
5151
}, { className: 'Multiaddr', symbolName: '@multiformats/js-multiaddr/multiaddr' })
5252

5353
/**
@@ -375,8 +375,8 @@ Multiaddr.prototype.equals = function equals (addr) {
375375
* @param {object} options
376376
* @returns {Promise<Array<Multiaddr>>}
377377
* @example
378+
* Multiaddr.resolvers.set('dnsaddr', resolverFunction)
378379
* const mh1 = Multiaddr('/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb')
379-
* mh1.resolvers.set('dnsaddr', resolverFunction)
380380
* const resolvedMultiaddrs = await mh1.resolve()
381381
* // [
382382
* // <Multiaddr 04934b5353060fa1a503221220c10f9319dac35c270a6b74cd644cb3acfc1f6efc8c821f8eb282599fd1814f64 - /ip4/147.75.83.83/tcp/4001/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb>,
@@ -392,7 +392,7 @@ Multiaddr.prototype.resolve = async function resolve () {
392392
return [this]
393393
}
394394

395-
const resolver = this.resolvers.get(resolvableProto.name)
395+
const resolver = resolvers.get(resolvableProto.name)
396396
if (!resolver) {
397397
throw errCode(new Error(`no available resolver for ${resolvableProto.name}`), 'ERR_NO_AVAILABLE_RESOLVER')
398398
}
@@ -551,4 +551,5 @@ Multiaddr.resolve = function resolve (addr) {
551551
return Promise.reject(new Error('not implemented yet'))
552552
}
553553

554+
Multiaddr.resolvers = resolvers
554555
exports = module.exports = Multiaddr

src/resolvers/dns.browser.js

-3
This file was deleted.

src/resolvers/dns.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
11
'use strict'
22

3-
module.exports = require('dns').promises
3+
let dns
4+
5+
try {
6+
dns = require('dns').promises
7+
} catch (err) {
8+
dns = require('dns-over-http-resolver')
9+
}
10+
11+
module.exports = dns

src/resolvers/index.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
'use strict'
22

33
const Multiaddr = require('..') // eslint-disable-line no-unused-vars
4+
const protocols = require('../protocols-table')
5+
6+
const { code: dnsaddrCode } = protocols('dnsaddr')
47

58
/**
69
* Resolver for dnsaddr addresses.
@@ -13,7 +16,7 @@ async function dnsaddrResolver (addr) {
1316
const resolver = new Resolver()
1417

1518
const peerId = addr.getPeerId()
16-
const hostname = addr.toString().split('dnsaddr')[1].split('/')[1]
19+
const [, hostname] = addr.stringTuples().find(([proto]) => proto === dnsaddrCode) || []
1720

1821
const records = await resolver.resolveTxt(`_dnsaddr.${hostname}`)
1922
// @ts-ignore

test/resolvers.spec.js

+17-12
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,22 @@ const dnsaddrStub2 = [
2727
]
2828

2929
describe('multiaddr resolve', () => {
30+
it('should throw if no resolver is available', async () => {
31+
const ma = multiaddr('/dnsaddr/bootstrap.libp2p.io')
32+
33+
// Resolve
34+
await expect(ma.resolve()).to.eventually.be.rejected()
35+
.and.to.have.property('code', 'ERR_NO_AVAILABLE_RESOLVER')
36+
})
37+
3038
describe('dnsaddr', () => {
31-
afterEach(() => {
32-
sinon.restore()
39+
before(() => {
40+
// Set resolvers
41+
multiaddr.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
3342
})
3443

35-
it('should throw if no resolver is available', async () => {
36-
const ma = multiaddr('/dnsaddr/bootstrap.libp2p.io')
37-
38-
// Resolve
39-
await expect(ma.resolve()).to.eventually.be.rejected()
40-
.and.to.have.property('code', 'ERR_NO_AVAILABLE_RESOLVER')
44+
afterEach(() => {
45+
sinon.restore()
4146
})
4247

4348
it('can resolve dnsaddr without no peerId', async () => {
@@ -47,7 +52,7 @@ describe('multiaddr resolve', () => {
4752
stub.onCall(0).returns(Promise.resolve(dnsaddrStub1))
4853

4954
// Set resolvers
50-
ma.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
55+
// ma.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
5156

5257
// Resolve
5358
const resolvedMas = await ma.resolve()
@@ -68,7 +73,7 @@ describe('multiaddr resolve', () => {
6873
stub.onCall(1).returns(Promise.resolve(dnsaddrStub2))
6974

7075
// Set resolvers
71-
ma.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
76+
// ma.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
7277

7378
// Resolve
7479
const resolvedMas = await ma.resolve()
@@ -85,12 +90,12 @@ describe('multiaddr resolve', () => {
8590
stub.onCall(1).returns(Promise.resolve(dnsaddrStub2))
8691

8792
// Set resolvers
88-
ma.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
93+
// ma.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
8994

9095
// Resolve
9196
const resolvedInitialMas = await ma.resolve()
9297
const resolvedSecondMas = await Promise.all(resolvedInitialMas.map(nm => {
93-
nm.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
98+
// nm.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
9499
return nm.resolve()
95100
}))
96101
// @ts-ignore

0 commit comments

Comments
 (0)