Files
JoyD/AutoRobot/Windows/Robot/Web/src/DockLayout/handlers/GlobalEventManager.js

1100 lines
30 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 全局事件管理器
* 统一管理所有事件处理器,提供事件路由、分发、监控和调试功能
*/
import { eventBus } from '../eventBus.js';
import { panelHandler, PANEL_EVENT_TYPES, panelActions } from './PanelHandler.js';
import tabPageHandler, { TABPAGE_EVENT_TYPES, tabPageActions } from './TabPageHandler.js';
import areaHandler, { AREA_EVENT_TYPES, areaActions } from './AreaHandler.js';
// 全局事件类型常量
export const GLOBAL_EVENT_TYPES = {
// 系统级事件
SYSTEM_INIT: 'system.init',
SYSTEM_READY: 'system.ready',
SYSTEM_DESTROY: 'system.destroy',
SYSTEM_ERROR: 'system.error',
SYSTEM_PERFORMANCE: 'system.performance',
// 事件路由
EVENT_ROUTE_START: 'event.route.start',
EVENT_ROUTE_SUCCESS: 'event.route.success',
EVENT_ROUTE_ERROR: 'event.route.error',
EVENT_ROUTE_FALLBACK: 'event.route.fallback',
// 跨组件通信
CROSS_COMPONENT_BROADCAST: 'cross.component.broadcast',
CROSS_COMPONENT_REQUEST: 'cross.component.request',
CROSS_COMPONENT_RESPONSE: 'cross.component.response',
// 事件链
EVENT_CHAIN_START: 'event.chain.start',
EVENT_CHAIN_PROGRESS: 'event.chain.progress',
EVENT_CHAIN_COMPLETE: 'event.chain.complete',
EVENT_CHAIN_ERROR: 'event.chain.error',
// 性能监控
PERFORMANCE_MONITOR_START: 'performance.monitor.start',
PERFORMANCE_MONITOR_END: 'performance.monitor.end',
PERFORMANCE_THRESHOLD_EXCEEDED: 'performance.threshold.exceeded',
// 调试和日志
DEBUG_EVENT_EMIT: 'debug.event.emit',
DEBUG_EVENT_HANDLE: 'debug.event.handle',
DEBUG_PERFORMANCE: 'debug.performance',
DEBUG_MEMORY: 'debug.memory'
};
// 事件路由配置
const EVENT_ROUTES = {
// Panel事件路由
[PANEL_EVENT_TYPES.PANEL_DRAG_START]: {
handlers: ['panelHandler', 'areaHandler'],
priority: 1,
timeout: 5000
},
[PANEL_EVENT_TYPES.PANEL_MAXIMIZE]: {
handlers: ['panelHandler', 'areaHandler'],
priority: 1,
timeout: 3000
},
[PANEL_EVENT_TYPES.PANEL_CLOSE_REQUEST]: {
handlers: ['panelHandler', 'tabPageHandler'],
priority: 2,
timeout: 5000
},
// TabPage事件路由
[TABPAGE_EVENT_TYPES.TABPAGE_DRAG_START]: {
handlers: ['tabPageHandler', 'areaHandler'],
priority: 1,
timeout: 5000
},
[TABPAGE_EVENT_TYPES.TABPAGE_SWITCH]: {
handlers: ['tabPageHandler', 'panelHandler'],
priority: 2,
timeout: 3000
},
[TABPAGE_EVENT_TYPES.TABPAGE_CLOSE_REQUEST]: {
handlers: ['tabPageHandler', 'panelHandler'],
priority: 2,
timeout: 5000
},
// Area事件路由
[AREA_EVENT_TYPES.AREA_DRAG_START]: {
handlers: ['areaHandler', 'tabPageHandler'],
priority: 1,
timeout: 5000
},
[AREA_EVENT_TYPES.AREA_MERGE]: {
handlers: ['areaHandler', 'tabPageHandler', 'panelHandler'],
priority: 1,
timeout: 10000
},
[AREA_EVENT_TYPES.AREA_DOCK_CENTER]: {
handlers: ['areaHandler', 'tabPageHandler'],
priority: 1,
timeout: 8000
}
};
// 事件执行监控
class EventExecutionMonitor {
constructor() {
this.executionMap = new Map();
this.performanceHistory = [];
this.errorHistory = [];
this.maxHistorySize = 200;
}
/**
* 开始事件监控
* @param {string} eventId - 事件ID
* @param {Object} eventData - 事件数据
*/
startMonitoring(eventId, eventData) {
const execution = {
eventId,
eventType: eventData.eventType || eventData.type,
startTime: Date.now(),
handlers: [],
status: 'running',
eventData: { ...eventData }
};
this.executionMap.set(eventId, execution);
return execution;
}
/**
* 记录处理器开始
* @param {string} eventId - 事件ID
* @param {string} handlerName - 处理器名称
*/
recordHandlerStart(eventId, handlerName) {
const execution = this.executionMap.get(eventId);
if (execution) {
execution.handlers.push({
name: handlerName,
startTime: Date.now(),
status: 'running'
});
}
}
/**
* 记录处理器完成
* @param {string} eventId - 事件ID
* @param {string} handlerName - 处理器名称
* @param {boolean} success - 是否成功
* @param {number} duration - 执行时长
* @param {Error} error - 错误信息
*/
recordHandlerComplete(eventId, handlerName, success, duration, error = null) {
const execution = this.executionMap.get(eventId);
if (execution) {
const handler = execution.handlers.find(h => h.name === handlerName);
if (handler) {
handler.endTime = Date.now();
handler.duration = duration;
handler.status = success ? 'completed' : 'error';
handler.error = error;
}
}
}
/**
* 完成事件监控
* @param {string} eventId - 事件ID
*/
completeMonitoring(eventId) {
const execution = this.executionMap.get(eventId);
if (execution) {
execution.endTime = Date.now();
execution.status = 'completed';
execution.totalDuration = execution.endTime - execution.startTime;
// 记录性能历史
this.performanceHistory.push({
eventId,
eventType: execution.eventType,
totalDuration: execution.totalDuration,
handlerCount: execution.handlers.length,
timestamp: Date.now()
});
// 限制历史大小
if (this.performanceHistory.length > this.maxHistorySize) {
this.performanceHistory.shift();
}
// 检查性能阈值
if (execution.totalDuration > 1000) { // 超过1秒
eventBus.emit(GLOBAL_EVENT_TYPES.PERFORMANCE_THRESHOLD_EXCEEDED, {
eventId,
eventType: execution.eventType,
duration: execution.totalDuration,
threshold: 1000
});
}
}
return execution;
}
/**
* 记录错误
* @param {string} eventId - 事件ID
* @param {Error} error - 错误信息
*/
recordError(eventId, error) {
const execution = this.executionMap.get(eventId);
if (execution) {
execution.status = 'error';
execution.error = error;
execution.endTime = Date.now();
execution.totalDuration = execution.endTime - execution.startTime;
// 记录错误历史
this.errorHistory.push({
eventId,
eventType: execution.eventType,
error: error.message,
stack: error.stack,
timestamp: Date.now()
});
// 限制错误历史大小
if (this.errorHistory.length > this.maxHistorySize) {
this.errorHistory.shift();
}
}
}
/**
* 获取执行统计
* @returns {Object} 执行统计
*/
getExecutionStats() {
const running = Array.from(this.executionMap.values()).filter(e => e.status === 'running');
const completed = Array.from(this.executionMap.values()).filter(e => e.status === 'completed');
const errors = Array.from(this.executionMap.values()).filter(e => e.status === 'error');
return {
running: running.length,
completed: completed.length,
errors: errors.length,
total: this.executionMap.size,
averageDuration: completed.length > 0 ?
completed.reduce((sum, e) => sum + e.totalDuration, 0) / completed.length : 0,
recentPerformance: this.performanceHistory.slice(-10),
recentErrors: this.errorHistory.slice(-10)
};
}
/**
* 获取事件执行详情
* @param {string} eventId - 事件ID
* @returns {Object} 执行详情
*/
getExecutionDetail(eventId) {
return this.executionMap.get(eventId);
}
/**
* 清理过期记录
* @param {number} maxAge - 最大年龄(毫秒)
*/
cleanup(maxAge = 3600000) { // 1小时
const now = Date.now();
this.performanceHistory = this.performanceHistory.filter(record =>
(now - record.timestamp) < maxAge);
this.errorHistory = this.errorHistory.filter(record =>
(now - record.timestamp) < maxAge);
// 清理已完成的执行记录
Array.from(this.executionMap.entries()).forEach(([eventId, execution]) => {
if (execution.status !== 'running' && (now - execution.endTime) > maxAge) {
this.executionMap.delete(eventId);
}
});
}
}
/**
* 全局事件管理器类
*/
class GlobalEventManager {
constructor() {
this.eventHandlers = new Map();
this.eventRoutes = new Map(Object.entries(EVENT_ROUTES));
this.executionMonitor = new EventExecutionMonitor();
this.eventChains = new Map();
this.crossComponentChannels = new Map();
this.isInitialized = false;
this.debugMode = false;
// 处理器映射
this.handlerMap = {
panelHandler,
tabPageHandler,
areaHandler
};
// 绑定方法
this._onGlobalEvent = this._onGlobalEvent.bind(this);
this._onSystemError = this._handleSystemError.bind(this);
this._cleanupExpiredData = this._cleanupExpiredData.bind(this);
this._initialize();
}
/**
* 初始化事件管理器
*/
_initialize() {
// 注册全局事件监听器
this._registerGlobalEventListeners();
// 启动定期清理
this._startCleanupScheduler();
// 启动调试模式监听
this._startDebugMode();
this.isInitialized = true;
console.log('✅ 全局事件管理器初始化完成');
// 触发系统就绪事件
eventBus.emit(GLOBAL_EVENT_TYPES.SYSTEM_READY, {
manager: 'globalEventManager',
timestamp: Date.now(),
handlers: Object.keys(this.handlerMap)
});
}
/**
* 注册全局事件监听器
*/
_registerGlobalEventListeners() {
const globalEvents = Object.values(GLOBAL_EVENT_TYPES);
globalEvents.forEach(eventType => {
eventBus.on(eventType, this._onGlobalEvent, {
priority: 0, // 最高优先级
deduplication: { type: 'TTL_BASED', ttl: 50 }
});
});
// 注册所有组件事件监听器
this._registerComponentEventListeners();
}
/**
* 注册组件事件监听器
*/
_registerComponentEventListeners() {
// Panel事件监听
Object.values(PANEL_EVENT_TYPES).forEach(eventType => {
eventBus.on(eventType, (data) => {
this._routeEvent(eventType, data, 'panel');
}, { priority: 1 });
});
// TabPage事件监听
Object.values(TABPAGE_EVENT_TYPES).forEach(eventType => {
eventBus.on(eventType, (data) => {
this._routeEvent(eventType, data, 'tabPage');
}, { priority: 1 });
});
// Area事件监听
Object.values(AREA_EVENT_TYPES).forEach(eventType => {
eventBus.on(eventType, (data) => {
this._routeEvent(eventType, data, 'area');
}, { priority: 1 });
});
}
/**
* 路由事件到相应的处理器
* @param {string} eventType - 事件类型
* @param {Object} eventData - 事件数据
* @param {string} source - 事件源
*/
async _routeEvent(eventType, eventData, source) {
const eventId = `${eventType}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
const routeConfig = this.eventRoutes.get(eventType);
// 开始监控
this.executionMonitor.startMonitoring(eventId, { ...eventData, eventType });
eventBus.emit(GLOBAL_EVENT_TYPES.EVENT_ROUTE_START, {
eventId,
eventType,
source,
routeConfig
});
try {
if (routeConfig) {
// 使用配置的路由
await this._executeRoutedHandlers(eventId, eventType, eventData, routeConfig);
} else {
// 默认路由到相应组件处理器
await this._executeDefaultHandler(eventId, eventType, eventData, source);
}
// 完成监控
this.executionMonitor.completeMonitoring(eventId);
eventBus.emit(GLOBAL_EVENT_TYPES.EVENT_ROUTE_SUCCESS, {
eventId,
eventType,
source,
timestamp: Date.now()
});
} catch (error) {
// 记录错误
this.executionMonitor.recordError(eventId, error);
eventBus.emit(GLOBAL_EVENT_TYPES.EVENT_ROUTE_ERROR, {
eventId,
eventType,
source,
error: error.message,
timestamp: Date.now()
});
// 触发系统错误事件
eventBus.emit(GLOBAL_EVENT_TYPES.SYSTEM_ERROR, {
eventId,
eventType,
source,
error,
timestamp: Date.now()
});
}
}
/**
* 执行路由的处理器
* @param {string} eventId - 事件ID
* @param {string} eventType - 事件类型
* @param {Object} eventData - 事件数据
* @param {Object} routeConfig - 路由配置
*/
async _executeRoutedHandlers(eventId, eventType, eventData, routeConfig) {
const { handlers, priority, timeout = 5000 } = routeConfig;
const handlerPromises = handlers.map(async (handlerName) => {
const startTime = Date.now();
this.executionMonitor.recordHandlerStart(eventId, handlerName);
try {
const handler = this.handlerMap[handlerName];
if (!handler) {
throw new Error(`Handler ${handlerName} not found`);
}
// 执行处理器
const result = await this._executeHandlerWithTimeout(
handler,
eventType,
eventData,
timeout
);
const duration = Date.now() - startTime;
this.executionMonitor.recordHandlerComplete(eventId, handlerName, true, duration);
return { handlerName, result, duration };
} catch (error) {
const duration = Date.now() - startTime;
this.executionMonitor.recordHandlerComplete(eventId, handlerName, false, duration, error);
throw error;
}
});
// 等待所有处理器完成
const results = await Promise.allSettled(handlerPromises);
// 检查是否有失败的处理器
const failures = results.filter(result => result.status === 'rejected');
if (failures.length > 0) {
throw new Error(`Handler execution failed: ${failures.map(f => f.reason.message).join(', ')}`);
}
return results.map(result => result.value);
}
/**
* 执行默认处理器
* @param {string} eventId - 事件ID
* @param {string} eventType - 事件类型
* @param {Object} eventData - 事件数据
* @param {string} source - 事件源
*/
async _executeDefaultHandler(eventId, eventType, eventData, source) {
const handlerName = `${source}Handler`;
const handler = this.handlerMap[handlerName];
if (!handler) {
throw new Error(`Default handler ${handlerName} not found`);
}
this.executionMonitor.recordHandlerStart(eventId, handlerName);
try {
const result = await this._executeHandlerWithTimeout(handler, eventType, eventData, 5000);
const duration = Date.now() - this.executionMonitor.getExecutionDetail(eventId).startTime;
this.executionMonitor.recordHandlerComplete(eventId, handlerName, true, duration);
return result;
} catch (error) {
const duration = Date.now() - this.executionMonitor.getExecutionDetail(eventId).startTime;
this.executionMonitor.recordHandlerComplete(eventId, handlerName, false, duration, error);
throw error;
}
}
/**
* 带超时的处理器执行
* @param {Object} handler - 处理器对象
* @param {string} eventType - 事件类型
* @param {Object} eventData - 事件数据
* @param {number} timeout - 超时时间
* @returns {Promise} 执行结果
*/
async _executeHandlerWithTimeout(handler, eventType, eventData, timeout) {
return new Promise((resolve, reject) => {
const timer = setTimeout(() => {
reject(new Error(`Handler execution timeout after ${timeout}ms`));
}, timeout);
try {
// 假设处理器有处理事件的方法
if (typeof handler._onEvent === 'function') {
const result = handler._onEvent({ eventType, ...eventData });
if (result instanceof Promise) {
result.then(resolve).catch(reject).finally(() => clearTimeout(timer));
} else {
resolve(result);
clearTimeout(timer);
}
} else {
// 如果处理器没有_onEvent方法直接解析
resolve(true);
clearTimeout(timer);
}
} catch (error) {
reject(error);
clearTimeout(timer);
}
});
}
/**
* 处理全局事件
* @param {Object} data - 事件数据
*/
async _onGlobalEvent(data) {
const { eventType } = data;
try {
switch (eventType) {
case GLOBAL_EVENT_TYPES.SYSTEM_INIT:
await this._handleSystemInit(data);
break;
case GLOBAL_EVENT_TYPES.SYSTEM_ERROR:
await this._handleSystemError(data);
break;
case GLOBAL_EVENT_TYPES.PERFORMANCE_THRESHOLD_EXCEEDED:
await this._handlePerformanceThresholdExceeded(data);
break;
case GLOBAL_EVENT_TYPES.CROSS_COMPONENT_REQUEST:
await this._handleCrossComponentRequest(data);
break;
default:
if (this.debugMode) {
console.log(`🌐 全局事件: ${eventType}`, data);
}
}
} catch (error) {
console.error(`❌ 全局事件处理错误 (${eventType}):`, error);
}
}
/**
* 处理系统初始化事件
* @param {Object} data - 事件数据
*/
async _handleSystemInit(data) {
console.log('🚀 系统初始化开始...', data);
// 检查所有处理器是否就绪
const handlersStatus = {};
for (const [name, handler] of Object.entries(this.handlerMap)) {
handlersStatus[name] = {
ready: typeof handler === 'object',
methods: Object.getOwnPropertyNames(Object.getPrototypeOf(handler))
};
}
eventBus.emit(GLOBAL_EVENT_TYPES.SYSTEM_READY, {
manager: 'globalEventManager',
handlersStatus,
timestamp: Date.now()
});
}
/**
* 处理系统错误事件
* @param {Object} data - 事件数据
*/
async _handleSystemError(data) {
console.error('💥 系统错误:', data);
// 记录错误详情
this.errorHistory = this.errorHistory || [];
this.errorHistory.push({
...data,
timestamp: Date.now(),
type: 'system_error'
});
// 限制错误历史大小
if (this.errorHistory.length > 100) {
this.errorHistory.shift();
}
}
/**
* 处理性能阈值超限事件
* @param {Object} data - 事件数据
*/
async _handlePerformanceThresholdExceeded(data) {
console.warn('⚡ 性能阈值超限:', data);
// 可以在这里添加性能优化建议
eventBus.emit(GLOBAL_EVENT_TYPES.DEBUG_PERFORMANCE, {
type: 'threshold_exceeded',
data,
recommendations: this._generatePerformanceRecommendations(data),
timestamp: Date.now()
});
}
/**
* 生成性能优化建议
* @param {Object} performanceData - 性能数据
* @returns {Array} 建议列表
*/
_generatePerformanceRecommendations(performanceData) {
const recommendations = [];
if (performanceData.duration > 2000) {
recommendations.push('考虑将长时间运行的操作分解为更小的任务');
recommendations.push('检查是否有阻塞主线程的操作');
}
if (performanceData.handlerCount > 3) {
recommendations.push('减少事件处理器的数量以提高性能');
}
return recommendations;
}
/**
* 处理跨组件请求
* @param {Object} data - 请求数据
*/
async _handleCrossComponentRequest(data) {
const { requestId, targetComponent, action, payload } = data;
try {
// 查找目标组件的处理器
const handler = this.handlerMap[`${targetComponent}Handler`];
if (!handler) {
throw new Error(`Target component handler ${targetComponent}Handler not found`);
}
// 执行请求
const result = await handler[action](payload);
// 发送响应
eventBus.emit(GLOBAL_EVENT_TYPES.CROSS_COMPONENT_RESPONSE, {
requestId,
targetComponent,
action,
result,
success: true,
timestamp: Date.now()
});
} catch (error) {
// 发送错误响应
eventBus.emit(GLOBAL_EVENT_TYPES.CROSS_COMPONENT_RESPONSE, {
requestId,
targetComponent,
action,
error: error.message,
success: false,
timestamp: Date.now()
});
}
}
/**
* 启动调试模式
*/
_startDebugMode() {
// 监听调试命令
eventBus.on('debug.toggle', () => {
this.debugMode = !this.debugMode;
console.log(`🔧 调试模式${this.debugMode ? '开启' : '关闭'}`);
});
}
/**
* 启动清理调度器
*/
_startCleanupScheduler() {
setInterval(() => {
this._cleanupExpiredData();
}, 60000); // 每分钟清理一次
}
/**
* 清理过期数据
*/
_cleanupExpiredData() {
this.executionMonitor.cleanup();
// 清理事件链
const now = Date.now();
Array.from(this.eventChains.entries()).forEach(([chainId, chain]) => {
if (chain.status === 'completed' && (now - chain.endTime) > 300000) { // 5分钟
this.eventChains.delete(chainId);
}
});
// 清理跨组件频道
this.crossComponentChannels.forEach((channel, channelId) => {
if (channel.lastActivity && (now - channel.lastActivity) > 600000) { // 10分钟
this.crossComponentChannels.delete(channelId);
}
});
}
/**
* 启动性能监控
* @param {string} operation - 操作名称
* @returns {string} 监控ID
*/
startPerformanceMonitor(operation) {
const monitorId = `perf-${operation}-${Date.now()}`;
eventBus.emit(GLOBAL_EVENT_TYPES.PERFORMANCE_MONITOR_START, {
monitorId,
operation,
startTime: Date.now()
});
return monitorId;
}
/**
* 结束性能监控
* @param {string} monitorId - 监控ID
* @param {Object} metadata - 元数据
*/
endPerformanceMonitor(monitorId, metadata = {}) {
eventBus.emit(GLOBAL_EVENT_TYPES.PERFORMANCE_MONITOR_END, {
monitorId,
endTime: Date.now(),
metadata
});
}
/**
* 创建事件链
* @param {string} chainName - 链名称
* @param {Array} events - 事件列表
* @returns {string} 链ID
*/
createEventChain(chainName, events) {
const chainId = `chain-${chainName}-${Date.now()}`;
const chain = {
id: chainId,
name: chainName,
events,
currentIndex: 0,
status: 'pending',
startTime: Date.now(),
results: []
};
this.eventChains.set(chainId, chain);
// 触发链开始事件
eventBus.emit(GLOBAL_EVENT_TYPES.EVENT_CHAIN_START, {
chainId,
chainName,
eventCount: events.length
});
// 开始执行链
this._executeEventChain(chainId);
return chainId;
}
/**
* 执行事件链
* @param {string} chainId - 链ID
*/
async _executeEventChain(chainId) {
const chain = this.eventChains.get(chainId);
if (!chain || chain.currentIndex >= chain.events.length) {
this._completeEventChain(chainId);
return;
}
const currentEvent = chain.events[chain.currentIndex];
chain.status = 'running';
try {
// 触发进度事件
eventBus.emit(GLOBAL_EVENT_TYPES.EVENT_CHAIN_PROGRESS, {
chainId,
currentIndex: chain.currentIndex,
totalEvents: chain.events.length,
currentEvent
});
// 执行当前事件
const result = await this._executeSingleEvent(currentEvent);
chain.results.push(result);
// 移动到下一个事件
chain.currentIndex++;
// 继续执行链
setTimeout(() => this._executeEventChain(chainId), 100);
} catch (error) {
chain.status = 'error';
chain.error = error;
eventBus.emit(GLOBAL_EVENT_TYPES.EVENT_CHAIN_ERROR, {
chainId,
error: error.message,
currentIndex: chain.currentIndex
});
}
}
/**
* 执行单个事件
* @param {Object} event - 事件对象
* @returns {Promise} 执行结果
*/
async _executeSingleEvent(event) {
const { type, data, delay = 0 } = event;
if (delay > 0) {
await new Promise(resolve => setTimeout(resolve, delay));
}
return new Promise((resolve, reject) => {
eventBus.emit(type, {
...data,
chainExecution: true,
timestamp: Date.now()
});
// 简单的等待机制(在实际应用中可能需要更复杂的协调)
setTimeout(() => resolve({ type, data, executedAt: Date.now() }), 100);
});
}
/**
* 完成事件链
* @param {string} chainId - 链ID
*/
_completeEventChain(chainId) {
const chain = this.eventChains.get(chainId);
if (chain) {
chain.status = 'completed';
chain.endTime = Date.now();
chain.duration = chain.endTime - chain.startTime;
eventBus.emit(GLOBAL_EVENT_TYPES.EVENT_CHAIN_COMPLETE, {
chainId,
chainName: chain.name,
eventCount: chain.events.length,
duration: chain.duration,
results: chain.results
});
}
}
/**
* 发送跨组件广播
* @param {string} message - 消息内容
* @param {Object} data - 附加数据
* @param {Array} targetComponents - 目标组件列表
*/
broadcast(message, data = {}, targetComponents = null) {
eventBus.emit(GLOBAL_EVENT_TYPES.CROSS_COMPONENT_BROADCAST, {
message,
data,
targetComponents,
sender: 'globalEventManager',
timestamp: Date.now()
});
}
/**
* 发送跨组件请求
* @param {string} targetComponent - 目标组件
* @param {string} action - 操作名称
* @param {Object} payload - 请求数据
* @returns {Promise} 响应Promise
*/
request(targetComponent, action, payload) {
const requestId = `req-${targetComponent}-${action}-${Date.now()}`;
return new Promise((resolve, reject) => {
// 设置响应处理器
const responseHandler = (responseData) => {
if (responseData.requestId === requestId) {
eventBus.off(GLOBAL_EVENT_TYPES.CROSS_COMPONENT_RESPONSE, responseHandler);
if (responseData.success) {
resolve(responseData);
} else {
reject(new Error(responseData.error));
}
}
};
eventBus.on(GLOBAL_EVENT_TYPES.CROSS_COMPONENT_RESPONSE, responseHandler);
// 发送请求
eventBus.emit(GLOBAL_EVENT_TYPES.CROSS_COMPONENT_REQUEST, {
requestId,
targetComponent,
action,
payload,
timestamp: Date.now()
});
// 设置超时
setTimeout(() => {
eventBus.off(GLOBAL_EVENT_TYPES.CROSS_COMPONENT_RESPONSE, responseHandler);
reject(new Error(`Request timeout: ${targetComponent}.${action}`));
}, 10000);
});
}
/**
* 获取执行统计
* @returns {Object} 执行统计
*/
getExecutionStats() {
return {
...this.executionMonitor.getExecutionStats(),
eventChains: this.eventChains.size,
crossComponentChannels: this.crossComponentChannels.size,
debugMode: this.debugMode,
initialized: this.isInitialized
};
}
/**
* 获取事件链状态
* @returns {Array} 事件链状态列表
*/
getEventChainStatus() {
return Array.from(this.eventChains.values()).map(chain => ({
id: chain.id,
name: chain.name,
status: chain.status,
progress: chain.events.length > 0 ? (chain.currentIndex / chain.events.length) * 100 : 0,
duration: chain.endTime ? chain.duration : Date.now() - chain.startTime
}));
}
/**
* 销毁事件管理器
*/
destroy() {
// 清理所有事件监听器
const globalEvents = Object.values(GLOBAL_EVENT_TYPES);
globalEvents.forEach(eventType => {
eventBus.off(eventType, this._onGlobalEvent);
});
// 销毁各个处理器
Object.values(this.handlerMap).forEach(handler => {
if (typeof handler.destroy === 'function') {
handler.destroy();
}
});
// 清理数据
this.eventHandlers.clear();
this.eventChains.clear();
this.crossComponentChannels.clear();
this.isInitialized = false;
console.log('🗑️ 全局事件管理器已销毁');
}
}
// 创建单例实例
const globalEventManager = new GlobalEventManager();
// 全局便捷API
export const globalEventActions = {
/**
* 启动性能监控
* @param {string} operation - 操作名称
* @returns {string} 监控ID
*/
startMonitor: (operation) => {
return globalEventManager.startPerformanceMonitor(operation);
},
/**
* 结束性能监控
* @param {string} monitorId - 监控ID
* @param {Object} metadata - 元数据
*/
endMonitor: (monitorId, metadata = {}) => {
globalEventManager.endPerformanceMonitor(monitorId, metadata);
},
/**
* 创建事件链
* @param {string} chainName - 链名称
* @param {Array} events - 事件列表
* @returns {string} 链ID
*/
createChain: (chainName, events) => {
return globalEventManager.createEventChain(chainName, events);
},
/**
* 发送跨组件广播
* @param {string} message - 消息
* @param {Object} data - 数据
* @param {Array} targets - 目标组件
*/
broadcast: (message, data = {}, targets = null) => {
globalEventManager.broadcast(message, data, targets);
},
/**
* 发送跨组件请求
* @param {string} component - 组件名
* @param {string} action - 操作
* @param {Object} payload - 数据
* @returns {Promise} 响应
*/
request: (component, action, payload) => {
return globalEventManager.request(component, action, payload);
},
/**
* 切换调试模式
*/
toggleDebug: () => {
eventBus.emit('debug.toggle');
},
/**
* 获取统计信息
* @returns {Object} 统计信息
*/
getStats: () => {
return globalEventManager.getExecutionStats();
},
/**
* 获取事件链状态
* @returns {Array} 链状态
*/
getChainStatus: () => {
return globalEventManager.getEventChainStatus();
}
};
// 导出事件管理器和相关API
export default globalEventManager;