ai-workflows 2.1.1 → 2.3.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 +17 -1
- package/README.md +305 -184
- package/dist/barrier.d.ts +159 -0
- package/dist/barrier.d.ts.map +1 -0
- package/dist/barrier.js +377 -0
- package/dist/barrier.js.map +1 -0
- package/dist/cascade-context.d.ts +149 -0
- package/dist/cascade-context.d.ts.map +1 -0
- package/dist/cascade-context.js +324 -0
- package/dist/cascade-context.js.map +1 -0
- package/dist/cascade-executor.d.ts +196 -0
- package/dist/cascade-executor.d.ts.map +1 -0
- package/dist/cascade-executor.js +384 -0
- package/dist/cascade-executor.js.map +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -8
- 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/dependency-graph.d.ts +157 -0
- package/dist/dependency-graph.d.ts.map +1 -0
- package/dist/dependency-graph.js +382 -0
- package/dist/dependency-graph.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/every.d.ts +31 -2
- package/dist/every.d.ts.map +1 -1
- package/dist/every.js +63 -32
- package/dist/every.js.map +1 -1
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +8 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/topological-sort.d.ts +121 -0
- package/dist/graph/topological-sort.d.ts.map +1 -0
- package/dist/graph/topological-sort.js +292 -0
- package/dist/graph/topological-sort.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -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 +35 -10
- package/dist/on.d.ts.map +1 -1
- package/dist/on.js +53 -19
- 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 +77 -0
- package/dist/timer-registry.d.ts.map +1 -0
- package/dist/timer-registry.js +154 -0
- package/dist/timer-registry.js.map +1 -0
- package/dist/types.d.ts +105 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -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 +136 -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 +21 -4
- package/src/__tests__/digital-objects-adapter.test.ts +274 -0
- package/src/__tests__/durable-workflow.test.ts +297 -0
- package/src/barrier.ts +507 -0
- package/src/cascade-context.ts +495 -0
- package/src/cascade-executor.ts +588 -0
- package/src/context.ts +51 -17
- package/src/cron-parser.ts +347 -0
- package/src/cron-scheduler.ts +239 -0
- package/src/database-context.ts +658 -0
- package/src/dependency-graph.ts +518 -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/every.ts +104 -35
- package/src/graph/index.ts +19 -0
- package/src/graph/topological-sort.ts +412 -0
- package/src/index.ts +147 -0
- package/src/logger.ts +148 -0
- package/src/on.ts +81 -26
- package/src/runtime.ts +436 -0
- package/src/send.ts +4 -5
- package/src/telemetry.ts +577 -0
- package/src/timer-registry.ts +179 -0
- package/src/types.ts +146 -10
- 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 +199 -355
- package/test/barrier-join.test.ts +442 -0
- package/test/barrier-unhandled-rejections.test.ts +359 -0
- package/test/cascade-context.test.ts +390 -0
- package/test/cascade-executor.test.ts +852 -0
- 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/dependency-graph.test.ts +512 -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/graph/topological-sort.test.ts +586 -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 +353 -0
- package/test/send-race-conditions.test.ts +400 -0
- package/test/type-safety-every.test.ts +303 -0
- 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 -7
- 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,74 +13,18 @@
|
|
|
13
13
|
* })
|
|
14
14
|
* })
|
|
15
15
|
*/
|
|
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';
|
|
16
21
|
/**
|
|
17
|
-
*
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
second: '* * * * * *',
|
|
21
|
-
minute: '* * * * *',
|
|
22
|
-
hour: '0 * * * *',
|
|
23
|
-
day: '0 0 * * *',
|
|
24
|
-
week: '0 0 * * 0',
|
|
25
|
-
month: '0 0 1 * *',
|
|
26
|
-
year: '0 0 1 1 *',
|
|
27
|
-
Monday: '0 0 * * 1',
|
|
28
|
-
Tuesday: '0 0 * * 2',
|
|
29
|
-
Wednesday: '0 0 * * 3',
|
|
30
|
-
Thursday: '0 0 * * 4',
|
|
31
|
-
Friday: '0 0 * * 5',
|
|
32
|
-
Saturday: '0 0 * * 6',
|
|
33
|
-
Sunday: '0 0 * * 0',
|
|
34
|
-
weekday: '0 0 * * 1-5',
|
|
35
|
-
weekend: '0 0 * * 0,6',
|
|
36
|
-
midnight: '0 0 * * *',
|
|
37
|
-
noon: '0 12 * * *',
|
|
38
|
-
};
|
|
39
|
-
/**
|
|
40
|
-
* Time suffixes for day-based schedules
|
|
41
|
-
*/
|
|
42
|
-
const TIME_PATTERNS = {
|
|
43
|
-
at6am: { hour: 6, minute: 0 },
|
|
44
|
-
at7am: { hour: 7, minute: 0 },
|
|
45
|
-
at8am: { hour: 8, minute: 0 },
|
|
46
|
-
at9am: { hour: 9, minute: 0 },
|
|
47
|
-
at10am: { hour: 10, minute: 0 },
|
|
48
|
-
at11am: { hour: 11, minute: 0 },
|
|
49
|
-
at12pm: { hour: 12, minute: 0 },
|
|
50
|
-
atnoon: { hour: 12, minute: 0 },
|
|
51
|
-
at1pm: { hour: 13, minute: 0 },
|
|
52
|
-
at2pm: { hour: 14, minute: 0 },
|
|
53
|
-
at3pm: { hour: 15, minute: 0 },
|
|
54
|
-
at4pm: { hour: 16, minute: 0 },
|
|
55
|
-
at5pm: { hour: 17, minute: 0 },
|
|
56
|
-
at6pm: { hour: 18, minute: 0 },
|
|
57
|
-
at7pm: { hour: 19, minute: 0 },
|
|
58
|
-
at8pm: { hour: 20, minute: 0 },
|
|
59
|
-
at9pm: { hour: 21, minute: 0 },
|
|
60
|
-
atmidnight: { hour: 0, minute: 0 },
|
|
61
|
-
};
|
|
62
|
-
/**
|
|
63
|
-
* Combine a day pattern with a time pattern
|
|
64
|
-
*/
|
|
65
|
-
function combineWithTime(baseCron, time) {
|
|
66
|
-
const parts = baseCron.split(' ');
|
|
67
|
-
parts[0] = String(time.minute);
|
|
68
|
-
parts[1] = String(time.hour);
|
|
69
|
-
return parts.join(' ');
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* 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.
|
|
73
25
|
*/
|
|
74
26
|
export function parseEvent(event) {
|
|
75
|
-
|
|
76
|
-
if (parts.length !== 2) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
const [noun, eventName] = parts;
|
|
80
|
-
if (!noun || !eventName) {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
return { noun, event: eventName };
|
|
27
|
+
return runtimeParseEvent(event);
|
|
84
28
|
}
|
|
85
29
|
/**
|
|
86
30
|
* Create a workflow with the $ context
|
|
@@ -110,19 +54,30 @@ export function parseEvent(event) {
|
|
|
110
54
|
* await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
|
|
111
55
|
* ```
|
|
112
56
|
*/
|
|
57
|
+
// Counter for generating unique workflow IDs
|
|
58
|
+
let workflowCounter = 0;
|
|
113
59
|
export function Workflow(setup, options = {}) {
|
|
114
|
-
//
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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)
|
|
123
76
|
let scheduleTimers = [];
|
|
77
|
+
// Cron jobs for cron/natural schedules
|
|
78
|
+
const cronJobs = [];
|
|
124
79
|
/**
|
|
125
|
-
*
|
|
80
|
+
* Append to workflow history (used by schedule firing below).
|
|
126
81
|
*/
|
|
127
82
|
const addHistory = (entry) => {
|
|
128
83
|
state.history.push({
|
|
@@ -130,206 +85,14 @@ export function Workflow(setup, options = {}) {
|
|
|
130
85
|
timestamp: Date.now(),
|
|
131
86
|
});
|
|
132
87
|
};
|
|
133
|
-
|
|
134
|
-
* Register an event handler
|
|
135
|
-
*/
|
|
136
|
-
const registerEventHandler = (noun, event, handler) => {
|
|
137
|
-
eventRegistry.push({
|
|
138
|
-
noun,
|
|
139
|
-
event,
|
|
140
|
-
handler,
|
|
141
|
-
source: handler.toString(),
|
|
142
|
-
});
|
|
143
|
-
};
|
|
144
|
-
/**
|
|
145
|
-
* Register a schedule handler
|
|
146
|
-
*/
|
|
147
|
-
const registerScheduleHandler = (interval, handler) => {
|
|
148
|
-
scheduleRegistry.push({
|
|
149
|
-
interval,
|
|
150
|
-
handler,
|
|
151
|
-
source: handler.toString(),
|
|
152
|
-
});
|
|
153
|
-
};
|
|
154
|
-
/**
|
|
155
|
-
* Create the $.on proxy
|
|
156
|
-
*/
|
|
157
|
-
const createOnProxy = () => {
|
|
158
|
-
return new Proxy({}, {
|
|
159
|
-
get(_target, noun) {
|
|
160
|
-
return new Proxy({}, {
|
|
161
|
-
get(_eventTarget, event) {
|
|
162
|
-
return (handler) => {
|
|
163
|
-
registerEventHandler(noun, event, handler);
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
};
|
|
170
|
-
/**
|
|
171
|
-
* Create the $.every proxy
|
|
172
|
-
*/
|
|
173
|
-
const createEveryProxy = () => {
|
|
174
|
-
const handler = {
|
|
175
|
-
get(_target, prop) {
|
|
176
|
-
const pattern = KNOWN_PATTERNS[prop];
|
|
177
|
-
if (pattern) {
|
|
178
|
-
const result = (handlerFn) => {
|
|
179
|
-
registerScheduleHandler({ type: 'cron', expression: pattern, natural: prop }, handlerFn);
|
|
180
|
-
};
|
|
181
|
-
return new Proxy(result, {
|
|
182
|
-
get(_t, timeKey) {
|
|
183
|
-
const time = TIME_PATTERNS[timeKey];
|
|
184
|
-
if (time) {
|
|
185
|
-
const cron = combineWithTime(pattern, time);
|
|
186
|
-
return (handlerFn) => {
|
|
187
|
-
registerScheduleHandler({ type: 'cron', expression: cron, natural: `${prop}.${timeKey}` }, handlerFn);
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
return undefined;
|
|
191
|
-
},
|
|
192
|
-
apply(_t, _thisArg, args) {
|
|
193
|
-
registerScheduleHandler({ type: 'cron', expression: pattern, natural: prop }, args[0]);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
// Plural units (seconds, minutes, hours, days, weeks)
|
|
198
|
-
const pluralUnits = {
|
|
199
|
-
seconds: 'second',
|
|
200
|
-
minutes: 'minute',
|
|
201
|
-
hours: 'hour',
|
|
202
|
-
days: 'day',
|
|
203
|
-
weeks: 'week',
|
|
204
|
-
};
|
|
205
|
-
if (pluralUnits[prop]) {
|
|
206
|
-
return (value) => (handlerFn) => {
|
|
207
|
-
registerScheduleHandler({ type: pluralUnits[prop], value, natural: `${value} ${prop}` }, handlerFn);
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
return undefined;
|
|
211
|
-
},
|
|
212
|
-
apply(_target, _thisArg, args) {
|
|
213
|
-
const [description, handler] = args;
|
|
214
|
-
if (typeof description === 'string' && typeof handler === 'function') {
|
|
215
|
-
registerScheduleHandler({ type: 'natural', description }, handler);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
return new Proxy(function () { }, handler);
|
|
220
|
-
};
|
|
221
|
-
/**
|
|
222
|
-
* Deliver an event to matching handlers (fire and forget)
|
|
223
|
-
*/
|
|
224
|
-
const deliverEvent = async (event, data) => {
|
|
225
|
-
const parsed = parseEvent(event);
|
|
226
|
-
if (!parsed) {
|
|
227
|
-
console.warn(`Invalid event format: ${event}. Expected Noun.event`);
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
const matching = eventRegistry.filter(h => h.noun === parsed.noun && h.event === parsed.event);
|
|
231
|
-
if (matching.length === 0) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
await Promise.all(matching.map(async ({ handler }) => {
|
|
235
|
-
try {
|
|
236
|
-
await handler(data, $);
|
|
237
|
-
}
|
|
238
|
-
catch (error) {
|
|
239
|
-
console.error(`Error in handler for ${event}:`, error);
|
|
240
|
-
}
|
|
241
|
-
}));
|
|
242
|
-
};
|
|
243
|
-
/**
|
|
244
|
-
* Execute an event and wait for result from first matching handler
|
|
245
|
-
*/
|
|
246
|
-
const executeEvent = async (event, data, durable) => {
|
|
247
|
-
const parsed = parseEvent(event);
|
|
248
|
-
if (!parsed) {
|
|
249
|
-
throw new Error(`Invalid event format: ${event}. Expected Noun.event`);
|
|
250
|
-
}
|
|
251
|
-
const matching = eventRegistry.filter(h => h.noun === parsed.noun && h.event === parsed.event);
|
|
252
|
-
if (matching.length === 0) {
|
|
253
|
-
throw new Error(`No handler registered for ${event}`);
|
|
254
|
-
}
|
|
255
|
-
// Use first matching handler for result
|
|
256
|
-
const { handler } = matching[0];
|
|
257
|
-
if (durable && options.db) {
|
|
258
|
-
// Create action for durability tracking
|
|
259
|
-
await options.db.createAction({
|
|
260
|
-
actor: 'workflow',
|
|
261
|
-
object: event,
|
|
262
|
-
action: 'execute',
|
|
263
|
-
metadata: { data },
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
try {
|
|
267
|
-
const result = await handler(data, $);
|
|
268
|
-
return result;
|
|
269
|
-
}
|
|
270
|
-
catch (error) {
|
|
271
|
-
if (durable) {
|
|
272
|
-
// Could implement retry logic here
|
|
273
|
-
console.error(`[workflow] Durable action failed for ${event}:`, error);
|
|
274
|
-
}
|
|
275
|
-
throw error;
|
|
276
|
-
}
|
|
277
|
-
};
|
|
278
|
-
/**
|
|
279
|
-
* Create the $ context
|
|
280
|
-
*/
|
|
281
|
-
const $ = {
|
|
282
|
-
async send(event, data) {
|
|
283
|
-
addHistory({ type: 'event', name: event, data });
|
|
284
|
-
// Record to database if connected (durable)
|
|
285
|
-
if (options.db) {
|
|
286
|
-
await options.db.recordEvent(event, data);
|
|
287
|
-
}
|
|
288
|
-
await deliverEvent(event, data);
|
|
289
|
-
},
|
|
290
|
-
async do(event, data) {
|
|
291
|
-
addHistory({ type: 'action', name: `do:${event}`, data });
|
|
292
|
-
// Record to database (durable)
|
|
293
|
-
if (options.db) {
|
|
294
|
-
await options.db.recordEvent(event, data);
|
|
295
|
-
}
|
|
296
|
-
return executeEvent(event, data, true);
|
|
297
|
-
},
|
|
298
|
-
async try(event, data) {
|
|
299
|
-
addHistory({ type: 'action', name: `try:${event}`, data });
|
|
300
|
-
// Non-durable - no database recording
|
|
301
|
-
return executeEvent(event, data, false);
|
|
302
|
-
},
|
|
303
|
-
on: createOnProxy(),
|
|
304
|
-
every: createEveryProxy(),
|
|
305
|
-
// Direct access to state context
|
|
306
|
-
state: state.context,
|
|
307
|
-
getState() {
|
|
308
|
-
// Return a deep copy to prevent mutation
|
|
309
|
-
return structuredClone({
|
|
310
|
-
current: state.current,
|
|
311
|
-
context: state.context,
|
|
312
|
-
history: state.history,
|
|
313
|
-
});
|
|
314
|
-
},
|
|
315
|
-
set(key, value) {
|
|
316
|
-
state.context[key] = value;
|
|
317
|
-
},
|
|
318
|
-
get(key) {
|
|
319
|
-
return state.context[key];
|
|
320
|
-
},
|
|
321
|
-
log(message, data) {
|
|
322
|
-
addHistory({ type: 'action', name: 'log', data: { message, data } });
|
|
323
|
-
console.log(`[workflow] ${message}`, data ?? '');
|
|
324
|
-
},
|
|
325
|
-
db: options.db,
|
|
326
|
-
};
|
|
327
|
-
// Run setup to capture handlers
|
|
88
|
+
// Run setup to capture handlers via $.on / $.every (which delegate to the runtime).
|
|
328
89
|
setup($);
|
|
329
90
|
/**
|
|
330
91
|
* Start schedule handlers
|
|
331
92
|
*/
|
|
332
93
|
const startSchedules = async () => {
|
|
94
|
+
// Register process cleanup on first schedule start
|
|
95
|
+
registerProcessCleanup();
|
|
333
96
|
for (const schedule of scheduleRegistry) {
|
|
334
97
|
const { interval, handler } = schedule;
|
|
335
98
|
let ms = 0;
|
|
@@ -349,32 +112,92 @@ export function Workflow(setup, options = {}) {
|
|
|
349
112
|
case 'week':
|
|
350
113
|
ms = (interval.value ?? 1) * 7 * 24 * 60 * 60 * 1000;
|
|
351
114
|
break;
|
|
352
|
-
case 'cron':
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
+
}
|
|
357
162
|
}
|
|
358
163
|
if (ms > 0) {
|
|
164
|
+
// Get schedule name based on interval type
|
|
165
|
+
const scheduleName = 'natural' in interval && interval.natural ? interval.natural : interval.type;
|
|
359
166
|
const timer = setInterval(async () => {
|
|
360
167
|
try {
|
|
361
|
-
addHistory({ type: 'schedule', name:
|
|
168
|
+
addHistory({ type: 'schedule', name: scheduleName });
|
|
362
169
|
await handler($);
|
|
363
170
|
}
|
|
364
171
|
catch (error) {
|
|
365
|
-
|
|
172
|
+
getLogger().error('[workflow] Schedule handler error:', error);
|
|
366
173
|
}
|
|
367
174
|
}, ms);
|
|
368
175
|
scheduleTimers.push(timer);
|
|
176
|
+
// Register timer with global registry for cleanup tracking
|
|
177
|
+
registerTimer(workflowId, timer);
|
|
369
178
|
}
|
|
370
179
|
}
|
|
371
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
|
+
};
|
|
372
195
|
const instance = {
|
|
373
196
|
definition: {
|
|
374
197
|
name: 'workflow',
|
|
375
198
|
events: eventRegistry,
|
|
376
199
|
schedules: scheduleRegistry,
|
|
377
|
-
initialContext: options.context,
|
|
200
|
+
...(options.context !== undefined && { initialContext: options.context }),
|
|
378
201
|
},
|
|
379
202
|
get state() {
|
|
380
203
|
return state;
|
|
@@ -384,15 +207,27 @@ export function Workflow(setup, options = {}) {
|
|
|
384
207
|
await $.send(event, data);
|
|
385
208
|
},
|
|
386
209
|
async start() {
|
|
387
|
-
|
|
210
|
+
getLogger().log(`[workflow] Starting with ${eventRegistry.length} event handlers and ${scheduleRegistry.length} schedules`);
|
|
388
211
|
await startSchedules();
|
|
389
212
|
},
|
|
390
213
|
async stop() {
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
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);
|
|
396
231
|
},
|
|
397
232
|
};
|
|
398
233
|
return instance;
|
|
@@ -406,8 +241,14 @@ export function createTestContext() {
|
|
|
406
241
|
const history = [];
|
|
407
242
|
const $ = {
|
|
408
243
|
emittedEvents,
|
|
409
|
-
|
|
410
|
-
|
|
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;
|
|
411
252
|
},
|
|
412
253
|
async do(_event, _data) {
|
|
413
254
|
throw new Error('$.do not implemented in test context - register handlers via Workflow()');
|
|
@@ -420,15 +261,18 @@ export function createTestContext() {
|
|
|
420
261
|
return new Proxy({}, {
|
|
421
262
|
get() {
|
|
422
263
|
return () => { }; // No-op for testing
|
|
423
|
-
}
|
|
264
|
+
},
|
|
424
265
|
});
|
|
425
|
-
}
|
|
266
|
+
},
|
|
426
267
|
}),
|
|
427
|
-
|
|
268
|
+
// Cast to EveryProxy is safe: Proxy handler implements all EveryProxy behaviors dynamically
|
|
269
|
+
every: new Proxy(
|
|
270
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
271
|
+
((_description, _handler) => { }), {
|
|
428
272
|
get() {
|
|
429
273
|
return () => () => { }; // No-op for testing
|
|
430
274
|
},
|
|
431
|
-
apply() { }
|
|
275
|
+
apply() { },
|
|
432
276
|
}),
|
|
433
277
|
state: stateContext,
|
|
434
278
|
getState() {
|
|
@@ -444,13 +288,13 @@ export function createTestContext() {
|
|
|
444
288
|
return stateContext[key];
|
|
445
289
|
},
|
|
446
290
|
log(message, data) {
|
|
447
|
-
|
|
291
|
+
getLogger().log(`[test] ${message}`, data ?? '');
|
|
448
292
|
},
|
|
449
293
|
};
|
|
450
294
|
return $;
|
|
451
295
|
}
|
|
452
296
|
// Also export standalone on/every for import { on, every } usage
|
|
453
297
|
export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
|
|
454
|
-
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';
|
|
455
299
|
export { send } from './send.js';
|
|
456
300
|
//# sourceMappingURL=workflow.js.map
|