awaitly 1.31.1 → 1.32.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.
Files changed (169) hide show
  1. package/dist/adapters.cjs +2 -2
  2. package/dist/adapters.cjs.map +1 -1
  3. package/dist/adapters.d.cts +3 -1
  4. package/dist/adapters.d.ts +3 -1
  5. package/dist/adapters.js +2 -2
  6. package/dist/adapters.js.map +1 -1
  7. package/dist/batch.cjs +2 -2
  8. package/dist/batch.cjs.map +1 -1
  9. package/dist/batch.d.cts +3 -1
  10. package/dist/batch.d.ts +3 -1
  11. package/dist/batch.js +2 -2
  12. package/dist/batch.js.map +1 -1
  13. package/dist/circuit-breaker.cjs +2 -2
  14. package/dist/circuit-breaker.cjs.map +1 -1
  15. package/dist/circuit-breaker.d.cts +3 -1
  16. package/dist/circuit-breaker.d.ts +3 -1
  17. package/dist/circuit-breaker.js +2 -2
  18. package/dist/circuit-breaker.js.map +1 -1
  19. package/dist/conditional.d.cts +3 -1
  20. package/dist/conditional.d.ts +3 -1
  21. package/dist/core.cjs +2 -2
  22. package/dist/core.cjs.map +1 -1
  23. package/dist/core.d.cts +2 -1
  24. package/dist/core.d.ts +2 -1
  25. package/dist/core.js +2 -2
  26. package/dist/core.js.map +1 -1
  27. package/dist/diagnostics.cjs +3 -3
  28. package/dist/diagnostics.cjs.map +1 -1
  29. package/dist/diagnostics.d.cts +3 -1
  30. package/dist/diagnostics.d.ts +3 -1
  31. package/dist/diagnostics.js +3 -3
  32. package/dist/diagnostics.js.map +1 -1
  33. package/dist/durable.cjs +3 -3
  34. package/dist/durable.cjs.map +1 -1
  35. package/dist/durable.d.cts +8 -361
  36. package/dist/durable.d.ts +8 -361
  37. package/dist/durable.js +3 -3
  38. package/dist/durable.js.map +1 -1
  39. package/dist/engine.cjs +11 -0
  40. package/dist/engine.cjs.map +1 -0
  41. package/dist/engine.d.cts +114 -0
  42. package/dist/engine.d.ts +114 -0
  43. package/dist/engine.js +11 -0
  44. package/dist/engine.js.map +1 -0
  45. package/dist/errors-entry-CMH73Eym.d.cts +339 -0
  46. package/dist/errors-entry-DOt5UUl4.d.ts +339 -0
  47. package/dist/errors.cjs +1 -1
  48. package/dist/errors.cjs.map +1 -1
  49. package/dist/errors.d.cts +2 -318
  50. package/dist/errors.d.ts +2 -318
  51. package/dist/errors.js +1 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/fetch.cjs +2 -2
  54. package/dist/fetch.cjs.map +1 -1
  55. package/dist/fetch.d.cts +3 -1
  56. package/dist/fetch.d.ts +3 -1
  57. package/dist/fetch.js +2 -2
  58. package/dist/fetch.js.map +1 -1
  59. package/dist/functional.cjs +1 -1
  60. package/dist/functional.cjs.map +1 -1
  61. package/dist/functional.d.cts +2 -0
  62. package/dist/functional.d.ts +2 -0
  63. package/dist/functional.js +1 -1
  64. package/dist/functional.js.map +1 -1
  65. package/dist/{guards-PU64_GKv.d.cts → guards-B79mP5Q8.d.cts} +3 -3
  66. package/dist/{guards-B5lgMJq0.d.ts → guards-BUq6NJCM.d.ts} +3 -3
  67. package/dist/{hitl-Dyiy0R1v.d.cts → hitl-BCqkMAHw.d.cts} +2 -2
  68. package/dist/{hitl-BjeSm1sJ.d.ts → hitl-BZtPx0aU.d.ts} +2 -2
  69. package/dist/hitl.cjs +2 -2
  70. package/dist/hitl.cjs.map +1 -1
  71. package/dist/hitl.d.cts +9 -6
  72. package/dist/hitl.d.ts +9 -6
  73. package/dist/hitl.js +2 -2
  74. package/dist/hitl.js.map +1 -1
  75. package/dist/index-BVUAOWGG.d.ts +417 -0
  76. package/dist/index-CQnpmUcC.d.cts +417 -0
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.cjs.map +1 -1
  79. package/dist/index.d.cts +4 -3
  80. package/dist/index.d.ts +4 -3
  81. package/dist/index.js +1 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/otel.d.cts +3 -1
  84. package/dist/otel.d.ts +3 -1
  85. package/dist/{persistence-entry-B3ukwbb5.d.ts → persistence-entry-ClFhxd2Q.d.ts} +11 -5
  86. package/dist/{persistence-entry-CgVzswbg.d.cts → persistence-entry-jflY61az.d.cts} +11 -5
  87. package/dist/persistence.d.cts +6 -3
  88. package/dist/persistence.d.ts +6 -3
  89. package/dist/policies.d.cts +3 -1
  90. package/dist/policies.d.ts +3 -1
  91. package/dist/ratelimit.cjs +2 -2
  92. package/dist/ratelimit.cjs.map +1 -1
  93. package/dist/ratelimit.d.cts +3 -1
  94. package/dist/ratelimit.d.ts +3 -1
  95. package/dist/ratelimit.js +2 -2
  96. package/dist/ratelimit.js.map +1 -1
  97. package/dist/reliability.cjs +2 -2
  98. package/dist/reliability.cjs.map +1 -1
  99. package/dist/reliability.d.cts +3 -1
  100. package/dist/reliability.d.ts +3 -1
  101. package/dist/reliability.js +2 -2
  102. package/dist/reliability.js.map +1 -1
  103. package/dist/resolver.cjs +2 -2
  104. package/dist/resolver.cjs.map +1 -1
  105. package/dist/resolver.d.cts +5 -3
  106. package/dist/resolver.d.ts +5 -3
  107. package/dist/resolver.js +2 -2
  108. package/dist/resolver.js.map +1 -1
  109. package/dist/resource.cjs +2 -2
  110. package/dist/resource.cjs.map +1 -1
  111. package/dist/resource.d.cts +3 -1
  112. package/dist/resource.d.ts +3 -1
  113. package/dist/resource.js +2 -2
  114. package/dist/resource.js.map +1 -1
  115. package/dist/result/retry.cjs +1 -1
  116. package/dist/result/retry.cjs.map +1 -1
  117. package/dist/result/retry.d.cts +2 -0
  118. package/dist/result/retry.d.ts +2 -0
  119. package/dist/result/retry.js +1 -1
  120. package/dist/result/retry.js.map +1 -1
  121. package/dist/result.cjs +1 -1
  122. package/dist/result.cjs.map +1 -1
  123. package/dist/result.d.cts +8 -23
  124. package/dist/result.d.ts +8 -23
  125. package/dist/result.js +1 -1
  126. package/dist/result.js.map +1 -1
  127. package/dist/{run-entry-C1uFytM6.d.cts → run-entry-rw7zll_G.d.ts} +16 -45
  128. package/dist/{run-entry-C1uFytM6.d.ts → run-entry-yQu63Yj9.d.cts} +16 -45
  129. package/dist/run.cjs +2 -2
  130. package/dist/run.cjs.map +1 -1
  131. package/dist/run.d.cts +3 -1
  132. package/dist/run.d.ts +3 -1
  133. package/dist/run.js +2 -2
  134. package/dist/run.js.map +1 -1
  135. package/dist/saga.cjs +2 -2
  136. package/dist/saga.cjs.map +1 -1
  137. package/dist/saga.d.cts +3 -1
  138. package/dist/saga.d.ts +3 -1
  139. package/dist/saga.js +2 -2
  140. package/dist/saga.js.map +1 -1
  141. package/dist/singleflight.d.cts +3 -1
  142. package/dist/singleflight.d.ts +3 -1
  143. package/dist/streaming.cjs +4 -4
  144. package/dist/streaming.cjs.map +1 -1
  145. package/dist/streaming.d.cts +5 -3
  146. package/dist/streaming.d.ts +5 -3
  147. package/dist/streaming.js +4 -4
  148. package/dist/streaming.js.map +1 -1
  149. package/dist/testing.cjs +8 -4
  150. package/dist/testing.cjs.map +1 -1
  151. package/dist/testing.d.cts +87 -4
  152. package/dist/testing.d.ts +87 -4
  153. package/dist/testing.js +8 -4
  154. package/dist/testing.js.map +1 -1
  155. package/dist/{types-wa_wTOn3.d.ts → types-CuWK5AlK.d.ts} +1 -1
  156. package/dist/{types-DUWrNIJu.d.cts → types-uR3JpwvF.d.cts} +1 -1
  157. package/dist/webhook.cjs +2 -2
  158. package/dist/webhook.cjs.map +1 -1
  159. package/dist/webhook.d.cts +7 -4
  160. package/dist/webhook.d.ts +7 -4
  161. package/dist/webhook.js +2 -2
  162. package/dist/webhook.js.map +1 -1
  163. package/dist/workflow.cjs +3 -3
  164. package/dist/workflow.cjs.map +1 -1
  165. package/dist/workflow.d.cts +47 -11
  166. package/dist/workflow.d.ts +47 -11
  167. package/dist/workflow.js +3 -3
  168. package/dist/workflow.js.map +1 -1
  169. package/package.json +15 -1
