UNPKG

@dataql/node

Version:

DataQL core SDK for unified data management with MongoDB and GraphQL - Production Multi-Cloud Ready

104 lines (103 loc) 2.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PluginEventEmitter = void 0; /** * Event system implementation for DataQL plugins * * Provides a simple but powerful event system that allows plugins * to communicate with each other and react to DataQL events. */ class PluginEventEmitter { constructor() { this.eventListeners = new Map(); } /** * Emit an event to all listeners */ emit(event, data) { const listeners = this.eventListeners.get(event); if (!listeners || listeners.length === 0) { return; } // Call all listeners with the event data for (const listener of listeners) { try { listener(data); } catch (error) { console.error(`Error in event listener for ${event}:`, error); } } } /** * Add an event listener */ on(event, handler) { if (!this.eventListeners.has(event)) { this.eventListeners.set(event, []); } this.eventListeners.get(event).push(handler); } /** * Add a one-time event listener */ once(event, handler) { const onceWrapper = (data) => { handler(data); this.off(event, onceWrapper); }; this.on(event, onceWrapper); } /** * Remove an event listener */ off(event, handler) { const listeners = this.eventListeners.get(event); if (!listeners) { return; } if (!handler) { // Remove all listeners for this event this.eventListeners.delete(event); return; } // Remove specific listener const index = listeners.indexOf(handler); if (index !== -1) { listeners.splice(index, 1); } // Clean up empty listener arrays if (listeners.length === 0) { this.eventListeners.delete(event); } } /** * Get all listeners for an event */ listeners(event) { return this.eventListeners.get(event) || []; } /** * Get all events that have listeners */ eventNames() { return Array.from(this.eventListeners.keys()); } /** * Get the total number of listeners across all events */ listenerCount() { let count = 0; for (const listeners of this.eventListeners.values()) { count += listeners.length; } return count; } /** * Clear all listeners */ removeAllListeners() { this.eventListeners.clear(); } } exports.PluginEventEmitter = PluginEventEmitter;