class EventBus{ constructor(){ this.listeners = {} } on(eventName, callback){ if(!this.listeners[eventName]){ this.listeners[eventName] = []; } this.listeners[eventName].push(callback); return ()=>{ this.off(eventName, callback); } } emit(eventName, data){ if(!this.listeners[eventName]){ return; } this.listeners[eventName].forEach((callback)=>{ callback(data); }) } async emitAsync(eventName, data){ if(!this.listeners[eventName]){ return Promise.resolve(); } const callBackPromises = this.listeners[eventName].map((callback)=>{ return Promise.resolve(callback(data)); }) await Promise.all(callBackPromises); } off(eventName, callback){ if(!this.listeners[eventName]){ return; } this.listeners[eventName] = this.listeners[eventName].filter(listener => listener !== callback); } }