mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-04-26 11:02:14 +00:00
chore: create signed peer record on new listen addresses in transport manager
This commit is contained in:
parent
7b93ece7f2
commit
43eda43f06
@ -73,7 +73,6 @@
|
|||||||
* [`libp2p`](#libp2p)
|
* [`libp2p`](#libp2p)
|
||||||
* [`libp2p.connectionManager`](#libp2pconnectionmanager)
|
* [`libp2p.connectionManager`](#libp2pconnectionmanager)
|
||||||
* [`libp2p.peerStore`](#libp2ppeerStore)
|
* [`libp2p.peerStore`](#libp2ppeerStore)
|
||||||
* [`libp2p.transportManager`](#libp2ptransportmanager)
|
|
||||||
* [Types](#types)
|
* [Types](#types)
|
||||||
* [`Stats`](#stats)
|
* [`Stats`](#stats)
|
||||||
|
|
||||||
@ -2020,14 +2019,6 @@ This event will be triggered anytime we are disconnected from another peer, rega
|
|||||||
- `peerId`: instance of [`PeerId`][peer-id]
|
- `peerId`: instance of [`PeerId`][peer-id]
|
||||||
- `protocols`: array of known, supported protocols for the peer (string identifiers)
|
- `protocols`: array of known, supported protocols for the peer (string identifiers)
|
||||||
|
|
||||||
### libp2p.transportManager
|
|
||||||
|
|
||||||
#### Listening addresses change
|
|
||||||
|
|
||||||
This event will be triggered anytime the listening addresses change.
|
|
||||||
|
|
||||||
`libp2p.transportManager.on('listening', () => {})`
|
|
||||||
|
|
||||||
## Types
|
## Types
|
||||||
|
|
||||||
### Stats
|
### Stats
|
||||||
|
@ -21,7 +21,7 @@ module.exports = (libp2p) => {
|
|||||||
|
|
||||||
if (deleted) {
|
if (deleted) {
|
||||||
// Announce listen addresses change
|
// Announce listen addresses change
|
||||||
listener.emit('listening')
|
listener.emit('close')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -64,11 +64,6 @@ class IdentifyService {
|
|||||||
*/
|
*/
|
||||||
this.connectionManager = libp2p.connectionManager
|
this.connectionManager = libp2p.connectionManager
|
||||||
|
|
||||||
/**
|
|
||||||
* @property {TransportManager}
|
|
||||||
*/
|
|
||||||
this.transportManager = libp2p.transportManager
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property {PeerId}
|
* @property {PeerId}
|
||||||
*/
|
*/
|
||||||
@ -96,10 +91,11 @@ class IdentifyService {
|
|||||||
this.identify(connection).catch(log.error)
|
this.identify(connection).catch(log.error)
|
||||||
})
|
})
|
||||||
|
|
||||||
// When new addresses are used for listening, update self peer record
|
// When self multiaddrs change, trigger identify-push
|
||||||
this.transportManager.on('listening', async () => {
|
this.peerStore.on('change:multiaddrs', ({ peerId }) => {
|
||||||
await this._createSelfPeerRecord()
|
if (peerId.toString() === this.peerId.toString()) {
|
||||||
this.pushToPeerStore()
|
this.pushToPeerStore()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +106,7 @@ class IdentifyService {
|
|||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async push (connections) {
|
async push (connections) {
|
||||||
const signedPeerRecord = await this._getSelfPeerRecord()
|
const signedPeerRecord = await this.peerStore.addressBook.getRawEnvelope(this.peerId)
|
||||||
const listenAddrs = this._libp2p.multiaddrs.map((ma) => ma.bytes)
|
const listenAddrs = this._libp2p.multiaddrs.map((ma) => ma.bytes)
|
||||||
const protocols = Array.from(this._protocols.keys())
|
const protocols = Array.from(this._protocols.keys())
|
||||||
|
|
||||||
@ -260,7 +256,7 @@ class IdentifyService {
|
|||||||
publicKey = this.peerId.pubKey.bytes
|
publicKey = this.peerId.pubKey.bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
const signedPeerRecord = await this._getSelfPeerRecord()
|
const signedPeerRecord = await this.peerStore.addressBook.getRawEnvelope(this.peerId)
|
||||||
|
|
||||||
const message = Message.encode({
|
const message = Message.encode({
|
||||||
protocolVersion: this._host.protocolVersion,
|
protocolVersion: this._host.protocolVersion,
|
||||||
@ -330,40 +326,6 @@ class IdentifyService {
|
|||||||
// Update the protocols
|
// Update the protocols
|
||||||
this.peerStore.protoBook.set(id, message.protocols)
|
this.peerStore.protoBook.set(id, message.protocols)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get self signed peer record raw envelope.
|
|
||||||
* @return {Promise<Uint8Array>}
|
|
||||||
*/
|
|
||||||
_getSelfPeerRecord () {
|
|
||||||
const selfSignedPeerRecord = this.peerStore.addressBook.getRawEnvelope(this.peerId)
|
|
||||||
|
|
||||||
if (selfSignedPeerRecord) {
|
|
||||||
return selfSignedPeerRecord
|
|
||||||
}
|
|
||||||
|
|
||||||
return this._createSelfPeerRecord()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create self signed peer record raw envelope.
|
|
||||||
* @return {Uint8Array}
|
|
||||||
*/
|
|
||||||
async _createSelfPeerRecord () {
|
|
||||||
try {
|
|
||||||
const peerRecord = new PeerRecord({
|
|
||||||
peerId: this.peerId,
|
|
||||||
multiaddrs: this._libp2p.multiaddrs
|
|
||||||
})
|
|
||||||
const envelope = await Envelope.seal(peerRecord, this.peerId)
|
|
||||||
this.peerStore.addressBook.consumePeerRecord(envelope)
|
|
||||||
|
|
||||||
return this.peerStore.addressBook.getRawEnvelope(this.peerId)
|
|
||||||
} catch (err) {
|
|
||||||
log.error('failed to get self peer record')
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.IdentifyService = IdentifyService
|
module.exports.IdentifyService = IdentifyService
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const { EventEmitter } = require('events')
|
|
||||||
const pSettle = require('p-settle')
|
const pSettle = require('p-settle')
|
||||||
const { codes } = require('./errors')
|
const { codes } = require('./errors')
|
||||||
const errCode = require('err-code')
|
const errCode = require('err-code')
|
||||||
@ -8,11 +7,10 @@ const debug = require('debug')
|
|||||||
const log = debug('libp2p:transports')
|
const log = debug('libp2p:transports')
|
||||||
log.error = debug('libp2p:transports:error')
|
log.error = debug('libp2p:transports:error')
|
||||||
|
|
||||||
/**
|
const Envelope = require('./record/envelope')
|
||||||
* Responsible for managing the transports and their listeners.
|
const PeerRecord = require('./record/peer-record')
|
||||||
* @fires TransportManager#listening Emitted when listening addresses change.
|
|
||||||
*/
|
class TransportManager {
|
||||||
class TransportManager extends EventEmitter {
|
|
||||||
/**
|
/**
|
||||||
* @class
|
* @class
|
||||||
* @param {object} options
|
* @param {object} options
|
||||||
@ -21,8 +19,6 @@ class TransportManager extends EventEmitter {
|
|||||||
* @param {boolean} [options.faultTolerance = FAULT_TOLERANCE.FATAL_ALL] - Address listen error tolerance.
|
* @param {boolean} [options.faultTolerance = FAULT_TOLERANCE.FATAL_ALL] - Address listen error tolerance.
|
||||||
*/
|
*/
|
||||||
constructor ({ libp2p, upgrader, faultTolerance = FAULT_TOLERANCE.FATAL_ALL }) {
|
constructor ({ libp2p, upgrader, faultTolerance = FAULT_TOLERANCE.FATAL_ALL }) {
|
||||||
super()
|
|
||||||
|
|
||||||
this.libp2p = libp2p
|
this.libp2p = libp2p
|
||||||
this.upgrader = upgrader
|
this.upgrader = upgrader
|
||||||
this._transports = new Map()
|
this._transports = new Map()
|
||||||
@ -73,6 +69,7 @@ class TransportManager extends EventEmitter {
|
|||||||
while (listeners.length) {
|
while (listeners.length) {
|
||||||
const listener = listeners.pop()
|
const listener = listeners.pop()
|
||||||
listener.removeAllListeners('listening')
|
listener.removeAllListeners('listening')
|
||||||
|
listener.removeAllListeners('close')
|
||||||
tasks.push(listener.close())
|
tasks.push(listener.close())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -166,8 +163,9 @@ class TransportManager extends EventEmitter {
|
|||||||
const listener = transport.createListener(this._listenerOptions.get(key), this.onConnection)
|
const listener = transport.createListener(this._listenerOptions.get(key), this.onConnection)
|
||||||
this._listeners.get(key).push(listener)
|
this._listeners.get(key).push(listener)
|
||||||
|
|
||||||
// Track listen events
|
// Track listen/close events
|
||||||
listener.on('listening', () => this.emit('listening'))
|
listener.on('listening', () => this._createSelfPeerRecord())
|
||||||
|
listener.on('close', () => this._createSelfPeerRecord())
|
||||||
|
|
||||||
// We need to attempt to listen on everything
|
// We need to attempt to listen on everything
|
||||||
tasks.push(listener.listen(addr))
|
tasks.push(listener.listen(addr))
|
||||||
@ -214,6 +212,7 @@ class TransportManager extends EventEmitter {
|
|||||||
// Close any running listeners
|
// Close any running listeners
|
||||||
for (const listener of this._listeners.get(key)) {
|
for (const listener of this._listeners.get(key)) {
|
||||||
listener.removeAllListeners('listening')
|
listener.removeAllListeners('listening')
|
||||||
|
listener.removeAllListeners('close')
|
||||||
await listener.close()
|
await listener.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -236,6 +235,26 @@ class TransportManager extends EventEmitter {
|
|||||||
|
|
||||||
await Promise.all(tasks)
|
await Promise.all(tasks)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create self signed peer record raw envelope.
|
||||||
|
* @return {Uint8Array}
|
||||||
|
*/
|
||||||
|
async _createSelfPeerRecord () {
|
||||||
|
try {
|
||||||
|
const peerRecord = new PeerRecord({
|
||||||
|
peerId: this.libp2p.peerId,
|
||||||
|
multiaddrs: this.libp2p.multiaddrs
|
||||||
|
})
|
||||||
|
const envelope = await Envelope.seal(peerRecord, this.libp2p.peerId)
|
||||||
|
this.libp2p.peerStore.addressBook.consumePeerRecord(envelope)
|
||||||
|
|
||||||
|
return this.libp2p.peerStore.addressBook.getRawEnvelope(this.libp2p.peerId)
|
||||||
|
} catch (err) {
|
||||||
|
log.error('failed to get self peer record')
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -349,7 +349,6 @@ describe('Dialing (direct, WebSockets)', () => {
|
|||||||
const connection = await libp2p.dial(remoteAddr)
|
const connection = await libp2p.dial(remoteAddr)
|
||||||
expect(connection).to.exist()
|
expect(connection).to.exist()
|
||||||
|
|
||||||
sinon.spy(libp2p.peerStore.addressBook, 'consumePeerRecord')
|
|
||||||
sinon.spy(libp2p.peerStore.protoBook, 'set')
|
sinon.spy(libp2p.peerStore.protoBook, 'set')
|
||||||
|
|
||||||
// Wait for onConnection to be called
|
// Wait for onConnection to be called
|
||||||
@ -358,8 +357,6 @@ describe('Dialing (direct, WebSockets)', () => {
|
|||||||
expect(libp2p.identifyService.identify.callCount).to.equal(1)
|
expect(libp2p.identifyService.identify.callCount).to.equal(1)
|
||||||
await libp2p.identifyService.identify.firstCall.returnValue
|
await libp2p.identifyService.identify.firstCall.returnValue
|
||||||
|
|
||||||
// Self + New peer
|
|
||||||
expect(libp2p.peerStore.addressBook.consumePeerRecord.callCount).to.equal(2)
|
|
||||||
expect(libp2p.peerStore.protoBook.set.callCount).to.equal(1)
|
expect(libp2p.peerStore.protoBook.set.callCount).to.equal(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@ const { IdentifyService, multicodecs } = require('../../src/identify')
|
|||||||
const Peers = require('../fixtures/peers')
|
const Peers = require('../fixtures/peers')
|
||||||
const Libp2p = require('../../src')
|
const Libp2p = require('../../src')
|
||||||
const Envelope = require('../../src/record/envelope')
|
const Envelope = require('../../src/record/envelope')
|
||||||
|
const PeerRecord = require('../../src/record/peer-record')
|
||||||
const PeerStore = require('../../src/peer-store')
|
const PeerStore = require('../../src/peer-store')
|
||||||
const baseOptions = require('../utils/base-options.browser')
|
const baseOptions = require('../utils/base-options.browser')
|
||||||
const pkg = require('../../package.json')
|
const pkg = require('../../package.json')
|
||||||
@ -52,7 +53,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: localPeer,
|
peerId: localPeer,
|
||||||
connectionManager: new EventEmitter(),
|
connectionManager: new EventEmitter(),
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: localPeer }),
|
peerStore: new PeerStore({ peerId: localPeer }),
|
||||||
multiaddrs: listenMaddrs,
|
multiaddrs: listenMaddrs,
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -64,7 +64,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: remotePeer,
|
peerId: remotePeer,
|
||||||
connectionManager: new EventEmitter(),
|
connectionManager: new EventEmitter(),
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: remotePeer }),
|
peerStore: new PeerStore({ peerId: remotePeer }),
|
||||||
multiaddrs: listenMaddrs,
|
multiaddrs: listenMaddrs,
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -82,6 +81,9 @@ describe('Identify', () => {
|
|||||||
sinon.spy(localIdentify.peerStore.addressBook, 'consumePeerRecord')
|
sinon.spy(localIdentify.peerStore.addressBook, 'consumePeerRecord')
|
||||||
sinon.spy(localIdentify.peerStore.protoBook, 'set')
|
sinon.spy(localIdentify.peerStore.protoBook, 'set')
|
||||||
|
|
||||||
|
// Transport Manager creates signed peer record
|
||||||
|
await _createSelfPeerRecord(remoteIdentify._libp2p)
|
||||||
|
|
||||||
// Run identify
|
// Run identify
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
localIdentify.identify(localConnectionMock),
|
localIdentify.identify(localConnectionMock),
|
||||||
@ -109,7 +111,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: localPeer,
|
peerId: localPeer,
|
||||||
connectionManager: new EventEmitter(),
|
connectionManager: new EventEmitter(),
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: localPeer }),
|
peerStore: new PeerStore({ peerId: localPeer }),
|
||||||
multiaddrs: listenMaddrs,
|
multiaddrs: listenMaddrs,
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -121,7 +122,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: remotePeer,
|
peerId: remotePeer,
|
||||||
connectionManager: new EventEmitter(),
|
connectionManager: new EventEmitter(),
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: remotePeer }),
|
peerStore: new PeerStore({ peerId: remotePeer }),
|
||||||
multiaddrs: listenMaddrs,
|
multiaddrs: listenMaddrs,
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -172,7 +172,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: localPeer,
|
peerId: localPeer,
|
||||||
connectionManager: new EventEmitter(),
|
connectionManager: new EventEmitter(),
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: localPeer }),
|
peerStore: new PeerStore({ peerId: localPeer }),
|
||||||
multiaddrs: [],
|
multiaddrs: [],
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -183,7 +182,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: remotePeer,
|
peerId: remotePeer,
|
||||||
connectionManager: new EventEmitter(),
|
connectionManager: new EventEmitter(),
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: remotePeer }),
|
peerStore: new PeerStore({ peerId: remotePeer }),
|
||||||
multiaddrs: [],
|
multiaddrs: [],
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -252,7 +250,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: localPeer,
|
peerId: localPeer,
|
||||||
connectionManager: new EventEmitter(),
|
connectionManager: new EventEmitter(),
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: localPeer }),
|
peerStore: new PeerStore({ peerId: localPeer }),
|
||||||
multiaddrs: listenMaddrs,
|
multiaddrs: listenMaddrs,
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -267,7 +264,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: remotePeer,
|
peerId: remotePeer,
|
||||||
connectionManager,
|
connectionManager,
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: remotePeer }),
|
peerStore: new PeerStore({ peerId: remotePeer }),
|
||||||
multiaddrs: [],
|
multiaddrs: [],
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -285,6 +281,10 @@ describe('Identify', () => {
|
|||||||
sinon.spy(remoteIdentify.peerStore.addressBook, 'consumePeerRecord')
|
sinon.spy(remoteIdentify.peerStore.addressBook, 'consumePeerRecord')
|
||||||
sinon.spy(remoteIdentify.peerStore.protoBook, 'set')
|
sinon.spy(remoteIdentify.peerStore.protoBook, 'set')
|
||||||
|
|
||||||
|
// Transport Manager creates signed peer record
|
||||||
|
await _createSelfPeerRecord(localIdentify._libp2p)
|
||||||
|
await _createSelfPeerRecord(remoteIdentify._libp2p)
|
||||||
|
|
||||||
// Run identify
|
// Run identify
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
localIdentify.push([localConnectionMock]),
|
localIdentify.push([localConnectionMock]),
|
||||||
@ -295,7 +295,7 @@ describe('Identify', () => {
|
|||||||
})
|
})
|
||||||
])
|
])
|
||||||
|
|
||||||
expect(remoteIdentify.peerStore.addressBook.consumePeerRecord.callCount).to.equal(1)
|
expect(remoteIdentify.peerStore.addressBook.consumePeerRecord.callCount).to.equal(2)
|
||||||
expect(remoteIdentify.peerStore.protoBook.set.callCount).to.equal(1)
|
expect(remoteIdentify.peerStore.protoBook.set.callCount).to.equal(1)
|
||||||
|
|
||||||
const addresses = localIdentify.peerStore.addressBook.get(localPeer)
|
const addresses = localIdentify.peerStore.addressBook.get(localPeer)
|
||||||
@ -317,7 +317,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: localPeer,
|
peerId: localPeer,
|
||||||
connectionManager: new EventEmitter(),
|
connectionManager: new EventEmitter(),
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: localPeer }),
|
peerStore: new PeerStore({ peerId: localPeer }),
|
||||||
multiaddrs: listenMaddrs,
|
multiaddrs: listenMaddrs,
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -332,7 +331,6 @@ describe('Identify', () => {
|
|||||||
libp2p: {
|
libp2p: {
|
||||||
peerId: remotePeer,
|
peerId: remotePeer,
|
||||||
connectionManager,
|
connectionManager,
|
||||||
transportManager: new EventEmitter(),
|
|
||||||
peerStore: new PeerStore({ peerId: remotePeer }),
|
peerStore: new PeerStore({ peerId: remotePeer }),
|
||||||
multiaddrs: [],
|
multiaddrs: [],
|
||||||
_options: { host: {} }
|
_options: { host: {} }
|
||||||
@ -409,8 +407,8 @@ describe('Identify', () => {
|
|||||||
expect(connection).to.exist()
|
expect(connection).to.exist()
|
||||||
|
|
||||||
// Wait for peer store to be updated
|
// Wait for peer store to be updated
|
||||||
// Dialer._createDialTarget (add), Identify (consume), Create self (consume)
|
// Dialer._createDialTarget (add), Identify (consume)
|
||||||
await pWaitFor(() => peerStoreSpyConsumeRecord.callCount === 2 && peerStoreSpyAdd.callCount === 1)
|
await pWaitFor(() => peerStoreSpyConsumeRecord.callCount === 1 && peerStoreSpyAdd.callCount === 1)
|
||||||
expect(libp2p.identifyService.identify.callCount).to.equal(1)
|
expect(libp2p.identifyService.identify.callCount).to.equal(1)
|
||||||
|
|
||||||
// The connection should have no open streams
|
// The connection should have no open streams
|
||||||
@ -474,3 +472,18 @@ describe('Identify', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Self peer record creating on Transport Manager simulation
|
||||||
|
const _createSelfPeerRecord = async (libp2p) => {
|
||||||
|
try {
|
||||||
|
const peerRecord = new PeerRecord({
|
||||||
|
peerId: libp2p.peerId,
|
||||||
|
multiaddrs: libp2p.multiaddrs
|
||||||
|
})
|
||||||
|
const envelope = await Envelope.seal(peerRecord, libp2p.peerId)
|
||||||
|
libp2p.peerStore.addressBook.consumePeerRecord(envelope)
|
||||||
|
|
||||||
|
return libp2p.peerStore.addressBook.getRawEnvelope(libp2p.peerId)
|
||||||
|
} catch (_) {}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
@ -4,13 +4,17 @@
|
|||||||
const chai = require('chai')
|
const chai = require('chai')
|
||||||
chai.use(require('dirty-chai'))
|
chai.use(require('dirty-chai'))
|
||||||
const { expect } = chai
|
const { expect } = chai
|
||||||
|
const sinon = require('sinon')
|
||||||
|
|
||||||
const AddressManager = require('../../src/address-manager')
|
const AddressManager = require('../../src/address-manager')
|
||||||
const TransportManager = require('../../src/transport-manager')
|
const TransportManager = require('../../src/transport-manager')
|
||||||
|
const PeerStore = require('../../src/peer-store')
|
||||||
const Transport = require('libp2p-tcp')
|
const Transport = require('libp2p-tcp')
|
||||||
|
const PeerId = require('peer-id')
|
||||||
const multiaddr = require('multiaddr')
|
const multiaddr = require('multiaddr')
|
||||||
const mockUpgrader = require('../utils/mockUpgrader')
|
const mockUpgrader = require('../utils/mockUpgrader')
|
||||||
const sinon = require('sinon')
|
const sinon = require('sinon')
|
||||||
|
const Peers = require('../fixtures/peers')
|
||||||
const addrs = [
|
const addrs = [
|
||||||
multiaddr('/ip4/127.0.0.1/tcp/0'),
|
multiaddr('/ip4/127.0.0.1/tcp/0'),
|
||||||
multiaddr('/ip4/127.0.0.1/tcp/0')
|
multiaddr('/ip4/127.0.0.1/tcp/0')
|
||||||
@ -18,11 +22,17 @@ const addrs = [
|
|||||||
|
|
||||||
describe('Transport Manager (TCP)', () => {
|
describe('Transport Manager (TCP)', () => {
|
||||||
let tm
|
let tm
|
||||||
|
let localPeer
|
||||||
|
|
||||||
|
before(async () => {
|
||||||
|
localPeer = await PeerId.createFromJSON(Peers[0])
|
||||||
|
})
|
||||||
|
|
||||||
before(() => {
|
before(() => {
|
||||||
tm = new TransportManager({
|
tm = new TransportManager({
|
||||||
libp2p: {
|
libp2p: {
|
||||||
addressManager: new AddressManager({ listen: addrs })
|
addressManager: new AddressManager({ listen: addrs }),
|
||||||
|
PeerStore: new PeerStore({ peerId: localPeer })
|
||||||
},
|
},
|
||||||
upgrader: mockUpgrader,
|
upgrader: mockUpgrader,
|
||||||
onConnection: () => {}
|
onConnection: () => {}
|
||||||
@ -41,12 +51,18 @@ describe('Transport Manager (TCP)', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should be able to listen', async () => {
|
it('should be able to listen', async () => {
|
||||||
|
sinon.spy(tm, '_createSelfPeerRecord')
|
||||||
|
|
||||||
tm.add(Transport.prototype[Symbol.toStringTag], Transport, { listenerOptions: { listen: 'carefully' } })
|
tm.add(Transport.prototype[Symbol.toStringTag], Transport, { listenerOptions: { listen: 'carefully' } })
|
||||||
const transport = tm._transports.get(Transport.prototype[Symbol.toStringTag])
|
const transport = tm._transports.get(Transport.prototype[Symbol.toStringTag])
|
||||||
const spyListener = sinon.spy(transport, 'createListener')
|
const spyListener = sinon.spy(transport, 'createListener')
|
||||||
await tm.listen()
|
await tm.listen()
|
||||||
expect(tm._listeners).to.have.key(Transport.prototype[Symbol.toStringTag])
|
expect(tm._listeners).to.have.key(Transport.prototype[Symbol.toStringTag])
|
||||||
expect(tm._listeners.get(Transport.prototype[Symbol.toStringTag])).to.have.length(addrs.length)
|
expect(tm._listeners.get(Transport.prototype[Symbol.toStringTag])).to.have.length(addrs.length)
|
||||||
|
|
||||||
|
// Created Self Peer record on new listen address
|
||||||
|
expect(tm._createSelfPeerRecord.callCount).to.equal(addrs.length)
|
||||||
|
|
||||||
// Ephemeral ip addresses may result in multiple listeners
|
// Ephemeral ip addresses may result in multiple listeners
|
||||||
expect(tm.getAddrs().length).to.equal(addrs.length)
|
expect(tm.getAddrs().length).to.equal(addrs.length)
|
||||||
await tm.close()
|
await tm.close()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user