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.
- package/dist/adapters.cjs +2 -2
- package/dist/adapters.cjs.map +1 -1
- package/dist/adapters.d.cts +3 -1
- package/dist/adapters.d.ts +3 -1
- package/dist/adapters.js +2 -2
- package/dist/adapters.js.map +1 -1
- package/dist/batch.cjs +2 -2
- package/dist/batch.cjs.map +1 -1
- package/dist/batch.d.cts +3 -1
- package/dist/batch.d.ts +3 -1
- package/dist/batch.js +2 -2
- package/dist/batch.js.map +1 -1
- package/dist/circuit-breaker.cjs +2 -2
- package/dist/circuit-breaker.cjs.map +1 -1
- package/dist/circuit-breaker.d.cts +3 -1
- package/dist/circuit-breaker.d.ts +3 -1
- package/dist/circuit-breaker.js +2 -2
- package/dist/circuit-breaker.js.map +1 -1
- package/dist/conditional.d.cts +3 -1
- package/dist/conditional.d.ts +3 -1
- package/dist/core.cjs +2 -2
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +2 -1
- package/dist/core.d.ts +2 -1
- package/dist/core.js +2 -2
- package/dist/core.js.map +1 -1
- package/dist/diagnostics.cjs +3 -3
- package/dist/diagnostics.cjs.map +1 -1
- package/dist/diagnostics.d.cts +3 -1
- package/dist/diagnostics.d.ts +3 -1
- package/dist/diagnostics.js +3 -3
- package/dist/diagnostics.js.map +1 -1
- package/dist/durable.cjs +3 -3
- package/dist/durable.cjs.map +1 -1
- package/dist/durable.d.cts +8 -361
- package/dist/durable.d.ts +8 -361
- package/dist/durable.js +3 -3
- package/dist/durable.js.map +1 -1
- package/dist/engine.cjs +11 -0
- package/dist/engine.cjs.map +1 -0
- package/dist/engine.d.cts +114 -0
- package/dist/engine.d.ts +114 -0
- package/dist/engine.js +11 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors-entry-CMH73Eym.d.cts +339 -0
- package/dist/errors-entry-DOt5UUl4.d.ts +339 -0
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.cts +2 -318
- package/dist/errors.d.ts +2 -318
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/fetch.cjs +2 -2
- package/dist/fetch.cjs.map +1 -1
- package/dist/fetch.d.cts +3 -1
- package/dist/fetch.d.ts +3 -1
- package/dist/fetch.js +2 -2
- package/dist/fetch.js.map +1 -1
- package/dist/functional.cjs +1 -1
- package/dist/functional.cjs.map +1 -1
- package/dist/functional.d.cts +2 -0
- package/dist/functional.d.ts +2 -0
- package/dist/functional.js +1 -1
- package/dist/functional.js.map +1 -1
- package/dist/{guards-PU64_GKv.d.cts → guards-B79mP5Q8.d.cts} +3 -3
- package/dist/{guards-B5lgMJq0.d.ts → guards-BUq6NJCM.d.ts} +3 -3
- package/dist/{hitl-Dyiy0R1v.d.cts → hitl-BCqkMAHw.d.cts} +2 -2
- package/dist/{hitl-BjeSm1sJ.d.ts → hitl-BZtPx0aU.d.ts} +2 -2
- package/dist/hitl.cjs +2 -2
- package/dist/hitl.cjs.map +1 -1
- package/dist/hitl.d.cts +9 -6
- package/dist/hitl.d.ts +9 -6
- package/dist/hitl.js +2 -2
- package/dist/hitl.js.map +1 -1
- package/dist/index-BVUAOWGG.d.ts +417 -0
- package/dist/index-CQnpmUcC.d.cts +417 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/otel.d.cts +3 -1
- package/dist/otel.d.ts +3 -1
- package/dist/{persistence-entry-B3ukwbb5.d.ts → persistence-entry-ClFhxd2Q.d.ts} +11 -5
- package/dist/{persistence-entry-CgVzswbg.d.cts → persistence-entry-jflY61az.d.cts} +11 -5
- package/dist/persistence.d.cts +6 -3
- package/dist/persistence.d.ts +6 -3
- package/dist/policies.d.cts +3 -1
- package/dist/policies.d.ts +3 -1
- package/dist/ratelimit.cjs +2 -2
- package/dist/ratelimit.cjs.map +1 -1
- package/dist/ratelimit.d.cts +3 -1
- package/dist/ratelimit.d.ts +3 -1
- package/dist/ratelimit.js +2 -2
- package/dist/ratelimit.js.map +1 -1
- package/dist/reliability.cjs +2 -2
- package/dist/reliability.cjs.map +1 -1
- package/dist/reliability.d.cts +3 -1
- package/dist/reliability.d.ts +3 -1
- package/dist/reliability.js +2 -2
- package/dist/reliability.js.map +1 -1
- package/dist/resolver.cjs +2 -2
- package/dist/resolver.cjs.map +1 -1
- package/dist/resolver.d.cts +5 -3
- package/dist/resolver.d.ts +5 -3
- package/dist/resolver.js +2 -2
- package/dist/resolver.js.map +1 -1
- package/dist/resource.cjs +2 -2
- package/dist/resource.cjs.map +1 -1
- package/dist/resource.d.cts +3 -1
- package/dist/resource.d.ts +3 -1
- package/dist/resource.js +2 -2
- package/dist/resource.js.map +1 -1
- package/dist/result/retry.cjs +1 -1
- package/dist/result/retry.cjs.map +1 -1
- package/dist/result/retry.d.cts +2 -0
- package/dist/result/retry.d.ts +2 -0
- package/dist/result/retry.js +1 -1
- package/dist/result/retry.js.map +1 -1
- package/dist/result.cjs +1 -1
- package/dist/result.cjs.map +1 -1
- package/dist/result.d.cts +8 -23
- package/dist/result.d.ts +8 -23
- package/dist/result.js +1 -1
- package/dist/result.js.map +1 -1
- package/dist/{run-entry-C1uFytM6.d.cts → run-entry-rw7zll_G.d.ts} +16 -45
- package/dist/{run-entry-C1uFytM6.d.ts → run-entry-yQu63Yj9.d.cts} +16 -45
- package/dist/run.cjs +2 -2
- package/dist/run.cjs.map +1 -1
- package/dist/run.d.cts +3 -1
- package/dist/run.d.ts +3 -1
- package/dist/run.js +2 -2
- package/dist/run.js.map +1 -1
- package/dist/saga.cjs +2 -2
- package/dist/saga.cjs.map +1 -1
- package/dist/saga.d.cts +3 -1
- package/dist/saga.d.ts +3 -1
- package/dist/saga.js +2 -2
- package/dist/saga.js.map +1 -1
- package/dist/singleflight.d.cts +3 -1
- package/dist/singleflight.d.ts +3 -1
- package/dist/streaming.cjs +4 -4
- package/dist/streaming.cjs.map +1 -1
- package/dist/streaming.d.cts +5 -3
- package/dist/streaming.d.ts +5 -3
- package/dist/streaming.js +4 -4
- package/dist/streaming.js.map +1 -1
- package/dist/testing.cjs +8 -4
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +87 -4
- package/dist/testing.d.ts +87 -4
- package/dist/testing.js +8 -4
- package/dist/testing.js.map +1 -1
- package/dist/{types-wa_wTOn3.d.ts → types-CuWK5AlK.d.ts} +1 -1
- package/dist/{types-DUWrNIJu.d.cts → types-uR3JpwvF.d.cts} +1 -1
- package/dist/webhook.cjs +2 -2
- package/dist/webhook.cjs.map +1 -1
- package/dist/webhook.d.cts +7 -4
- package/dist/webhook.d.ts +7 -4
- package/dist/webhook.js +2 -2
- package/dist/webhook.js.map +1 -1
- package/dist/workflow.cjs +3 -3
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +47 -11
- package/dist/workflow.d.ts +47 -11
- package/dist/workflow.js +3 -3
- package/dist/workflow.js.map +1 -1
- package/package.json +15 -1
package/dist/workflow.d.cts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { d as Err,
|
|
2
|
-
export {
|
|
3
|
-
import { g as StepResult, R as ResumeState,
|
|
4
|
-
export { C as CausesOfDeps, i as ExecutionOptions, J as JSONValue, j as ResumeStateEntry, k as RunConfig, l as RunWithStateResult, m as SerializedCause, n as SnapshotDecodeError, o as SnapshotFormatError, p as SnapshotMismatchError, q as SnapshotWarning, r as StepCache,
|
|
5
|
-
export {
|
|
6
|
-
export { c as clearStep, a as createApprovalStateCollector, b as createApprovalStep, e as createResumeStateCollector, g as gatedStep, d as getPendingApprovals, f as getPendingHooks, h as hasPendingApproval, j as hasPendingHook, i as injectApproval, k as injectHook, p as pendingApproval } from './hitl-
|
|
1
|
+
import { d as Err, R as Result } from './run-entry-yQu63Yj9.cjs';
|
|
2
|
+
export { ah as BackoffStrategy, af as RetryOptions, ai as RunOptions, aj as RunOptionsWithCatch, ak as RunOptionsWithoutCatch, ae as RunStep, al as STEP_TIMEOUT_MARKER, am as ScopeType, ag as StepOptions, an as StepTimeoutError, ao as StepTimeoutMarkerMeta, ap as TimeoutOptions, ad as WorkflowEvent, aq as getStepTimeoutMeta, ar as isStepTimeoutError, as as run } from './run-entry-yQu63Yj9.cjs';
|
|
3
|
+
import { g as StepResult, R as ResumeState, d as WorkflowSnapshot, c as PendingHook, a as Workflow, e as AnyResultFn, h as WorkflowOptions, E as ErrorsOfDeps } from './persistence-entry-jflY61az.cjs';
|
|
4
|
+
export { C as CausesOfDeps, i as ExecutionOptions, J as JSONValue, j as ResumeStateEntry, k as RunConfig, l as RunWithStateResult, m as SerializedCause, n as SnapshotDecodeError, o as SnapshotFormatError, p as SnapshotMismatchError, q as SnapshotWarning, r as StepCache, W as WorkflowCancelledError, f as WorkflowContext, s as WorkflowFn, t as assertValidSnapshot, u as isWorkflowSnapshot, v as looksLikeWorkflowSnapshot, w as mergeSnapshots, x as validateSnapshot } from './persistence-entry-jflY61az.cjs';
|
|
5
|
+
export { a as isApprovalRejected, b as isPendingApproval, c as isPendingHook, d as isResumeState, e as isStepComplete, i as isWorkflowCancelled } from './guards-B79mP5Q8.cjs';
|
|
6
|
+
export { c as clearStep, a as createApprovalStateCollector, b as createApprovalStep, e as createResumeStateCollector, g as gatedStep, d as getPendingApprovals, f as getPendingHooks, h as hasPendingApproval, j as hasPendingHook, i as injectApproval, k as injectHook, p as pendingApproval } from './hitl-BCqkMAHw.cjs';
|
|
7
|
+
import { U as UnexpectedError } from './errors-entry-CMH73Eym.cjs';
|
|
8
|
+
import { StandardSchemaV1 } from '@standard-schema/spec';
|
|
7
9
|
export { Duration, Duration as DurationType, days, hours, isDuration, millis, minutes, seconds, toDays, toHours, toMillis, toMinutes, toSeconds } from './duration.cjs';
|
|
8
|
-
import './types-
|
|
10
|
+
import './types-uR3JpwvF.cjs';
|
|
11
|
+
import './tagged-error.cjs';
|
|
9
12
|
|
|
10
13
|
/**
|
|
11
14
|
* Serialization for ResumeState to/from JSON-safe format.
|
|
@@ -156,12 +159,12 @@ declare function createHook(): {
|
|
|
156
159
|
* The error union is automatically computed from all declared functions:
|
|
157
160
|
* - Each function's error type is extracted
|
|
158
161
|
* - Union of all errors is created
|
|
159
|
-
* - Uncaught exceptions are mapped via `catchUnexpected` (default:
|
|
162
|
+
* - Uncaught exceptions are mapped via `catchUnexpected` (default: `UnexpectedError`).
|
|
160
163
|
*
|
|
161
164
|
* ## Strict Mode
|
|
162
165
|
*
|
|
163
166
|
* Optional `catchUnexpected` maps uncaught exceptions to a typed error (closed union):
|
|
164
|
-
* - When omitted, the default mapper returns
|
|
167
|
+
* - When omitted, the default mapper returns an `UnexpectedError` instance.
|
|
165
168
|
* - When provided, your error union is exactly `E | U`.
|
|
166
169
|
*
|
|
167
170
|
* @param deps - Object mapping names to Result-returning functions.
|
|
@@ -173,7 +176,7 @@ declare function createHook(): {
|
|
|
173
176
|
* - `cache`: Step result cache (Map or custom StepCache implementation)
|
|
174
177
|
* - `resumeState`: Pre-populated step results for workflow replay
|
|
175
178
|
* - `createContext`: Factory for per-run context (passed to onEvent)
|
|
176
|
-
* - `catchUnexpected`: Optional; map uncaught exceptions to a typed error (default:
|
|
179
|
+
* - `catchUnexpected`: Optional; map uncaught exceptions to a typed error (default: `UnexpectedError`)
|
|
177
180
|
*
|
|
178
181
|
* @returns A workflow function that accepts your workflow logic and returns an AsyncResult.
|
|
179
182
|
* The error type is automatically inferred from the `deps` parameter.
|
|
@@ -284,6 +287,39 @@ declare function createHook(): {
|
|
|
284
287
|
declare function createWorkflow<U = UnexpectedError, C = void>(workflowName: string): Workflow<never, U, unknown, C>;
|
|
285
288
|
declare function createWorkflow<const Deps extends Readonly<Record<string, AnyResultFn>>, U = UnexpectedError, C = void>(workflowName: string, deps: Deps, options?: WorkflowOptions<ErrorsOfDeps<Deps>, U, C>): Workflow<ErrorsOfDeps<Deps>, U, Deps, C>;
|
|
286
289
|
|
|
290
|
+
/**
|
|
291
|
+
* Optional input validation using the Standard Schema spec.
|
|
292
|
+
* Works with Zod, Valibot, ArkType, or any Standard Schema-compliant library.
|
|
293
|
+
*
|
|
294
|
+
* @see https://github.com/standard-schema/standard-schema
|
|
295
|
+
*/
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Tagged error returned when workflow input fails schema validation.
|
|
299
|
+
* Follows awaitly's tagged error object pattern (with `type` field).
|
|
300
|
+
*/
|
|
301
|
+
type InputValidationError = {
|
|
302
|
+
type: "INPUT_VALIDATION_ERROR";
|
|
303
|
+
issues: Array<{
|
|
304
|
+
message: string;
|
|
305
|
+
path?: Array<string | number>;
|
|
306
|
+
}>;
|
|
307
|
+
message: string;
|
|
308
|
+
};
|
|
309
|
+
/**
|
|
310
|
+
* Type guard for InputValidationError.
|
|
311
|
+
*/
|
|
312
|
+
declare function isInputValidationError(e: unknown): e is InputValidationError;
|
|
313
|
+
/**
|
|
314
|
+
* Validate input against a Standard Schema.
|
|
315
|
+
* Supports both sync and async schema validation.
|
|
316
|
+
*
|
|
317
|
+
* @param schema - A Standard Schema-compliant schema object
|
|
318
|
+
* @param input - The input value to validate
|
|
319
|
+
* @returns Result with validated value or InputValidationError
|
|
320
|
+
*/
|
|
321
|
+
declare function validateInput<T>(schema: StandardSchemaV1<T>, input: unknown): Promise<Result<T, InputValidationError>>;
|
|
322
|
+
|
|
287
323
|
/**
|
|
288
324
|
* Workflow Diagram DSL types.
|
|
289
325
|
*
|
|
@@ -370,4 +406,4 @@ interface WorkflowDiagramDSL {
|
|
|
370
406
|
workflowReturnType?: string;
|
|
371
407
|
}
|
|
372
408
|
|
|
373
|
-
export { AnyResultFn, ErrorsOfDeps, HOOK_STEP_KEY_PREFIX, PendingHook, type PersistedWorkflowState, ResumeState, type SerializedResumeState, StepResult, type StoreLoadResult, type StoreSaveInput, Workflow, type WorkflowDiagramDSL, type WorkflowDiagramSourceLocation, type WorkflowDiagramState, type WorkflowDiagramStateType, type WorkflowDiagramTransition, WorkflowOptions, WorkflowSnapshot, createHook, createWorkflow, deserializeResumeState, isSerializedResumeState, pendingHook, serializeResumeState, toResumeState };
|
|
409
|
+
export { AnyResultFn, ErrorsOfDeps, HOOK_STEP_KEY_PREFIX, type InputValidationError, PendingHook, type PersistedWorkflowState, ResumeState, type SerializedResumeState, StepResult, type StoreLoadResult, type StoreSaveInput, UnexpectedError, Workflow, type WorkflowDiagramDSL, type WorkflowDiagramSourceLocation, type WorkflowDiagramState, type WorkflowDiagramStateType, type WorkflowDiagramTransition, WorkflowOptions, WorkflowSnapshot, createHook, createWorkflow, deserializeResumeState, isInputValidationError, isSerializedResumeState, pendingHook, serializeResumeState, toResumeState, validateInput };
|
package/dist/workflow.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { d as Err,
|
|
2
|
-
export {
|
|
3
|
-
import { g as StepResult, R as ResumeState,
|
|
4
|
-
export { C as CausesOfDeps, i as ExecutionOptions, J as JSONValue, j as ResumeStateEntry, k as RunConfig, l as RunWithStateResult, m as SerializedCause, n as SnapshotDecodeError, o as SnapshotFormatError, p as SnapshotMismatchError, q as SnapshotWarning, r as StepCache,
|
|
5
|
-
export {
|
|
6
|
-
export { c as clearStep, a as createApprovalStateCollector, b as createApprovalStep, e as createResumeStateCollector, g as gatedStep, d as getPendingApprovals, f as getPendingHooks, h as hasPendingApproval, j as hasPendingHook, i as injectApproval, k as injectHook, p as pendingApproval } from './hitl-
|
|
1
|
+
import { d as Err, R as Result } from './run-entry-rw7zll_G.js';
|
|
2
|
+
export { ah as BackoffStrategy, af as RetryOptions, ai as RunOptions, aj as RunOptionsWithCatch, ak as RunOptionsWithoutCatch, ae as RunStep, al as STEP_TIMEOUT_MARKER, am as ScopeType, ag as StepOptions, an as StepTimeoutError, ao as StepTimeoutMarkerMeta, ap as TimeoutOptions, ad as WorkflowEvent, aq as getStepTimeoutMeta, ar as isStepTimeoutError, as as run } from './run-entry-rw7zll_G.js';
|
|
3
|
+
import { g as StepResult, R as ResumeState, d as WorkflowSnapshot, c as PendingHook, a as Workflow, e as AnyResultFn, h as WorkflowOptions, E as ErrorsOfDeps } from './persistence-entry-ClFhxd2Q.js';
|
|
4
|
+
export { C as CausesOfDeps, i as ExecutionOptions, J as JSONValue, j as ResumeStateEntry, k as RunConfig, l as RunWithStateResult, m as SerializedCause, n as SnapshotDecodeError, o as SnapshotFormatError, p as SnapshotMismatchError, q as SnapshotWarning, r as StepCache, W as WorkflowCancelledError, f as WorkflowContext, s as WorkflowFn, t as assertValidSnapshot, u as isWorkflowSnapshot, v as looksLikeWorkflowSnapshot, w as mergeSnapshots, x as validateSnapshot } from './persistence-entry-ClFhxd2Q.js';
|
|
5
|
+
export { a as isApprovalRejected, b as isPendingApproval, c as isPendingHook, d as isResumeState, e as isStepComplete, i as isWorkflowCancelled } from './guards-BUq6NJCM.js';
|
|
6
|
+
export { c as clearStep, a as createApprovalStateCollector, b as createApprovalStep, e as createResumeStateCollector, g as gatedStep, d as getPendingApprovals, f as getPendingHooks, h as hasPendingApproval, j as hasPendingHook, i as injectApproval, k as injectHook, p as pendingApproval } from './hitl-BZtPx0aU.js';
|
|
7
|
+
import { U as UnexpectedError } from './errors-entry-DOt5UUl4.js';
|
|
8
|
+
import { StandardSchemaV1 } from '@standard-schema/spec';
|
|
7
9
|
export { Duration, Duration as DurationType, days, hours, isDuration, millis, minutes, seconds, toDays, toHours, toMillis, toMinutes, toSeconds } from './duration.js';
|
|
8
|
-
import './types-
|
|
10
|
+
import './types-CuWK5AlK.js';
|
|
11
|
+
import './tagged-error.js';
|
|
9
12
|
|
|
10
13
|
/**
|
|
11
14
|
* Serialization for ResumeState to/from JSON-safe format.
|
|
@@ -156,12 +159,12 @@ declare function createHook(): {
|
|
|
156
159
|
* The error union is automatically computed from all declared functions:
|
|
157
160
|
* - Each function's error type is extracted
|
|
158
161
|
* - Union of all errors is created
|
|
159
|
-
* - Uncaught exceptions are mapped via `catchUnexpected` (default:
|
|
162
|
+
* - Uncaught exceptions are mapped via `catchUnexpected` (default: `UnexpectedError`).
|
|
160
163
|
*
|
|
161
164
|
* ## Strict Mode
|
|
162
165
|
*
|
|
163
166
|
* Optional `catchUnexpected` maps uncaught exceptions to a typed error (closed union):
|
|
164
|
-
* - When omitted, the default mapper returns
|
|
167
|
+
* - When omitted, the default mapper returns an `UnexpectedError` instance.
|
|
165
168
|
* - When provided, your error union is exactly `E | U`.
|
|
166
169
|
*
|
|
167
170
|
* @param deps - Object mapping names to Result-returning functions.
|
|
@@ -173,7 +176,7 @@ declare function createHook(): {
|
|
|
173
176
|
* - `cache`: Step result cache (Map or custom StepCache implementation)
|
|
174
177
|
* - `resumeState`: Pre-populated step results for workflow replay
|
|
175
178
|
* - `createContext`: Factory for per-run context (passed to onEvent)
|
|
176
|
-
* - `catchUnexpected`: Optional; map uncaught exceptions to a typed error (default:
|
|
179
|
+
* - `catchUnexpected`: Optional; map uncaught exceptions to a typed error (default: `UnexpectedError`)
|
|
177
180
|
*
|
|
178
181
|
* @returns A workflow function that accepts your workflow logic and returns an AsyncResult.
|
|
179
182
|
* The error type is automatically inferred from the `deps` parameter.
|
|
@@ -284,6 +287,39 @@ declare function createHook(): {
|
|
|
284
287
|
declare function createWorkflow<U = UnexpectedError, C = void>(workflowName: string): Workflow<never, U, unknown, C>;
|
|
285
288
|
declare function createWorkflow<const Deps extends Readonly<Record<string, AnyResultFn>>, U = UnexpectedError, C = void>(workflowName: string, deps: Deps, options?: WorkflowOptions<ErrorsOfDeps<Deps>, U, C>): Workflow<ErrorsOfDeps<Deps>, U, Deps, C>;
|
|
286
289
|
|
|
290
|
+
/**
|
|
291
|
+
* Optional input validation using the Standard Schema spec.
|
|
292
|
+
* Works with Zod, Valibot, ArkType, or any Standard Schema-compliant library.
|
|
293
|
+
*
|
|
294
|
+
* @see https://github.com/standard-schema/standard-schema
|
|
295
|
+
*/
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Tagged error returned when workflow input fails schema validation.
|
|
299
|
+
* Follows awaitly's tagged error object pattern (with `type` field).
|
|
300
|
+
*/
|
|
301
|
+
type InputValidationError = {
|
|
302
|
+
type: "INPUT_VALIDATION_ERROR";
|
|
303
|
+
issues: Array<{
|
|
304
|
+
message: string;
|
|
305
|
+
path?: Array<string | number>;
|
|
306
|
+
}>;
|
|
307
|
+
message: string;
|
|
308
|
+
};
|
|
309
|
+
/**
|
|
310
|
+
* Type guard for InputValidationError.
|
|
311
|
+
*/
|
|
312
|
+
declare function isInputValidationError(e: unknown): e is InputValidationError;
|
|
313
|
+
/**
|
|
314
|
+
* Validate input against a Standard Schema.
|
|
315
|
+
* Supports both sync and async schema validation.
|
|
316
|
+
*
|
|
317
|
+
* @param schema - A Standard Schema-compliant schema object
|
|
318
|
+
* @param input - The input value to validate
|
|
319
|
+
* @returns Result with validated value or InputValidationError
|
|
320
|
+
*/
|
|
321
|
+
declare function validateInput<T>(schema: StandardSchemaV1<T>, input: unknown): Promise<Result<T, InputValidationError>>;
|
|
322
|
+
|
|
287
323
|
/**
|
|
288
324
|
* Workflow Diagram DSL types.
|
|
289
325
|
*
|
|
@@ -370,4 +406,4 @@ interface WorkflowDiagramDSL {
|
|
|
370
406
|
workflowReturnType?: string;
|
|
371
407
|
}
|
|
372
408
|
|
|
373
|
-
export { AnyResultFn, ErrorsOfDeps, HOOK_STEP_KEY_PREFIX, PendingHook, type PersistedWorkflowState, ResumeState, type SerializedResumeState, StepResult, type StoreLoadResult, type StoreSaveInput, Workflow, type WorkflowDiagramDSL, type WorkflowDiagramSourceLocation, type WorkflowDiagramState, type WorkflowDiagramStateType, type WorkflowDiagramTransition, WorkflowOptions, WorkflowSnapshot, createHook, createWorkflow, deserializeResumeState, isSerializedResumeState, pendingHook, serializeResumeState, toResumeState };
|
|
409
|
+
export { AnyResultFn, ErrorsOfDeps, HOOK_STEP_KEY_PREFIX, type InputValidationError, PendingHook, type PersistedWorkflowState, ResumeState, type SerializedResumeState, StepResult, type StoreLoadResult, type StoreSaveInput, UnexpectedError, Workflow, type WorkflowDiagramDSL, type WorkflowDiagramSourceLocation, type WorkflowDiagramState, type WorkflowDiagramStateType, type WorkflowDiagramTransition, WorkflowOptions, WorkflowSnapshot, createHook, createWorkflow, deserializeResumeState, isInputValidationError, isSerializedResumeState, pendingHook, serializeResumeState, toResumeState, validateInput };
|
package/dist/workflow.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
function Jt(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]),y=t[2].toLowerCase();return{_tag:"Duration",millis:r*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[y]??1)}}var Ye="UNEXPECTED_ERROR";function Ke(e){return Ye}function H(e){return{ok:!0,value:e}}function L(e,t){let r=t?.cause;return{ok:!1,error:e,...r!==void 0?{cause:r}:{}}}var dt=e=>e===Ye||typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR";function Xt(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let t=e;if(typeof t._tag=="string"){let r=t._tag.trim();if(r)return r}if(typeof t.tag=="string"){let r=t.tag.trim();if(r)return r}if(typeof t.code=="string"){let r=t.code.trim();if(r)return r}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let r=e.name.trim();if(r)return r}}return"unknown"}function Yt(e,t){if(!(!t||!e))return t[e]}function Ge(e){let{intent:t,domain:r,owner:y,tags:g,stateChanges:O,emits:_,calls:x}=e;if(!t&&!r&&!y&&!g?.length&&!O?.length&&!_?.length&&!x?.length)return;let ee={};return t&&(ee.intent=t),r&&(ee.domain=r),y&&(ee.owner=y),g?.length&&(ee.tags=g),O?.length&&(ee.stateChanges=O),_?.length&&(ee.emits=_),x?.length&&(ee.calls=x),ee}function me(e,t,r,y,g){let O=Xt(e),_=Yt(O,t),x={tag:O,origin:r};return _!==void 0&&(x.classification=_),y!==void 0&&(x.attempt=y),g!==void 0&&(x.cumulativeDurationMs=g),x}var ge=Symbol.for("step_timeout_marker");function Xe(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:ge in e}function ft(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let t=e;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(ge in e)return e[ge]}}var Et=Symbol("early-exit");function be(e,t){return{[Et]:!0,error:e,meta:t}}function Te(e){return typeof e=="object"&&e!==null&&e[Et]===!0}var wt=Symbol("mapper-exception");function xe(e){return{[wt]:!0,thrown:e}}function Gt(e){return typeof e=="object"&&e!==null&&e[wt]===!0}function ze(e,t){let{backoff:r,initialDelay:y,maxDelay:g,jitter:O}=t,_;switch(r){case"fixed":_=y;break;case"linear":_=y*e;break;case"exponential":_=y*Math.pow(2,e-1);break}if(_=Math.min(_,g),O){let x=_*.25*Math.random();_=_+x}return Math.floor(_)}function Je(e){return new Promise(t=>setTimeout(t,e))}var ct=Symbol("timeout"),je=Symbol("timeout-option");function Zt(e){return typeof e=="object"&&e!==null&&e[je]===!0}async function Qt(e,t,r,y){let g=new AbortController,O=t.onTimeout??"error",_=()=>typeof O=="function"?O({name:r.name,key:r.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:r.name,stepKey:r.key,timeoutMs:t.ms,attempt:r.attempt},x;y?.aborted&&g.abort(y.reason);let ee;y&&!y.aborted&&(ee=()=>g.abort(y.reason),y.addEventListener("abort",ee,{once:!0}));let l=new Promise((W,C)=>{x=setTimeout(()=>{if(O!=="disconnect"&&g.abort(),O==="option"){C({[je]:!0,ms:t.ms});return}C({[ct]:!0,error:_()})},t.ms)}),te;t.signal?te=Promise.resolve(e(g.signal)):te=Promise.resolve(e());try{return await Promise.race([te,l])}catch(W){if(typeof W=="object"&&W!==null&&W[je]===!0)throw{[je]:!0,ms:t.ms};if(typeof W=="object"&&W!==null&&W[ct]===!0){O==="disconnect"&&te.catch(()=>{});let C=W.error;if(typeof C=="object"&&C!==null&&C.type!=="STEP_TIMEOUT"){let ie={timeoutMs:t.ms,stepName:r.name,stepKey:r.key,attempt:r.attempt};ge in C?C[ge]=ie:Object.defineProperty(C,ge,{value:ie,enumerable:!1,writable:!0,configurable:!1})}throw C}throw W}finally{clearTimeout(x),ee&&y&&y.removeEventListener("abort",ee)}}var Ce={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function _e(e,t){let{onError:r,onEvent:y,catchUnexpected:g,workflowId:O,workflowName:_,context:x,_workflowSignal:ee}=t&&typeof t=="object"?t:{},l=O??crypto.randomUUID(),te=g??Ke,W=[],C=0,ie=w=>w??`step_${++C}`,m=w=>{let ae=w.context!==void 0||x===void 0?w:{...w,context:x},ue=_!==void 0&&ae.workflowName===void 0?{...ae,workflowName:_}:ae;if(ue.type==="step_success"){let ke=ue.stepId;for(let Re=W.length-1;Re>=0;Re--){let pe=W[Re];if(pe.type==="race"&&!pe.winnerId){pe.winnerId=ke;break}}}y?.(ue,x)},z=be,V=w=>Te(w),le=(w,ae)=>w,Ae=w=>typeof w=="function"?!1:!!(w&&typeof w=="object"&&"ok"in w||w&&typeof w=="object"&&"then"in w&&typeof w.then=="function");try{let ae=function(p){let u={};for(let[a,o]of Object.entries(p))if(typeof o=="function")u[a]=o;else if(o&&typeof o=="object"&&"fn"in o)u[a]=o.fn;else throw new TypeError(`step.parallel: operation "${a}" must be a function or { fn, errors? } object`);return u},ue=function(p,u){let a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),n=!1;W.push({scopeId:a,type:"parallel"});let s=()=>{if(n)return;n=!0;let f=W.findIndex(T=>T.scopeId===a);f!==-1&&W.splice(f,1),m({type:"scope_end",workflowId:l,scopeId:a,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:l,scopeId:a,scopeType:"parallel",name:p,ts:Date.now()});try{let f=await u();if(s(),!f.ok)throw r?.(f.error,p,x),z(f.error,{origin:"result",resultCause:f.cause});return f.value}catch(f){throw s(),f}})()},ke=function(p,u){let a=Object.keys(p),o=u.name??`Parallel(${a.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),f=!1;W.push({scopeId:n,type:"parallel"});let T=()=>{if(f)return;f=!0;let v=W.findIndex(D=>D.scopeId===n);v!==-1&&W.splice(v,1),m({type:"scope_end",workflowId:l,scopeId:n,ts:Date.now(),durationMs:performance.now()-s})};m({type:"scope_start",workflowId:l,scopeId:n,scopeType:"parallel",name:o,ts:Date.now()});try{let v=await new Promise(I=>{if(a.length===0){I([]);return}let K=!1,G=a.length,N=new Array(a.length);for(let $=0;$<a.length;$++){let j=a[$],B=$;Promise.resolve(p[j]()).catch(A=>L({type:"PROMISE_REJECTED",cause:A},{cause:{type:"PROMISE_REJECTION",reason:A}})).then(A=>{if(!K){if(!A.ok){K=!0,I([{key:j,result:A}]);return}N[B]={key:j,result:A},G--,G===0&&I(N)}})}});T();let D={};for(let{key:I,result:K}of v){if(!K.ok)throw r?.(K.error,I,x),z(K.error,{origin:"result",resultCause:K.cause});D[I]=K.value}return D}catch(v){throw T(),v}})()};var ye=ae,he=ue,fe=ke;let w=(p,u,a)=>(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 o=a??{},n=Ge(o),s=p,f=o.key??p,T=o.key??p,{description:v,retry:D,timeout:I}=o,K=ie(f),G=y,N=G?performance.now():0,j=Ae(u)?()=>u:u,A={attempts:Math.max(1,D?.attempts??1),backoff:D?.backoff??Ce.backoff,initialDelay:D?.initialDelay??Ce.initialDelay,maxDelay:D?.maxDelay??Ce.maxDelay,jitter:D?.jitter??Ce.jitter,retryOn:D?.retryOn??Ce.retryOn,onRetry:D?.onRetry??Ce.onRetry};y&&m({type:"step_start",workflowId:l,stepId:K,stepKey:f,name:s,description:v,ts:Date.now(),...n&&{metadata:n}});let ce;for(let b=1;b<=A.attempts;b++){let E=G?performance.now():0;try{let i;if(I?i=await Qt(j,I,{name:s,key:f,attempt:b},ee):i=await j(),i.ok){let R=performance.now()-N;return m({type:"step_success",workflowId:l,stepId:K,stepKey:f,name:s,description:v,ts:Date.now(),durationMs:R,...n&&{metadata:n}}),T&&m({type:"step_complete",workflowId:l,stepKey:T,name:s,description:v,ts:Date.now(),durationMs:R,result:i,...n&&{metadata:n}}),i.value}if(ce=i,b<A.attempts&&A.retryOn(i.error,b)){let R=ze(b,A);m({type:"step_retry",workflowId:l,stepId:K,stepKey:f,name:s,ts:Date.now(),attempt:b+1,maxAttempts:A.attempts,delayMs:R,error:i.error,...n&&{metadata:n},diagnostics:me(i.error,o.errorMeta,"result",b,performance.now()-N)}),A.onRetry(i.error,b,R),await Je(R);continue}A.attempts>1&&m({type:"step_retries_exhausted",workflowId:l,stepId:K,stepKey:f,name:s,ts:Date.now(),durationMs:performance.now()-N,attempts:b,lastError:i.error,...n&&{metadata:n},diagnostics:me(i.error,o.errorMeta,"result",b,performance.now()-N)});break}catch(i){let R=performance.now()-E;if(Zt(i)){let P=i.ms;m({type:"step_timeout",workflowId:l,stepId:K,stepKey:f,name:s,ts:Date.now(),timeoutMs:P,attempt:b,...n&&{metadata:n},diagnostics:me(i,o.errorMeta,"timeout",b)}),m({type:"step_success",workflowId:l,stepId:K,stepKey:f,name:s,description:v,ts:Date.now(),durationMs:performance.now()-N,...n&&{metadata:n}}),T&&m({type:"step_complete",workflowId:l,stepKey:T,name:s,description:v,ts:Date.now(),durationMs:performance.now()-N,result:H(void 0),...n&&{metadata:n}});return}if(V(i))throw m({type:"step_aborted",workflowId:l,stepId:K,stepKey:f,name:s,description:v,ts:Date.now(),durationMs:R,...n&&{metadata:n}}),i;if(Xe(i)){let P=ft(i),k=I?.ms??P?.timeoutMs??0;if(m({type:"step_timeout",workflowId:l,stepId:K,stepKey:f,name:s,ts:Date.now(),timeoutMs:k,attempt:b,...n&&{metadata:n},diagnostics:me(i,o.errorMeta,"timeout",b)}),b<A.attempts&&A.retryOn(i,b)){let J=ze(b,A);m({type:"step_retry",workflowId:l,stepId:K,stepKey:f,name:s,ts:Date.now(),attempt:b+1,maxAttempts:A.attempts,delayMs:J,error:i,...n&&{metadata:n},diagnostics:me(i,o.errorMeta,"timeout",b,performance.now()-N)}),A.onRetry(i,b,J),await Je(J);continue}A.attempts>1&&m({type:"step_retries_exhausted",workflowId:l,stepId:K,stepKey:f,name:s,ts:Date.now(),durationMs:performance.now()-N,attempts:b,lastError:i,...n&&{metadata:n},diagnostics:me(i,o.errorMeta,"timeout",b,performance.now()-N)});let U=performance.now()-N;throw m({type:"step_error",workflowId:l,stepId:K,stepKey:f,name:s,description:v,ts:Date.now(),durationMs:U,error:i,...n&&{metadata:n},diagnostics:me(i,o.errorMeta,"timeout",b,U)}),T&&m({type:"step_complete",workflowId:l,stepKey:T,name:s,description:v,ts:Date.now(),durationMs:U,result:L(i,{cause:i}),meta:{origin:"throw",thrown:i},...n&&{metadata:n}}),r?.(i,s,x),z(i,{origin:"throw",thrown:i})}if(b<A.attempts&&A.retryOn(i,b)){let P=ze(b,A);m({type:"step_retry",workflowId:l,stepId:K,stepKey:f,name:s,ts:Date.now(),attempt:b+1,maxAttempts:A.attempts,delayMs:P,error:i,...n&&{metadata:n},diagnostics:me(i,o.errorMeta,"throw",b,performance.now()-N)}),A.onRetry(i,b,P),await Je(P);continue}A.attempts>1&&!Xe(i)&&m({type:"step_retries_exhausted",workflowId:l,stepId:K,stepKey:f,name:s,ts:Date.now(),durationMs:performance.now()-N,attempts:b,lastError:i,...n&&{metadata:n},diagnostics:me(i,o.errorMeta,"throw",b,performance.now()-N)});let S=performance.now()-N,h;try{h=te(i)}catch(P){throw xe(P)}throw m({type:"step_error",workflowId:l,stepId:K,stepKey:f,name:s,description:v,ts:Date.now(),durationMs:S,error:h,...n&&{metadata:n},diagnostics:me(i,o.errorMeta,"throw",b,S)}),T&&m({type:"step_complete",workflowId:l,stepKey:T,name:s,description:v,ts:Date.now(),durationMs:S,result:L(h,{cause:i}),meta:{origin:"throw",thrown:i},...n&&{metadata:n}}),r?.(h,s,x),z(h,{origin:"throw",thrown:i})}}let c=ce,d=performance.now()-N,q=le(c.error,{origin:"result",resultCause:c.cause});throw m({type:"step_error",workflowId:l,stepId:K,stepKey:f,name:s,description:v,ts:Date.now(),durationMs:d,error:q,...n&&{metadata:n},diagnostics:me(c.error,o.errorMeta,"result",A.attempts,d)}),T&&m({type:"step_complete",workflowId:l,stepKey:T,name:s,description:v,ts:Date.now(),durationMs:d,result:c,meta:{origin:"result",resultCause:c.cause},...n&&{metadata:n}}),r?.(q,s,x),z(q,{origin:"result",resultCause:c.cause})})();w.try=(p,u,a)=>{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 o=a.key??p,n=p,s=p,f="error"in a?()=>a.error:a.onError,T=y;return(async()=>{let v=T?performance.now():0;y&&m({type:"step_start",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now()});try{let D=await u(),I=performance.now()-v;return m({type:"step_success",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:I}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:I,result:H(D)}),D}catch(D){let I=f(D),K=performance.now()-v,G=le(I,{origin:"throw",thrown:D});throw m({type:"step_error",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:K,error:G}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:K,result:L(I,{cause:D}),meta:{origin:"throw",thrown:D}}),r?.(G,n,x),z(G,{origin:"throw",thrown:D})}})()},w.fromResult=(p,u,a)=>{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 o=a.key??p,n=p,s=p,f="error"in a?()=>a.error:a.onError,T=y;return(async()=>{let v=T?performance.now():0;y&&m({type:"step_start",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now()});let D=await u();if(D.ok){let I=performance.now()-v;return m({type:"step_success",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:I}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:I,result:H(D.value)}),D.value}else{let I=f(D.error),K=performance.now()-v,G=le(I,{origin:"result",resultCause:D.error});throw m({type:"step_error",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:K,error:G}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:K,result:L(I,{cause:D.error}),meta:{origin:"result",resultCause:D.error}}),r?.(G,n,x),z(G,{origin:"result",resultCause:D.error})}})()},w.fromNullable=(p,u,a,o)=>{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 w(p,async()=>{let n=await u();return n!=null?H(n):L(a())},o)},w.retry=(p,u,a)=>{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 w(p,u,{key:a.key??p,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})},w.withTimeout=(p,u,a)=>{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 w(p,u,{key:a.key??p,timeout:a})},w.sleep=(p,u,a)=>{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 o=typeof u=="string"?Jt(u):u;if(!o)throw new Error(`step.sleep: invalid duration '${u}'`);let n=o.millis,s=a?.signal;return w(p,async()=>{if(ee?.aborted||s?.aborted){let f=new Error("Sleep aborted");throw f.name="AbortError",f}return new Promise((f,T)=>{let v={timeoutId:void 0},D=()=>{v.timeoutId&&clearTimeout(v.timeoutId);let I=new Error("Sleep aborted");I.name="AbortError",T(I)};ee?.addEventListener("abort",D,{once:!0}),s?.addEventListener("abort",D,{once:!0}),v.timeoutId=setTimeout(()=>{ee?.removeEventListener("abort",D),s?.removeEventListener("abort",D),f(H(void 0))},n)})},{key:a?.key??p,description:a?.description})},w.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 u=p[0],a=p[1];if(typeof a=="function")return ue(u,a);if(a&&typeof a=="object"&&!Array.isArray(a)){let n=ae(a);return ke(n,{name:u})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),w.race=(p,u)=>{let a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),n=!1,s={scopeId:a,type:"race",winnerId:void 0};W.push(s);let f=()=>{if(n)return;n=!0;let T=W.findIndex(v=>v.scopeId===a);T!==-1&&W.splice(T,1),m({type:"scope_end",workflowId:l,scopeId:a,ts:Date.now(),durationMs:performance.now()-o,winnerId:s.winnerId})};m({type:"scope_start",workflowId:l,scopeId:a,scopeType:"race",name:p,ts:Date.now()});try{let T=await u();if(f(),!T.ok)throw r?.(T.error,p,x),z(T.error,{origin:"result",resultCause:T.cause});return T.value}catch(T){throw f(),T}})()},w.allSettled=(p,u)=>{let a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),n=!1;W.push({scopeId:a,type:"allSettled"});let s=()=>{if(n)return;n=!0;let f=W.findIndex(T=>T.scopeId===a);f!==-1&&W.splice(f,1),m({type:"scope_end",workflowId:l,scopeId:a,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:l,scopeId:a,scopeType:"allSettled",name:p,ts:Date.now()});try{let f=await u();if(s(),!f.ok)throw r?.(f.error,p,x),z(f.error,{origin:"result",resultCause:f.cause});return f.value}catch(f){throw s(),f}})()},w.if=(p,u,a)=>a(),w.label=w.if,w.branch=async(p,u)=>{let{condition:a,then:o,else:n}=u;if(a())return await o();if(n)return await n()},w.arm=(p,u)=>({fn:p,errors:u}),w.forEach=async(p,u,a)=>{let o=[],n=a.maxIterations,s=0,f="run"in a,T=Symbol.asyncIterator in u?u:(async function*(){yield*u})();for await(let v of T){if(n!==void 0&&s>=n)break;let D;f?D=await a.run(v,s):D=await a.item.handler(v,s,w),o.push(D),s++}return o},w.item=p=>({__forEachItemHandler:!0,handler:p}),w.dep=(p,u)=>u,w.run=(p,u,a)=>w(p,()=>u,a),w.workflow=(p,u,a)=>w(p,u,a),w.andThen=(p,u,a,o)=>w(p,()=>a(u),o),w.match=async(p,u,a,o)=>w(p,async()=>{let n=await u;return n.ok?H(await a.ok(n.value)):H(await a.err(n.error,n.cause))},o),w.all=w.parallel,w.map=async(p,u,a,o)=>{let n=o?.concurrency??u.length;return w(p,()=>n>=u.length?mt(u.map((s,f)=>a(s,f))):(async()=>{let s=[];for(let f=0;f<u.length;f+=n){let T=u.slice(f,f+n),v=await mt(T.map((D,I)=>a(D,f+I)));if(!v.ok)return v;s.push(...v.value)}return H(s)})(),{key:o?.key})},w.withFallback=(p,u,a)=>{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 o=a.key??p,n=p,s=ie(o),f=y;return(async()=>{let T=f?performance.now():0;y&&m({type:"step_start",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now()});let v;try{v=await u()}catch(N){if(V(N))throw m({type:"step_aborted",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:performance.now()-T}),N;let $;try{$=te(N)}catch(B){throw xe(B)}if(a.on!==void 0&&a.on!==$){let B=performance.now()-T;throw m({type:"step_error",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:B,error:$}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:B,result:L($,{cause:N}),meta:{origin:"throw",thrown:N}}),r?.($,n,x),z($,{origin:"throw",thrown:N})}let j;try{j=await a.fallback()}catch(B){if(V(B))throw m({type:"step_aborted",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:performance.now()-T}),B;let A;try{A=te(B)}catch(c){throw xe(c)}let ce=performance.now()-T;throw m({type:"step_error",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:ce,error:A}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:ce,result:L(A,{cause:B}),meta:{origin:"throw",thrown:B}}),r?.(A,n,x),z(A,{origin:"throw",thrown:B})}if(j.ok){let B=performance.now()-T;return m({type:"step_success",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:B}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:B,result:j,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String($)}}),j.value}else{let B=performance.now()-T,A=le(j.error,{origin:"result",resultCause:j.cause});throw m({type:"step_error",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:B,error:A}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:B,result:j,meta:{origin:"result",resultCause:j.cause}}),r?.(A,n,x),z(A,{origin:"result",resultCause:j.cause})}}if(v.ok){let N=performance.now()-T;return m({type:"step_success",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:N}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:N,result:v}),v.value}let D=v.error;if(a.on!==void 0&&a.on!==D){let N=performance.now()-T,$=le(D,{origin:"result",resultCause:v.cause});throw m({type:"step_error",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:N,error:$}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:N,result:v,meta:{origin:"result",resultCause:v.cause}}),r?.($,n,x),z($,{origin:"result",resultCause:v.cause})}let I;try{I=await a.fallback()}catch(N){if(V(N))throw m({type:"step_aborted",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:performance.now()-T}),N;let $;try{$=te(N)}catch(B){throw xe(B)}let j=performance.now()-T;throw m({type:"step_error",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:j,error:$}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:j,result:L($,{cause:N}),meta:{origin:"throw",thrown:N}}),r?.($,n,x),z($,{origin:"throw",thrown:N})}if(I.ok){let N=performance.now()-T;return m({type:"step_success",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:N}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:N,result:I,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(D)}}),I.value}let K=performance.now()-T,G=le(I.error,{origin:"result",resultCause:I.cause});throw m({type:"step_error",workflowId:l,stepId:s,stepKey:o,name:n,ts:Date.now(),durationMs:K,error:G}),o&&m({type:"step_complete",workflowId:l,stepKey:o,name:n,ts:Date.now(),durationMs:K,result:I,meta:{origin:"result",resultCause:I.cause}}),r?.(G,n,x),z(G,{origin:"result",resultCause:I.cause})})()},w.withResource=(p,u)=>{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 a=p,o=p,n=ie(a),s=y;return(async()=>{let f=s?performance.now():0;y&&m({type:"step_start",workflowId:l,stepId:n,stepKey:a,name:o,ts:Date.now()});let T;try{T=await u.acquire()}catch(j){if(V(j))throw m({type:"step_aborted",workflowId:l,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:performance.now()-f}),j;let B;try{B=te(j)}catch(ce){throw xe(ce)}let A=performance.now()-f;throw m({type:"step_error",workflowId:l,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:A,error:B}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:A,result:L(B,{cause:j}),meta:{origin:"throw",thrown:j}}),r?.(B,o,x),z(B,{origin:"throw",thrown:j})}if(!T.ok){let j=performance.now()-f,B=le(T.error,{origin:"result",resultCause:T.cause});throw m({type:"step_error",workflowId:l,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:j,error:B}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:j,result:T,meta:{origin:"result",resultCause:T.cause}}),r?.(B,o,x),z(B,{origin:"result",resultCause:T.cause})}let v=T.value,D,I,K=!1;try{D=await u.use(v)}catch(j){if(V(j)){try{await u.release(v)}catch(B){console.warn(`[awaitly] step.withResource("${p}"): release threw after earlyExit:`,B)}throw j}I=j,K=!0}try{await u.release(v)}catch(j){console.warn(`[awaitly] step.withResource("${p}"): release threw:`,j)}if(K){let j;try{j=te(I)}catch(A){throw xe(A)}let B=performance.now()-f;throw m({type:"step_error",workflowId:l,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:B,error:j}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:B,result:L(j,{cause:I}),meta:{origin:"throw",thrown:I}}),r?.(j,o,x),z(j,{origin:"throw",thrown:I})}let G=D;if(G.ok){let j=performance.now()-f;return m({type:"step_success",workflowId:l,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:j}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:j,result:G}),G.value}let N=performance.now()-f,$=le(G.error,{origin:"result",resultCause:G.cause});throw m({type:"step_error",workflowId:l,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:N,error:$}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:N,result:G,meta:{origin:"result",resultCause:G.cause}}),r?.($,o,x),z($,{origin:"result",resultCause:G.cause})})()};let pe=await e({step:w});if(process.env.NODE_ENV!=="production"&&pe!==null&&typeof pe=="object"&&"ok"in pe&&typeof pe.ok=="boolean"){let p=pe;(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().
|
|
1
|
+
var Ue=class extends Error{_tag};function pe(e,t){return class extends Ue{_tag=e;constructor(r,c){let R=t?.message?t.message(r??{}):e;if(super(R),this.name=e,Object.setPrototypeOf(this,new.target.prototype),r&&typeof r=="object"){let{_tag:S,name:_,message:x,stack:X,...u}=r,ee=Object.prototype.hasOwnProperty.call(u,"cause"),M=ee?u.cause:void 0;ee&&delete u.cause;let b=c?.cause!==void 0;if(ee&&b)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,u),ee&&(this.cause=M),b&&(this.cause=c?.cause)}else c?.cause!==void 0&&(this.cause=c.cause)}}}Object.defineProperty(pe,Symbol.hasInstance,{value:e=>e instanceof Ue});(R=>{function e(S){return S instanceof Error}R.isError=e;function t(S){return S instanceof Ue}R.isTaggedError=t;function r(S,_){let x=S._tag,X=_[x];return X(S)}R.match=r;function c(S,_,x){let X=S._tag,u=_[X];return u?u(S):x(S)}R.matchPartial=c})(pe||={});var wt=class extends pe("TimeoutError",{message:t=>t.operation?`TimeoutError: ${t.operation} timed out after ${t.ms}ms`:`TimeoutError: Operation timed out after ${t.ms}ms`}){},yt=class extends pe("RetryExhaustedError",{message:t=>t.operation?`RetryExhaustedError: ${t.operation} failed after ${t.attempts} attempts`:`RetryExhaustedError: Operation failed after ${t.attempts} attempts`}){},kt=class extends pe("RateLimitError",{message:t=>t.limiterName?`RateLimitError: Rate limit exceeded for ${t.limiterName}${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`}){},gt=class extends pe("CircuitBreakerOpenError",{message:t=>`CircuitBreakerOpenError: Circuit ${t.circuitName} is ${t.state??"OPEN"}${t.retryAfterMs?`, retry after ${Math.ceil(t.retryAfterMs/1e3)}s`:""}`}){},Rt=class extends pe("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},Tt=class extends pe("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},St=class extends pe("UnauthorizedError",{message:t=>t.reason?`UnauthorizedError: ${t.reason}`:t.action&&t.resource?`UnauthorizedError: Not authorized to ${t.action} ${t.resource}`:"UnauthorizedError: Access denied"}){},xt=class extends pe("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},ht=class extends pe("CompensationError",{message:t=>`CompensationError: Failed to compensate step ${t.step}`}){},Ae=class extends pe("UnexpectedError",{message:t=>`UnexpectedError: ${t.cause instanceof Error?t.cause.message:String(t.cause??"unknown")}`}){};function ur(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]),c=t[2].toLowerCase();return{_tag:"Duration",millis:r*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[c]??1)}}function He(e){return new Ae({cause:e})}function H(e){return{ok:!0,value:e}}function K(e,t){let r=t?.cause;return{ok:!1,error:e,...r!==void 0?{cause:r}:{}}}var At=e=>e instanceof Ae||typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="UnexpectedError";function lr(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let t=e;if(typeof t._tag=="string"){let r=t._tag.trim();if(r)return r}if(typeof t.tag=="string"){let r=t.tag.trim();if(r)return r}if(typeof t.code=="string"){let r=t.code.trim();if(r)return r}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let r=e.name.trim();if(r)return r}}return"unknown"}function pr(e,t){if(!(!t||!e))return t[e]}function tt(e){let{intent:t,domain:r,owner:c,tags:R,stateChanges:S,emits:_,calls:x}=e;if(!t&&!r&&!c&&!R?.length&&!S?.length&&!_?.length&&!x?.length)return;let X={};return t&&(X.intent=t),r&&(X.domain=r),c&&(X.owner=c),R?.length&&(X.tags=R),S?.length&&(X.stateChanges=S),_?.length&&(X.emits=_),x?.length&&(X.calls=x),X}function me(e,t,r,c,R){let S=lr(e),_=pr(S,t),x={tag:S,origin:r};return _!==void 0&&(x.classification=_),c!==void 0&&(x.attempt=c),R!==void 0&&(x.cumulativeDurationMs=R),x}var xe=Symbol.for("step_timeout_marker");function et(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:xe in e}function vt(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let t=e;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(xe in e)return e[xe]}}var _t=Symbol("early-exit");function Pe(e,t){return{[_t]:!0,error:e,meta:t}}function he(e){return typeof e=="object"&&e!==null&&e[_t]===!0}var Pt=Symbol("mapper-exception");function ve(e){return{[Pt]:!0,thrown:e}}function cr(e){return typeof e=="object"&&e!==null&&e[Pt]===!0}function Ze(e,t){let{backoff:r,initialDelay:c,maxDelay:R,jitter:S}=t,_;switch(r){case"fixed":_=c;break;case"linear":_=c*e;break;case"exponential":_=c*Math.pow(2,e-1);break}if(_=Math.min(_,R),S){let x=_*.25*Math.random();_=_+x}return Math.floor(_)}function Qe(e){return new Promise(t=>setTimeout(t,e))}var Ct=Symbol("timeout"),Be=Symbol("timeout-option");function dr(e){return typeof e=="object"&&e!==null&&e[Be]===!0}async function mr(e,t,r,c){let R=new AbortController,S=t.onTimeout??"error",_=()=>typeof S=="function"?S({name:r.name,key:r.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:r.name,stepKey:r.key,timeoutMs:t.ms,attempt:r.attempt},x;c?.aborted&&R.abort(c.reason);let X;c&&!c.aborted&&(X=()=>R.abort(c.reason),c.addEventListener("abort",X,{once:!0}));let u=new Promise((M,b)=>{x=setTimeout(()=>{if(S!=="disconnect"&&R.abort(),S==="option"){b({[Be]:!0,ms:t.ms});return}b({[Ct]:!0,error:_()})},t.ms)}),ee;t.signal?ee=Promise.resolve(e(R.signal)):ee=Promise.resolve(e());try{return await Promise.race([ee,u])}catch(M){if(typeof M=="object"&&M!==null&&M[Be]===!0)throw{[Be]:!0,ms:t.ms};if(typeof M=="object"&&M!==null&&M[Ct]===!0){S==="disconnect"&&ee.catch(()=>{});let b=M.error;if(typeof b=="object"&&b!==null&&b.type!=="STEP_TIMEOUT"){let ue={timeoutMs:t.ms,stepName:r.name,stepKey:r.key,attempt:r.attempt};xe in b?b[xe]=ue:Object.defineProperty(b,xe,{value:ue,enumerable:!1,writable:!0,configurable:!1})}throw b}throw M}finally{clearTimeout(x),X&&c&&c.removeEventListener("abort",X)}}var _e={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function We(e,t){let{onError:r,onEvent:c,catchUnexpected:R,workflowId:S,workflowName:_,context:x,_workflowSignal:X}=t&&typeof t=="object"?t:{},u=S??crypto.randomUUID(),ee=R??He,M=[],b=0,ue=E=>E??`step_${++b}`,m=E=>{let ie=E.context!==void 0||x===void 0?E:{...E,context:x},le=_!==void 0&&ie.workflowName===void 0?{...ie,workflowName:_}:ie;if(le.type==="step_success"){let Te=le.stepId;for(let Se=M.length-1;Se>=0;Se--){let de=M[Se];if(de.type==="race"&&!de.winnerId){de.winnerId=Te;break}}}c?.(le,x)},$=Pe,L=E=>he(E),ce=(E,ie)=>E,Oe=E=>typeof E=="function"?!1:!!(E&&typeof E=="object"&&"ok"in E||E&&typeof E=="object"&&"then"in E&&typeof E.then=="function");try{let ie=function(p){let l={};for(let[a,o]of Object.entries(p))if(typeof o=="function")l[a]=o;else if(o&&typeof o=="object"&&"fn"in o)l[a]=o.fn;else throw new TypeError(`step.parallel: operation "${a}" must be a function or { fn, errors? } object`);return l},le=function(p,l){let a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),n=!1;M.push({scopeId:a,type:"parallel"});let w=()=>{if(n)return;n=!0;let k=M.findIndex(i=>i.scopeId===a);k!==-1&&M.splice(k,1),m({type:"scope_end",workflowId:u,scopeId:a,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:u,scopeId:a,scopeType:"parallel",name:p,ts:Date.now()});try{let k=await l();if(w(),!k.ok)throw r?.(k.error,p,x),$(k.error,{origin:"result",resultCause:k.cause});return k.value}catch(k){throw w(),k}})()},Te=function(p,l){let a=Object.keys(p),o=l.name??`Parallel(${a.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let w=performance.now(),k=!1;M.push({scopeId:n,type:"parallel"});let i=()=>{if(k)return;k=!0;let A=M.findIndex(P=>P.scopeId===n);A!==-1&&M.splice(A,1),m({type:"scope_end",workflowId:u,scopeId:n,ts:Date.now(),durationMs:performance.now()-w})};m({type:"scope_start",workflowId:u,scopeId:n,scopeType:"parallel",name:o,ts:Date.now()});try{let A=await new Promise(U=>{if(a.length===0){U([]);return}let B=!1,J=a.length,O=new Array(a.length);for(let G=0;G<a.length;G++){let N=a[G],I=G;Promise.resolve(p[N]()).catch(j=>K({type:"PROMISE_REJECTED",cause:j},{cause:{type:"PROMISE_REJECTION",reason:j}})).then(j=>{if(!B){if(!j.ok){B=!0,U([{key:N,result:j}]);return}O[I]={key:N,result:j},J--,J===0&&U(O)}})}});i();let P={};for(let{key:U,result:B}of A){if(!B.ok)throw r?.(B.error,U,x),$(B.error,{origin:"result",resultCause:B.cause});P[U]=B.value}return P}catch(A){throw i(),A}})()};var Re=ie,be=le,Ee=Te;let E=(p,l,a)=>(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 o=a??{},n=tt(o),w=p,k=o.key??p,i=o.key??p,{description:A,retry:P,timeout:U}=o,B=ue(k),J=c,O=J?performance.now():0,N=Oe(l)?()=>l:l,j={attempts:Math.max(1,P?.attempts??1),backoff:P?.backoff??_e.backoff,initialDelay:P?.initialDelay??_e.initialDelay,maxDelay:P?.maxDelay??_e.maxDelay,jitter:P?.jitter??_e.jitter,retryOn:P?.retryOn??_e.retryOn,onRetry:P?.onRetry??_e.onRetry};c&&m({type:"step_start",workflowId:u,stepId:B,stepKey:k,name:w,description:A,ts:Date.now(),...n&&{metadata:n}});let we;for(let s=1;s<=j.attempts;s++){let z=J?performance.now():0;try{let g;if(U?g=await mr(N,U,{name:w,key:k,attempt:s},X):g=await N(),g.ok){let d=performance.now()-O;return m({type:"step_success",workflowId:u,stepId:B,stepKey:k,name:w,description:A,ts:Date.now(),durationMs:d,...n&&{metadata:n}}),i&&m({type:"step_complete",workflowId:u,stepKey:i,name:w,description:A,ts:Date.now(),durationMs:d,result:g,...n&&{metadata:n}}),g.value}if(we=g,s<j.attempts&&j.retryOn(g.error,s)){let d=Ze(s,j);m({type:"step_retry",workflowId:u,stepId:B,stepKey:k,name:w,ts:Date.now(),attempt:s+1,maxAttempts:j.attempts,delayMs:d,error:g.error,...n&&{metadata:n},diagnostics:me(g.error,o.errorMeta,"result",s,performance.now()-O)}),j.onRetry(g.error,s,d),await Qe(d);continue}j.attempts>1&&m({type:"step_retries_exhausted",workflowId:u,stepId:B,stepKey:k,name:w,ts:Date.now(),durationMs:performance.now()-O,attempts:s,lastError:g.error,...n&&{metadata:n},diagnostics:me(g.error,o.errorMeta,"result",s,performance.now()-O)});break}catch(g){let d=performance.now()-z;if(dr(g)){let T=g.ms;m({type:"step_timeout",workflowId:u,stepId:B,stepKey:k,name:w,ts:Date.now(),timeoutMs:T,attempt:s,...n&&{metadata:n},diagnostics:me(g,o.errorMeta,"timeout",s)}),m({type:"step_success",workflowId:u,stepId:B,stepKey:k,name:w,description:A,ts:Date.now(),durationMs:performance.now()-O,...n&&{metadata:n}}),i&&m({type:"step_complete",workflowId:u,stepKey:i,name:w,description:A,ts:Date.now(),durationMs:performance.now()-O,result:H(void 0),...n&&{metadata:n}});return}if(L(g))throw m({type:"step_aborted",workflowId:u,stepId:B,stepKey:k,name:w,description:A,ts:Date.now(),durationMs:d,...n&&{metadata:n}}),g;if(et(g)){let T=vt(g),v=U?.ms??T?.timeoutMs??0;if(m({type:"step_timeout",workflowId:u,stepId:B,stepKey:k,name:w,ts:Date.now(),timeoutMs:v,attempt:s,...n&&{metadata:n},diagnostics:me(g,o.errorMeta,"timeout",s)}),s<j.attempts&&j.retryOn(g,s)){let y=Ze(s,j);m({type:"step_retry",workflowId:u,stepId:B,stepKey:k,name:w,ts:Date.now(),attempt:s+1,maxAttempts:j.attempts,delayMs:y,error:g,...n&&{metadata:n},diagnostics:me(g,o.errorMeta,"timeout",s,performance.now()-O)}),j.onRetry(g,s,y),await Qe(y);continue}j.attempts>1&&m({type:"step_retries_exhausted",workflowId:u,stepId:B,stepKey:k,name:w,ts:Date.now(),durationMs:performance.now()-O,attempts:s,lastError:g,...n&&{metadata:n},diagnostics:me(g,o.errorMeta,"timeout",s,performance.now()-O)});let W=performance.now()-O;throw m({type:"step_error",workflowId:u,stepId:B,stepKey:k,name:w,description:A,ts:Date.now(),durationMs:W,error:g,...n&&{metadata:n},diagnostics:me(g,o.errorMeta,"timeout",s,W)}),i&&m({type:"step_complete",workflowId:u,stepKey:i,name:w,description:A,ts:Date.now(),durationMs:W,result:K(g,{cause:g}),meta:{origin:"throw",thrown:g},...n&&{metadata:n}}),r?.(g,w,x),$(g,{origin:"throw",thrown:g})}if(s<j.attempts&&j.retryOn(g,s)){let T=Ze(s,j);m({type:"step_retry",workflowId:u,stepId:B,stepKey:k,name:w,ts:Date.now(),attempt:s+1,maxAttempts:j.attempts,delayMs:T,error:g,...n&&{metadata:n},diagnostics:me(g,o.errorMeta,"throw",s,performance.now()-O)}),j.onRetry(g,s,T),await Qe(T);continue}j.attempts>1&&!et(g)&&m({type:"step_retries_exhausted",workflowId:u,stepId:B,stepKey:k,name:w,ts:Date.now(),durationMs:performance.now()-O,attempts:s,lastError:g,...n&&{metadata:n},diagnostics:me(g,o.errorMeta,"throw",s,performance.now()-O)});let h=performance.now()-O,C;try{C=ee(g)}catch(T){throw ve(T)}throw m({type:"step_error",workflowId:u,stepId:B,stepKey:k,name:w,description:A,ts:Date.now(),durationMs:h,error:C,...n&&{metadata:n},diagnostics:me(g,o.errorMeta,"throw",s,h)}),i&&m({type:"step_complete",workflowId:u,stepKey:i,name:w,description:A,ts:Date.now(),durationMs:h,result:K(C,{cause:g}),meta:{origin:"throw",thrown:g},...n&&{metadata:n}}),r?.(C,w,x),$(C,{origin:"throw",thrown:g})}}let re=we,ke=performance.now()-O,f=ce(re.error,{origin:"result",resultCause:re.cause});throw m({type:"step_error",workflowId:u,stepId:B,stepKey:k,name:w,description:A,ts:Date.now(),durationMs:ke,error:f,...n&&{metadata:n},diagnostics:me(re.error,o.errorMeta,"result",j.attempts,ke)}),i&&m({type:"step_complete",workflowId:u,stepKey:i,name:w,description:A,ts:Date.now(),durationMs:ke,result:re,meta:{origin:"result",resultCause:re.cause},...n&&{metadata:n}}),r?.(f,w,x),$(f,{origin:"result",resultCause:re.cause})})();E.try=(p,l,a)=>{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 o=a.key??p,n=p,w=p,k="error"in a?()=>a.error:a.onError,i=c;return(async()=>{let A=i?performance.now():0;c&&m({type:"step_start",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now()});try{let P=await l(),U=performance.now()-A;return m({type:"step_success",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:U}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:U,result:H(P)}),P}catch(P){let U=k(P),B=performance.now()-A,J=ce(U,{origin:"throw",thrown:P});throw m({type:"step_error",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:B,error:J}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:B,result:K(U,{cause:P}),meta:{origin:"throw",thrown:P}}),r?.(J,n,x),$(J,{origin:"throw",thrown:P})}})()},E.fromResult=(p,l,a)=>{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 o=a.key??p,n=p,w=p,k="error"in a?()=>a.error:a.onError,i=c;return(async()=>{let A=i?performance.now():0;c&&m({type:"step_start",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now()});let P=await l();if(P.ok){let U=performance.now()-A;return m({type:"step_success",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:U}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:U,result:H(P.value)}),P.value}else{let U=k(P.error),B=performance.now()-A,J=ce(U,{origin:"result",resultCause:P.error});throw m({type:"step_error",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:B,error:J}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:B,result:K(U,{cause:P.error}),meta:{origin:"result",resultCause:P.error}}),r?.(J,n,x),$(J,{origin:"result",resultCause:P.error})}})()},E.fromNullable=(p,l,a,o)=>{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 E(p,async()=>{let n=await l();return n!=null?H(n):K(a())},o)},E.retry=(p,l,a)=>{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 E(p,l,{key:a.key??p,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})},E.withTimeout=(p,l,a)=>{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 E(p,l,{key:a.key??p,timeout:a})},E.sleep=(p,l,a)=>{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 o=typeof l=="string"?ur(l):l;if(!o)throw new Error(`step.sleep: invalid duration '${l}'`);let n=o.millis,w=a?.signal;return E(p,async()=>{if(X?.aborted||w?.aborted){let k=new Error("Sleep aborted");throw k.name="AbortError",k}return new Promise((k,i)=>{let A={timeoutId:void 0},P=()=>{A.timeoutId&&clearTimeout(A.timeoutId);let U=new Error("Sleep aborted");U.name="AbortError",i(U)};X?.addEventListener("abort",P,{once:!0}),w?.addEventListener("abort",P,{once:!0}),A.timeoutId=setTimeout(()=>{X?.removeEventListener("abort",P),w?.removeEventListener("abort",P),k(H(void 0))},n)})},{key:a?.key??p,description:a?.description})},E.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 l=p[0],a=p[1];if(typeof a=="function")return le(l,a);if(a&&typeof a=="object"&&!Array.isArray(a)){let n=ie(a);return Te(n,{name:l})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),E.race=(p,l)=>{let a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),n=!1,w={scopeId:a,type:"race",winnerId:void 0};M.push(w);let k=()=>{if(n)return;n=!0;let i=M.findIndex(A=>A.scopeId===a);i!==-1&&M.splice(i,1),m({type:"scope_end",workflowId:u,scopeId:a,ts:Date.now(),durationMs:performance.now()-o,winnerId:w.winnerId})};m({type:"scope_start",workflowId:u,scopeId:a,scopeType:"race",name:p,ts:Date.now()});try{let i=await l();if(k(),!i.ok)throw r?.(i.error,p,x),$(i.error,{origin:"result",resultCause:i.cause});return i.value}catch(i){throw k(),i}})()},E.allSettled=(p,l)=>{let a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),n=!1;M.push({scopeId:a,type:"allSettled"});let w=()=>{if(n)return;n=!0;let k=M.findIndex(i=>i.scopeId===a);k!==-1&&M.splice(k,1),m({type:"scope_end",workflowId:u,scopeId:a,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:u,scopeId:a,scopeType:"allSettled",name:p,ts:Date.now()});try{let k=await l();if(w(),!k.ok)throw r?.(k.error,p,x),$(k.error,{origin:"result",resultCause:k.cause});return k.value}catch(k){throw w(),k}})()},E.if=(p,l,a)=>a(),E.label=E.if,E.branch=async(p,l)=>{let{condition:a,then:o,else:n}=l;if(a())return await o();if(n)return await n()},E.arm=(p,l)=>({fn:p,errors:l}),E.forEach=async(p,l,a)=>{let o=[],n=a.maxIterations,w=0,k="run"in a,i=Symbol.asyncIterator in l?l:(async function*(){yield*l})();for await(let A of i){if(n!==void 0&&w>=n)break;let P;k?P=await a.run(A,w):P=await a.item.handler(A,w,E),o.push(P),w++}return o},E.item=p=>({__forEachItemHandler:!0,handler:p}),E.dep=(p,l)=>l,E.run=(p,l,a)=>E(p,()=>l,a),E.workflow=(p,l,a)=>E(p,l,a),E.andThen=(p,l,a,o)=>E(p,()=>a(l),o),E.match=async(p,l,a,o)=>E(p,async()=>{let n=await l;return n.ok?H(await a.ok(n.value)):H(await a.err(n.error,n.cause))},o),E.all=E.parallel,E.map=async(p,l,a,o)=>{let n=o?.concurrency??l.length;return E(p,()=>n>=l.length?bt(l.map((w,k)=>a(w,k))):(async()=>{let w=[];for(let k=0;k<l.length;k+=n){let i=l.slice(k,k+n),A=await bt(i.map((P,U)=>a(P,k+U)));if(!A.ok)return A;w.push(...A.value)}return H(w)})(),{key:o?.key})},E.withFallback=(p,l,a)=>{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 o=a.key??p,n=p,w=ue(o),k=c;return(async()=>{let i=k?performance.now():0;c&&m({type:"step_start",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now()});let A;try{A=await l()}catch(O){if(L(O))throw m({type:"step_aborted",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:performance.now()-i}),O;let G;try{G=ee(O)}catch(I){throw ve(I)}if(a.on!==void 0&&a.on!==G){let I=performance.now()-i;throw m({type:"step_error",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:I,error:G}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:I,result:K(G,{cause:O}),meta:{origin:"throw",thrown:O}}),r?.(G,n,x),$(G,{origin:"throw",thrown:O})}let N;try{N=await a.fallback()}catch(I){if(L(I))throw m({type:"step_aborted",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:performance.now()-i}),I;let j;try{j=ee(I)}catch(re){throw ve(re)}let we=performance.now()-i;throw m({type:"step_error",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:we,error:j}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:we,result:K(j,{cause:I}),meta:{origin:"throw",thrown:I}}),r?.(j,n,x),$(j,{origin:"throw",thrown:I})}if(N.ok){let I=performance.now()-i;return m({type:"step_success",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:I}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:I,result:N,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(G)}}),N.value}else{let I=performance.now()-i,j=ce(N.error,{origin:"result",resultCause:N.cause});throw m({type:"step_error",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:I,error:j}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:I,result:N,meta:{origin:"result",resultCause:N.cause}}),r?.(j,n,x),$(j,{origin:"result",resultCause:N.cause})}}if(A.ok){let O=performance.now()-i;return m({type:"step_success",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:O}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:O,result:A}),A.value}let P=A.error;if(a.on!==void 0&&a.on!==P){let O=performance.now()-i,G=ce(P,{origin:"result",resultCause:A.cause});throw m({type:"step_error",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:O,error:G}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:O,result:A,meta:{origin:"result",resultCause:A.cause}}),r?.(G,n,x),$(G,{origin:"result",resultCause:A.cause})}let U;try{U=await a.fallback()}catch(O){if(L(O))throw m({type:"step_aborted",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:performance.now()-i}),O;let G;try{G=ee(O)}catch(I){throw ve(I)}let N=performance.now()-i;throw m({type:"step_error",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:N,error:G}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:N,result:K(G,{cause:O}),meta:{origin:"throw",thrown:O}}),r?.(G,n,x),$(G,{origin:"throw",thrown:O})}if(U.ok){let O=performance.now()-i;return m({type:"step_success",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:O}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:O,result:U,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(P)}}),U.value}let B=performance.now()-i,J=ce(U.error,{origin:"result",resultCause:U.cause});throw m({type:"step_error",workflowId:u,stepId:w,stepKey:o,name:n,ts:Date.now(),durationMs:B,error:J}),o&&m({type:"step_complete",workflowId:u,stepKey:o,name:n,ts:Date.now(),durationMs:B,result:U,meta:{origin:"result",resultCause:U.cause}}),r?.(J,n,x),$(J,{origin:"result",resultCause:U.cause})})()},E.withResource=(p,l)=>{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 a=p,o=p,n=ue(a),w=c;return(async()=>{let k=w?performance.now():0;c&&m({type:"step_start",workflowId:u,stepId:n,stepKey:a,name:o,ts:Date.now()});let i;try{i=await l.acquire()}catch(N){if(L(N))throw m({type:"step_aborted",workflowId:u,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:performance.now()-k}),N;let I;try{I=ee(N)}catch(we){throw ve(we)}let j=performance.now()-k;throw m({type:"step_error",workflowId:u,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:j,error:I}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:o,ts:Date.now(),durationMs:j,result:K(I,{cause:N}),meta:{origin:"throw",thrown:N}}),r?.(I,o,x),$(I,{origin:"throw",thrown:N})}if(!i.ok){let N=performance.now()-k,I=ce(i.error,{origin:"result",resultCause:i.cause});throw m({type:"step_error",workflowId:u,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:N,error:I}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:o,ts:Date.now(),durationMs:N,result:i,meta:{origin:"result",resultCause:i.cause}}),r?.(I,o,x),$(I,{origin:"result",resultCause:i.cause})}let A=i.value,P,U,B=!1;try{P=await l.use(A)}catch(N){if(L(N)){try{await l.release(A)}catch(I){console.warn(`[awaitly] step.withResource("${p}"): release threw after earlyExit:`,I)}throw N}U=N,B=!0}try{await l.release(A)}catch(N){console.warn(`[awaitly] step.withResource("${p}"): release threw:`,N)}if(B){let N;try{N=ee(U)}catch(j){throw ve(j)}let I=performance.now()-k;throw m({type:"step_error",workflowId:u,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:I,error:N}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:o,ts:Date.now(),durationMs:I,result:K(N,{cause:U}),meta:{origin:"throw",thrown:U}}),r?.(N,o,x),$(N,{origin:"throw",thrown:U})}let J=P;if(J.ok){let N=performance.now()-k;return m({type:"step_success",workflowId:u,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:N}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:o,ts:Date.now(),durationMs:N,result:J}),J.value}let O=performance.now()-k,G=ce(J.error,{origin:"result",resultCause:J.cause});throw m({type:"step_error",workflowId:u,stepId:n,stepKey:a,name:o,ts:Date.now(),durationMs:O,error:G}),a&&m({type:"step_complete",workflowId:u,stepKey:a,name:o,ts:Date.now(),durationMs:O,result:J,meta:{origin:"result",resultCause:J.cause}}),r?.(G,o,x),$(G,{origin:"result",resultCause:J.cause})})()};let de=await e({step:E});if(process.env.NODE_ENV!=="production"&&de!==null&&typeof de=="object"&&"ok"in de&&typeof de.ok=="boolean"){let p=de;(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
2
|
|
|
3
3
|
Incorrect: return ok({ data });
|
|
4
4
|
Correct: return { data };
|
|
5
5
|
|
|
6
|
-
See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return H(pe)}catch(w){if(Gt(w))throw w.thrown;if(V(w)){let ue=w.meta.origin==="throw"?w.meta.thrown:w.meta.origin==="result"?w.meta.resultCause:void 0;return L(w.error,{cause:ue})}let ae=te(w);return r?.(ae,"unexpected",x),L(ae,{cause:w})}}_e.strict=(e,t)=>_e(e,t);async function mt(e){return e.length===0?H([]):new Promise(t=>{let r=!1,y=e.length,g=new Array(e.length);for(let O=0;O<e.length;O++){let _=O;Promise.resolve(e[_]).catch(x=>L({type:"PROMISE_REJECTED",cause:x},{cause:{type:"PROMISE_REJECTION",reason:x}})).then(x=>{if(!r){if(!x.ok){r=!0,t(x);return}g[_]=x.value,y--,y===0&&t(H(g))}})}})}function Fe(e){return typeof e=="object"&&e!==null&&"steps"in e&&e.steps instanceof Map}function Oe(e){return e.type==="step_complete"}function Me(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}function Se(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_APPROVAL"}function yt(e){return typeof e=="object"&&e!==null&&e.type==="APPROVAL_REJECTED"}function Ie(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_HOOK"}var Le=class extends Error{constructor(r,y=[]){super(r);this.errors=y;this.name="SnapshotFormatError"}},Ze=class extends Error{constructor(r,y,g){super(r);this.mismatchType=y;this.details=g;this.name="SnapshotMismatchError"}},Ue=class extends Error{constructor(r,y,g){super(r);this.stepId=y;this.originalError=g;this.name="SnapshotDecodeError"}};function Rt(e){return typeof e=="object"&&e!==null&&"formatVersion"in e&&e.formatVersion===1&&"steps"in e&&typeof e.steps=="object"&&e.steps!==null&&"execution"in e&&typeof e.execution=="object"}var er=Rt;function gt(e){let t=[];if(typeof e!="object"||e===null)return{valid:!1,errors:["Snapshot must be an object"]};let r=e;if("formatVersion"in r?r.formatVersion!==1&&t.push(`Invalid formatVersion: expected 1, got ${r.formatVersion}`):t.push("Missing required field: formatVersion"),!("steps"in r))t.push("Missing required field: steps");else if(typeof r.steps!="object"||r.steps===null)t.push("steps must be an object");else{let y=r.steps;for(let[g,O]of Object.entries(y)){if(typeof O!="object"||O===null){t.push(`steps["${g}"] must be an object`);continue}let _=O;"ok"in _?typeof _.ok!="boolean"?t.push(`steps["${g}"].ok must be a boolean`):_.ok===!1&&("error"in _||t.push(`steps["${g}"] is error result but missing error field`),"cause"in _||t.push(`steps["${g}"] is error result but missing cause field`)):t.push(`steps["${g}"] missing required field: ok`)}}if(!("execution"in r))t.push("Missing required field: execution");else if(typeof r.execution!="object"||r.execution===null)t.push("execution must be an object");else{let y=r.execution;"status"in y?["running","completed","failed"].includes(y.status)||t.push("execution.status must be one of: running, completed, failed"):t.push("execution missing required field: status"),"lastUpdated"in y?typeof y.lastUpdated!="string"&&t.push("execution.lastUpdated must be a string (ISO timestamp)"):t.push("execution missing required field: lastUpdated")}return t.length>0?{valid:!1,errors:t}:{valid:!0,snapshot:e}}function tr(e){let t=gt(e);if(!t.valid)throw new Le(`Invalid snapshot format: ${t.errors[0]}`,t.errors);return t.snapshot}function rr(e,t){let r=Object.create(null);for(let[_,x]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,_)&&(r[_]=x);for(let[_,x]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,_)&&(r[_]=x);let y=e.metadata||t.metadata?{...e.metadata,...t.metadata}:void 0,O=[...(e.warnings||[]).filter(_=>!Object.prototype.hasOwnProperty.call(t.steps,_.stepId)),...t.warnings||[]];return{formatVersion:1,steps:r,execution:{...t.execution},metadata:y,warnings:O.length>0?O:void 0}}var kt=1e3;function Qe(e){let t={type:"error",name:e.name,message:e.message};e.stack&&(t.stack=e.stack);let r=e;return r.cause!==void 0&&(r.cause instanceof Error?t.cause=Qe(r.cause):t.cause=et(r.cause)),t}function et(e){let t,r=!1;try{t=String(e),t.length>kt&&(t=t.slice(0,kt),r=!0)}catch{t="[unable to convert to string]"}let y=e===null?"null":typeof e=="object"?e.constructor?.name??"Object":typeof e,g;try{let _=JSON.stringify(e);_!==void 0&&(g=JSON.parse(_))}catch{}let O={type:"thrown",originalType:y,stringRepresentation:t};return g!==void 0&&(O.value=g),r&&(O.truncated=!0),O}function We(e){if(e.type==="error"){let t=new Error(e.message);return t.name=e.name,e.stack&&(t.stack=e.stack),e.cause&&(t.cause=We(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function tt(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function de(e,t,r){return L(e,{cause:{__cachedMeta:!0,originalCause:r,meta:t}})}function Ne(e){return tt(e)?e.meta:{origin:"result",resultCause:e}}function Tt(e){let t=[];for(let[r,y]of e.steps){let g=nr(y);t.push([r,g])}return{kind:"ResumeState",steps:t}}function St(e){return typeof e=="object"&&e!==null&&e.kind==="ResumeState"&&Array.isArray(e.steps)}function ht(e){let t=new Map;for(let[r,y]of e.steps)t.set(r,or(y));return{steps:t}}function nr(e){let{result:t,meta:r}=e;if(t.ok)return{ok:!0,value:t.value};let y=tt(t.cause)?t.cause.originalCause:t.cause,g=y instanceof Error?Qe(y):et(y),O=r?.origin==="throw"?"throw":"result";return{ok:!1,error:t.error,cause:g,meta:{origin:O}}}function or(e){if(e.ok)return{result:H(e.value)};let t=We(e.cause),r=e.meta?.origin==="throw"?{origin:"throw",thrown:t}:{origin:"result",resultCause:t};return{result:de(e.error,r,t),meta:r}}function xt(e){if(e!==null&&Fe(e))return e}function Ve(){let e=new Map;return{handleEvent:t=>{Oe(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function Ct(e,t){let r=new Map(e.steps);return r.set(t.stepKey,{result:H(t.value)}),{steps:r}}function bt(e,t){let r=new Map(e.steps);return r.delete(t),{steps:r}}function At(e,t){let r=e.steps.get(t);return!r||r.result.ok?!1:Se(r.result.error)}function vt(e){let t=[];for(let[r,y]of e.steps)!y.result.ok&&Se(y.result.error)&&t.push(r);return t}var Dt="hook:";function Pt(e,t){let r=new Map(e.steps);return r.set(Dt+t.hookId,{result:H(t.value)}),{steps:r}}function _t(e,t){let r=e.steps.get(Dt+t);return!r||r.result.ok?!1:Ie(r.result.error)}function Ot(e){let t=[];for(let r of e.steps.values())!r.result.ok&&Ie(r.result.error)&&t.push(r.result.error.hookId);return t}function Mt(){let e=new Map;return{handleEvent:t=>{Oe(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear(),hasPendingApprovals:()=>{for(let t of e.values())if(!t.result.ok&&Se(t.result.error))return!0;return!1},getPendingApprovals:()=>{let t=[];for(let[r,y]of e)!y.result.ok&&Se(y.result.error)&&t.push({stepKey:r,error:y.result.error});return t},injectApproval:(t,r)=>(e.set(t,{result:H(r)}),{steps:new Map(e)})}}function It(e,t){return L({type:"PENDING_APPROVAL",stepKey:e,reason:t?.reason,metadata:t?.metadata})}function Ut(e){return async()=>{let t=await e.checkApproval();switch(t.status){case"pending":return L({type:"PENDING_APPROVAL",stepKey:e.key,reason:e.pendingReason,metadata:e.metadata});case"rejected":return L({type:"APPROVAL_REJECTED",stepKey:e.key,reason:t.reason});case"approved":return H(t.value)}}}function Wt(e,t){return async r=>{if(!(typeof t.requiresApproval=="function"?await t.requiresApproval(r):t.requiresApproval))return e(r);if(t.checkApproval){let O=await t.checkApproval();switch(O.status){case"approved":return e(r);case"rejected":return L({type:"APPROVAL_REJECTED",stepKey:t.key,reason:O.reason});case"pending":break}}let g=typeof t.description=="function"?t.description(r):t.description;return L({type:"PENDING_APPROVAL",stepKey:t.key,reason:g,metadata:{...t.metadata,pendingArgs:r,gatedOperation:!0}})}}var Be="hook:";function Nt(e,t){return L({type:"PENDING_HOOK",hookId:e,stepKey:Be+e,metadata:t?.metadata})}function jt(){let e=crypto.randomUUID();return{hookId:e,stepKey:Be+e}}var sr="STREAM_WRITE_ERROR",ar="STREAM_READ_ERROR",ir="STREAM_CLOSE_ERROR";var ur="STREAM_ENDED";function He(e,t,r){return{type:sr,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function rt(e,t,r){return{type:ar,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function nt(e,t,r){return{type:ir,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function $e(e){return{type:ur,finalPosition:e}}function Kt(e={}){let t=e.highWaterMark??16,r=e.lowWaterMark??Math.floor(t/2),y=e.onStateChange,g="flowing",O=0,_=[];function x(l){if(g!==l&&(g=l,y?.(l),l==="flowing"&&_.length>0)){let te=_;_=[];for(let W of te)W()}}function ee(){g==="flowing"&&O>=t?x("paused"):g==="paused"&&O<=r&&x("flowing")}return{get state(){return g},get bufferedCount(){return O},get highWaterMark(){return t},get lowWaterMark(){return r},increment(){O++,ee()},decrement(){O>0&&(O--,ee())},setCount(l){O=Math.max(0,l),ee()},waitForDrain(){return g==="flowing"?Promise.resolve():new Promise(l=>{_.push(l)})},reset(){O=0,_=[],x("flowing")}}}function ot(e){return{_tag:"Duration",millis:e}}function st(e){return{_tag:"Duration",millis:e*1e3}}function at(e){return{_tag:"Duration",millis:e*60*1e3}}function it(e){return{_tag:"Duration",millis:e*60*60*1e3}}function ut(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}var lr={_tag:"Duration",millis:0},pr={_tag:"Duration",millis:1/0};function qe(e){return e.millis}function Ft(e){return e.millis/1e3}function Lt(e){return e.millis/(60*1e3)}function Vt(e){return e.millis/(3600*1e3)}function Bt(e){return e.millis/(1440*60*1e3)}function cr(e,t){return{_tag:"Duration",millis:e.millis+t.millis}}function mr(e,t){return{_tag:"Duration",millis:Math.max(0,e.millis-t.millis)}}function dr(e,t){return{_tag:"Duration",millis:e.millis*t}}function fr(e,t){return{_tag:"Duration",millis:e.millis/t}}function Er(e,t){return e.millis<t.millis}function wr(e,t){return e.millis<=t.millis}function yr(e,t){return e.millis>t.millis}function kr(e,t){return e.millis>=t.millis}function Rr(e,t){return e.millis===t.millis}function Ht(e,t){return e.millis<=t.millis?e:t}function $t(e,t){return e.millis>=t.millis?e:t}function gr(e,t,r){return Ht($t(e,t),r)}function Tr(e){return e.millis===0}function Sr(e){return e.millis===1/0}function hr(e){return Number.isFinite(e.millis)&&e.millis>0}function qt(e){return typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="Duration"&&"millis"in e&&typeof e.millis=="number"}function xr(e){let t=e.millis;if(t===1/0)return"\u221E";if(t===0)return"0ms";let r=Math.floor(t/(1440*60*1e3)),y=Math.floor(t%(1440*60*1e3)/(3600*1e3)),g=Math.floor(t%(3600*1e3)/(60*1e3)),O=Math.floor(t%(60*1e3)/1e3),_=t%1e3,x=[];return r>0&&x.push(`${r}d`),y>0&&x.push(`${y}h`),g>0&&x.push(`${g}m`),O>0&&x.push(`${O}s`),_>0&&x.length===0&&x.push(`${_}ms`),x.join(" ")||"0ms"}function lt(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return ot(r);case"s":return st(r);case"m":return at(r);case"h":return it(r);case"d":return ut(r);default:return}}var Cr={millis:ot,seconds:st,minutes:at,hours:it,days:ut,zero:lr,infinity:pr,toMillis:qe,toSeconds:Ft,toMinutes:Lt,toHours:Vt,toDays:Bt,add:cr,subtract:mr,multiply:dr,divide:fr,lessThan:Er,lessThanOrEqual:wr,greaterThan:yr,greaterThanOrEqual:kr,equals:Rr,min:Ht,max:$t,clamp:gr,isZero:Tr,isInfinite:Sr,isFinite:hr,isDuration:qt,format:xr,parse:lt};function zt(e,t,r){if(typeof e!="string"||e.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let y=t??{},g=r;async function O(l,te,W){let C=l??crypto.randomUUID(),ie=W?.deps?{...y,...W.deps}:y,m=W?.createContext??g?.createContext,z=m?await m():void 0,V=W?.signal??g?.signal,le=W?.onEvent??g?.onEvent,Ae=W?.onError??g?.onError,ye=W?.shouldRun??g?.shouldRun,he=W?.onBeforeStart??g?.onBeforeStart,fe=W?.onAfterStep??g?.onAfterStep,w=W?.resumeState??g?.resumeState,ae=g?.catchUnexpected??Ke,ue={},ke=(W?.devWarnings??g?.devWarnings)===!0&&process.env.NODE_ENV!=="production",Re=new Set,pe=new Set,p={workflowId:C,onEvent:le,context:z!==void 0?z:void 0,signal:V,input:{},ref:c=>ue[c],set:(c,d)=>{ke&&!Re.has(c)&&(Re.add(c),console.warn(`awaitly: ctx.set('${c}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${c}' }) instead.`)),ue[c]=d},get:c=>(ke&&!pe.has(c)&&(pe.add(c),console.warn(`awaitly: ctx.get('${c}') is deprecated for static analysis. Use ctx.ref('${c}') instead for tracked dependencies.`)),ue[c])},u=c=>{let d=c.context!==void 0||z===void 0?c:{...c,context:z},q=d.workflowName===void 0?{...d,workflowName:e}:d;le?.(q,z)},a=(c,d)=>{let q={type:"WORKFLOW_CANCELLED",reason:c,lastStepKey:d};return L(ae(q),{cause:q})};if(V?.aborted){let c=typeof V.reason=="string"?V.reason:V.reason instanceof Error?V.reason.message:void 0;return u({type:"workflow_cancelled",workflowId:C,ts:Date.now(),durationMs:0,reason:c}),a(c)}if(ye){let c=performance.now();try{let d=await ye(C,z),q=performance.now()-c;if(u({type:"hook_should_run",workflowId:C,ts:Date.now(),durationMs:q,result:d,skipped:!d}),!d){let b=new Error("Workflow skipped by shouldRun hook");return L(ae(b),{cause:b})}}catch(d){let q=performance.now()-c;return u({type:"hook_should_run_error",workflowId:C,ts:Date.now(),durationMs:q,error:d}),L(ae(d),{cause:d})}}if(he){let c=performance.now();try{let d=await he(C,z),q=performance.now()-c;if(u({type:"hook_before_start",workflowId:C,ts:Date.now(),durationMs:q,result:d,skipped:!d}),!d){let b=new Error("Workflow skipped by onBeforeStart hook");return L(ae(b),{cause:b})}}catch(d){let q=performance.now()-c;return u({type:"hook_before_start_error",workflowId:C,ts:Date.now(),durationMs:q,error:d}),L(ae(d),{cause:d})}}let o=Date.now(),n=performance.now();u({type:"workflow_start",workflowId:C,ts:o});let s=W?.cache??g?.cache,f=W?.streamStore??g?.streamStore;if(w&&!s&&(s=new Map),w&&s){let c=typeof w=="function"?await w():w;c.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof c.steps}). This usually happens when state is serialized with JSON.stringify() directly.
|
|
6
|
+
See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return H(de)}catch(E){if(cr(E))throw E.thrown;if(L(E)){let le=E.meta.origin==="throw"?E.meta.thrown:E.meta.origin==="result"?E.meta.resultCause:void 0;return K(E.error,{cause:le})}let ie=ee(E);return r?.(ie,"unexpected",x),K(ie,{cause:E})}}We.strict=(e,t)=>We(e,t);async function bt(e){return e.length===0?H([]):new Promise(t=>{let r=!1,c=e.length,R=new Array(e.length);for(let S=0;S<e.length;S++){let _=S;Promise.resolve(e[_]).catch(x=>K({type:"PROMISE_REJECTED",cause:x},{cause:{type:"PROMISE_REJECTION",reason:x}})).then(x=>{if(!r){if(!x.ok){r=!0,t(x);return}R[_]=x.value,c--,c===0&&t(H(R))}})}})}function $e(e){return typeof e=="object"&&e!==null&&"steps"in e&&e.steps instanceof Map}function Ne(e){return e.type==="step_complete"}function Ke(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}function Ce(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_APPROVAL"}function Ot(e){return typeof e=="object"&&e!==null&&e.type==="APPROVAL_REJECTED"}function je(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_HOOK"}var ze=class extends Error{constructor(r,c=[]){super(r);this.errors=c;this.name="SnapshotFormatError"}},rt=class extends Error{constructor(r,c,R){super(r);this.mismatchType=c;this.details=R;this.name="SnapshotMismatchError"}},Fe=class extends Error{constructor(r,c,R){super(r);this.stepId=c;this.originalError=R;this.name="SnapshotDecodeError"}};function Mt(e){return typeof e=="object"&&e!==null&&"formatVersion"in e&&e.formatVersion===1&&"steps"in e&&typeof e.steps=="object"&&e.steps!==null&&"execution"in e&&typeof e.execution=="object"}var fr=Mt;function It(e){let t=[];if(typeof e!="object"||e===null)return{valid:!1,errors:["Snapshot must be an object"]};let r=e;if("formatVersion"in r?r.formatVersion!==1&&t.push(`Invalid formatVersion: expected 1, got ${r.formatVersion}`):t.push("Missing required field: formatVersion"),!("steps"in r))t.push("Missing required field: steps");else if(typeof r.steps!="object"||r.steps===null)t.push("steps must be an object");else{let c=r.steps;for(let[R,S]of Object.entries(c)){if(typeof S!="object"||S===null){t.push(`steps["${R}"] must be an object`);continue}let _=S;"ok"in _?typeof _.ok!="boolean"?t.push(`steps["${R}"].ok must be a boolean`):_.ok===!1&&("error"in _||t.push(`steps["${R}"] is error result but missing error field`),"cause"in _||t.push(`steps["${R}"] is error result but missing cause field`)):t.push(`steps["${R}"] missing required field: ok`)}}if(!("execution"in r))t.push("Missing required field: execution");else if(typeof r.execution!="object"||r.execution===null)t.push("execution must be an object");else{let c=r.execution;"status"in c?["running","completed","failed"].includes(c.status)||t.push("execution.status must be one of: running, completed, failed"):t.push("execution missing required field: status"),"lastUpdated"in c?typeof c.lastUpdated!="string"&&t.push("execution.lastUpdated must be a string (ISO timestamp)"):t.push("execution missing required field: lastUpdated")}return t.length>0?{valid:!1,errors:t}:{valid:!0,snapshot:e}}function Er(e){let t=It(e);if(!t.valid)throw new ze(`Invalid snapshot format: ${t.errors[0]}`,t.errors);return t.snapshot}function wr(e,t){let r=Object.create(null);for(let[_,x]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,_)&&(r[_]=x);for(let[_,x]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,_)&&(r[_]=x);let c=e.metadata||t.metadata?{...e.metadata,...t.metadata}:void 0,S=[...(e.warnings||[]).filter(_=>!Object.prototype.hasOwnProperty.call(t.steps,_.stepId)),...t.warnings||[]];return{formatVersion:1,steps:r,execution:{...t.execution},metadata:c,warnings:S.length>0?S:void 0}}var Dt=1e3;function nt(e){let t={type:"error",name:e.name,message:e.message};e.stack&&(t.stack=e.stack);let r=e;return r.cause!==void 0&&(r.cause instanceof Error?t.cause=nt(r.cause):t.cause=ot(r.cause)),t}function ot(e){let t,r=!1;try{t=String(e),t.length>Dt&&(t=t.slice(0,Dt),r=!0)}catch{t="[unable to convert to string]"}let c=e===null?"null":typeof e=="object"?e.constructor?.name??"Object":typeof e,R;try{let _=JSON.stringify(e);_!==void 0&&(R=JSON.parse(_))}catch{}let S={type:"thrown",originalType:c,stringRepresentation:t};return R!==void 0&&(S.value=R),r&&(S.truncated=!0),S}function Ve(e){if(e.type==="error"){let t=new Error(e.message);return t.name=e.name,e.stack&&(t.stack=e.stack),e.cause&&(t.cause=Ve(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function st(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function fe(e,t,r){return K(e,{cause:{__cachedMeta:!0,originalCause:r,meta:t}})}function Le(e){return st(e)?e.meta:{origin:"result",resultCause:e}}function Ut(e){let t=[];for(let[r,c]of e.steps){let R=yr(c);t.push([r,R])}return{kind:"ResumeState",steps:t}}function Wt(e){return typeof e=="object"&&e!==null&&e.kind==="ResumeState"&&Array.isArray(e.steps)}function Nt(e){let t=new Map;for(let[r,c]of e.steps)t.set(r,kr(c));return{steps:t}}function yr(e){let{result:t,meta:r}=e;if(t.ok)return{ok:!0,value:t.value};let c=st(t.cause)?t.cause.originalCause:t.cause,R=c instanceof Error?nt(c):ot(c),S=r?.origin==="throw"?"throw":"result";return{ok:!1,error:t.error,cause:R,meta:{origin:S}}}function kr(e){if(e.ok)return{result:H(e.value)};let t=Ve(e.cause),r=e.meta?.origin==="throw"?{origin:"throw",thrown:t}:{origin:"result",resultCause:t};return{result:fe(e.error,r,t),meta:r}}function Kt(e){if(e!==null&&$e(e))return e}function qe(){let e=new Map;return{handleEvent:t=>{Ne(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function jt(e,t){let r=new Map(e.steps);return r.set(t.stepKey,{result:H(t.value)}),{steps:r}}function Ft(e,t){let r=new Map(e.steps);return r.delete(t),{steps:r}}function Vt(e,t){let r=e.steps.get(t);return!r||r.result.ok?!1:Ce(r.result.error)}function Lt(e){let t=[];for(let[r,c]of e.steps)!c.result.ok&&Ce(c.result.error)&&t.push(r);return t}var Bt="hook:";function Ht(e,t){let r=new Map(e.steps);return r.set(Bt+t.hookId,{result:H(t.value)}),{steps:r}}function $t(e,t){let r=e.steps.get(Bt+t);return!r||r.result.ok?!1:je(r.result.error)}function zt(e){let t=[];for(let r of e.steps.values())!r.result.ok&&je(r.result.error)&&t.push(r.result.error.hookId);return t}function qt(){let e=new Map;return{handleEvent:t=>{Ne(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear(),hasPendingApprovals:()=>{for(let t of e.values())if(!t.result.ok&&Ce(t.result.error))return!0;return!1},getPendingApprovals:()=>{let t=[];for(let[r,c]of e)!c.result.ok&&Ce(c.result.error)&&t.push({stepKey:r,error:c.result.error});return t},injectApproval:(t,r)=>(e.set(t,{result:H(r)}),{steps:new Map(e)})}}function Jt(e,t){return K({type:"PENDING_APPROVAL",stepKey:e,reason:t?.reason,metadata:t?.metadata})}function Yt(e){return async()=>{let t=await e.checkApproval();switch(t.status){case"pending":return K({type:"PENDING_APPROVAL",stepKey:e.key,reason:e.pendingReason,metadata:e.metadata});case"rejected":return K({type:"APPROVAL_REJECTED",stepKey:e.key,reason:t.reason});case"approved":return H(t.value)}}}function Gt(e,t){return async r=>{if(!(typeof t.requiresApproval=="function"?await t.requiresApproval(r):t.requiresApproval))return e(r);if(t.checkApproval){let S=await t.checkApproval();switch(S.status){case"approved":return e(r);case"rejected":return K({type:"APPROVAL_REJECTED",stepKey:t.key,reason:S.reason});case"pending":break}}let R=typeof t.description=="function"?t.description(r):t.description;return K({type:"PENDING_APPROVAL",stepKey:t.key,reason:R,metadata:{...t.metadata,pendingArgs:r,gatedOperation:!0}})}}var Je="hook:";function Xt(e,t){return K({type:"PENDING_HOOK",hookId:e,stepKey:Je+e,metadata:t?.metadata})}function Zt(){let e=crypto.randomUUID();return{hookId:e,stepKey:Je+e}}var gr="STREAM_WRITE_ERROR",Rr="STREAM_READ_ERROR",Tr="STREAM_CLOSE_ERROR";var Sr="STREAM_ENDED";function Ye(e,t,r){return{type:gr,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function at(e,t,r){return{type:Rr,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function it(e,t,r){return{type:Tr,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function Ge(e){return{type:Sr,finalPosition:e}}function Qt(e={}){let t=e.highWaterMark??16,r=e.lowWaterMark??Math.floor(t/2),c=e.onStateChange,R="flowing",S=0,_=[];function x(u){if(R!==u&&(R=u,c?.(u),u==="flowing"&&_.length>0)){let ee=_;_=[];for(let M of ee)M()}}function X(){R==="flowing"&&S>=t?x("paused"):R==="paused"&&S<=r&&x("flowing")}return{get state(){return R},get bufferedCount(){return S},get highWaterMark(){return t},get lowWaterMark(){return r},increment(){S++,X()},decrement(){S>0&&(S--,X())},setCount(u){S=Math.max(0,u),X()},waitForDrain(){return R==="flowing"?Promise.resolve():new Promise(u=>{_.push(u)})},reset(){S=0,_=[],x("flowing")}}}function ut(e){return{_tag:"Duration",millis:e}}function lt(e){return{_tag:"Duration",millis:e*1e3}}function pt(e){return{_tag:"Duration",millis:e*60*1e3}}function ct(e){return{_tag:"Duration",millis:e*60*60*1e3}}function dt(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}var xr={_tag:"Duration",millis:0},hr={_tag:"Duration",millis:1/0};function Xe(e){return e.millis}function er(e){return e.millis/1e3}function tr(e){return e.millis/(60*1e3)}function rr(e){return e.millis/(3600*1e3)}function nr(e){return e.millis/(1440*60*1e3)}function Cr(e,t){return{_tag:"Duration",millis:e.millis+t.millis}}function br(e,t){return{_tag:"Duration",millis:Math.max(0,e.millis-t.millis)}}function Ar(e,t){return{_tag:"Duration",millis:e.millis*t}}function vr(e,t){return{_tag:"Duration",millis:e.millis/t}}function _r(e,t){return e.millis<t.millis}function Pr(e,t){return e.millis<=t.millis}function Or(e,t){return e.millis>t.millis}function Dr(e,t){return e.millis>=t.millis}function Mr(e,t){return e.millis===t.millis}function or(e,t){return e.millis<=t.millis?e:t}function sr(e,t){return e.millis>=t.millis?e:t}function Ir(e,t,r){return or(sr(e,t),r)}function Ur(e){return e.millis===0}function Wr(e){return e.millis===1/0}function Nr(e){return Number.isFinite(e.millis)&&e.millis>0}function ar(e){return typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="Duration"&&"millis"in e&&typeof e.millis=="number"}function Kr(e){let t=e.millis;if(t===1/0)return"\u221E";if(t===0)return"0ms";let r=Math.floor(t/(1440*60*1e3)),c=Math.floor(t%(1440*60*1e3)/(3600*1e3)),R=Math.floor(t%(3600*1e3)/(60*1e3)),S=Math.floor(t%(60*1e3)/1e3),_=t%1e3,x=[];return r>0&&x.push(`${r}d`),c>0&&x.push(`${c}h`),R>0&&x.push(`${R}m`),S>0&&x.push(`${S}s`),_>0&&x.length===0&&x.push(`${_}ms`),x.join(" ")||"0ms"}function mt(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return ut(r);case"s":return lt(r);case"m":return pt(r);case"h":return ct(r);case"d":return dt(r);default:return}}var jr={millis:ut,seconds:lt,minutes:pt,hours:ct,days:dt,zero:xr,infinity:hr,toMillis:Xe,toSeconds:er,toMinutes:tr,toHours:rr,toDays:nr,add:Cr,subtract:br,multiply:Ar,divide:vr,lessThan:_r,lessThanOrEqual:Pr,greaterThan:Or,greaterThanOrEqual:Dr,equals:Mr,min:or,max:sr,clamp:Ir,isZero:Ur,isInfinite:Wr,isFinite:Nr,isDuration:ar,format:Kr,parse:mt};function Fr(e){return typeof e=="object"&&e!==null&&e.type==="INPUT_VALIDATION_ERROR"}async function ft(e,t){let r=e["~standard"].validate(t),c=r instanceof Promise?await r:r;return c.issues?K({type:"INPUT_VALIDATION_ERROR",issues:c.issues.map(R=>({message:R.message,path:R.path?.map(S=>typeof S=="object"?S.key:S)})),message:`Input validation failed: ${c.issues.map(R=>R.message).join(", ")}`}):H(c.value)}function ir(e,t,r){if(typeof e!="string"||e.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let c=t??{},R=r;async function S(u,ee,M){let b=u??crypto.randomUUID(),ue=M?.deps?{...c,...M.deps}:c,m=M?.createContext??R?.createContext,$=m?await m():void 0,L=M?.signal??R?.signal,ce=M?.onEvent??R?.onEvent,Oe=M?.onError??R?.onError,Re=M?.shouldRun??R?.shouldRun,be=M?.onBeforeStart??R?.onBeforeStart,Ee=M?.onAfterStep??R?.onAfterStep,E=M?.resumeState??R?.resumeState,ie=R?.catchUnexpected??He,le={},Te=(M?.devWarnings??R?.devWarnings)===!0&&process.env.NODE_ENV!=="production",Se=new Set,de=new Set,p={workflowId:b,onEvent:ce,context:$!==void 0?$:void 0,signal:L,input:{},ref:f=>le[f],set:(f,s)=>{Te&&!Se.has(f)&&(Se.add(f),console.warn(`awaitly: ctx.set('${f}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${f}' }) instead.`)),le[f]=s},get:f=>(Te&&!de.has(f)&&(de.add(f),console.warn(`awaitly: ctx.get('${f}') is deprecated for static analysis. Use ctx.ref('${f}') instead for tracked dependencies.`)),le[f])},l=f=>{let s=f.context!==void 0||$===void 0?f:{...f,context:$},z=s.workflowName===void 0?{...s,workflowName:e}:s;ce?.(z,$)},a=(f,s)=>{let z={type:"WORKFLOW_CANCELLED",reason:f,lastStepKey:s};return K(ie(z),{cause:z})};if(L?.aborted){let f=typeof L.reason=="string"?L.reason:L.reason instanceof Error?L.reason.message:void 0;return l({type:"workflow_cancelled",workflowId:b,ts:Date.now(),durationMs:0,reason:f}),a(f)}if(Re){let f=performance.now();try{let s=await Re(b,$),z=performance.now()-f;if(l({type:"hook_should_run",workflowId:b,ts:Date.now(),durationMs:z,result:s,skipped:!s}),!s){let g=new Error("Workflow skipped by shouldRun hook");return K(ie(g),{cause:g})}}catch(s){let z=performance.now()-f;return l({type:"hook_should_run_error",workflowId:b,ts:Date.now(),durationMs:z,error:s}),K(ie(s),{cause:s})}}if(be){let f=performance.now();try{let s=await be(b,$),z=performance.now()-f;if(l({type:"hook_before_start",workflowId:b,ts:Date.now(),durationMs:z,result:s,skipped:!s}),!s){let g=new Error("Workflow skipped by onBeforeStart hook");return K(ie(g),{cause:g})}}catch(s){let z=performance.now()-f;return l({type:"hook_before_start_error",workflowId:b,ts:Date.now(),durationMs:z,error:s}),K(ie(s),{cause:s})}}let o=R?.inputSchema,n=R?.input;if(o&&n!==void 0){let f=await ft(o,n);if(!f.ok)return K(f.error);p.input=f.value}else n!==void 0&&(p.input=n);let w=Date.now(),k=performance.now();l({type:"workflow_start",workflowId:b,ts:w});let i=M?.cache??R?.cache,A=M?.streamStore??R?.streamStore;if(E&&!i&&(i=new Map),E&&i){let f=typeof E=="function"?await E():E;f.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof f.steps}). This usually happens when state is serialized with JSON.stringify() directly.
|
|
7
7
|
Use stringifyState() and parseState() from 'awaitly/persistence' instead:
|
|
8
8
|
import { stringifyState, parseState } from 'awaitly/persistence';
|
|
9
9
|
const json = stringifyState(state); // Save this
|
|
10
|
-
const restored = parseState(json); // Load this`),typeof c.steps=="object"&&c.steps!==null&&(c.steps=new Map(Object.entries(c.steps))));for(let[d,q]of c.steps){let{result:b,meta:E}=q;if(b.ok)s.set(d,b);else{let i=E??{origin:"result",resultCause:b.cause};s.set(d,de(b.error,i,b.cause))}}}let T=W?.snapshot??g?.snapshot,v=g?.serialization;if(T&&!w){s||(s=new Map);let c=T,d=v?.decode;for(let[q,b]of Object.entries(c.steps))if(Object.prototype.hasOwnProperty.call(c.steps,q))try{if(b.ok){let E=d?d(b.value):b.value;s.set(q,H(E))}else{let E=d?d(b.error):b.error,i=We(b.cause),R=b.meta?.origin==="throw"?{origin:"throw",thrown:i}:{origin:"result",resultCause:i};s.set(q,de(E,R,i))}}catch(E){throw new Ue(`Failed to decode step "${q}": ${E instanceof Error?E.message:String(E)}`,q,E instanceof Error?E:void 0)}}let D=!1,I,K,G=()=>{D=!0,I=typeof V?.reason=="string"?V.reason:V?.reason instanceof Error?V.reason.message:void 0};V&&!V.aborted&&V.addEventListener("abort",G,{once:!0});let N=()=>{if(D||V?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:I??(typeof V?.reason=="string"?V.reason:V?.reason instanceof Error?V.reason.message:void 0),lastStepKey:K}},$=async(c,d,q)=>{if(!fe)return;let b=performance.now();try{await fe(c,d,C,z);let E=performance.now()-b;u({type:"hook_after_step",workflowId:C,stepKey:c,ts:Date.now(),durationMs:E})}catch(E){let i=performance.now()-b;throw u({type:"hook_after_step_error",workflowId:C,stepKey:c,ts:Date.now(),durationMs:i,error:E}),E}},j=c=>{let d=async(E,i,R)=>{if(typeof E!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let S=E,h=R??{},P=S,k=Object.prototype.hasOwnProperty.call(h,"key")?h.key:S,{ttl:U,out:J}=h;N();let Y=Ge(h);if(k&&s&&s.has(k)){u({type:"step_cache_hit",workflowId:C,stepKey:k,name:P,ts:Date.now(),...Y&&{metadata:Y}});let M=s.get(k);if(M.ok)return K=k,J&&(ue[J]=M.value),M.value;let F=Ne(M.cause);throw be(M.error,F)}k&&s&&u({type:"step_cache_miss",workflowId:C,stepKey:k,name:P,ts:Date.now(),...Y&&{metadata:Y}});try{let M=await c(S,i,h);return J&&(ue[J]=M),k&&(K=k,s&&s.set(k,H(M),U?{ttl:U}:void 0),await $(k,H(M))),M}catch(M){if(k&&Te(M)){let F=M,re=F.meta.origin==="result"?F.meta.resultCause:F.meta.origin==="throw"?F.meta.thrown:void 0,X=de(F.error,F.meta,re);s&&s.set(k,X,U?{ttl:U}:void 0),await $(k,X,F.meta)}throw M}};d.try=async(E,i,R)=>{let{ttl:S}=R,h=R.key??E,P=E;if(s&&s.has(h)){u({type:"step_cache_hit",workflowId:C,stepKey:h,name:P,ts:Date.now()});let k=s.get(h);if(k.ok)return k.value;let U=Ne(k.cause);throw be(k.error,U)}s&&u({type:"step_cache_miss",workflowId:C,stepKey:h,name:P,ts:Date.now()});try{let k=await c.try(E,i,{...R,key:h});return s&&s.set(h,H(k),S?{ttl:S}:void 0),await $(h,H(k)),k}catch(k){if(Te(k)){let U=k,J=U.meta.origin==="result"?U.meta.resultCause:U.meta.origin==="throw"?U.meta.thrown:void 0,Y=de(U.error,U.meta,J);s&&s.set(h,Y,S?{ttl:S}:void 0),await $(h,Y,U.meta)}throw k}},d.fromResult=async(E,i,R)=>{let{ttl:S}=R,h=R.key??E,P=E;if(s&&s.has(h)){u({type:"step_cache_hit",workflowId:C,stepKey:h,name:P,ts:Date.now()});let k=s.get(h);if(k.ok)return k.value;let U=Ne(k.cause);throw be(k.error,U)}s&&u({type:"step_cache_miss",workflowId:C,stepKey:h,name:P,ts:Date.now()});try{let k=await c.fromResult(E,i,{...R,key:h});return s&&s.set(h,H(k),S?{ttl:S}:void 0),await $(h,H(k)),k}catch(k){if(Te(k)){let U=k,J=U.meta.origin==="result"?U.meta.resultCause:U.meta.origin==="throw"?U.meta.thrown:void 0,Y=de(U.error,U.meta,J);s&&s.set(h,Y,S?{ttl:S}:void 0),await $(h,Y,U.meta)}throw k}},d.parallel=c.parallel,d.race=c.race,d.allSettled=c.allSettled,d.withFallback=async(E,i,R)=>{let S=R.key??E,h=E;if(s&&s.has(S)){u({type:"step_cache_hit",workflowId:C,stepKey:S,name:h,ts:Date.now()});let P=s.get(S);if(P.ok)return P.value;let k=Ne(P.cause);throw be(P.error,k)}s&&u({type:"step_cache_miss",workflowId:C,stepKey:S,name:h,ts:Date.now()});try{let P=await c.withFallback(E,i,R);return s&&s.set(S,H(P)),await $(S,H(P)),P}catch(P){if(Te(P)){let k=P,U=k.meta.origin==="result"?k.meta.resultCause:k.meta.origin==="throw"?k.meta.thrown:void 0,J=de(k.error,k.meta,U);s&&s.set(S,J),await $(S,J,k.meta)}throw P}},d.withResource=async(E,i)=>{let R=E;try{let S=await c.withResource(E,i);return await $(R,H(S)),S}catch(S){if(Te(S)){let h=S,P=h.meta.origin==="result"?h.meta.resultCause:h.meta.origin==="throw"?h.meta.thrown:void 0,k=de(h.error,h.meta,P);await $(R,k,h.meta)}throw S}},d.retry=(E,i,R)=>{let S={key:R.key,retry:{attempts:R.attempts,backoff:R.backoff,initialDelay:R.initialDelay,maxDelay:R.maxDelay,jitter:R.jitter,retryOn:R.retryOn,onRetry:R.onRetry},timeout:R.timeout,ttl:R.ttl};return d(E,i,S)},d.withTimeout=(E,i,R)=>{let S={key:R.key,timeout:R,ttl:R.ttl};return d(E,i,S)},d.sleep=(E,i,R)=>{if(typeof E!="string"||E.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let S=typeof i=="string"?lt(i):i;if(!S)throw new Error(`step.sleep: invalid duration '${i}'`);let h=qe(S),P=R?.signal;return d(E,async()=>{if(V?.aborted||P?.aborted){let U=new Error("Sleep aborted");throw U.name="AbortError",U}return new Promise((U,J)=>{let Y={timeoutId:void 0},M=()=>{Y.timeoutId&&clearTimeout(Y.timeoutId);let F=new Error("Sleep aborted");F.name="AbortError",J(F)};V?.addEventListener("abort",M,{once:!0}),P?.addEventListener("abort",M,{once:!0}),Y.timeoutId=setTimeout(()=>{V?.removeEventListener("abort",M),P?.removeEventListener("abort",M),U(H(void 0))},h)})},{key:R?.key,ttl:R?.ttl,description:R?.description})};let q=new Map,b=new Map;return d.getWritable=E=>{let i=E?.namespace??"default",R=E?.highWaterMark??16;if(!f)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let S=`${C}:${i}`,h=q.get(S);if(h&&!h.closed&&!h.aborted)return h.writer;let P=Kt({highWaterMark:R,onStateChange:F=>{u({type:"stream_backpressure",workflowId:C,namespace:i,bufferedCount:P.bufferedCount,state:F,ts:Date.now()})}}),k=0,U=!0,J=!1,Y=!1;u({type:"stream_created",workflowId:C,namespace:i,ts:Date.now()});let M={async write(F){if(Y)return L(He("closed","Stream is closed"));if(J)return L(He("aborted","Stream was aborted"));P.state==="paused"&&await P.waitForDrain();let re={value:F,position:k,ts:Date.now()},X=await f.append(C,i,re);return X.ok?(u({type:"stream_write",workflowId:C,namespace:i,position:k,ts:Date.now()}),k++,P.increment(),H(void 0)):(u({type:"stream_error",workflowId:C,namespace:i,error:X.error,position:k,ts:Date.now()}),L(He("store_error",X.error.message,X.error)))},async close(){if(Y)return L(nt("already_closed","Stream is already closed"));let F=await f.closeStream(C,i);return F.ok?(Y=!0,U=!1,u({type:"stream_close",workflowId:C,namespace:i,finalPosition:k,ts:Date.now()}),q.delete(S),H(void 0)):L(nt("store_error",F.error.message,F.error))},abort(F){J=!0,U=!1,Y=!0,u({type:"stream_error",workflowId:C,namespace:i,error:F,position:k,ts:Date.now()}),q.delete(S)},get writable(){return U},get position(){return k},get namespace(){return i}};return q.set(S,{writer:M,backpressure:P,aborted:J,closed:Y}),M},d.getReadable=E=>{let i=E?.namespace??"default",R=E?.startIndex??0,S=E?.pollInterval??10,h=E?.pollTimeout??3e4;if(!f)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let P=`${C}:${i}:${R}`,k=b.get(P);if(k&&!k.closed)return k.reader;let U=()=>{let Ee=`${C}:${i}`,Q=q.get(Ee);Q&&Q.backpressure.decrement()},J=R,Y=!0,M=!1,F=[],re=0,X={async read(){if(M)return L(rt("closed","Reader is closed"));if(re<F.length){let se=F[re++];return J=se.position+1,U(),u({type:"stream_read",workflowId:C,namespace:i,position:se.position,ts:Date.now()}),H(se.value)}let Ee=`${C}:${i}`,Q=Date.now(),oe=q.has(Ee),Z=await f.getMetadata(C,i),ne=Z.ok&&Z.value!==void 0;for(;Date.now()-Q<h;){let se=await f.read(C,i,J,100);if(!se.ok)return L(rt("store_error",se.error.message,se.error));let ve=se.value;if(ve.length>0){F=ve,re=1;let Pe=ve[0];return J=Pe.position+1,U(),u({type:"stream_read",workflowId:C,namespace:i,position:Pe.position,ts:Date.now()}),H(Pe.value)}let De=q.has(Ee),we=await f.getMetadata(C,i),pt=we.ok&&we.value!==void 0;if(De&&(oe=!0),pt&&(ne=!0),we.ok&&we.value?.closed)return Y=!1,L($e(J));if(oe&&!De&&!pt)return Y=!1,L($e(J));ne&&!De&&we.ok&&we.value?.closed,await new Promise(Pe=>setTimeout(Pe,S))}return Y=!1,L($e(J))},close(){M=!0,Y=!1,F=[],b.delete(P)},get readable(){return Y},get position(){return J},get namespace(){return i}};return b.set(P,{reader:X,position:J,closed:M}),X},d.streamForEach=async(E,i,R)=>{let S=R?.checkpointInterval??1,h=R?.concurrency??1,P=[],k=0,U=-1,J=M=>typeof M=="object"&&M!==null&&"read"in M&&typeof M.read=="function",Y=async(M,F,re,X)=>{let Q=S>0&&F%S===0?`stream-foreach:${X}:pos-${re}`:void 0,oe=Q??`stream-item-${re}`,Z=await d(oe,()=>i(M,F),{key:Q});return{index:F,position:re,result:Z}};if(J(E))if(h<=1){let M=E.position,F=await E.read();for(;F.ok;){let re=F.value,{result:X}=await Y(re,k,M,E.namespace);P.push(X),U=M,k++,M=E.position,F=await E.read()}}else{let M=new Map,F=0,re=0,X=new Array(h).fill(null),Ee=async()=>{for(let se=0;se<X.length;se++)if(X[se]===null)return se;let Z=X.filter(se=>se!==null),ne=await Promise.race(Z);return M.set(ne.index,{position:ne.position,result:ne.result}),X[ne.slotIndex]=null,ne.slotIndex},Q=E.position,oe=await E.read();for(;oe.ok;){let Z=await Ee(),ne=F,se=Q,ve=oe.value,De=Z;X[Z]=Y(ve,ne,se,E.namespace).then(we=>({slotIndex:De,...we})),re++,F++,Q=E.position,oe=await E.read()}for(let Z=0;Z<X.length;Z++)if(X[Z]!==null){let ne=await X[Z];M.set(ne.index,{position:ne.position,result:ne.result})}for(let Z=0;Z<re;Z++){let ne=M.get(Z);ne&&(P.push(ne.result),U=ne.position,k++)}}else if(h<=1){let M=0;for await(let F of E){let{result:re}=await Y(F,M,M,"async-iterable");P.push(re),U=M,k++,M++}}else{let M=new Map,F=0,re=0,X=new Array(h).fill(null),Ee=async()=>{for(let Z=0;Z<X.length;Z++)if(X[Z]===null)return Z;let Q=X.filter(Z=>Z!==null),oe=await Promise.race(Q);return M.set(oe.index,oe.result),X[oe.slotIndex]=null,oe.slotIndex};for await(let Q of E){let oe=await Ee(),Z=F,ne=oe;X[oe]=Y(Q,Z,Z,"async-iterable").then(se=>({slotIndex:ne,...se})),re++,F++}for(let Q=0;Q<X.length;Q++)if(X[Q]!==null){let oe=await X[Q];M.set(oe.index,oe.result)}for(let Q=0;Q<re;Q++)M.has(Q)&&(P.push(M.get(Q)),U=Q,k++)}return{results:P,processedCount:k,lastPosition:U}},d.if=c.if,d.label=c.label,d.branch=c.branch,d.arm=c.arm,d.forEach=c.forEach,d.item=c.item,d.dep=c.dep,d.run=(E,i,R)=>d(E,typeof i=="function"?i:()=>i,R),d.workflow=(E,i,R)=>d(E,i,R),d.andThen=(E,i,R,S)=>d(E,()=>R(i),S),d.match=(E,i,R,S)=>d(E,async()=>{let h=await i;return h.ok?H(await R.ok(h.value)):H(await R.err(h.error,h.cause))},S),d.all=(E,i,R)=>{let S=R!==void 0&&Object.prototype.hasOwnProperty.call(R,"key")?R:{...R,key:void 0};return d(E,async()=>H(await c.all(E,i)),S)},d.map=(E,i,R,S)=>{let h=S!==void 0&&Object.prototype.hasOwnProperty.call(S,"key")?S:{...S,key:void 0};return d(E,async()=>H(await c.map(E,i,R,S)),h)},d},B=({step:c})=>te({step:j(c),deps:ie,ctx:p}),A;try{A=await _e(B,{onError:Ae,onEvent:le,catchUnexpected:ae,workflowId:C,workflowName:e,context:z,_workflowSignal:V})}finally{V&&V.removeEventListener("abort",G)}let ce=performance.now()-n;if(!A.ok){let c;if(Me(A.cause)&&(c=A.cause),!c&&D&&dt(A.error)){let d=A.cause;d!=null&&typeof d=="object"&&"name"in d&&d.name==="AbortError"&&(c={type:"WORKFLOW_CANCELLED",reason:I??(typeof V?.reason=="string"?V.reason:V?.reason instanceof Error?V.reason.message:void 0),lastStepKey:K})}if(c)return u({type:"workflow_cancelled",workflowId:C,ts:Date.now(),durationMs:ce,reason:c.reason,lastStepKey:c.lastStepKey}),c&&!Me(A.cause)?L(A.error,{cause:c}):A}if(A.ok&&D){let c=I??(typeof V?.reason=="string"?V.reason:V?.reason instanceof Error?V.reason.message:void 0);u({type:"workflow_cancelled",workflowId:C,ts:Date.now(),durationMs:ce,reason:c,lastStepKey:K});let d={type:"WORKFLOW_CANCELLED",reason:c,lastStepKey:K};return L(ae(d),{cause:d})}return A.ok?u({type:"workflow_success",workflowId:C,ts:Date.now(),durationMs:ce}):u({type:"workflow_error",workflowId:C,ts:Date.now(),durationMs:ce,error:A.error}),A}function _(l,te,W){let C,ie,m;return typeof l=="string"?(C=l,ie=te,m=W):(ie=l,m=te),O(C,ie,m)}async function x(l,te,W){let C,ie,m;typeof l=="string"?(C=l,ie=te,m=W):(ie=l,m=te);let z=Ve(),V=m?.onEvent,Ae={...m,onEvent:(fe,w)=>{z.handleEvent(fe);try{V?.(fe,w)}catch{}}},ye,he;try{ye=await O(C,ie,Ae)}catch(fe){let w=g?.catchUnexpected??Ke;ye=L(w(fe),{cause:fe})}finally{he=z.getResumeState()}return{result:ye,resumeState:he}}return{run:_,runWithState:x}}export{Cr as Duration,Be as HOOK_STEP_KEY_PREFIX,ge as STEP_TIMEOUT_MARKER,Ue as SnapshotDecodeError,Le as SnapshotFormatError,Ze as SnapshotMismatchError,Ye as UNEXPECTED_ERROR,tr as assertValidSnapshot,bt as clearStep,Mt as createApprovalStateCollector,Ut as createApprovalStep,jt as createHook,Ve as createResumeStateCollector,zt as createWorkflow,ut as days,ht as deserializeResumeState,Wt as gatedStep,vt as getPendingApprovals,Ot as getPendingHooks,ft as getStepTimeoutMeta,At as hasPendingApproval,_t as hasPendingHook,it as hours,Ct as injectApproval,Pt as injectHook,yt as isApprovalRejected,qt as isDuration,Se as isPendingApproval,Ie as isPendingHook,Fe as isResumeState,St as isSerializedResumeState,Oe as isStepComplete,Xe as isStepTimeoutError,Me as isWorkflowCancelled,er as isWorkflowSnapshot,Rt as looksLikeWorkflowSnapshot,rr as mergeSnapshots,ot as millis,at as minutes,It as pendingApproval,Nt as pendingHook,_e as run,st as seconds,Tt as serializeResumeState,Bt as toDays,Vt as toHours,qe as toMillis,Lt as toMinutes,xt as toResumeState,Ft as toSeconds,gt as validateSnapshot};
|
|
10
|
+
const restored = parseState(json); // Load this`),typeof f.steps=="object"&&f.steps!==null&&(f.steps=new Map(Object.entries(f.steps))));for(let[s,z]of f.steps){let{result:g,meta:d}=z;if(g.ok)i.set(s,g);else{let h=d??{origin:"result",resultCause:g.cause};i.set(s,fe(g.error,h,g.cause))}}}let P=M?.snapshot??R?.snapshot,U=R?.serialization;if(P&&!E){i||(i=new Map);let f=P,s=U?.decode;for(let[z,g]of Object.entries(f.steps))if(Object.prototype.hasOwnProperty.call(f.steps,z))try{if(g.ok){let d=s?s(g.value):g.value;i.set(z,H(d))}else{let d=s?s(g.error):g.error,h=Ve(g.cause),C=g.meta?.origin==="throw"?{origin:"throw",thrown:h}:{origin:"result",resultCause:h};i.set(z,fe(d,C,h))}}catch(d){throw new Fe(`Failed to decode step "${z}": ${d instanceof Error?d.message:String(d)}`,z,d instanceof Error?d:void 0)}}let B=!1,J,O,G=()=>{B=!0,J=typeof L?.reason=="string"?L.reason:L?.reason instanceof Error?L.reason.message:void 0};L&&!L.aborted&&L.addEventListener("abort",G,{once:!0});let N=()=>{if(B||L?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:J??(typeof L?.reason=="string"?L.reason:L?.reason instanceof Error?L.reason.message:void 0),lastStepKey:O}},I=async(f,s,z)=>{if(!Ee)return;let g=performance.now();try{await Ee(f,s,b,$);let d=performance.now()-g;l({type:"hook_after_step",workflowId:b,stepKey:f,ts:Date.now(),durationMs:d})}catch(d){let h=performance.now()-g;throw l({type:"hook_after_step_error",workflowId:b,stepKey:f,ts:Date.now(),durationMs:h,error:d}),d}},j=f=>{let s=async(d,h,C)=>{if(typeof d!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let T=d,v=C??{},W=T,y=Object.prototype.hasOwnProperty.call(v,"key")?v.key:T,{ttl:F,out:Z}=v;N();let Y=tt(v);if(y&&i&&i.has(y)){l({type:"step_cache_hit",workflowId:b,stepKey:y,name:W,ts:Date.now(),...Y&&{metadata:Y}});let D=i.get(y);if(D.ok)return O=y,Z&&(le[Z]=D.value),D.value;let V=Le(D.cause);throw Pe(D.error,V)}y&&i&&l({type:"step_cache_miss",workflowId:b,stepKey:y,name:W,ts:Date.now(),...Y&&{metadata:Y}});try{let D=await f(T,h,v);return Z&&(le[Z]=D),y&&(O=y,i&&i.set(y,H(D),F?{ttl:F}:void 0),await I(y,H(D))),D}catch(D){if(y&&he(D)){let V=D,ne=V.meta.origin==="result"?V.meta.resultCause:V.meta.origin==="throw"?V.meta.thrown:void 0,q=fe(V.error,V.meta,ne);i&&i.set(y,q,F?{ttl:F}:void 0),await I(y,q,V.meta)}throw D}};s.try=async(d,h,C)=>{let{ttl:T}=C,v=C.key??d,W=d;if(i&&i.has(v)){l({type:"step_cache_hit",workflowId:b,stepKey:v,name:W,ts:Date.now()});let y=i.get(v);if(y.ok)return y.value;let F=Le(y.cause);throw Pe(y.error,F)}i&&l({type:"step_cache_miss",workflowId:b,stepKey:v,name:W,ts:Date.now()});try{let y=await f.try(d,h,{...C,key:v});return i&&i.set(v,H(y),T?{ttl:T}:void 0),await I(v,H(y)),y}catch(y){if(he(y)){let F=y,Z=F.meta.origin==="result"?F.meta.resultCause:F.meta.origin==="throw"?F.meta.thrown:void 0,Y=fe(F.error,F.meta,Z);i&&i.set(v,Y,T?{ttl:T}:void 0),await I(v,Y,F.meta)}throw y}},s.fromResult=async(d,h,C)=>{let{ttl:T}=C,v=C.key??d,W=d;if(i&&i.has(v)){l({type:"step_cache_hit",workflowId:b,stepKey:v,name:W,ts:Date.now()});let y=i.get(v);if(y.ok)return y.value;let F=Le(y.cause);throw Pe(y.error,F)}i&&l({type:"step_cache_miss",workflowId:b,stepKey:v,name:W,ts:Date.now()});try{let y=await f.fromResult(d,h,{...C,key:v});return i&&i.set(v,H(y),T?{ttl:T}:void 0),await I(v,H(y)),y}catch(y){if(he(y)){let F=y,Z=F.meta.origin==="result"?F.meta.resultCause:F.meta.origin==="throw"?F.meta.thrown:void 0,Y=fe(F.error,F.meta,Z);i&&i.set(v,Y,T?{ttl:T}:void 0),await I(v,Y,F.meta)}throw y}},s.parallel=f.parallel,s.race=f.race,s.allSettled=f.allSettled,s.withFallback=async(d,h,C)=>{let T=C.key??d,v=d;if(i&&i.has(T)){l({type:"step_cache_hit",workflowId:b,stepKey:T,name:v,ts:Date.now()});let W=i.get(T);if(W.ok)return W.value;let y=Le(W.cause);throw Pe(W.error,y)}i&&l({type:"step_cache_miss",workflowId:b,stepKey:T,name:v,ts:Date.now()});try{let W=await f.withFallback(d,h,C);return i&&i.set(T,H(W)),await I(T,H(W)),W}catch(W){if(he(W)){let y=W,F=y.meta.origin==="result"?y.meta.resultCause:y.meta.origin==="throw"?y.meta.thrown:void 0,Z=fe(y.error,y.meta,F);i&&i.set(T,Z),await I(T,Z,y.meta)}throw W}},s.withResource=async(d,h)=>{let C=d;try{let T=await f.withResource(d,h);return await I(C,H(T)),T}catch(T){if(he(T)){let v=T,W=v.meta.origin==="result"?v.meta.resultCause:v.meta.origin==="throw"?v.meta.thrown:void 0,y=fe(v.error,v.meta,W);await I(C,y,v.meta)}throw T}},s.retry=(d,h,C)=>{let T={key:C.key,retry:{attempts:C.attempts,backoff:C.backoff,initialDelay:C.initialDelay,maxDelay:C.maxDelay,jitter:C.jitter,retryOn:C.retryOn,onRetry:C.onRetry},timeout:C.timeout,ttl:C.ttl};return s(d,h,T)},s.withTimeout=(d,h,C)=>{let T={key:C.key,timeout:C,ttl:C.ttl};return s(d,h,T)},s.sleep=(d,h,C)=>{if(typeof d!="string"||d.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let T=typeof h=="string"?mt(h):h;if(!T)throw new Error(`step.sleep: invalid duration '${h}'`);let v=Xe(T),W=C?.signal;return s(d,async()=>{if(L?.aborted||W?.aborted){let F=new Error("Sleep aborted");throw F.name="AbortError",F}return new Promise((F,Z)=>{let Y={timeoutId:void 0},D=()=>{Y.timeoutId&&clearTimeout(Y.timeoutId);let V=new Error("Sleep aborted");V.name="AbortError",Z(V)};L?.addEventListener("abort",D,{once:!0}),W?.addEventListener("abort",D,{once:!0}),Y.timeoutId=setTimeout(()=>{L?.removeEventListener("abort",D),W?.removeEventListener("abort",D),F(H(void 0))},v)})},{key:C?.key,ttl:C?.ttl,description:C?.description})};let z=new Map,g=new Map;return s.getWritable=d=>{let h=d?.namespace??"default",C=d?.highWaterMark??16;if(!A)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let T=`${b}:${h}`,v=z.get(T);if(v&&!v.closed&&!v.aborted)return v.writer;let W=Qt({highWaterMark:C,onStateChange:V=>{l({type:"stream_backpressure",workflowId:b,namespace:h,bufferedCount:W.bufferedCount,state:V,ts:Date.now()})}}),y=0,F=!0,Z=!1,Y=!1;l({type:"stream_created",workflowId:b,namespace:h,ts:Date.now()});let D={async write(V){if(Y)return K(Ye("closed","Stream is closed"));if(Z)return K(Ye("aborted","Stream was aborted"));W.state==="paused"&&await W.waitForDrain();let ne={value:V,position:y,ts:Date.now()},q=await A.append(b,h,ne);return q.ok?(l({type:"stream_write",workflowId:b,namespace:h,position:y,ts:Date.now()}),y++,W.increment(),H(void 0)):(l({type:"stream_error",workflowId:b,namespace:h,error:q.error,position:y,ts:Date.now()}),K(Ye("store_error",q.error.message,q.error)))},async close(){if(Y)return K(it("already_closed","Stream is already closed"));let V=await A.closeStream(b,h);return V.ok?(Y=!0,F=!1,l({type:"stream_close",workflowId:b,namespace:h,finalPosition:y,ts:Date.now()}),z.delete(T),H(void 0)):K(it("store_error",V.error.message,V.error))},abort(V){Z=!0,F=!1,Y=!0,l({type:"stream_error",workflowId:b,namespace:h,error:V,position:y,ts:Date.now()}),z.delete(T)},get writable(){return F},get position(){return y},get namespace(){return h}};return z.set(T,{writer:D,backpressure:W,aborted:Z,closed:Y}),D},s.getReadable=d=>{let h=d?.namespace??"default",C=d?.startIndex??0,T=d?.pollInterval??10,v=d?.pollTimeout??3e4;if(!A)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let W=`${b}:${h}:${C}`,y=g.get(W);if(y&&!y.closed)return y.reader;let F=()=>{let ye=`${b}:${h}`,te=z.get(ye);te&&te.backpressure.decrement()},Z=C,Y=!0,D=!1,V=[],ne=0,q={async read(){if(D)return K(at("closed","Reader is closed"));if(ne<V.length){let ae=V[ne++];return Z=ae.position+1,F(),l({type:"stream_read",workflowId:b,namespace:h,position:ae.position,ts:Date.now()}),H(ae.value)}let ye=`${b}:${h}`,te=Date.now(),se=z.has(ye),Q=await A.getMetadata(b,h),oe=Q.ok&&Q.value!==void 0;for(;Date.now()-te<v;){let ae=await A.read(b,h,Z,100);if(!ae.ok)return K(at("store_error",ae.error.message,ae.error));let De=ae.value;if(De.length>0){V=De,ne=1;let Ie=De[0];return Z=Ie.position+1,F(),l({type:"stream_read",workflowId:b,namespace:h,position:Ie.position,ts:Date.now()}),H(Ie.value)}let Me=z.has(ye),ge=await A.getMetadata(b,h),Et=ge.ok&&ge.value!==void 0;if(Me&&(se=!0),Et&&(oe=!0),ge.ok&&ge.value?.closed)return Y=!1,K(Ge(Z));if(se&&!Me&&!Et)return Y=!1,K(Ge(Z));oe&&!Me&&ge.ok&&ge.value?.closed,await new Promise(Ie=>setTimeout(Ie,T))}return Y=!1,K(Ge(Z))},close(){D=!0,Y=!1,V=[],g.delete(W)},get readable(){return Y},get position(){return Z},get namespace(){return h}};return g.set(W,{reader:q,position:Z,closed:D}),q},s.streamForEach=async(d,h,C)=>{let T=C?.checkpointInterval??1,v=C?.concurrency??1,W=[],y=0,F=-1,Z=D=>typeof D=="object"&&D!==null&&"read"in D&&typeof D.read=="function",Y=async(D,V,ne,q)=>{let te=T>0&&V%T===0?`stream-foreach:${q}:pos-${ne}`:void 0,se=te??`stream-item-${ne}`,Q=await s(se,()=>h(D,V),{key:te});return{index:V,position:ne,result:Q}};if(Z(d))if(v<=1){let D=d.position,V=await d.read();for(;V.ok;){let ne=V.value,{result:q}=await Y(ne,y,D,d.namespace);W.push(q),F=D,y++,D=d.position,V=await d.read()}}else{let D=new Map,V=0,ne=0,q=new Array(v).fill(null),ye=async()=>{for(let ae=0;ae<q.length;ae++)if(q[ae]===null)return ae;let Q=q.filter(ae=>ae!==null),oe=await Promise.race(Q);return D.set(oe.index,{position:oe.position,result:oe.result}),q[oe.slotIndex]=null,oe.slotIndex},te=d.position,se=await d.read();for(;se.ok;){let Q=await ye(),oe=V,ae=te,De=se.value,Me=Q;q[Q]=Y(De,oe,ae,d.namespace).then(ge=>({slotIndex:Me,...ge})),ne++,V++,te=d.position,se=await d.read()}for(let Q=0;Q<q.length;Q++)if(q[Q]!==null){let oe=await q[Q];D.set(oe.index,{position:oe.position,result:oe.result})}for(let Q=0;Q<ne;Q++){let oe=D.get(Q);oe&&(W.push(oe.result),F=oe.position,y++)}}else if(v<=1){let D=0;for await(let V of d){let{result:ne}=await Y(V,D,D,"async-iterable");W.push(ne),F=D,y++,D++}}else{let D=new Map,V=0,ne=0,q=new Array(v).fill(null),ye=async()=>{for(let Q=0;Q<q.length;Q++)if(q[Q]===null)return Q;let te=q.filter(Q=>Q!==null),se=await Promise.race(te);return D.set(se.index,se.result),q[se.slotIndex]=null,se.slotIndex};for await(let te of d){let se=await ye(),Q=V,oe=se;q[se]=Y(te,Q,Q,"async-iterable").then(ae=>({slotIndex:oe,...ae})),ne++,V++}for(let te=0;te<q.length;te++)if(q[te]!==null){let se=await q[te];D.set(se.index,se.result)}for(let te=0;te<ne;te++)D.has(te)&&(W.push(D.get(te)),F=te,y++)}return{results:W,processedCount:y,lastPosition:F}},s.if=f.if,s.label=f.label,s.branch=f.branch,s.arm=f.arm,s.forEach=f.forEach,s.item=f.item,s.dep=f.dep,s.run=(d,h,C)=>s(d,typeof h=="function"?h:()=>h,C),s.workflow=(d,h,C)=>s(d,h,C),s.andThen=(d,h,C,T)=>s(d,()=>C(h),T),s.match=(d,h,C,T)=>s(d,async()=>{let v=await h;return v.ok?H(await C.ok(v.value)):H(await C.err(v.error,v.cause))},T),s.all=(d,h,C)=>{let T=C!==void 0&&Object.prototype.hasOwnProperty.call(C,"key")?C:{...C,key:void 0};return s(d,async()=>H(await f.all(d,h)),T)},s.map=(d,h,C,T)=>{let v=T!==void 0&&Object.prototype.hasOwnProperty.call(T,"key")?T:{...T,key:void 0};return s(d,async()=>H(await f.map(d,h,C,T)),v)},s},we=({step:f})=>ee({step:j(f),deps:ue,ctx:p}),re;try{re=await We(we,{onError:Oe,onEvent:ce,catchUnexpected:ie,workflowId:b,workflowName:e,context:$,_workflowSignal:L})}finally{L&&L.removeEventListener("abort",G)}let ke=performance.now()-k;if(!re.ok){let f;if(Ke(re.cause)&&(f=re.cause),!f&&B&&At(re.error)){let s=re.cause;s!=null&&typeof s=="object"&&"name"in s&&s.name==="AbortError"&&(f={type:"WORKFLOW_CANCELLED",reason:J??(typeof L?.reason=="string"?L.reason:L?.reason instanceof Error?L.reason.message:void 0),lastStepKey:O})}if(f)return l({type:"workflow_cancelled",workflowId:b,ts:Date.now(),durationMs:ke,reason:f.reason,lastStepKey:f.lastStepKey}),f&&!Ke(re.cause)?K(re.error,{cause:f}):re}if(re.ok&&B){let f=J??(typeof L?.reason=="string"?L.reason:L?.reason instanceof Error?L.reason.message:void 0);l({type:"workflow_cancelled",workflowId:b,ts:Date.now(),durationMs:ke,reason:f,lastStepKey:O});let s={type:"WORKFLOW_CANCELLED",reason:f,lastStepKey:O};return K(ie(s),{cause:s})}return re.ok?l({type:"workflow_success",workflowId:b,ts:Date.now(),durationMs:ke}):l({type:"workflow_error",workflowId:b,ts:Date.now(),durationMs:ke,error:re.error}),re}function _(u,ee,M){let b,ue,m;return typeof u=="string"?(b=u,ue=ee,m=M):(ue=u,m=ee),S(b,ue,m)}async function x(u,ee,M){let b,ue,m;typeof u=="string"?(b=u,ue=ee,m=M):(ue=u,m=ee);let $=qe(),L=m?.onEvent,Oe={...m,onEvent:(Ee,E)=>{$.handleEvent(Ee);try{L?.(Ee,E)}catch{}}},Re,be;try{Re=await S(b,ue,Oe)}catch(Ee){let E=R?.catchUnexpected??He;Re=K(E(Ee),{cause:Ee})}finally{be=$.getResumeState()}return{result:Re,resumeState:be}}return{run:_,runWithState:x}}export{jr as Duration,Je as HOOK_STEP_KEY_PREFIX,xe as STEP_TIMEOUT_MARKER,Fe as SnapshotDecodeError,ze as SnapshotFormatError,rt as SnapshotMismatchError,Ae as UnexpectedError,Er as assertValidSnapshot,Ft as clearStep,qt as createApprovalStateCollector,Yt as createApprovalStep,Zt as createHook,qe as createResumeStateCollector,ir as createWorkflow,dt as days,Nt as deserializeResumeState,Gt as gatedStep,Lt as getPendingApprovals,zt as getPendingHooks,vt as getStepTimeoutMeta,Vt as hasPendingApproval,$t as hasPendingHook,ct as hours,jt as injectApproval,Ht as injectHook,Ot as isApprovalRejected,ar as isDuration,Fr as isInputValidationError,Ce as isPendingApproval,je as isPendingHook,$e as isResumeState,Wt as isSerializedResumeState,Ne as isStepComplete,et as isStepTimeoutError,Ke as isWorkflowCancelled,fr as isWorkflowSnapshot,Mt as looksLikeWorkflowSnapshot,wr as mergeSnapshots,ut as millis,pt as minutes,Jt as pendingApproval,Xt as pendingHook,We as run,lt as seconds,Ut as serializeResumeState,nr as toDays,rr as toHours,Xe as toMillis,tr as toMinutes,Kt as toResumeState,er as toSeconds,ft as validateInput,It as validateSnapshot};
|
|
11
11
|
//# sourceMappingURL=workflow.js.map
|