From c21a0a2a3bc649f23f09fa048bb7583573b33557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Muhammed=20K=C4=B1l=C4=B1=C3=A7?= Date: Fri, 4 Sep 2026 12:50:55 +0300 Subject: [PATCH] worker: fix messageerror listener cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove messageerror listeners before emitting the worker exit event. Signed-off-by: Muhammed Kılıç --- lib/internal/worker.js | 2 +- .../test-worker-message-listeners-on-exit.js | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-worker-message-listeners-on-exit.js diff --git a/lib/internal/worker.js b/lib/internal/worker.js index f3f3c23a5abe..728132f779e3 100644 --- a/lib/internal/worker.js +++ b/lib/internal/worker.js @@ -393,7 +393,7 @@ class Worker extends EventEmitter { drainMessagePort(this[kPort]); destroyMainThreadPort(this.threadId); this.removeAllListeners('message'); - this.removeAllListeners('messageerrors'); + this.removeAllListeners('messageerror'); this[kPublicPort].unref(); this[kPort].unref(); this[kDispose](); diff --git a/test/parallel/test-worker-message-listeners-on-exit.js b/test/parallel/test-worker-message-listeners-on-exit.js new file mode 100644 index 000000000000..77262aa92281 --- /dev/null +++ b/test/parallel/test-worker-message-listeners-on-exit.js @@ -0,0 +1,42 @@ +'use strict'; + +const common = require('../common'); +const assert = require('node:assert'); +const { Worker } = require('node:worker_threads'); + +const results = []; + +function test(name, code, terminate) { + const worker = new Worker(code, { eval: true }); + + worker.on('message', common.mustNotCall()); + worker.on('messageerror', common.mustNotCall()); + + assert.strictEqual(worker.listenerCount('message'), 1); + assert.strictEqual(worker.listenerCount('messageerror'), 1); + + worker.on('exit', common.mustCall(() => { + results.push({ + name, + message: worker.listenerCount('message'), + messageerror: worker.listenerCount('messageerror'), + }); + + if (results.length === 2) { + results.sort((a, b) => a.name.localeCompare(b.name)); + assert.deepStrictEqual(results, [ + { name: 'normal', message: 0, messageerror: 0 }, + { name: 'terminated', message: 0, messageerror: 0 }, + ]); + } + })); + + if (terminate) { + worker.on('online', () => { + worker.terminate(); + }); + } +} + +test('normal', '', false); +test('terminated', 'setInterval(() => {}, 100);', true);