139 lines
3.2 KiB
TypeScript
139 lines
3.2 KiB
TypeScript
![]() |
// event_manager.ts
|
||
|
// 全局事件管理器
|
||
|
|
||
|
export interface GlobalEvent {
|
||
|
type: string;
|
||
|
source: string;
|
||
|
target?: string;
|
||
|
data?: any;
|
||
|
timestamp?: number;
|
||
|
}
|
||
|
|
||
|
export class GlobalEventManager extends EventTarget {
|
||
|
private workers: Map<string, Worker> = 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<GlobalEvent>;
|
||
|
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();
|