UNPKG

@flowlab/all

Version:

A cool library focusing on handling various flows

105 lines (94 loc) 4.19 kB
// --- src/event/event-manager.ts --- import { IEventPayload, IWorkflowContext } from '../types/index.js'; /** * MARK: 事件管理器接口 * @interface IEventManager * @description 事件管理器接口,用于触发和监听事件 */ export interface IEventManager { /** * 触发一个事件 * @param eventName - 事件名称 * @param data - 事件关联的数据 (可选) * @param triggerContext - 触发事件的工作流上下文 (可选) */ emit(eventName: string, data?: Record<string, any>, triggerContext?: IWorkflowContext): Promise<void>; /** * 绑定一个工作流到指定事件 * 当事件被触发时,将启动绑定的工作流 * @param eventName - 要监听的事件名称 * @param workflowDefinitionId - 要启动的工作流定义 ID * @param options - 绑定选项 (例如,输入映射) */ bindWorkflowToEvent(eventName: string, workflowDefinitionId: string, options?: any): void; /** * 添加一个通用的事件监听器 * @param eventName - 事件名称 * @param listener - 监听函数 */ on(eventName: string, listener: (payload: IEventPayload) => void): void; /** * 移除事件监听器 */ off(eventName: string, listener: (payload: IEventPayload) => void): void; } /** * MARK: 内存事件管理器实现 * @class InMemoryEventManager * @implements IEventManager * @description 简单的内存事件管理器实现 (示例) */ export class InMemoryEventManager implements IEventManager { private listeners: Map<string, Array<(payload: IEventPayload) => void>> = new Map(); private workflowBindings: Map<string, { workflowDefinitionId: string; options?: any }[]> = new Map(); // 需要注入 WorkflowExecutor 或类似机制来启动工作流 // constructor(private workflowLauncher: (definitionId: string, input: any) => Promise<void>) {} async emit(eventName: string, data?: Record<string, any>, triggerContext?: IWorkflowContext): Promise<void> { const payload: IEventPayload = { eventName, data, timestamp: new Date(), source: triggerContext?.workflowId, // 记录事件来源 }; console.log(`[EventManager] 触发事件: ${eventName}`, data); // 触发通用监听器 const eventListeners = this.listeners.get(eventName) || []; eventListeners.forEach(listener => { try { listener(payload); } catch (error) { console.error(`[EventManager] 执行事件 "${eventName}" 的监听器时出错:`, error); } }); // 触发绑定的工作流 const bindings = this.workflowBindings.get(eventName) || []; for (const binding of bindings) { console.log(`[EventManager] 事件 "${eventName}" 触发工作流: ${binding.workflowDefinitionId}`); // TODO: 实现启动工作流的逻辑 // await this.workflowLauncher(binding.workflowDefinitionId, payload.data); // 将事件数据作为输入 // 注意:需要处理输入映射、上下文传递等 } } bindWorkflowToEvent(eventName: string, workflowDefinitionId: string, options?: any): void { if (!this.workflowBindings.has(eventName)) { this.workflowBindings.set(eventName, []); } this.workflowBindings.get(eventName)!.push({ workflowDefinitionId, options }); console.log(`[EventManager] 工作流 "${workflowDefinitionId}" 已绑定到事件 "${eventName}"`); } on(eventName: string, listener: (payload: IEventPayload) => void): void { if (!this.listeners.has(eventName)) { this.listeners.set(eventName, []); } this.listeners.get(eventName)!.push(listener); } off(eventName: string, listener: (payload: IEventPayload) => void): void { const eventListeners = this.listeners.get(eventName); if (eventListeners) { const index = eventListeners.indexOf(listener); if (index > -1) { eventListeners.splice(index, 1); } } } }