api-amr/event_manager.ts

139 lines
3.2 KiB
TypeScript
Raw Permalink Normal View History

2025-06-04 19:15:02 +08:00
// 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();