@ingridsandev/chatbot-widget
Version:
A framework-agnostic chatbot widget using Web Components
91 lines (71 loc) • 1.84 kB
JavaScript
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;