parent
cc56795ca3
commit
a987fd10ed
@ -0,0 +1,37 @@
|
||||
import { TIMER_DIAGNOSTIC_EVENTS } from './consts.ts';
|
||||
import { emitTimerDiagnostic, type TimerDiagnostics } from './diagnostics.ts';
|
||||
import type { TimerEvent, TimerListener } from './types.ts';
|
||||
|
||||
export interface TimerEventBus {
|
||||
emit(event: TimerEvent): void;
|
||||
on(listener: TimerListener): () => void;
|
||||
clear(): void;
|
||||
}
|
||||
|
||||
export function createTimerEventBus(diagnostics: TimerDiagnostics): TimerEventBus {
|
||||
const listeners = new Set<TimerListener>();
|
||||
|
||||
return {
|
||||
emit(event) {
|
||||
for (const listener of listeners) {
|
||||
try {
|
||||
listener(event);
|
||||
} catch (err) {
|
||||
emitTimerDiagnostic(diagnostics, TIMER_DIAGNOSTIC_EVENTS.LISTENER_THREW, {
|
||||
error: err,
|
||||
event: event.type
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
on(listener) {
|
||||
listeners.add(listener);
|
||||
return () => {
|
||||
listeners.delete(listener);
|
||||
};
|
||||
},
|
||||
clear() {
|
||||
listeners.clear();
|
||||
}
|
||||
};
|
||||
}
|
||||
Loading…
Reference in new issue