INNER CODE UNIT · TypeScript
TypedEventEmitter
open-gitagent/clawless · src/event-emitter.ts:3
export class TypedEventEmitter<T extends Record<string, unknown[]> = Record<string, unknown[]>> {
private handlers = new Map<keyof T, Set<(...args: any[]) => void>>();
on<K extends keyof T>(event: K, fn: (...args: T[K]) => void): void {
if (!this.handlers.has(event)) this.handlers.set(event, new Set());
this.handlers.get(event)!.add(fn);
}
off<K extends keyof T>(event: K, fn: (...args: T[K]) => void): void {
this.handlers.get(event)?.delete(fn);
}
once<K extends keyof T>(event: K, fn: (...args: T[K]) => void): void {
const wrapper = (...args: T[K]) => {
this.off(event, wrapper);
fn(...args);
};
this.on(event, wrapper);