ai-workflows 2.1.3 → 2.4.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +14 -1
- package/README.md +2 -0
- package/dist/barrier.d.ts +6 -0
- package/dist/barrier.d.ts.map +1 -1
- package/dist/barrier.js +45 -7
- package/dist/barrier.js.map +1 -1
- package/dist/cascade-context.d.ts.map +1 -1
- package/dist/cascade-context.js +25 -25
- package/dist/cascade-context.js.map +1 -1
- package/dist/cascade-executor.d.ts.map +1 -1
- package/dist/cascade-executor.js +1 -1
- package/dist/cascade-executor.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +23 -7
- package/dist/context.js.map +1 -1
- package/dist/cron-parser.d.ts +65 -0
- package/dist/cron-parser.d.ts.map +1 -0
- package/dist/cron-parser.js +294 -0
- package/dist/cron-parser.js.map +1 -0
- package/dist/cron-scheduler.d.ts +117 -0
- package/dist/cron-scheduler.d.ts.map +1 -0
- package/dist/cron-scheduler.js +176 -0
- package/dist/cron-scheduler.js.map +1 -0
- package/dist/database-context.d.ts +184 -0
- package/dist/database-context.d.ts.map +1 -0
- package/dist/database-context.js +428 -0
- package/dist/database-context.js.map +1 -0
- package/dist/digital-objects-adapter.d.ts +159 -0
- package/dist/digital-objects-adapter.d.ts.map +1 -0
- package/dist/digital-objects-adapter.js +229 -0
- package/dist/digital-objects-adapter.js.map +1 -0
- package/dist/durable-execution-cloudflare.d.ts +427 -0
- package/dist/durable-execution-cloudflare.d.ts.map +1 -0
- package/dist/durable-execution-cloudflare.js +510 -0
- package/dist/durable-execution-cloudflare.js.map +1 -0
- package/dist/durable-execution.d.ts +482 -0
- package/dist/durable-execution.d.ts.map +1 -0
- package/dist/durable-execution.js +594 -0
- package/dist/durable-execution.js.map +1 -0
- package/dist/durable-workflow.d.ts +176 -0
- package/dist/durable-workflow.d.ts.map +1 -0
- package/dist/durable-workflow.js +552 -0
- package/dist/durable-workflow.js.map +1 -0
- package/dist/graph/topological-sort.d.ts.map +1 -1
- package/dist/graph/topological-sort.js +5 -5
- package/dist/graph/topological-sort.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +101 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +115 -0
- package/dist/logger.js.map +1 -0
- package/dist/on.d.ts.map +1 -1
- package/dist/on.js +3 -3
- package/dist/on.js.map +1 -1
- package/dist/runtime.d.ts +169 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +275 -0
- package/dist/runtime.js.map +1 -0
- package/dist/send.d.ts.map +1 -1
- package/dist/send.js +4 -3
- package/dist/send.js.map +1 -1
- package/dist/telemetry.d.ts +150 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +388 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/timer-registry.d.ts +25 -0
- package/dist/timer-registry.d.ts.map +1 -1
- package/dist/timer-registry.js +42 -8
- package/dist/timer-registry.js.map +1 -1
- package/dist/types.d.ts +17 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/worker/durable-step.d.ts +481 -0
- package/dist/worker/durable-step.d.ts.map +1 -0
- package/dist/worker/durable-step.js +606 -0
- package/dist/worker/durable-step.js.map +1 -0
- package/dist/worker/index.d.ts +106 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +124 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/state-adapter.d.ts +230 -0
- package/dist/worker/state-adapter.d.ts.map +1 -0
- package/dist/worker/state-adapter.js +409 -0
- package/dist/worker/state-adapter.js.map +1 -0
- package/dist/worker/topological-executor.d.ts +282 -0
- package/dist/worker/topological-executor.d.ts.map +1 -0
- package/dist/worker/topological-executor.js +396 -0
- package/dist/worker/topological-executor.js.map +1 -0
- package/dist/worker/workflow-builder.d.ts +286 -0
- package/dist/worker/workflow-builder.d.ts.map +1 -0
- package/dist/worker/workflow-builder.js +565 -0
- package/dist/worker/workflow-builder.js.map +1 -0
- package/dist/worker.d.ts +800 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +2428 -0
- package/dist/worker.js.map +1 -0
- package/dist/workflow-builder.d.ts +287 -0
- package/dist/workflow-builder.d.ts.map +1 -0
- package/dist/workflow-builder.js +762 -0
- package/dist/workflow-builder.js.map +1 -0
- package/dist/workflow.d.ts +14 -30
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +132 -292
- package/dist/workflow.js.map +1 -1
- package/examples/01-ecommerce-order-pipeline.ts +358 -0
- package/examples/02-content-moderation-cascade.ts +454 -0
- package/examples/03-scheduled-reporting-dependencies.ts +479 -0
- package/examples/04-database-persistence.ts +518 -0
- package/examples/README.md +173 -0
- package/package.json +30 -13
- package/src/__tests__/digital-objects-adapter.test.ts +274 -0
- package/src/__tests__/durable-workflow.test.ts +297 -0
- package/src/barrier.ts +48 -7
- package/src/cascade-context.ts +36 -29
- package/src/cascade-executor.ts +3 -2
- package/src/context.ts +41 -12
- package/src/cron-parser.ts +347 -0
- package/src/cron-scheduler.ts +239 -0
- package/src/database-context.ts +658 -0
- package/src/digital-objects-adapter.ts +351 -0
- package/src/durable-execution-cloudflare.ts +855 -0
- package/src/durable-execution.ts +1042 -0
- package/src/durable-workflow.ts +717 -0
- package/src/graph/topological-sort.ts +6 -8
- package/src/index.ts +69 -0
- package/src/logger.ts +148 -0
- package/src/on.ts +8 -9
- package/src/runtime.ts +436 -0
- package/src/send.ts +4 -5
- package/src/telemetry.ts +577 -0
- package/src/timer-registry.ts +44 -10
- package/src/types.ts +32 -17
- package/src/worker/durable-step.ts +976 -0
- package/src/worker/index.ts +216 -0
- package/src/worker/state-adapter.ts +589 -0
- package/src/worker/topological-executor.ts +625 -0
- package/src/worker/workflow-builder.ts +871 -0
- package/src/worker.ts +2906 -0
- package/src/workflow-builder.ts +1068 -0
- package/src/workflow.ts +188 -351
- package/test/barrier-join.test.ts +32 -24
- package/test/cascade-executor.test.ts +9 -16
- package/test/cron-parser.test.ts +314 -0
- package/test/cron-scheduler.test.ts +291 -0
- package/test/database-context.test.ts +770 -0
- package/test/db-provider-adapter.test.ts +862 -0
- package/test/durable-execution-cloudflare.test.ts +606 -0
- package/test/durable-execution-in-process.test.ts +286 -0
- package/test/durable-execution.test.ts +247 -0
- package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
- package/test/integration.test.ts +442 -0
- package/test/rpc-surface.test.ts +946 -0
- package/test/runtime.test.ts +262 -0
- package/test/schedule-timer-cleanup.test.ts +30 -21
- package/test/send-race-conditions.test.ts +30 -40
- package/test/worker/durable-cascade.test.ts +1117 -0
- package/test/worker/durable-step.test.ts +723 -0
- package/test/worker/topological-executor.test.ts +1240 -0
- package/test/worker/workflow-builder.test.ts +1067 -0
- package/test/worker.test.ts +608 -0
- package/test/workflow-builder.test.ts +1670 -0
- package/test/workflow-cron.test.ts +256 -0
- package/test/workflow-state-adapter.test.ts +923 -0
- package/test/workflow.test.ts +25 -22
- package/tsconfig.json +3 -1
- package/vitest.config.ts +38 -1
- package/vitest.workers.config.ts +44 -0
- package/wrangler.jsonc +22 -0
- package/.turbo/turbo-test.log +0 -169
- package/LICENSE +0 -21
- package/src/context.js +0 -83
- package/src/every.js +0 -267
- package/src/index.js +0 -71
- package/src/on.js +0 -79
- package/src/send.js +0 -111
- package/src/types.js +0 -4
- package/src/workflow.js +0 -455
- package/test/context.test.js +0 -116
- package/test/every.test.js +0 -282
- package/test/on.test.js +0 -80
- package/test/send.test.js +0 -89
- package/test/workflow.test.js +0 -224
- package/vitest.config.js +0 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-builder.js","sourceRoot":"","sources":["../src/workflow-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/workflow.d.ts
CHANGED
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import type { WorkflowContext, WorkflowState, WorkflowDefinition, WorkflowOptions, ParsedEvent } from './types.js';
|
|
17
17
|
/**
|
|
18
|
-
* Parse event string into noun and event
|
|
18
|
+
* Parse event string into noun and event.
|
|
19
|
+
* Re-exported from runtime.ts for backward compatibility — the canonical
|
|
20
|
+
* implementation lives there because dispatch owns event-name parsing.
|
|
19
21
|
*/
|
|
20
22
|
export declare function parseEvent(event: string): ParsedEvent | null;
|
|
21
23
|
/**
|
|
@@ -34,35 +36,17 @@ export interface WorkflowInstance {
|
|
|
34
36
|
start: () => Promise<void>;
|
|
35
37
|
/** Stop the workflow */
|
|
36
38
|
stop: () => Promise<void>;
|
|
39
|
+
/** Destroy the workflow and clean up all resources */
|
|
40
|
+
destroy: () => Promise<void>;
|
|
41
|
+
/** Dispose pattern for cleanup */
|
|
42
|
+
dispose: () => void;
|
|
43
|
+
/** Symbol.dispose for using declaration support */
|
|
44
|
+
[Symbol.dispose]: () => void;
|
|
45
|
+
/** Number of active timers */
|
|
46
|
+
timerCount: number;
|
|
47
|
+
/** Get timer IDs for this workflow */
|
|
48
|
+
getTimerIds: () => string[];
|
|
37
49
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Create a workflow with the $ context
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```ts
|
|
43
|
-
* const workflow = Workflow($ => {
|
|
44
|
-
* $.on.Customer.created(async (customer, $) => {
|
|
45
|
-
* $.log('New customer:', customer.name)
|
|
46
|
-
* await $.send('Email.welcome', { to: customer.email })
|
|
47
|
-
* })
|
|
48
|
-
*
|
|
49
|
-
* $.every.hour(async ($) => {
|
|
50
|
-
* $.log('Hourly check')
|
|
51
|
-
* })
|
|
52
|
-
*
|
|
53
|
-
* $.every.Monday.at9am(async ($) => {
|
|
54
|
-
* $.log('Weekly standup')
|
|
55
|
-
* })
|
|
56
|
-
*
|
|
57
|
-
* $.every('first Monday of the month', async ($) => {
|
|
58
|
-
* $.log('Monthly report')
|
|
59
|
-
* })
|
|
60
|
-
* })
|
|
61
|
-
*
|
|
62
|
-
* await workflow.start()
|
|
63
|
-
* await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
|
|
64
|
-
* ```
|
|
65
|
-
*/
|
|
66
50
|
export declare function Workflow(setup: ($: WorkflowContext) => void, options?: WorkflowOptions): WorkflowInstance;
|
|
67
51
|
/**
|
|
68
52
|
* Create an isolated $ context for testing
|
|
@@ -74,6 +58,6 @@ export declare function createTestContext(): WorkflowContext & {
|
|
|
74
58
|
}>;
|
|
75
59
|
};
|
|
76
60
|
export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
|
|
77
|
-
export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter } from './every.js';
|
|
61
|
+
export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter, } from './every.js';
|
|
78
62
|
export { send } from './send.js';
|
|
79
63
|
//# sourceMappingURL=workflow.d.ts.map
|
package/dist/workflow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,aAAa,
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EAGb,kBAAkB,EAClB,eAAe,EAIf,WAAW,EACZ,MAAM,YAAY,CAAA;AAYnB;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,UAAU,EAAE,kBAAkB,CAAA;IAC9B,oBAAoB;IACpB,KAAK,EAAE,aAAa,CAAA;IACpB,oBAAoB;IACpB,CAAC,EAAE,eAAe,CAAA;IAClB,oBAAoB;IACpB,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,sDAAsD;IACtD,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,wBAAwB;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,sDAAsD;IACtD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,kCAAkC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,mDAAmD;IACnD,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,WAAW,EAAE,MAAM,MAAM,EAAE,CAAA;CAC5B;AAiCD,wBAAgB,QAAQ,CACtB,KAAK,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,EACnC,OAAO,GAAE,eAAoB,GAC5B,gBAAgB,CAgNlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,eAAe,GAAG;IACrD,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACvD,CA2EA;AAGD,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EACL,KAAK,EACL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,MAAM,EACN,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA"}
|
package/dist/workflow.js
CHANGED
|
@@ -13,75 +13,18 @@
|
|
|
13
13
|
* })
|
|
14
14
|
* })
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
16
|
+
import { registerTimer, clearTimersForWorkflow, getTimerIdsForWorkflow, registerProcessCleanup, } from './timer-registry.js';
|
|
17
|
+
import { createCronJob, stopCronJob } from './cron-scheduler.js';
|
|
18
|
+
import { toCron } from './every.js';
|
|
19
|
+
import { getLogger } from './logger.js';
|
|
20
|
+
import { createWorkflowRuntime, parseEvent as runtimeParseEvent } from './runtime.js';
|
|
17
21
|
/**
|
|
18
|
-
*
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
second: '* * * * * *',
|
|
22
|
-
minute: '* * * * *',
|
|
23
|
-
hour: '0 * * * *',
|
|
24
|
-
day: '0 0 * * *',
|
|
25
|
-
week: '0 0 * * 0',
|
|
26
|
-
month: '0 0 1 * *',
|
|
27
|
-
year: '0 0 1 1 *',
|
|
28
|
-
Monday: '0 0 * * 1',
|
|
29
|
-
Tuesday: '0 0 * * 2',
|
|
30
|
-
Wednesday: '0 0 * * 3',
|
|
31
|
-
Thursday: '0 0 * * 4',
|
|
32
|
-
Friday: '0 0 * * 5',
|
|
33
|
-
Saturday: '0 0 * * 6',
|
|
34
|
-
Sunday: '0 0 * * 0',
|
|
35
|
-
weekday: '0 0 * * 1-5',
|
|
36
|
-
weekend: '0 0 * * 0,6',
|
|
37
|
-
midnight: '0 0 * * *',
|
|
38
|
-
noon: '0 12 * * *',
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Time suffixes for day-based schedules
|
|
42
|
-
*/
|
|
43
|
-
const TIME_PATTERNS = {
|
|
44
|
-
at6am: { hour: 6, minute: 0 },
|
|
45
|
-
at7am: { hour: 7, minute: 0 },
|
|
46
|
-
at8am: { hour: 8, minute: 0 },
|
|
47
|
-
at9am: { hour: 9, minute: 0 },
|
|
48
|
-
at10am: { hour: 10, minute: 0 },
|
|
49
|
-
at11am: { hour: 11, minute: 0 },
|
|
50
|
-
at12pm: { hour: 12, minute: 0 },
|
|
51
|
-
atnoon: { hour: 12, minute: 0 },
|
|
52
|
-
at1pm: { hour: 13, minute: 0 },
|
|
53
|
-
at2pm: { hour: 14, minute: 0 },
|
|
54
|
-
at3pm: { hour: 15, minute: 0 },
|
|
55
|
-
at4pm: { hour: 16, minute: 0 },
|
|
56
|
-
at5pm: { hour: 17, minute: 0 },
|
|
57
|
-
at6pm: { hour: 18, minute: 0 },
|
|
58
|
-
at7pm: { hour: 19, minute: 0 },
|
|
59
|
-
at8pm: { hour: 20, minute: 0 },
|
|
60
|
-
at9pm: { hour: 21, minute: 0 },
|
|
61
|
-
atmidnight: { hour: 0, minute: 0 },
|
|
62
|
-
};
|
|
63
|
-
/**
|
|
64
|
-
* Combine a day pattern with a time pattern
|
|
65
|
-
*/
|
|
66
|
-
function combineWithTime(baseCron, time) {
|
|
67
|
-
const parts = baseCron.split(' ');
|
|
68
|
-
parts[0] = String(time.minute);
|
|
69
|
-
parts[1] = String(time.hour);
|
|
70
|
-
return parts.join(' ');
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Parse event string into noun and event
|
|
22
|
+
* Parse event string into noun and event.
|
|
23
|
+
* Re-exported from runtime.ts for backward compatibility — the canonical
|
|
24
|
+
* implementation lives there because dispatch owns event-name parsing.
|
|
74
25
|
*/
|
|
75
26
|
export function parseEvent(event) {
|
|
76
|
-
|
|
77
|
-
if (parts.length !== 2) {
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
const [noun, eventName] = parts;
|
|
81
|
-
if (!noun || !eventName) {
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
return { noun, event: eventName };
|
|
27
|
+
return runtimeParseEvent(event);
|
|
85
28
|
}
|
|
86
29
|
/**
|
|
87
30
|
* Create a workflow with the $ context
|
|
@@ -111,19 +54,30 @@ export function parseEvent(event) {
|
|
|
111
54
|
* await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
|
|
112
55
|
* ```
|
|
113
56
|
*/
|
|
57
|
+
// Counter for generating unique workflow IDs
|
|
58
|
+
let workflowCounter = 0;
|
|
114
59
|
export function Workflow(setup, options = {}) {
|
|
115
|
-
//
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
60
|
+
// Generate unique workflow ID
|
|
61
|
+
const workflowId = `workflow-${++workflowCounter}-${Date.now()}`;
|
|
62
|
+
// Construct the runtime — it owns the $ contract end-to-end:
|
|
63
|
+
// event registry, schedule registry, dispatch, history, and state. The
|
|
64
|
+
// Workflow wrapper here is just a lifecycle shell around the runtime
|
|
65
|
+
// (timers, cron jobs, dispose pattern).
|
|
66
|
+
const runtime = createWorkflowRuntime({
|
|
67
|
+
...(options.context !== undefined && { context: options.context }),
|
|
68
|
+
...(options.db !== undefined && { db: options.db }),
|
|
69
|
+
name: 'workflow',
|
|
70
|
+
});
|
|
71
|
+
const $ = runtime.$;
|
|
72
|
+
const state = runtime.state;
|
|
73
|
+
const eventRegistry = runtime.getEventRegistry();
|
|
74
|
+
const scheduleRegistry = runtime.getScheduleRegistry();
|
|
75
|
+
// Schedule timers (local reference, actual timers are in registry)
|
|
124
76
|
let scheduleTimers = [];
|
|
77
|
+
// Cron jobs for cron/natural schedules
|
|
78
|
+
const cronJobs = [];
|
|
125
79
|
/**
|
|
126
|
-
*
|
|
80
|
+
* Append to workflow history (used by schedule firing below).
|
|
127
81
|
*/
|
|
128
82
|
const addHistory = (entry) => {
|
|
129
83
|
state.history.push({
|
|
@@ -131,206 +85,14 @@ export function Workflow(setup, options = {}) {
|
|
|
131
85
|
timestamp: Date.now(),
|
|
132
86
|
});
|
|
133
87
|
};
|
|
134
|
-
|
|
135
|
-
* Register an event handler
|
|
136
|
-
*/
|
|
137
|
-
const registerEventHandler = (noun, event, handler) => {
|
|
138
|
-
eventRegistry.push({
|
|
139
|
-
noun,
|
|
140
|
-
event,
|
|
141
|
-
handler,
|
|
142
|
-
source: handler.toString(),
|
|
143
|
-
});
|
|
144
|
-
};
|
|
145
|
-
/**
|
|
146
|
-
* Register a schedule handler
|
|
147
|
-
*/
|
|
148
|
-
const registerScheduleHandler = (interval, handler) => {
|
|
149
|
-
scheduleRegistry.push({
|
|
150
|
-
interval,
|
|
151
|
-
handler,
|
|
152
|
-
source: handler.toString(),
|
|
153
|
-
});
|
|
154
|
-
};
|
|
155
|
-
/**
|
|
156
|
-
* Create the $.on proxy
|
|
157
|
-
*/
|
|
158
|
-
const createOnProxy = () => {
|
|
159
|
-
return new Proxy({}, {
|
|
160
|
-
get(_target, noun) {
|
|
161
|
-
return new Proxy({}, {
|
|
162
|
-
get(_eventTarget, event) {
|
|
163
|
-
return (handler) => {
|
|
164
|
-
registerEventHandler(noun, event, handler);
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
};
|
|
171
|
-
/**
|
|
172
|
-
* Create the $.every proxy
|
|
173
|
-
*/
|
|
174
|
-
const createEveryProxy = () => {
|
|
175
|
-
const handler = {
|
|
176
|
-
get(_target, prop) {
|
|
177
|
-
const pattern = KNOWN_PATTERNS[prop];
|
|
178
|
-
if (pattern) {
|
|
179
|
-
const result = (handlerFn) => {
|
|
180
|
-
registerScheduleHandler({ type: 'cron', expression: pattern, natural: prop }, handlerFn);
|
|
181
|
-
};
|
|
182
|
-
return new Proxy(result, {
|
|
183
|
-
get(_t, timeKey) {
|
|
184
|
-
const time = TIME_PATTERNS[timeKey];
|
|
185
|
-
if (time) {
|
|
186
|
-
const cron = combineWithTime(pattern, time);
|
|
187
|
-
return (handlerFn) => {
|
|
188
|
-
registerScheduleHandler({ type: 'cron', expression: cron, natural: `${prop}.${timeKey}` }, handlerFn);
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
return undefined;
|
|
192
|
-
},
|
|
193
|
-
apply(_t, _thisArg, args) {
|
|
194
|
-
registerScheduleHandler({ type: 'cron', expression: pattern, natural: prop }, args[0]);
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
// Plural units (seconds, minutes, hours, days, weeks)
|
|
199
|
-
// Using type guard and typed constant for type-safe interval creation
|
|
200
|
-
if (isPluralUnitKey(prop)) {
|
|
201
|
-
const intervalType = PLURAL_UNITS[prop];
|
|
202
|
-
return (value) => (handlerFn) => {
|
|
203
|
-
registerScheduleHandler({ type: intervalType, value, natural: `${value} ${prop}` }, handlerFn);
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
return undefined;
|
|
207
|
-
},
|
|
208
|
-
apply(_target, _thisArg, args) {
|
|
209
|
-
const [description, handler] = args;
|
|
210
|
-
if (typeof description === 'string' && typeof handler === 'function') {
|
|
211
|
-
registerScheduleHandler({ type: 'natural', description }, handler);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
// Create callable target with proper typing
|
|
216
|
-
// The function serves as the Proxy target - actual behavior is in the handler's apply trap
|
|
217
|
-
// Cast to EveryProxy is safe: Proxy handler implements all EveryProxy behaviors dynamically
|
|
218
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
219
|
-
const target = function (_description, _handler) { };
|
|
220
|
-
return new Proxy(target, handler);
|
|
221
|
-
};
|
|
222
|
-
/**
|
|
223
|
-
* Deliver an event to matching handlers (fire and forget)
|
|
224
|
-
*/
|
|
225
|
-
const deliverEvent = async (event, data) => {
|
|
226
|
-
const parsed = parseEvent(event);
|
|
227
|
-
if (!parsed) {
|
|
228
|
-
console.warn(`Invalid event format: ${event}. Expected Noun.event`);
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
const matching = eventRegistry.filter(h => h.noun === parsed.noun && h.event === parsed.event);
|
|
232
|
-
if (matching.length === 0) {
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
await Promise.all(matching.map(async ({ handler }) => {
|
|
236
|
-
try {
|
|
237
|
-
await handler(data, $);
|
|
238
|
-
}
|
|
239
|
-
catch (error) {
|
|
240
|
-
console.error(`Error in handler for ${event}:`, error);
|
|
241
|
-
}
|
|
242
|
-
}));
|
|
243
|
-
};
|
|
244
|
-
/**
|
|
245
|
-
* Execute an event and wait for result from first matching handler
|
|
246
|
-
*/
|
|
247
|
-
const executeEvent = async (event, data, durable) => {
|
|
248
|
-
const parsed = parseEvent(event);
|
|
249
|
-
if (!parsed) {
|
|
250
|
-
throw new Error(`Invalid event format: ${event}. Expected Noun.event`);
|
|
251
|
-
}
|
|
252
|
-
const matching = eventRegistry.filter(h => h.noun === parsed.noun && h.event === parsed.event);
|
|
253
|
-
if (matching.length === 0) {
|
|
254
|
-
throw new Error(`No handler registered for ${event}`);
|
|
255
|
-
}
|
|
256
|
-
// Use first matching handler for result
|
|
257
|
-
const { handler } = matching[0];
|
|
258
|
-
if (durable && options.db) {
|
|
259
|
-
// Create action for durability tracking
|
|
260
|
-
await options.db.createAction({
|
|
261
|
-
actor: 'workflow',
|
|
262
|
-
object: event,
|
|
263
|
-
action: 'execute',
|
|
264
|
-
metadata: { data },
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
try {
|
|
268
|
-
const result = await handler(data, $);
|
|
269
|
-
return result;
|
|
270
|
-
}
|
|
271
|
-
catch (error) {
|
|
272
|
-
if (durable) {
|
|
273
|
-
// Could implement retry logic here
|
|
274
|
-
console.error(`[workflow] Durable action failed for ${event}:`, error);
|
|
275
|
-
}
|
|
276
|
-
throw error;
|
|
277
|
-
}
|
|
278
|
-
};
|
|
279
|
-
/**
|
|
280
|
-
* Create the $ context
|
|
281
|
-
*/
|
|
282
|
-
const $ = {
|
|
283
|
-
async send(event, data) {
|
|
284
|
-
addHistory({ type: 'event', name: event, data });
|
|
285
|
-
// Record to database if connected (durable)
|
|
286
|
-
if (options.db) {
|
|
287
|
-
await options.db.recordEvent(event, data);
|
|
288
|
-
}
|
|
289
|
-
await deliverEvent(event, data);
|
|
290
|
-
},
|
|
291
|
-
async do(event, data) {
|
|
292
|
-
addHistory({ type: 'action', name: `do:${event}`, data });
|
|
293
|
-
// Record to database (durable)
|
|
294
|
-
if (options.db) {
|
|
295
|
-
await options.db.recordEvent(event, data);
|
|
296
|
-
}
|
|
297
|
-
return executeEvent(event, data, true);
|
|
298
|
-
},
|
|
299
|
-
async try(event, data) {
|
|
300
|
-
addHistory({ type: 'action', name: `try:${event}`, data });
|
|
301
|
-
// Non-durable - no database recording
|
|
302
|
-
return executeEvent(event, data, false);
|
|
303
|
-
},
|
|
304
|
-
on: createOnProxy(),
|
|
305
|
-
every: createEveryProxy(),
|
|
306
|
-
// Direct access to state context
|
|
307
|
-
state: state.context,
|
|
308
|
-
getState() {
|
|
309
|
-
// Return a deep copy to prevent mutation
|
|
310
|
-
return structuredClone({
|
|
311
|
-
current: state.current,
|
|
312
|
-
context: state.context,
|
|
313
|
-
history: state.history,
|
|
314
|
-
});
|
|
315
|
-
},
|
|
316
|
-
set(key, value) {
|
|
317
|
-
state.context[key] = value;
|
|
318
|
-
},
|
|
319
|
-
get(key) {
|
|
320
|
-
return state.context[key];
|
|
321
|
-
},
|
|
322
|
-
log(message, data) {
|
|
323
|
-
addHistory({ type: 'action', name: 'log', data: { message, data } });
|
|
324
|
-
console.log(`[workflow] ${message}`, data ?? '');
|
|
325
|
-
},
|
|
326
|
-
db: options.db,
|
|
327
|
-
};
|
|
328
|
-
// Run setup to capture handlers
|
|
88
|
+
// Run setup to capture handlers via $.on / $.every (which delegate to the runtime).
|
|
329
89
|
setup($);
|
|
330
90
|
/**
|
|
331
91
|
* Start schedule handlers
|
|
332
92
|
*/
|
|
333
93
|
const startSchedules = async () => {
|
|
94
|
+
// Register process cleanup on first schedule start
|
|
95
|
+
registerProcessCleanup();
|
|
334
96
|
for (const schedule of scheduleRegistry) {
|
|
335
97
|
const { interval, handler } = schedule;
|
|
336
98
|
let ms = 0;
|
|
@@ -350,32 +112,92 @@ export function Workflow(setup, options = {}) {
|
|
|
350
112
|
case 'week':
|
|
351
113
|
ms = (interval.value ?? 1) * 7 * 24 * 60 * 60 * 1000;
|
|
352
114
|
break;
|
|
353
|
-
case 'cron':
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
115
|
+
case 'cron': {
|
|
116
|
+
// Schedule using cron expression
|
|
117
|
+
const cronExpression = interval.expression;
|
|
118
|
+
const job = createCronJob(cronExpression, async () => {
|
|
119
|
+
try {
|
|
120
|
+
addHistory({ type: 'schedule', name: interval.natural ?? `cron:${cronExpression}` });
|
|
121
|
+
await handler($);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
getLogger().error('[workflow] Cron schedule handler error:', error);
|
|
125
|
+
}
|
|
126
|
+
}, {
|
|
127
|
+
id: `${workflowId}-cron-${scheduleRegistry.indexOf(schedule)}`,
|
|
128
|
+
onError: (error) => {
|
|
129
|
+
getLogger().error('[workflow] Cron job error:', error);
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
cronJobs.push(job);
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case 'natural': {
|
|
136
|
+
// Convert natural language to cron using toCron()
|
|
137
|
+
// This may be async if AI converter is set
|
|
138
|
+
const naturalDesc = interval.description;
|
|
139
|
+
toCron(naturalDesc)
|
|
140
|
+
.then((cronExpression) => {
|
|
141
|
+
const job = createCronJob(cronExpression, async () => {
|
|
142
|
+
try {
|
|
143
|
+
addHistory({ type: 'schedule', name: naturalDesc });
|
|
144
|
+
await handler($);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
getLogger().error('[workflow] Natural schedule handler error:', error);
|
|
148
|
+
}
|
|
149
|
+
}, {
|
|
150
|
+
id: `${workflowId}-natural-${scheduleRegistry.indexOf(schedule)}`,
|
|
151
|
+
onError: (error) => {
|
|
152
|
+
getLogger().error('[workflow] Natural schedule job error:', error);
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
cronJobs.push(job);
|
|
156
|
+
})
|
|
157
|
+
.catch((error) => {
|
|
158
|
+
getLogger().error(`[workflow] Failed to parse natural schedule "${naturalDesc}":`, error);
|
|
159
|
+
});
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
358
162
|
}
|
|
359
163
|
if (ms > 0) {
|
|
164
|
+
// Get schedule name based on interval type
|
|
165
|
+
const scheduleName = 'natural' in interval && interval.natural ? interval.natural : interval.type;
|
|
360
166
|
const timer = setInterval(async () => {
|
|
361
167
|
try {
|
|
362
|
-
addHistory({ type: 'schedule', name:
|
|
168
|
+
addHistory({ type: 'schedule', name: scheduleName });
|
|
363
169
|
await handler($);
|
|
364
170
|
}
|
|
365
171
|
catch (error) {
|
|
366
|
-
|
|
172
|
+
getLogger().error('[workflow] Schedule handler error:', error);
|
|
367
173
|
}
|
|
368
174
|
}, ms);
|
|
369
175
|
scheduleTimers.push(timer);
|
|
176
|
+
// Register timer with global registry for cleanup tracking
|
|
177
|
+
registerTimer(workflowId, timer);
|
|
370
178
|
}
|
|
371
179
|
}
|
|
372
180
|
};
|
|
181
|
+
/**
|
|
182
|
+
* Clean up all timers and resources
|
|
183
|
+
*/
|
|
184
|
+
const cleanup = () => {
|
|
185
|
+
// Clear via global registry (this also clears the intervals)
|
|
186
|
+
clearTimersForWorkflow(workflowId);
|
|
187
|
+
// Clear local references
|
|
188
|
+
scheduleTimers = [];
|
|
189
|
+
// Stop all cron jobs
|
|
190
|
+
for (const job of cronJobs) {
|
|
191
|
+
stopCronJob(job);
|
|
192
|
+
}
|
|
193
|
+
cronJobs.length = 0;
|
|
194
|
+
};
|
|
373
195
|
const instance = {
|
|
374
196
|
definition: {
|
|
375
197
|
name: 'workflow',
|
|
376
198
|
events: eventRegistry,
|
|
377
199
|
schedules: scheduleRegistry,
|
|
378
|
-
initialContext: options.context,
|
|
200
|
+
...(options.context !== undefined && { initialContext: options.context }),
|
|
379
201
|
},
|
|
380
202
|
get state() {
|
|
381
203
|
return state;
|
|
@@ -385,15 +207,27 @@ export function Workflow(setup, options = {}) {
|
|
|
385
207
|
await $.send(event, data);
|
|
386
208
|
},
|
|
387
209
|
async start() {
|
|
388
|
-
|
|
210
|
+
getLogger().log(`[workflow] Starting with ${eventRegistry.length} event handlers and ${scheduleRegistry.length} schedules`);
|
|
389
211
|
await startSchedules();
|
|
390
212
|
},
|
|
391
213
|
async stop() {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
214
|
+
getLogger().log('[workflow] Stopping');
|
|
215
|
+
cleanup();
|
|
216
|
+
},
|
|
217
|
+
async destroy() {
|
|
218
|
+
cleanup();
|
|
219
|
+
},
|
|
220
|
+
dispose() {
|
|
221
|
+
cleanup();
|
|
222
|
+
},
|
|
223
|
+
[Symbol.dispose]() {
|
|
224
|
+
cleanup();
|
|
225
|
+
},
|
|
226
|
+
get timerCount() {
|
|
227
|
+
return getTimerIdsForWorkflow(workflowId).length + cronJobs.filter((j) => !j.stopped).length;
|
|
228
|
+
},
|
|
229
|
+
getTimerIds() {
|
|
230
|
+
return getTimerIdsForWorkflow(workflowId);
|
|
397
231
|
},
|
|
398
232
|
};
|
|
399
233
|
return instance;
|
|
@@ -407,8 +241,14 @@ export function createTestContext() {
|
|
|
407
241
|
const history = [];
|
|
408
242
|
const $ = {
|
|
409
243
|
emittedEvents,
|
|
410
|
-
|
|
411
|
-
|
|
244
|
+
track(event, data) {
|
|
245
|
+
// Fire and forget for testing - just record it
|
|
246
|
+
emittedEvents.push({ event: `track:${event}`, data });
|
|
247
|
+
},
|
|
248
|
+
send(event, data) {
|
|
249
|
+
const eventId = crypto.randomUUID();
|
|
250
|
+
emittedEvents.push({ event, data: { ...data, _eventId: eventId } });
|
|
251
|
+
return eventId;
|
|
412
252
|
},
|
|
413
253
|
async do(_event, _data) {
|
|
414
254
|
throw new Error('$.do not implemented in test context - register handlers via Workflow()');
|
|
@@ -421,9 +261,9 @@ export function createTestContext() {
|
|
|
421
261
|
return new Proxy({}, {
|
|
422
262
|
get() {
|
|
423
263
|
return () => { }; // No-op for testing
|
|
424
|
-
}
|
|
264
|
+
},
|
|
425
265
|
});
|
|
426
|
-
}
|
|
266
|
+
},
|
|
427
267
|
}),
|
|
428
268
|
// Cast to EveryProxy is safe: Proxy handler implements all EveryProxy behaviors dynamically
|
|
429
269
|
every: new Proxy(
|
|
@@ -432,7 +272,7 @@ export function createTestContext() {
|
|
|
432
272
|
get() {
|
|
433
273
|
return () => () => { }; // No-op for testing
|
|
434
274
|
},
|
|
435
|
-
apply() { }
|
|
275
|
+
apply() { },
|
|
436
276
|
}),
|
|
437
277
|
state: stateContext,
|
|
438
278
|
getState() {
|
|
@@ -448,13 +288,13 @@ export function createTestContext() {
|
|
|
448
288
|
return stateContext[key];
|
|
449
289
|
},
|
|
450
290
|
log(message, data) {
|
|
451
|
-
|
|
291
|
+
getLogger().log(`[test] ${message}`, data ?? '');
|
|
452
292
|
},
|
|
453
293
|
};
|
|
454
294
|
return $;
|
|
455
295
|
}
|
|
456
296
|
// Also export standalone on/every for import { on, every } usage
|
|
457
297
|
export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
|
|
458
|
-
export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter } from './every.js';
|
|
298
|
+
export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter, } from './every.js';
|
|
459
299
|
export { send } from './send.js';
|
|
460
300
|
//# sourceMappingURL=workflow.js.map
|