UNPKG

mira-app-core

Version:

Core library for Mira TypeScript project - provides base functionality without auto-execution

191 lines (166 loc) 4.57 kB
/** * 事件参数基类 */ export class EventArgs { /** 事件名称 */ eventName: string; /** 事件发生时间 */ readonly whenOccurred: Date; /** 事件参数 */ args: Record<string, any>; /** * 创建一个事件参数实例 * @param eventName 事件名称,默认为空字符串 */ constructor(eventName: string = '', args: Record<string, any> = {}) { this.eventName = eventName; this.args = args; this.whenOccurred = new Date(); } } /** * 事件订阅句柄,用于标识和管理订阅 */ export class EventSubscription<T extends EventArgs = EventArgs> { private readonly _id: string; private _isActive: boolean = true; /** * @param _id 订阅ID * @param eventName 事件名称 * @param handler 事件处理函数 * @param priority 订阅优先级,数字越大优先级越高 */ private readonly _eventName: string; private readonly _handler: (args: T) => void; private readonly _priority: number; constructor( eventName: string, handler: (args: T) => void, priority: number = 0 ) { this._id = `sub_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; this._eventName = eventName; this._handler = handler; this._priority = priority; } get id(): string { return this._id; } get isActive(): boolean { return this._isActive; } get eventName(): string { return this._eventName; } getHandler(): (args: T) => void { return this._handler; } get priority(): number { return this._priority; } /** 取消订阅 */ cancel(): void { this._isActive = false; } } import { EventEmitter } from 'events'; /** * 事件管理器单例类 * 继承自Node.js EventEmitter以获得更好的性能和标准API */ export class EventManager extends EventEmitter { private static _instance: EventManager; /** 获取EventManager单例实例 */ public static get instance(): EventManager { if (!EventManager._instance) { EventManager._instance = new EventManager(); } return EventManager._instance; } constructor() { super(); this.setMaxListeners(100); // 提高默认监听器限制 this._initializeEventHandlers(); } /** * 注册一个事件处理器 * @param eventName 事件名称 * @param handler 事件处理函数 * @returns 订阅句柄 */ public subscribe<T extends EventArgs = EventArgs>( eventName: string, handler: (args: T) => void | boolean | Promise<boolean>, priority: number = 0 ): this { const wrappedHandler = (args: T) => { return handler(args); }; wrappedHandler['priority'] = priority; this.on(eventName, wrappedHandler); return this; } /** * 注册一个一次性事件处理器 * @param eventName 事件名称 * @param handler 事件处理函数 * @returns 订阅句柄 */ public subscribeOnce<T extends EventArgs = EventArgs>( eventName: string, handler: (args: T) => void ): this { this.once(eventName, handler); return this; } /** * 取消订阅 * @param eventName 事件名称 * @param handler 要取消的事件处理函数 * @returns 是否成功取消订阅 */ public unsubscribe<T extends EventArgs = EventArgs>( eventName: string, handler: (args: T) => void ): void { this.off(eventName, handler); } /** * 广播事件 * @param eventName 事件名称 * @param args 事件参数 */ public async broadcast<T extends EventArgs = EventArgs>(eventName: string, args: T): Promise<boolean> { if (!args.eventName) { args.eventName = eventName; } const listeners = this.listeners(eventName); if (listeners.length === 0) { return true; } // 按优先级排序 const sortedListeners = listeners .map(handler => ({ handler, priority: (handler as any)['priority'] || 0 })) .sort((a, b) => b.priority - a.priority); for (const { handler } of sortedListeners) { const result = await handler(args); if (result === false) { return false; } } return true; } /** * 清理所有订阅 */ public dispose(): void { this.removeAllListeners(); } /** 初始化事件处理器 */ private _initializeEventHandlers(): void { // 初始化基本事件处理 } }