@codervisor/devlog-core
Version:
Core devlog management functionality
92 lines (91 loc) • 2.72 kB
JavaScript
/**
* Simple event emitter for devlog operations
*/
export class DevlogEventEmitter {
handlers = new Map();
/**
* Subscribe to devlog events
*/
on(eventType, handler) {
if (!this.handlers.has(eventType)) {
this.handlers.set(eventType, new Set());
}
const handlers = this.handlers.get(eventType);
if (handlers) {
handlers.add(handler);
}
}
/**
* Unsubscribe from devlog events
*/
off(eventType, handler) {
const handlers = this.handlers.get(eventType);
if (handlers) {
handlers.delete(handler);
if (handlers.size === 0) {
this.handlers.delete(eventType);
}
}
}
/**
* Emit a devlog event to all subscribers
*/
async emit(event) {
const handlers = this.handlers.get(event.type);
console.log(`[DevlogEventEmitter] Emitting ${event.type} to ${handlers?.size || 0} handlers`);
if (handlers) {
// Execute all handlers in parallel
await Promise.allSettled(Array.from(handlers).map((handler) => {
try {
return Promise.resolve(handler(event));
}
catch (error) {
console.error(`Error in devlog event handler for ${event.type}:`, error);
return Promise.resolve();
}
}));
}
}
/**
* Get count of handlers for debugging
*/
getHandlerCount(eventType) {
if (eventType) {
return this.handlers.get(eventType)?.size || 0;
}
return Array.from(this.handlers.values()).reduce((sum, set) => sum + set.size, 0);
}
/**
* Clear all handlers (useful for testing)
*/
clear() {
this.handlers.clear();
}
/**
* Get instance identifier for debugging
*/
getInstanceId() {
return `DevlogEventEmitter@${this.constructor.name}_${Date.now()}`;
}
}
/**
* Singleton pattern for global event emitter
* Ensures single instance across all imports in the application
*/
let globalDevlogEvents = null;
/**
* Get the singleton instance of DevlogEventEmitter
* This ensures all parts of the application use the same event emitter instance
*/
export function getDevlogEvents() {
if (!globalDevlogEvents) {
globalDevlogEvents = new DevlogEventEmitter();
console.log('[DevlogEvents] Created singleton instance');
}
return globalDevlogEvents;
}
/**
* Global event emitter instance
* @deprecated Use getDevlogEvents() function instead to ensure singleton behavior
*/
export const devlogEvents = getDevlogEvents();