claude-flow-tbowman01
Version:
Enterprise-grade AI agent orchestration with ruv-swarm integration (Alpha Release)
153 lines • 3.9 kB
JavaScript
/**
* Event bus implementation for Claude-Flow
*/
import { SystemEvents } from '../utils/types.js';
import { TypedEventEmitter } from '../utils/helpers.js';
/**
* Internal typed event bus
*/
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