Skip to content

Commit eea07c6

Browse files
committed
fix: ensure relay listener is removed
1 parent 8259797 commit eea07c6

File tree

3 files changed

+30
-16
lines changed

3 files changed

+30
-16
lines changed

packages/libp2p/src/circuit-relay/transport/listener.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ class CircuitRelayTransportListener extends EventEmitter<ListenerEvents> impleme
3232

3333
// remove listening addrs when a relay is removed
3434
this.relayStore.addEventListener('relay:removed', this._onRemoveRelayPeer)
35-
console.log('added event listener:', this.relayStore.listenerCount('relay:removed'))
3635
}
3736

3837
_onRemoveRelayPeer = (evt: CustomEvent<PeerId>): void => {
@@ -92,11 +91,7 @@ class CircuitRelayTransportListener extends EventEmitter<ListenerEvents> impleme
9291
}
9392

9493
async close (): Promise<void> {
95-
// remove event listener
96-
console.log('removing relay event listener for peer %s', Array.from(this.listeningAddrs.keys()).join(', '))
97-
log.trace('removing relay event listener for peer %s', Array.from(this.listeningAddrs.keys()).join(', '))
98-
this.relayStore.removeEventListener('relay:removed', this._onRemoveRelayPeer)
99-
console.log('removing count:', this.relayStore.listenerCount('relay:removed'))
94+
10095
}
10196

10297
#removeRelayPeer (peerId: PeerId): void {
@@ -107,6 +102,8 @@ class CircuitRelayTransportListener extends EventEmitter<ListenerEvents> impleme
107102
this.listeningAddrs.delete(peerId)
108103

109104
if (had) {
105+
log.trace('removing relay event listener for peer %s', Array.from(this.listeningAddrs.keys()).join(', '))
106+
this.relayStore.removeEventListener('relay:removed', this._onRemoveRelayPeer)
110107
// Announce listen addresses change
111108
this.safeDispatchEvent('close', {})
112109
}

packages/libp2p/src/circuit-relay/transport/reservation-store.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,9 @@ export class ReservationStore extends EventEmitter<ReservationStoreEvents> imple
112112
// remove the reservation and multiaddr and maybe trigger search
113113
// for new relays
114114
this.events.addEventListener('peer:disconnect', (evt) => {
115-
console.log('peer:disconnect event listener', evt.detail)
116-
this.#removeRelay(evt.detail)
115+
this.#removeRelay(evt.detail).catch(err => {
116+
log.error('error removing relay %p', evt.detail, err)
117+
})
117118
})
118119
}
119120

@@ -288,24 +289,43 @@ export class ReservationStore extends EventEmitter<ReservationStoreEvents> imple
288289
throw new Error(errMsg)
289290
}
290291

292+
async removeListeners (peerId: PeerId): Promise<void> {
293+
const listenersToRemove: string[] = []
294+
295+
this.transportManager.getListeners().forEach((listeners) => {
296+
listeners.getAddrs().forEach((addr) => {
297+
if (addr.toString().includes(peerId.toString())) {
298+
listenersToRemove.push(addr.toString())
299+
}
300+
})
301+
})
302+
303+
for (const addr of listenersToRemove) {
304+
await this.transportManager.remove(addr)
305+
log('removed addr: %s', addr)
306+
}
307+
}
308+
291309
/**
292310
* Remove listen relay
293311
*/
294-
#removeRelay (peerId: PeerId): void {
312+
async #removeRelay (peerId: PeerId): Promise<void> {
295313
const existingReservation = this.reservations.get(peerId)
296314

297315
if (existingReservation == null) {
298316
return
299317
}
300318

301-
log('connection to relay %p closed, removing reservation from local store', peerId)
319+
log.trace('connection to relay %p closed, removing reservation from local store', peerId)
302320

303321
clearTimeout(existingReservation.timeout)
304322
this.reservations.delete(peerId)
305323

324+
await this.removeListeners(peerId)
325+
306326
this.safeDispatchEvent('relay:removed', { detail: peerId })
307327

308-
console.log('removing listener for relay peer %s', peerId)
328+
log.trace('removing relay peer %s', peerId)
309329

310330
if (this.reservations.size < this.maxDiscoveredRelays) {
311331
log('not enough relays %d/%d', this.reservations.size, this.maxDiscoveredRelays)

packages/libp2p/test/circuit-relay/relay.node.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -685,12 +685,10 @@ describe('circuit-relay', () => {
685685
expect(events[1].detail.remotePeer.toString()).to.equal(relay1.peerId.toString())
686686
})
687687

688-
// Not sure why this test isn't passing
689-
it.skip('should remove the relay event listener when the relay stops', async () => {
688+
it('should remove the relay event listener when the relay stops', async () => {
690689
// discover relay and make reservation
691690
await local.dial(relay1.getMultiaddrs()[0])
692691
await local.dial(relay2.getMultiaddrs()[0])
693-
await local.dial(relay3.getMultiaddrs()[0])
694692

695693
await usingAsRelayCount(local, [relay1, relay2], 2)
696694

@@ -708,8 +706,7 @@ describe('circuit-relay', () => {
708706
expect(circuitListener[0].relayStore.listenerCount('relay:removed')).to.equal(2)
709707

710708
// remove one listener
711-
await relay1.stop()
712-
await relay2.stop()
709+
await local.hangUp(relay1.peerId)
713710

714711
await notUsingAsRelay(local, relay1)
715712

0 commit comments

Comments
 (0)