Skip to content

Commit 3340972

Browse files
committedNov 17, 2023
Add .listenerCount() method
Fixes #58
1 parent c9eae52 commit 3340972

File tree

4 files changed

+94
-2
lines changed

4 files changed

+94
-2
lines changed
 

‎index.d.ts

+23-1
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,35 @@ type Emitter = {
5858
*/
5959
listeners(event: string): Array<(...arguments_: any[]) => void>;
6060

61+
/**
62+
Get the count of listeners for a specific event.
63+
64+
@param event - The name of the event.
65+
@returns The number of listeners for the event.
66+
*/
67+
listenerCount(event: string): number; // eslint-disable-line @typescript-eslint/unified-signatures
68+
69+
/**
70+
Get the count of all event handlers in total.
71+
72+
@returns The total number of event handlers.
73+
*/
74+
listenerCount(): number;
75+
6176
/**
6277
Check if there are any handlers registered for a specific event.
6378
6479
@param event - The name of the event.
6580
@returns `true` if there are one or more handlers, `false` otherwise.
6681
*/
67-
hasListeners(event: string): boolean;
82+
hasListeners(event: string): boolean; // eslint-disable-line @typescript-eslint/unified-signatures
83+
84+
/**
85+
Check if there are any handlers registered for any event.
86+
87+
@returns `true` if there are one or more handlers for any event, `false` otherwise.
88+
*/
89+
hasListeners(): boolean;
6890
};
6991

7092
type EmitterConstructor = {

‎index.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,21 @@ Emitter.prototype.listeners = function (event) {
7878
return this._callbacks.get(event) ?? [];
7979
};
8080

81+
Emitter.prototype.listenerCount = function (event) {
82+
if (event) {
83+
return this.listeners(event).length;
84+
}
85+
86+
let totalCount = 0;
87+
for (const callbacks of this._callbacks.values()) {
88+
totalCount += callbacks.length;
89+
}
90+
91+
return totalCount;
92+
};
93+
8194
Emitter.prototype.hasListeners = function (event) {
82-
return this.listeners(event).length > 0;
95+
return this.listenerCount(event) > 0;
8396
};
8497

8598
// Aliases

‎readme.md

+12
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,22 @@ Emit an event, invoking all handlers registered for it.
7373

7474
Retrieve the event handlers registered for a specific event.
7575

76+
### Emitter#listenerCount(event)
77+
78+
Get the count of listeners for a specific event.
79+
80+
### Emitter#listenerCount()
81+
82+
Get the count of all event handlers in total.
83+
7684
### Emitter#hasListeners(event)
7785

7886
Check if there are any handlers registered for a specific event.
7987

88+
### Emitter#hasListeners()
89+
90+
Check if there are any handlers registered for any event.
91+
8092
## FAQ
8193

8294
### How does it differ from the Node.js EventEmitter?

‎test.js

+45
Original file line numberDiff line numberDiff line change
@@ -366,3 +366,48 @@ test('Alias methods should work as expected', t => {
366366
emitter.emit('foo');
367367
t.false(isCalled);
368368
});
369+
370+
test('Emitter.listenerCount returns the correct count for a specific event', t => {
371+
const emitter = new Emitter();
372+
373+
emitter.on('foo', () => {});
374+
emitter.on('foo', () => {});
375+
emitter.once('bar', () => {});
376+
377+
t.is(emitter.listenerCount('foo'), 2);
378+
t.is(emitter.listenerCount('bar'), 1);
379+
t.is(emitter.listenerCount('baz'), 0);
380+
});
381+
382+
test('Emitter.listenerCount returns the correct count for all events', t => {
383+
const emitter = new Emitter();
384+
385+
emitter.on('foo', () => {});
386+
emitter.on('bar', () => {});
387+
emitter.once('baz', () => {});
388+
389+
t.is(emitter.listenerCount(), 3);
390+
});
391+
392+
test('Emitter.hasListeners returns true when there are listeners for a specific event', t => {
393+
const emitter = new Emitter();
394+
395+
emitter.on('foo', () => {});
396+
emitter.on('bar', () => {});
397+
emitter.once('baz', () => {});
398+
399+
t.true(emitter.hasListeners('foo'));
400+
t.true(emitter.hasListeners('bar'));
401+
t.true(emitter.hasListeners('baz'));
402+
t.false(emitter.hasListeners('qux'));
403+
});
404+
405+
test('Emitter.hasListeners returns true when there are listeners for any event', t => {
406+
const emitter = new Emitter();
407+
408+
emitter.on('foo', () => {});
409+
emitter.once('bar', () => {});
410+
emitter.once('baz', () => {});
411+
412+
t.true(emitter.hasListeners());
413+
});

0 commit comments

Comments
 (0)
Please sign in to comment.