From 09a0f940df7fdb4ece34604e85693709df5c213e Mon Sep 17 00:00:00 2001 From: Alex Potsides Date: Sat, 18 Dec 2021 07:34:27 +0100 Subject: [PATCH] fix: increase the maxlisteners for timeout controllers (#1065) We use timeout controllers to ensure we're not dialling peers forever but we can end up registering lots of listeners for the `abort` event when peers have a lot of addresses. In node this means we see an unhelpful `MaxListenersExceededWarning` in the console warning of a potential memory leak. Increase the max number of listeners on the signal to silence the warning. --- src/dialer/index.js | 7 ++++++- src/peer-routing.js | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/dialer/index.js b/src/dialer/index.js index 555d26f2..aed012c0 100644 --- a/src/dialer/index.js +++ b/src/dialer/index.js @@ -9,7 +9,8 @@ const { Multiaddr } = require('multiaddr') const { TimeoutController } = require('timeout-abort-controller') const { AbortError } = require('abortable-iterator') const { anySignal } = require('any-signal') - +// @ts-expect-error setMaxListeners is missing from the types +const { setMaxListeners } = require('events') const DialRequest = require('./dial-request') const { publicAddressesFirst } = require('libp2p-utils/src/address-sort') const getPeer = require('../get-peer') @@ -253,6 +254,10 @@ class Dialer { // Combine the timeout signal and options.signal, if provided const timeoutController = new TimeoutController(this.timeout) + // this controller will potentially be used while dialing lots of + // peers so prevent MaxListenersExceededWarning appearing in the console + setMaxListeners && setMaxListeners(Infinity, timeoutController.signal) + const signals = [timeoutController.signal] options.signal && signals.push(options.signal) const signal = anySignal(signals) diff --git a/src/peer-routing.js b/src/peer-routing.js index 8225a5a0..fd6f9920 100644 --- a/src/peer-routing.js +++ b/src/peer-routing.js @@ -24,6 +24,8 @@ const { // @ts-ignore module with no types } = require('set-delayed-interval') const { DHTPeerRouting } = require('./dht/dht-peer-routing') +// @ts-expect-error setMaxListeners is missing from the types +const { setMaxListeners } = require('events') /** * @typedef {import('peer-id')} PeerId @@ -149,7 +151,12 @@ class PeerRouting { } if (options.timeout) { - options.signal = new TimeoutController(options.timeout).signal + const controller = new TimeoutController(options.timeout) + // this controller will potentially be used while dialing lots of + // peers so prevent MaxListenersExceededWarning appearing in the console + setMaxListeners && setMaxListeners(Infinity, controller.signal) + + options.signal = controller.signal } yield * pipe(