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.
Files changed (122) hide show
  1. package/README.md +27 -24
  2. package/dist/adapters.cjs +2 -0
  3. package/dist/adapters.cjs.map +1 -0
  4. package/dist/adapters.d.cts +176 -0
  5. package/dist/adapters.d.ts +176 -0
  6. package/dist/adapters.js +2 -0
  7. package/dist/adapters.js.map +1 -0
  8. package/dist/batch.cjs +1 -1
  9. package/dist/batch.cjs.map +1 -1
  10. package/dist/batch.d.cts +1 -1
  11. package/dist/batch.d.ts +1 -1
  12. package/dist/batch.js +1 -1
  13. package/dist/batch.js.map +1 -1
  14. package/dist/circuit-breaker.cjs +1 -1
  15. package/dist/circuit-breaker.cjs.map +1 -1
  16. package/dist/circuit-breaker.d.cts +1 -1
  17. package/dist/circuit-breaker.d.ts +1 -1
  18. package/dist/circuit-breaker.js +1 -1
  19. package/dist/circuit-breaker.js.map +1 -1
  20. package/dist/conditional.d.cts +1 -1
  21. package/dist/conditional.d.ts +1 -1
  22. package/dist/{core-C43KM7p0.d.cts → core-CxdbubQK.d.cts} +31 -5
  23. package/dist/{core-C43KM7p0.d.ts → core-CxdbubQK.d.ts} +31 -5
  24. package/dist/core.cjs +1 -1
  25. package/dist/core.cjs.map +1 -1
  26. package/dist/core.d.cts +1 -1
  27. package/dist/core.d.ts +1 -1
  28. package/dist/core.js +1 -1
  29. package/dist/core.js.map +1 -1
  30. package/dist/devtools.d.cts +1 -1
  31. package/dist/devtools.d.ts +1 -1
  32. package/dist/durable.cjs +2 -0
  33. package/dist/durable.cjs.map +1 -0
  34. package/dist/durable.d.cts +235 -0
  35. package/dist/durable.d.ts +235 -0
  36. package/dist/durable.js +2 -0
  37. package/dist/durable.js.map +1 -0
  38. package/dist/hitl.cjs +1 -1
  39. package/dist/hitl.cjs.map +1 -1
  40. package/dist/hitl.d.cts +3 -3
  41. package/dist/hitl.d.ts +3 -3
  42. package/dist/hitl.js +1 -1
  43. package/dist/hitl.js.map +1 -1
  44. package/dist/index.cjs +1 -1
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.cts +1 -1
  47. package/dist/index.d.ts +1 -1
  48. package/dist/index.js +1 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/otel.d.cts +1 -1
  51. package/dist/otel.d.ts +1 -1
  52. package/dist/persistence-Bps_-g2-.d.ts +402 -0
  53. package/dist/persistence-Co4_SpYv.d.cts +402 -0
  54. package/dist/persistence.cjs +1 -1
  55. package/dist/persistence.cjs.map +1 -1
  56. package/dist/persistence.d.cts +6 -309
  57. package/dist/persistence.d.ts +6 -309
  58. package/dist/persistence.js +1 -1
  59. package/dist/persistence.js.map +1 -1
  60. package/dist/policies.d.cts +1 -1
  61. package/dist/policies.d.ts +1 -1
  62. package/dist/ratelimit.cjs +1 -1
  63. package/dist/ratelimit.cjs.map +1 -1
  64. package/dist/ratelimit.d.cts +1 -1
  65. package/dist/ratelimit.d.ts +1 -1
  66. package/dist/ratelimit.js +1 -1
  67. package/dist/ratelimit.js.map +1 -1
  68. package/dist/reliability.cjs +1 -1
  69. package/dist/reliability.cjs.map +1 -1
  70. package/dist/reliability.d.cts +1 -1
  71. package/dist/reliability.d.ts +1 -1
  72. package/dist/reliability.js +1 -1
  73. package/dist/reliability.js.map +1 -1
  74. package/dist/resource.cjs +1 -1
  75. package/dist/resource.cjs.map +1 -1
  76. package/dist/resource.d.cts +1 -1
  77. package/dist/resource.d.ts +1 -1
  78. package/dist/resource.js +1 -1
  79. package/dist/resource.js.map +1 -1
  80. package/dist/retry.d.cts +388 -2
  81. package/dist/retry.d.ts +388 -2
  82. package/dist/saga.cjs +1 -1
  83. package/dist/saga.cjs.map +1 -1
  84. package/dist/saga.d.cts +1 -1
  85. package/dist/saga.d.ts +1 -1
  86. package/dist/saga.js +1 -1
  87. package/dist/saga.js.map +1 -1
  88. package/dist/singleflight.cjs +2 -0
  89. package/dist/singleflight.cjs.map +1 -0
  90. package/dist/singleflight.d.cts +142 -0
  91. package/dist/singleflight.d.ts +142 -0
  92. package/dist/singleflight.js +2 -0
  93. package/dist/singleflight.js.map +1 -0
  94. package/dist/testing.cjs +3 -11
  95. package/dist/testing.cjs.map +1 -1
  96. package/dist/testing.d.cts +50 -28
  97. package/dist/testing.d.ts +50 -28
  98. package/dist/testing.js +3 -11
  99. package/dist/testing.js.map +1 -1
  100. package/dist/visualize.d.cts +1 -1
  101. package/dist/visualize.d.ts +1 -1
  102. package/dist/webhook.cjs +1 -1
  103. package/dist/webhook.cjs.map +1 -1
  104. package/dist/webhook.d.cts +2 -2
  105. package/dist/webhook.d.ts +2 -2
  106. package/dist/webhook.js +1 -1
  107. package/dist/webhook.js.map +1 -1
  108. package/dist/{workflow-hmsoOkMh.d.ts → workflow-C1Pt6ZaO.d.cts} +124 -26
  109. package/dist/{workflow-B1vqSnHC.d.cts → workflow-DJd6N9dy.d.ts} +124 -26
  110. package/dist/workflow.cjs +1 -1
  111. package/dist/workflow.cjs.map +1 -1
  112. package/dist/workflow.d.cts +2 -2
  113. package/dist/workflow.d.ts +2 -2
  114. package/dist/workflow.js +1 -1
  115. package/dist/workflow.js.map +1 -1
  116. package/package.json +16 -6
  117. package/dist/schedule.cjs +0 -2
  118. package/dist/schedule.cjs.map +0 -1
  119. package/dist/schedule.d.cts +0 -387
  120. package/dist/schedule.d.ts +0 -387
  121. package/dist/schedule.js +0 -2
  122. 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, createStepCollector } from 'awaitly/workflow';
