/** * 流程引擎事件总线。 */ export type NFEventName = | 'process.start' | 'process.end' | 'process.close' | 'process.error' | 'node.enter' | 'node.leave' | 'node.error' | 'task.create' | 'task.complete' | 'wait.resume'; export type NFEventHandler = (payload:any) => void | Promise; export class NFEventBus{ private static handlers:Map> = new Map(); /** * 订阅事件。 * * @param event - 事件名 * @param handler - 处理函数 */ static on(event:NFEventName,handler:NFEventHandler){ if(!this.handlers.has(event)){ this.handlers.set(event,new Set()); } this.handlers.get(event).add(handler); } /** * 取消订阅。 * * @param event - 事件名 * @param handler - 原先注册的处理函数 */ static off(event:NFEventName,handler:NFEventHandler){ this.handlers.get(event)?.delete(handler); } /** * 订阅一次,触发后自动取消。 * * @param event - 事件名 * @param handler - 处理函数 */ static once(event:NFEventName,handler:NFEventHandler){ const wrap:NFEventHandler = async (payload)=>{ this.off(event,wrap); await handler(payload); }; this.on(event,wrap); } /** * 清空某事件或全部监听。 * * @param event - 事件名;缺省清空全部 */ static clear(event?:NFEventName){ if(event){ this.handlers.delete(event); }else{ this.handlers.clear(); } } /** * 串行触发事件。单个监听抛错不影响其它监听者,并汇总到 `process.error`。 * * @param event - 事件名 * @param payload - 事件载荷 */ static async emit(event:NFEventName,payload?:any){ const set = this.handlers.get(event); if(!set || set.size === 0){ return; } for(let handler of [...set]){ try{ await handler(payload); }catch(e){ if(event !== 'process.error'){ await this.emit('process.error',{ event, payload, error:e }); } } } } }