Skip to content

Commit bb2e56e

Browse files
vasco-santosjacobheun
authored andcommitted
fix: registrar should filter the disconnected conn (#532)
* fix: registrar on disconnect only when no connections * chore: add test
1 parent 4222c49 commit bb2e56e

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

src/registrar.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class Registrar {
9999
let storedConn = this.connections.get(id)
100100

101101
if (storedConn && storedConn.length > 1) {
102-
storedConn = storedConn.filter((conn) => conn.id === connection.id)
102+
storedConn = storedConn.filter((conn) => conn.id !== connection.id)
103103
this.connections.set(id, storedConn)
104104
} else if (storedConn) {
105105
for (const [, topology] of this.topologies) {

test/registrar/registrar.spec.js

+40
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const Topology = require('libp2p-interfaces/src/topology/multicodec-topology')
1111
const PeerStore = require('../../src/peer-store')
1212
const Registrar = require('../../src/registrar')
1313
const { createMockConnection } = require('./utils')
14+
const peerUtils = require('../utils/creators/peer')
1415

1516
const multicodec = '/test/1.0.0'
1617

@@ -170,5 +171,44 @@ describe('registrar', () => {
170171

171172
await onDisconnectDefer.promise
172173
})
174+
175+
it('should filter connections on disconnect, removing the closed one', async () => {
176+
const onDisconnectDefer = pDefer()
177+
178+
const topologyProps = new Topology({
179+
multicodecs: multicodec,
180+
handlers: {
181+
onConnect: () => {},
182+
onDisconnect: () => {
183+
onDisconnectDefer.resolve()
184+
}
185+
}
186+
})
187+
188+
// Register protocol
189+
registrar.register(topologyProps)
190+
191+
// Setup connections before registrar
192+
const [localPeer, remotePeer] = await peerUtils.createPeerInfo({ number: 2 })
193+
194+
const conn1 = await createMockConnection({ localPeer: localPeer.id, remotePeer: remotePeer.id })
195+
const conn2 = await createMockConnection({ localPeer: localPeer.id, remotePeer: remotePeer.id })
196+
const peerInfo = await PeerInfo.create(remotePeer.id)
197+
const id = peerInfo.id.toString()
198+
199+
// Add connection to registrar
200+
peerStore.put(peerInfo)
201+
registrar.onConnect(peerInfo, conn1)
202+
registrar.onConnect(peerInfo, conn2)
203+
204+
expect(registrar.connections.get(id).length).to.eql(2)
205+
206+
conn2._stat.status = 'closed'
207+
registrar.onDisconnect(peerInfo, conn2)
208+
209+
const peerConnections = registrar.connections.get(id)
210+
expect(peerConnections.length).to.eql(1)
211+
expect(peerConnections[0]._stat.status).to.eql('open')
212+
})
173213
})
174214
})

test/registrar/utils.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ module.exports.createMockConnection = async (properties = {}) => {
2727
},
2828
direction: 'outbound',
2929
encryption: '/secio/1.0.0',
30-
multiplexer: '/mplex/6.7.0'
30+
multiplexer: '/mplex/6.7.0',
31+
status: 'open'
3132
},
3233
newStream: (protocols) => {
3334
const id = streamId++

0 commit comments

Comments
 (0)