Skip to content

Commit cd0a542

Browse files
committed
events: make #once unwrapping optional
De-semver-major-ify by only unwrapping the listeners when a flag has been passed.
1 parent b8a10d0 commit cd0a542

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

doc/api/events.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,15 @@ set by [`emitter.setMaxListeners(n)`][] or defaults to
305305

306306
Returns the number of listeners listening to the event named `eventName`.
307307

308-
### emitter.listeners(eventName)
308+
### emitter.listeners(eventName[, unwrapOnceListeners])
309+
310+
* `eventName` {string|Symbol} The name of the event.
311+
* `unwrapOnceListeners` {Boolean} Flag indicating whether to unwrap listeners
312+
attached via `.once()`.
309313

310314
Returns a copy of the array of listeners for the event named `eventName`.
315+
If `unwrapOnceListeners` is set to `true`, listeners that were attached
316+
using `.once()` are returned as they were originally passed to `.once()`.
311317

312318
```js
313319
server.on('connection', (stream) => {

lib/events.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ EventEmitter.prototype.removeAllListeners =
413413
return this;
414414
};
415415

416-
EventEmitter.prototype.listeners = function listeners(type) {
416+
EventEmitter.prototype.listeners = function listeners(type, unwrap) {
417417
var evlistener;
418418
var ret;
419419
var events = this._events;
@@ -422,12 +422,19 @@ EventEmitter.prototype.listeners = function listeners(type) {
422422
ret = [];
423423
else {
424424
evlistener = events[type];
425-
if (!evlistener)
425+
if (!evlistener) {
426426
ret = [];
427-
else if (typeof evlistener === 'function')
428-
ret = [evlistener.listener || evlistener];
429-
else
430-
ret = unwrapListeners(evlistener);
427+
} else if (typeof evlistener === 'function') {
428+
if (unwrap)
429+
ret = [evlistener.listener || evlistener];
430+
else
431+
ret = [evlistener];
432+
} else {
433+
if (unwrap)
434+
ret = unwrapListeners(evlistener);
435+
else
436+
ret = arrayClone(evlistener, evlistener.length);
437+
}
431438
}
432439

433440
return ret;

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,27 @@ function listener2() {}
4040
{
4141
const ee = new events.EventEmitter();
4242
ee.once('foo', listener);
43-
assert.deepStrictEqual(ee.listeners('foo'), [listener]);
43+
assert.deepStrictEqual(ee.listeners('foo').map((fn) => fn.listener || fn),
44+
[listener]);
45+
}
46+
47+
{
48+
const ee = new events.EventEmitter();
49+
ee.once('foo', listener);
50+
assert.deepStrictEqual(ee.listeners('foo', true), [listener]);
4451
}
4552

4653
{
4754
const ee = new events.EventEmitter();
4855
ee.on('foo', listener);
4956
ee.once('foo', listener2);
50-
assert.deepStrictEqual(ee.listeners('foo'), [listener, listener2]);
57+
assert.deepStrictEqual(ee.listeners('foo').map((fn) => fn.listener || fn),
58+
[listener, listener2]);
59+
}
60+
61+
{
62+
const ee = new events.EventEmitter();
63+
ee.on('foo', listener);
64+
ee.once('foo', listener2);
65+
assert.deepStrictEqual(ee.listeners('foo', true), [listener, listener2]);
5166
}

0 commit comments

Comments
 (0)