import EventRecord from "./EventRecord.js"; export default class EventContainer { private events: { [K in keyof E]?: E[K][] } = {}; public on(eventName: K, eventHandler: E[K]): this { if (!this.events[eventName]) this.events[eventName] = []; this.events[eventName]!.push(eventHandler); return this; } public off(eventName: K, eventHandler?: E[K]): this { const events = this.events[eventName]; if (!events) return this; if (!eventHandler) { delete this.events[eventName]; } else { const index = events.indexOf(eventHandler); if (index !== -1) events.splice(index, 1); if (events.length === 0) delete this.events[eventName]; } return this; } protected hasEvent(eventName: K): boolean { const events = this.events[eventName]; if (!events) return false; return events.length > 0; } protected async emit( eventName: K, ...args: Parameters ): Promise[]> { const events = this.events[eventName]; if (!events) return []; const results: ReturnType[] = []; const promises: Promise>[] = []; for (const handler of events) { const result = handler(...args); if (result instanceof Promise) { promises.push(result); } else { results.push(result); } } return results.concat(await Promise.all(promises)); } protected clearEvents(): void { delete (this as any).events; } }