mirror of
https://github.com/fluencelabs/js-libp2p-interfaces
synced 2025-04-24 18:02:28 +00:00
fix: reconnect should trigger topology on connect if protocol stored (#54)
* fix: reconnect should trigger topology on connect if protocol stored * chore: address review
This commit is contained in:
parent
9fbf9d0331
commit
e10a1545c8
@ -43,11 +43,13 @@ class MulticodecTopology extends Topology {
|
||||
this._registrar = undefined
|
||||
|
||||
this._onProtocolChange = this._onProtocolChange.bind(this)
|
||||
this._onPeerConnect = this._onPeerConnect.bind(this)
|
||||
}
|
||||
|
||||
set registrar (registrar) {
|
||||
this._registrar = registrar
|
||||
this._registrar.peerStore.on('change:protocols', this._onProtocolChange)
|
||||
this._registrar.connectionManager.on('peer:connect', this._onPeerConnect)
|
||||
|
||||
// Update topology peers
|
||||
this._updatePeers(this._registrar.peerStore.peers.values())
|
||||
@ -97,6 +99,25 @@ class MulticodecTopology extends Topology {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if a new connected peer has a topology multicodec and call _onConnect.
|
||||
* @param {Connection} connection
|
||||
* @returns {void}
|
||||
*/
|
||||
_onPeerConnect (connection) {
|
||||
const peerId = connection.remotePeer
|
||||
const protocols = this._registrar.peerStore.protoBook.get(peerId)
|
||||
|
||||
if (!protocols) {
|
||||
return
|
||||
}
|
||||
|
||||
if (this.multicodecs.find(multicodec => protocols.includes(multicodec))) {
|
||||
this.peers.add(peerId.toB58String())
|
||||
this._onConnect(peerId, connection)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = withIs(MulticodecTopology, { className: 'MulticodecTopology', symbolName: '@libp2p/js-interfaces/topology/multicodec-topology' })
|
||||
|
@ -96,5 +96,38 @@ module.exports = (test) => {
|
||||
expect(topology._onDisconnect.callCount).to.equal(1)
|
||||
expect(topology._onDisconnect.calledWith(id2)).to.equal(true)
|
||||
})
|
||||
|
||||
it('should trigger "onConnect" when a peer connects and has one of the topology multicodecs in its known protocols', () => {
|
||||
sinon.spy(topology, '_onConnect')
|
||||
sinon.stub(topology._registrar.peerStore.protoBook, 'get').returns(topology.multicodecs)
|
||||
|
||||
topology._registrar.connectionManager.emit('peer:connect', {
|
||||
remotePeer: id
|
||||
})
|
||||
|
||||
expect(topology._onConnect.callCount).to.equal(1)
|
||||
})
|
||||
|
||||
it('should not trigger "onConnect" when a peer connects and has none of the topology multicodecs in its known protocols', () => {
|
||||
sinon.spy(topology, '_onConnect')
|
||||
sinon.stub(topology._registrar.peerStore.protoBook, 'get').returns([])
|
||||
|
||||
topology._registrar.connectionManager.emit('peer:connect', {
|
||||
remotePeer: id
|
||||
})
|
||||
|
||||
expect(topology._onConnect.callCount).to.equal(0)
|
||||
})
|
||||
|
||||
it('should not trigger "onConnect" when a peer connects and its protocols are not known', () => {
|
||||
sinon.spy(topology, '_onConnect')
|
||||
sinon.stub(topology._registrar.peerStore.protoBook, 'get').returns(undefined)
|
||||
|
||||
topology._registrar.connectionManager.emit('peer:connect', {
|
||||
remotePeer: id
|
||||
})
|
||||
|
||||
expect(topology._onConnect.callCount).to.equal(0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
@ -6,6 +6,9 @@ class MockPeerStore extends EventEmitter {
|
||||
constructor (peers) {
|
||||
super()
|
||||
this.peers = peers
|
||||
this.protoBook = {
|
||||
get: () => {}
|
||||
}
|
||||
}
|
||||
|
||||
get (peerId) {
|
||||
|
@ -1,6 +1,8 @@
|
||||
/* eslint-env mocha */
|
||||
'use strict'
|
||||
|
||||
const { EventEmitter } = require('events')
|
||||
|
||||
const tests = require('../../src/topology/tests/multicodec-topology')
|
||||
const MulticodecTopology = require('../../src/topology/multicodec-topology')
|
||||
const MockPeerStore = require('./mock-peer-store')
|
||||
@ -23,9 +25,11 @@ describe('multicodec topology compliance tests', () => {
|
||||
if (!registrar) {
|
||||
const peers = new Map()
|
||||
const peerStore = new MockPeerStore(peers)
|
||||
const connectionManager = new EventEmitter()
|
||||
|
||||
registrar = {
|
||||
peerStore,
|
||||
connectionManager,
|
||||
getConnection: () => { }
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user