UNPKG

solidworks-mcp-server

Version:

Clean Architecture SolidWorks MCP Server - Production-ready with SOLID principles

83 lines 2.66 kB
/** * 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