UNPKG

@ingridsandev/chatbot-widget

Version:

A framework-agnostic chatbot widget using Web Components

91 lines (71 loc) 1.84 kB
import logger from './logger.js'; class EventEmitter { constructor() { this.events = {}; this.maxListeners = 10; } on(event, listener) { if (typeof listener !== 'function') { throw new TypeError('Listener must be a function'); } if (!this.events[event]) { this.events[event] = []; } if (this.events[event].length >= this.maxListeners) { logger.warn(`MaxListenersExceededWarning: Possible EventEmitter memory leak detected. ${this.events[event].length + 1} ${event} listeners added.`); } this.events[event].push(listener); return this; } off(event, listener) { if (!this.events[event]) return this; if (!listener) { delete this.events[event]; return this; } this.events[event] = this.events[event].filter(l => l !== listener); if (this.events[event].length === 0) { delete this.events[event]; } return this; } emit(event, data) { if (!this.events[event]) return false; const listeners = [...this.events[event]]; for (const listener of listeners) { try { listener(data); } catch (error) { logger.error(`Error in event listener for "${event}":`, error); } } return true; } once(event, listener) { const onceListener = (data) => { try { listener(data); } finally { this.off(event, onceListener); } }; this.on(event, onceListener); return this; } removeAllListeners(event) { if (event) { delete this.events[event]; } else { this.events = {}; } return this; } listenerCount(event) { return this.events[event] ? this.events[event].length : 0; } setMaxListeners(n) { this.maxListeners = n; return this; } } export default EventEmitter;