258
+ import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
257
259
 
258
260
  // Create a collector to automatically capture step results
259
- const collector = createStepCollector();
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.getState(); // Returns ResumeState
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, createStepCollector } from 'awaitly/workflow';
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 = createStepCollector();
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.getState();
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 = createStepCollector();
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.getState(), { userId: 'user-1' });
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, createStepCollector } from 'awaitly/workflow';
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 = createStepCollector();
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.getState();
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, createStepCollector } from 'awaitly/workflow';
831
+ import { createWorkflow, createResumeStateCollector } from 'awaitly/workflow';
830
832
 
831
833
  // Collect state during execution
832
- const collector = createStepCollector();
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.getState();
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, createStepCollector } from 'awaitly/workflow';
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 = createStepCollector();
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.getState();
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 [Coming from neverthrow](docs/coming-from-neverthrow.md) for pattern-by-pattern equivalents.
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, createStepCollector, isStepComplete } from 'awaitly/workflow';
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 (renamed from schedule for clarity)
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?** [The migration guide](docs/coming-from-neverthrow.md) shows pattern-by-pattern equivalents - you'll feel at home quickly.
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
- **Ready for production features?** [Advanced usage](docs/advanced.md) covers sagas, circuit breakers, rate limiting, persistence adapters, and HITL orchestration.
1275
+ **Need the full API?** [API reference](https://jagreehal.github.io/awaitly/reference/api/) has everything in one place.
1273
1276
 
1274
- **Need the full API?** [API reference](docs/api.md) has everything in one place.
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