claude-flow-novice
Version:
Claude Flow Novice - Advanced orchestration platform for multi-agent AI workflows with CFN Loop architecture Includes Local RuVector Accelerator and all CFN skills for complete functionality.
136 lines (135 loc) • 3.78 kB
JavaScript
/**
* Event bus implementation for Claude-Flow
*/ import { SystemEvents } from '../utils/types.js';
import { TypedEventEmitter } from '../utils/helpers.js';
/**
* Internal typed event bus
*/ let TypedEventBus = class TypedEventBus extends TypedEventEmitter {
eventCounts = new Map();
lastEventTimes = new Map();
debug;
constructor(debug = false){
super();
this.debug = debug;
}
/**
* Emits an event with logging
*/ emit(event, data) {
if (this.debug) {
console.debug(`[EventBus] Emitting event: ${String(event)}`, data);
}
// Track event metrics
const count = this.eventCounts.get(event) || 0;
this.eventCounts.set(event, count + 1);
this.lastEventTimes.set(event, Date.now());
super.emit(event, data);
}
/**
* Get event statistics
*/ getEventStats() {
const stats = [];
for (const [event, count] of this.eventCounts.entries()){
const lastTime = this.lastEventTimes.get(event);
stats.push({
event: String(event),
count,
lastEmitted: lastTime ? new Date(lastTime) : null
});
}
return stats.sort((a, b)=>b.count - a.count);
}
/**
* Reset event statistics
*/ resetStats() {
this.eventCounts.clear();
this.lastEventTimes.clear();
}
};
/**
* Global event bus for system-wide communication
*/ export class EventBus {
static instance;
typedBus;
constructor(debug = false){
this.typedBus = new TypedEventBus(debug);
}
/**
* Gets the singleton instance of the event bus
*/ static getInstance(debug = false) {
if (!EventBus.instance) {
EventBus.instance = new EventBus(debug);
}
return EventBus.instance;
}
/**
* Emits an event
*/ emit(event, data) {
// Type-safe emission for known events
if (event in SystemEvents) {
this.typedBus.emit(event, data);
} else {
// For custom events, emit as-is
this.typedBus.emit(event, data);
}
}
/**
* Registers an event handler
*/ on(event, handler) {
this.typedBus.on(event, handler);
}
/**
* Removes an event handler
*/ off(event, handler) {
this.typedBus.off(event, handler);
}
/**
* Registers a one-time event handler
*/ once(event, handler) {
this.typedBus.once(event, handler);
}
/**
* Waits for an event to occur
*/ async waitFor(event, timeoutMs) {
return new Promise((resolve, reject)=>{
const handler = (data)=>{
if (timer) clearTimeout(timer);
resolve(data);
};
let timer;
if (timeoutMs) {
timer = setTimeout(()=>{
this.off(event, handler);
reject(new Error(`Timeout waiting for event: ${event}`));
}, timeoutMs);
}
this.once(event, handler);
});
}
/**
* Creates a filtered event listener
*/ onFiltered(event, filter, handler) {
this.on(event, (data)=>{
if (filter(data)) {
handler(data);
}
});
}
/**
* Get event statistics
*/ getEventStats() {
return this.typedBus.getEventStats();
}
/**
* Reset event statistics
*/ resetStats() {
this.typedBus.resetStats();
}
/**
* Remove all listeners for an event
*/ removeAllListeners(event) {
this.typedBus.removeAllListeners(event);
}
}
// Export singleton instance
export const eventBus = EventBus.getInstance();
//# sourceMappingURL=event-bus.js.map