awaitly 1.34.0 → 2.0.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/dist/{duration.d.ts → di-BDlT7InM.d.cts} +15 -1
- package/dist/{duration.d.cts → di-BbFFfO8y.d.ts} +15 -1
- package/dist/errors-DtXvrCiO.d.cts +708 -0
- package/dist/errors-DtXvrCiO.d.ts +708 -0
- package/dist/index.cjs +4594 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1970 -141
- package/dist/index.d.ts +1970 -141
- package/dist/index.js +4398 -1
- package/dist/index.js.map +1 -1
- package/dist/result.cjs +641 -1
- package/dist/result.cjs.map +1 -1
- package/dist/result.d.cts +35 -5
- package/dist/result.d.ts +35 -5
- package/dist/result.js +561 -1
- package/dist/result.js.map +1 -1
- package/dist/testing.cjs +4202 -8
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +2 -6
- package/dist/testing.d.ts +2 -6
- package/dist/testing.js +4154 -8
- package/dist/testing.js.map +1 -1
- package/dist/{run-entry-D2MmJFj9.d.cts → types-B8NfNRGX.d.ts} +1152 -1499
- package/dist/{run-entry-Dduz-is2.d.ts → types-BZ2f4MRR.d.cts} +1152 -1499
- package/dist/workflow.cjs +7096 -6
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +3346 -22
- package/dist/workflow.d.ts +3346 -22
- package/dist/workflow.js +6929 -6
- package/dist/workflow.js.map +1 -1
- package/package.json +13 -178
- package/dist/adapters.cjs +0 -7
- package/dist/adapters.cjs.map +0 -1
- package/dist/adapters.d.cts +0 -179
- package/dist/adapters.d.ts +0 -179
- package/dist/adapters.js +0 -7
- package/dist/adapters.js.map +0 -1
- package/dist/batch.cjs +0 -7
- package/dist/batch.cjs.map +0 -1
- package/dist/batch.d.cts +0 -200
- package/dist/batch.d.ts +0 -200
- package/dist/batch.js +0 -7
- package/dist/batch.js.map +0 -1
- package/dist/bind-deps.cjs +0 -2
- package/dist/bind-deps.cjs.map +0 -1
- package/dist/bind-deps.d.cts +0 -28
- package/dist/bind-deps.d.ts +0 -28
- package/dist/bind-deps.js +0 -2
- package/dist/bind-deps.js.map +0 -1
- package/dist/cache.cjs +0 -2
- package/dist/cache.cjs.map +0 -1
- package/dist/cache.d.cts +0 -269
- package/dist/cache.d.ts +0 -269
- package/dist/cache.js +0 -2
- package/dist/cache.js.map +0 -1
- package/dist/circuit-breaker.cjs +0 -7
- package/dist/circuit-breaker.cjs.map +0 -1
- package/dist/circuit-breaker.d.cts +0 -211
- package/dist/circuit-breaker.d.ts +0 -211
- package/dist/circuit-breaker.js +0 -7
- package/dist/circuit-breaker.js.map +0 -1
- package/dist/conditional.cjs +0 -2
- package/dist/conditional.cjs.map +0 -1
- package/dist/conditional.d.cts +0 -252
- package/dist/conditional.d.ts +0 -252
- package/dist/conditional.js +0 -2
- package/dist/conditional.js.map +0 -1
- package/dist/core.cjs +0 -7
- package/dist/core.cjs.map +0 -1
- package/dist/core.d.cts +0 -5
- package/dist/core.d.ts +0 -5
- package/dist/core.js +0 -7
- package/dist/core.js.map +0 -1
- package/dist/di-COl5oFnR.d.cts +0 -15
- package/dist/di-CyDj_JyZ.d.ts +0 -15
- package/dist/diagnostics.cjs +0 -8
- package/dist/diagnostics.cjs.map +0 -1
- package/dist/diagnostics.d.cts +0 -68
- package/dist/diagnostics.d.ts +0 -68
- package/dist/diagnostics.js +0 -8
- package/dist/diagnostics.js.map +0 -1
- package/dist/durable.cjs +0 -11
- package/dist/durable.cjs.map +0 -1
- package/dist/durable.d.cts +0 -9
- package/dist/durable.d.ts +0 -9
- package/dist/durable.js +0 -11
- package/dist/durable.js.map +0 -1
- package/dist/duration.cjs +0 -2
- package/dist/duration.cjs.map +0 -1
- package/dist/duration.js +0 -2
- package/dist/duration.js.map +0 -1
- package/dist/engine.cjs +0 -11
- package/dist/engine.cjs.map +0 -1
- package/dist/engine.d.cts +0 -115
- package/dist/engine.d.ts +0 -115
- package/dist/engine.js +0 -11
- package/dist/engine.js.map +0 -1
- package/dist/errors.cjs +0 -2
- package/dist/errors.cjs.map +0 -1
- package/dist/errors.d.cts +0 -361
- package/dist/errors.d.ts +0 -361
- package/dist/errors.js +0 -2
- package/dist/errors.js.map +0 -1
- package/dist/fetch.cjs +0 -7
- package/dist/fetch.cjs.map +0 -1
- package/dist/fetch.d.cts +0 -86
- package/dist/fetch.d.ts +0 -86
- package/dist/fetch.js +0 -7
- package/dist/fetch.js.map +0 -1
- package/dist/flow.cjs +0 -7
- package/dist/flow.cjs.map +0 -1
- package/dist/flow.d.cts +0 -163
- package/dist/flow.d.ts +0 -163
- package/dist/flow.js +0 -7
- package/dist/flow.js.map +0 -1
- package/dist/functional.cjs +0 -2
- package/dist/functional.cjs.map +0 -1
- package/dist/functional.d.cts +0 -444
- package/dist/functional.d.ts +0 -444
- package/dist/functional.js +0 -2
- package/dist/functional.js.map +0 -1
- package/dist/guards-BodHXLzX.d.cts +0 -72
- package/dist/guards-CeWoQ8fn.d.ts +0 -72
- package/dist/hitl-BPE_1UiM.d.cts +0 -468
- package/dist/hitl-byp570uC.d.ts +0 -468
- package/dist/hitl.cjs +0 -7
- package/dist/hitl.cjs.map +0 -1
- package/dist/hitl.d.cts +0 -442
- package/dist/hitl.d.ts +0 -442
- package/dist/hitl.js +0 -7
- package/dist/hitl.js.map +0 -1
- package/dist/index-BYT3amEz.d.ts +0 -417
- package/dist/index-C_ak66jy.d.cts +0 -417
- package/dist/match-entry-DjI2bLpD.d.cts +0 -209
- package/dist/match-entry-DjI2bLpD.d.ts +0 -209
- package/dist/match.cjs +0 -2
- package/dist/match.cjs.map +0 -1
- package/dist/match.d.cts +0 -1
- package/dist/match.d.ts +0 -1
- package/dist/match.js +0 -2
- package/dist/match.js.map +0 -1
- package/dist/otel.cjs +0 -2
- package/dist/otel.cjs.map +0 -1
- package/dist/otel.d.cts +0 -188
- package/dist/otel.d.ts +0 -188
- package/dist/otel.js +0 -2
- package/dist/otel.js.map +0 -1
- package/dist/persistence-entry-DOMx3woy.d.ts +0 -822
- package/dist/persistence-entry-ymCA4iDu.d.cts +0 -822
- package/dist/persistence.cjs +0 -2
- package/dist/persistence.cjs.map +0 -1
- package/dist/persistence.d.cts +0 -7
- package/dist/persistence.d.ts +0 -7
- package/dist/persistence.js +0 -2
- package/dist/persistence.js.map +0 -1
- package/dist/policies.cjs +0 -2
- package/dist/policies.cjs.map +0 -1
- package/dist/policies.d.cts +0 -379
- package/dist/policies.d.ts +0 -379
- package/dist/policies.js +0 -2
- package/dist/policies.js.map +0 -1
- package/dist/ratelimit.cjs +0 -7
- package/dist/ratelimit.cjs.map +0 -1
- package/dist/ratelimit.d.cts +0 -458
- package/dist/ratelimit.d.ts +0 -458
- package/dist/ratelimit.js +0 -7
- package/dist/ratelimit.js.map +0 -1
- package/dist/reliability.cjs +0 -11
- package/dist/reliability.cjs.map +0 -1
- package/dist/reliability.d.cts +0 -11
- package/dist/reliability.d.ts +0 -11
- package/dist/reliability.js +0 -11
- package/dist/reliability.js.map +0 -1
- package/dist/resolver.cjs +0 -7
- package/dist/resolver.cjs.map +0 -1
- package/dist/resolver.d.cts +0 -68
- package/dist/resolver.d.ts +0 -68
- package/dist/resolver.js +0 -7
- package/dist/resolver.js.map +0 -1
- package/dist/resource.cjs +0 -7
- package/dist/resource.cjs.map +0 -1
- package/dist/resource.d.cts +0 -174
- package/dist/resource.d.ts +0 -174
- package/dist/resource.js +0 -7
- package/dist/resource.js.map +0 -1
- package/dist/result/retry.cjs +0 -2
- package/dist/result/retry.cjs.map +0 -1
- package/dist/result/retry.d.cts +0 -70
- package/dist/result/retry.d.ts +0 -70
- package/dist/result/retry.js +0 -2
- package/dist/result/retry.js.map +0 -1
- package/dist/retry.cjs +0 -2
- package/dist/retry.cjs.map +0 -1
- package/dist/retry.d.cts +0 -388
- package/dist/retry.d.ts +0 -388
- package/dist/retry.js +0 -2
- package/dist/retry.js.map +0 -1
- package/dist/run.cjs +0 -7
- package/dist/run.cjs.map +0 -1
- package/dist/run.d.cts +0 -4
- package/dist/run.d.ts +0 -4
- package/dist/run.js +0 -7
- package/dist/run.js.map +0 -1
- package/dist/saga.cjs +0 -11
- package/dist/saga.cjs.map +0 -1
- package/dist/saga.d.cts +0 -164
- package/dist/saga.d.ts +0 -164
- package/dist/saga.js +0 -11
- package/dist/saga.js.map +0 -1
- package/dist/singleflight.cjs +0 -2
- package/dist/singleflight.cjs.map +0 -1
- package/dist/singleflight.d.cts +0 -145
- package/dist/singleflight.d.ts +0 -145
- package/dist/singleflight.js +0 -2
- package/dist/singleflight.js.map +0 -1
- package/dist/slugs.cjs +0 -2
- package/dist/slugs.cjs.map +0 -1
- package/dist/slugs.d.cts +0 -67
- package/dist/slugs.d.ts +0 -67
- package/dist/slugs.js +0 -2
- package/dist/slugs.js.map +0 -1
- package/dist/streaming.cjs +0 -9
- package/dist/streaming.cjs.map +0 -1
- package/dist/streaming.d.cts +0 -596
- package/dist/streaming.d.ts +0 -596
- package/dist/streaming.js +0 -9
- package/dist/streaming.js.map +0 -1
- package/dist/tagged-error.cjs +0 -2
- package/dist/tagged-error.cjs.map +0 -1
- package/dist/tagged-error.d.cts +0 -275
- package/dist/tagged-error.d.ts +0 -275
- package/dist/tagged-error.js +0 -2
- package/dist/tagged-error.js.map +0 -1
- package/dist/types-DQmzO9f4.d.ts +0 -323
- package/dist/types-qBUOYi-4.d.cts +0 -323
- package/dist/webhook.cjs +0 -7
- package/dist/webhook.cjs.map +0 -1
- package/dist/webhook.d.cts +0 -499
- package/dist/webhook.d.ts +0 -499
- package/dist/webhook.js +0 -7
- package/dist/webhook.js.map +0 -1
package/dist/engine.d.cts
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { S as SnapshotStore, e as AnyResultFn, f as WorkflowContext } from './persistence-entry-ymCA4iDu.cjs';
|
|
2
|
-
import { ah as RunStep } from './run-entry-D2MmJFj9.cjs';
|
|
3
|
-
import { b as DurableOptions } from './index-C_ak66jy.cjs';
|
|
4
|
-
import './types-qBUOYi-4.cjs';
|
|
5
|
-
import '@standard-schema/spec';
|
|
6
|
-
import './errors.cjs';
|
|
7
|
-
import './tagged-error.cjs';
|
|
8
|
-
import './slugs.cjs';
|
|
9
|
-
|
|
10
|
-
/** A registered workflow definition */
|
|
11
|
-
interface WorkflowRegistration<Deps extends Readonly<Record<string, AnyResultFn>> = Readonly<Record<string, AnyResultFn>>> {
|
|
12
|
-
/** Workflow dependencies (Result-returning functions) */
|
|
13
|
-
deps: Deps;
|
|
14
|
-
/** Workflow function */
|
|
15
|
-
fn: (context: {
|
|
16
|
-
step: RunStep<any>;
|
|
17
|
-
deps: Deps;
|
|
18
|
-
ctx: WorkflowContext;
|
|
19
|
-
}) => any;
|
|
20
|
-
/** Default durable options (version, lockTtlMs, etc.) */
|
|
21
|
-
durableDefaults?: Partial<Pick<DurableOptions, 'version' | 'lockTtlMs' | 'heartbeatIntervalMs'>>;
|
|
22
|
-
}
|
|
23
|
-
interface EnqueueOptions {
|
|
24
|
-
/** Custom workflow execution ID (default: auto-generated UUID) */
|
|
25
|
-
id?: string;
|
|
26
|
-
/** Idempotency key for deduplication */
|
|
27
|
-
idempotencyKey?: string;
|
|
28
|
-
/** Workflow input for idempotency conflict detection */
|
|
29
|
-
input?: unknown;
|
|
30
|
-
/** Custom metadata */
|
|
31
|
-
metadata?: Record<string, unknown>;
|
|
32
|
-
}
|
|
33
|
-
interface ScheduleOptions {
|
|
34
|
-
/** Repeat interval in milliseconds */
|
|
35
|
-
intervalMs: number;
|
|
36
|
-
/** Run immediately on schedule creation */
|
|
37
|
-
immediate?: boolean;
|
|
38
|
-
}
|
|
39
|
-
interface EngineOptions {
|
|
40
|
-
/** Snapshot store for workflow persistence */
|
|
41
|
-
store: SnapshotStore;
|
|
42
|
-
/** Registered workflows keyed by name */
|
|
43
|
-
workflows: Record<string, WorkflowRegistration>;
|
|
44
|
-
/** Max parallel workflow runs per tick (default: 5) */
|
|
45
|
-
concurrency?: number;
|
|
46
|
-
/** Event handler */
|
|
47
|
-
onEvent?: (event: EngineEvent) => void;
|
|
48
|
-
/** Error handler for background operations */
|
|
49
|
-
onError?: (error: unknown) => void;
|
|
50
|
-
}
|
|
51
|
-
type EngineEvent = {
|
|
52
|
-
type: "engine_start";
|
|
53
|
-
ts: number;
|
|
54
|
-
} | {
|
|
55
|
-
type: "engine_stop";
|
|
56
|
-
ts: number;
|
|
57
|
-
} | {
|
|
58
|
-
type: "engine_tick";
|
|
59
|
-
ts: number;
|
|
60
|
-
processed: number;
|
|
61
|
-
} | {
|
|
62
|
-
type: "workflow_enqueued";
|
|
63
|
-
workflowName: string;
|
|
64
|
-
id: string;
|
|
65
|
-
ts: number;
|
|
66
|
-
} | {
|
|
67
|
-
type: "workflow_started";
|
|
68
|
-
workflowName: string;
|
|
69
|
-
id: string;
|
|
70
|
-
ts: number;
|
|
71
|
-
} | {
|
|
72
|
-
type: "workflow_completed";
|
|
73
|
-
workflowName: string;
|
|
74
|
-
id: string;
|
|
75
|
-
ts: number;
|
|
76
|
-
} | {
|
|
77
|
-
type: "workflow_failed";
|
|
78
|
-
workflowName: string;
|
|
79
|
-
id: string;
|
|
80
|
-
error: unknown;
|
|
81
|
-
ts: number;
|
|
82
|
-
} | {
|
|
83
|
-
type: "schedule_created";
|
|
84
|
-
workflowName: string;
|
|
85
|
-
scheduleId: string;
|
|
86
|
-
intervalMs: number;
|
|
87
|
-
ts: number;
|
|
88
|
-
} | {
|
|
89
|
-
type: "schedule_removed";
|
|
90
|
-
scheduleId: string;
|
|
91
|
-
ts: number;
|
|
92
|
-
};
|
|
93
|
-
interface Engine {
|
|
94
|
-
/** Enqueue a workflow for execution. Returns the workflow execution ID. */
|
|
95
|
-
enqueue(name: string, options?: EnqueueOptions): Promise<string>;
|
|
96
|
-
/** Schedule recurring workflow execution. Returns the schedule ID. */
|
|
97
|
-
schedule(name: string, options: ScheduleOptions & EnqueueOptions): string;
|
|
98
|
-
/** Remove a schedule */
|
|
99
|
-
unschedule(scheduleId: string): boolean;
|
|
100
|
-
/** Start the polling loop */
|
|
101
|
-
start(pollIntervalMs?: number): void;
|
|
102
|
-
/** Stop the polling loop gracefully */
|
|
103
|
-
stop(): Promise<void>;
|
|
104
|
-
/** Execute a single tick manually (process pending workflows). Returns number processed. */
|
|
105
|
-
tick(): Promise<number>;
|
|
106
|
-
/** Get engine status */
|
|
107
|
-
status(): {
|
|
108
|
-
running: boolean;
|
|
109
|
-
pendingSchedules: number;
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
declare function createEngine(options: EngineOptions): Engine;
|
|
114
|
-
|
|
115
|
-
export { type Engine, type EngineEvent, type EngineOptions, type EnqueueOptions, type ScheduleOptions, type WorkflowRegistration, createEngine };
|
package/dist/engine.d.ts
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { S as SnapshotStore, e as AnyResultFn, f as WorkflowContext } from './persistence-entry-DOMx3woy.js';
|
|
2
|
-
import { ah as RunStep } from './run-entry-Dduz-is2.js';
|
|
3
|
-
import { b as DurableOptions } from './index-BYT3amEz.js';
|
|
4
|
-
import './types-DQmzO9f4.js';
|
|
5
|
-
import '@standard-schema/spec';
|
|
6
|
-
import './errors.js';
|
|
7
|
-
import './tagged-error.js';
|
|
8
|
-
import './slugs.js';
|
|
9
|
-
|
|
10
|
-
/** A registered workflow definition */
|
|
11
|
-
interface WorkflowRegistration<Deps extends Readonly<Record<string, AnyResultFn>> = Readonly<Record<string, AnyResultFn>>> {
|
|
12
|
-
/** Workflow dependencies (Result-returning functions) */
|
|
13
|
-
deps: Deps;
|
|
14
|
-
/** Workflow function */
|
|
15
|
-
fn: (context: {
|
|
16
|
-
step: RunStep<any>;
|
|
17
|
-
deps: Deps;
|
|
18
|
-
ctx: WorkflowContext;
|
|
19
|
-
}) => any;
|
|
20
|
-
/** Default durable options (version, lockTtlMs, etc.) */
|
|
21
|
-
durableDefaults?: Partial<Pick<DurableOptions, 'version' | 'lockTtlMs' | 'heartbeatIntervalMs'>>;
|
|
22
|
-
}
|
|
23
|
-
interface EnqueueOptions {
|
|
24
|
-
/** Custom workflow execution ID (default: auto-generated UUID) */
|
|
25
|
-
id?: string;
|
|
26
|
-
/** Idempotency key for deduplication */
|
|
27
|
-
idempotencyKey?: string;
|
|
28
|
-
/** Workflow input for idempotency conflict detection */
|
|
29
|
-
input?: unknown;
|
|
30
|
-
/** Custom metadata */
|
|
31
|
-
metadata?: Record<string, unknown>;
|
|
32
|
-
}
|
|
33
|
-
interface ScheduleOptions {
|
|
34
|
-
/** Repeat interval in milliseconds */
|
|
35
|
-
intervalMs: number;
|
|
36
|
-
/** Run immediately on schedule creation */
|
|
37
|
-
immediate?: boolean;
|
|
38
|
-
}
|
|
39
|
-
interface EngineOptions {
|
|
40
|
-
/** Snapshot store for workflow persistence */
|
|
41
|
-
store: SnapshotStore;
|
|
42
|
-
/** Registered workflows keyed by name */
|
|
43
|
-
workflows: Record<string, WorkflowRegistration>;
|
|
44
|
-
/** Max parallel workflow runs per tick (default: 5) */
|
|
45
|
-
concurrency?: number;
|
|
46
|
-
/** Event handler */
|
|
47
|
-
onEvent?: (event: EngineEvent) => void;
|
|
48
|
-
/** Error handler for background operations */
|
|
49
|
-
onError?: (error: unknown) => void;
|
|
50
|
-
}
|
|
51
|
-
type EngineEvent = {
|
|
52
|
-
type: "engine_start";
|
|
53
|
-
ts: number;
|
|
54
|
-
} | {
|
|
55
|
-
type: "engine_stop";
|
|
56
|
-
ts: number;
|
|
57
|
-
} | {
|
|
58
|
-
type: "engine_tick";
|
|
59
|
-
ts: number;
|
|
60
|
-
processed: number;
|
|
61
|
-
} | {
|
|
62
|
-
type: "workflow_enqueued";
|
|
63
|
-
workflowName: string;
|
|
64
|
-
id: string;
|
|
65
|
-
ts: number;
|
|
66
|
-
} | {
|
|
67
|
-
type: "workflow_started";
|
|
68
|
-
workflowName: string;
|
|
69
|
-
id: string;
|
|
70
|
-
ts: number;
|
|
71
|
-
} | {
|
|
72
|
-
type: "workflow_completed";
|
|
73
|
-
workflowName: string;
|
|
74
|
-
id: string;
|
|
75
|
-
ts: number;
|
|
76
|
-
} | {
|
|
77
|
-
type: "workflow_failed";
|
|
78
|
-
workflowName: string;
|
|
79
|
-
id: string;
|
|
80
|
-
error: unknown;
|
|
81
|
-
ts: number;
|
|
82
|
-
} | {
|
|
83
|
-
type: "schedule_created";
|
|
84
|
-
workflowName: string;
|
|
85
|
-
scheduleId: string;
|
|
86
|
-
intervalMs: number;
|
|
87
|
-
ts: number;
|
|
88
|
-
} | {
|
|
89
|
-
type: "schedule_removed";
|
|
90
|
-
scheduleId: string;
|
|
91
|
-
ts: number;
|
|
92
|
-
};
|
|
93
|
-
interface Engine {
|
|
94
|
-
/** Enqueue a workflow for execution. Returns the workflow execution ID. */
|
|
95
|
-
enqueue(name: string, options?: EnqueueOptions): Promise<string>;
|
|
96
|
-
/** Schedule recurring workflow execution. Returns the schedule ID. */
|
|
97
|
-
schedule(name: string, options: ScheduleOptions & EnqueueOptions): string;
|
|
98
|
-
/** Remove a schedule */
|
|
99
|
-
unschedule(scheduleId: string): boolean;
|
|
100
|
-
/** Start the polling loop */
|
|
101
|
-
start(pollIntervalMs?: number): void;
|
|
102
|
-
/** Stop the polling loop gracefully */
|
|
103
|
-
stop(): Promise<void>;
|
|
104
|
-
/** Execute a single tick manually (process pending workflows). Returns number processed. */
|
|
105
|
-
tick(): Promise<number>;
|
|
106
|
-
/** Get engine status */
|
|
107
|
-
status(): {
|
|
108
|
-
running: boolean;
|
|
109
|
-
pendingSchedules: number;
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
declare function createEngine(options: EngineOptions): Engine;
|
|
114
|
-
|
|
115
|
-
export { type Engine, type EngineEvent, type EngineOptions, type EnqueueOptions, type ScheduleOptions, type WorkflowRegistration, createEngine };
|
package/dist/engine.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{randomUUID as Pt}from"crypto";var It={"step-require-id":"step-require-id","step-no-immediate-execution":"step-no-immediate-execution","step-require-thunk-for-key":"step-require-thunk-for-key","step-no-bare-await":"step-no-bare-await","step-no-try-catch-wrap":"step-no-try-catch-wrap","step-stable-cache-keys":"step-stable-cache-keys","workflow-no-floating":"workflow-no-floating","workflow-options-position":"workflow-options-position","workflow-callback-shape":"workflow-callback-shape","workflow-no-callable-form":"workflow-no-callable-form","workflow-no-dynamic-import":"workflow-no-dynamic-import","result-no-floating":"result-no-floating","result-require-handling":"result-require-handling","result-no-double-wrap":"result-no-double-wrap","result-no-manual-propagation":"result-no-manual-propagation","result-no-direct-ok-err":"result-no-direct-ok-err","error-check-unexpected-first":"error-check-unexpected-first","error-access-cause":"error-access-cause","error-normalize":"error-normalize","error-no-throw-in-deps":"error-no-throw-in-deps","concurrency-no-promise-all":"concurrency-no-promise-all","concurrency-no-promise-race":"concurrency-no-promise-race","concurrency-no-promise-allsettled":"concurrency-no-promise-allsettled","runtime-step-timeout":"runtime-step-timeout","runtime-step-aborted":"runtime-step-aborted","runtime-retry-exhausted":"runtime-retry-exhausted","runtime-rate-limit":"runtime-rate-limit","runtime-circuit-open":"runtime-circuit-open","runtime-unexpected":"runtime-unexpected","runtime-resolver-not-found":"runtime-resolver-not-found","runtime-saga-compensation":"runtime-saga-compensation"};function at(t){return`https://jagreehal.github.io/awaitly/rules/#${t}`}var tr=Object.keys(It);var Ne=class extends Error{_tag};function ge(t,e){return class extends Ne{_tag=t;constructor(s,a){let E=e?.message?e.message(s??{}):t;if(super(E),this.name=t,e?.slug!==void 0){if(!e.hint)throw new TypeError(`TaggedError: 'hint' is required when 'slug' is set (slug: "${e.slug}")`);Object.defineProperty(this,"code",{value:e.slug,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"hint",{value:e.hint,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"docsUrl",{value:at(e.slug),enumerable:!0,writable:!1,configurable:!1})}if(Object.setPrototypeOf(this,new.target.prototype),s&&typeof s=="object"){let c;if(e?.slug!==void 0){let{_tag:i,name:$,message:I,stack:S,code:pe,hint:d,docsUrl:re,...G}=s;c=G}else{let{_tag:i,name:$,message:I,stack:S,...pe}=s;c=pe}let g=Object.prototype.hasOwnProperty.call(c,"cause"),R=g?c.cause:void 0;g&&delete c.cause;let L=a?.cause!==void 0;if(g&&L)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,c),g&&(this.cause=R),L&&(this.cause=a?.cause)}else a?.cause!==void 0&&(this.cause=a.cause)}}}Object.defineProperty(ge,Symbol.hasInstance,{value:t=>t instanceof Ne});(E=>{function t(c){return c instanceof Error}E.isError=t;function e(c){return c instanceof Ne}E.isTaggedError=e;function s(c,g){let R=c._tag,L=g[R];return L(c)}E.match=s;function a(c,g,R){let L=c._tag,i=g[L];return i?i(c):R(c)}E.matchPartial=a})(ge||={});var it=class extends ge("TimeoutError",{slug:"runtime-step-timeout",hint:"Increase the step's timeout option, or check why the upstream operation is slow.",message:e=>e.operation?`TimeoutError: ${e.operation} timed out after ${e.ms}ms`:`TimeoutError: Operation timed out after ${e.ms}ms`}){},ut=class extends ge("RetryExhaustedError",{slug:"runtime-retry-exhausted",hint:"All retry attempts failed. Inspect lastError and decide whether to surface it or compensate.",message:e=>e.operation?`RetryExhaustedError: ${e.operation} failed after ${e.attempts} attempts`:`RetryExhaustedError: Operation failed after ${e.attempts} attempts`}){},lt=class extends ge("RateLimitError",{slug:"runtime-rate-limit",hint:"Wait retryAfterMs before retrying, or apply step.cache to deduplicate calls.",message:e=>e.limiterName?`RateLimitError: Rate limit exceeded for ${e.limiterName}${e.retryAfterMs?`, retry after ${e.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${e.retryAfterMs?`, retry after ${e.retryAfterMs}ms`:""}`}){},ct=class extends ge("CircuitBreakerOpenError",{slug:"runtime-circuit-open",hint:"The circuit is open. Wait for it to half-open or fall back to a degraded path.",message:e=>`CircuitBreakerOpenError: Circuit ${e.circuitName} is ${e.state??"OPEN"}${e.retryAfterMs?`, retry after ${Math.ceil(e.retryAfterMs/1e3)}s`:""}`}){},pt=class extends ge("ValidationError",{message:e=>`ValidationError: Invalid ${e.field} - ${e.reason}`}){},dt=class extends ge("NotFoundError",{message:e=>e.id?`NotFoundError: ${e.resource} with id ${e.id} not found`:`NotFoundError: ${e.resource} not found`}){},mt=class extends ge("UnauthorizedError",{message:e=>e.reason?`UnauthorizedError: ${e.reason}`:e.action&&e.resource?`UnauthorizedError: Not authorized to ${e.action} ${e.resource}`:"UnauthorizedError: Access denied"}){},ft=class extends ge("NetworkError",{message:e=>e.url?`NetworkError: ${e.reason} (${e.url})`:`NetworkError: ${e.reason}`}){},Et=class extends ge("CompensationError",{slug:"runtime-saga-compensation",hint:"A saga compensation step failed. Inspect compensationError and ensure compensation is idempotent.",message:e=>`CompensationError: Failed to compensate step ${e.step}`}){},je=class extends ge("UnexpectedError",{slug:"runtime-unexpected",hint:"An unexpected exception escaped a step. Inspect cause; consider returning a typed Result instead of throwing.",message:e=>`UnexpectedError: ${e.cause instanceof Error?e.cause.message:String(e.cause??"unknown")}`}){};function Mt(t){let e=t.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!e)return;let s=parseFloat(e[1]),a=e[2].toLowerCase();return{_tag:"Duration",millis:s*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[a]??1)}}function $e(t){return new je({cause:t})}function ne(t){return{ok:!0,value:t}}function _(t,e){let s=e?.cause;return{ok:!1,error:t,...s!==void 0?{cause:s}:{}}}var kt=t=>t instanceof je||typeof t=="object"&&t!==null&&"_tag"in t&&t._tag==="UnexpectedError";function Ut(t){if(t==null)return"unknown";if(typeof t=="string")return t.trim()||"unknown";if(typeof t=="object"){let e=t;if(typeof e._tag=="string"){let s=e._tag.trim();if(s)return s}if(typeof e.tag=="string"){let s=e.tag.trim();if(s)return s}if(typeof e.code=="string"){let s=e.code.trim();if(s)return s}else if(typeof e.code=="number")return String(e.code);if(t instanceof Error&&t.name){let s=t.name.trim();if(s)return s}}return"unknown"}function Wt(t,e){if(!(!e||!t))return e[t]}function ze(t){let{intent:e,domain:s,owner:a,tags:E,stateChanges:c,emits:g,calls:R}=t;if(!e&&!s&&!a&&!E?.length&&!c?.length&&!g?.length&&!R?.length)return;let L={};return e&&(L.intent=e),s&&(L.domain=s),a&&(L.owner=a),E?.length&&(L.tags=E),c?.length&&(L.stateChanges=c),g?.length&&(L.emits=g),R?.length&&(L.calls=R),L}function ke(t,e,s,a,E){let c=Ut(t),g=Wt(c,e),R={tag:c,origin:s};return g!==void 0&&(R.classification=g),a!==void 0&&(R.attempt=a),E!==void 0&&(R.cumulativeDurationMs=E),R}var De=Symbol.for("step_timeout_marker");function wt(t){return typeof t!="object"||t===null?!1:t.type==="STEP_TIMEOUT"?!0:De in t}function Nt(t){if(!(typeof t!="object"||t===null)){if(t.type==="STEP_TIMEOUT"){let e=t;return{timeoutMs:e.timeoutMs,stepName:e.stepName,stepKey:e.stepKey,attempt:e.attempt}}if(De in t)return t[De]}}var Rt=Symbol("early-exit");function Oe(t,e){return{[Rt]:!0,error:t,meta:e}}function be(t){return typeof t=="object"&&t!==null&&t[Rt]===!0}var Tt=Symbol("mapper-exception");function Ae(t){return{[Tt]:!0,thrown:t}}function jt(t){return typeof t=="object"&&t!==null&&t[Tt]===!0}function qe(t,e){let{backoff:s,initialDelay:a,maxDelay:E,jitter:c}=e,g;switch(s){case"fixed":g=a;break;case"linear":g=a*t;break;case"exponential":g=a*Math.pow(2,t-1);break}if(g=Math.min(g,E),c){let R=g*.25*Math.random();g=g+R}return Math.floor(g)}function Je(t){return new Promise(e=>setTimeout(e,t))}var yt=Symbol("timeout"),Le=Symbol("timeout-option");function Kt(t){return typeof t=="object"&&t!==null&&t[Le]===!0}async function Ft(t,e,s,a){let E=new AbortController,c=e.onTimeout??"error",g=()=>typeof c=="function"?c({name:s.name,key:s.key,ms:e.ms}):e.error??{type:"STEP_TIMEOUT",stepName:s.name,stepKey:s.key,timeoutMs:e.ms,attempt:s.attempt},R;a?.aborted&&E.abort(a.reason);let L;a&&!a.aborted&&(L=()=>E.abort(a.reason),a.addEventListener("abort",L,{once:!0}));let i=new Promise((I,S)=>{R=setTimeout(()=>{if(c!=="disconnect"&&E.abort(),c==="option"){S({[Le]:!0,ms:e.ms});return}S({[yt]:!0,error:g()})},e.ms)}),$;e.signal?$=Promise.resolve(t(E.signal)):$=Promise.resolve(t());try{return await Promise.race([$,i])}catch(I){if(typeof I=="object"&&I!==null&&I[Le]===!0)throw{[Le]:!0,ms:e.ms};if(typeof I=="object"&&I!==null&&I[yt]===!0){c==="disconnect"&&$.catch(()=>{});let S=I.error;if(typeof S=="object"&&S!==null&&S.type!=="STEP_TIMEOUT"){let pe={timeoutMs:e.ms,stepName:s.name,stepKey:s.key,attempt:s.attempt};De in S?S[De]=pe:Object.defineProperty(S,De,{value:pe,enumerable:!1,writable:!0,configurable:!1})}throw S}throw I}finally{clearTimeout(R),L&&a&&a.removeEventListener("abort",L)}}var _e={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,shouldRetry:()=>!0,onRetry:()=>{}};async function Ve(t,e){let{onError:s,onEvent:a,catchUnexpected:E,workflowId:c,workflowName:g,context:R,_workflowSignal:L}=e&&typeof e=="object"?e:{},i=c??crypto.randomUUID(),$=E??$e,I=[],S=0,pe=m=>m??`step_${++S}`,d=m=>{let ue=m.context!==void 0||R===void 0?m:{...m,context:R},Z=g!==void 0&&ue.workflowName===void 0?{...ue,workflowName:g}:ue;if(Z.type==="step_success"){let q=Z.stepId;for(let le=I.length-1;le>=0;le--){let oe=I[le];if(oe.type==="race"&&!oe.winnerId){oe.winnerId=q;break}}}a?.(Z,R)},re=Oe,G=m=>be(m),h=(m,ue)=>m,F=m=>typeof m=="function"?!1:!!(m&&typeof m=="object"&&"ok"in m||m&&typeof m=="object"&&"then"in m&&typeof m.then=="function");try{let ue=function(p){let C={};for(let[o,r]of Object.entries(p))if(typeof r=="function")C[o]=r;else if(r&&typeof r=="object"&&"fn"in r)C[o]=r.fn;else throw new TypeError(`step.all: operation "${o}" must be a function or { fn, errors? } object`);return C},Z=function(p,C){let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),n=!1;I.push({scopeId:o,type:"parallel"});let f=()=>{if(n)return;n=!0;let x=I.findIndex(v=>v.scopeId===o);x!==-1&&I.splice(x,1),d({type:"scope_end",workflowId:i,scopeId:o,ts:Date.now(),durationMs:performance.now()-r})};d({type:"scope_start",workflowId:i,scopeId:o,scopeType:"parallel",name:p,ts:Date.now()});try{let x=await C();if(f(),!x.ok)throw s?.(x.error,p,R),re(x.error,{origin:"result",resultCause:x.cause});return x.value}catch(x){throw f(),x}})()},q=function(p,C){let o=Object.keys(p),r=C.name??`Parallel(${o.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let f=performance.now(),x=!1;I.push({scopeId:n,type:"parallel"});let v=()=>{if(x)return;x=!0;let l=I.findIndex(D=>D.scopeId===n);l!==-1&&I.splice(l,1),d({type:"scope_end",workflowId:i,scopeId:n,ts:Date.now(),durationMs:performance.now()-f})};d({type:"scope_start",workflowId:i,scopeId:n,scopeType:"parallel",name:r,ts:Date.now()});try{let l=await new Promise(M=>{if(o.length===0){M([]);return}let B=!1,J=o.length,U=new Array(o.length);for(let X=0;X<o.length;X++){let j=o[X],z=X;Promise.resolve(p[j]()).catch(W=>_({type:"PROMISE_REJECTED",cause:W},{cause:{type:"PROMISE_REJECTION",reason:W}})).then(W=>{if(!B){if(!W.ok){B=!0,M([{key:j,result:W}]);return}U[z]={key:j,result:W},J--,J===0&&M(U)}})}});v();let D={};for(let{key:M,result:B}of l){if(!B.ok)throw s?.(B.error,M,R),re(B.error,{origin:"result",resultCause:B.cause});D[M]=B.value}return D}catch(l){throw v(),l}})()};var ie=ue,fe=Z,ee=q;let m=(p,C,o)=>(async()=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let r=o??{},n=ze(r),f=p,x=r.key??p,v=r.key??p,{description:l,retry:D,timeout:M}=r,B=pe(x),J=a,U=J?performance.now():0,j=F(C)?()=>C:C,W={attempts:Math.max(1,D?.attempts??1),backoff:D?.backoff??_e.backoff,initialDelay:D?.initialDelay??_e.initialDelay,maxDelay:D?.maxDelay??_e.maxDelay,jitter:D?.jitter??_e.jitter,shouldRetry:D?.shouldRetry??_e.shouldRetry,onRetry:D?.onRetry??_e.onRetry};a&&d({type:"step_start",workflowId:i,stepId:B,stepKey:x,name:f,description:l,ts:Date.now(),...n&&{metadata:n}});let Te;for(let u=1;u<=W.attempts;u++){let y=J?performance.now():0;try{let w;if(M?w=await Ft(j,M,{name:f,key:x,attempt:u},L):w=await j(),w.ok){let Y=performance.now()-U;return d({type:"step_success",workflowId:i,stepId:B,stepKey:x,name:f,description:l,ts:Date.now(),durationMs:Y,...n&&{metadata:n}}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:f,description:l,ts:Date.now(),durationMs:Y,result:w,...n&&{metadata:n}}),w.value}if(Te=w,u<W.attempts&&W.shouldRetry(w.error,u)){let Y=qe(u,W);d({type:"step_retry",workflowId:i,stepId:B,stepKey:x,name:f,ts:Date.now(),attempt:u+1,maxAttempts:W.attempts,delayMs:Y,error:w.error,...n&&{metadata:n},diagnostics:ke(w.error,r.errorMeta,"result",u,performance.now()-U)}),W.onRetry(w.error,u,Y),await Je(Y);continue}W.attempts>1&&d({type:"step_retries_exhausted",workflowId:i,stepId:B,stepKey:x,name:f,ts:Date.now(),durationMs:performance.now()-U,attempts:u,lastError:w.error,...n&&{metadata:n},diagnostics:ke(w.error,r.errorMeta,"result",u,performance.now()-U)});break}catch(w){let Y=performance.now()-y;if(Kt(w)){let b=w.ms;d({type:"step_timeout",workflowId:i,stepId:B,stepKey:x,name:f,ts:Date.now(),timeoutMs:b,attempt:u,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u)}),d({type:"step_success",workflowId:i,stepId:B,stepKey:x,name:f,description:l,ts:Date.now(),durationMs:performance.now()-U,...n&&{metadata:n}}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:f,description:l,ts:Date.now(),durationMs:performance.now()-U,result:ne(void 0),...n&&{metadata:n}});return}if(G(w))throw d({type:"step_aborted",workflowId:i,stepId:B,stepKey:x,name:f,description:l,ts:Date.now(),durationMs:Y,...n&&{metadata:n}}),w;if(wt(w)){let b=Nt(w),P=M?.ms??b?.timeoutMs??0;if(d({type:"step_timeout",workflowId:i,stepId:B,stepKey:x,name:f,ts:Date.now(),timeoutMs:P,attempt:u,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u)}),u<W.attempts&&W.shouldRetry(w,u)){let K=qe(u,W);d({type:"step_retry",workflowId:i,stepId:B,stepKey:x,name:f,ts:Date.now(),attempt:u+1,maxAttempts:W.attempts,delayMs:K,error:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u,performance.now()-U)}),W.onRetry(w,u,K),await Je(K);continue}W.attempts>1&&d({type:"step_retries_exhausted",workflowId:i,stepId:B,stepKey:x,name:f,ts:Date.now(),durationMs:performance.now()-U,attempts:u,lastError:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u,performance.now()-U)});let O=performance.now()-U;throw d({type:"step_error",workflowId:i,stepId:B,stepKey:x,name:f,description:l,ts:Date.now(),durationMs:O,error:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u,O)}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:f,description:l,ts:Date.now(),durationMs:O,result:_(w,{cause:w}),meta:{origin:"throw",thrown:w},...n&&{metadata:n}}),s?.(w,f,R),re(w,{origin:"throw",thrown:w})}if(u<W.attempts&&W.shouldRetry(w,u)){let b=qe(u,W);d({type:"step_retry",workflowId:i,stepId:B,stepKey:x,name:f,ts:Date.now(),attempt:u+1,maxAttempts:W.attempts,delayMs:b,error:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"throw",u,performance.now()-U)}),W.onRetry(w,u,b),await Je(b);continue}W.attempts>1&&!wt(w)&&d({type:"step_retries_exhausted",workflowId:i,stepId:B,stepKey:x,name:f,ts:Date.now(),durationMs:performance.now()-U,attempts:u,lastError:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"throw",u,performance.now()-U)});let k=performance.now()-U,A;try{A=$(w)}catch(b){throw Ae(b)}throw d({type:"step_error",workflowId:i,stepId:B,stepKey:x,name:f,description:l,ts:Date.now(),durationMs:k,error:A,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"throw",u,k)}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:f,description:l,ts:Date.now(),durationMs:k,result:_(A,{cause:w}),meta:{origin:"throw",thrown:w},...n&&{metadata:n}}),s?.(A,f,R),re(A,{origin:"throw",thrown:w})}}let Re=Te,de=performance.now()-U,xe=h(Re.error,{origin:"result",resultCause:Re.cause});throw d({type:"step_error",workflowId:i,stepId:B,stepKey:x,name:f,description:l,ts:Date.now(),durationMs:de,error:xe,...n&&{metadata:n},diagnostics:ke(Re.error,r.errorMeta,"result",W.attempts,de)}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:f,description:l,ts:Date.now(),durationMs:de,result:Re,meta:{origin:"result",resultCause:Re.cause},...n&&{metadata:n}}),s?.(xe,f,R),re(xe,{origin:"result",resultCause:Re.cause})})();m.try=(p,C,o)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.try() requires an explicit string ID as the first argument. Example: step.try("parse", () => JSON.parse(str), { error: "PARSE_ERROR" })');let r="error"in o?()=>o.error:o.onError;if(o.retry||o.timeout)return m.retry(p,async()=>{try{return ne(await C())}catch(l){return _(r(l),{cause:l})}},{attempts:o.retry?.attempts??1,...o.retry??{},key:o.key,timeout:o.timeout});let n=o.key??p,f=p,x=p,v=a;return(async()=>{let l=v?performance.now():0;a&&d({type:"step_start",workflowId:i,stepId:x,stepKey:n,name:f,ts:Date.now()});try{let D=await C(),M=performance.now()-l;return d({type:"step_success",workflowId:i,stepId:x,stepKey:n,name:f,ts:Date.now(),durationMs:M}),n&&d({type:"step_complete",workflowId:i,stepKey:n,name:f,ts:Date.now(),durationMs:M,result:ne(D)}),D}catch(D){let M=r(D),B=performance.now()-l,J=h(M,{origin:"throw",thrown:D});throw d({type:"step_error",workflowId:i,stepId:x,stepKey:n,name:f,ts:Date.now(),durationMs:B,error:J}),n&&d({type:"step_complete",workflowId:i,stepKey:n,name:f,ts:Date.now(),durationMs:B,result:_(M,{cause:D}),meta:{origin:"throw",thrown:D}}),s?.(J,f,R),re(J,{origin:"throw",thrown:D})}})()},m.fromResult=(p,C,o)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.fromResult() requires an explicit string ID as the first argument. Example: step.fromResult("callProvider", () => callProvider(input), { onError: (e) => ({ type: "FAILED" }) })');let r=o.key??p,n=p,f=p,x="error"in o?()=>o.error:o.onError,v=a;return(async()=>{let l=v?performance.now():0;a&&d({type:"step_start",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now()});let D=await C();if(D.ok){let M=performance.now()-l;return d({type:"step_success",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:M}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:M,result:ne(D.value)}),D.value}else{let M=x(D.error),B=performance.now()-l,J=h(M,{origin:"result",resultCause:D.error});throw d({type:"step_error",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:B,error:J}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:B,result:_(M,{cause:D.error}),meta:{origin:"result",resultCause:D.error}}),s?.(J,n,R),re(J,{origin:"result",resultCause:D.error})}})()},m.fromNullable=(p,C,o,r)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.fromNullable() requires an explicit string ID as the first argument. Example: step.fromNullable("getUser", () => db.find(id), () => ({ type: "NOT_FOUND" }))');return m(p,async()=>{let n=await C();return n!=null?ne(n):_(o())},r)},m.retry=(p,C,o)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.retry() requires an explicit string ID as the first argument. Example: step.retry("fetchData", () => fetchData(), { attempts: 3 })');return m(p,C,{key:o.key??p,retry:{attempts:o.attempts,backoff:o.backoff,initialDelay:o.initialDelay,maxDelay:o.maxDelay,jitter:o.jitter,shouldRetry:o.shouldRetry,onRetry:o.onRetry},timeout:o.timeout})},m.withTimeout=(p,C,o)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.withTimeout() requires an explicit string ID as the first argument. Example: step.withTimeout("slowOp", () => slowOp(), { ms: 5000 })');return m(p,C,{key:o.key??p,timeout:o})},m.sleep=(p,C,o)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let r=typeof C=="string"?Mt(C):C;if(!r)throw new Error(`step.sleep: invalid duration '${C}'`);let n=r.millis,f=o?.signal;return m(p,async()=>{if(L?.aborted||f?.aborted){let x=new Error("Sleep aborted");throw x.name="AbortError",x}return new Promise((x,v)=>{let l={timeoutId:void 0},D=()=>{l.timeoutId&&clearTimeout(l.timeoutId);let M=new Error("Sleep aborted");M.name="AbortError",v(M)};L?.addEventListener("abort",D,{once:!0}),f?.addEventListener("abort",D,{once:!0}),l.timeoutId=setTimeout(()=>{L?.removeEventListener("abort",D),f?.removeEventListener("abort",D),x(ne(void 0))},n)})},{key:o?.key??p,description:o?.description})},m.all=((...p)=>{if(typeof p[0]!="string")throw new TypeError("step.all(name, ...): first argument must be a string (step name). Example: step.all('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let C=p[0],o=p[1];if(typeof o=="function")return Z(C,o);if(o&&typeof o=="object"&&!Array.isArray(o)){let n=ue(o);return q(n,{name:C})}throw new TypeError("step.all(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),m.race=(p,C)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),n=!1,f={scopeId:o,type:"race",winnerId:void 0};I.push(f);let x=()=>{if(n)return;n=!0;let v=I.findIndex(l=>l.scopeId===o);v!==-1&&I.splice(v,1),d({type:"scope_end",workflowId:i,scopeId:o,ts:Date.now(),durationMs:performance.now()-r,winnerId:f.winnerId})};d({type:"scope_start",workflowId:i,scopeId:o,scopeType:"race",name:p,ts:Date.now()});try{let v=await C();if(x(),!v.ok)throw s?.(v.error,p,R),re(v.error,{origin:"result",resultCause:v.cause});return v.value}catch(v){throw x(),v}})()},m.if=(p,C,o)=>o(),m.label=m.if,m.branch=async(p,C)=>{let{condition:o,then:r,else:n}=C;if(o())return await r();if(n)return await n()},m.arm=(p,C)=>({fn:p,errors:C}),m.forEach=async(p,C,o)=>{let r=[],n=o.maxIterations,f=0,x="run"in o,v=Symbol.asyncIterator in C?C:(async function*(){yield*C})();for await(let l of v){if(n!==void 0&&f>=n)break;let D;x?D=await o.run(l,f):D=await o.item.handler(l,f,m),r.push(D),f++}return r},m.item=p=>({__forEachItemHandler:!0,handler:p}),m.dep=(p,C)=>C,m.workflow=(p,C,o)=>m(p,C,o),m.map=async(p,C,o,r)=>{let n=r?.concurrency??C.length;return m(p,()=>n>=C.length?gt(C.map((f,x)=>o(f,x))):(async()=>{let f=[];for(let x=0;x<C.length;x+=n){let v=C.slice(x,x+n),l=await gt(v.map((D,M)=>o(D,x+M)));if(!l.ok)return l;f.push(...l.value)}return ne(f)})(),{key:r?.key})},m.withFallback=(p,C,o)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.withFallback() requires an explicit string ID as the first argument. Example: step.withFallback("getUser", () => fetchUser(id), { fallback: () => fetchFromCache(id) })');let r=o.key??p,n=p,f=pe(r),x=a;return(async()=>{let v=x?performance.now():0;a&&d({type:"step_start",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now()});let l;try{l=await C()}catch(U){if(G(U))throw d({type:"step_aborted",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:performance.now()-v}),U;let X;try{X=$(U)}catch(z){throw Ae(z)}if(o.on!==void 0&&o.on!==X){let z=performance.now()-v;throw d({type:"step_error",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:z,error:X}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:z,result:_(X,{cause:U}),meta:{origin:"throw",thrown:U}}),s?.(X,n,R),re(X,{origin:"throw",thrown:U})}let j;try{j=await o.fallback()}catch(z){if(G(z))throw d({type:"step_aborted",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:performance.now()-v}),z;let W;try{W=$(z)}catch(Re){throw Ae(Re)}let Te=performance.now()-v;throw d({type:"step_error",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:Te,error:W}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:Te,result:_(W,{cause:z}),meta:{origin:"throw",thrown:z}}),s?.(W,n,R),re(W,{origin:"throw",thrown:z})}if(j.ok){let z=performance.now()-v;return d({type:"step_success",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:z}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:z,result:j,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(X)}}),j.value}else{let z=performance.now()-v,W=h(j.error,{origin:"result",resultCause:j.cause});throw d({type:"step_error",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:z,error:W}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:z,result:j,meta:{origin:"result",resultCause:j.cause}}),s?.(W,n,R),re(W,{origin:"result",resultCause:j.cause})}}if(l.ok){let U=performance.now()-v;return d({type:"step_success",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:U}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:U,result:l}),l.value}let D=l.error;if(o.on!==void 0&&o.on!==D){let U=performance.now()-v,X=h(D,{origin:"result",resultCause:l.cause});throw d({type:"step_error",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:U,error:X}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:U,result:l,meta:{origin:"result",resultCause:l.cause}}),s?.(X,n,R),re(X,{origin:"result",resultCause:l.cause})}let M;try{M=await o.fallback()}catch(U){if(G(U))throw d({type:"step_aborted",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:performance.now()-v}),U;let X;try{X=$(U)}catch(z){throw Ae(z)}let j=performance.now()-v;throw d({type:"step_error",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:j,error:X}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:j,result:_(X,{cause:U}),meta:{origin:"throw",thrown:U}}),s?.(X,n,R),re(X,{origin:"throw",thrown:U})}if(M.ok){let U=performance.now()-v;return d({type:"step_success",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:U}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:U,result:M,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(D)}}),M.value}let B=performance.now()-v,J=h(M.error,{origin:"result",resultCause:M.cause});throw d({type:"step_error",workflowId:i,stepId:f,stepKey:r,name:n,ts:Date.now(),durationMs:B,error:J}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:B,result:M,meta:{origin:"result",resultCause:M.cause}}),s?.(J,n,R),re(J,{origin:"result",resultCause:M.cause})})()},m.withResource=(p,C)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.withResource() requires an explicit string ID as the first argument. Example: step.withResource("useDb", { acquire: () => connect(), use: (db) => query(db), release: (db) => db.close() })');let o=p,r=p,n=pe(o),f=a;return(async()=>{let x=f?performance.now():0;a&&d({type:"step_start",workflowId:i,stepId:n,stepKey:o,name:r,ts:Date.now()});let v;try{v=await C.acquire()}catch(j){if(G(j))throw d({type:"step_aborted",workflowId:i,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:performance.now()-x}),j;let z;try{z=$(j)}catch(Te){throw Ae(Te)}let W=performance.now()-x;throw d({type:"step_error",workflowId:i,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:W,error:z}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:r,ts:Date.now(),durationMs:W,result:_(z,{cause:j}),meta:{origin:"throw",thrown:j}}),s?.(z,r,R),re(z,{origin:"throw",thrown:j})}if(!v.ok){let j=performance.now()-x,z=h(v.error,{origin:"result",resultCause:v.cause});throw d({type:"step_error",workflowId:i,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:j,error:z}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:r,ts:Date.now(),durationMs:j,result:v,meta:{origin:"result",resultCause:v.cause}}),s?.(z,r,R),re(z,{origin:"result",resultCause:v.cause})}let l=v.value,D,M,B=!1;try{D=await C.use(l)}catch(j){if(G(j)){try{await C.release(l)}catch(z){console.warn(`[awaitly] step.withResource("${p}"): release threw after earlyExit:`,z)}throw j}M=j,B=!0}try{await C.release(l)}catch(j){console.warn(`[awaitly] step.withResource("${p}"): release threw:`,j)}if(B){let j;try{j=$(M)}catch(W){throw Ae(W)}let z=performance.now()-x;throw d({type:"step_error",workflowId:i,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:z,error:j}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:r,ts:Date.now(),durationMs:z,result:_(j,{cause:M}),meta:{origin:"throw",thrown:M}}),s?.(j,r,R),re(j,{origin:"throw",thrown:M})}let J=D;if(J.ok){let j=performance.now()-x;return d({type:"step_success",workflowId:i,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:j}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:r,ts:Date.now(),durationMs:j,result:J}),J.value}let U=performance.now()-x,X=h(J.error,{origin:"result",resultCause:J.cause});throw d({type:"step_error",workflowId:i,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:U,error:X}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:r,ts:Date.now(),durationMs:U,result:J,meta:{origin:"result",resultCause:J.cause}}),s?.(X,r,R),re(X,{origin:"result",resultCause:J.cause})})()};let oe=await t({step:m});if(process.env.NODE_ENV!=="production"&&oe!==null&&typeof oe=="object"&&"ok"in oe&&typeof oe.ok=="boolean"){let p=oe;(p.ok===!0&&"value"in p||p.ok===!1&&"error"in p)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
|
|
2
|
-
|
|
3
|
-
Incorrect: return ok({ data });
|
|
4
|
-
Correct: return { data };
|
|
5
|
-
|
|
6
|
-
See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return ne(oe)}catch(m){if(jt(m))throw m.thrown;if(G(m)){let Z=m.meta.origin==="throw"?m.meta.thrown:m.meta.origin==="result"?m.meta.resultCause:void 0;return _(m.error,{cause:Z})}let ue=$(m);return s?.(ue,"unexpected",R),_(ue,{cause:m})}}Ve.strict=(t,e)=>Ve(t,e);async function gt(t){return t.length===0?ne([]):new Promise(e=>{let s=!1,a=t.length,E=new Array(t.length);for(let c=0;c<t.length;c++){let g=c;Promise.resolve(t[g]).catch(R=>_({type:"PROMISE_REJECTED",cause:R},{cause:{type:"PROMISE_REJECTION",reason:R}})).then(R=>{if(!s){if(!R.ok){s=!0,e(R);return}E[g]=R.value,a--,a===0&&e(ne(E))}})}})}function ht(t){return t.type==="step_complete"}function Ye(t){return typeof t=="object"&&t!==null&&t.type==="WORKFLOW_CANCELLED"}var ve=class extends Error{constructor(s,a=[]){super(s);this.errors=a;this.name="SnapshotFormatError"}};var Pe=class extends Error{constructor(s,a,E){super(s);this.stepId=a;this.originalError=E;this.name="SnapshotDecodeError"}};function Lt(t){let e=[];if(typeof t!="object"||t===null)return{valid:!1,errors:["Snapshot must be an object"]};let s=t;if("formatVersion"in s?s.formatVersion!==1&&e.push(`Invalid formatVersion: expected 1, got ${s.formatVersion}`):e.push("Missing required field: formatVersion"),!("steps"in s))e.push("Missing required field: steps");else if(typeof s.steps!="object"||s.steps===null)e.push("steps must be an object");else{let a=s.steps;for(let[E,c]of Object.entries(a)){if(typeof c!="object"||c===null){e.push(`steps["${E}"] must be an object`);continue}let g=c;"ok"in g?typeof g.ok!="boolean"?e.push(`steps["${E}"].ok must be a boolean`):g.ok===!1&&("error"in g||e.push(`steps["${E}"] is error result but missing error field`),"cause"in g||e.push(`steps["${E}"] is error result but missing cause field`)):e.push(`steps["${E}"] missing required field: ok`)}}if(!("execution"in s))e.push("Missing required field: execution");else if(typeof s.execution!="object"||s.execution===null)e.push("execution must be an object");else{let a=s.execution;"status"in a?["running","completed","failed"].includes(a.status)||e.push("execution.status must be one of: running, completed, failed"):e.push("execution missing required field: status"),"lastUpdated"in a?typeof a.lastUpdated!="string"&&e.push("execution.lastUpdated must be a string (ISO timestamp)"):e.push("execution missing required field: lastUpdated")}return e.length>0?{valid:!1,errors:e}:{valid:!0,snapshot:t}}function St(t){let e=Lt(t);if(!e.valid)throw new ve(`Invalid snapshot format: ${e.errors[0]}`,e.errors);return e.snapshot}function Ct(t,e){let s=Object.create(null);for(let[g,R]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,g)&&(s[g]=R);for(let[g,R]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,g)&&(s[g]=R);let a=t.metadata||e.metadata?{...t.metadata,...e.metadata}:void 0,c=[...(t.warnings||[]).filter(g=>!Object.prototype.hasOwnProperty.call(e.steps,g.stepId)),...e.warnings||[]];return{formatVersion:1,steps:s,execution:{...e.execution},metadata:a,warnings:c.length>0?c:void 0}}var xt=1e3;function Xe(t){let e={type:"error",name:t.name,message:t.message};t.stack&&(e.stack=t.stack);let s=t;return s.cause!==void 0&&(s.cause instanceof Error?e.cause=Xe(s.cause):e.cause=Ge(s.cause)),e}function Ge(t){let e,s=!1;try{e=String(t),e.length>xt&&(e=e.slice(0,xt),s=!0)}catch{e="[unable to convert to string]"}let a=t===null?"null":typeof t=="object"?t.constructor?.name??"Object":typeof t,E;try{let g=JSON.stringify(t);g!==void 0&&(E=JSON.parse(g))}catch{}let c={type:"thrown",originalType:a,stringRepresentation:e};return E!==void 0&&(c.value=E),s&&(c.truncated=!0),c}function Ze(t){if(t.type==="error"){let e=new Error(t.message);return e.name=t.name,t.stack&&(e.stack=t.stack),t.cause&&(e.cause=Ze(t.cause)),e}return t.value!==void 0?t.value:t.stringRepresentation}function Vt(t){return typeof t=="object"&&t!==null&&t.__cachedMeta===!0}function Ce(t,e,s){return _(t,{cause:{__cachedMeta:!0,originalCause:s,meta:e}})}function Ke(t){return Vt(t)?t.meta:{origin:"result",resultCause:t}}function Fe(){let t=new Map;return{handleEvent:e=>{ht(e)&&t.set(e.stepKey,{result:e.result,meta:e.meta})},getResumeState:()=>({steps:new Map(t)}),clear:()=>t.clear()}}var $t="STREAM_WRITE_ERROR",Bt="STREAM_READ_ERROR",Ht="STREAM_CLOSE_ERROR";var qt="STREAM_ENDED";function Be(t,e,s){return{type:$t,reason:t,message:e,...s!==void 0?{cause:s}:{}}}function Qe(t,e,s){return{type:Bt,reason:t,message:e,...s!==void 0?{cause:s}:{}}}function et(t,e,s){return{type:Ht,reason:t,message:e,...s!==void 0?{cause:s}:{}}}function He(t){return{type:qt,finalPosition:t}}function bt(t={}){let e=t.highWaterMark??16,s=t.lowWaterMark??Math.floor(e/2),a=t.onStateChange,E="flowing",c=0,g=[];function R(i){if(E!==i&&(E=i,a?.(i),i==="flowing"&&g.length>0)){let $=g;g=[];for(let I of $)I()}}function L(){E==="flowing"&&c>=e?R("paused"):E==="paused"&&c<=s&&R("flowing")}return{get state(){return E},get bufferedCount(){return c},get highWaterMark(){return e},get lowWaterMark(){return s},increment(){c++,L()},decrement(){c>0&&(c--,L())},setCount(i){c=Math.max(0,i),L()},waitForDrain(){return E==="flowing"?Promise.resolve():new Promise(i=>{g.push(i)})},reset(){c=0,g=[],R("flowing")}}}function Jt(t){return{_tag:"Duration",millis:t}}function zt(t){return{_tag:"Duration",millis:t*1e3}}function Yt(t){return{_tag:"Duration",millis:t*60*1e3}}function Xt(t){return{_tag:"Duration",millis:t*60*60*1e3}}function Gt(t){return{_tag:"Duration",millis:t*24*60*60*1e3}}function vt(t){return t.millis}function At(t){let e=t.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!e)return;let s=parseFloat(e[1]);switch(e[2].toLowerCase()){case"ms":return Jt(s);case"s":return zt(s);case"m":return Yt(s);case"h":return Xt(s);case"d":return Gt(s);default:return}}async function _t(t,e){let s=t["~standard"].validate(e),a=s instanceof Promise?await s:s;return a.issues?_({type:"INPUT_VALIDATION_ERROR",issues:a.issues.map(E=>({message:E.message,path:E.path?.map(c=>typeof c=="object"?c.key:c)})),message:`Input validation failed: ${a.issues.map(E=>E.message).join(", ")}`}):ne(a.value)}function tt(t,e){let s=a=>((...E)=>{let c=E.at(-1),g=E.length>0&&typeof c=="object"&&c!==null&&!Array.isArray(c)&&typeof c!="function",R=g?c:void 0,L=g?E.slice(0,-1):E,i={...e,...R?.deps??{}},$=R?{...R,deps:i}:{deps:i};return t[a](...L,$)});return{run:s("run"),runWithState:s("runWithState"),withDeps(a){return tt(t,{...e,...a})}}}function rt(t,e,s){if(typeof t!="string"||t.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let a=e??{},E=s;async function c(i,$,I){let S=i??crypto.randomUUID(),pe=I?.deps?{...a,...I.deps}:a,d=[],re=I?.createContext??E?.createContext,G=re?await re():void 0,h=I?.signal??E?.signal,F=I?.onEvent??E?.onEvent,ie=I?.onError??E?.onError,fe=I?.shouldRun??E?.shouldRun,ee=I?.onBeforeStart??E?.onBeforeStart,m=I?.onAfterStep??E?.onAfterStep,ue=I?.resumeState??E?.resumeState,Z=E?.catchUnexpected??$e,q={},le=(I?.devWarnings??E?.devWarnings)===!0&&process.env.NODE_ENV!=="production",oe=new Set,p=new Set,C={workflowId:S,onEvent:F,context:G!==void 0?G:void 0,signal:h,input:{},ref:u=>q[u],set:(u,y)=>{le&&!oe.has(u)&&(oe.add(u),console.warn(`awaitly: ctx.set('${u}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${u}' }) instead.`)),q[u]=y},get:u=>(le&&!p.has(u)&&(p.add(u),console.warn(`awaitly: ctx.get('${u}') is deprecated for static analysis. Use ctx.ref('${u}') instead for tracked dependencies.`)),q[u])},o=u=>{let y=u.context!==void 0||G===void 0?u:{...u,context:G},w=y.workflowName===void 0?{...y,workflowName:t}:y;F?.(w,G)},r=(u,y)=>{let w={type:"WORKFLOW_CANCELLED",reason:u,lastStepKey:y};return _(Z(w),{cause:w})};if(h?.aborted){let u=typeof h.reason=="string"?h.reason:h.reason instanceof Error?h.reason.message:void 0;return o({type:"workflow_cancelled",workflowId:S,ts:Date.now(),durationMs:0,reason:u}),r(u)}if(fe){let u=performance.now();try{let y=await fe(S,G),w=performance.now()-u;if(o({type:"hook_should_run",workflowId:S,ts:Date.now(),durationMs:w,result:y,skipped:!y}),!y){let Y=new Error("Workflow skipped by shouldRun hook");return _(Z(Y),{cause:Y})}}catch(y){let w=performance.now()-u;return o({type:"hook_should_run_error",workflowId:S,ts:Date.now(),durationMs:w,error:y}),_(Z(y),{cause:y})}}if(ee){let u=performance.now();try{let y=await ee(S,G),w=performance.now()-u;if(o({type:"hook_before_start",workflowId:S,ts:Date.now(),durationMs:w,result:y,skipped:!y}),!y){let Y=new Error("Workflow skipped by onBeforeStart hook");return _(Z(Y),{cause:Y})}}catch(y){let w=performance.now()-u;return o({type:"hook_before_start_error",workflowId:S,ts:Date.now(),durationMs:w,error:y}),_(Z(y),{cause:y})}}let n=E?.inputSchema,f=E?.input;if(n){let u=await _t(n,f);if(!u.ok)return _(u.error);C.input=u.value}else f!==void 0&&(C.input=f);let x=Date.now(),v=performance.now();o({type:"workflow_start",workflowId:S,ts:x});let l=I?.cache??E?.cache,D=I?.streamStore??E?.streamStore;if(ue&&!l&&(l=new Map),ue&&l){let u=typeof ue=="function"?await ue():ue;u.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof u.steps}). This usually happens when state is serialized with JSON.stringify() directly.
|
|
7
|
-
Use stringifyState() and parseState() from 'awaitly/persistence' instead:
|
|
8
|
-
import { stringifyState, parseState } from 'awaitly/persistence';
|
|
9
|
-
const json = stringifyState(state); // Save this
|
|
10
|
-
const restored = parseState(json); // Load this`),typeof u.steps=="object"&&u.steps!==null&&(u.steps=new Map(Object.entries(u.steps))));for(let[y,w]of u.steps){let{result:Y,meta:k}=w;if(Y.ok)l.set(y,Y);else{let A=k??{origin:"result",resultCause:Y.cause};l.set(y,Ce(Y.error,A,Y.cause))}}}let M=I?.snapshot??E?.snapshot,B=E?.serialization;if(M&&!ue){l||(l=new Map);let u=M,y=B?.decode;for(let[w,Y]of Object.entries(u.steps))if(Object.prototype.hasOwnProperty.call(u.steps,w))try{if(Y.ok){let k=y?y(Y.value):Y.value;l.set(w,ne(k))}else{let k=y?y(Y.error):Y.error,A=Ze(Y.cause),b=Y.meta?.origin==="throw"?{origin:"throw",thrown:A}:{origin:"result",resultCause:A};l.set(w,Ce(k,b,A))}}catch(k){throw new Pe(`Failed to decode step "${w}": ${k instanceof Error?k.message:String(k)}`,w,k instanceof Error?k:void 0)}}let J=!1,U,X,j=()=>{J=!0,U=typeof h?.reason=="string"?h.reason:h?.reason instanceof Error?h.reason.message:void 0};h&&!h.aborted&&h.addEventListener("abort",j,{once:!0});let z=()=>{if(J||h?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:U??(typeof h?.reason=="string"?h.reason:h?.reason instanceof Error?h.reason.message:void 0),lastStepKey:X}},W=async(u,y,w)=>{if(!m)return;let Y=performance.now();try{await m(u,y,S,G);let k=performance.now()-Y;o({type:"hook_after_step",workflowId:S,stepKey:u,ts:Date.now(),durationMs:k})}catch(k){let A=performance.now()-Y;throw o({type:"hook_after_step_error",workflowId:S,stepKey:u,ts:Date.now(),durationMs:A,error:k}),k}},Te=u=>{let y=async(k,A,b)=>{if(typeof k!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let P=k,O=b??{},K=P,T=Object.prototype.hasOwnProperty.call(O,"key")?O.key:P,{ttl:V,out:se}=O;z();let te=ze(O);if(T&&l&&l.has(T)){o({type:"step_cache_hit",workflowId:S,stepKey:T,name:K,ts:Date.now(),...te&&{metadata:te}});let N=l.get(T);if(N.ok)return X=T,se&&(q[se]=N.value),N.value;let H=Ke(N.cause);throw Oe(N.error,H)}T&&l&&o({type:"step_cache_miss",workflowId:S,stepKey:T,name:K,ts:Date.now(),...te&&{metadata:te}});try{let N=await u(P,A,O);return se&&(q[se]=N),O.compensate&&d.push({stepName:K,value:N,compensate:O.compensate}),T&&(X=T,l&&l.set(T,ne(N),V?{ttl:V}:void 0),await W(T,ne(N))),N}catch(N){if(T&&be(N)){let H=N,me=H.meta.origin==="result"?H.meta.resultCause:H.meta.origin==="throw"?H.meta.thrown:void 0,Q=Ce(H.error,H.meta,me);l&&l.set(T,Q,V?{ttl:V}:void 0),await W(T,Q,H.meta)}throw N}};y.try=async(k,A,b)=>{let{ttl:P}=b,O=b.key??k,K=k;if(l&&l.has(O)){o({type:"step_cache_hit",workflowId:S,stepKey:O,name:K,ts:Date.now()});let T=l.get(O);if(T.ok)return T.value;let V=Ke(T.cause);throw Oe(T.error,V)}l&&o({type:"step_cache_miss",workflowId:S,stepKey:O,name:K,ts:Date.now()});try{let T=await u.try(k,A,{...b,key:O});return b.compensate&&d.push({stepName:K,value:T,compensate:b.compensate}),l&&l.set(O,ne(T),P?{ttl:P}:void 0),await W(O,ne(T)),T}catch(T){if(be(T)){let V=T,se=V.meta.origin==="result"?V.meta.resultCause:V.meta.origin==="throw"?V.meta.thrown:void 0,te=Ce(V.error,V.meta,se);l&&l.set(O,te,P?{ttl:P}:void 0),await W(O,te,V.meta)}throw T}},y.fromResult=async(k,A,b)=>{let{ttl:P}=b,O=b.key??k,K=k;if(l&&l.has(O)){o({type:"step_cache_hit",workflowId:S,stepKey:O,name:K,ts:Date.now()});let T=l.get(O);if(T.ok)return T.value;let V=Ke(T.cause);throw Oe(T.error,V)}l&&o({type:"step_cache_miss",workflowId:S,stepKey:O,name:K,ts:Date.now()});try{let T=await u.fromResult(k,A,{...b,key:O});return l&&l.set(O,ne(T),P?{ttl:P}:void 0),await W(O,ne(T)),T}catch(T){if(be(T)){let V=T,se=V.meta.origin==="result"?V.meta.resultCause:V.meta.origin==="throw"?V.meta.thrown:void 0,te=Ce(V.error,V.meta,se);l&&l.set(O,te,P?{ttl:P}:void 0),await W(O,te,V.meta)}throw T}},y.race=u.race,y.withFallback=async(k,A,b)=>{let P=b.key??k,O=k;if(l&&l.has(P)){o({type:"step_cache_hit",workflowId:S,stepKey:P,name:O,ts:Date.now()});let K=l.get(P);if(K.ok)return K.value;let T=Ke(K.cause);throw Oe(K.error,T)}l&&o({type:"step_cache_miss",workflowId:S,stepKey:P,name:O,ts:Date.now()});try{let K=await u.withFallback(k,A,b);return l&&l.set(P,ne(K)),await W(P,ne(K)),K}catch(K){if(be(K)){let T=K,V=T.meta.origin==="result"?T.meta.resultCause:T.meta.origin==="throw"?T.meta.thrown:void 0,se=Ce(T.error,T.meta,V);l&&l.set(P,se),await W(P,se,T.meta)}throw K}},y.withResource=async(k,A)=>{let b=k;try{let P=await u.withResource(k,A);return await W(b,ne(P)),P}catch(P){if(be(P)){let O=P,K=O.meta.origin==="result"?O.meta.resultCause:O.meta.origin==="throw"?O.meta.thrown:void 0,T=Ce(O.error,O.meta,K);await W(b,T,O.meta)}throw P}},y.retry=(k,A,b)=>{let P={key:b.key,retry:{attempts:b.attempts,backoff:b.backoff,initialDelay:b.initialDelay,maxDelay:b.maxDelay,jitter:b.jitter,shouldRetry:b.shouldRetry,onRetry:b.onRetry},timeout:b.timeout,ttl:b.ttl};return y(k,A,P)},y.withTimeout=(k,A,b)=>{let P={key:b.key,timeout:b,ttl:b.ttl};return y(k,A,P)},y.sleep=(k,A,b)=>{if(typeof k!="string"||k.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let P=typeof A=="string"?At(A):A;if(!P)throw new Error(`step.sleep: invalid duration '${A}'`);let O=vt(P),K=b?.signal;return y(k,async()=>{if(h?.aborted||K?.aborted){let V=new Error("Sleep aborted");throw V.name="AbortError",V}return new Promise((V,se)=>{let te={timeoutId:void 0},N=()=>{te.timeoutId&&clearTimeout(te.timeoutId);let H=new Error("Sleep aborted");H.name="AbortError",se(H)};h?.addEventListener("abort",N,{once:!0}),K?.addEventListener("abort",N,{once:!0}),te.timeoutId=setTimeout(()=>{h?.removeEventListener("abort",N),K?.removeEventListener("abort",N),V(ne(void 0))},O)})},{key:b?.key,ttl:b?.ttl,description:b?.description})};let w=new Map,Y=new Map;return y.getWritable=k=>{let A=k?.namespace??"default",b=k?.highWaterMark??16;if(!D)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let P=`${S}:${A}`,O=w.get(P);if(O&&!O.closed&&!O.aborted)return O.writer;let K=bt({highWaterMark:b,onStateChange:H=>{o({type:"stream_backpressure",workflowId:S,namespace:A,bufferedCount:K.bufferedCount,state:H,ts:Date.now()})}}),T=0,V=!0,se=!1,te=!1;o({type:"stream_created",workflowId:S,namespace:A,ts:Date.now()});let N={async write(H){if(te)return _(Be("closed","Stream is closed"));if(se)return _(Be("aborted","Stream was aborted"));K.state==="paused"&&await K.waitForDrain();let me={value:H,position:T,ts:Date.now()},Q=await D.append(S,A,me);return Q.ok?(o({type:"stream_write",workflowId:S,namespace:A,position:T,ts:Date.now()}),T++,K.increment(),ne(void 0)):(o({type:"stream_error",workflowId:S,namespace:A,error:Q.error,position:T,ts:Date.now()}),_(Be("store_error",Q.error.message,Q.error)))},async close(){if(te)return _(et("already_closed","Stream is already closed"));let H=await D.closeStream(S,A);return H.ok?(te=!0,V=!1,o({type:"stream_close",workflowId:S,namespace:A,finalPosition:T,ts:Date.now()}),w.delete(P),ne(void 0)):_(et("store_error",H.error.message,H.error))},abort(H){se=!0,V=!1,te=!0,o({type:"stream_error",workflowId:S,namespace:A,error:H,position:T,ts:Date.now()}),w.delete(P)},get writable(){return V},get position(){return T},get namespace(){return A}};return w.set(P,{writer:N,backpressure:K,aborted:se,closed:te}),N},y.getReadable=k=>{let A=k?.namespace??"default",b=k?.startIndex??0,P=k?.pollInterval??10,O=k?.pollTimeout??3e4;if(!D)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let K=`${S}:${A}:${b}`,T=Y.get(K);if(T&&!T.closed)return T.reader;let V=()=>{let he=`${S}:${A}`,ce=w.get(he);ce&&ce.backpressure.decrement()},se=b,te=!0,N=!1,H=[],me=0,Q={async read(){if(N)return _(Qe("closed","Reader is closed"));if(me<H.length){let ye=H[me++];return se=ye.position+1,V(),o({type:"stream_read",workflowId:S,namespace:A,position:ye.position,ts:Date.now()}),ne(ye.value)}let he=`${S}:${A}`,ce=Date.now(),we=w.has(he),ae=await D.getMetadata(S,A),Ee=ae.ok&&ae.value!==void 0;for(;Date.now()-ce<O;){let ye=await D.read(S,A,se,100);if(!ye.ok)return _(Qe("store_error",ye.error.message,ye.error));let Me=ye.value;if(Me.length>0){H=Me,me=1;let We=Me[0];return se=We.position+1,V(),o({type:"stream_read",workflowId:S,namespace:A,position:We.position,ts:Date.now()}),ne(We.value)}let Ue=w.has(he),Se=await D.getMetadata(S,A),st=Se.ok&&Se.value!==void 0;if(Ue&&(we=!0),st&&(Ee=!0),Se.ok&&Se.value?.closed)return te=!1,_(He(se));if(we&&!Ue&&!st)return te=!1,_(He(se));Ee&&!Ue&&Se.ok&&Se.value?.closed,await new Promise(We=>setTimeout(We,P))}return te=!1,_(He(se))},close(){N=!0,te=!1,H=[],Y.delete(K)},get readable(){return te},get position(){return se},get namespace(){return A}};return Y.set(K,{reader:Q,position:se,closed:N}),Q},y.streamForEach=async(k,A,b)=>{let P=b?.checkpointInterval??1,O=b?.concurrency??1,K=[],T=0,V=-1,se=N=>typeof N=="object"&&N!==null&&"read"in N&&typeof N.read=="function",te=async(N,H,me,Q)=>{let ce=P>0&&H%P===0?`stream-foreach:${Q}:pos-${me}`:void 0,we=ce??`stream-item-${me}`,ae=await y(we,()=>A(N,H),{key:ce});return{index:H,position:me,result:ae}};if(se(k))if(O<=1){let N=k.position,H=await k.read();for(;H.ok;){let me=H.value,{result:Q}=await te(me,T,N,k.namespace);K.push(Q),V=N,T++,N=k.position,H=await k.read()}}else{let N=new Map,H=0,me=0,Q=new Array(O).fill(null),he=async()=>{for(let ye=0;ye<Q.length;ye++)if(Q[ye]===null)return ye;let ae=Q.filter(ye=>ye!==null),Ee=await Promise.race(ae);return N.set(Ee.index,{position:Ee.position,result:Ee.result}),Q[Ee.slotIndex]=null,Ee.slotIndex},ce=k.position,we=await k.read();for(;we.ok;){let ae=await he(),Ee=H,ye=ce,Me=we.value,Ue=ae;Q[ae]=te(Me,Ee,ye,k.namespace).then(Se=>({slotIndex:Ue,...Se})),me++,H++,ce=k.position,we=await k.read()}for(let ae=0;ae<Q.length;ae++)if(Q[ae]!==null){let Ee=await Q[ae];N.set(Ee.index,{position:Ee.position,result:Ee.result})}for(let ae=0;ae<me;ae++){let Ee=N.get(ae);Ee&&(K.push(Ee.result),V=Ee.position,T++)}}else if(O<=1){let N=0;for await(let H of k){let{result:me}=await te(H,N,N,"async-iterable");K.push(me),V=N,T++,N++}}else{let N=new Map,H=0,me=0,Q=new Array(O).fill(null),he=async()=>{for(let ae=0;ae<Q.length;ae++)if(Q[ae]===null)return ae;let ce=Q.filter(ae=>ae!==null),we=await Promise.race(ce);return N.set(we.index,we.result),Q[we.slotIndex]=null,we.slotIndex};for await(let ce of k){let we=await he(),ae=H,Ee=we;Q[we]=te(ce,ae,ae,"async-iterable").then(ye=>({slotIndex:Ee,...ye})),me++,H++}for(let ce=0;ce<Q.length;ce++)if(Q[ce]!==null){let we=await Q[ce];N.set(we.index,we.result)}for(let ce=0;ce<me;ce++)N.has(ce)&&(K.push(N.get(ce)),V=ce,T++)}return{results:K,processedCount:T,lastPosition:V}},y.if=u.if,y.label=u.label,y.branch=u.branch,y.arm=u.arm,y.forEach=u.forEach,y.item=u.item,y.dep=u.dep,y.workflow=(k,A,b)=>y(k,A,b),y.all=(k,A,b)=>{let P=b!==void 0&&Object.prototype.hasOwnProperty.call(b,"key")?b:{...b,key:void 0};return y(k,async()=>ne(await u.all(k,A)),P)},y.map=(k,A,b,P)=>{let O=P!==void 0&&Object.prototype.hasOwnProperty.call(P,"key")?P:{...P,key:void 0};return y(k,async()=>ne(await u.map(k,A,b,P)),O)},y},Re=({step:u})=>$({step:Te(u),deps:pe,ctx:C}),de;try{de=await Ve(Re,{onError:ie,onEvent:F,catchUnexpected:Z,workflowId:S,workflowName:t,context:G,_workflowSignal:h})}finally{h&&h.removeEventListener("abort",j)}if(!de.ok&&d.length>0){let u=[];for(let y=d.length-1;y>=0;y--){let w=d[y];try{await w.compensate(w.value)}catch(Y){u.push({stepName:w.stepName,error:Y})}}if(u.length>0){let y={type:"SAGA_COMPENSATION_ERROR",originalError:de.error,compensationErrors:u};de=_(y,{cause:de.cause})}}let xe=performance.now()-v;if(!de.ok){let u;if(Ye(de.cause)&&(u=de.cause),!u&&J&&kt(de.error)){let y=de.cause;y!=null&&typeof y=="object"&&"name"in y&&y.name==="AbortError"&&(u={type:"WORKFLOW_CANCELLED",reason:U??(typeof h?.reason=="string"?h.reason:h?.reason instanceof Error?h.reason.message:void 0),lastStepKey:X})}if(u)return o({type:"workflow_cancelled",workflowId:S,ts:Date.now(),durationMs:xe,reason:u.reason,lastStepKey:u.lastStepKey}),u&&!Ye(de.cause)?_(de.error,{cause:u}):de}if(de.ok&&J){let u=U??(typeof h?.reason=="string"?h.reason:h?.reason instanceof Error?h.reason.message:void 0);o({type:"workflow_cancelled",workflowId:S,ts:Date.now(),durationMs:xe,reason:u,lastStepKey:X});let y={type:"WORKFLOW_CANCELLED",reason:u,lastStepKey:X};return _(Z(y),{cause:y})}return de.ok?o({type:"workflow_success",workflowId:S,ts:Date.now(),durationMs:xe}):o({type:"workflow_error",workflowId:S,ts:Date.now(),durationMs:xe,error:de.error}),de}function g(i,$,I){let S,pe,d;return typeof i=="string"?(S=i,pe=$,d=I):(pe=i,d=$),c(S,pe,d)}async function R(i,$,I){let S,pe,d;typeof i=="string"?(S=i,pe=$,d=I):(pe=i,d=$);let re=Fe(),G=d?.onEvent,F={...d,onEvent:(ee,m)=>{re.handleEvent(ee);try{G?.(ee,m)}catch{}}},ie,fe;try{ie=await c(S,pe,F)}catch(ee){let m=E?.catchUnexpected??$e;ie=_(m(ee),{cause:ee})}finally{fe=re.getResumeState()}return{result:ie,resumeState:fe}}let L={withDeps:i=>tt(L,i),run:g,runWithState:R};return L}var nt;function Zt(){let t=new Map;return{async save(e,s){t.set(e,{snapshot:s,updatedAt:new Date})},async load(e){return t.get(e)?.snapshot??null},async delete(e){t.delete(e)},async list(e){let s=e?.prefix??"",a=e?.limit??100,E=[];for(let[c,g]of t.entries())if(!(s&&!c.startsWith(s))&&(E.push({id:c,updatedAt:g.updatedAt.toISOString()}),E.length>=a))break;return E.sort((c,g)=>g.updatedAt.localeCompare(c.updatedAt)),E},async close(){}}}function Qt(){return nt===void 0&&(nt=Zt()),nt}function Dt(t){return typeof t.tryAcquire=="function"&&typeof t.release=="function"}var ot=new Set,Ie=new Map,Ot={async run(t,e,s){let{id:a,store:E,version:c=1,allowConcurrent:g=!1,lockTtlMs:R=6e4,heartbeatIntervalMs:L,abortOnLeaseLoss:i,metadata:$,signal:I,createContext:S,onEvent:pe,onError:d,onVersionMismatch:re,idempotencyKey:G,input:h}=s,F=E??Qt(),ie;if(G){let q=`idem:${G}`,le=Ie.get(q);if(le)return await le;Ie.set(q,new Promise(oe=>{ie=oe}));try{let oe=await F.load(q);if(oe){if(h!==void 0&&oe.metadata?.input!==void 0){let p=JSON.stringify(oe.metadata.input),C=JSON.stringify(h);if(p!==C){let o=_({type:"IDEMPOTENCY_CONFLICT",idempotencyKey:G,workflowId:a,message:`Idempotency key '${G}' already used with different input for workflow '${a}'.`});return ie(o),Ie.delete(q),ie=void 0,o}}if(oe.execution.status==="completed"&&oe.metadata?.finalResult!==void 0){let p=oe.metadata.finalResult;return ie(p),Ie.delete(q),ie=void 0,p}if(oe.execution.status==="running"){let p=_({type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' with idempotency key '${G}' is already running.`,reason:"cross-process"});return ie(p),Ie.delete(q),ie=void 0,p}}}catch{}try{await F.save(q,{formatVersion:1,steps:{},execution:{status:"running",lastUpdated:new Date().toISOString()},metadata:{workflowId:a,idempotencyKey:G,input:h}})}catch{}}if(!g&&ot.has(a)){let q={type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' is already running. Set allowConcurrent: true to allow parallel executions.`,reason:"in-process"};return _(q)}let fe=null;if(!g&&Dt(F)){let q;try{q=await F.tryAcquire(a,{ttlMs:R})}catch(le){let oe={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:le,message:`Failed to acquire lock for workflow '${a}': ${le instanceof Error?le.message:String(le)}`};return _(oe)}if(q===null){let le={type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' is already running (lease held by another process). Set allowConcurrent: true to allow parallel executions.`,reason:"cross-process"};return _(le)}fe=q.ownerToken}let ee,m,ue=F;if(fe&&typeof ue.renew=="function"){let q=L??Math.floor(R/3);m=new AbortController,ee=setInterval(async()=>{try{await ue.renew(a,fe,{ttlMs:R})||m.abort(new Error("Lease expired"))}catch{m.abort(new Error("Lease renewal failed"))}},q)}ot.add(a);let Z;try{let q=null;try{q=await F.load(a)}catch(r){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Failed to load state for workflow '${a}': ${r instanceof Error?r.message:String(r)}`};return Z=_(n),_(n)}if(q)try{St(q)}catch(r){if(r instanceof ve){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return Z=_(n),_(n)}throw r}if(q){let r=typeof q.metadata?.version=="number"?q.metadata.version:1;if(r!==c){let n={type:"VERSION_MISMATCH",workflowId:a,storedVersion:r,requestedVersion:c,currentVersion:c,message:`Workflow '${a}' has stored state at version ${r} but this run requested version ${c}. Migrate the stored state to the new version, or clear state for this id (e.g. durable.deleteState(store, '${a}')) and re-run.`};if(!re)return Z=_(n),_(n);let f=await Promise.resolve(re({id:a,storedVersion:r,requestedVersion:c}));if(f==="throw")return Z=_(n),_(n);if(f==="clear"){try{await F.delete(a)}catch{}q=null}else q=f.migratedSnapshot}}let le=(r,n)=>{pe&&pe(r,n)},oe=Fe(),p={snapshot:q,onAfterStep:async(r,n,f,x)=>{try{let v=oe.getResumeState(),l={};for(let[B,J]of v.steps)if(J.result.ok)l[B]={ok:!0,value:J.result.value};else{let U=J.result.cause,X=U instanceof Error?Xe(U):Ge(U),j=J.meta?.origin==="throw"?"throw":"result";l[B]={ok:!1,error:J.result.error,cause:X,meta:{origin:j}}}let D={formatVersion:1,workflowName:a,steps:l,execution:{status:"running",lastUpdated:new Date().toISOString(),currentStepId:r},metadata:{...q?.metadata??{},...$,version:c,lastStepKey:r}},M=q?Ct(q,D):D;if(M.warnings&&M.warnings.length>0){let B=new Set(Object.keys(D.steps)),J=M.warnings.filter(U=>!B.has(U.stepId));M={...M,warnings:J.length>0?J:void 0}}await F.save(a,M),le({type:"persist_success",workflowId:f,stepKey:r,ts:Date.now(),context:x},x)}catch(v){le({type:"persist_error",workflowId:f,stepKey:r,error:v,ts:Date.now(),context:x},x)}},onEvent:(r,n)=>{oe.handleEvent(r),le(r,n)},onError:d,signal:m&&I?AbortSignal.any([I,m.signal]):m?.signal??I,createContext:S},C;try{C=rt(a,t,p)}catch(r){if(r instanceof ve){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return Z=_(n),_(n)}throw r}let o;try{o=await C.run(e)}catch(r){if(r instanceof ve||r instanceof Pe){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return Z=_(n),_(n)}throw r}if(i!==!1&&m?.signal.aborted){let r=_({type:"LEASE_EXPIRED",workflowId:a,message:`Lease expired for workflow '${a}' during execution. The workflow may have been reclaimed by another process.`});return Z=r,r}if(o.ok){try{await F.delete(a)}catch(r){let n={type:"PERSISTENCE_ERROR",operation:"delete",workflowId:a,cause:r,message:`Failed to delete state for workflow '${a}': ${r instanceof Error?r.message:String(r)}`};return Z=_(n),_(n)}if(G){let r=`idem:${G}`;try{await F.save(r,{formatVersion:1,steps:{},execution:{status:"completed",lastUpdated:new Date().toISOString(),completedAt:new Date().toISOString()},metadata:{workflowId:a,idempotencyKey:G,input:h,finalResult:o}})}catch{}}}return Z=o,o}finally{if(ot.delete(a),ie&&(ie(Z),Ie.delete(`idem:${G}`)),ee&&clearInterval(ee),fe!==null&&Dt(F))try{await F.release(a,fe)}catch{}}},async clearState(t){let e=t;if(typeof e.clear=="function"){await e.clear();return}let s=100;for(;;){let a=await t.list({limit:s});if(a.length===0)break;let E=a.map(c=>c.id);if(await this.deleteStates(t,E,{continueOnError:!0}),a.length<s)break}},async hasState(t,e){try{return await t.load(e)!==null}catch{return!1}},async deleteState(t,e){try{return await t.delete(e),!0}catch{return!1}},async deleteStates(t,e,s={}){let{concurrency:a=10,continueOnError:E=!0}=s;if(e.length===0)return{deleted:0};let c=[],g=0,R=async i=>{try{await t.delete(i),g++}catch($){if(E)c.push({id:i,error:$});else throw $}},L=Math.max(1,a);for(let i=0;i<e.length;i+=L){let $=e.slice(i,i+L);await Promise.all($.map(I=>R(I)))}return c.length>0?{deleted:g,errors:c}:{deleted:g}},async listPending(t,e){try{return await t.list(e)}catch{return[]}}};function er(t){let{store:e,workflows:s,concurrency:a=5,onEvent:E,onError:c}=t,g=new Map,R,L=!1,i=!1;function $(h){try{E?.(h)}catch{}}async function I(h,F){if(!s[h])throw new Error(`Unknown workflow: '${h}'. Registered: ${Object.keys(s).join(", ")}`);let fe=F?.id??`${h}:${Pt()}`,ee={formatVersion:1,workflowName:h,steps:{},execution:{status:"running",lastUpdated:new Date().toISOString()},metadata:{engineState:"queued",workflowName:h,input:F?.input??null,idempotencyKey:F?.idempotencyKey,enqueuedAt:new Date().toISOString(),...F?.metadata}};return await e.save(fe,ee),$({type:"workflow_enqueued",workflowName:h,id:fe,ts:Date.now()}),fe}async function S(){if(i)return 0;i=!0;try{let h=await e.list({limit:a*2}),F=0,ie=[];for(let ee of h){if(ie.length>=a)break;let m=await e.load(ee.id);m&&m.metadata?.engineState==="queued"&&typeof m.metadata?.workflowName=="string"&&ie.push({id:ee.id,workflowName:m.metadata.workflowName,snapshot:m})}let fe=await Promise.allSettled(ie.map(async({id:ee,workflowName:m,snapshot:ue})=>{let Z=s[m];if(!Z)return;let q={...ue,metadata:{...ue.metadata,engineState:"processing"}};await e.save(ee,q),$({type:"workflow_started",workflowName:m,id:ee,ts:Date.now()});let le=await Ot.run(Z.deps,Z.fn,{id:ee,store:e,idempotencyKey:ue.metadata?.idempotencyKey,input:ue.metadata?.input,...Z.durableDefaults});le.ok?$({type:"workflow_completed",workflowName:m,id:ee,ts:Date.now()}):$({type:"workflow_failed",workflowName:m,id:ee,error:le.error,ts:Date.now()}),F++}));for(let ee of fe)if(ee.status==="rejected")try{c?.(ee.reason)}catch{}return $({type:"engine_tick",ts:Date.now(),processed:F}),F}finally{i=!1}}function pe(h,F){let ie=F?.id?`schedule:${F.id}`:`schedule:${Pt()}`;F.immediate&&I(h,F).catch(ee=>{try{c?.(ee)}catch{}});let fe=setInterval(()=>{I(h,F).catch(ee=>{try{c?.(ee)}catch{}})},F.intervalMs);return g.set(ie,fe),$({type:"schedule_created",workflowName:h,scheduleId:ie,intervalMs:F.intervalMs,ts:Date.now()}),ie}function d(h){let F=g.get(h);return F?(clearInterval(F),g.delete(h),$({type:"schedule_removed",scheduleId:h,ts:Date.now()}),!0):!1}function re(h=1e3){L||(L=!0,$({type:"engine_start",ts:Date.now()}),S().catch(F=>{try{c?.(F)}catch{}}),R=setInterval(()=>{S().catch(F=>{try{c?.(F)}catch{}})},h))}async function G(){if(L){L=!1,R&&(clearInterval(R),R=void 0);for(let[h,F]of g)clearInterval(F),g.delete(h);for(;i;)await new Promise(h=>setTimeout(h,50));$({type:"engine_stop",ts:Date.now()})}}return{enqueue:I,schedule:pe,unschedule:d,start:re,stop:G,tick:S,status:()=>({running:L,pendingSchedules:g.size})}}export{er as createEngine};
|
|
11
|
-
//# sourceMappingURL=engine.js.map
|