mira-app-core
Version:
Core library for Mira TypeScript project - provides base functionality without auto-execution
142 lines • 3.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventManager = exports.EventSubscription = exports.EventArgs = void 0;
/**
* 事件参数基类
*/
class EventArgs {
/**
* 创建一个事件参数实例
* @param eventName 事件名称,默认为空字符串
*/
constructor(eventName = '', args = {}) {
this.eventName = eventName;
this.args = args;
this.whenOccurred = new Date();
}
}
exports.EventArgs = EventArgs;
/**
* 事件订阅句柄,用于标识和管理订阅
*/
class EventSubscription {
constructor(eventName, handler, priority = 0) {
this._isActive = true;
this._id = `sub_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
this._eventName = eventName;
this._handler = handler;
this._priority = priority;
}
get id() {
return this._id;
}
get isActive() {
return this._isActive;
}
get eventName() {
return this._eventName;
}
getHandler() {
return this._handler;
}
get priority() {
return this._priority;
}
/** 取消订阅 */
cancel() {
this._isActive = false;
}
}
exports.EventSubscription = EventSubscription;
const events_1 = require("events");
/**
* 事件管理器单例类
* 继承自Node.js EventEmitter以获得更好的性能和标准API
*/
class EventManager extends events_1.EventEmitter {
/** 获取EventManager单例实例 */
static get instance() {
if (!EventManager._instance) {
EventManager._instance = new EventManager();
}
return EventManager._instance;
}
constructor() {
super();
this.setMaxListeners(100); // 提高默认监听器限制
this._initializeEventHandlers();
}
/**
* 注册一个事件处理器
* @param eventName 事件名称
* @param handler 事件处理函数
* @returns 订阅句柄
*/
subscribe(eventName, handler, priority = 0) {
const wrappedHandler = (args) => {
return handler(args);
};
wrappedHandler['priority'] = priority;
this.on(eventName, wrappedHandler);
return this;
}
/**
* 注册一个一次性事件处理器
* @param eventName 事件名称
* @param handler 事件处理函数
* @returns 订阅句柄
*/
subscribeOnce(eventName, handler) {
this.once(eventName, handler);
return this;
}
/**
* 取消订阅
* @param eventName 事件名称
* @param handler 要取消的事件处理函数
* @returns 是否成功取消订阅
*/
unsubscribe(eventName, handler) {
this.off(eventName, handler);
}
/**
* 广播事件
* @param eventName 事件名称
* @param args 事件参数
*/
async broadcast(eventName, args) {
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['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;
}
/**
* 清理所有订阅
*/
dispose() {
this.removeAllListeners();
}
/** 初始化事件处理器 */
_initializeEventHandlers() {
// 初始化基本事件处理
}
}
exports.EventManager = EventManager;
//# sourceMappingURL=event-manager.js.map