1100 lines
30 KiB
JavaScript
1100 lines
30 KiB
JavaScript
|
|
/**
|
|||
|
|
* 全局事件管理器
|
|||
|
|
* 统一管理所有事件处理器,提供事件路由、分发、监控和调试功能
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
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;
|