feat: custom announce filter

This commit is contained in:
Vasco Santos 2020-10-15 15:31:33 +01:00 committed by Vasco Santos
parent 97e3633f47
commit ef9d3ca2c6
43 changed files with 75 additions and 147 deletions

View File

@ -215,6 +215,7 @@ Besides the `modules` and `config`, libp2p allows other internal options and con
- `listen` addresses will be provided to the libp2p underlying transports for listening on them.
- `announce` addresses will be used to compute the advertises that the node should advertise to the network.
- `noAnnounce` addresses will be used as a filter to compute the advertises that the node should advertise to the network.
- `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.
### Examples

View File

@ -87,12 +87,9 @@
"@nodeutils/defaults-deep": "^1.1.0",
"abortable-iterator": "^3.0.0",
"aegir": "^27.0.0",
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",
"chai-bytes": "^0.1.2",
"chai-string": "^1.5.0",
"delay": "^4.3.0",
"dirty-chai": "^2.0.1",
"interop-libp2p": "^0.3.0",
"ipfs-http-client": "^47.0.1",
"it-concat": "^1.0.0",

View File

@ -367,11 +367,13 @@ class Libp2p extends EventEmitter {
* @returns {Array<Multiaddr>}
*/
get multiaddrs () {
const announceFilter = this._options.addresses.announceFilter || ((multiaddrs) => multiaddrs)
// Filter noAnnounce multiaddrs
const filterMa = this.addressManager.getNoAnnounceAddrs()
// Create advertising list
return this.transportManager.getAddrs()
return announceFilter(this.transportManager.getAddrs()
.concat(this.addressManager.getAnnounceAddrs())
.filter((ma, index, array) => {
// Filter out if repeated
@ -385,7 +387,7 @@ class Libp2p extends EventEmitter {
}
return true
})
}))
}
/**

View File

@ -1,11 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const multiaddr = require('multiaddr')
const AddressManager = require('../../src/address-manager')

View File

@ -1,17 +1,16 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const isLoopback = require('libp2p-utils/src/multiaddr/is-loopback')
const { AddressesOptions } = require('./utils')
const peerUtils = require('../utils/creators/peer')
const listenAddresses = ['/ip4/127.0.0.1/tcp/0', '/ip4/127.0.0.1/tcp/8000/ws']
const announceAddreses = ['/dns4/peer.io']
const announceAddreses = ['/dns4/peer.io/tcp/433/p2p/12D3KooWNvSZnPi3RrhrTwEY4LuuBeB6K6facKUCJcyWG1aoDd2p']
describe('libp2p.multiaddrs', () => {
let libp2p
@ -123,4 +122,30 @@ describe('libp2p.multiaddrs', () => {
expect(advertiseMultiaddrs).to.not.include(m)
})
})
it('can filter out loopback addresses to announced by the announce filter', async () => {
[libp2p] = await peerUtils.createPeer({
started: false,
config: {
...AddressesOptions,
addresses: {
listen: listenAddresses,
announce: announceAddreses,
announceFilter: (multiaddrs) => multiaddrs.filter(m => !isLoopback(m))
}
}
})
const listenAddrs = libp2p.addressManager.listen
expect(listenAddrs.size).to.equal(listenAddresses.length)
expect(listenAddrs.has(listenAddresses[0])).to.equal(true)
expect(listenAddrs.has(listenAddresses[1])).to.equal(true)
await libp2p.start()
const multiaddrs = libp2p.multiaddrs
expect(multiaddrs.length).to.equal(announceAddreses.length)
expect(multiaddrs.includes(listenAddresses[0])).to.equal(false)
expect(multiaddrs.includes(listenAddresses[1])).to.equal(false)
})
})

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const delay = require('delay')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const peerUtils = require('../utils/creators/peer')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const nock = require('nock')
const sinon = require('sinon')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const mergeOptions = require('merge-options')
const { create } = require('../../../src')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const Transport = require('libp2p-websockets')
const { NOISE: Crypto } = require('libp2p-noise')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const Transport = require('libp2p-tcp')
const { NOISE: Crypto } = require('libp2p-noise')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const pTimes = require('p-times')
const pipe = require('it-pipe')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const { AbortError } = require('libp2p-interfaces/src/transport/errors')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const pDefer = require('p-defer')
const pWaitFor = require('p-wait-for')

0
test/dialing/utils.js Normal file
View File

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const { EventEmitter } = require('events')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const PeerId = require('peer-id')

View File

@ -2,10 +2,7 @@
/* eslint-env mocha */
'use strict'
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
const { chai, expect } = require('aegir/utils/chai')
chai.use(require('chai-string'))
const uint8ArrayFromString = require('uint8arrays/from-string')
const uint8ArrayToString = require('uint8arrays/to-string')

View File

@ -73,9 +73,9 @@ describe('keychain', () => {
it('can find a key without a password', async () => {
const keychain = new Keychain(datastore2)
const keychainWithPassword = new Keychain(datastore2, { passPhrase: `hello-${Date.now()}-${Date.now()}` })
const id = `key-${Math.random()}`
const name = `key-${Math.random()}`
await keychainWithPassword.createKey(id, 'ed25519')
const { id } = await keychainWithPassword.createKey(name, 'ed25519')
await expect(keychain.findKeyById(id)).to.eventually.be.ok()
})

View File

@ -1,10 +1,7 @@
/* eslint-env mocha */
'use strict'
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
const { expect } = require('aegir/utils/chai')
const PeerId = require('peer-id')
const multihash = require('multihashes')
const crypto = require('libp2p-crypto')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const { randomBytes } = require('libp2p-crypto')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const { EventEmitter } = require('events')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const defer = require('p-defer')
const mergeOptions = require('merge-options')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const defer = require('p-defer')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const nock = require('nock')
const sinon = require('sinon')

View File

@ -2,10 +2,7 @@
/* eslint-env mocha */
/* eslint max-nested-callbacks: ["error", 6] */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const { Buffer } = require('buffer')
const multiaddr = require('multiaddr')
const arrayEquals = require('libp2p-utils/src/array-equals')

View File

@ -1,10 +1,8 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { chai, expect } = require('aegir/utils/chai')
chai.use(require('chai-bytes'))
const { expect } = chai
const sinon = require('sinon')
const PeerStore = require('../../src/peer-store')

View File

@ -1,10 +1,8 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { chai, expect } = require('aegir/utils/chai')
chai.use(require('chai-bytes'))
const { expect } = chai
const uint8ArrayFromString = require('uint8arrays/from-string')
const pDefer = require('p-defer')

View File

@ -1,10 +1,8 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { chai, expect } = require('aegir/utils/chai')
chai.use(require('chai-bytes'))
const { expect } = chai
const sinon = require('sinon')
const baseOptions = require('../utils/base-options')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const PeerStore = require('../../src/peer-store')
const multiaddr = require('multiaddr')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const Envelope = require('../../src/record/envelope')

View File

@ -1,11 +1,9 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const pDefer = require('p-defer')
const pWaitFor = require('p-wait-for')

View File

@ -1,10 +1,7 @@
/* eslint-env mocha */
'use strict'
const chai = require('chai')
const dirtyChai = require('dirty-chai')
chai.use(dirtyChai)
const expect = chai.expect
const { expect } = require('aegir/utils/chai')
const duplexPair = require('it-pair/duplex')
const pipe = require('it-pipe')
const { collect } = require('streaming-iterables')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const mergeOptions = require('merge-options')
const multiaddr = require('multiaddr')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const pWaitFor = require('p-wait-for')
const pDefer = require('p-defer')
const mergeOptions = require('merge-options')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const pWaitFor = require('p-wait-for')

View File

@ -1,12 +1,8 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { chai, expect } = require('aegir/utils/chai')
chai.use(require('chai-bytes'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const uint8arrayFromString = require('uint8arrays/from-string')
const uint8arrayEquals = require('uint8arrays/equals')
const Envelope = require('../../src/record/envelope')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const tests = require('libp2p-interfaces/src/record/tests')
const multiaddr = require('multiaddr')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const pDefer = require('p-defer')
const { EventEmitter } = require('events')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const delay = require('delay')
const pWaitFor = require('p-wait-for')
const sinon = require('sinon')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const multiaddr = require('multiaddr')

View File

@ -1,9 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const AddressManager = require('../../src/address-manager')
const TransportManager = require('../../src/transport-manager')

View File

@ -1,10 +1,7 @@
'use strict'
/* eslint-env mocha */
const chai = require('chai')
chai.use(require('dirty-chai'))
chai.use(require('chai-as-promised'))
const { expect } = chai
const { expect } = require('aegir/utils/chai')
const sinon = require('sinon')
const multiaddr = require('multiaddr')