Skip to content

Commit

Permalink
Add .listenerCount() method
Browse files Browse the repository at this point in the history
Fixes #58
  • Loading branch information
sindresorhus committed Nov 17, 2023
1 parent c9eae52 commit 3340972
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 2 deletions.
24 changes: 23 additions & 1 deletion index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down
15 changes: 14 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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?
Expand Down
45 changes: 45 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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());
});

0 comments on commit 3340972

Please sign in to comment.