ts-workflow-engine-lite 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +352 -0
- package/dist/src/api/ConsoleWebSocketManager.d.ts +57 -0
- package/dist/src/api/ConsoleWebSocketManager.js +206 -0
- package/dist/src/api/ConsoleWebSocketManager.js.map +1 -0
- package/dist/src/api/ErrorHandler.d.ts +52 -0
- package/dist/src/api/ErrorHandler.js +115 -0
- package/dist/src/api/ErrorHandler.js.map +1 -0
- package/dist/src/api/EventHistory.d.ts +73 -0
- package/dist/src/api/EventHistory.js +309 -0
- package/dist/src/api/EventHistory.js.map +1 -0
- package/dist/src/api/WebhookManager.d.ts +67 -0
- package/dist/src/api/WebhookManager.js +568 -0
- package/dist/src/api/WebhookManager.js.map +1 -0
- package/dist/src/api/docsPage.d.ts +1 -0
- package/dist/src/api/docsPage.js +321 -0
- package/dist/src/api/docsPage.js.map +1 -0
- package/dist/src/api/index.d.ts +8 -0
- package/dist/src/api/index.js +8 -0
- package/dist/src/api/index.js.map +1 -0
- package/dist/src/api/middleware/auth.d.ts +19 -0
- package/dist/src/api/middleware/auth.js +122 -0
- package/dist/src/api/middleware/auth.js.map +1 -0
- package/dist/src/api/middleware/index.d.ts +3 -0
- package/dist/src/api/middleware/index.js +3 -0
- package/dist/src/api/middleware/index.js.map +1 -0
- package/dist/src/api/middleware/rateLimit.d.ts +6 -0
- package/dist/src/api/middleware/rateLimit.js +69 -0
- package/dist/src/api/middleware/rateLimit.js.map +1 -0
- package/dist/src/api/middleware/rateLimitStore.d.ts +14 -0
- package/dist/src/api/middleware/rateLimitStore.js +44 -0
- package/dist/src/api/middleware/rateLimitStore.js.map +1 -0
- package/dist/src/api/middleware/rbac.d.ts +12 -0
- package/dist/src/api/middleware/rbac.js +120 -0
- package/dist/src/api/middleware/rbac.js.map +1 -0
- package/dist/src/api/openapi.d.ts +1917 -0
- package/dist/src/api/openapi.js +1758 -0
- package/dist/src/api/openapi.js.map +1 -0
- package/dist/src/api/playgroundPage.d.ts +1 -0
- package/dist/src/api/playgroundPage.js +765 -0
- package/dist/src/api/playgroundPage.js.map +1 -0
- package/dist/src/api/response.d.ts +22 -0
- package/dist/src/api/response.js +119 -0
- package/dist/src/api/response.js.map +1 -0
- package/dist/src/api/router.d.ts +17 -0
- package/dist/src/api/router.js +94 -0
- package/dist/src/api/router.js.map +1 -0
- package/dist/src/api/routes/analytics.d.ts +10 -0
- package/dist/src/api/routes/analytics.js +144 -0
- package/dist/src/api/routes/analytics.js.map +1 -0
- package/dist/src/api/routes/dlq.d.ts +3 -0
- package/dist/src/api/routes/dlq.js +248 -0
- package/dist/src/api/routes/dlq.js.map +1 -0
- package/dist/src/api/routes/eventHistory.d.ts +3 -0
- package/dist/src/api/routes/eventHistory.js +48 -0
- package/dist/src/api/routes/eventHistory.js.map +1 -0
- package/dist/src/api/routes/events.d.ts +3 -0
- package/dist/src/api/routes/events.js +205 -0
- package/dist/src/api/routes/events.js.map +1 -0
- package/dist/src/api/routes/functions.d.ts +3 -0
- package/dist/src/api/routes/functions.js +85 -0
- package/dist/src/api/routes/functions.js.map +1 -0
- package/dist/src/api/routes/instances.d.ts +3 -0
- package/dist/src/api/routes/instances.js +790 -0
- package/dist/src/api/routes/instances.js.map +1 -0
- package/dist/src/api/routes/templates.d.ts +3 -0
- package/dist/src/api/routes/templates.js +195 -0
- package/dist/src/api/routes/templates.js.map +1 -0
- package/dist/src/api/routes/webhooks.d.ts +3 -0
- package/dist/src/api/routes/webhooks.js +263 -0
- package/dist/src/api/routes/webhooks.js.map +1 -0
- package/dist/src/api/routes/workflows/analysis.d.ts +2 -0
- package/dist/src/api/routes/workflows/analysis.js +112 -0
- package/dist/src/api/routes/workflows/analysis.js.map +1 -0
- package/dist/src/api/routes/workflows/crud.d.ts +2 -0
- package/dist/src/api/routes/workflows/crud.js +140 -0
- package/dist/src/api/routes/workflows/crud.js.map +1 -0
- package/dist/src/api/routes/workflows/execution.d.ts +2 -0
- package/dist/src/api/routes/workflows/execution.js +204 -0
- package/dist/src/api/routes/workflows/execution.js.map +1 -0
- package/dist/src/api/routes/workflows/graph.d.ts +2 -0
- package/dist/src/api/routes/workflows/graph.js +51 -0
- package/dist/src/api/routes/workflows/graph.js.map +1 -0
- package/dist/src/api/routes/workflows/import.d.ts +2 -0
- package/dist/src/api/routes/workflows/import.js +238 -0
- package/dist/src/api/routes/workflows/import.js.map +1 -0
- package/dist/src/api/routes/workflows/index.d.ts +3 -0
- package/dist/src/api/routes/workflows/index.js +18 -0
- package/dist/src/api/routes/workflows/index.js.map +1 -0
- package/dist/src/api/routes/workflows/shared.d.ts +64 -0
- package/dist/src/api/routes/workflows/shared.js +304 -0
- package/dist/src/api/routes/workflows/shared.js.map +1 -0
- package/dist/src/api/routes/workflows/variables.d.ts +2 -0
- package/dist/src/api/routes/workflows/variables.js +34 -0
- package/dist/src/api/routes/workflows/variables.js.map +1 -0
- package/dist/src/api/routes/workflows/versioning.d.ts +2 -0
- package/dist/src/api/routes/workflows/versioning.js +235 -0
- package/dist/src/api/routes/workflows/versioning.js.map +1 -0
- package/dist/src/api/server.d.ts +13 -0
- package/dist/src/api/server.js +311 -0
- package/dist/src/api/server.js.map +1 -0
- package/dist/src/api/services/InstanceApplicationService.d.ts +74 -0
- package/dist/src/api/services/InstanceApplicationService.js +215 -0
- package/dist/src/api/services/InstanceApplicationService.js.map +1 -0
- package/dist/src/api/services/WorkflowApplicationService.d.ts +92 -0
- package/dist/src/api/services/WorkflowApplicationService.js +282 -0
- package/dist/src/api/services/WorkflowApplicationService.js.map +1 -0
- package/dist/src/api/services/index.d.ts +4 -0
- package/dist/src/api/services/index.js +3 -0
- package/dist/src/api/services/index.js.map +1 -0
- package/dist/src/api/types.d.ts +118 -0
- package/dist/src/api/types.js +2 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/api/utils/IdempotencyStore.d.ts +36 -0
- package/dist/src/api/utils/IdempotencyStore.js +121 -0
- package/dist/src/api/utils/IdempotencyStore.js.map +1 -0
- package/dist/src/api/utils/authConfig.d.ts +2 -0
- package/dist/src/api/utils/authConfig.js +25 -0
- package/dist/src/api/utils/authConfig.js.map +1 -0
- package/dist/src/api/utils/requestContext.d.ts +14 -0
- package/dist/src/api/utils/requestContext.js +31 -0
- package/dist/src/api/utils/requestContext.js.map +1 -0
- package/dist/src/api/utils/routeHelper.d.ts +25 -0
- package/dist/src/api/utils/routeHelper.js +30 -0
- package/dist/src/api/utils/routeHelper.js.map +1 -0
- package/dist/src/api/welcomePage.d.ts +1 -0
- package/dist/src/api/welcomePage.js +259 -0
- package/dist/src/api/welcomePage.js.map +1 -0
- package/dist/src/bootstrap.d.ts +20 -0
- package/dist/src/bootstrap.js +128 -0
- package/dist/src/bootstrap.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +32 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config/AppConfig.d.ts +102 -0
- package/dist/src/config/AppConfig.js +452 -0
- package/dist/src/config/AppConfig.js.map +1 -0
- package/dist/src/config/redis.config.d.ts +6 -0
- package/dist/src/config/redis.config.js +9 -0
- package/dist/src/config/redis.config.js.map +1 -0
- package/dist/src/container.d.ts +29 -0
- package/dist/src/container.js +62 -0
- package/dist/src/container.js.map +1 -0
- package/dist/src/debug/BreakpointManager.d.ts +17 -0
- package/dist/src/debug/BreakpointManager.js +59 -0
- package/dist/src/debug/BreakpointManager.js.map +1 -0
- package/dist/src/debug/WorkflowDebugger.d.ts +34 -0
- package/dist/src/debug/WorkflowDebugger.js +117 -0
- package/dist/src/debug/WorkflowDebugger.js.map +1 -0
- package/dist/src/debug/index.d.ts +2 -0
- package/dist/src/debug/index.js +3 -0
- package/dist/src/debug/index.js.map +1 -0
- package/dist/src/demo/demoWorkflow.d.ts +3 -0
- package/dist/src/demo/demoWorkflow.js +82 -0
- package/dist/src/demo/demoWorkflow.js.map +1 -0
- package/dist/src/demo/exampleWorkflow.d.ts +36 -0
- package/dist/src/demo/exampleWorkflow.js +184 -0
- package/dist/src/demo/exampleWorkflow.js.map +1 -0
- package/dist/src/demo/index.d.ts +2 -0
- package/dist/src/demo/index.js +3 -0
- package/dist/src/demo/index.js.map +1 -0
- package/dist/src/dlq/DeadLetterQueue.d.ts +62 -0
- package/dist/src/dlq/DeadLetterQueue.js +342 -0
- package/dist/src/dlq/DeadLetterQueue.js.map +1 -0
- package/dist/src/dlq/index.d.ts +2 -0
- package/dist/src/dlq/index.js +2 -0
- package/dist/src/dlq/index.js.map +1 -0
- package/dist/src/dsl/DSLParser.d.ts +7 -0
- package/dist/src/dsl/DSLParser.js +252 -0
- package/dist/src/dsl/DSLParser.js.map +1 -0
- package/dist/src/dsl/WorkflowDSL.d.ts +40 -0
- package/dist/src/dsl/WorkflowDSL.js +2 -0
- package/dist/src/dsl/WorkflowDSL.js.map +1 -0
- package/dist/src/engine/CanaryReleaseManager.d.ts +39 -0
- package/dist/src/engine/CanaryReleaseManager.js +192 -0
- package/dist/src/engine/CanaryReleaseManager.js.map +1 -0
- package/dist/src/engine/ConcurrencyControl.d.ts +38 -0
- package/dist/src/engine/ConcurrencyControl.js +181 -0
- package/dist/src/engine/ConcurrencyControl.js.map +1 -0
- package/dist/src/engine/ContinueAsNewManager.d.ts +18 -0
- package/dist/src/engine/ContinueAsNewManager.js +29 -0
- package/dist/src/engine/ContinueAsNewManager.js.map +1 -0
- package/dist/src/engine/DataValidator.d.ts +15 -0
- package/dist/src/engine/DataValidator.js +121 -0
- package/dist/src/engine/DataValidator.js.map +1 -0
- package/dist/src/engine/DryRunExecutor.d.ts +48 -0
- package/dist/src/engine/DryRunExecutor.js +256 -0
- package/dist/src/engine/DryRunExecutor.js.map +1 -0
- package/dist/src/engine/ExecutionOrchestrator.d.ts +19 -0
- package/dist/src/engine/ExecutionOrchestrator.js +579 -0
- package/dist/src/engine/ExecutionOrchestrator.js.map +1 -0
- package/dist/src/engine/ExpressionEvaluator.d.ts +44 -0
- package/dist/src/engine/ExpressionEvaluator.js +1046 -0
- package/dist/src/engine/ExpressionEvaluator.js.map +1 -0
- package/dist/src/engine/HeartbeatManager.d.ts +42 -0
- package/dist/src/engine/HeartbeatManager.js +209 -0
- package/dist/src/engine/HeartbeatManager.js.map +1 -0
- package/dist/src/engine/InstanceManager.d.ts +21 -0
- package/dist/src/engine/InstanceManager.js +165 -0
- package/dist/src/engine/InstanceManager.js.map +1 -0
- package/dist/src/engine/InstanceSearch.d.ts +30 -0
- package/dist/src/engine/InstanceSearch.js +119 -0
- package/dist/src/engine/InstanceSearch.js.map +1 -0
- package/dist/src/engine/LifecycleManager.d.ts +18 -0
- package/dist/src/engine/LifecycleManager.js +82 -0
- package/dist/src/engine/LifecycleManager.js.map +1 -0
- package/dist/src/engine/ParallelExecutor.d.ts +26 -0
- package/dist/src/engine/ParallelExecutor.js +138 -0
- package/dist/src/engine/ParallelExecutor.js.map +1 -0
- package/dist/src/engine/SandboxEvaluator.d.ts +18 -0
- package/dist/src/engine/SandboxEvaluator.js +200 -0
- package/dist/src/engine/SandboxEvaluator.js.map +1 -0
- package/dist/src/engine/SchemaValidator.d.ts +30 -0
- package/dist/src/engine/SchemaValidator.js +630 -0
- package/dist/src/engine/SchemaValidator.js.map +1 -0
- package/dist/src/engine/SearchAttributeManager.d.ts +48 -0
- package/dist/src/engine/SearchAttributeManager.js +119 -0
- package/dist/src/engine/SearchAttributeManager.js.map +1 -0
- package/dist/src/engine/StateMachine.d.ts +13 -0
- package/dist/src/engine/StateMachine.js +66 -0
- package/dist/src/engine/StateMachine.js.map +1 -0
- package/dist/src/engine/StickyExecutionManager.d.ts +34 -0
- package/dist/src/engine/StickyExecutionManager.js +163 -0
- package/dist/src/engine/StickyExecutionManager.js.map +1 -0
- package/dist/src/engine/SubworkflowExecutor.d.ts +17 -0
- package/dist/src/engine/SubworkflowExecutor.js +157 -0
- package/dist/src/engine/SubworkflowExecutor.js.map +1 -0
- package/dist/src/engine/TaskExecutor.d.ts +12 -0
- package/dist/src/engine/TaskExecutor.js +124 -0
- package/dist/src/engine/TaskExecutor.js.map +1 -0
- package/dist/src/engine/TaskQueueManager.d.ts +42 -0
- package/dist/src/engine/TaskQueueManager.js +175 -0
- package/dist/src/engine/TaskQueueManager.js.map +1 -0
- package/dist/src/engine/WorkflowEngine.d.ts +117 -0
- package/dist/src/engine/WorkflowEngine.js +443 -0
- package/dist/src/engine/WorkflowEngine.js.map +1 -0
- package/dist/src/engine/WorkflowInstanceControl.d.ts +21 -0
- package/dist/src/engine/WorkflowInstanceControl.js +306 -0
- package/dist/src/engine/WorkflowInstanceControl.js.map +1 -0
- package/dist/src/engine/WorkflowPersistenceCoordinator.d.ts +12 -0
- package/dist/src/engine/WorkflowPersistenceCoordinator.js +93 -0
- package/dist/src/engine/WorkflowPersistenceCoordinator.js.map +1 -0
- package/dist/src/engine/WorkflowRegistry.d.ts +38 -0
- package/dist/src/engine/WorkflowRegistry.js +130 -0
- package/dist/src/engine/WorkflowRegistry.js.map +1 -0
- package/dist/src/engine/WorkflowVersionManager.d.ts +24 -0
- package/dist/src/engine/WorkflowVersionManager.js +121 -0
- package/dist/src/engine/WorkflowVersionManager.js.map +1 -0
- package/dist/src/engine/createEngine.d.ts +8 -0
- package/dist/src/engine/createEngine.js +21 -0
- package/dist/src/engine/createEngine.js.map +1 -0
- package/dist/src/engine/errors.d.ts +18 -0
- package/dist/src/engine/errors.js +37 -0
- package/dist/src/engine/errors.js.map +1 -0
- package/dist/src/engine/executors/ApprovalNodeExecutor.d.ts +12 -0
- package/dist/src/engine/executors/ApprovalNodeExecutor.js +68 -0
- package/dist/src/engine/executors/ApprovalNodeExecutor.js.map +1 -0
- package/dist/src/engine/executors/ConditionNodeExecutor.d.ts +16 -0
- package/dist/src/engine/executors/ConditionNodeExecutor.js +63 -0
- package/dist/src/engine/executors/ConditionNodeExecutor.js.map +1 -0
- package/dist/src/engine/executors/HttpNodeExecutor.d.ts +27 -0
- package/dist/src/engine/executors/HttpNodeExecutor.js +179 -0
- package/dist/src/engine/executors/HttpNodeExecutor.js.map +1 -0
- package/dist/src/engine/executors/JoinNodeExecutor.d.ts +13 -0
- package/dist/src/engine/executors/JoinNodeExecutor.js +37 -0
- package/dist/src/engine/executors/JoinNodeExecutor.js.map +1 -0
- package/dist/src/engine/executors/LoopNodeExecutor.d.ts +20 -0
- package/dist/src/engine/executors/LoopNodeExecutor.js +165 -0
- package/dist/src/engine/executors/LoopNodeExecutor.js.map +1 -0
- package/dist/src/engine/executors/NotificationNodeExecutor.d.ts +8 -0
- package/dist/src/engine/executors/NotificationNodeExecutor.js +33 -0
- package/dist/src/engine/executors/NotificationNodeExecutor.js.map +1 -0
- package/dist/src/engine/executors/QueueNodeExecutor.d.ts +23 -0
- package/dist/src/engine/executors/QueueNodeExecutor.js +87 -0
- package/dist/src/engine/executors/QueueNodeExecutor.js.map +1 -0
- package/dist/src/engine/executors/RouterNodeExecutor.d.ts +20 -0
- package/dist/src/engine/executors/RouterNodeExecutor.js +82 -0
- package/dist/src/engine/executors/RouterNodeExecutor.js.map +1 -0
- package/dist/src/engine/executors/SqlNodeExecutor.d.ts +27 -0
- package/dist/src/engine/executors/SqlNodeExecutor.js +74 -0
- package/dist/src/engine/executors/SqlNodeExecutor.js.map +1 -0
- package/dist/src/engine/executors/TransformNodeExecutor.d.ts +9 -0
- package/dist/src/engine/executors/TransformNodeExecutor.js +44 -0
- package/dist/src/engine/executors/TransformNodeExecutor.js.map +1 -0
- package/dist/src/engine/functions/collectionFunctions.d.ts +2 -0
- package/dist/src/engine/functions/collectionFunctions.js +129 -0
- package/dist/src/engine/functions/collectionFunctions.js.map +1 -0
- package/dist/src/engine/functions/customFunctions.d.ts +11 -0
- package/dist/src/engine/functions/customFunctions.js +42 -0
- package/dist/src/engine/functions/customFunctions.js.map +1 -0
- package/dist/src/engine/functions/dateFunctions.d.ts +2 -0
- package/dist/src/engine/functions/dateFunctions.js +71 -0
- package/dist/src/engine/functions/dateFunctions.js.map +1 -0
- package/dist/src/engine/functions/index.d.ts +14 -0
- package/dist/src/engine/functions/index.js +35 -0
- package/dist/src/engine/functions/index.js.map +1 -0
- package/dist/src/engine/functions/stringFunctions.d.ts +2 -0
- package/dist/src/engine/functions/stringFunctions.js +66 -0
- package/dist/src/engine/functions/stringFunctions.js.map +1 -0
- package/dist/src/engine/functions/typeFunctions.d.ts +2 -0
- package/dist/src/engine/functions/typeFunctions.js +70 -0
- package/dist/src/engine/functions/typeFunctions.js.map +1 -0
- package/dist/src/engine/functions/types.d.ts +6 -0
- package/dist/src/engine/functions/types.js +2 -0
- package/dist/src/engine/functions/types.js.map +1 -0
- package/dist/src/engine/index.d.ts +21 -0
- package/dist/src/engine/index.js +18 -0
- package/dist/src/engine/index.js.map +1 -0
- package/dist/src/engine/nodeDispatch/controlNodes.d.ts +2 -0
- package/dist/src/engine/nodeDispatch/controlNodes.js +208 -0
- package/dist/src/engine/nodeDispatch/controlNodes.js.map +1 -0
- package/dist/src/engine/nodeDispatch/helpers.d.ts +27 -0
- package/dist/src/engine/nodeDispatch/helpers.js +185 -0
- package/dist/src/engine/nodeDispatch/helpers.js.map +1 -0
- package/dist/src/engine/nodeDispatch/ioNodes.d.ts +2 -0
- package/dist/src/engine/nodeDispatch/ioNodes.js +89 -0
- package/dist/src/engine/nodeDispatch/ioNodes.js.map +1 -0
- package/dist/src/engine/nodeDispatch/types.d.ts +13 -0
- package/dist/src/engine/nodeDispatch/types.js +2 -0
- package/dist/src/engine/nodeDispatch/types.js.map +1 -0
- package/dist/src/engine/nodeDispatch/workflowNodes.d.ts +2 -0
- package/dist/src/engine/nodeDispatch/workflowNodes.js +33 -0
- package/dist/src/engine/nodeDispatch/workflowNodes.js.map +1 -0
- package/dist/src/engine/worker/ActionSandboxMessage.d.ts +29 -0
- package/dist/src/engine/worker/ActionSandboxMessage.js +7 -0
- package/dist/src/engine/worker/ActionSandboxMessage.js.map +1 -0
- package/dist/src/engine/worker/ActionSandboxPool.d.ts +34 -0
- package/dist/src/engine/worker/ActionSandboxPool.js +204 -0
- package/dist/src/engine/worker/ActionSandboxPool.js.map +1 -0
- package/dist/src/engine/worker/ActionSandboxWorker.d.ts +1 -0
- package/dist/src/engine/worker/ActionSandboxWorker.js +25 -0
- package/dist/src/engine/worker/ActionSandboxWorker.js.map +1 -0
- package/dist/src/engine/worker/WorkerMessage.d.ts +35 -0
- package/dist/src/engine/worker/WorkerMessage.js +7 -0
- package/dist/src/engine/worker/WorkerMessage.js.map +1 -0
- package/dist/src/engine/worker/WorkerPool.d.ts +42 -0
- package/dist/src/engine/worker/WorkerPool.js +273 -0
- package/dist/src/engine/worker/WorkerPool.js.map +1 -0
- package/dist/src/engine/worker/WorkerProcess.d.ts +1 -0
- package/dist/src/engine/worker/WorkerProcess.js +76 -0
- package/dist/src/engine/worker/WorkerProcess.js.map +1 -0
- package/dist/src/event/EventBus.d.ts +11 -0
- package/dist/src/event/EventBus.js +44 -0
- package/dist/src/event/EventBus.js.map +1 -0
- package/dist/src/event/EventCoordinator.d.ts +26 -0
- package/dist/src/event/EventCoordinator.js +205 -0
- package/dist/src/event/EventCoordinator.js.map +1 -0
- package/dist/src/event/EventDeduplicator.d.ts +31 -0
- package/dist/src/event/EventDeduplicator.js +100 -0
- package/dist/src/event/EventDeduplicator.js.map +1 -0
- package/dist/src/event/HookManager.d.ts +31 -0
- package/dist/src/event/HookManager.js +88 -0
- package/dist/src/event/HookManager.js.map +1 -0
- package/dist/src/event/MessageBus.d.ts +39 -0
- package/dist/src/event/MessageBus.js +131 -0
- package/dist/src/event/MessageBus.js.map +1 -0
- package/dist/src/event/index.d.ts +3 -0
- package/dist/src/event/index.js +4 -0
- package/dist/src/event/index.js.map +1 -0
- package/dist/src/index.d.ts +40 -0
- package/dist/src/index.js +33 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lifecycle.d.ts +17 -0
- package/dist/src/lifecycle.js +84 -0
- package/dist/src/lifecycle.js.map +1 -0
- package/dist/src/metrics/AnalyticsCollector.d.ts +57 -0
- package/dist/src/metrics/AnalyticsCollector.js +140 -0
- package/dist/src/metrics/AnalyticsCollector.js.map +1 -0
- package/dist/src/metrics/AnomalyDetector.d.ts +21 -0
- package/dist/src/metrics/AnomalyDetector.js +120 -0
- package/dist/src/metrics/AnomalyDetector.js.map +1 -0
- package/dist/src/metrics/MetricsAggregator.d.ts +43 -0
- package/dist/src/metrics/MetricsAggregator.js +243 -0
- package/dist/src/metrics/MetricsAggregator.js.map +1 -0
- package/dist/src/metrics/SlaMonitor.d.ts +48 -0
- package/dist/src/metrics/SlaMonitor.js +130 -0
- package/dist/src/metrics/SlaMonitor.js.map +1 -0
- package/dist/src/metrics/index.d.ts +75 -0
- package/dist/src/metrics/index.js +293 -0
- package/dist/src/metrics/index.js.map +1 -0
- package/dist/src/model/Instance.d.ts +38 -0
- package/dist/src/model/Instance.js +12 -0
- package/dist/src/model/Instance.js.map +1 -0
- package/dist/src/model/RetryPolicy.d.ts +11 -0
- package/dist/src/model/RetryPolicy.js +30 -0
- package/dist/src/model/RetryPolicy.js.map +1 -0
- package/dist/src/model/Schedule.d.ts +34 -0
- package/dist/src/model/Schedule.js +50 -0
- package/dist/src/model/Schedule.js.map +1 -0
- package/dist/src/model/Workflow.d.ts +73 -0
- package/dist/src/model/Workflow.js +2 -0
- package/dist/src/model/Workflow.js.map +1 -0
- package/dist/src/model/WorkflowGraph.d.ts +32 -0
- package/dist/src/model/WorkflowGraph.js +267 -0
- package/dist/src/model/WorkflowGraph.js.map +1 -0
- package/dist/src/model/WorkflowSchema.d.ts +154 -0
- package/dist/src/model/WorkflowSchema.js +233 -0
- package/dist/src/model/WorkflowSchema.js.map +1 -0
- package/dist/src/model/WorkflowVariables.d.ts +15 -0
- package/dist/src/model/WorkflowVariables.js +77 -0
- package/dist/src/model/WorkflowVariables.js.map +1 -0
- package/dist/src/notification/NotificationChannel.d.ts +19 -0
- package/dist/src/notification/NotificationChannel.js +2 -0
- package/dist/src/notification/NotificationChannel.js.map +1 -0
- package/dist/src/notification/NotificationManager.d.ts +20 -0
- package/dist/src/notification/NotificationManager.js +59 -0
- package/dist/src/notification/NotificationManager.js.map +1 -0
- package/dist/src/notification/channels/DingtalkChannel.d.ts +7 -0
- package/dist/src/notification/channels/DingtalkChannel.js +18 -0
- package/dist/src/notification/channels/DingtalkChannel.js.map +1 -0
- package/dist/src/notification/channels/EmailChannel.d.ts +21 -0
- package/dist/src/notification/channels/EmailChannel.js +32 -0
- package/dist/src/notification/channels/EmailChannel.js.map +1 -0
- package/dist/src/notification/channels/FeishuChannel.d.ts +7 -0
- package/dist/src/notification/channels/FeishuChannel.js +18 -0
- package/dist/src/notification/channels/FeishuChannel.js.map +1 -0
- package/dist/src/notification/channels/SlackChannel.d.ts +7 -0
- package/dist/src/notification/channels/SlackChannel.js +18 -0
- package/dist/src/notification/channels/SlackChannel.js.map +1 -0
- package/dist/src/notification/channels/SmsChannel.d.ts +24 -0
- package/dist/src/notification/channels/SmsChannel.js +37 -0
- package/dist/src/notification/channels/SmsChannel.js.map +1 -0
- package/dist/src/notification/channels/WebhookChannel.d.ts +17 -0
- package/dist/src/notification/channels/WebhookChannel.js +61 -0
- package/dist/src/notification/channels/WebhookChannel.js.map +1 -0
- package/dist/src/notification/index.d.ts +24 -0
- package/dist/src/notification/index.js +61 -0
- package/dist/src/notification/index.js.map +1 -0
- package/dist/src/scheduler/CronScheduler.d.ts +20 -0
- package/dist/src/scheduler/CronScheduler.js +82 -0
- package/dist/src/scheduler/CronScheduler.js.map +1 -0
- package/dist/src/scheduler/EnhancedCronScheduler.d.ts +27 -0
- package/dist/src/scheduler/EnhancedCronScheduler.js +177 -0
- package/dist/src/scheduler/EnhancedCronScheduler.js.map +1 -0
- package/dist/src/storage/ArchiveManager.d.ts +21 -0
- package/dist/src/storage/ArchiveManager.js +140 -0
- package/dist/src/storage/ArchiveManager.js.map +1 -0
- package/dist/src/storage/LocalFileStorage.d.ts +64 -0
- package/dist/src/storage/LocalFileStorage.js +470 -0
- package/dist/src/storage/LocalFileStorage.js.map +1 -0
- package/dist/src/storage/MemoryStorage.d.ts +65 -0
- package/dist/src/storage/MemoryStorage.js +422 -0
- package/dist/src/storage/MemoryStorage.js.map +1 -0
- package/dist/src/storage/StorageProvider.d.ts +223 -0
- package/dist/src/storage/StorageProvider.js +2 -0
- package/dist/src/storage/StorageProvider.js.map +1 -0
- package/dist/src/storage/builtin-adapters.d.ts +1 -0
- package/dist/src/storage/builtin-adapters.js +20 -0
- package/dist/src/storage/builtin-adapters.js.map +1 -0
- package/dist/src/storage/index.d.ts +17 -0
- package/dist/src/storage/index.js +52 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/storage/registry.d.ts +6 -0
- package/dist/src/storage/registry.js +23 -0
- package/dist/src/storage/registry.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +53 -0
- package/dist/src/telemetry/index.js +73 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/spanRegistry.d.ts +9 -0
- package/dist/src/telemetry/spanRegistry.js +14 -0
- package/dist/src/telemetry/spanRegistry.js.map +1 -0
- package/dist/src/templates/AutoExtract.d.ts +2 -0
- package/dist/src/templates/AutoExtract.js +124 -0
- package/dist/src/templates/AutoExtract.js.map +1 -0
- package/dist/src/templates/TemplateGallery.d.ts +54 -0
- package/dist/src/templates/TemplateGallery.js +139 -0
- package/dist/src/templates/TemplateGallery.js.map +1 -0
- package/dist/src/templates/TemplateRegistry.d.ts +16 -0
- package/dist/src/templates/TemplateRegistry.js +92 -0
- package/dist/src/templates/TemplateRegistry.js.map +1 -0
- package/dist/src/templates/WorkflowTemplate.d.ts +24 -0
- package/dist/src/templates/WorkflowTemplate.js +2 -0
- package/dist/src/templates/WorkflowTemplate.js.map +1 -0
- package/dist/src/templates/builtin/HttpCallbackTemplate.d.ts +2 -0
- package/dist/src/templates/builtin/HttpCallbackTemplate.js +47 -0
- package/dist/src/templates/builtin/HttpCallbackTemplate.js.map +1 -0
- package/dist/src/templates/builtin/index.d.ts +3 -0
- package/dist/src/templates/builtin/index.js +11 -0
- package/dist/src/templates/builtin/index.js.map +1 -0
- package/dist/src/templates/index.d.ts +3 -0
- package/dist/src/templates/index.js +3 -0
- package/dist/src/templates/index.js.map +1 -0
- package/dist/src/testing/MutationTester.d.ts +27 -0
- package/dist/src/testing/MutationTester.js +157 -0
- package/dist/src/testing/MutationTester.js.map +1 -0
- package/dist/src/testing/TestGenerator.d.ts +31 -0
- package/dist/src/testing/TestGenerator.js +345 -0
- package/dist/src/testing/TestGenerator.js.map +1 -0
- package/dist/src/testing/index.d.ts +2 -0
- package/dist/src/testing/index.js +3 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/testWorkflow.d.ts +51 -0
- package/dist/src/testing/testWorkflow.js +167 -0
- package/dist/src/testing/testWorkflow.js.map +1 -0
- package/dist/src/utils/AuditLogger.d.ts +36 -0
- package/dist/src/utils/AuditLogger.js +148 -0
- package/dist/src/utils/AuditLogger.js.map +1 -0
- package/dist/src/utils/BoundedMap.d.ts +34 -0
- package/dist/src/utils/BoundedMap.js +125 -0
- package/dist/src/utils/BoundedMap.js.map +1 -0
- package/dist/src/utils/LeaseStore.d.ts +7 -0
- package/dist/src/utils/LeaseStore.js +102 -0
- package/dist/src/utils/LeaseStore.js.map +1 -0
- package/dist/src/utils/Logger.d.ts +26 -0
- package/dist/src/utils/Logger.js +279 -0
- package/dist/src/utils/Logger.js.map +1 -0
- package/dist/src/utils/SecretManager.d.ts +41 -0
- package/dist/src/utils/SecretManager.js +139 -0
- package/dist/src/utils/SecretManager.js.map +1 -0
- package/dist/src/utils/StructuredLogger.d.ts +45 -0
- package/dist/src/utils/StructuredLogger.js +118 -0
- package/dist/src/utils/StructuredLogger.js.map +1 -0
- package/dist/src/utils/concurrency.d.ts +3 -0
- package/dist/src/utils/concurrency.js +22 -0
- package/dist/src/utils/concurrency.js.map +1 -0
- package/dist/src/utils/env.d.ts +5 -0
- package/dist/src/utils/env.js +15 -0
- package/dist/src/utils/env.js.map +1 -0
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/index.js +4 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/secrets.d.ts +5 -0
- package/dist/src/utils/secrets.js +27 -0
- package/dist/src/utils/secrets.js.map +1 -0
- package/package.json +159 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { parentPort, workerData } from "node:worker_threads";
|
|
2
|
+
if (!parentPort) {
|
|
3
|
+
throw new Error("WorkerProcess must be run as a worker thread");
|
|
4
|
+
}
|
|
5
|
+
const workerId = workerData?.workerId ?? "worker-unknown";
|
|
6
|
+
const executorCache = new Map();
|
|
7
|
+
parentPort.on("message", async (message) => {
|
|
8
|
+
if (message.type !== "execute") {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const executeMessage = message;
|
|
12
|
+
const startTime = Date.now();
|
|
13
|
+
try {
|
|
14
|
+
const executor = await loadExecutor(executeMessage.payload.nodeType);
|
|
15
|
+
const result = await executor.execute(executeMessage.payload.config, {
|
|
16
|
+
instanceId: executeMessage.payload.instanceId,
|
|
17
|
+
workflowId: executeMessage.payload.workflowId,
|
|
18
|
+
status: "running",
|
|
19
|
+
context: executeMessage.payload.context,
|
|
20
|
+
state: executeMessage.payload.state,
|
|
21
|
+
currentNodes: [executeMessage.payload.nodeId],
|
|
22
|
+
history: [],
|
|
23
|
+
createdAt: new Date(),
|
|
24
|
+
updatedAt: new Date(),
|
|
25
|
+
version: 0,
|
|
26
|
+
});
|
|
27
|
+
parentPort?.postMessage({
|
|
28
|
+
type: "result",
|
|
29
|
+
taskId: executeMessage.taskId,
|
|
30
|
+
payload: {
|
|
31
|
+
output: result,
|
|
32
|
+
duration: Date.now() - startTime,
|
|
33
|
+
workerId,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const normalizedError = error instanceof Error ? error : new Error(String(error));
|
|
39
|
+
parentPort?.postMessage({
|
|
40
|
+
type: "error",
|
|
41
|
+
taskId: executeMessage.taskId,
|
|
42
|
+
payload: {
|
|
43
|
+
message: normalizedError.message,
|
|
44
|
+
stack: normalizedError.stack,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
async function loadExecutor(nodeType) {
|
|
50
|
+
const cached = executorCache.get(nodeType);
|
|
51
|
+
if (cached) {
|
|
52
|
+
return cached;
|
|
53
|
+
}
|
|
54
|
+
const executor = await importExecutor(nodeType);
|
|
55
|
+
executorCache.set(nodeType, executor);
|
|
56
|
+
return executor;
|
|
57
|
+
}
|
|
58
|
+
async function importExecutor(nodeType) {
|
|
59
|
+
switch (nodeType) {
|
|
60
|
+
case "http": {
|
|
61
|
+
const module = await import("../executors/HttpNodeExecutor.js");
|
|
62
|
+
return module.HttpNodeExecutor;
|
|
63
|
+
}
|
|
64
|
+
case "sql": {
|
|
65
|
+
const module = await import("../executors/SqlNodeExecutor.js");
|
|
66
|
+
return module.SqlNodeExecutor;
|
|
67
|
+
}
|
|
68
|
+
case "queue": {
|
|
69
|
+
const module = await import("../executors/QueueNodeExecutor.js");
|
|
70
|
+
return module.QueueNodeExecutor;
|
|
71
|
+
}
|
|
72
|
+
default:
|
|
73
|
+
throw new Error(`No worker executor registered for node type: ${nodeType}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=WorkerProcess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerProcess.js","sourceRoot":"","sources":["../../../../src/engine/worker/WorkerProcess.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type EventHandler = (data: unknown) => void | Promise<void>;
|
|
2
|
+
export declare class EventBus {
|
|
3
|
+
private handlers;
|
|
4
|
+
on(event: string, handler: EventHandler): void;
|
|
5
|
+
emit(event: string, data: unknown): void;
|
|
6
|
+
off(event: string, handler: EventHandler): void;
|
|
7
|
+
protected dispatchLocal(event: string, data: unknown): void;
|
|
8
|
+
close(): Promise<void>;
|
|
9
|
+
listenerCount(): number;
|
|
10
|
+
}
|
|
11
|
+
export declare const eventBus: EventBus;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Logger } from "../utils/Logger.js";
|
|
2
|
+
export class EventBus {
|
|
3
|
+
handlers = {};
|
|
4
|
+
on(event, handler) {
|
|
5
|
+
if (!this.handlers[event])
|
|
6
|
+
this.handlers[event] = [];
|
|
7
|
+
this.handlers[event].push(handler);
|
|
8
|
+
}
|
|
9
|
+
emit(event, data) {
|
|
10
|
+
this.dispatchLocal(event, data);
|
|
11
|
+
}
|
|
12
|
+
off(event, handler) {
|
|
13
|
+
if (!this.handlers[event])
|
|
14
|
+
return;
|
|
15
|
+
this.handlers[event] = this.handlers[event].filter((h) => h !== handler);
|
|
16
|
+
}
|
|
17
|
+
dispatchLocal(event, data) {
|
|
18
|
+
if (this.handlers[event]) {
|
|
19
|
+
for (const h of this.handlers[event]) {
|
|
20
|
+
try {
|
|
21
|
+
const result = h(data);
|
|
22
|
+
if (result && typeof result.catch === "function") {
|
|
23
|
+
result.catch((error) => {
|
|
24
|
+
Logger.warn("system", "eventbus", `Async event handler error for '${event}'`, {
|
|
25
|
+
error: error instanceof Error ? error.message : String(error),
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
Logger.warn("system", "eventbus", `Event handler error for '${event}'`, { error: error instanceof Error ? error.message : String(error) });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async close() {
|
|
37
|
+
this.handlers = {};
|
|
38
|
+
}
|
|
39
|
+
listenerCount() {
|
|
40
|
+
return Object.values(this.handlers).reduce((total, list) => total + list.length, 0);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export const eventBus = new EventBus();
|
|
44
|
+
//# sourceMappingURL=EventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../../../src/event/EventBus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIzC,MAAM,OAAO,QAAQ;IACX,QAAQ,GAAmC,EAAE,CAAC;IAEtD,EAAE,CAAC,KAAa,EAAE,OAAqB;QACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,IAAa;QAC/B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,OAAqB;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO;QAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;IAC3E,CAAC;IAMS,aAAa,CAAC,KAAa,EAAE,IAAa;QAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;oBAEvB,IAAI,MAAM,IAAI,OAAQ,MAAwB,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;wBACnE,MAAwB,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;4BACjD,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,UAAU,EACV,kCAAkC,KAAK,GAAG,EAC1C;gCACE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;6BAC9D,CACF,CAAC;wBACJ,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,UAAU,EACV,4BAA4B,KAAK,GAAG,EACpC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAClE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IASD,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAGD,aAAa;QACX,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CACxC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EACpC,CAAC,CACF,CAAC;IACJ,CAAC;CACF;AAGD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { EventWaitingState, StorageProvider } from "../storage/StorageProvider.js";
|
|
2
|
+
import type { EventBus } from "./EventBus.js";
|
|
3
|
+
import { type AsyncEventDeduplicator } from "./EventDeduplicator.js";
|
|
4
|
+
export interface WaitForEventOptions {
|
|
5
|
+
condition?: string;
|
|
6
|
+
requireInstanceIdMatch?: boolean;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
onTimeout?: () => void;
|
|
9
|
+
onEvent?: (payload: any) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare class EventCoordinator {
|
|
12
|
+
private eventBus;
|
|
13
|
+
private storage;
|
|
14
|
+
private deduplicator;
|
|
15
|
+
private waitingTrackers;
|
|
16
|
+
constructor(eventBus: EventBus, storage: StorageProvider, deduplicator?: AsyncEventDeduplicator);
|
|
17
|
+
waitForEvent(instanceId: string, nodeId: string, eventType: string, options?: WaitForEventOptions): Promise<void>;
|
|
18
|
+
private subscribeToEvent;
|
|
19
|
+
private cleanup;
|
|
20
|
+
cancelWait(instanceId: string, nodeId: string): Promise<void>;
|
|
21
|
+
handleTimeout(instanceId: string, nodeId: string): Promise<void>;
|
|
22
|
+
restoreWaitingStates(shouldSkip?: (instanceId: string, nodeId: string) => boolean): Promise<void>;
|
|
23
|
+
getWaitingStates(): EventWaitingState[];
|
|
24
|
+
getWaitingState(instanceId: string, nodeId: string): EventWaitingState | undefined;
|
|
25
|
+
destroy(): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { evaluateCondition } from "../engine/ExpressionEvaluator.js";
|
|
2
|
+
import { recordEventWaitEnd, recordEventWaitStart } from "../metrics/index.js";
|
|
3
|
+
import { Logger } from "../utils/Logger.js";
|
|
4
|
+
import { createDeduplicator, } from "./EventDeduplicator.js";
|
|
5
|
+
export class EventCoordinator {
|
|
6
|
+
eventBus;
|
|
7
|
+
storage;
|
|
8
|
+
deduplicator;
|
|
9
|
+
waitingTrackers = new Map();
|
|
10
|
+
constructor(eventBus, storage, deduplicator) {
|
|
11
|
+
this.eventBus = eventBus;
|
|
12
|
+
this.storage = storage;
|
|
13
|
+
this.deduplicator = deduplicator ?? createDeduplicator();
|
|
14
|
+
}
|
|
15
|
+
async waitForEvent(instanceId, nodeId, eventType, options = {}) {
|
|
16
|
+
const { condition, requireInstanceIdMatch, timeoutMs, onTimeout, onEvent } = options;
|
|
17
|
+
const deadline = timeoutMs ? Date.now() + timeoutMs : undefined;
|
|
18
|
+
const state = {
|
|
19
|
+
instanceId,
|
|
20
|
+
nodeId,
|
|
21
|
+
eventType,
|
|
22
|
+
condition,
|
|
23
|
+
requireInstanceIdMatch,
|
|
24
|
+
timeoutMs,
|
|
25
|
+
deadline,
|
|
26
|
+
createdAt: Date.now(),
|
|
27
|
+
};
|
|
28
|
+
await this.storage.saveEventWaitingState(state);
|
|
29
|
+
Logger.info(instanceId, nodeId, `Event waiting state persisted for event ${eventType}`, { deadline, timeoutMs });
|
|
30
|
+
const instance = await this.storage.loadInstance(instanceId);
|
|
31
|
+
if (instance) {
|
|
32
|
+
recordEventWaitStart(instance.workflowId);
|
|
33
|
+
}
|
|
34
|
+
await this.subscribeToEvent(state, onTimeout, onEvent);
|
|
35
|
+
}
|
|
36
|
+
async subscribeToEvent(state, onTimeout, onEvent) {
|
|
37
|
+
const key = `${state.instanceId}:${state.nodeId}`;
|
|
38
|
+
if (this.waitingTrackers.has(key)) {
|
|
39
|
+
Logger.warn(state.instanceId, state.nodeId, `Already subscribed to event ${state.eventType}`);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
let processed = false;
|
|
43
|
+
const eventHandler = async (data) => {
|
|
44
|
+
if (processed) {
|
|
45
|
+
Logger.debug(state.instanceId, state.nodeId, `Event ${state.eventType} already processed, ignoring`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (state.requireInstanceIdMatch) {
|
|
49
|
+
if (!data || data.instanceId !== state.instanceId) {
|
|
50
|
+
Logger.debug(state.instanceId, state.nodeId, `Event ${state.eventType} instanceId mismatch, ignoring`, {
|
|
51
|
+
expected: state.instanceId,
|
|
52
|
+
received: data?.instanceId,
|
|
53
|
+
});
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (state.deadline && Date.now() > state.deadline) {
|
|
58
|
+
Logger.info(state.instanceId, state.nodeId, `Event ${state.eventType} arrived after timeout, ignoring`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (state.condition) {
|
|
62
|
+
const instance = await this.storage.loadInstance(state.instanceId);
|
|
63
|
+
if (!instance) {
|
|
64
|
+
Logger.warn(state.instanceId, state.nodeId, `Instance not found while evaluating condition for ${state.eventType}`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const matched = evaluateCondition(state.condition, {
|
|
68
|
+
context: instance.context,
|
|
69
|
+
state: instance.state,
|
|
70
|
+
event: data,
|
|
71
|
+
});
|
|
72
|
+
if (!matched) {
|
|
73
|
+
Logger.debug(state.instanceId, state.nodeId, `Event ${state.eventType} condition not matched, ignoring`, { condition: state.condition });
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const claimKey = `wait:${state.instanceId}:${state.nodeId}:${state.eventType}:${state.createdAt}`;
|
|
78
|
+
if (await this.deduplicator.isDuplicate(claimKey)) {
|
|
79
|
+
Logger.debug(state.instanceId, state.nodeId, `Event ${state.eventType} already claimed by another node, ignoring`);
|
|
80
|
+
processed = true;
|
|
81
|
+
await this.cleanup(state.instanceId, state.nodeId);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
processed = true;
|
|
85
|
+
Logger.info(state.instanceId, state.nodeId, `Event ${state.eventType} received and matched`);
|
|
86
|
+
await this.cleanup(state.instanceId, state.nodeId);
|
|
87
|
+
if (onEvent) {
|
|
88
|
+
onEvent(data);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
let timeoutId;
|
|
92
|
+
if (state.deadline) {
|
|
93
|
+
const timeoutDelay = state.deadline - Date.now();
|
|
94
|
+
if (timeoutDelay > 0) {
|
|
95
|
+
timeoutId = setTimeout(async () => {
|
|
96
|
+
if (processed) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
processed = true;
|
|
100
|
+
Logger.info(state.instanceId, state.nodeId, `Timeout expired for event ${state.eventType}`);
|
|
101
|
+
await this.cleanup(state.instanceId, state.nodeId);
|
|
102
|
+
if (onTimeout) {
|
|
103
|
+
onTimeout();
|
|
104
|
+
}
|
|
105
|
+
}, timeoutDelay);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
Logger.warn(state.instanceId, state.nodeId, `Deadline already passed for event ${state.eventType}`);
|
|
109
|
+
processed = true;
|
|
110
|
+
await this.cleanup(state.instanceId, state.nodeId);
|
|
111
|
+
if (onTimeout) {
|
|
112
|
+
onTimeout();
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const tracker = {
|
|
118
|
+
state,
|
|
119
|
+
timeoutId,
|
|
120
|
+
eventHandler,
|
|
121
|
+
onTimeout,
|
|
122
|
+
onEvent,
|
|
123
|
+
};
|
|
124
|
+
this.waitingTrackers.set(key, tracker);
|
|
125
|
+
this.eventBus.on(state.eventType, eventHandler);
|
|
126
|
+
Logger.debug(state.instanceId, state.nodeId, `Subscribed to event ${state.eventType}`, { deadline: state.deadline });
|
|
127
|
+
}
|
|
128
|
+
async cleanup(instanceId, nodeId) {
|
|
129
|
+
const key = `${instanceId}:${nodeId}`;
|
|
130
|
+
const tracker = this.waitingTrackers.get(key);
|
|
131
|
+
if (!tracker) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (tracker.timeoutId) {
|
|
135
|
+
clearTimeout(tracker.timeoutId);
|
|
136
|
+
}
|
|
137
|
+
if (tracker.eventHandler) {
|
|
138
|
+
this.eventBus.off(tracker.state.eventType, tracker.eventHandler);
|
|
139
|
+
}
|
|
140
|
+
this.waitingTrackers.delete(key);
|
|
141
|
+
await this.storage.deleteEventWaitingState(instanceId, nodeId);
|
|
142
|
+
const instance = await this.storage.loadInstance(instanceId);
|
|
143
|
+
if (instance) {
|
|
144
|
+
recordEventWaitEnd(instance.workflowId);
|
|
145
|
+
}
|
|
146
|
+
Logger.debug(instanceId, nodeId, "Event waiting state cleaned up");
|
|
147
|
+
}
|
|
148
|
+
async cancelWait(instanceId, nodeId) {
|
|
149
|
+
await this.cleanup(instanceId, nodeId);
|
|
150
|
+
Logger.info(instanceId, nodeId, "Event wait cancelled");
|
|
151
|
+
}
|
|
152
|
+
async handleTimeout(instanceId, nodeId) {
|
|
153
|
+
const key = `${instanceId}:${nodeId}`;
|
|
154
|
+
const tracker = this.waitingTrackers.get(key);
|
|
155
|
+
if (!tracker) {
|
|
156
|
+
Logger.warn(instanceId, nodeId, "No waiting state found for timeout handling");
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
Logger.info(instanceId, nodeId, `Handling timeout for event ${tracker.state.eventType}`);
|
|
160
|
+
await this.cleanup(instanceId, nodeId);
|
|
161
|
+
if (tracker.onTimeout) {
|
|
162
|
+
tracker.onTimeout();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async restoreWaitingStates(shouldSkip) {
|
|
166
|
+
Logger.info("system", "event-coordinator", "Restoring event waiting states from storage");
|
|
167
|
+
const states = await this.storage.loadAllEventWaitingStates();
|
|
168
|
+
Logger.info("system", "event-coordinator", `Found ${states.length} waiting states to restore`);
|
|
169
|
+
for (const state of states) {
|
|
170
|
+
if (shouldSkip?.(state.instanceId, state.nodeId)) {
|
|
171
|
+
Logger.debug(state.instanceId, state.nodeId, `Skipping waiting-state restore for ${state.eventType} — instance will be resumed directly`);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (state.deadline && Date.now() > state.deadline) {
|
|
175
|
+
Logger.info(state.instanceId, state.nodeId, `Deadline already passed for event ${state.eventType}, cleaning up`);
|
|
176
|
+
await this.storage.deleteEventWaitingState(state.instanceId, state.nodeId);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
await this.subscribeToEvent(state);
|
|
180
|
+
Logger.info(state.instanceId, state.nodeId, `Restored event waiting for ${state.eventType}`);
|
|
181
|
+
}
|
|
182
|
+
Logger.info("system", "event-coordinator", `Restored ${states.length} event waiting states`);
|
|
183
|
+
}
|
|
184
|
+
getWaitingStates() {
|
|
185
|
+
return Array.from(this.waitingTrackers.values()).map((tracker) => tracker.state);
|
|
186
|
+
}
|
|
187
|
+
getWaitingState(instanceId, nodeId) {
|
|
188
|
+
const key = `${instanceId}:${nodeId}`;
|
|
189
|
+
const tracker = this.waitingTrackers.get(key);
|
|
190
|
+
return tracker?.state;
|
|
191
|
+
}
|
|
192
|
+
destroy() {
|
|
193
|
+
for (const [key, tracker] of this.waitingTrackers) {
|
|
194
|
+
if (tracker.timeoutId) {
|
|
195
|
+
clearTimeout(tracker.timeoutId);
|
|
196
|
+
}
|
|
197
|
+
if (tracker.eventHandler) {
|
|
198
|
+
this.eventBus.off(tracker.state.eventType, tracker.eventHandler);
|
|
199
|
+
}
|
|
200
|
+
this.waitingTrackers.delete(key);
|
|
201
|
+
}
|
|
202
|
+
this.deduplicator.destroy();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=EventCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventCoordinator.js","sourceRoot":"","sources":["../../../src/event/EventCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare class EventDeduplicator {
|
|
2
|
+
private processedEvents;
|
|
3
|
+
private readonly ttlMs;
|
|
4
|
+
private cleanupInterval?;
|
|
5
|
+
constructor(ttlSeconds?: number);
|
|
6
|
+
isDuplicate(eventId: string): boolean;
|
|
7
|
+
markProcessed(eventId: string): void;
|
|
8
|
+
clearEvent(eventId: string): void;
|
|
9
|
+
private startCleanup;
|
|
10
|
+
private cleanup;
|
|
11
|
+
getStats(): {
|
|
12
|
+
totalRecords: number;
|
|
13
|
+
oldestRecordAge: number;
|
|
14
|
+
};
|
|
15
|
+
destroy(): void;
|
|
16
|
+
}
|
|
17
|
+
export interface AsyncEventDeduplicator {
|
|
18
|
+
isDuplicate(eventId: string): Promise<boolean>;
|
|
19
|
+
clearEvent(eventId: string): Promise<void>;
|
|
20
|
+
destroy(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare class MemoryAsyncDeduplicator implements AsyncEventDeduplicator {
|
|
23
|
+
private readonly inner;
|
|
24
|
+
constructor(ttlSeconds?: number);
|
|
25
|
+
isDuplicate(eventId: string): Promise<boolean>;
|
|
26
|
+
clearEvent(eventId: string): Promise<void>;
|
|
27
|
+
destroy(): void;
|
|
28
|
+
}
|
|
29
|
+
export declare function createDeduplicator(): AsyncEventDeduplicator;
|
|
30
|
+
export declare function getDeduplicator(): EventDeduplicator;
|
|
31
|
+
export declare function setDeduplicator(dedup: EventDeduplicator): void;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { parseEnvInt } from "../utils/env.js";
|
|
2
|
+
import { Logger } from "../utils/Logger.js";
|
|
3
|
+
export class EventDeduplicator {
|
|
4
|
+
processedEvents = new Map();
|
|
5
|
+
ttlMs;
|
|
6
|
+
cleanupInterval;
|
|
7
|
+
constructor(ttlSeconds = 86400) {
|
|
8
|
+
this.ttlMs = ttlSeconds * 1000;
|
|
9
|
+
this.startCleanup();
|
|
10
|
+
}
|
|
11
|
+
isDuplicate(eventId) {
|
|
12
|
+
const now = Date.now();
|
|
13
|
+
const existingTime = this.processedEvents.get(eventId);
|
|
14
|
+
if (existingTime && now - existingTime < this.ttlMs) {
|
|
15
|
+
Logger.debug("system", "dedup", `Duplicate event detected: ${eventId}`);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
this.processedEvents.set(eventId, now);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
markProcessed(eventId) {
|
|
22
|
+
this.processedEvents.set(eventId, Date.now());
|
|
23
|
+
}
|
|
24
|
+
clearEvent(eventId) {
|
|
25
|
+
this.processedEvents.delete(eventId);
|
|
26
|
+
}
|
|
27
|
+
startCleanup() {
|
|
28
|
+
this.cleanupInterval = setInterval(() => {
|
|
29
|
+
this.cleanup();
|
|
30
|
+
}, 3600000);
|
|
31
|
+
this.cleanupInterval.unref?.();
|
|
32
|
+
}
|
|
33
|
+
cleanup() {
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
let cleaned = 0;
|
|
36
|
+
for (const [eventId, timestamp] of this.processedEvents) {
|
|
37
|
+
if (now - timestamp > this.ttlMs) {
|
|
38
|
+
this.processedEvents.delete(eventId);
|
|
39
|
+
cleaned++;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (cleaned > 0) {
|
|
43
|
+
Logger.debug("system", "dedup", `Cleaned up ${cleaned} expired event records`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
getStats() {
|
|
47
|
+
let oldestAge = 0;
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
for (const timestamp of this.processedEvents.values()) {
|
|
50
|
+
const age = now - timestamp;
|
|
51
|
+
if (age > oldestAge) {
|
|
52
|
+
oldestAge = age;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
totalRecords: this.processedEvents.size,
|
|
57
|
+
oldestRecordAge: Math.floor(oldestAge / 1000),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
destroy() {
|
|
61
|
+
if (this.cleanupInterval) {
|
|
62
|
+
clearInterval(this.cleanupInterval);
|
|
63
|
+
this.cleanupInterval = undefined;
|
|
64
|
+
}
|
|
65
|
+
this.processedEvents.clear();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class MemoryAsyncDeduplicator {
|
|
69
|
+
inner;
|
|
70
|
+
constructor(ttlSeconds) {
|
|
71
|
+
this.inner = new EventDeduplicator(ttlSeconds ?? getDedupTtlSeconds());
|
|
72
|
+
}
|
|
73
|
+
async isDuplicate(eventId) {
|
|
74
|
+
return this.inner.isDuplicate(eventId);
|
|
75
|
+
}
|
|
76
|
+
async clearEvent(eventId) {
|
|
77
|
+
this.inner.clearEvent(eventId);
|
|
78
|
+
}
|
|
79
|
+
destroy() {
|
|
80
|
+
this.inner.destroy();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function getDedupTtlSeconds() {
|
|
84
|
+
return parseEnvInt(process.env.EVENT_DEDUP_TTL_SECONDS, 86_400, { min: 1 });
|
|
85
|
+
}
|
|
86
|
+
export function createDeduplicator() {
|
|
87
|
+
return new MemoryAsyncDeduplicator();
|
|
88
|
+
}
|
|
89
|
+
let deduplicatorInstance = null;
|
|
90
|
+
export function getDeduplicator() {
|
|
91
|
+
if (!deduplicatorInstance) {
|
|
92
|
+
const ttl = Number.parseInt(process.env.EVENT_DEDUP_TTL_SECONDS || "86400", 10);
|
|
93
|
+
deduplicatorInstance = new EventDeduplicator(ttl);
|
|
94
|
+
}
|
|
95
|
+
return deduplicatorInstance;
|
|
96
|
+
}
|
|
97
|
+
export function setDeduplicator(dedup) {
|
|
98
|
+
deduplicatorInstance = dedup;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=EventDeduplicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventDeduplicator.js","sourceRoot":"","sources":["../../../src/event/EventDeduplicator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type HookEventType = "workflow.started" | "workflow.completed" | "workflow.failed" | "workflow.rollback" | "workflow.cancelled" | "workflow.paused" | "workflow.resumed" | "node.started" | "node.completed" | "node.failed" | "node.retry" | "node.skipped" | "node.waiting";
|
|
2
|
+
export type HookEventName = HookEventType | (string & {});
|
|
3
|
+
export interface HookPayload {
|
|
4
|
+
event: HookEventName;
|
|
5
|
+
timestamp: string;
|
|
6
|
+
workflowId?: string;
|
|
7
|
+
instanceId?: string;
|
|
8
|
+
nodeId?: string;
|
|
9
|
+
status?: string;
|
|
10
|
+
traceId?: string;
|
|
11
|
+
data?: Record<string, any>;
|
|
12
|
+
}
|
|
13
|
+
export type HookListener = (payload: HookPayload) => void | Promise<void>;
|
|
14
|
+
export type HookDispatcher = (payload: HookPayload) => void | Promise<void>;
|
|
15
|
+
export interface HookPayloadInput extends Omit<HookPayload, "timestamp"> {
|
|
16
|
+
timestamp?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function createHookPayload(payload: HookPayloadInput): HookPayload;
|
|
19
|
+
export declare class HookManager {
|
|
20
|
+
private listeners;
|
|
21
|
+
private dispatcher?;
|
|
22
|
+
on(event: HookEventName | "*", handler: HookListener): () => void;
|
|
23
|
+
off(event: HookEventName | "*", handler: HookListener): void;
|
|
24
|
+
setDispatcher(dispatcher?: HookDispatcher): void;
|
|
25
|
+
emit(payload: HookPayload): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export declare const hookManager: HookManager;
|
|
28
|
+
export declare function onHook(event: HookEventName | "*", handler: HookListener): () => void;
|
|
29
|
+
export declare function offHook(event: HookEventName | "*", handler: HookListener): void;
|
|
30
|
+
export declare function emitHook(payload: HookPayload): Promise<void>;
|
|
31
|
+
export declare function setHookDispatcher(dispatcher?: HookDispatcher): void;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Logger } from "../utils/Logger.js";
|
|
2
|
+
export function createHookPayload(payload) {
|
|
3
|
+
return {
|
|
4
|
+
timestamp: payload.timestamp ?? new Date().toISOString(),
|
|
5
|
+
...payload,
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export class HookManager {
|
|
9
|
+
listeners = new Map();
|
|
10
|
+
dispatcher;
|
|
11
|
+
on(event, handler) {
|
|
12
|
+
const key = event || "*";
|
|
13
|
+
const existing = this.listeners.get(key);
|
|
14
|
+
if (existing) {
|
|
15
|
+
existing.add(handler);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
this.listeners.set(key, new Set([handler]));
|
|
19
|
+
}
|
|
20
|
+
return () => this.off(event, handler);
|
|
21
|
+
}
|
|
22
|
+
off(event, handler) {
|
|
23
|
+
const key = event || "*";
|
|
24
|
+
const existing = this.listeners.get(key);
|
|
25
|
+
if (!existing)
|
|
26
|
+
return;
|
|
27
|
+
existing.delete(handler);
|
|
28
|
+
if (existing.size === 0) {
|
|
29
|
+
this.listeners.delete(key);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
setDispatcher(dispatcher) {
|
|
33
|
+
this.dispatcher = dispatcher;
|
|
34
|
+
}
|
|
35
|
+
async emit(payload) {
|
|
36
|
+
const handlers = new Set();
|
|
37
|
+
const directHandlers = this.listeners.get(payload.event);
|
|
38
|
+
if (directHandlers) {
|
|
39
|
+
directHandlers.forEach((handler) => {
|
|
40
|
+
handlers.add(handler);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const wildcardHandlers = this.listeners.get("*");
|
|
44
|
+
if (wildcardHandlers) {
|
|
45
|
+
wildcardHandlers.forEach((handler) => {
|
|
46
|
+
handlers.add(handler);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const tasks = [];
|
|
50
|
+
if (this.dispatcher) {
|
|
51
|
+
tasks.push({
|
|
52
|
+
label: "dispatcher",
|
|
53
|
+
promise: Promise.resolve(this.dispatcher(payload)),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
handlers.forEach((handler) => {
|
|
57
|
+
tasks.push({
|
|
58
|
+
label: "listener",
|
|
59
|
+
promise: Promise.resolve(handler(payload)),
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
if (tasks.length === 0)
|
|
63
|
+
return;
|
|
64
|
+
const results = await Promise.allSettled(tasks.map((task) => task.promise));
|
|
65
|
+
results.forEach((result, index) => {
|
|
66
|
+
if (result.status === "rejected") {
|
|
67
|
+
const label = tasks[index]?.label || "listener";
|
|
68
|
+
Logger.error("hook", "dispatch", `Hook ${label} failed for ${payload.event}`, result.reason instanceof Error
|
|
69
|
+
? result.reason.stack
|
|
70
|
+
: String(result.reason));
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export const hookManager = new HookManager();
|
|
76
|
+
export function onHook(event, handler) {
|
|
77
|
+
return hookManager.on(event, handler);
|
|
78
|
+
}
|
|
79
|
+
export function offHook(event, handler) {
|
|
80
|
+
hookManager.off(event, handler);
|
|
81
|
+
}
|
|
82
|
+
export function emitHook(payload) {
|
|
83
|
+
return hookManager.emit(payload);
|
|
84
|
+
}
|
|
85
|
+
export function setHookDispatcher(dispatcher) {
|
|
86
|
+
hookManager.setDispatcher(dispatcher);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=HookManager.js.map
|