/**
* Simple Event Bus implementation for pub/sub interactions
*/
export class EventBus {
constructor() {
this.listeners = {};
}
/**
* Subscribe to an event
* @param {string} event - Event name
* @param {Function} callback - Callback function
* @returns {Function} Unsubscribe function
*/
on(event, callback) {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event].push(callback);
// Return unsubscribe function
return () => this.off(event, callback);
}
/**
* Unsubscribe from an event
* @param {string} event - Event name
* @param {Function} callback - Callback function (optional, if omitted remove all for event)
*/
off(event, callback) {
if (!this.listeners[event]) return;
if (callback) {
this.listeners[event] = this.listeners[event].filter(cb => cb !== callback);
} else {
delete this.listeners[event];
}
}
/**
* Emit an event
* @param {string} event - Event name
* @param {any} data - Data to pass to listeners
*/
emit(event, data) {
if (!this.listeners[event]) return;
this.listeners[event].forEach(callback => {
try {
callback(data);
} catch (error) {
console.error(`Error in EventBus listener for ${event}:`, error);
}
});
}
/**
* Clear all listeners
*/
clear() {
this.listeners = {};
}
}
export default EventBus;