test: ensure removeListener event fires for once() listeners · nodejs/node@41710ba

2 files changed

lines changed

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
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+

}