import { OkxEvents, OkxEventPayloadMap } from '.'; export type OkxEventHandler = (payload: OkxEventPayloadMap[T]) => void; export type OkxEventListener = T extends OkxEvents ? { event: T; handler: OkxEventHandler } : never; export type OkxEventListeners = OkxEventListener[]; export interface OkxEventEmitter { on(listener: OkxEventListener): void; off(listener: OkxEventListener): void; emit(event: T, payload: OkxEventPayloadMap[T]): void; } export class SimpleOkxEventEmitter implements OkxEventEmitter { private subscriptions: { [key: string]: OkxEventHandler[]; // Use generic parameter for listener type } = {}; on(listener: OkxEventListener): void { const { event, handler } = listener; if (!this.subscriptions[event]) { this.subscriptions[event] = []; } this.subscriptions[event].push(handler); } off(listener: OkxEventListener): void { const { event, handler } = listener; if (this.subscriptions[event]) { this.subscriptions[event] = this.subscriptions[event].filter( listener => listener !== handler, ); } } emit(event: T, payload: OkxEventPayloadMap[T]): void { if (this.subscriptions[event]) { this.subscriptions[event].forEach(handler => { console.log('emit', event, payload); handler(payload); }); } } }