Skip to content

Commit

Permalink
events: make #once unwrapping optional
Browse files Browse the repository at this point in the history
De-semver-major-ify by only unwrapping the listeners when a flag
has been passed.
  • Loading branch information
addaleax committed May 27, 2016
1 parent b8a10d0 commit cd0a542
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 9 deletions.
8 changes: 7 additions & 1 deletion doc/api/events.md
Original file line number Diff line number Diff line change
Expand Up @@ -305,9 +305,15 @@ set by [`emitter.setMaxListeners(n)`][] or defaults to

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

### emitter.listeners(eventName)
### emitter.listeners(eventName[, unwrapOnceListeners])

* `eventName` {string|Symbol} The name of the event.
* `unwrapOnceListeners` {Boolean} Flag indicating whether to unwrap listeners
attached via `.once()`.

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

```js
server.on('connection', (stream) => {
Expand Down
19 changes: 13 additions & 6 deletions lib/events.js
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ EventEmitter.prototype.removeAllListeners =
return this;
};

EventEmitter.prototype.listeners = function listeners(type) {
EventEmitter.prototype.listeners = function listeners(type, unwrap) {
var evlistener;
var ret;
var events = this._events;
Expand All @@ -422,12 +422,19 @@ EventEmitter.prototype.listeners = function listeners(type) {
ret = [];
else {
evlistener = events[type];
if (!evlistener)
if (!evlistener) {
ret = [];
else if (typeof evlistener === 'function')
ret = [evlistener.listener || evlistener];
else
ret = unwrapListeners(evlistener);
} else if (typeof evlistener === 'function') {
if (unwrap)
ret = [evlistener.listener || evlistener];
else
ret = [evlistener];
} else {
if (unwrap)
ret = unwrapListeners(evlistener);
else
ret = arrayClone(evlistener, evlistener.length);
}
}

return ret;
Expand Down
19 changes: 17 additions & 2 deletions test/parallel/test-event-emitter-listeners.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,27 @@ function listener2() {}
{
const ee = new events.EventEmitter();
ee.once('foo', listener);
assert.deepStrictEqual(ee.listeners('foo'), [listener]);
assert.deepStrictEqual(ee.listeners('foo').map((fn) => fn.listener || fn),
[listener]);
}

{
const ee = new events.EventEmitter();
ee.once('foo', listener);
assert.deepStrictEqual(ee.listeners('foo', true), [listener]);
}

{
const ee = new events.EventEmitter();
ee.on('foo', listener);
ee.once('foo', listener2);
assert.deepStrictEqual(ee.listeners('foo'), [listener, listener2]);
assert.deepStrictEqual(ee.listeners('foo').map((fn) => fn.listener || fn),
[listener, listener2]);
}

{
const ee = new events.EventEmitter();
ee.on('foo', listener);
ee.once('foo', listener2);
assert.deepStrictEqual(ee.listeners('foo', true), [listener, listener2]);
}

0 comments on commit cd0a542

Please sign in to comment.