solidworks-mcp-server
Version:
Clean Architecture SolidWorks MCP Server - Production-ready with SOLID principles
83 lines • 2.66 kB
JavaScript
/**
* Event Bus Implementation
* Handles event publishing and subscription
*/
import { ResultUtil } from '../../core/interfaces/core-abstractions.js';
export class EventBus {
logger;
handlers = new Map();
constructor(logger) {
this.logger = logger;
}
/**
* Publish an event to all registered handlers
*/
async publish(event) {
try {
const handlers = this.handlers.get(event.type);
if (!handlers || handlers.size === 0) {
this.logger.debug(`No handlers for event type: ${event.type}`);
return ResultUtil.ok(undefined);
}
this.logger.debug(`Publishing event: ${event.type}`, {
eventId: event.id,
handlerCount: handlers.size
});
const promises = [];
for (const handler of handlers) {
if (handler.canHandle(event)) {
promises.push(handler.handle(event));
}
}
const results = await Promise.allSettled(promises);
const failures = results.filter((result) => result.status === 'rejected');
if (failures.length > 0) {
this.logger.warn(`Some event handlers failed for: ${event.type}`, {
failures: failures.map(f => f.reason)
});
}
return ResultUtil.ok(undefined);
}
catch (error) {
this.logger.error(`Failed to publish event: ${event.type}`, error);
return ResultUtil.fail(error);
}
}
/**
* Subscribe to an event type
*/
subscribe(eventType, handler) {
if (!this.handlers.has(eventType)) {
this.handlers.set(eventType, new Set());
}
this.handlers.get(eventType).add(handler);
this.logger.debug(`Subscribed to event: ${eventType}`);
}
/**
* Unsubscribe from an event type
*/
unsubscribe(eventType, handler) {
const handlers = this.handlers.get(eventType);
if (handlers) {
handlers.delete(handler);
if (handlers.size === 0) {
this.handlers.delete(eventType);
}
this.logger.debug(`Unsubscribed from event: ${eventType}`);
}
}
/**
* Clear all subscriptions
*/
clear() {
this.handlers.clear();
}
/**
* Get the number of handlers for an event type
*/
getHandlerCount(eventType) {
const handlers = this.handlers.get(eventType);
return handlers ? handlers.size : 0;
}
}
//# sourceMappingURL=event-bus.js.map