From 86e0d2e7a05af1ae95c85ef727952f7d0cfd32ec Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Tue, 10 Mar 2026 23:47:55 +0700 Subject: [PATCH] feat(01-02): implement TypedEventEmitter class - Generic class wrapping Node's EventEmitter - Type-safe on(), emit(), off() methods - Added once() and removeAllListeners() methods - Returns this for method chaining Co-Authored-By: Claude Opus 4.6 --- src/game/EventEmitter.ts | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/game/EventEmitter.ts diff --git a/src/game/EventEmitter.ts b/src/game/EventEmitter.ts new file mode 100644 index 0000000..6f6b09c --- /dev/null +++ b/src/game/EventEmitter.ts @@ -0,0 +1,64 @@ +// src/game/EventEmitter.ts - Typed event emitter wrapper +/** + * TypedEventEmitter provides a type-safe wrapper around Node's EventEmitter. + * It ensures event names and payloads are correctly typed. + */ + +import { EventEmitter } from 'events'; + +export class TypedEventEmitter> { + private emitter = new EventEmitter(); + + /** + * Register a listener for an event + * @param event - The event name (type-safe) + * @param listener - The callback function (payload is type-safe) + * @returns this for chaining + */ + on(event: K, listener: (data: T[K]) => void): this { + this.emitter.on(event as string, listener); + return this; + } + + /** + * Register a one-time listener for an event + * @param event - The event name (type-safe) + * @param listener - The callback function (payload is type-safe) + * @returns this for chaining + */ + once(event: K, listener: (data: T[K]) => void): this { + this.emitter.once(event as string, listener); + return this; + } + + /** + * Emit an event with payload + * @param event - The event name (type-safe) + * @param data - The payload (type-safe) + * @returns true if listeners were called, false otherwise + */ + emit(event: K, data: T[K]): boolean { + return this.emitter.emit(event as string, data); + } + + /** + * Remove a specific listener for an event + * @param event - The event name (type-safe) + * @param listener - The callback function to remove + * @returns this for chaining + */ + off(event: K, listener: (data: T[K]) => void): this { + this.emitter.off(event as string, listener); + return this; + } + + /** + * Remove all listeners for an event + * @param event - The event name (type-safe) + * @returns this for chaining + */ + removeAllListeners(event: K): this { + this.emitter.removeAllListeners(event as string); + return this; + } +}