diff --git a/src/game/EventEmitter.ts b/src/game/EventEmitter.ts index d8684be..b5a99b1 100644 --- a/src/game/EventEmitter.ts +++ b/src/game/EventEmitter.ts @@ -1,13 +1,11 @@ -// src/game/EventEmitter.ts - Typed event emitter wrapper +// src/game/EventEmitter.ts - Typed event emitter (browser-compatible) /** - * TypedEventEmitter provides a type-safe wrapper around Node's EventEmitter. - * It ensures event names and payloads are correctly typed. + * TypedEventEmitter provides a type-safe event system that works in browsers. + * Custom implementation - no Node.js dependencies. */ -import { EventEmitter } from 'events'; - export class TypedEventEmitter { - private emitter = new EventEmitter(); + private listeners = new Map void>>(); /** * Register a listener for an event @@ -16,7 +14,10 @@ export class TypedEventEmitter { * @returns this for chaining */ on(event: K, listener: (data: T[K]) => void): this { - this.emitter.on(event as string, listener); + if (!this.listeners.has(event)) { + this.listeners.set(event, new Set()); + } + this.listeners.get(event)!.add(listener as (data: T[keyof T]) => void); return this; } @@ -27,8 +28,11 @@ export class TypedEventEmitter { * @returns this for chaining */ once(event: K, listener: (data: T[K]) => void): this { - this.emitter.once(event as string, listener); - return this; + const onceWrapper = (data: T[K]) => { + this.off(event, onceWrapper); + listener(data); + }; + return this.on(event, onceWrapper); } /** @@ -38,7 +42,12 @@ export class TypedEventEmitter { * @returns true if listeners were called, false otherwise */ emit(event: K, data: T[K]): boolean { - return this.emitter.emit(event as string, data); + const eventListeners = this.listeners.get(event); + if (!eventListeners || eventListeners.size === 0) { + return false; + } + eventListeners.forEach(listener => listener(data as T[keyof T])); + return true; } /** @@ -48,7 +57,10 @@ export class TypedEventEmitter { * @returns this for chaining */ off(event: K, listener: (data: T[K]) => void): this { - this.emitter.off(event as string, listener); + const eventListeners = this.listeners.get(event); + if (eventListeners) { + eventListeners.delete(listener as (data: T[keyof T]) => void); + } return this; } @@ -58,7 +70,7 @@ export class TypedEventEmitter { * @returns this for chaining */ removeAllListeners(event: K): this { - this.emitter.removeAllListeners(event as string); + this.listeners.delete(event); return this; } }