Skip to content

Commit 48476d5

Browse files
committed
feat: custom announce filter
1 parent 186f9b7 commit 48476d5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+75
-147
lines changed

doc/CONFIGURATION.md

+1
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ Besides the `modules` and `config`, libp2p allows other internal options and con
215215
- `listen` addresses will be provided to the libp2p underlying transports for listening on them.
216216
- `announce` addresses will be used to compute the advertises that the node should advertise to the network.
217217
- `noAnnounce` addresses will be used as a filter to compute the advertises that the node should advertise to the network.
218+
- `announceFilter`: filter function used to filter announced addresses programmatically: `(ma: Array<multiaddr>) => Array<multiaddr>`. Default: bypass all addresses. [`libp2p-utils`](https://github.com/libp2p/js-libp2p-utils) provides useful [multiaddr utilities](https://github.com/libp2p/js-libp2p-utils/blob/master/API.md#multiaddr-isloopbackma) to create your filters.
218219

219220
### Examples
220221

package.json

-3
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,9 @@
8787
"@nodeutils/defaults-deep": "^1.1.0",
8888
"abortable-iterator": "^3.0.0",
8989
"aegir": "^27.0.0",
90-
"chai": "^4.2.0",
91-
"chai-as-promised": "^7.1.1",
9290
"chai-bytes": "^0.1.2",
9391
"chai-string": "^1.5.0",
9492
"delay": "^4.3.0",
95-
"dirty-chai": "^2.0.1",
9693
"interop-libp2p": "^0.3.0",
9794
"ipfs-http-client": "^47.0.1",
9895
"it-concat": "^1.0.0",

src/index.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -367,11 +367,13 @@ class Libp2p extends EventEmitter {
367367
* @returns {Array<Multiaddr>}
368368
*/
369369
get multiaddrs () {
370+
const announceFilter = this._options.addresses.announceFilter || ((multiaddrs) => multiaddrs)
371+
370372
// Filter noAnnounce multiaddrs
371373
const filterMa = this.addressManager.getNoAnnounceAddrs()
372374

373375
// Create advertising list
374-
return this.transportManager.getAddrs()
376+
return announceFilter(this.transportManager.getAddrs()
375377
.concat(this.addressManager.getAnnounceAddrs())
376378
.filter((ma, index, array) => {
377379
// Filter out if repeated
@@ -385,7 +387,7 @@ class Libp2p extends EventEmitter {
385387
}
386388

387389
return true
388-
})
390+
}))
389391
}
390392

391393
/**

test/addresses/address-manager.spec.js

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
8-
4+
const { expect } = require('aegir/utils/chai')
95
const multiaddr = require('multiaddr')
106

117
const AddressManager = require('../../src/address-manager')

test/addresses/addresses.node.js

+30-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85
const sinon = require('sinon')
96

7+
const isLoopback = require('libp2p-utils/src/multiaddr/is-loopback')
8+
109
const { AddressesOptions } = require('./utils')
1110
const peerUtils = require('../utils/creators/peer')
1211

1312
const listenAddresses = ['/ip4/127.0.0.1/tcp/0', '/ip4/127.0.0.1/tcp/8000/ws']
14-
const announceAddreses = ['/dns4/peer.io']
13+
const announceAddreses = ['/dns4/peer.io/tcp/433/p2p/12D3KooWNvSZnPi3RrhrTwEY4LuuBeB6K6facKUCJcyWG1aoDd2p']
1514

1615
describe('libp2p.multiaddrs', () => {
1716
let libp2p
@@ -123,4 +122,30 @@ describe('libp2p.multiaddrs', () => {
123122
expect(advertiseMultiaddrs).to.not.include(m)
124123
})
125124
})
125+
126+
it('can filter out loopback addresses to announced by the announce filter', async () => {
127+
[libp2p] = await peerUtils.createPeer({
128+
started: false,
129+
config: {
130+
...AddressesOptions,
131+
addresses: {
132+
listen: listenAddresses,
133+
announce: announceAddreses,
134+
announceFilter: (multiaddrs) => multiaddrs.filter(m => !isLoopback(m))
135+
}
136+
}
137+
})
138+
139+
const listenAddrs = libp2p.addressManager.listen
140+
expect(listenAddrs.size).to.equal(listenAddresses.length)
141+
expect(listenAddrs.has(listenAddresses[0])).to.equal(true)
142+
expect(listenAddrs.has(listenAddresses[1])).to.equal(true)
143+
144+
await libp2p.start()
145+
146+
const multiaddrs = libp2p.multiaddrs
147+
expect(multiaddrs.length).to.equal(announceAddreses.length)
148+
expect(multiaddrs.includes(listenAddresses[0])).to.equal(false)
149+
expect(multiaddrs.includes(listenAddresses[1])).to.equal(false)
150+
})
126151
})

test/connection-manager/index.node.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85
const sinon = require('sinon')
96

107
const delay = require('delay')

test/connection-manager/index.spec.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85
const sinon = require('sinon')
96

107
const peerUtils = require('../utils/creators/peer')

test/content-routing/content-routing.node.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85
const nock = require('nock')
96
const sinon = require('sinon')
107

test/content-routing/dht/configuration.node.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
const { expect } = chai
7-
4+
const { expect } = require('aegir/utils/chai')
85
const mergeOptions = require('merge-options')
96

107
const { create } = require('../../../src')

test/core/encryption.spec.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85

96
const Transport = require('libp2p-websockets')
107
const { NOISE: Crypto } = require('libp2p-noise')

test/core/listening.node.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
75

86
const Transport = require('libp2p-tcp')
97
const { NOISE: Crypto } = require('libp2p-noise')

test/core/ping.node.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
75

86
const pTimes = require('p-times')
97
const pipe = require('it-pipe')

test/dialing/dial-request.spec.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85
const sinon = require('sinon')
96

107
const { AbortError } = require('libp2p-interfaces/src/transport/errors')

test/dialing/direct.spec.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85
const sinon = require('sinon')
96
const pDefer = require('p-defer')
107
const pWaitFor = require('p-wait-for')

test/dialing/utils.js

Whitespace-only changes.

test/identify/index.spec.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85
const sinon = require('sinon')
96

107
const { EventEmitter } = require('events')

test/insecure/plaintext.spec.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
75
const sinon = require('sinon')
86

97
const PeerId = require('peer-id')

test/keychain/cms-interop.spec.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
/* eslint-env mocha */
33
'use strict'
44