@@ -0,0 +1,114 @@
1
+ import { S as SnapshotStore, e as AnyResultFn, f as WorkflowContext } from './persistence-entry-jflY61az.cjs';
2
+ import { ae as RunStep } from './run-entry-yQu63Yj9.cjs';
3
+ import { b as DurableOptions } from './index-CQnpmUcC.cjs';
4
+ import './types-uR3JpwvF.cjs';
5
+ import '@standard-schema/spec';
6
+ import './errors-entry-CMH73Eym.cjs';
7
+ import './tagged-error.cjs';
8
+
9
+ /** A registered workflow definition */
10
+ interface WorkflowRegistration<Deps extends Readonly<Record<string, AnyResultFn>> = Readonly<Record<string, AnyResultFn>>> {
11
+ /** Workflow dependencies (Result-returning functions) */
12
+ deps: Deps;
13
+ /** Workflow function */
14
+ fn: (context: {
15
+ step: RunStep<any>;
16
+ deps: Deps;
17
+ ctx: WorkflowContext;
18
+ }) => any;
19
+ /** Default durable options (version, lockTtlMs, etc.) */
20
+ durableDefaults?: Partial<Pick<DurableOptions, 'version' | 'lockTtlMs' | 'heartbeatIntervalMs'>>;
21
+ }
22
+ interface EnqueueOptions {
23
+ /** Custom workflow execution ID (default: auto-generated UUID) */
24
+ id?: string;
25
+ /** Idempotency key for deduplication */
26
+ idempotencyKey?: string;
27
+ /** Workflow input for idempotency conflict detection */
28
+ input?: unknown;
29
+ /** Custom metadata */
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ interface ScheduleOptions {
33
+ /** Repeat interval in milliseconds */
34
+ intervalMs: number;
35
+ /** Run immediately on schedule creation */
36
+ immediate?: boolean;
37
+ }
38
+ interface EngineOptions {
39
+ /** Snapshot store for workflow persistence */
40
+ store: SnapshotStore;
41
+ /** Registered workflows keyed by name */
42
+ workflows: Record<string, WorkflowRegistration>;
43
+ /** Max parallel workflow runs per tick (default: 5) */
44
+ concurrency?: number;
45
+ /** Event handler */
46
+ onEvent?: (event: EngineEvent) => void;
47
+ /** Error handler for background operations */
48
+ onError?: (error: unknown) => void;
49
+ }
50
+ type EngineEvent = {
51
+ type: "engine_start";
52
+ ts: number;
53
+ } | {
54
+ type: "engine_stop";
55
+ ts: number;
56
+ } | {
57
+ type: "engine_tick";
58
+ ts: number;
59
+ processed: number;
60
+ } | {
61
+ type: "workflow_enqueued";
62
+ workflowName: string;
63
+ id: string;
64
+ ts: number;
65
+ } | {
66
+ type: "workflow_started";
67
+ workflowName: string;
68
+ id: string;
69
+ ts: number;
70
+ } | {
71
+ type: "workflow_completed";
72
+ workflowName: string;
73
+ id: string;
74
+ ts: number;
75
+ } | {
76
+ type: "workflow_failed";
77
+ workflowName: string;
78
+ id: string;
79
+ error: unknown;
80
+ ts: number;
81
+ } | {
82
+ type: "schedule_created";
83
+ workflowName: string;
84
+ scheduleId: string;
85
+ intervalMs: number;
86
+ ts: number;
87
+ } | {
88
+ type: "schedule_removed";
89
+ scheduleId: string;
90
+ ts: number;
91
+ };
92
+ interface Engine {
93
+ /** Enqueue a workflow for execution. Returns the workflow execution ID. */
94
+ enqueue(name: string, options?: EnqueueOptions): Promise<string>;
95
+ /** Schedule recurring workflow execution. Returns the schedule ID. */
96
+ schedule(name: string, options: ScheduleOptions & EnqueueOptions): string;
97
+ /** Remove a schedule */
98
+ unschedule(scheduleId: string): boolean;
99
+ /** Start the polling loop */
100
+ start(pollIntervalMs?: number): void;
101
+ /** Stop the polling loop gracefully */
102
+ stop(): Promise<void>;
103
+ /** Execute a single tick manually (process pending workflows). Returns number processed. */
104
+ tick(): Promise<number>;
105
+ /** Get engine status */
106
+ status(): {
107
+ running: boolean;
108
+ pendingSchedules: number;
109
+ };
110
+ }
111
+
112
+ declare function createEngine(options: EngineOptions): Engine;
113
+
114
+ export { type Engine, type EngineEvent, type EngineOptions, type EnqueueOptions, type ScheduleOptions, type WorkflowRegistration, createEngine };
@@ -0,0 +1,114 @@
1
+ import { S as SnapshotStore, e as AnyResultFn, f as WorkflowContext } from './persistence-entry-ClFhxd2Q.js';
2
+ import { ae as RunStep } from './run-entry-rw7zll_G.js';
3
+ import { b as DurableOptions } from './index-BVUAOWGG.js';
4
+ import './types-CuWK5AlK.js';
5
+ import '@standard-schema/spec';
6
+ import './errors-entry-DOt5UUl4.js';
7
+ import './tagged-error.js';
8
+
9
+ /** A registered workflow definition */
10
+ interface WorkflowRegistration<Deps extends Readonly<Record<string, AnyResultFn>> = Readonly<Record<string, AnyResultFn>>> {
11
+ /** Workflow dependencies (Result-returning functions) */
12
+ deps: Deps;
13
+ /** Workflow function */
14
+ fn: (context: {
15
+ step: RunStep<any>;
16
+ deps: Deps;
17
+ ctx: WorkflowContext;
18
+ }) => any;
19
+ /** Default durable options (version, lockTtlMs, etc.) */
20
+ durableDefaults?: Partial<Pick<DurableOptions, 'version' | 'lockTtlMs' | 'heartbeatIntervalMs'>>;
21
+ }
22
+ interface EnqueueOptions {
23
+ /** Custom workflow execution ID (default: auto-generated UUID) */
24
+ id?: string;
25
+ /** Idempotency key for deduplication */
26
+ idempotencyKey?: string;
27
+ /** Workflow input for idempotency conflict detection */
28
+ input?: unknown;
29
+ /** Custom metadata */
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ interface ScheduleOptions {
33
+ /** Repeat interval in milliseconds */
34
+ intervalMs: number;
35
+ /** Run immediately on schedule creation */
36
+ immediate?: boolean;
37
+ }
38
+ interface EngineOptions {
39
+ /** Snapshot store for workflow persistence */
40
+ store: SnapshotStore;
41
+ /** Registered workflows keyed by name */
42
+ workflows: Record<string, WorkflowRegistration>;
43
+ /** Max parallel workflow runs per tick (default: 5) */
44
+ concurrency?: number;
45
+ /** Event handler */
46
+ onEvent?: (event: EngineEvent) => void;
47
+ /** Error handler for background operations */
48
+ onError?: (error: unknown) => void;
49
+ }
50
+ type EngineEvent = {
51
+ type: "engine_start";
52
+ ts: number;
53
+ } | {
54
+ type: "engine_stop";
55
+ ts: number;
56
+ } | {
57
+ type: "engine_tick";
58
+ ts: number;
59
+ processed: number;
60
+ } | {
61
+ type: "workflow_enqueued";
62
+ workflowName: string;
63
+ id: string;
64
+ ts: number;
65
+ } | {
66
+ type: "workflow_started";
67
+ workflowName: string;
68
+ id: string;
69
+ ts: number;
70
+ } | {
71
+ type: "workflow_completed";
72
+ workflowName: string;
73
+ id: string;
74
+ ts: number;
75
+ } | {
76
+ type: "workflow_failed";
77
+ workflowName: string;
78
+ id: string;
79
+ error: unknown;
80
+ ts: number;
81
+ } | {
82
+ type: "schedule_created";
83
+ workflowName: string;
84
+ scheduleId: string;
85
+ intervalMs: number;
86
+ ts: number;
87
+ } | {
88
+ type: "schedule_removed";
89
+ scheduleId: string;
90
+ ts: number;
91
+ };
92
+ interface Engine {
93
+ /** Enqueue a workflow for execution. Returns the workflow execution ID. */
94
+ enqueue(name: string, options?: EnqueueOptions): Promise<string>;
95
+ /** Schedule recurring workflow execution. Returns the schedule ID. */
96
+ schedule(name: string, options: ScheduleOptions & EnqueueOptions): string;
97
+ /** Remove a schedule */
98
+ unschedule(scheduleId: string): boolean;
99
+ /** Start the polling loop */
100
+ start(pollIntervalMs?: number): void;
101
+ /** Stop the polling loop gracefully */
102
+ stop(): Promise<void>;
103
+ /** Execute a single tick manually (process pending workflows). Returns number processed. */
104
+ tick(): Promise<number>;
105
+ /** Get engine status */
106
+ status(): {
107
+ running: boolean;
108
+ pendingSchedules: number;
109
+ };
110
+ }
111
+
112
+ declare function createEngine(options: EngineOptions): Engine;
113
+
114
+ export { type Engine, type EngineEvent, type EngineOptions, type EnqueueOptions, type ScheduleOptions, type WorkflowRegistration, createEngine };
package/dist/engine.js ADDED
@@ -0,0 +1,11 @@
1
+ import{randomUUID as At}from"crypto";var Ue=class extends Error{_tag};function ke(t,e){return class extends Ue{_tag=t;constructor(o,i){let g=e?.message?e.message(o??{}):t;if(super(g),this.name=t,Object.setPrototypeOf(this,new.target.prototype),o&&typeof o=="object"){let{_tag:w,name:S,message:h,stack:z,...u}=o,L=Object.prototype.hasOwnProperty.call(u,"cause"),_=L?u.cause:void 0;L&&delete u.cause;let x=i?.cause!==void 0;if(L&&x)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,u),L&&(this.cause=_),x&&(this.cause=i?.cause)}else i?.cause!==void 0&&(this.cause=i.cause)}}}Object.defineProperty(ke,Symbol.hasInstance,{value:t=>t instanceof Ue});(g=>{function t(w){return w instanceof Error}g.isError=t;function e(w){return w instanceof Ue}g.isTaggedError=e;function o(w,S){let h=w._tag,z=S[h];return z(w)}g.match=o;function i(w,S,h){let z=w._tag,u=S[z];return u?u(w):h(w)}g.matchPartial=i})(ke||={});var nt=class extends ke("TimeoutError",{message:e=>e.operation?`TimeoutError: ${e.operation} timed out after ${e.ms}ms`:`TimeoutError: Operation timed out after ${e.ms}ms`}){},ot=class extends ke("RetryExhaustedError",{message:e=>e.operation?`RetryExhaustedError: ${e.operation} failed after ${e.attempts} attempts`:`RetryExhaustedError: Operation failed after ${e.attempts} attempts`}){},st=class extends ke("RateLimitError",{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`:""}`}){},at=class extends ke("CircuitBreakerOpenError",{message:e=>`CircuitBreakerOpenError: Circuit ${e.circuitName} is ${e.state??"OPEN"}${e.retryAfterMs?`, retry after ${Math.ceil(e.retryAfterMs/1e3)}s`:""}`}){},it=class extends ke("ValidationError",{message:e=>`ValidationError: Invalid ${e.field} - ${e.reason}`}){},ut=class extends ke("NotFoundError",{message:e=>e.id?`NotFoundError: ${e.resource} with id ${e.id} not found`:`NotFoundError: ${e.resource} not found`}){},lt=class extends ke("UnauthorizedError",{message:e=>e.reason?`UnauthorizedError: ${e.reason}`:e.action&&e.resource?`UnauthorizedError: Not authorized to ${e.action} ${e.resource}`:"UnauthorizedError: Access denied"}){},ct=class extends ke("NetworkError",{message:e=>e.url?`NetworkError: ${e.reason} (${e.url})`:`NetworkError: ${e.reason}`}){},pt=class extends ke("CompensationError",{message:e=>`CompensationError: Failed to compensate step ${e.step}`}){},We=class extends ke("UnexpectedError",{message:e=>`UnexpectedError: ${e.cause instanceof Error?e.cause.message:String(e.cause??"unknown")}`}){};function Ot(t){let e=t.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!e)return;let o=parseFloat(e[1]),i=e[2].toLowerCase();return{_tag:"Duration",millis:o*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[i]??1)}}function Ve(t){return new We({cause:t})}function Q(t){return{ok:!0,value:t}}function U(t,e){let o=e?.cause;return{ok:!1,error:t,...o!==void 0?{cause:o}:{}}}var Et=t=>t instanceof We||typeof t=="object"&&t!==null&&"_tag"in t&&t._tag==="UnexpectedError";function _t(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 o=e._tag.trim();if(o)return o}if(typeof e.tag=="string"){let o=e.tag.trim();if(o)return o}if(typeof e.code=="string"){let o=e.code.trim();if(o)return o}else if(typeof e.code=="number")return String(e.code);if(t instanceof Error&&t.name){let o=t.name.trim();if(o)return o}}return"unknown"}function Pt(t,e){if(!(!e||!t))return e[t]}function qe(t){let{intent:e,domain:o,owner:i,tags:g,stateChanges:w,emits:S,calls:h}=t;if(!e&&!o&&!i&&!g?.length&&!w?.length&&!S?.length&&!h?.length)return;let z={};return e&&(z.intent=e),o&&(z.domain=o),i&&(z.owner=i),g?.length&&(z.tags=g),w?.length&&(z.stateChanges=w),S?.length&&(z.emits=S),h?.length&&(z.calls=h),z}function ge(t,e,o,i,g){let w=_t(t),S=Pt(w,e),h={tag:w,origin:o};return S!==void 0&&(h.classification=S),i!==void 0&&(h.attempt=i),g!==void 0&&(h.cumulativeDurationMs=g),h}var Oe=Symbol.for("step_timeout_marker");function dt(t){return typeof t!="object"||t===null?!1:t.type==="STEP_TIMEOUT"?!0:Oe in t}function Dt(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(Oe in t)return t[Oe]}}var wt=Symbol("early-exit");function _e(t,e){return{[wt]:!0,error:t,meta:e}}function Ce(t){return typeof t=="object"&&t!==null&&t[wt]===!0}var yt=Symbol("mapper-exception");function ve(t){return{[yt]:!0,thrown:t}}function It(t){return typeof t=="object"&&t!==null&&t[yt]===!0}function Be(t,e){let{backoff:o,initialDelay:i,maxDelay:g,jitter:w}=e,S;switch(o){case"fixed":S=i;break;case"linear":S=i*t;break;case"exponential":S=i*Math.pow(2,t-1);break}if(S=Math.min(S,g),w){let h=S*.25*Math.random();S=S+h}return Math.floor(S)}function He(t){return new Promise(e=>setTimeout(e,t))}var mt=Symbol("timeout"),je=Symbol("timeout-option");function Mt(t){return typeof t=="object"&&t!==null&&t[je]===!0}async function Ut(t,e,o,i){let g=new AbortController,w=e.onTimeout??"error",S=()=>typeof w=="function"?w({name:o.name,key:o.key,ms:e.ms}):e.error??{type:"STEP_TIMEOUT",stepName:o.name,stepKey:o.key,timeoutMs:e.ms,attempt:o.attempt},h;i?.aborted&&g.abort(i.reason);let z;i&&!i.aborted&&(z=()=>g.abort(i.reason),i.addEventListener("abort",z,{once:!0}));let u=new Promise((_,x)=>{h=setTimeout(()=>{if(w!=="disconnect"&&g.abort(),w==="option"){x({[je]:!0,ms:e.ms});return}x({[mt]:!0,error:S()})},e.ms)}),L;e.signal?L=Promise.resolve(t(g.signal)):L=Promise.resolve(t());try{return await Promise.race([L,u])}catch(_){if(typeof _=="object"&&_!==null&&_[je]===!0)throw{[je]:!0,ms:e.ms};if(typeof _=="object"&&_!==null&&_[mt]===!0){w==="disconnect"&&L.catch(()=>{});let x=_.error;if(typeof x=="object"&&x!==null&&x.type!=="STEP_TIMEOUT"){let le={timeoutMs:e.ms,stepName:o.name,stepKey:o.key,attempt:o.attempt};Oe in x?x[Oe]=le:Object.defineProperty(x,Oe,{value:le,enumerable:!1,writable:!0,configurable:!1})}throw x}throw _}finally{clearTimeout(h),z&&i&&i.removeEventListener("abort",z)}}var Ae={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Fe(t,e){let{onError:o,onEvent:i,catchUnexpected:g,workflowId:w,workflowName:S,context:h,_workflowSignal:z}=e&&typeof e=="object"?e:{},u=w??crypto.randomUUID(),L=g??Ve,_=[],x=0,le=d=>d??`step_${++x}`,m=d=>{let F=d.context!==void 0||h===void 0?d:{...d,context:h},Y=S!==void 0&&F.workflowName===void 0?{...F,workflowName:S}:F;if(Y.type==="step_success"){let Ee=Y.stepId;for(let ye=_.length-1;ye>=0;ye--){let we=_[ye];if(we.type==="race"&&!we.winnerId){we.winnerId=Ee;break}}}i?.(Y,h)},X=_e,I=d=>Ce(d),J=(d,F)=>d,H=d=>typeof d=="function"?!1:!!(d&&typeof d=="object"&&"ok"in d||d&&typeof d=="object"&&"then"in d&&typeof d.then=="function");try{let F=function(p){let r={};for(let[s,a]of Object.entries(p))if(typeof a=="function")r[s]=a;else if(a&&typeof a=="object"&&"fn"in a)r[s]=a.fn;else throw new TypeError(`step.parallel: operation "${s}" must be a function or { fn, errors? } object`);return r},Y=function(p,r){let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1;_.push({scopeId:s,type:"parallel"});let y=()=>{if(n)return;n=!0;let k=_.findIndex(c=>c.scopeId===s);k!==-1&&_.splice(k,1),m({type:"scope_end",workflowId:u,scopeId:s,ts:Date.now(),durationMs:performance.now()-a})};m({type:"scope_start",workflowId:u,scopeId:s,scopeType:"parallel",name:p,ts:Date.now()});try{let k=await r();if(y(),!k.ok)throw o?.(k.error,p,h),X(k.error,{origin:"result",resultCause:k.cause});return k.value}catch(k){throw y(),k}})()},Ee=function(p,r){let s=Object.keys(p),a=r.name??`Parallel(${s.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let y=performance.now(),k=!1;_.push({scopeId:n,type:"parallel"});let c=()=>{if(k)return;k=!0;let b=_.findIndex(P=>P.scopeId===n);b!==-1&&_.splice(b,1),m({type:"scope_end",workflowId:u,scopeId:n,ts:Date.now(),durationMs:performance.now()-y})};m({type:"scope_start",workflowId:u,scopeId:n,scopeType:"parallel",name:a,ts:Date.now()});try{let b=await new Promise(D=>{if(s.length===0){D([]);return}let K=!1,Z=s.length,M=new Array(s.length);for(let ne=0;ne<s.length;ne++){let V=s[ne],N=ne;Promise.resolve(p[V]()).catch($=>U({type:"PROMISE_REJECTED",cause:$},{cause:{type:"PROMISE_REJECTION",reason:$}})).then($=>{if(!K){if(!$.ok){K=!0,D([{key:V,result:$}]);return}M[N]={key:V,result:$},Z--,Z===0&&D(M)}})}});c();let P={};for(let{key:D,result:K}of b){if(!K.ok)throw o?.(K.error,D,h),X(K.error,{origin:"result",resultCause:K.cause});P[D]=K.value}return P}catch(b){throw c(),b}})()};var ie=F,fe=Y,G=Ee;let d=(p,r,s)=>(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 a=s??{},n=qe(a),y=p,k=a.key??p,c=a.key??p,{description:b,retry:P,timeout:D}=a,K=le(k),Z=i,M=Z?performance.now():0,V=H(r)?()=>r:r,$={attempts:Math.max(1,P?.attempts??1),backoff:P?.backoff??Ae.backoff,initialDelay:P?.initialDelay??Ae.initialDelay,maxDelay:P?.maxDelay??Ae.maxDelay,jitter:P?.jitter??Ae.jitter,retryOn:P?.retryOn??Ae.retryOn,onRetry:P?.onRetry??Ae.onRetry};i&&m({type:"step_start",workflowId:u,stepId:K,stepKey:k,name:y,description:b,ts:Date.now(),...n&&{metadata:n}});let Te;for(let l=1;l<=$.attempts;l++){let ee=Z?performance.now():0;try{let R;if(D?R=await Ut(V,D,{name:y,key:k,attempt:l},z):R=await V(),R.ok){let f=performance.now()-M;return m({type:"step_success",workflowId:u,stepId:K,stepKey:k,name:y,description:b,ts:Date.now(),durationMs:f,...n&&{metadata:n}}),c&&m({type:"step_complete",workflowId:u,stepKey:c,name:y,description:b,ts:Date.now(),durationMs:f,result:R,...n&&{metadata:n}}),R.value}if(Te=R,l<$.attempts&&$.retryOn(R.error,l)){let f=Be(l,$);m({type:"step_retry",workflowId:u,stepId:K,stepKey:k,name:y,ts:Date.now(),attempt:l+1,maxAttempts:$.attempts,delayMs:f,error:R.error,...n&&{metadata:n},diagnostics:ge(R.error,a.errorMeta,"result",l,performance.now()-M)}),$.onRetry(R.error,l,f),await He(f);continue}$.attempts>1&&m({type:"step_retries_exhausted",workflowId:u,stepId:K,stepKey:k,name:y,ts:Date.now(),durationMs:performance.now()-M,attempts:l,lastError:R.error,...n&&{metadata:n},diagnostics:ge(R.error,a.errorMeta,"result",l,performance.now()-M)});break}catch(R){let f=performance.now()-ee;if(Mt(R)){let C=R.ms;m({type:"step_timeout",workflowId:u,stepId:K,stepKey:k,name:y,ts:Date.now(),timeoutMs:C,attempt:l,...n&&{metadata:n},diagnostics:ge(R,a.errorMeta,"timeout",l)}),m({type:"step_success",workflowId:u,stepId:K,stepKey:k,name:y,description:b,ts:Date.now(),durationMs:performance.now()-M,...n&&{metadata:n}}),c&&m({type:"step_complete",workflowId:u,stepKey:c,name:y,description:b,ts:Date.now(),durationMs:performance.now()-M,result:Q(void 0),...n&&{metadata:n}});return}if(I(R))throw m({type:"step_aborted",workflowId:u,stepId:K,stepKey:k,name:y,description:b,ts:Date.now(),durationMs:f,...n&&{metadata:n}}),R;if(dt(R)){let C=Dt(R),O=D?.ms??C?.timeoutMs??0;if(m({type:"step_timeout",workflowId:u,stepId:K,stepKey:k,name:y,ts:Date.now(),timeoutMs:O,attempt:l,...n&&{metadata:n},diagnostics:ge(R,a.errorMeta,"timeout",l)}),l<$.attempts&&$.retryOn(R,l)){let T=Be(l,$);m({type:"step_retry",workflowId:u,stepId:K,stepKey:k,name:y,ts:Date.now(),attempt:l+1,maxAttempts:$.attempts,delayMs:T,error:R,...n&&{metadata:n},diagnostics:ge(R,a.errorMeta,"timeout",l,performance.now()-M)}),$.onRetry(R,l,T),await He(T);continue}$.attempts>1&&m({type:"step_retries_exhausted",workflowId:u,stepId:K,stepKey:k,name:y,ts:Date.now(),durationMs:performance.now()-M,attempts:l,lastError:R,...n&&{metadata:n},diagnostics:ge(R,a.errorMeta,"timeout",l,performance.now()-M)});let j=performance.now()-M;throw m({type:"step_error",workflowId:u,stepId:K,stepKey:k,name:y,description:b,ts:Date.now(),durationMs:j,error:R,...n&&{metadata:n},diagnostics:ge(R,a.errorMeta,"timeout",l,j)}),c&&m({type:"step_complete",workflowId:u,stepKey:c,name:y,description:b,ts:Date.now(),durationMs:j,result:U(R,{cause:R}),meta:{origin:"throw",thrown:R},...n&&{metadata:n}}),o?.(R,y,h),X(R,{origin:"throw",thrown:R})}if(l<$.attempts&&$.retryOn(R,l)){let C=Be(l,$);m({type:"step_retry",workflowId:u,stepId:K,stepKey:k,name:y,ts:Date.now(),attempt:l+1,maxAttempts:$.attempts,delayMs:C,error:R,...n&&{metadata:n},diagnostics:ge(R,a.errorMeta,"throw",l,performance.now()-M)}),$.onRetry(R,l,C),await He(C);continue}$.attempts>1&&!dt(R)&&m({type:"step_retries_exhausted",workflowId:u,stepId:K,stepKey:k,name:y,ts:Date.now(),durationMs:performance.now()-M,attempts:l,lastError:R,...n&&{metadata:n},diagnostics:ge(R,a.errorMeta,"throw",l,performance.now()-M)});let v=performance.now()-M,A;try{A=L(R)}catch(C){throw ve(C)}throw m({type:"step_error",workflowId:u,stepId:K,stepKey:k,name:y,description:b,ts:Date.now(),durationMs:v,error:A,...n&&{metadata:n},diagnostics:ge(R,a.errorMeta,"throw",l,v)}),c&&m({type:"step_complete",workflowId:u,stepKey:c,name:y,description:b,ts:Date.now(),durationMs:v,result:U(A,{cause:R}),meta:{origin:"throw",thrown:R},...n&&{metadata:n}}),o?.(A,y,h),X(A,{origin:"throw",thrown:R})}}let ue=Te,Se=performance.now()-M,E=J(ue.error,{origin:"result",resultCause:ue.cause});throw m({type:"step_error",workflowId:u,stepId:K,stepKey:k,name:y,description:b,ts:Date.now(),durationMs:Se,error:E,...n&&{metadata:n},diagnostics:ge(ue.error,a.errorMeta,"result",$.attempts,Se)}),c&&m({type:"step_complete",workflowId:u,stepKey:c,name:y,description:b,ts:Date.now(),durationMs:Se,result:ue,meta:{origin:"result",resultCause:ue.cause},...n&&{metadata:n}}),o?.(E,y,h),X(E,{origin:"result",resultCause:ue.cause})})();d.try=(p,r,s)=>{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 a=s.key??p,n=p,y=p,k="error"in s?()=>s.error:s.onError,c=i;return(async()=>{let b=c?performance.now():0;i&&m({type:"step_start",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now()});try{let P=await r(),D=performance.now()-b;return m({type:"step_success",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:D}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:D,result:Q(P)}),P}catch(P){let D=k(P),K=performance.now()-b,Z=J(D,{origin:"throw",thrown:P});throw m({type:"step_error",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:K,error:Z}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:K,result:U(D,{cause:P}),meta:{origin:"throw",thrown:P}}),o?.(Z,n,h),X(Z,{origin:"throw",thrown:P})}})()},d.fromResult=(p,r,s)=>{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 a=s.key??p,n=p,y=p,k="error"in s?()=>s.error:s.onError,c=i;return(async()=>{let b=c?performance.now():0;i&&m({type:"step_start",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now()});let P=await r();if(P.ok){let D=performance.now()-b;return m({type:"step_success",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:D}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:D,result:Q(P.value)}),P.value}else{let D=k(P.error),K=performance.now()-b,Z=J(D,{origin:"result",resultCause:P.error});throw m({type:"step_error",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:K,error:Z}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:K,result:U(D,{cause:P.error}),meta:{origin:"result",resultCause:P.error}}),o?.(Z,n,h),X(Z,{origin:"result",resultCause:P.error})}})()},d.fromNullable=(p,r,s,a)=>{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 d(p,async()=>{let n=await r();return n!=null?Q(n):U(s())},a)},d.retry=(p,r,s)=>{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 d(p,r,{key:s.key??p,retry:{attempts:s.attempts,backoff:s.backoff,initialDelay:s.initialDelay,maxDelay:s.maxDelay,jitter:s.jitter,retryOn:s.retryOn,onRetry:s.onRetry},timeout:s.timeout})},d.withTimeout=(p,r,s)=>{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 d(p,r,{key:s.key??p,timeout:s})},d.sleep=(p,r,s)=>{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 a=typeof r=="string"?Ot(r):r;if(!a)throw new Error(`step.sleep: invalid duration '${r}'`);let n=a.millis,y=s?.signal;return d(p,async()=>{if(z?.aborted||y?.aborted){let k=new Error("Sleep aborted");throw k.name="AbortError",k}return new Promise((k,c)=>{let b={timeoutId:void 0},P=()=>{b.timeoutId&&clearTimeout(b.timeoutId);let D=new Error("Sleep aborted");D.name="AbortError",c(D)};z?.addEventListener("abort",P,{once:!0}),y?.addEventListener("abort",P,{once:!0}),b.timeoutId=setTimeout(()=>{z?.removeEventListener("abort",P),y?.removeEventListener("abort",P),k(Q(void 0))},n)})},{key:s?.key??p,description:s?.description})},d.parallel=((...p)=>{if(typeof p[0]!="string")throw new TypeError("step.parallel(name, ...): first argument must be a string (step name). Example: step.parallel('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let r=p[0],s=p[1];if(typeof s=="function")return Y(r,s);if(s&&typeof s=="object"&&!Array.isArray(s)){let n=F(s);return Ee(n,{name:r})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),d.race=(p,r)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1,y={scopeId:s,type:"race",winnerId:void 0};_.push(y);let k=()=>{if(n)return;n=!0;let c=_.findIndex(b=>b.scopeId===s);c!==-1&&_.splice(c,1),m({type:"scope_end",workflowId:u,scopeId:s,ts:Date.now(),durationMs:performance.now()-a,winnerId:y.winnerId})};m({type:"scope_start",workflowId:u,scopeId:s,scopeType:"race",name:p,ts:Date.now()});try{let c=await r();if(k(),!c.ok)throw o?.(c.error,p,h),X(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw k(),c}})()},d.allSettled=(p,r)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1;_.push({scopeId:s,type:"allSettled"});let y=()=>{if(n)return;n=!0;let k=_.findIndex(c=>c.scopeId===s);k!==-1&&_.splice(k,1),m({type:"scope_end",workflowId:u,scopeId:s,ts:Date.now(),durationMs:performance.now()-a})};m({type:"scope_start",workflowId:u,scopeId:s,scopeType:"allSettled",name:p,ts:Date.now()});try{let k=await r();if(y(),!k.ok)throw o?.(k.error,p,h),X(k.error,{origin:"result",resultCause:k.cause});return k.value}catch(k){throw y(),k}})()},d.if=(p,r,s)=>s(),d.label=d.if,d.branch=async(p,r)=>{let{condition:s,then:a,else:n}=r;if(s())return await a();if(n)return await n()},d.arm=(p,r)=>({fn:p,errors:r}),d.forEach=async(p,r,s)=>{let a=[],n=s.maxIterations,y=0,k="run"in s,c=Symbol.asyncIterator in r?r:(async function*(){yield*r})();for await(let b of c){if(n!==void 0&&y>=n)break;let P;k?P=await s.run(b,y):P=await s.item.handler(b,y,d),a.push(P),y++}return a},d.item=p=>({__forEachItemHandler:!0,handler:p}),d.dep=(p,r)=>r,d.run=(p,r,s)=>d(p,()=>r,s),d.workflow=(p,r,s)=>d(p,r,s),d.andThen=(p,r,s,a)=>d(p,()=>s(r),a),d.match=async(p,r,s,a)=>d(p,async()=>{let n=await r;return n.ok?Q(await s.ok(n.value)):Q(await s.err(n.error,n.cause))},a),d.all=d.parallel,d.map=async(p,r,s,a)=>{let n=a?.concurrency??r.length;return d(p,()=>n>=r.length?ft(r.map((y,k)=>s(y,k))):(async()=>{let y=[];for(let k=0;k<r.length;k+=n){let c=r.slice(k,k+n),b=await ft(c.map((P,D)=>s(P,k+D)));if(!b.ok)return b;y.push(...b.value)}return Q(y)})(),{key:a?.key})},d.withFallback=(p,r,s)=>{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 a=s.key??p,n=p,y=le(a),k=i;return(async()=>{let c=k?performance.now():0;i&&m({type:"step_start",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now()});let b;try{b=await r()}catch(M){if(I(M))throw m({type:"step_aborted",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-c}),M;let ne;try{ne=L(M)}catch(N){throw ve(N)}if(s.on!==void 0&&s.on!==ne){let N=performance.now()-c;throw m({type:"step_error",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:N,error:ne}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:N,result:U(ne,{cause:M}),meta:{origin:"throw",thrown:M}}),o?.(ne,n,h),X(ne,{origin:"throw",thrown:M})}let V;try{V=await s.fallback()}catch(N){if(I(N))throw m({type:"step_aborted",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-c}),N;let $;try{$=L(N)}catch(ue){throw ve(ue)}let Te=performance.now()-c;throw m({type:"step_error",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:Te,error:$}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:Te,result:U($,{cause:N}),meta:{origin:"throw",thrown:N}}),o?.($,n,h),X($,{origin:"throw",thrown:N})}if(V.ok){let N=performance.now()-c;return m({type:"step_success",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:N}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:N,result:V,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(ne)}}),V.value}else{let N=performance.now()-c,$=J(V.error,{origin:"result",resultCause:V.cause});throw m({type:"step_error",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:N,error:$}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:N,result:V,meta:{origin:"result",resultCause:V.cause}}),o?.($,n,h),X($,{origin:"result",resultCause:V.cause})}}if(b.ok){let M=performance.now()-c;return m({type:"step_success",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:M}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:M,result:b}),b.value}let P=b.error;if(s.on!==void 0&&s.on!==P){let M=performance.now()-c,ne=J(P,{origin:"result",resultCause:b.cause});throw m({type:"step_error",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:M,error:ne}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:M,result:b,meta:{origin:"result",resultCause:b.cause}}),o?.(ne,n,h),X(ne,{origin:"result",resultCause:b.cause})}let D;try{D=await s.fallback()}catch(M){if(I(M))throw m({type:"step_aborted",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-c}),M;let ne;try{ne=L(M)}catch(N){throw ve(N)}let V=performance.now()-c;throw m({type:"step_error",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:V,error:ne}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:V,result:U(ne,{cause:M}),meta:{origin:"throw",thrown:M}}),o?.(ne,n,h),X(ne,{origin:"throw",thrown:M})}if(D.ok){let M=performance.now()-c;return m({type:"step_success",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:M}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:M,result:D,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(P)}}),D.value}let K=performance.now()-c,Z=J(D.error,{origin:"result",resultCause:D.cause});throw m({type:"step_error",workflowId:u,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:K,error:Z}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:n,ts:Date.now(),durationMs:K,result:D,meta:{origin:"result",resultCause:D.cause}}),o?.(Z,n,h),X(Z,{origin:"result",resultCause:D.cause})})()},d.withResource=(p,r)=>{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 s=p,a=p,n=le(s),y=i;return(async()=>{let k=y?performance.now():0;i&&m({type:"step_start",workflowId:u,stepId:n,stepKey:s,name:a,ts:Date.now()});let c;try{c=await r.acquire()}catch(V){if(I(V))throw m({type:"step_aborted",workflowId:u,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:performance.now()-k}),V;let N;try{N=L(V)}catch(Te){throw ve(Te)}let $=performance.now()-k;throw m({type:"step_error",workflowId:u,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:$,error:N}),s&&m({type:"step_complete",workflowId:u,stepKey:s,name:a,ts:Date.now(),durationMs:$,result:U(N,{cause:V}),meta:{origin:"throw",thrown:V}}),o?.(N,a,h),X(N,{origin:"throw",thrown:V})}if(!c.ok){let V=performance.now()-k,N=J(c.error,{origin:"result",resultCause:c.cause});throw m({type:"step_error",workflowId:u,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:V,error:N}),s&&m({type:"step_complete",workflowId:u,stepKey:s,name:a,ts:Date.now(),durationMs:V,result:c,meta:{origin:"result",resultCause:c.cause}}),o?.(N,a,h),X(N,{origin:"result",resultCause:c.cause})}let b=c.value,P,D,K=!1;try{P=await r.use(b)}catch(V){if(I(V)){try{await r.release(b)}catch(N){console.warn(`[awaitly] step.withResource("${p}"): release threw after earlyExit:`,N)}throw V}D=V,K=!0}try{await r.release(b)}catch(V){console.warn(`[awaitly] step.withResource("${p}"): release threw:`,V)}if(K){let V;try{V=L(D)}catch($){throw ve($)}let N=performance.now()-k;throw m({type:"step_error",workflowId:u,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:N,error:V}),s&&m({type:"step_complete",workflowId:u,stepKey:s,name:a,ts:Date.now(),durationMs:N,result:U(V,{cause:D}),meta:{origin:"throw",thrown:D}}),o?.(V,a,h),X(V,{origin:"throw",thrown:D})}let Z=P;if(Z.ok){let V=performance.now()-k;return m({type:"step_success",workflowId:u,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:V}),s&&m({type:"step_complete",workflowId:u,stepKey:s,name:a,ts:Date.now(),durationMs:V,result:Z}),Z.value}let M=performance.now()-k,ne=J(Z.error,{origin:"result",resultCause:Z.cause});throw m({type:"step_error",workflowId:u,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:M,error:ne}),s&&m({type:"step_complete",workflowId:u,stepKey:s,name:a,ts:Date.now(),durationMs:M,result:Z,meta:{origin:"result",resultCause:Z.cause}}),o?.(ne,a,h),X(ne,{origin:"result",resultCause:Z.cause})})()};let we=await t({step:d});if(process.env.NODE_ENV!=="production"&&we!==null&&typeof we=="object"&&"ok"in we&&typeof we.ok=="boolean"){let p=we;(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 Q(we)}catch(d){if(It(d))throw d.thrown;if(I(d)){let Y=d.meta.origin==="throw"?d.meta.thrown:d.meta.origin==="result"?d.meta.resultCause:void 0;return U(d.error,{cause:Y})}let F=L(d);return o?.(F,"unexpected",h),U(F,{cause:d})}}Fe.strict=(t,e)=>Fe(t,e);async function ft(t){return t.length===0?Q([]):new Promise(e=>{let o=!1,i=t.length,g=new Array(t.length);for(let w=0;w<t.length;w++){let S=w;Promise.resolve(t[S]).catch(h=>U({type:"PROMISE_REJECTED",cause:h},{cause:{type:"PROMISE_REJECTION",reason:h}})).then(h=>{if(!o){if(!h.ok){o=!0,e(h);return}g[S]=h.value,i--,i===0&&e(Q(g))}})}})}function kt(t){return t.type==="step_complete"}function Je(t){return typeof t=="object"&&t!==null&&t.type==="WORKFLOW_CANCELLED"}var be=class extends Error{constructor(o,i=[]){super(o);this.errors=i;this.name="SnapshotFormatError"}};var Pe=class extends Error{constructor(o,i,g){super(o);this.stepId=i;this.originalError=g;this.name="SnapshotDecodeError"}};function Wt(t){let e=[];if(typeof t!="object"||t===null)return{valid:!1,errors:["Snapshot must be an object"]};let o=t;if("formatVersion"in o?o.formatVersion!==1&&e.push(`Invalid formatVersion: expected 1, got ${o.formatVersion}`):e.push("Missing required field: formatVersion"),!("steps"in o))e.push("Missing required field: steps");else if(typeof o.steps!="object"||o.steps===null)e.push("steps must be an object");else{let i=o.steps;for(let[g,w]of Object.entries(i)){if(typeof w!="object"||w===null){e.push(`steps["${g}"] must be an object`);continue}let S=w;"ok"in S?typeof S.ok!="boolean"?e.push(`steps["${g}"].ok must be a boolean`):S.ok===!1&&("error"in S||e.push(`steps["${g}"] is error result but missing error field`),"cause"in S||e.push(`steps["${g}"] is error result but missing cause field`)):e.push(`steps["${g}"] missing required field: ok`)}}if(!("execution"in o))e.push("Missing required field: execution");else if(typeof o.execution!="object"||o.execution===null)e.push("execution must be an object");else{let i=o.execution;"status"in i?["running","completed","failed"].includes(i.status)||e.push("execution.status must be one of: running, completed, failed"):e.push("execution missing required field: status"),"lastUpdated"in i?typeof i.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 Tt(t){let e=Wt(t);if(!e.valid)throw new be(`Invalid snapshot format: ${e.errors[0]}`,e.errors);return e.snapshot}function Rt(t,e){let o=Object.create(null);for(let[S,h]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,S)&&(o[S]=h);for(let[S,h]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,S)&&(o[S]=h);let i=t.metadata||e.metadata?{...t.metadata,...e.metadata}:void 0,w=[...(t.warnings||[]).filter(S=>!Object.prototype.hasOwnProperty.call(e.steps,S.stepId)),...e.warnings||[]];return{formatVersion:1,steps:o,execution:{...e.execution},metadata:i,warnings:w.length>0?w:void 0}}var gt=1e3;function ze(t){let e={type:"error",name:t.name,message:t.message};t.stack&&(e.stack=t.stack);let o=t;return o.cause!==void 0&&(o.cause instanceof Error?e.cause=ze(o.cause):e.cause=Ye(o.cause)),e}function Ye(t){let e,o=!1;try{e=String(t),e.length>gt&&(e=e.slice(0,gt),o=!0)}catch{e="[unable to convert to string]"}let i=t===null?"null":typeof t=="object"?t.constructor?.name??"Object":typeof t,g;try{let S=JSON.stringify(t);S!==void 0&&(g=JSON.parse(S))}catch{}let w={type:"thrown",originalType:i,stringRepresentation:e};return g!==void 0&&(w.value=g),o&&(w.truncated=!0),w}function Xe(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=Xe(t.cause)),e}return t.value!==void 0?t.value:t.stringRepresentation}function Nt(t){return typeof t=="object"&&t!==null&&t.__cachedMeta===!0}function xe(t,e,o){return U(t,{cause:{__cachedMeta:!0,originalCause:o,meta:e}})}function Ne(t){return Nt(t)?t.meta:{origin:"result",resultCause:t}}function Ke(){let t=new Map;return{handleEvent:e=>{kt(e)&&t.set(e.stepKey,{result:e.result,meta:e.meta})},getResumeState:()=>({steps:new Map(t)}),clear:()=>t.clear()}}var Kt="STREAM_WRITE_ERROR",jt="STREAM_READ_ERROR",Ft="STREAM_CLOSE_ERROR";var Vt="STREAM_ENDED";function Le(t,e,o){return{type:Kt,reason:t,message:e,...o!==void 0?{cause:o}:{}}}function Ge(t,e,o){return{type:jt,reason:t,message:e,...o!==void 0?{cause:o}:{}}}function Ze(t,e,o){return{type:Ft,reason:t,message:e,...o!==void 0?{cause:o}:{}}}function $e(t){return{type:Vt,finalPosition:t}}function St(t={}){let e=t.highWaterMark??16,o=t.lowWaterMark??Math.floor(e/2),i=t.onStateChange,g="flowing",w=0,S=[];function h(u){if(g!==u&&(g=u,i?.(u),u==="flowing"&&S.length>0)){let L=S;S=[];for(let _ of L)_()}}function z(){g==="flowing"&&w>=e?h("paused"):g==="paused"&&w<=o&&h("flowing")}return{get state(){return g},get bufferedCount(){return w},get highWaterMark(){return e},get lowWaterMark(){return o},increment(){w++,z()},decrement(){w>0&&(w--,z())},setCount(u){w=Math.max(0,u),z()},waitForDrain(){return g==="flowing"?Promise.resolve():new Promise(u=>{S.push(u)})},reset(){w=0,S=[],h("flowing")}}}function Lt(t){return{_tag:"Duration",millis:t}}function $t(t){return{_tag:"Duration",millis:t*1e3}}function Bt(t){return{_tag:"Duration",millis:t*60*1e3}}function Ht(t){return{_tag:"Duration",millis:t*60*60*1e3}}function qt(t){return{_tag:"Duration",millis:t*24*60*60*1e3}}function ht(t){return t.millis}function xt(t){let e=t.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!e)return;let o=parseFloat(e[1]);switch(e[2].toLowerCase()){case"ms":return Lt(o);case"s":return $t(o);case"m":return Bt(o);case"h":return Ht(o);case"d":return qt(o);default:return}}async function Ct(t,e){let o=t["~standard"].validate(e),i=o instanceof Promise?await o:o;return i.issues?U({type:"INPUT_VALIDATION_ERROR",issues:i.issues.map(g=>({message:g.message,path:g.path?.map(w=>typeof w=="object"?w.key:w)})),message:`Input validation failed: ${i.issues.map(g=>g.message).join(", ")}`}):Q(i.value)}function Qe(t,e,o){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 i=e??{},g=o;async function w(u,L,_){let x=u??crypto.randomUUID(),le=_?.deps?{...i,..._.deps}:i,m=_?.createContext??g?.createContext,X=m?await m():void 0,I=_?.signal??g?.signal,J=_?.onEvent??g?.onEvent,H=_?.onError??g?.onError,ie=_?.shouldRun??g?.shouldRun,fe=_?.onBeforeStart??g?.onBeforeStart,G=_?.onAfterStep??g?.onAfterStep,d=_?.resumeState??g?.resumeState,F=g?.catchUnexpected??Ve,Y={},Ee=(_?.devWarnings??g?.devWarnings)===!0&&process.env.NODE_ENV!=="production",ye=new Set,we=new Set,p={workflowId:x,onEvent:J,context:X!==void 0?X:void 0,signal:I,input:{},ref:E=>Y[E],set:(E,l)=>{Ee&&!ye.has(E)&&(ye.add(E),console.warn(`awaitly: ctx.set('${E}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${E}' }) instead.`)),Y[E]=l},get:E=>(Ee&&!we.has(E)&&(we.add(E),console.warn(`awaitly: ctx.get('${E}') is deprecated for static analysis. Use ctx.ref('${E}') instead for tracked dependencies.`)),Y[E])},r=E=>{let l=E.context!==void 0||X===void 0?E:{...E,context:X},ee=l.workflowName===void 0?{...l,workflowName:t}:l;J?.(ee,X)},s=(E,l)=>{let ee={type:"WORKFLOW_CANCELLED",reason:E,lastStepKey:l};return U(F(ee),{cause:ee})};if(I?.aborted){let E=typeof I.reason=="string"?I.reason:I.reason instanceof Error?I.reason.message:void 0;return r({type:"workflow_cancelled",workflowId:x,ts:Date.now(),durationMs:0,reason:E}),s(E)}if(ie){let E=performance.now();try{let l=await ie(x,X),ee=performance.now()-E;if(r({type:"hook_should_run",workflowId:x,ts:Date.now(),durationMs:ee,result:l,skipped:!l}),!l){let R=new Error("Workflow skipped by shouldRun hook");return U(F(R),{cause:R})}}catch(l){let ee=performance.now()-E;return r({type:"hook_should_run_error",workflowId:x,ts:Date.now(),durationMs:ee,error:l}),U(F(l),{cause:l})}}if(fe){let E=performance.now();try{let l=await fe(x,X),ee=performance.now()-E;if(r({type:"hook_before_start",workflowId:x,ts:Date.now(),durationMs:ee,result:l,skipped:!l}),!l){let R=new Error("Workflow skipped by onBeforeStart hook");return U(F(R),{cause:R})}}catch(l){let ee=performance.now()-E;return r({type:"hook_before_start_error",workflowId:x,ts:Date.now(),durationMs:ee,error:l}),U(F(l),{cause:l})}}let a=g?.inputSchema,n=g?.input;if(a&&n!==void 0){let E=await Ct(a,n);if(!E.ok)return U(E.error);p.input=E.value}else n!==void 0&&(p.input=n);let y=Date.now(),k=performance.now();r({type:"workflow_start",workflowId:x,ts:y});let c=_?.cache??g?.cache,b=_?.streamStore??g?.streamStore;if(d&&!c&&(c=new Map),d&&c){let E=typeof d=="function"?await d():d;E.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof E.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 E.steps=="object"&&E.steps!==null&&(E.steps=new Map(Object.entries(E.steps))));for(let[l,ee]of E.steps){let{result:R,meta:f}=ee;if(R.ok)c.set(l,R);else{let v=f??{origin:"result",resultCause:R.cause};c.set(l,xe(R.error,v,R.cause))}}}let P=_?.snapshot??g?.snapshot,D=g?.serialization;if(P&&!d){c||(c=new Map);let E=P,l=D?.decode;for(let[ee,R]of Object.entries(E.steps))if(Object.prototype.hasOwnProperty.call(E.steps,ee))try{if(R.ok){let f=l?l(R.value):R.value;c.set(ee,Q(f))}else{let f=l?l(R.error):R.error,v=Xe(R.cause),A=R.meta?.origin==="throw"?{origin:"throw",thrown:v}:{origin:"result",resultCause:v};c.set(ee,xe(f,A,v))}}catch(f){throw new Pe(`Failed to decode step "${ee}": ${f instanceof Error?f.message:String(f)}`,ee,f instanceof Error?f:void 0)}}let K=!1,Z,M,ne=()=>{K=!0,Z=typeof I?.reason=="string"?I.reason:I?.reason instanceof Error?I.reason.message:void 0};I&&!I.aborted&&I.addEventListener("abort",ne,{once:!0});let V=()=>{if(K||I?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:Z??(typeof I?.reason=="string"?I.reason:I?.reason instanceof Error?I.reason.message:void 0),lastStepKey:M}},N=async(E,l,ee)=>{if(!G)return;let R=performance.now();try{await G(E,l,x,X);let f=performance.now()-R;r({type:"hook_after_step",workflowId:x,stepKey:E,ts:Date.now(),durationMs:f})}catch(f){let v=performance.now()-R;throw r({type:"hook_after_step_error",workflowId:x,stepKey:E,ts:Date.now(),durationMs:v,error:f}),f}},$=E=>{let l=async(f,v,A)=>{if(typeof f!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let C=f,O=A??{},j=C,T=Object.prototype.hasOwnProperty.call(O,"key")?O.key:C,{ttl:B,out:oe}=O;V();let re=qe(O);if(T&&c&&c.has(T)){r({type:"step_cache_hit",workflowId:x,stepKey:T,name:j,ts:Date.now(),...re&&{metadata:re}});let W=c.get(T);if(W.ok)return M=T,oe&&(Y[oe]=W.value),W.value;let q=Ne(W.cause);throw _e(W.error,q)}T&&c&&r({type:"step_cache_miss",workflowId:x,stepKey:T,name:j,ts:Date.now(),...re&&{metadata:re}});try{let W=await E(C,v,O);return oe&&(Y[oe]=W),T&&(M=T,c&&c.set(T,Q(W),B?{ttl:B}:void 0),await N(T,Q(W))),W}catch(W){if(T&&Ce(W)){let q=W,ce=q.meta.origin==="result"?q.meta.resultCause:q.meta.origin==="throw"?q.meta.thrown:void 0,te=xe(q.error,q.meta,ce);c&&c.set(T,te,B?{ttl:B}:void 0),await N(T,te,q.meta)}throw W}};l.try=async(f,v,A)=>{let{ttl:C}=A,O=A.key??f,j=f;if(c&&c.has(O)){r({type:"step_cache_hit",workflowId:x,stepKey:O,name:j,ts:Date.now()});let T=c.get(O);if(T.ok)return T.value;let B=Ne(T.cause);throw _e(T.error,B)}c&&r({type:"step_cache_miss",workflowId:x,stepKey:O,name:j,ts:Date.now()});try{let T=await E.try(f,v,{...A,key:O});return c&&c.set(O,Q(T),C?{ttl:C}:void 0),await N(O,Q(T)),T}catch(T){if(Ce(T)){let B=T,oe=B.meta.origin==="result"?B.meta.resultCause:B.meta.origin==="throw"?B.meta.thrown:void 0,re=xe(B.error,B.meta,oe);c&&c.set(O,re,C?{ttl:C}:void 0),await N(O,re,B.meta)}throw T}},l.fromResult=async(f,v,A)=>{let{ttl:C}=A,O=A.key??f,j=f;if(c&&c.has(O)){r({type:"step_cache_hit",workflowId:x,stepKey:O,name:j,ts:Date.now()});let T=c.get(O);if(T.ok)return T.value;let B=Ne(T.cause);throw _e(T.error,B)}c&&r({type:"step_cache_miss",workflowId:x,stepKey:O,name:j,ts:Date.now()});try{let T=await E.fromResult(f,v,{...A,key:O});return c&&c.set(O,Q(T),C?{ttl:C}:void 0),await N(O,Q(T)),T}catch(T){if(Ce(T)){let B=T,oe=B.meta.origin==="result"?B.meta.resultCause:B.meta.origin==="throw"?B.meta.thrown:void 0,re=xe(B.error,B.meta,oe);c&&c.set(O,re,C?{ttl:C}:void 0),await N(O,re,B.meta)}throw T}},l.parallel=E.parallel,l.race=E.race,l.allSettled=E.allSettled,l.withFallback=async(f,v,A)=>{let C=A.key??f,O=f;if(c&&c.has(C)){r({type:"step_cache_hit",workflowId:x,stepKey:C,name:O,ts:Date.now()});let j=c.get(C);if(j.ok)return j.value;let T=Ne(j.cause);throw _e(j.error,T)}c&&r({type:"step_cache_miss",workflowId:x,stepKey:C,name:O,ts:Date.now()});try{let j=await E.withFallback(f,v,A);return c&&c.set(C,Q(j)),await N(C,Q(j)),j}catch(j){if(Ce(j)){let T=j,B=T.meta.origin==="result"?T.meta.resultCause:T.meta.origin==="throw"?T.meta.thrown:void 0,oe=xe(T.error,T.meta,B);c&&c.set(C,oe),await N(C,oe,T.meta)}throw j}},l.withResource=async(f,v)=>{let A=f;try{let C=await E.withResource(f,v);return await N(A,Q(C)),C}catch(C){if(Ce(C)){let O=C,j=O.meta.origin==="result"?O.meta.resultCause:O.meta.origin==="throw"?O.meta.thrown:void 0,T=xe(O.error,O.meta,j);await N(A,T,O.meta)}throw C}},l.retry=(f,v,A)=>{let C={key:A.key,retry:{attempts:A.attempts,backoff:A.backoff,initialDelay:A.initialDelay,maxDelay:A.maxDelay,jitter:A.jitter,retryOn:A.retryOn,onRetry:A.onRetry},timeout:A.timeout,ttl:A.ttl};return l(f,v,C)},l.withTimeout=(f,v,A)=>{let C={key:A.key,timeout:A,ttl:A.ttl};return l(f,v,C)},l.sleep=(f,v,A)=>{if(typeof f!="string"||f.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let C=typeof v=="string"?xt(v):v;if(!C)throw new Error(`step.sleep: invalid duration '${v}'`);let O=ht(C),j=A?.signal;return l(f,async()=>{if(I?.aborted||j?.aborted){let B=new Error("Sleep aborted");throw B.name="AbortError",B}return new Promise((B,oe)=>{let re={timeoutId:void 0},W=()=>{re.timeoutId&&clearTimeout(re.timeoutId);let q=new Error("Sleep aborted");q.name="AbortError",oe(q)};I?.addEventListener("abort",W,{once:!0}),j?.addEventListener("abort",W,{once:!0}),re.timeoutId=setTimeout(()=>{I?.removeEventListener("abort",W),j?.removeEventListener("abort",W),B(Q(void 0))},O)})},{key:A?.key,ttl:A?.ttl,description:A?.description})};let ee=new Map,R=new Map;return l.getWritable=f=>{let v=f?.namespace??"default",A=f?.highWaterMark??16;if(!b)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let C=`${x}:${v}`,O=ee.get(C);if(O&&!O.closed&&!O.aborted)return O.writer;let j=St({highWaterMark:A,onStateChange:q=>{r({type:"stream_backpressure",workflowId:x,namespace:v,bufferedCount:j.bufferedCount,state:q,ts:Date.now()})}}),T=0,B=!0,oe=!1,re=!1;r({type:"stream_created",workflowId:x,namespace:v,ts:Date.now()});let W={async write(q){if(re)return U(Le("closed","Stream is closed"));if(oe)return U(Le("aborted","Stream was aborted"));j.state==="paused"&&await j.waitForDrain();let ce={value:q,position:T,ts:Date.now()},te=await b.append(x,v,ce);return te.ok?(r({type:"stream_write",workflowId:x,namespace:v,position:T,ts:Date.now()}),T++,j.increment(),Q(void 0)):(r({type:"stream_error",workflowId:x,namespace:v,error:te.error,position:T,ts:Date.now()}),U(Le("store_error",te.error.message,te.error)))},async close(){if(re)return U(Ze("already_closed","Stream is already closed"));let q=await b.closeStream(x,v);return q.ok?(re=!0,B=!1,r({type:"stream_close",workflowId:x,namespace:v,finalPosition:T,ts:Date.now()}),ee.delete(C),Q(void 0)):U(Ze("store_error",q.error.message,q.error))},abort(q){oe=!0,B=!1,re=!0,r({type:"stream_error",workflowId:x,namespace:v,error:q,position:T,ts:Date.now()}),ee.delete(C)},get writable(){return B},get position(){return T},get namespace(){return v}};return ee.set(C,{writer:W,backpressure:j,aborted:oe,closed:re}),W},l.getReadable=f=>{let v=f?.namespace??"default",A=f?.startIndex??0,C=f?.pollInterval??10,O=f?.pollTimeout??3e4;if(!b)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let j=`${x}:${v}:${A}`,T=R.get(j);if(T&&!T.closed)return T.reader;let B=()=>{let Re=`${x}:${v}`,ae=ee.get(Re);ae&&ae.backpressure.decrement()},oe=A,re=!0,W=!1,q=[],ce=0,te={async read(){if(W)return U(Ge("closed","Reader is closed"));if(ce<q.length){let me=q[ce++];return oe=me.position+1,B(),r({type:"stream_read",workflowId:x,namespace:v,position:me.position,ts:Date.now()}),Q(me.value)}let Re=`${x}:${v}`,ae=Date.now(),de=ee.has(Re),se=await b.getMetadata(x,v),pe=se.ok&&se.value!==void 0;for(;Date.now()-ae<O;){let me=await b.read(x,v,oe,100);if(!me.ok)return U(Ge("store_error",me.error.message,me.error));let De=me.value;if(De.length>0){q=De,ce=1;let Me=De[0];return oe=Me.position+1,B(),r({type:"stream_read",workflowId:x,namespace:v,position:Me.position,ts:Date.now()}),Q(Me.value)}let Ie=ee.has(Re),he=await b.getMetadata(x,v),rt=he.ok&&he.value!==void 0;if(Ie&&(de=!0),rt&&(pe=!0),he.ok&&he.value?.closed)return re=!1,U($e(oe));if(de&&!Ie&&!rt)return re=!1,U($e(oe));pe&&!Ie&&he.ok&&he.value?.closed,await new Promise(Me=>setTimeout(Me,C))}return re=!1,U($e(oe))},close(){W=!0,re=!1,q=[],R.delete(j)},get readable(){return re},get position(){return oe},get namespace(){return v}};return R.set(j,{reader:te,position:oe,closed:W}),te},l.streamForEach=async(f,v,A)=>{let C=A?.checkpointInterval??1,O=A?.concurrency??1,j=[],T=0,B=-1,oe=W=>typeof W=="object"&&W!==null&&"read"in W&&typeof W.read=="function",re=async(W,q,ce,te)=>{let ae=C>0&&q%C===0?`stream-foreach:${te}:pos-${ce}`:void 0,de=ae??`stream-item-${ce}`,se=await l(de,()=>v(W,q),{key:ae});return{index:q,position:ce,result:se}};if(oe(f))if(O<=1){let W=f.position,q=await f.read();for(;q.ok;){let ce=q.value,{result:te}=await re(ce,T,W,f.namespace);j.push(te),B=W,T++,W=f.position,q=await f.read()}}else{let W=new Map,q=0,ce=0,te=new Array(O).fill(null),Re=async()=>{for(let me=0;me<te.length;me++)if(te[me]===null)return me;let se=te.filter(me=>me!==null),pe=await Promise.race(se);return W.set(pe.index,{position:pe.position,result:pe.result}),te[pe.slotIndex]=null,pe.slotIndex},ae=f.position,de=await f.read();for(;de.ok;){let se=await Re(),pe=q,me=ae,De=de.value,Ie=se;te[se]=re(De,pe,me,f.namespace).then(he=>({slotIndex:Ie,...he})),ce++,q++,ae=f.position,de=await f.read()}for(let se=0;se<te.length;se++)if(te[se]!==null){let pe=await te[se];W.set(pe.index,{position:pe.position,result:pe.result})}for(let se=0;se<ce;se++){let pe=W.get(se);pe&&(j.push(pe.result),B=pe.position,T++)}}else if(O<=1){let W=0;for await(let q of f){let{result:ce}=await re(q,W,W,"async-iterable");j.push(ce),B=W,T++,W++}}else{let W=new Map,q=0,ce=0,te=new Array(O).fill(null),Re=async()=>{for(let se=0;se<te.length;se++)if(te[se]===null)return se;let ae=te.filter(se=>se!==null),de=await Promise.race(ae);return W.set(de.index,de.result),te[de.slotIndex]=null,de.slotIndex};for await(let ae of f){let de=await Re(),se=q,pe=de;te[de]=re(ae,se,se,"async-iterable").then(me=>({slotIndex:pe,...me})),ce++,q++}for(let ae=0;ae<te.length;ae++)if(te[ae]!==null){let de=await te[ae];W.set(de.index,de.result)}for(let ae=0;ae<ce;ae++)W.has(ae)&&(j.push(W.get(ae)),B=ae,T++)}return{results:j,processedCount:T,lastPosition:B}},l.if=E.if,l.label=E.label,l.branch=E.branch,l.arm=E.arm,l.forEach=E.forEach,l.item=E.item,l.dep=E.dep,l.run=(f,v,A)=>l(f,typeof v=="function"?v:()=>v,A),l.workflow=(f,v,A)=>l(f,v,A),l.andThen=(f,v,A,C)=>l(f,()=>A(v),C),l.match=(f,v,A,C)=>l(f,async()=>{let O=await v;return O.ok?Q(await A.ok(O.value)):Q(await A.err(O.error,O.cause))},C),l.all=(f,v,A)=>{let C=A!==void 0&&Object.prototype.hasOwnProperty.call(A,"key")?A:{...A,key:void 0};return l(f,async()=>Q(await E.all(f,v)),C)},l.map=(f,v,A,C)=>{let O=C!==void 0&&Object.prototype.hasOwnProperty.call(C,"key")?C:{...C,key:void 0};return l(f,async()=>Q(await E.map(f,v,A,C)),O)},l},Te=({step:E})=>L({step:$(E),deps:le,ctx:p}),ue;try{ue=await Fe(Te,{onError:H,onEvent:J,catchUnexpected:F,workflowId:x,workflowName:t,context:X,_workflowSignal:I})}finally{I&&I.removeEventListener("abort",ne)}let Se=performance.now()-k;if(!ue.ok){let E;if(Je(ue.cause)&&(E=ue.cause),!E&&K&&Et(ue.error)){let l=ue.cause;l!=null&&typeof l=="object"&&"name"in l&&l.name==="AbortError"&&(E={type:"WORKFLOW_CANCELLED",reason:Z??(typeof I?.reason=="string"?I.reason:I?.reason instanceof Error?I.reason.message:void 0),lastStepKey:M})}if(E)return r({type:"workflow_cancelled",workflowId:x,ts:Date.now(),durationMs:Se,reason:E.reason,lastStepKey:E.lastStepKey}),E&&!Je(ue.cause)?U(ue.error,{cause:E}):ue}if(ue.ok&&K){let E=Z??(typeof I?.reason=="string"?I.reason:I?.reason instanceof Error?I.reason.message:void 0);r({type:"workflow_cancelled",workflowId:x,ts:Date.now(),durationMs:Se,reason:E,lastStepKey:M});let l={type:"WORKFLOW_CANCELLED",reason:E,lastStepKey:M};return U(F(l),{cause:l})}return ue.ok?r({type:"workflow_success",workflowId:x,ts:Date.now(),durationMs:Se}):r({type:"workflow_error",workflowId:x,ts:Date.now(),durationMs:Se,error:ue.error}),ue}function S(u,L,_){let x,le,m;return typeof u=="string"?(x=u,le=L,m=_):(le=u,m=L),w(x,le,m)}async function h(u,L,_){let x,le,m;typeof u=="string"?(x=u,le=L,m=_):(le=u,m=L);let X=Ke(),I=m?.onEvent,H={...m,onEvent:(G,d)=>{X.handleEvent(G);try{I?.(G,d)}catch{}}},ie,fe;try{ie=await w(x,le,H)}catch(G){let d=g?.catchUnexpected??Ve;ie=U(d(G),{cause:G})}finally{fe=X.getResumeState()}return{result:ie,resumeState:fe}}return{run:S,runWithState:h}}var et;function Jt(){let t=new Map;return{async save(e,o){t.set(e,{snapshot:o,updatedAt:new Date})},async load(e){return t.get(e)?.snapshot??null},async delete(e){t.delete(e)},async list(e){let o=e?.prefix??"",i=e?.limit??100,g=[];for(let[w,S]of t.entries())if(!(o&&!w.startsWith(o))&&(g.push({id:w,updatedAt:S.updatedAt.toISOString()}),g.length>=i))break;return g.sort((w,S)=>S.updatedAt.localeCompare(w.updatedAt)),g},async close(){}}}function zt(){return et===void 0&&(et=Jt()),et}function bt(t){return typeof t.tryAcquire=="function"&&typeof t.release=="function"}var tt=new Set,vt={async run(t,e,o){let{id:i,store:g,version:w=1,allowConcurrent:S=!1,lockTtlMs:h=6e4,heartbeatIntervalMs:z,abortOnLeaseLoss:u,metadata:L,signal:_,createContext:x,onEvent:le,onError:m,onVersionMismatch:X,idempotencyKey:I,input:J}=o,H=g??zt();if(I){let F=`idem:${I}`;try{let Y=await H.load(F);if(Y){if(J!==void 0&&Y.metadata?.input!==void 0){let Ee=JSON.stringify(Y.metadata.input),ye=JSON.stringify(J);if(Ee!==ye)return U({type:"IDEMPOTENCY_CONFLICT",idempotencyKey:I,workflowId:i,message:`Idempotency key '${I}' already used with different input for workflow '${i}'.`})}if(Y.execution.status==="completed"&&Y.metadata?.finalResult!==void 0)return Y.metadata.finalResult;if(Y.execution.status==="running")return U({type:"CONCURRENT_EXECUTION",workflowId:i,message:`Workflow '${i}' with idempotency key '${I}' is already running.`,reason:"cross-process"})}}catch{}}if(!S&&tt.has(i)){let F={type:"CONCURRENT_EXECUTION",workflowId:i,message:`Workflow '${i}' is already running. Set allowConcurrent: true to allow parallel executions.`,reason:"in-process"};return U(F)}let ie=null;if(!S&&bt(H)){let F;try{F=await H.tryAcquire(i,{ttlMs:h})}catch(Y){let Ee={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:Y,message:`Failed to acquire lock for workflow '${i}': ${Y instanceof Error?Y.message:String(Y)}`};return U(Ee)}if(F===null){let Y={type:"CONCURRENT_EXECUTION",workflowId:i,message:`Workflow '${i}' is already running (lease held by another process). Set allowConcurrent: true to allow parallel executions.`,reason:"cross-process"};return U(Y)}ie=F.ownerToken}let fe,G,d=H;if(ie&&typeof d.renew=="function"){let F=z??Math.floor(h/3);G=new AbortController,fe=setInterval(async()=>{try{await d.renew(i,ie,{ttlMs:h})||G.abort(new Error("Lease expired"))}catch{G.abort(new Error("Lease renewal failed"))}},F)}tt.add(i);try{let F=null;try{F=await H.load(i)}catch(r){let s={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:r,message:`Failed to load state for workflow '${i}': ${r instanceof Error?r.message:String(r)}`};return U(s)}if(F)try{Tt(F)}catch(r){if(r instanceof be){let s={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:r,message:`Invalid snapshot format for workflow '${i}': ${r.message}`};return U(s)}throw r}if(F){let r=typeof F.metadata?.version=="number"?F.metadata.version:1;if(r!==w){let s={type:"VERSION_MISMATCH",workflowId:i,storedVersion:r,requestedVersion:w,currentVersion:w,message:`Workflow '${i}' has stored state at version ${r} but this run requested version ${w}. Migrate the stored state to the new version, or clear state for this id (e.g. durable.deleteState(store, '${i}')) and re-run.`};if(!X)return U(s);let a=await Promise.resolve(X({id:i,storedVersion:r,requestedVersion:w}));if(a==="throw")return U(s);if(a==="clear"){try{await H.delete(i)}catch{}F=null}else F=a.migratedSnapshot}}let Y=(r,s)=>{le&&le(r,s)},Ee=Ke(),ye={snapshot:F,onAfterStep:async(r,s,a,n)=>{try{let y=Ee.getResumeState(),k={};for(let[P,D]of y.steps)if(D.result.ok)k[P]={ok:!0,value:D.result.value};else{let K=D.result.cause,Z=K instanceof Error?ze(K):Ye(K),M=D.meta?.origin==="throw"?"throw":"result";k[P]={ok:!1,error:D.result.error,cause:Z,meta:{origin:M}}}let c={formatVersion:1,workflowName:i,steps:k,execution:{status:"running",lastUpdated:new Date().toISOString(),currentStepId:r},metadata:{...F?.metadata??{},...L,version:w,lastStepKey:r}},b=F?Rt(F,c):c;if(b.warnings&&b.warnings.length>0){let P=new Set(Object.keys(c.steps)),D=b.warnings.filter(K=>!P.has(K.stepId));b={...b,warnings:D.length>0?D:void 0}}await H.save(i,b),Y({type:"persist_success",workflowId:a,stepKey:r,ts:Date.now(),context:n},n)}catch(y){Y({type:"persist_error",workflowId:a,stepKey:r,error:y,ts:Date.now(),context:n},n)}},onEvent:(r,s)=>{Ee.handleEvent(r),Y(r,s)},onError:m,signal:G&&_?AbortSignal.any([_,G.signal]):G?.signal??_,createContext:x},we;try{we=Qe(i,t,ye)}catch(r){if(r instanceof be){let s={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:r,message:`Invalid snapshot format for workflow '${i}': ${r.message}`};return U(s)}throw r}let p;try{p=await we.run(e)}catch(r){if(r instanceof be||r instanceof Pe){let s={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:r,message:`Invalid snapshot format for workflow '${i}': ${r.message}`};return U(s)}throw r}if(u!==!1&&G?.signal.aborted)return U({type:"LEASE_EXPIRED",workflowId:i,message:`Lease expired for workflow '${i}' during execution. The workflow may have been reclaimed by another process.`});if(p.ok){try{await H.delete(i)}catch(r){let s={type:"PERSISTENCE_ERROR",operation:"delete",workflowId:i,cause:r,message:`Failed to delete state for workflow '${i}': ${r instanceof Error?r.message:String(r)}`};return U(s)}if(I){let r=`idem:${I}`;try{await H.save(r,{formatVersion:1,steps:{},execution:{status:"completed",lastUpdated:new Date().toISOString(),completedAt:new Date().toISOString()},metadata:{workflowId:i,idempotencyKey:I,input:J,finalResult:p}})}catch{}}}return p}finally{if(tt.delete(i),fe&&clearInterval(fe),ie!==null&&bt(H))try{await H.release(i,ie)}catch{}}},async clearState(t){let e=t;if(typeof e.clear=="function"){await e.clear();return}let o=100;for(;;){let i=await t.list({limit:o});if(i.length===0)break;let g=i.map(w=>w.id);if(await this.deleteStates(t,g,{continueOnError:!0}),i.length<o)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,o={}){let{concurrency:i=10,continueOnError:g=!0}=o;if(e.length===0)return{deleted:0};let w=[],S=0,h=async u=>{try{await t.delete(u),S++}catch(L){if(g)w.push({id:u,error:L});else throw L}},z=Math.max(1,i);for(let u=0;u<e.length;u+=z){let L=e.slice(u,u+z);await Promise.all(L.map(_=>h(_)))}return w.length>0?{deleted:S,errors:w}:{deleted:S}},async listPending(t,e){try{return await t.list(e)}catch{return[]}}};function Yt(t){let{store:e,workflows:o,concurrency:i=5,onEvent:g,onError:w}=t,S=new Map,h,z=!1,u=!1;function L(J){try{g?.(J)}catch{}}async function _(J,H){if(!o[J])throw new Error(`Unknown workflow: '${J}'. Registered: ${Object.keys(o).join(", ")}`);let fe=H?.id??`${J}:${At()}`,G={formatVersion:1,workflowName:J,steps:{},execution:{status:"running",lastUpdated:new Date().toISOString()},metadata:{engineState:"queued",workflowName:J,input:H?.input??null,idempotencyKey:H?.idempotencyKey,enqueuedAt:new Date().toISOString(),...H?.metadata}};return await e.save(fe,G),L({type:"workflow_enqueued",workflowName:J,id:fe,ts:Date.now()}),fe}async function x(){if(u)return 0;u=!0;try{let J=await e.list({limit:i*2}),H=0,ie=[];for(let G of J){if(ie.length>=i)break;let d=await e.load(G.id);d&&d.metadata?.engineState==="queued"&&typeof d.metadata?.workflowName=="string"&&ie.push({id:G.id,workflowName:d.metadata.workflowName,snapshot:d})}let fe=await Promise.allSettled(ie.map(async({id:G,workflowName:d,snapshot:F})=>{let Y=o[d];if(!Y)return;let Ee={...F,metadata:{...F.metadata,engineState:"processing"}};await e.save(G,Ee),L({type:"workflow_started",workflowName:d,id:G,ts:Date.now()});let ye=await vt.run(Y.deps,Y.fn,{id:G,store:e,idempotencyKey:F.metadata?.idempotencyKey,input:F.metadata?.input,...Y.durableDefaults});ye.ok?L({type:"workflow_completed",workflowName:d,id:G,ts:Date.now()}):L({type:"workflow_failed",workflowName:d,id:G,error:ye.error,ts:Date.now()}),H++}));for(let G of fe)if(G.status==="rejected")try{w?.(G.reason)}catch{}return L({type:"engine_tick",ts:Date.now(),processed:H}),H}finally{u=!1}}function le(J,H){let ie=H?.id?`schedule:${H.id}`:`schedule:${At()}`;H.immediate&&_(J,H).catch(G=>{try{w?.(G)}catch{}});let fe=setInterval(()=>{_(J,H).catch(G=>{try{w?.(G)}catch{}})},H.intervalMs);return S.set(ie,fe),L({type:"schedule_created",workflowName:J,scheduleId:ie,intervalMs:H.intervalMs,ts:Date.now()}),ie}function m(J){let H=S.get(J);return H?(clearInterval(H),S.delete(J),L({type:"schedule_removed",scheduleId:J,ts:Date.now()}),!0):!1}function X(J=1e3){z||(z=!0,L({type:"engine_start",ts:Date.now()}),x().catch(H=>{try{w?.(H)}catch{}}),h=setInterval(()=>{x().catch(H=>{try{w?.(H)}catch{}})},J))}async function I(){if(z){z=!1,h&&(clearInterval(h),h=void 0);for(let[J,H]of S)clearInterval(H),S.delete(J);for(;u;)await new Promise(J=>setTimeout(J,50));L({type:"engine_stop",ts:Date.now()})}}return{enqueue:_,schedule:le,unschedule:m,start:X,stop:I,tick:x,status:()=>({running:z,pendingSchedules:S.size})}}export{Yt as createEngine};
11
+ //# sourceMappingURL=engine.js.map