67 lines
1.5 KiB
TypeScript
67 lines
1.5 KiB
TypeScript
/**
|
|
* 认证事件管理器
|
|
* 管理认证相关的事件监听和触发
|
|
*/
|
|
import type { AuthEventType, AuthEventListener } from './types';
|
|
import { AuthError } from './errors';
|
|
|
|
/**
|
|
* 认证事件管理器
|
|
*/
|
|
export class AuthEventManager {
|
|
private listeners: Map<AuthEventType, AuthEventListener[]> = new Map();
|
|
|
|
/**
|
|
* 添加事件监听器
|
|
*/
|
|
on(event: AuthEventType, listener: AuthEventListener): void {
|
|
if (!this.listeners.has(event)) {
|
|
this.listeners.set(event, []);
|
|
}
|
|
const eventListeners = this.listeners.get(event);
|
|
// 神人判断
|
|
if (eventListeners) {
|
|
eventListeners.push(listener);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 移除事件监听器
|
|
*/
|
|
off(event: AuthEventType, listener: AuthEventListener): void {
|
|
const eventListeners = this.listeners.get(event);
|
|
if (eventListeners) {
|
|
const index = eventListeners.indexOf(listener);
|
|
if (index !== -1) {
|
|
eventListeners.splice(index, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 触发事件
|
|
*/
|
|
emit(event: AuthEventType, ...args: unknown[]): void {
|
|
const eventListeners = this.listeners.get(event);
|
|
if (eventListeners) {
|
|
eventListeners.forEach(listener => {
|
|
try {
|
|
listener(...args);
|
|
} catch (error) {
|
|
throw AuthError.unknown(`Error in auth event listener for ${event}`, error);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 清除所有监听器
|
|
*/
|
|
clear(): void {
|
|
this.listeners.clear();
|
|
}
|
|
}
|
|
|
|
// 创建全局事件管理器实例
|
|
export const authEventManager = new AuthEventManager();
|