awaitly 1.3.0 → 1.5.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/README.md +27 -24
- package/dist/adapters.cjs +2 -0
- package/dist/adapters.cjs.map +1 -0
- package/dist/adapters.d.cts +176 -0
- package/dist/adapters.d.ts +176 -0
- package/dist/adapters.js +2 -0
- package/dist/adapters.js.map +1 -0
- package/dist/batch.cjs +1 -1
- package/dist/batch.cjs.map +1 -1
- package/dist/batch.d.cts +1 -1
- package/dist/batch.d.ts +1 -1
- package/dist/batch.js +1 -1
- package/dist/batch.js.map +1 -1
- package/dist/circuit-breaker.cjs +1 -1
- package/dist/circuit-breaker.cjs.map +1 -1
- package/dist/circuit-breaker.d.cts +1 -1
- package/dist/circuit-breaker.d.ts +1 -1
- package/dist/circuit-breaker.js +1 -1
- package/dist/circuit-breaker.js.map +1 -1
- package/dist/conditional.d.cts +1 -1
- package/dist/conditional.d.ts +1 -1
- package/dist/{core-C43KM7p0.d.cts → core-CxdbubQK.d.cts} +31 -5
- package/dist/{core-C43KM7p0.d.ts → core-CxdbubQK.d.ts} +31 -5
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +1 -1
- package/dist/core.js.map +1 -1
- package/dist/devtools.d.cts +1 -1
- package/dist/devtools.d.ts +1 -1
- package/dist/durable.cjs +2 -0
- package/dist/durable.cjs.map +1 -0
- package/dist/durable.d.cts +235 -0
- package/dist/durable.d.ts +235 -0
- package/dist/durable.js +2 -0
- package/dist/durable.js.map +1 -0
- package/dist/hitl.cjs +1 -1
- package/dist/hitl.cjs.map +1 -1
- package/dist/hitl.d.cts +3 -3
- package/dist/hitl.d.ts +3 -3
- package/dist/hitl.js +1 -1
- package/dist/hitl.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/otel.d.cts +1 -1
- package/dist/otel.d.ts +1 -1
- package/dist/persistence-Bps_-g2-.d.ts +402 -0
- package/dist/persistence-Co4_SpYv.d.cts +402 -0
- package/dist/persistence.cjs +1 -1
- package/dist/persistence.cjs.map +1 -1
- package/dist/persistence.d.cts +6 -309
- package/dist/persistence.d.ts +6 -309
- package/dist/persistence.js +1 -1
- package/dist/persistence.js.map +1 -1
- package/dist/policies.d.cts +1 -1
- package/dist/policies.d.ts +1 -1
- package/dist/ratelimit.cjs +1 -1
- package/dist/ratelimit.cjs.map +1 -1
- package/dist/ratelimit.d.cts +1 -1
- package/dist/ratelimit.d.ts +1 -1
- package/dist/ratelimit.js +1 -1
- package/dist/ratelimit.js.map +1 -1
- package/dist/reliability.cjs +1 -1
- package/dist/reliability.cjs.map +1 -1
- package/dist/reliability.d.cts +1 -1
- package/dist/reliability.d.ts +1 -1
- package/dist/reliability.js +1 -1
- package/dist/reliability.js.map +1 -1
- package/dist/resource.cjs +1 -1
- package/dist/resource.cjs.map +1 -1
- package/dist/resource.d.cts +1 -1
- package/dist/resource.d.ts +1 -1
- package/dist/resource.js +1 -1
- package/dist/resource.js.map +1 -1
- package/dist/retry.d.cts +388 -2
- package/dist/retry.d.ts +388 -2
- package/dist/saga.cjs +1 -1
- package/dist/saga.cjs.map +1 -1
- package/dist/saga.d.cts +1 -1
- package/dist/saga.d.ts +1 -1
- package/dist/saga.js +1 -1
- package/dist/saga.js.map +1 -1
- package/dist/singleflight.cjs +2 -0
- package/dist/singleflight.cjs.map +1 -0
- package/dist/singleflight.d.cts +142 -0
- package/dist/singleflight.d.ts +142 -0
- package/dist/singleflight.js +2 -0
- package/dist/singleflight.js.map +1 -0
- package/dist/testing.cjs +3 -11
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +50 -28
- package/dist/testing.d.ts +50 -28
- package/dist/testing.js +3 -11
- package/dist/testing.js.map +1 -1
- package/dist/visualize.d.cts +1 -1
- package/dist/visualize.d.ts +1 -1
- package/dist/webhook.cjs +1 -1
- package/dist/webhook.cjs.map +1 -1
- package/dist/webhook.d.cts +2 -2
- package/dist/webhook.d.ts +2 -2
- package/dist/webhook.js +1 -1
- package/dist/webhook.js.map +1 -1
- package/dist/{workflow-hmsoOkMh.d.ts → workflow-C1Pt6ZaO.d.cts} +124 -26
- package/dist/{workflow-B1vqSnHC.d.cts → workflow-DJd6N9dy.d.ts} +124 -26
- package/dist/workflow.cjs +1 -1
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +1 -1
- package/dist/workflow.js.map +1 -1
- package/package.json +16 -6
- package/dist/schedule.cjs +0 -2
- package/dist/schedule.cjs.map +0 -1
- package/dist/schedule.d.cts +0 -387
- package/dist/schedule.d.ts +0 -387
- package/dist/schedule.js +0 -2
- package/dist/schedule.js.map +0 -1
package/README.md
CHANGED
|
@@ -12,6 +12,8 @@ This library fixes that. Your errors become **first-class citizens** with full t
|
|
|
12
12
|
npm install awaitly
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
+
📚 **[Full Documentation](https://jagreehal.github.io/awaitly/)** — guides, API reference, and examples.
|
|
16
|
+
|
|
15
17
|
**What you get:**
|
|
16
18
|
|
|
17
19
|
- **Automatic error inference** - Error types flow from your dependencies. Add a step? The union updates. Remove one? It updates. Zero manual tracking.
|
|
@@ -253,10 +255,10 @@ Save workflow state to a database and resume later from exactly where you left o
|
|
|
253
255
|
**Step 1: Collect state during execution**
|
|
254
256
|
|
|
255
257
|
```typescript
|
|
256
|
-
import { createWorkflow,
|
|
258
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
257
259
|
|
|
258
260
|
// Create a collector to automatically capture step results
|
|
259
|
-
const collector =
|
|
261
|
+
const collector = createResumeStateCollector();
|
|
260
262
|
|
|
261
263
|
const workflow = createWorkflow({ fetchUser, fetchPosts }, {
|
|
262
264
|
onEvent: collector.handleEvent, // Automatically collects step_complete events
|
|
@@ -270,7 +272,7 @@ await workflow(async (step) => {
|
|
|
270
272
|
});
|
|
271
273
|
|
|
272
274
|
// Get the collected state
|
|
273
|
-
const state = collector.
|
|
275
|
+
const state = collector.getResumeState(); // Returns ResumeState
|
|
274
276
|
```
|
|
275
277
|
|
|
276
278
|
**Step 2: Save to database**
|
|
@@ -478,11 +480,11 @@ Save workflow state to a database and resume later. Perfect for crash recovery,
|
|
|
478
480
|
### Basic Save & Resume
|
|
479
481
|
|
|
480
482
|
```typescript
|
|
481
|
-
import { createWorkflow,
|
|
483
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
482
484
|
import { stringifyState, parseState } from 'awaitly/persistence';
|
|
483
485
|
|
|
484
486
|
// 1. Collect state during execution
|
|
485
|
-
const collector =
|
|
487
|
+
const collector = createResumeStateCollector();
|
|
486
488
|
const workflow = createWorkflow({ fetchUser, fetchPosts }, {
|
|
487
489
|
onEvent: collector.handleEvent,
|
|
488
490
|
});
|
|
@@ -494,7 +496,7 @@ await workflow(async (step) => {
|
|
|
494
496
|
});
|
|
495
497
|
|
|
496
498
|
// 2. Save to database
|
|
497
|
-
const state = collector.
|
|
499
|
+
const state = collector.getResumeState();
|
|
498
500
|
const json = stringifyState(state, { workflowId: "123" });
|
|
499
501
|
await db.workflowStates.create({ id: "123", state: json });
|
|
500
502
|
|
|
@@ -533,11 +535,11 @@ const persistence = createStatePersistence({
|
|
|
533
535
|
}, 'workflow:state:');
|
|
534
536
|
|
|
535
537
|
// Save
|
|
536
|
-
const collector =
|
|
538
|
+
const collector = createResumeStateCollector();
|
|
537
539
|
const workflow = createWorkflow(deps, { onEvent: collector.handleEvent });
|
|
538
540
|
await workflow(async (step) => { /* ... */ });
|
|
539
541
|
|
|
540
|
-
await persistence.save('run-123', collector.
|
|
542
|
+
await persistence.save('run-123', collector.getResumeState(), { userId: 'user-1' });
|
|
541
543
|
|
|
542
544
|
// Load and resume
|
|
543
545
|
const savedState = await persistence.load('run-123');
|
|
@@ -625,7 +627,7 @@ const result = await resilientWorkflow(async (step) => {
|
|
|
625
627
|
Pause long-running workflows until an operator approves, then resume using persisted step results.
|
|
626
628
|
|
|
627
629
|
```typescript
|
|
628
|
-
import { createWorkflow,
|
|
630
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
629
631
|
import {
|
|
630
632
|
createApprovalStep,
|
|
631
633
|
injectApproval,
|
|
@@ -633,7 +635,7 @@ import {
|
|
|
633
635
|
} from 'awaitly/hitl';
|
|
634
636
|
|
|
635
637
|
// Use collector to automatically capture state
|
|
636
|
-
const collector =
|
|
638
|
+
const collector = createResumeStateCollector();
|
|
637
639
|
const requireApproval = createApprovalStep({
|
|
638
640
|
key: 'approval:deploy',
|
|
639
641
|
checkApproval: async () => ({ status: 'pending' }),
|
|
@@ -647,7 +649,7 @@ const result = await gatedWorkflow(async (step) => step(requireApproval, { key:
|
|
|
647
649
|
|
|
648
650
|
if (!result.ok && isPendingApproval(result.error)) {
|
|
649
651
|
// Get collected state
|
|
650
|
-
const state = collector.
|
|
652
|
+
const state = collector.getResumeState();
|
|
651
653
|
|
|
652
654
|
// Later, when approval is granted, inject it and resume
|
|
653
655
|
const updatedState = injectApproval(state, {
|
|
@@ -826,10 +828,10 @@ const result = await validateAndCheckout(async (step) => {
|
|
|
826
828
|
- **State save & resume** - Persist step completions and resume later.
|
|
827
829
|
|
|
828
830
|
```typescript
|
|
829
|
-
import { createWorkflow,
|
|
831
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
830
832
|
|
|
831
833
|
// Collect state during execution
|
|
832
|
-
const collector =
|
|
834
|
+
const collector = createResumeStateCollector();
|
|
833
835
|
const workflow = createWorkflow(deps, {
|
|
834
836
|
onEvent: collector.handleEvent, // Automatically collects step_complete events
|
|
835
837
|
});
|
|
@@ -840,7 +842,7 @@ const result = await validateAndCheckout(async (step) => {
|
|
|
840
842
|
});
|
|
841
843
|
|
|
842
844
|
// Get collected state
|
|
843
|
-
const state = collector.
|
|
845
|
+
const state = collector.getResumeState();
|
|
844
846
|
|
|
845
847
|
// Resume later
|
|
846
848
|
const resumed = createWorkflow(deps, { resumeState: state });
|
|
@@ -900,13 +902,13 @@ The scariest failure mode in payments: **charge succeeded, but persistence faile
|
|
|
900
902
|
Step keys + persistence solve this. Save state to a database, and if the workflow crashes, resume from the last successful step:
|
|
901
903
|
|
|
902
904
|
```typescript
|
|
903
|
-
import { createWorkflow,
|
|
905
|
+
import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
|
|
904
906
|
import { stringifyState, parseState } from 'awaitly/persistence';
|
|
905
907
|
|
|
906
908
|
const processPayment = createWorkflow({ validateCard, chargeProvider, persistResult });
|
|
907
909
|
|
|
908
910
|
// Collect state for persistence
|
|
909
|
-
const collector =
|
|
911
|
+
const collector = createResumeStateCollector();
|
|
910
912
|
const workflow = createWorkflow(
|
|
911
913
|
{ validateCard, chargeProvider, persistResult },
|
|
912
914
|
{ onEvent: collector.handleEvent }
|
|
@@ -929,7 +931,7 @@ const result = await workflow(async (step) => {
|
|
|
929
931
|
|
|
930
932
|
// Save state after each run (or on crash)
|
|
931
933
|
if (result.ok) {
|
|
932
|
-
const state = collector.
|
|
934
|
+
const state = collector.getResumeState();
|
|
933
935
|
const json = stringifyState(state, { orderId: input.orderId });
|
|
934
936
|
await db.workflowStates.upsert({
|
|
935
937
|
where: { idempotencyKey: input.idempotencyKey },
|
|
@@ -1020,7 +1022,7 @@ flowchart TD
|
|
|
1020
1022
|
|
|
1021
1023
|
**When to use awaitly:** You want typed Results with async/await syntax, automatic error inference, and built-in reliability primitives.
|
|
1022
1024
|
|
|
1023
|
-
See [
|
|
1025
|
+
See the [comparison table above](#vs-neverthrow) for pattern-by-pattern equivalents.
|
|
1024
1026
|
|
|
1025
1027
|
### Where awaitly shines
|
|
1026
1028
|
|
|
@@ -1153,7 +1155,7 @@ import { ok, err, map, all, run } from 'awaitly';
|
|
|
1153
1155
|
import { ok, err, map, TaggedError, Match } from 'awaitly/core';
|
|
1154
1156
|
|
|
1155
1157
|
// Workflow layer - orchestration, Duration, step collector
|
|
1156
|
-
import { createWorkflow, Duration,
|
|
1158
|
+
import { createWorkflow, Duration, createResumeStateCollector, isStepComplete } from 'awaitly/workflow';
|
|
1157
1159
|
|
|
1158
1160
|
// Visualization tools
|
|
1159
1161
|
import { createVisualizer } from 'awaitly/visualize';
|
|
@@ -1164,9 +1166,8 @@ import { processInBatches } from 'awaitly/batch';
|
|
|
1164
1166
|
// Resource management
|
|
1165
1167
|
import { createResourceScope, withScope } from 'awaitly/resource';
|
|
1166
1168
|
|
|
1167
|
-
// Retry strategies
|
|
1169
|
+
// Retry strategies
|
|
1168
1170
|
import { Schedule, Duration } from 'awaitly/retry';
|
|
1169
|
-
import { Schedule } from 'awaitly/schedule'; // Legacy alias
|
|
1170
1171
|
|
|
1171
1172
|
// Reliability patterns (umbrella)
|
|
1172
1173
|
import { createCircuitBreaker, createRateLimiter, createSagaWorkflow } from 'awaitly/reliability';
|
|
@@ -1267,11 +1268,13 @@ console.log(collector.visualizeAs('mermaid'));
|
|
|
1267
1268
|
|
|
1268
1269
|
## Keep Going
|
|
1269
1270
|
|
|
1270
|
-
**Already using neverthrow?** [
|
|
1271
|
+
**Already using neverthrow?** See the [comparison table above](#vs-neverthrow) for pattern-by-pattern equivalents - you'll feel at home quickly.
|
|
1272
|
+
|
|
1273
|
+
**Ready for production features?** The [advanced guides](https://jagreehal.github.io/awaitly/advanced/saga-compensation/) cover sagas, circuit breakers, rate limiting, persistence adapters, and HITL orchestration.
|
|
1271
1274
|
|
|
1272
|
-
**
|
|
1275
|
+
**Need the full API?** [API reference](https://jagreehal.github.io/awaitly/reference/api/) has everything in one place.
|
|
1273
1276
|
|
|
1274
|
-
**
|
|
1277
|
+
**Explore all guides:** [Documentation site](https://jagreehal.github.io/awaitly/) has the complete set of guides, tutorials, and reference material.
|
|
1275
1278
|
|
|
1276
1279
|
---
|
|
1277
1280
|
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var G=Object.defineProperty;var ye=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var we=Object.prototype.hasOwnProperty;var Te=(e,n)=>{for(var E in n)G(e,E,{get:n[E],enumerable:!0})},ke=(e,n,E,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let d of me(n))!we.call(e,d)&&d!==E&&G(e,d,{get:()=>n[d],enumerable:!(i=ye(n,d))||i.enumerable});return e};var de=e=>ke(G({},"__esModule",{value:!0}),e);var be={};Te(be,{fromCallback:()=>ie,fromEvent:()=>pe,isEventEmitterLike:()=>le,isEventTimeoutError:()=>ue,isInvalidEmitterError:()=>ae});module.exports=de(be);var L=e=>({ok:!0,value:e}),v=(e,n)=>({ok:!1,error:e,...n?.cause!==void 0?{cause:n.cause}:{}});var fe=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",V=Symbol.for("step_timeout_marker");function ne(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:V in e}function Re(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let n=e;return{timeoutMs:n.timeoutMs,stepName:n.stepName,stepKey:n.stepKey,attempt:n.attempt}}if(V in e)return e[V]}}var oe=Symbol("early-exit");function Ce(e,n){return{[oe]:!0,error:e,meta:n}}function xe(e){return typeof e=="object"&&e!==null&&e[oe]===!0}var se=Symbol("mapper-exception");function ge(e){return{[se]:!0,thrown:e}}function Se(e){return typeof e=="object"&&e!==null&&e[se]===!0}function Ae(e){return typeof e=="string"?{name:e}:e??{}}function H(e,n){let{backoff:E,initialDelay:i,maxDelay:d,jitter:A}=n,w;switch(E){case"fixed":w=i;break;case"linear":w=i*e;break;case"exponential":w=i*Math.pow(2,e-1);break}if(w=Math.min(w,d),A){let M=w*.25*Math.random();w=w+M}return Math.floor(w)}function z(e){return new Promise(n=>setTimeout(n,e))}var te=Symbol("timeout");async function ve(e,n,E,i){let d=new AbortController,A=n.error??{type:"STEP_TIMEOUT",stepName:E.name,stepKey:E.key,timeoutMs:n.ms,attempt:E.attempt},w;i?.aborted&&d.abort(i.reason);let M;i&&!i.aborted&&(M=()=>d.abort(i.reason),i.addEventListener("abort",M,{once:!0}));let u=new Promise((R,C)=>{w=setTimeout(()=>{d.abort(),C({[te]:!0,error:A})},n.ms)}),U;n.signal?U=Promise.resolve(e(d.signal)):U=Promise.resolve(e());try{return await Promise.race([U,u])}catch(R){if(typeof R=="object"&&R!==null&&R[te]===!0){let C=R.error;if(typeof C=="object"&&C!==null&&C.type!=="STEP_TIMEOUT"){let S={timeoutMs:n.ms,stepName:E.name,stepKey:E.key,attempt:E.attempt};V in C?C[V]=S:Object.defineProperty(C,V,{value:S,enumerable:!1,writable:!0,configurable:!1})}throw C}throw R}finally{clearTimeout(w),M&&i&&i.removeEventListener("abort",M)}}var j={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function re(e,n){let{onError:E,onEvent:i,catchUnexpected:d,workflowId:A,context:w,_workflowSignal:M}=n&&typeof n=="object"?n:{},u=A??crypto.randomUUID(),U=!E&&!d,R=[],C=0,S=r=>r??`step_${++C}`,p=r=>{let b=r.context!==void 0||w===void 0?r:{...r,context:w};if(b.type==="step_success"){let O=b.stepId;for(let F=R.length-1;F>=0;F--){let B=R[F];if(B.type==="race"&&!B.winnerId){B.winnerId=O;break}}}i?.(b,w)},D=Ce,ee=r=>xe(r),J=(r,b)=>U?b?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:r,...b.resultCause!==void 0?{cause:b.resultCause}:{}}}:b?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:r,thrown:b.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:r}}:r,ce=r=>({type:"UNEXPECTED_ERROR",cause:r.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:r.error,...r.meta.resultCause!==void 0?{cause:r.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:r.error,thrown:r.meta.thrown}});try{let b=function(m,a){let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),o=!1;R.push({scopeId:s,type:"parallel"});let x=()=>{if(o)return;o=!0;let c=R.findIndex(l=>l.scopeId===s);c!==-1&&R.splice(c,1),p({type:"scope_end",workflowId:u,scopeId:s,ts:Date.now(),durationMs:performance.now()-t})};p({type:"scope_start",workflowId:u,scopeId:s,scopeType:"parallel",name:m,ts:Date.now()});try{let c=await a();if(x(),!c.ok)throw E?.(c.error,m,w),D(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw x(),c}})()},O=function(m,a){let s=Object.keys(m),t=a.name??`Parallel(${s.join(", ")})`,o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let x=performance.now(),c=!1;R.push({scopeId:o,type:"parallel"});let l=()=>{if(c)return;c=!0;let T=R.findIndex(f=>f.scopeId===o);T!==-1&&R.splice(T,1),p({type:"scope_end",workflowId:u,scopeId:o,ts:Date.now(),durationMs:performance.now()-x})};p({type:"scope_start",workflowId:u,scopeId:o,scopeType:"parallel",name:t,ts:Date.now()});try{let T=await new Promise(h=>{if(s.length===0){h([]);return}let _=!1,g=s.length,W=new Array(s.length);for(let I=0;I<s.length;I++){let N=s[I],Y=I;Promise.resolve(m[N]()).catch(k=>v({type:"PROMISE_REJECTED",cause:k},{cause:{type:"PROMISE_REJECTION",reason:k}})).then(k=>{if(!_){if(!k.ok){_=!0,h([{key:N,result:k}]);return}W[Y]={key:N,result:k},g--,g===0&&h(W)}})}});l();let f={};for(let{key:h,result:_}of T){if(!_.ok)throw E?.(_.error,h,w),D(_.error,{origin:"result",resultCause:_.cause});f[h]=_.value}return f}catch(T){throw l(),T}})()};var Pe=b,he=O;let r=(m,a)=>(async()=>{let s=Ae(a),{name:t,key:o,retry:x,timeout:c}=s,l=S(o),T=i,f=T?performance.now():0;if(!(typeof m=="function")){if(x&&x.attempts>1)throw new Error("step: retry options require a function operation. Direct Promise/Result values cannot be re-executed on retry. Wrap your operation in a function: step(() => yourOperation, { retry: {...} })");if(c)throw new Error("step: timeout options require a function operation. Direct Promise/Result values cannot be wrapped with timeout after they've started. Wrap your operation in a function: step(() => yourOperation, { timeout: {...} })")}let g={attempts:Math.max(1,x?.attempts??1),backoff:x?.backoff??j.backoff,initialDelay:x?.initialDelay??j.initialDelay,maxDelay:x?.maxDelay??j.maxDelay,jitter:x?.jitter??j.jitter,retryOn:x?.retryOn??j.retryOn,onRetry:x?.onRetry??j.onRetry};i&&p({type:"step_start",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now()});let W;for(let k=1;k<=g.attempts;k++){let Ee=T?performance.now():0;try{let y;if(typeof m=="function"?c?y=await ve(m,c,{name:t,key:o,attempt:k},M):y=await m():y=await m,y.ok){let K=performance.now()-f;return p({type:"step_success",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),durationMs:K}),o&&p({type:"step_complete",workflowId:u,stepKey:o,name:t,ts:Date.now(),durationMs:K,result:y}),y.value}if(W=y,k<g.attempts&&g.retryOn(y.error,k)){let K=H(k,g);p({type:"step_retry",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),attempt:k+1,maxAttempts:g.attempts,delayMs:K,error:y.error}),g.onRetry(y.error,k,K),await z(K);continue}g.attempts>1&&p({type:"step_retries_exhausted",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),durationMs:performance.now()-f,attempts:k,lastError:y.error});break}catch(y){let K=performance.now()-Ee;if(ee(y))throw p({type:"step_aborted",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),durationMs:K}),y;if(ne(y)){let P=Re(y),$=c?.ms??P?.timeoutMs??0;if(p({type:"step_timeout",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),timeoutMs:$,attempt:k}),k<g.attempts&&g.retryOn(y,k)){let q=H(k,g);p({type:"step_retry",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),attempt:k+1,maxAttempts:g.attempts,delayMs:q,error:y}),g.onRetry(y,k,q),await z(q);continue}g.attempts>1&&p({type:"step_retries_exhausted",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),durationMs:performance.now()-f,attempts:k,lastError:y})}if(k<g.attempts&&g.retryOn(y,k)){let P=H(k,g);p({type:"step_retry",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),attempt:k+1,maxAttempts:g.attempts,delayMs:P,error:y}),g.onRetry(y,k,P),await z(P);continue}g.attempts>1&&!ne(y)&&p({type:"step_retries_exhausted",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),durationMs:performance.now()-f,attempts:k,lastError:y});let X=performance.now()-f;if(d){let P;try{P=d(y)}catch($){throw ge($)}throw p({type:"step_error",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),durationMs:X,error:P}),o&&p({type:"step_complete",workflowId:u,stepKey:o,name:t,ts:Date.now(),durationMs:X,result:v(P,{cause:y}),meta:{origin:"throw",thrown:y}}),E?.(P,t,w),D(P,{origin:"throw",thrown:y})}else{let P={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:y}};throw p({type:"step_error",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),durationMs:X,error:P}),o&&p({type:"step_complete",workflowId:u,stepKey:o,name:t,ts:Date.now(),durationMs:X,result:v(P,{cause:y}),meta:{origin:"throw",thrown:y}}),y}}}let I=W,N=performance.now()-f,Y=J(I.error,{origin:"result",resultCause:I.cause});throw p({type:"step_error",workflowId:u,stepId:l,stepKey:o,name:t,ts:Date.now(),durationMs:N,error:Y}),o&&p({type:"step_complete",workflowId:u,stepKey:o,name:t,ts:Date.now(),durationMs:N,result:I,meta:{origin:"result",resultCause:I.cause}}),E?.(I.error,t,w),D(I.error,{origin:"result",resultCause:I.cause})})();r.try=(m,a)=>{let s=a.name,t=a.key,o=S(t),x="error"in a?()=>a.error:a.onError,c=i;return(async()=>{let l=c?performance.now():0;i&&p({type:"step_start",workflowId:u,stepId:o,stepKey:t,name:s,ts:Date.now()});try{let T=await m(),f=performance.now()-l;return p({type:"step_success",workflowId:u,stepId:o,stepKey:t,name:s,ts:Date.now(),durationMs:f}),t&&p({type:"step_complete",workflowId:u,stepKey:t,name:s,ts:Date.now(),durationMs:f,result:L(T)}),T}catch(T){let f=x(T),h=performance.now()-l,_=J(f,{origin:"throw",thrown:T});throw p({type:"step_error",workflowId:u,stepId:o,stepKey:t,name:s,ts:Date.now(),durationMs:h,error:_}),t&&p({type:"step_complete",workflowId:u,stepKey:t,name:s,ts:Date.now(),durationMs:h,result:v(f,{cause:T}),meta:{origin:"throw",thrown:T}}),E?.(f,s,w),D(f,{origin:"throw",thrown:T})}})()},r.fromResult=(m,a)=>{let s=a.name,t=a.key,o=S(t),x="error"in a?()=>a.error:a.onError,c=i;return(async()=>{let l=c?performance.now():0;i&&p({type:"step_start",workflowId:u,stepId:o,stepKey:t,name:s,ts:Date.now()});let T=await m();if(T.ok){let f=performance.now()-l;return p({type:"step_success",workflowId:u,stepId:o,stepKey:t,name:s,ts:Date.now(),durationMs:f}),t&&p({type:"step_complete",workflowId:u,stepKey:t,name:s,ts:Date.now(),durationMs:f,result:L(T.value)}),T.value}else{let f=x(T.error),h=performance.now()-l,_=J(f,{origin:"result",resultCause:T.error});throw p({type:"step_error",workflowId:u,stepId:o,stepKey:t,name:s,ts:Date.now(),durationMs:h,error:_}),t&&p({type:"step_complete",workflowId:u,stepKey:t,name:s,ts:Date.now(),durationMs:h,result:v(f,{cause:T.error}),meta:{origin:"result",resultCause:T.error}}),E?.(f,s,w),D(f,{origin:"result",resultCause:T.error})}})()},r.retry=(m,a)=>r(m,{name:a.name,key:a.key,retry:{attempts:a.attempts,backoff:a.backoff,initialDelay:a.initialDelay,maxDelay:a.maxDelay,jitter:a.jitter,retryOn:a.retryOn,onRetry:a.onRetry},timeout:a.timeout}),r.withTimeout=(m,a)=>r(m,{name:a.name,key:a.key,timeout:a}),r.parallel=((...m)=>{if(typeof m[0]=="string"){let a=m[0],s=m[1];return b(a,s)}else{let a=m[0],s=m[1]??{};return O(a,s)}}),r.race=(m,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),o=!1,x={scopeId:s,type:"race",winnerId:void 0};R.push(x);let c=()=>{if(o)return;o=!0;let l=R.findIndex(T=>T.scopeId===s);l!==-1&&R.splice(l,1),p({type:"scope_end",workflowId:u,scopeId:s,ts:Date.now(),durationMs:performance.now()-t,winnerId:x.winnerId})};p({type:"scope_start",workflowId:u,scopeId:s,scopeType:"race",name:m,ts:Date.now()});try{let l=await a();if(c(),!l.ok)throw E?.(l.error,m,w),D(l.error,{origin:"result",resultCause:l.cause});return l.value}catch(l){throw c(),l}})()},r.allSettled=(m,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),o=!1;R.push({scopeId:s,type:"allSettled"});let x=()=>{if(o)return;o=!0;let c=R.findIndex(l=>l.scopeId===s);c!==-1&&R.splice(c,1),p({type:"scope_end",workflowId:u,scopeId:s,ts:Date.now(),durationMs:performance.now()-t})};p({type:"scope_start",workflowId:u,scopeId:s,scopeType:"allSettled",name:m,ts:Date.now()});try{let c=await a();if(x(),!c.ok)throw E?.(c.error,m,w),D(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw x(),c}})()};let B=await e(r);return L(B)}catch(r){if(Se(r))throw r.thrown;if(ee(r)){let O=r.meta.origin==="throw"?r.meta.thrown:r.meta.resultCause;if(d||E)return v(r.error,{cause:O});if(fe(r.error))return v(r.error,{cause:O});let F=ce(r);return v(F,{cause:O})}if(d){let O=d(r);return E?.(O,"unexpected",w),v(O,{cause:r})}let b={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:r}};return E?.(b,"unexpected",w),v(b,{cause:r})}}re.strict=(e,n)=>re(e,n);function ue(e){return typeof e=="object"&&e!==null&&e.type==="EVENT_TIMEOUT"}function ae(e){return typeof e=="object"&&e!==null&&e.type==="INVALID_EMITTER"}function ie(e,n){return new Promise(E=>{try{e((i,d)=>{if(i){let A=n?.onError?n.onError(i):i;E(v(A,{cause:i}))}else E(L(d))})}catch(i){let d=i instanceof Error?i:new Error(String(i)),A=n?.onError?n.onError(d):d;E(v(A,{cause:i}))}})}function Q(e){return typeof e=="object"&&e!==null&&"on"in e&&"off"in e&&typeof e.on=="function"&&typeof e.off=="function"}function Z(e){return typeof e=="object"&&e!==null&&"addEventListener"in e&&"removeEventListener"in e&&typeof e.addEventListener=="function"&&typeof e.removeEventListener=="function"}function pe(e,n,E){return new Promise(i=>{let d,A=!1,w=Q(e)?(C,S)=>e.on(C,S):Z(e)?(C,S)=>e.addEventListener(C,S):null,M=Q(e)?(C,S)=>e.off(C,S):Z(e)?(C,S)=>e.removeEventListener(C,S):null;if(!w||!M){i(v({type:"INVALID_EMITTER",message:"Object does not have on/off or addEventListener/removeEventListener"}));return}let u=(...C)=>{A||(A=!0,R(),i(L(C[0])))},U=(...C)=>{if(A)return;A=!0,R();let S=C[0],p=E?.onError?E.onError(S):S;i(v(p,{cause:S}))},R=()=>{d&&clearTimeout(d),M(n.success,u),n.error&&M(n.error,U)};w(n.success,u),n.error&&w(n.error,U),n.timeout&&(d=setTimeout(()=>{if(A)return;A=!0,R();let C={type:"EVENT_TIMEOUT",event:n.success,timeoutMs:n.timeout};i(v(C))},n.timeout))})}function le(e){return Q(e)||Z(e)}0&&(module.exports={fromCallback,fromEvent,isEventEmitterLike,isEventTimeoutError,isInvalidEmitterError});
|
|
2
|
+
//# sourceMappingURL=adapters.cjs.map
|