export class EventEmitter { constructor() { this._events = {}; } on(event, listener) { if (!this._events[event]) { this._events[event] = []; } this._events[event].push(listener); return this; } once(event, listener) { const wrapped = (...args) => { this.removeListener(event, wrapped); listener.apply(this, args); }; wrapped._original = listener; return this.on(event, wrapped); } emit(event, ...args) { const listeners = this._events[event]; if (!listeners || listeners.length === 0) { return false; } for (const fn of [...listeners]) { fn.apply(this, args); } return true; } removeListener(event, listener) { const arr = this._events[event]; if (!arr) { return this; } const idx = arr.findIndex( (fn) => fn === listener || fn._original === listener, ); if (idx >= 0) { arr.splice(idx, 1); } return this; } off(event, listener) { return this.removeListener(event, listener); } removeAllListeners(event) { if (event) { delete this._events[event]; } else { this._events = {}; } return this; } listeners(event) { return (this._events[event] || []).slice(); } listenerCount(event) { return (this._events[event] || []).length; } addListener(event, listener) { return this.on(event, listener); } prependListener(event, listener) { if (!this._events[event]) { this._events[event] = []; } this._events[event].unshift(listener); return this; } eventNames() { return Object.keys(this._events); } setMaxListeners() { return this; } getMaxListeners() { return 10; } } export default EventEmitter;