interface EventCallback { (...args: any[]): any } class EventBus { private listeners: Map = new Map() on(eventName: E, callback: EventCallback) { const callbacks = this.listeners.get(eventName) if (callbacks) { callbacks.push(callback) } else { this.listeners.set(eventName, [callback]) } } emit(eventName: E, data?: T) { const callbacks = this.listeners.get(eventName) if (callbacks) { callbacks.forEach((callback) => { callback(data) }) } } } let eventBusInstance: EventBus | null = null function createEventBus() { if (!eventBusInstance) { eventBusInstance = new EventBus() } return eventBusInstance as EventBus } export { createEventBus }