@flowlab/event
Version:
FlowLab event-driven system
1 lines • 8.03 kB
Source Map (JSON)
{"version":3,"sources":["../src/bus/EventBus.ts","../src/bus/InMemoryBus.ts","../src/internal/context.ts","../src/api/emitEvents.ts","../src/api/bindEvent.ts","../src/api/unbindEvent.ts","../src/api/registerWorkflow.ts","../src/api/startEventListener.ts","../src/api/stopEventListener.ts","../src/api/listBoundEvents.ts","../src/api/isEventBound.ts","../src/api/onAnyEvent.ts"],"sourcesContent":["import { IEventBus, EventHandler, EventPayload } from '../types';\n\n/**\n * EventBus 抽象基类,提供 emit/on/off 的基础能力\n */\nexport abstract class EventBus implements IEventBus {\n protected handlers: Map<string, Set<EventHandler>> = new Map();\n\n /**\n * 触发事件\n * @param eventName - 事件名称\n * @param payload - 事件数据\n */\n async emit(eventName: string, payload: EventPayload): Promise<void> {\n const handlers = this.handlers.get(eventName);\n if (handlers) {\n for (const handler of handlers) {\n try {\n await handler(payload);\n } catch (err) {\n console.error(`[FlowLab EventBus] Error handling event ${eventName}`, err);\n }\n }\n }\n }\n\n /**\n * 绑定事件处理器\n * @param eventName - 事件名称\n * @param handler - 事件处理函数\n */\n on(eventName: string, handler: EventHandler): void {\n if (!this.handlers.has(eventName)) {\n this.handlers.set(eventName, new Set());\n }\n this.handlers.get(eventName)?.add(handler);\n }\n\n /**\n * 解绑事件处理器\n * @param eventName - 事件名称\n * @param handler - 事件处理函数\n */\n off(eventName: string, handler: EventHandler): void {\n this.handlers.get(eventName)?.delete(handler);\n }\n\n /**\n * 启动事件监听(由子类实现)\n */\n abstract start(): Promise<void>;\n\n /**\n * 停止事件监听(由子类实现)\n */\n abstract stop(): Promise<void>;\n}\n","import { EventBus } from './EventBus';\n\n/**\n * InMemoryBus 是默认的事件总线实现,基于内存事件分发\n */\nexport class InMemoryBus extends EventBus {\n private running: boolean = false;\n\n async start(): Promise<void> {\n this.running = true;\n console.log('[FlowLab] ✅ InMemory EventBus started successfully');\n }\n\n async stop(): Promise<void> {\n this.running = false;\n console.log('[FlowLab] 🛑 InMemory EventBus stopped');\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}","import { IEventBus } from '../types';\nimport { InMemoryBus } from '../bus/InMemoryBus';\n\n/**\n * 当前事件总线实例(默认使用内存实现)\n */\nlet currentEventBus: IEventBus = new InMemoryBus();\n\n/**\n * 获取当前事件总线实例\n */\nexport function getCurrentEventBus(): IEventBus {\n return currentEventBus;\n}\n\n/**\n * 替换当前使用的事件总线(可用于 Redis/Kafka)\n * @param bus 自定义实现的事件总线\n */\nexport function useEventBus(bus: IEventBus): void {\n currentEventBus = bus;\n}","// src/api/emitEvent.ts\n\nimport { EventPayload } from '../types';\nimport { getCurrentEventBus } from '../internal/context';\n\n/**\n * 触发事件\n * @param eventName - 事件名称\n * @param payload - 传递的数据\n */\nexport async function emitEvent(eventName: string, payload: EventPayload): Promise<void> {\n const bus = getCurrentEventBus();\n await bus.emit(eventName, payload);\n}\n","import { EventHandler } from '../types';\nimport { getCurrentEventBus } from '../internal/context';\n\n/**\n * 绑定一个事件处理函数到指定事件\n * @param eventName 事件名\n * @param handler 处理函数\n */\nexport function bindEvent(eventName: string, handler: EventHandler): void {\n getCurrentEventBus().on(eventName, handler);\n}","import { EventHandler } from '../types';\nimport { getCurrentEventBus } from '../internal/context';\n\n/**\n * 从事件中解绑一个处理器(或所有)\n * @param eventName 事件名\n * @param handler 可选的具体处理器\n */\nexport function unbindEvent(eventName: string, handler?: EventHandler): void {\n if (handler) {\n getCurrentEventBus().off(eventName, handler);\n }\n}","import { Workflow } from '@flowlab/core';\nimport { bindEvent } from './bindEvent';\n\n/**\n * 将一个工作流绑定到事件上\n * @param eventName 事件名称\n * @param workflow 要运行的工作流实例\n */\nexport function registerWorkflow(eventName: string, workflow: Workflow): void {\n bindEvent(eventName, async (payload) => {\n await workflow.run(payload);\n });\n}","import { getCurrentEventBus } from '../internal/context';\n\n/**\n * 启动事件监听器(如果是内存实现则为 noop)\n */\nexport async function startEventListener(): Promise<void> {\n await getCurrentEventBus().start();\n}","import { getCurrentEventBus } from '../internal/context';\n\n/**\n * 停止事件监听器\n */\nexport async function stopEventListener(): Promise<void> {\n await getCurrentEventBus().stop();\n}","import { getCurrentEventBus } from '../internal/context';\n\n/**\n * 列出当前绑定的所有事件名(仅限内存实现)\n */\nexport function listBoundEvents(): string[] {\n const bus: any = getCurrentEventBus();\n return bus.handlers ? Array.from(bus.handlers.keys()) : [];\n}","import { getCurrentEventBus } from '../internal/context';\n\n/**\n * 判断某个事件是否已绑定处理器\n * @param eventName 事件名\n */\nexport function isEventBound(eventName: string): boolean {\n const bus: any = getCurrentEventBus();\n return bus.handlers?.has(eventName) ?? false;\n}","import { EventPayload, EventHandler } from '../types';\nimport { getCurrentEventBus } from '../internal/context';\n\n/**\n * 全局监听所有事件(仅支持 InMemory 实现)\n * @param callback (eventName, payload) => void\n */\nexport function onAnyEvent(callback: (eventName: string, payload: EventPayload) => void): void {\n const bus: any = getCurrentEventBus();\n const originalEmit = bus.emit.bind(bus);\n\n // 重写 emit 方法用于 hook\n bus.emit = async (eventName: string, payload: EventPayload) => {\n callback(eventName, payload);\n return originalEmit(eventName, payload);\n };\n}"],"mappings":";;;AAKO,IAAe,WAAf,MAA6C;AAAA,EACxC,WAA2C,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7D,MAAM,KAAK,WAAmB,SAAsC;AAClE,UAAM,WAAW,KAAK,SAAS,IAAI,SAAS;AAC5C,QAAI,UAAU;AACZ,iBAAW,WAAW,UAAU;AAC9B,YAAI;AACF,gBAAM,QAAQ,OAAO;AAAA,QACvB,SAAS,KAAK;AACZ,kBAAQ,MAAM,2CAA2C,SAAS,IAAI,GAAG;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAG,WAAmB,SAA6B;AACjD,QAAI,CAAC,KAAK,SAAS,IAAI,SAAS,GAAG;AACjC,WAAK,SAAS,IAAI,WAAW,oBAAI,IAAI,CAAC;AAAA,IACxC;AACA,SAAK,SAAS,IAAI,SAAS,GAAG,IAAI,OAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAmB,SAA6B;AAClD,SAAK,SAAS,IAAI,SAAS,GAAG,OAAO,OAAO;AAAA,EAC9C;AAWF;;;ACnDO,IAAM,cAAN,cAA0B,SAAS;AAAA,EAChC,UAAmB;AAAA,EAE3B,MAAM,QAAuB;AAC3B,SAAK,UAAU;AACf,YAAQ,IAAI,yDAAoD;AAAA,EAClE;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,UAAU;AACf,YAAQ,IAAI,+CAAwC;AAAA,EACtD;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;;;ACfA,IAAI,kBAA6B,IAAI,YAAY;AAK1C,SAAS,qBAAgC;AAC9C,SAAO;AACT;AAMO,SAAS,YAAY,KAAsB;AAChD,oBAAkB;AACpB;;;ACXA,eAAsB,UAAU,WAAmB,SAAsC;AACvF,QAAM,MAAM,mBAAmB;AAC/B,QAAM,IAAI,KAAK,WAAW,OAAO;AACnC;;;ACLO,SAAS,UAAU,WAAmB,SAA6B;AACxE,qBAAmB,EAAE,GAAG,WAAW,OAAO;AAC5C;;;ACFO,SAAS,YAAY,WAAmB,SAA8B;AAC3E,MAAI,SAAS;AACX,uBAAmB,EAAE,IAAI,WAAW,OAAO;AAAA,EAC7C;AACF;;;ACJO,SAAS,iBAAiB,WAAmB,UAA0B;AAC5E,YAAU,WAAW,OAAO,YAAY;AACtC,UAAM,SAAS,IAAI,OAAO;AAAA,EAC5B,CAAC;AACH;;;ACPA,eAAsB,qBAAoC;AACxD,QAAM,mBAAmB,EAAE,MAAM;AACnC;;;ACFA,eAAsB,oBAAmC;AACvD,QAAM,mBAAmB,EAAE,KAAK;AAClC;;;ACFO,SAAS,kBAA4B;AAC1C,QAAM,MAAW,mBAAmB;AACpC,SAAO,IAAI,WAAW,MAAM,KAAK,IAAI,SAAS,KAAK,CAAC,IAAI,CAAC;AAC3D;;;ACFO,SAAS,aAAa,WAA4B;AACvD,QAAM,MAAW,mBAAmB;AACpC,SAAO,IAAI,UAAU,IAAI,SAAS,KAAK;AACzC;;;ACFO,SAAS,WAAW,UAAoE;AAC7F,QAAM,MAAW,mBAAmB;AACpC,QAAM,eAAe,IAAI,KAAK,KAAK,GAAG;AAGtC,MAAI,OAAO,OAAO,WAAmB,YAA0B;AAC7D,aAAS,WAAW,OAAO;AAC3B,WAAO,aAAa,WAAW,OAAO;AAAA,EACxC;AACF;","names":[]}