diff --git a/packages/stack/src/utils/event-emitter.ts b/packages/stack/src/utils/event-emitter.ts index 62add96..6321530 100644 --- a/packages/stack/src/utils/event-emitter.ts +++ b/packages/stack/src/utils/event-emitter.ts @@ -11,6 +11,8 @@ interface ListenerEntry { once?: boolean; } +export type OffCallback = () => void; + export class EventEmitter { private listeners: Map>> = new Map(); @@ -18,7 +20,7 @@ export class EventEmitter { type: K, listener: Listener, debounceMilliseconds?: number, - ): Listener { + ): OffCallback { const wrappedListener = debounceMilliseconds && debounceMilliseconds > 0 ? this.debounce(listener, debounceMilliseconds) @@ -35,14 +37,16 @@ export class EventEmitter { }; this.listeners.get(type)?.add(listenerEntry as ListenerEntry); - return listener; + + // Return an "off" callback that can be called to stop listening for events. + return () => this.off(type, listener); } once( type: K, listener: Listener, debounceMilliseconds?: number, - ): Listener { + ): OffCallback { const wrappedListener: Listener = (detail: T[K]) => { this.off(type, listener); listener(detail); @@ -65,7 +69,9 @@ export class EventEmitter { }; this.listeners.get(type)?.add(listenerEntry as ListenerEntry); - return listener; + + // Return an "off" callback that can be called to stop listening for events. + return () => this.off(type, listener); } off(type: K, listener: Listener): void {