Ignore errors thrown by listeners

This commit is contained in:
2026-08-10 02:04:30 +00:00
parent e782cace36
commit 26602dc156
2 changed files with 24 additions and 1 deletions
+19
View File
@@ -89,6 +89,24 @@ const testEventEmitterEmitReturnsTrueWithListeners = (): void => {
expect(hasListeners).toBe(true);
};
/**
* Tests that EventEmitter.emit continues after a listener throws an error.
*/
const testEventEmitterEmitContinuesAfterListenerThrows = (): void => {
const emitter = new EventEmitter<TestEvents>();
const secondListener = vi.fn();
emitter.on('message', (): void => {
throw new Error('listener failure');
});
emitter.on('message', secondListener);
emitter.emit('message', 'hello');
expect(secondListener).toHaveBeenCalledOnce();
expect(secondListener).toHaveBeenCalledWith('hello');
};
/**
* Tests that emitted events cannot be mutated.
*/
@@ -666,6 +684,7 @@ const runTests = async (): Promise<void> => {
test('EventEmitter: only calls listeners for the emitted event type', testEventEmitterCallsOnlyMatchingListeners);
test('EventEmitter: returns false when emitting with no listeners', testEventEmitterEmitReturnsFalseWithNoListeners);
test('EventEmitter: returns true when emitting with listeners', testEventEmitterEmitReturnsTrueWithListeners);
test('EventEmitter: continues after a listener throws an error', testEventEmitterEmitContinuesAfterListenerThrows);
test('EventEmitter: emitted events cannot be mutated', testEventEmitterEmittedEventsCannotBeMutated);
test('EventEmitter: stops calling a listener after its off callback is invoked', testEventEmitterOffCallbackRemovesListener);
test('EventEmitter: removes a listener when off is called with the same reference', testEventEmitterOffRemovesListenerByReference);