5-
const chai = require('chai')
6-
const dirtyChai = require('dirty-chai')
7-
const expect = chai.expect
8-
chai.use(dirtyChai)
5+
const { chai, expect } = require('aegir/utils/chai')
96
chai.use(require('chai-string'))
107
const uint8ArrayFromString = require('uint8arrays/from-string')
118
const uint8ArrayToString = require('uint8arrays/to-string')

test/keychain/keychain.spec.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ describe('keychain', () => {
7373
it('can find a key without a password', async () => {
7474
const keychain = new Keychain(datastore2)
7575
const keychainWithPassword = new Keychain(datastore2, { passPhrase: `hello-${Date.now()}-${Date.now()}` })
76-
const id = `key-${Math.random()}`
76+
const name = `key-${Math.random()}`
7777

78-
await keychainWithPassword.createKey(id, 'ed25519')
78+
const { id } = await keychainWithPassword.createKey(name, 'ed25519')
7979

8080
await expect(keychain.findKeyById(id)).to.eventually.be.ok()
8181
})

test/keychain/peerid.spec.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
/* eslint-env mocha */
22
'use strict'
33

4-
const chai = require('chai')
5-
const dirtyChai = require('dirty-chai')
6-
const expect = chai.expect
7-
chai.use(dirtyChai)
4+
const { expect } = require('aegir/utils/chai')
85
const PeerId = require('peer-id')
96
const multihash = require('multihashes')
107
const crypto = require('libp2p-crypto')

test/metrics/index.node.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85
const sinon = require('sinon')
96

107
const { randomBytes } = require('libp2p-crypto')

test/metrics/index.spec.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
chai.use(require('chai-as-promised'))
7-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
85
const sinon = require('sinon')
96

107
const { EventEmitter } = require('events')

test/peer-discovery/index.node.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
75
const sinon = require('sinon')
86
const defer = require('p-defer')
97
const mergeOptions = require('merge-options')

test/peer-discovery/index.spec.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
75
const sinon = require('sinon')
86

97
const defer = require('p-defer')

test/peer-routing/peer-routing.node.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
75
const nock = require('nock')
86
const sinon = require('sinon')
97

test/peer-store/address-book.spec.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
/* eslint-env mocha */
33
/* eslint max-nested-callbacks: ["error", 6] */
44

5-
const chai = require('chai')
6-
chai.use(require('dirty-chai'))
7-
const { expect } = chai
8-
5+
const { expect } = require('aegir/utils/chai')
96
const { Buffer } = require('buffer')
107
const multiaddr = require('multiaddr')
118
const arrayEquals = require('libp2p-utils/src/array-equals')

test/peer-store/key-book.spec.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
4+
const { chai, expect } = require('aegir/utils/chai')
65
chai.use(require('chai-bytes'))
7-
const { expect } = chai
86
const sinon = require('sinon')
97

108
const PeerStore = require('../../src/peer-store')

test/peer-store/metadata-book.spec.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
4+
const { chai, expect } = require('aegir/utils/chai')
65
chai.use(require('chai-bytes'))
7-
const { expect } = chai
86
const uint8ArrayFromString = require('uint8arrays/from-string')
97

108
const pDefer = require('p-defer')

test/peer-store/peer-store.node.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
4+
const { chai, expect } = require('aegir/utils/chai')
65
chai.use(require('chai-bytes'))
7-
const { expect } = chai
86
const sinon = require('sinon')
97

108
const baseOptions = require('../utils/base-options')

test/peer-store/peer-store.spec.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
'use strict'
22
/* eslint-env mocha */
33

4-
const chai = require('chai')
5-
chai.use(require('dirty-chai'))
6-
const { expect } = chai
4+
const { expect } = require('aegir/utils/chai')
75

86
const PeerStore = require('../../src/peer-store')
97
const multiaddr = require('multiaddr')

0 commit comments

Comments
 (0)