From 598a3e5011ef135e62ee7b4276d7f57de467cdb1 Mon Sep 17 00:00:00 2001 From: sbs44 <83440025+sbs44@users.noreply.github.com> Date: Thu, 13 Nov 2025 13:24:38 -0500 Subject: [PATCH 1/2] fix: resolve MaxListenersExceededWarning in socket event handlers - Set socket.setMaxListeners(100) to accommodate all event listeners - Updated test mocks to include setMaxListeners method - Prevents false positive memory leak warnings during speed tests --- lib.js | 1 + test/cli.test.js | 3 +++ 2 files changed, 4 insertions(+) diff --git a/lib.js b/lib.js index 4a9cc2c..7ad3fe2 100644 --- a/lib.js +++ b/lib.js @@ -109,6 +109,7 @@ function request(options, data = "") { }); req.on("socket", (socket) => { + socket.setMaxListeners(100); socket.on("lookup", () => { dnsLookup = performance.now(); }); diff --git a/test/cli.test.js b/test/cli.test.js index 51a1cbe..88d9ea3 100644 --- a/test/cli.test.js +++ b/test/cli.test.js @@ -157,6 +157,7 @@ describe('Speed Test CLI', () => { on: jest.fn((event, callback) => { if (event === 'socket') { const mockSocket = { + setMaxListeners: jest.fn(), on: jest.fn((socketEvent, socketCallback) => { if (socketEvent === 'lookup') setTimeout(() => socketCallback(), 1); if (socketEvent === 'connect') setTimeout(() => socketCallback(), 2); @@ -206,6 +207,7 @@ describe('Speed Test CLI', () => { on: jest.fn((event, callback) => { if (event === 'socket') { const mockSocket = { + setMaxListeners: jest.fn(), on: jest.fn((socketEvent, socketCallback) => { if (socketEvent === 'lookup') setTimeout(() => socketCallback(), 1); if (socketEvent === 'connect') setTimeout(() => socketCallback(), 2); @@ -255,6 +257,7 @@ describe('Speed Test CLI', () => { on: jest.fn((event, callback) => { if (event === 'socket') { const mockSocket = { + setMaxListeners: jest.fn(), on: jest.fn((socketEvent, socketCallback) => { if (socketEvent === 'lookup') setTimeout(() => socketCallback(), 1); if (socketEvent === 'connect') setTimeout(() => socketCallback(), 2); From 7093063fc0ff158e34f905c952367fc8d2499449 Mon Sep 17 00:00:00 2001 From: sbs44 <83440025+sbs44@users.noreply.github.com> Date: Thu, 13 Nov 2025 14:30:46 -0500 Subject: [PATCH 2/2] refactor: use socket.once() to prevent listener accumulation - Changed socket event handlers from .on() to .once() - Removed socket.setMaxListeners(100) workaround - Updated test mocks to match new implementation - Addresses code review feedback on proper event cleanup --- lib.js | 7 +++---- test/cli.test.js | 9 +++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/lib.js b/lib.js index 7ad3fe2..d6b8e26 100644 --- a/lib.js +++ b/lib.js @@ -109,14 +109,13 @@ function request(options, data = "") { }); req.on("socket", (socket) => { - socket.setMaxListeners(100); - socket.on("lookup", () => { + socket.once("lookup", () => { dnsLookup = performance.now(); }); - socket.on("connect", () => { + socket.once("connect", () => { tcpHandshake = performance.now(); }); - socket.on("secureConnect", () => { + socket.once("secureConnect", () => { sslHandshake = performance.now(); }); }); diff --git a/test/cli.test.js b/test/cli.test.js index 88d9ea3..d7f20a3 100644 --- a/test/cli.test.js +++ b/test/cli.test.js @@ -157,8 +157,7 @@ describe('Speed Test CLI', () => { on: jest.fn((event, callback) => { if (event === 'socket') { const mockSocket = { - setMaxListeners: jest.fn(), - on: jest.fn((socketEvent, socketCallback) => { + once: jest.fn((socketEvent, socketCallback) => { if (socketEvent === 'lookup') setTimeout(() => socketCallback(), 1); if (socketEvent === 'connect') setTimeout(() => socketCallback(), 2); if (socketEvent === 'secureConnect') setTimeout(() => socketCallback(), 3); @@ -207,8 +206,7 @@ describe('Speed Test CLI', () => { on: jest.fn((event, callback) => { if (event === 'socket') { const mockSocket = { - setMaxListeners: jest.fn(), - on: jest.fn((socketEvent, socketCallback) => { + once: jest.fn((socketEvent, socketCallback) => { if (socketEvent === 'lookup') setTimeout(() => socketCallback(), 1); if (socketEvent === 'connect') setTimeout(() => socketCallback(), 2); if (socketEvent === 'secureConnect') setTimeout(() => socketCallback(), 3); @@ -257,8 +255,7 @@ describe('Speed Test CLI', () => { on: jest.fn((event, callback) => { if (event === 'socket') { const mockSocket = { - setMaxListeners: jest.fn(), - on: jest.fn((socketEvent, socketCallback) => { + once: jest.fn((socketEvent, socketCallback) => { if (socketEvent === 'lookup') setTimeout(() => socketCallback(), 1); if (socketEvent === 'connect') setTimeout(() => socketCallback(), 2); if (socketEvent === 'secureConnect') setTimeout(() => socketCallback(), 3);