From 9495906f8b17d6db3b849a6bd8c8f2d2ef9ee09e Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Fri, 7 Nov 2025 14:28:03 +0100 Subject: [PATCH] debugger: fix event listener leak in the run command It should remove both the error and the ready event listeners attached when either of them fires, instead of removing only the one whose corresponding event fires, otherwise the other event listener will always get leaked. PR-URL: https://github.com/nodejs/node/pull/60464 Reviewed-By: Luigi Pinca Reviewed-By: James M Snell Reviewed-By: Chengzhong Wu --- lib/internal/debugger/inspect_client.js | 13 +++++-------- test/common/debugger.js | 4 ++++ test/parallel/test-debugger-restart-message.js | 2 ++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/internal/debugger/inspect_client.js b/lib/internal/debugger/inspect_client.js index 315617bf08..264e274338 100644 --- a/lib/internal/debugger/inspect_client.js +++ b/lib/internal/debugger/inspect_client.js @@ -13,7 +13,7 @@ const { const Buffer = require('buffer').Buffer; const crypto = require('crypto'); const { ERR_DEBUGGER_ERROR } = require('internal/errors').codes; -const { EventEmitter } = require('events'); +const { EventEmitter, once } = require('events'); const http = require('http'); const { URL } = require('internal/url'); @@ -343,13 +343,10 @@ class Client extends EventEmitter { this.emit('ready'); }; - return new Promise((resolve, reject) => { - this.once('error', reject); - this.once('ready', resolve); - - httpReq.on('upgrade', handshakeListener); - httpReq.end(); - }); + const onReady = once(this, 'ready'); + httpReq.on('upgrade', handshakeListener); + httpReq.end(); + return onReady; } } diff --git a/test/common/debugger.js b/test/common/debugger.js index be7b97fba5..dbaa62e71d 100644 --- a/test/common/debugger.js +++ b/test/common/debugger.js @@ -141,6 +141,10 @@ function startCLI(args, flags = [], spawnOpts = {}, opts = { randomPort: true }) return getOutput(); }, + get stderrOutput() { + return stderrOutput; + }, + get rawOutput() { return outputBuffer.join('').toString(); }, diff --git a/test/parallel/test-debugger-restart-message.js b/test/parallel/test-debugger-restart-message.js index 190d0c18cc..292a15bd9f 100644 --- a/test/parallel/test-debugger-restart-message.js +++ b/test/parallel/test-debugger-restart-message.js @@ -31,6 +31,8 @@ const startCLI = require('../common/debugger'); } finally { await cli.quit(); } + + assert.doesNotMatch(cli.stderrOutput, /MaxListenersExceededWarning/); } onWaitForInitialBreak();