Skip to content

Commit 0a952b8

Browse files
Han5991aduh95
authored andcommitted
test: ensure removeListener event fires for once() listeners
Adds test coverage for the removeListener event being emitted when a once() listener is automatically removed after execution. This verifies that streams and other EventEmitters correctly emit removeListener events when once() wrappers clean up. PR-URL: #60137 Fixes: #59977 Reviewed-By: Aviv Keller <[email protected]> Reviewed-By: Chemi Atlow <[email protected]> Reviewed-By: Rafael Gonzaga <[email protected]> Reviewed-By: Gürgün Dayıoğlu <[email protected]>
1 parent a782598 commit 0a952b8

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

lib/events.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -687,9 +687,10 @@ EventEmitter.prototype.removeListener =
687687
this._events = { __proto__: null };
688688
} else {
689689
delete events[type];
690-
if (events.removeListener)
691-
this.emit('removeListener', type, list.listener || listener);
692690
}
691+
692+
if (events.removeListener !== undefined)
693+
this.emit('removeListener', type, list.listener || listener);
693694
} else if (typeof list !== 'function') {
694695
let position = -1;
695696

test/parallel/test-event-emitter-remove-listeners.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,19 @@ function listener2() {}
168168
ee.removeListener('foo', listener1);
169169
assert.strictEqual(ee._events.foo, listener2);
170170
}
171+
172+
{
173+
const { Writable } = require('stream');
174+
const stream = new Writable({
175+
write(chunk, encoding, callback) {
176+
callback();
177+
}
178+
});
179+
180+
stream.on('removeListener', common.mustCall((eventName, listener) => {
181+
assert.strictEqual(eventName, 'finish');
182+
}));
183+
184+
stream.once('finish', common.mustCall());
185+
stream.end();
186+
}

0 commit comments

Comments
 (0)