Files
nexus-terminal/packages/backend/src/services/event.service.ts
T
Baobhan Sith fcba14fe7a update
2025-04-27 11:00:46 +08:00

86 lines
2.8 KiB
TypeScript

import { EventEmitter } from 'events';
// 定义支持的事件类型
// 这里可以根据 packages/backend/src/locales/zh-CN.json 中的 event 部分来扩展
export enum AppEventType {
TestNotification = 'testNotification', // 用于测试
LoginSuccess = 'LOGIN_SUCCESS',
LoginFailure = 'LOGIN_FAILURE',
Logout = 'LOGOUT',
PasswordChanged = 'PASSWORD_CHANGED',
TwoFactorEnabled = '2FA_ENABLED',
TwoFactorDisabled = '2FA_DISABLED',
ConnectionCreated = 'CONNECTION_CREATED',
ConnectionUpdated = 'CONNECTION_UPDATED',
ConnectionDeleted = 'CONNECTION_DELETED',
ProxyCreated = 'PROXY_CREATED',
ProxyUpdated = 'PROXY_UPDATED',
ProxyDeleted = 'PROXY_DELETED',
TagCreated = 'TAG_CREATED',
TagUpdated = 'TAG_UPDATED',
TagDeleted = 'TAG_DELETED',
SettingsUpdated = 'SETTINGS_UPDATED',
IpWhitelistUpdated = 'IP_WHITELIST_UPDATED',
NotificationSettingCreated = 'NOTIFICATION_SETTING_CREATED',
NotificationSettingUpdated = 'NOTIFICATION_SETTING_UPDATED',
NotificationSettingDeleted = 'NOTIFICATION_SETTING_DELETED',
SshConnectSuccess = 'SSH_CONNECT_SUCCESS',
SshConnectFailure = 'SSH_CONNECT_FAILURE',
SshShellFailure = 'SSH_SHELL_FAILURE',
DatabaseMigration = 'DATABASE_MIGRATION',
AdminSetupComplete = 'ADMIN_SETUP_COMPLETE',
// 可以根据需要添加更多事件类型
}
// 定义事件负载的通用接口,可以根据具体事件扩展
export interface AppEventPayload {
userId?: number; // 事件关联的用户 ID(如果适用)
timestamp: Date; // 事件发生的时间戳
details?: Record<string, any>; // 事件相关的具体数据
[key: string]: any; // 允许其他任意属性
}
class EventService extends EventEmitter {
constructor() {
super();
// 增加监听器数量限制,防止潜在的内存泄漏警告
this.setMaxListeners(50);
}
/**
* 触发一个应用事件
* @param eventType 事件类型
* @param payload 事件负载数据
*/
emitEvent(eventType: AppEventType, payload: Omit<AppEventPayload, 'timestamp'>) {
const fullPayload: AppEventPayload = {
...payload,
timestamp: new Date(),
};
this.emit(eventType, fullPayload);
console.log(`Event emitted: ${eventType}`, fullPayload); // 日志记录,方便调试
}
/**
* 注册事件监听器
* @param eventType 事件类型
* @param listener 监听函数
*/
onEvent(eventType: AppEventType, listener: (payload: AppEventPayload) => void) {
this.on(eventType, listener);
}
/**
* 移除事件监听器
* @param eventType 事件类型
* @param listener 监听函数
*/
offEvent(eventType: AppEventType, listener: (payload: AppEventPayload) => void) {
this.off(eventType, listener);
}
}
// 创建单例
const eventService = new EventService();
export default eventService;