Add off callback to EventEmitter on methods

This commit is contained in:
Jim Hamill
2025-04-24 08:09:54 +00:00
parent 69889509fd
commit 87607b40b9
+10 -4
View File
@@ -11,6 +11,8 @@ interface ListenerEntry<T> {
once?: boolean;
}
export type OffCallback = () => void;
export class EventEmitter<T extends EventMap> {
private listeners: Map<keyof T, Set<ListenerEntry<T[keyof T]>>> = new Map();
@@ -18,7 +20,7 @@ export class EventEmitter<T extends EventMap> {
type: K,
listener: Listener<T[K]>,
debounceMilliseconds?: number,
): Listener<T[K]> {
): OffCallback {
const wrappedListener =
debounceMilliseconds && debounceMilliseconds > 0
? this.debounce(listener, debounceMilliseconds)
@@ -35,14 +37,16 @@ export class EventEmitter<T extends EventMap> {
};
this.listeners.get(type)?.add(listenerEntry as ListenerEntry<T[keyof T]>);
return listener;
// Return an "off" callback that can be called to stop listening for events.
return () => this.off(type, listener);
}
once<K extends keyof T>(
type: K,
listener: Listener<T[K]>,
debounceMilliseconds?: number,
): Listener<T[K]> {
): OffCallback {
const wrappedListener: Listener<T[K]> = (detail: T[K]) => {
this.off(type, listener);
listener(detail);
@@ -65,7 +69,9 @@ export class EventEmitter<T extends EventMap> {
};
this.listeners.get(type)?.add(listenerEntry as ListenerEntry<T[keyof T]>);
return listener;
// Return an "off" callback that can be called to stop listening for events.
return () => this.off(type, listener);
}
off<K extends keyof T>(type: K, listener: Listener<T[K]>): void {