diff --git a/index.d.ts b/index.d.ts index b0c4653..25eff76 100644 --- a/index.d.ts +++ b/index.d.ts @@ -58,13 +58,35 @@ type Emitter = { */ listeners(event: string): Array<(...arguments_: any[]) => void>; + /** + Get the count of listeners for a specific event. + + @param event - The name of the event. + @returns The number of listeners for the event. + */ + listenerCount(event: string): number; // eslint-disable-line @typescript-eslint/unified-signatures + + /** + Get the count of all event handlers in total. + + @returns The total number of event handlers. + */ + listenerCount(): number; + /** Check if there are any handlers registered for a specific event. @param event - The name of the event. @returns `true` if there are one or more handlers, `false` otherwise. */ - hasListeners(event: string): boolean; + hasListeners(event: string): boolean; // eslint-disable-line @typescript-eslint/unified-signatures + + /** + Check if there are any handlers registered for any event. + + @returns `true` if there are one or more handlers for any event, `false` otherwise. + */ + hasListeners(): boolean; }; type EmitterConstructor = { diff --git a/index.js b/index.js index c0f99b3..0630110 100644 --- a/index.js +++ b/index.js @@ -78,8 +78,21 @@ Emitter.prototype.listeners = function (event) { return this._callbacks.get(event) ?? []; }; +Emitter.prototype.listenerCount = function (event) { + if (event) { + return this.listeners(event).length; + } + + let totalCount = 0; + for (const callbacks of this._callbacks.values()) { + totalCount += callbacks.length; + } + + return totalCount; +}; + Emitter.prototype.hasListeners = function (event) { - return this.listeners(event).length > 0; + return this.listenerCount(event) > 0; }; // Aliases diff --git a/readme.md b/readme.md index 418b97a..e4de421 100644 --- a/readme.md +++ b/readme.md @@ -73,10 +73,22 @@ Emit an event, invoking all handlers registered for it. Retrieve the event handlers registered for a specific event. +### Emitter#listenerCount(event) + +Get the count of listeners for a specific event. + +### Emitter#listenerCount() + +Get the count of all event handlers in total. + ### Emitter#hasListeners(event) Check if there are any handlers registered for a specific event. +### Emitter#hasListeners() + +Check if there are any handlers registered for any event. + ## FAQ ### How does it differ from the Node.js EventEmitter? diff --git a/test.js b/test.js index 42781c4..1251f9f 100644 --- a/test.js +++ b/test.js @@ -366,3 +366,48 @@ test('Alias methods should work as expected', t => { emitter.emit('foo'); t.false(isCalled); }); + +test('Emitter.listenerCount returns the correct count for a specific event', t => { + const emitter = new Emitter(); + + emitter.on('foo', () => {}); + emitter.on('foo', () => {}); + emitter.once('bar', () => {}); + + t.is(emitter.listenerCount('foo'), 2); + t.is(emitter.listenerCount('bar'), 1); + t.is(emitter.listenerCount('baz'), 0); +}); + +test('Emitter.listenerCount returns the correct count for all events', t => { + const emitter = new Emitter(); + + emitter.on('foo', () => {}); + emitter.on('bar', () => {}); + emitter.once('baz', () => {}); + + t.is(emitter.listenerCount(), 3); +}); + +test('Emitter.hasListeners returns true when there are listeners for a specific event', t => { + const emitter = new Emitter(); + + emitter.on('foo', () => {}); + emitter.on('bar', () => {}); + emitter.once('baz', () => {}); + + t.true(emitter.hasListeners('foo')); + t.true(emitter.hasListeners('bar')); + t.true(emitter.hasListeners('baz')); + t.false(emitter.hasListeners('qux')); +}); + +test('Emitter.hasListeners returns true when there are listeners for any event', t => { + const emitter = new Emitter(); + + emitter.on('foo', () => {}); + emitter.once('bar', () => {}); + emitter.once('baz', () => {}); + + t.true(emitter.hasListeners()); +});