From b6e3fa745b6fae14d05a9a9ae840dd1506ad2dc1 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Tue, 8 Mar 2016 21:29:38 -0800 Subject: [PATCH] events: add eventNames() method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per https://github.com/nodejs/node/issues/1817, there are many modules that currently abuse the private `_events` property on EventEmitter. One of the ways it is used is to determine if a particular event is being listened for. This adds a simple `eventNames()` method that returns an array of the events with currently registered listeners. PR-URL: https://github.com/nodejs/node/pull/5617 Reviewed-By: Brian White Reviewed-By: Сковорода Никита Андреевич Reviewed-By: Sakthipriyan Vairamani --- doc/api/events.markdown | 18 ++++++++++++++++++ lib/events.js | 9 +++++++++ test/parallel/test-events-list.js | 19 +++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 test/parallel/test-events-list.js diff --git a/doc/api/events.markdown b/doc/api/events.markdown index 797b969ecc2824..a1dd8a4fbd9f84 100644 --- a/doc/api/events.markdown +++ b/doc/api/events.markdown @@ -295,6 +295,24 @@ they were registered, passing the supplied arguments to each. Returns `true` if event had listeners, `false` otherwise. +### emitter.eventNames() + +Returns an array listing the events for which the emitter has registered +listeners. The values in the array will be strings or Symbols. + +```js +const EventEmitter = require('events'); +const myEE = new EventEmitter(); +myEE.on('foo', () => {}); +myEE.on('bar', () => {}); + +const sym = Symbol('symbol'); +myEE.on(sym, () => {}); + +console.log(myErr.eventNames()); + // Prints ['foo', 'bar', Symbol('symbol')] +``` + ### emitter.getMaxListeners() Returns the current max listener value for the `EventEmitter` which is either diff --git a/lib/events.js b/lib/events.js index 5860254654d8f1..7103ec393fca73 100644 --- a/lib/events.js +++ b/lib/events.js @@ -436,6 +436,15 @@ function listenerCount(type) { return 0; } +EventEmitter.prototype.eventNames = function eventNames() { + if (this._eventsCount > 0) { + const events = this._events; + return Object.keys(events).concat( + Object.getOwnPropertySymbols(events)); + } + return []; +}; + // About 1.5x faster than the two-arg version of Array#splice(). function spliceOne(list, index) { for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) diff --git a/test/parallel/test-events-list.js b/test/parallel/test-events-list.js new file mode 100644 index 00000000000000..4e589b07f2d60c --- /dev/null +++ b/test/parallel/test-events-list.js @@ -0,0 +1,19 @@ +'use strict'; + +require('../common'); +const EventEmitter = require('events'); +const assert = require('assert'); + +const EE = new EventEmitter(); +const m = () => {}; +EE.on('foo', () => {}); +assert.deepStrictEqual(['foo'], EE.eventNames()); +EE.on('bar', m); +assert.deepStrictEqual(['foo', 'bar'], EE.eventNames()); +EE.removeListener('bar', m); +assert.deepStrictEqual(['foo'], EE.eventNames()); +const s = Symbol('s'); +EE.on(s, m); +assert.deepStrictEqual(['foo', s], EE.eventNames()); +EE.removeListener(s, m); +assert.deepStrictEqual(['foo'], EE.eventNames());