// event_manager.ts // 全局事件管理器 export interface GlobalEvent { type: string; source: string; target?: string; data?: any; timestamp?: number; } export class GlobalEventManager extends EventTarget { private workers: Map = new Map(); private eventLog: GlobalEvent[] = []; private maxLogSize = 1000; constructor() { super(); console.log("🎯 全局事件管理器已启动"); } /** * 注册 Worker */ registerWorker(name: string, worker: Worker) { this.workers.set(name, worker); console.log(`📝 已注册 Worker: ${name}`); // 监听来自 Worker 的事件请求 worker.onmessage = (event: MessageEvent) => { const message = event.data; if (message.type === "dispatchGlobalEvent") { this.dispatchGlobalEvent(message.event); } else if (message.type === "addEventListener") { this.addWorkerListener(name, message.eventType, message.listenerId); } }; } /** * 分发全局事件 */ dispatchGlobalEvent(eventData: GlobalEvent) { eventData.timestamp = Date.now(); // 记录事件日志 this.logEvent(eventData); console.log(`🚀 分发全局事件: ${eventData.type} (来源: ${eventData.source})`); // 创建自定义事件 const customEvent = new CustomEvent(eventData.type, { detail: eventData }); // 在主线程分发事件 this.dispatchEvent(customEvent); // 转发给指定的 Worker 或所有 Worker if (eventData.target) { const targetWorker = this.workers.get(eventData.target); if (targetWorker) { targetWorker.postMessage({ type: "globalEvent", event: eventData }); } } else { // 广播给所有 Worker this.workers.forEach((worker, name) => { if (name !== eventData.source) { // 不发回给发送者 worker.postMessage({ type: "globalEvent", event: eventData }); } }); } } /** * 添加 Worker 事件监听器 */ private addWorkerListener(workerName: string, eventType: string, listenerId: string) { this.addEventListener(eventType, (event: Event) => { const customEvent = event as CustomEvent; const worker = this.workers.get(workerName); if (worker) { worker.postMessage({ type: "globalEventReceived", eventType, listenerId, event: customEvent.detail }); } }); } /** * 记录事件日志 */ private logEvent(event: GlobalEvent) { this.eventLog.push(event); if (this.eventLog.length > this.maxLogSize) { this.eventLog.shift(); } } /** * 获取事件日志 */ getEventLog(): GlobalEvent[] { return [...this.eventLog]; } /** * 获取最近的事件 */ getRecentEvents(count: number = 10): GlobalEvent[] { return this.eventLog.slice(-count); } /** * 清理事件日志 */ clearEventLog() { this.eventLog = []; } /** * 获取已注册的 Worker 列表 */ getRegisteredWorkers(): string[] { return Array.from(this.workers.keys()); } } // 创建全局单例 export const globalEventManager = new GlobalEventManager();