@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
JavaScript
;
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;