@jagreehal/workflow 1.7.0 → 1.8.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 +244 -0
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +98 -12
- package/dist/core.d.ts +98 -12
- package/dist/core.js +1 -1
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +282 -17
- package/dist/index.d.ts +282 -17
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/workflow.cjs +1 -1
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +47 -15
- package/dist/workflow.d.ts +47 -15
- package/dist/workflow.js +1 -1
- package/dist/workflow.js.map +1 -1
- package/docs/advanced.md +57 -4
- package/docs/api.md +37 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -580,6 +580,250 @@ if (!result.ok && isPendingApproval(result.error)) {
|
|
|
580
580
|
| **Events** | `onEvent` streams everything - timing, retries, failures - for visualization or logging |
|
|
581
581
|
| **Resume** | Save completed steps, pick up later (great for approvals or crashes) |
|
|
582
582
|
| **UnexpectedError** | Safety net for throws outside your declared union; use `strict` mode to force explicit handling |
|
|
583
|
+
| **TaggedError** | Factory for rich error types with exhaustive pattern matching |
|
|
584
|
+
|
|
585
|
+
## Tagged Errors: When String Literals Aren't Enough
|
|
586
|
+
|
|
587
|
+
String literal errors like `'NOT_FOUND'` are perfect for simple cases. But sometimes you need **rich error objects** with contextual data. That's where `TaggedError` shines.
|
|
588
|
+
|
|
589
|
+
### When to Use What
|
|
590
|
+
|
|
591
|
+
| Use Case | Recommendation |
|
|
592
|
+
|----------|----------------|
|
|
593
|
+
| Simple, distinct error states | String literals: `'NOT_FOUND' \| 'UNAUTHORIZED'` |
|
|
594
|
+
| Errors with contextual data | TaggedError: `NotFoundError { id, resource }` |
|
|
595
|
+
| Multiple error variants to handle | TaggedError with `match()` for exhaustive handling |
|
|
596
|
+
| API responses or user messages | TaggedError for structured error details |
|
|
597
|
+
|
|
598
|
+
### String Literals (Simple Cases)
|
|
599
|
+
|
|
600
|
+
For most workflows, string literals are cleaner and simpler:
|
|
601
|
+
|
|
602
|
+
```typescript
|
|
603
|
+
const fetchUser = async (id: string): AsyncResult<User, 'NOT_FOUND' | 'DB_ERROR'> =>
|
|
604
|
+
id ? ok({ id, name: 'Alice' }) : err('NOT_FOUND');
|
|
605
|
+
|
|
606
|
+
const result = await workflow(async (step) => {
|
|
607
|
+
const user = await step(fetchUser('123'));
|
|
608
|
+
return user;
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
if (!result.ok) {
|
|
612
|
+
switch (result.error) {
|
|
613
|
+
case 'NOT_FOUND': return res.status(404).send('User not found');
|
|
614
|
+
case 'DB_ERROR': return res.status(500).send('Database error');
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
### TaggedError (Rich Error Objects)
|
|
620
|
+
|
|
621
|
+
Use `TaggedError` when you need to carry additional context:
|
|
622
|
+
|
|
623
|
+
```typescript
|
|
624
|
+
import { TaggedError, ok, err, type AsyncResult } from '@jagreehal/workflow';
|
|
625
|
+
|
|
626
|
+
// Pattern 1: Props via generic (default message = tag name)
|
|
627
|
+
class NotFoundError extends TaggedError('NotFoundError')<{
|
|
628
|
+
resource: string;
|
|
629
|
+
id: string;
|
|
630
|
+
}> {}
|
|
631
|
+
|
|
632
|
+
// Pattern 2: Type-safe message (Props inferred from callback annotation)
|
|
633
|
+
class ValidationError extends TaggedError('ValidationError', {
|
|
634
|
+
message: (p: { field: string; reason: string }) => `Validation failed for ${p.field}: ${p.reason}`,
|
|
635
|
+
}) {}
|
|
636
|
+
|
|
637
|
+
class RateLimitError extends TaggedError('RateLimitError', {
|
|
638
|
+
message: (p: { retryAfter: number }) => `Rate limited. Retry after ${p.retryAfter}s`,
|
|
639
|
+
}) {}
|
|
640
|
+
|
|
641
|
+
// Runtime type checks work!
|
|
642
|
+
const error = new NotFoundError({ resource: 'User', id: '123' });
|
|
643
|
+
console.log(error instanceof TaggedError); // true
|
|
644
|
+
|
|
645
|
+
// Use in your functions
|
|
646
|
+
type UserError = NotFoundError | ValidationError | RateLimitError;
|
|
647
|
+
|
|
648
|
+
const fetchUser = async (id: string): AsyncResult<User, UserError> => {
|
|
649
|
+
if (!id) return err(new ValidationError({ field: 'id', reason: 'required' }));
|
|
650
|
+
if (id === 'limited') return err(new RateLimitError({ retryAfter: 60 }));
|
|
651
|
+
if (id === 'missing') return err(new NotFoundError({ resource: 'User', id }));
|
|
652
|
+
return ok({ id, name: 'Alice' });
|
|
653
|
+
};
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
### Exhaustive Matching with `TaggedError.match()`
|
|
657
|
+
|
|
658
|
+
TypeScript enforces you handle **every** error variant:
|
|
659
|
+
|
|
660
|
+
```typescript
|
|
661
|
+
const result = await workflow(async (step) => {
|
|
662
|
+
const user = await step(fetchUser('123'));
|
|
663
|
+
return user;
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
if (!result.ok) {
|
|
667
|
+
// TypeScript enforces all variants are handled
|
|
668
|
+
const response = TaggedError.match(result.error, {
|
|
669
|
+
NotFoundError: (e) => ({
|
|
670
|
+
status: 404,
|
|
671
|
+
body: { error: 'not_found', resource: e.resource, id: e.id },
|
|
672
|
+
}),
|
|
673
|
+
ValidationError: (e) => ({
|
|
674
|
+
status: 400,
|
|
675
|
+
body: { error: 'validation', field: e.field, reason: e.reason },
|
|
676
|
+
}),
|
|
677
|
+
RateLimitError: (e) => ({
|
|
678
|
+
status: 429,
|
|
679
|
+
body: { error: 'rate_limited', retryAfter: e.retryAfter },
|
|
680
|
+
}),
|
|
681
|
+
});
|
|
682
|
+
|
|
683
|
+
return res.status(response.status).json(response.body);
|
|
684
|
+
}
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
**Add a new error type? TypeScript will error until you handle it.** This catches bugs at compile time, not production.
|
|
688
|
+
|
|
689
|
+
### Partial Matching with Fallback
|
|
690
|
+
|
|
691
|
+
Handle specific errors and catch-all for the rest:
|
|
692
|
+
|
|
693
|
+
```typescript
|
|
694
|
+
const message = TaggedError.matchPartial(
|
|
695
|
+
result.error,
|
|
696
|
+
{
|
|
697
|
+
RateLimitError: (e) => `Please wait ${e.retryAfter} seconds`,
|
|
698
|
+
},
|
|
699
|
+
(e) => `Something went wrong: ${e.message}` // Fallback for other errors
|
|
700
|
+
);
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
### Real-World Example: Payment Errors
|
|
704
|
+
|
|
705
|
+
```typescript
|
|
706
|
+
// Type-safe message with Props inferred from callback annotation
|
|
707
|
+
class PaymentDeclinedError extends TaggedError('PaymentDeclinedError', {
|
|
708
|
+
message: (p: {
|
|
709
|
+
code: string;
|
|
710
|
+
declineReason: 'insufficient_funds' | 'card_expired' | 'fraud_suspected';
|
|
711
|
+
}) => `Payment declined: ${p.declineReason}`,
|
|
712
|
+
}) {}
|
|
713
|
+
|
|
714
|
+
class PaymentProviderError extends TaggedError('PaymentProviderError', {
|
|
715
|
+
message: (p: { provider: string; statusCode: number }) => `${p.provider} returned ${p.statusCode}`,
|
|
716
|
+
}) {}
|
|
717
|
+
|
|
718
|
+
type PaymentError = PaymentDeclinedError | PaymentProviderError;
|
|
719
|
+
|
|
720
|
+
// In your workflow
|
|
721
|
+
if (!result.ok) {
|
|
722
|
+
TaggedError.match(result.error, {
|
|
723
|
+
PaymentDeclinedError: (e) => {
|
|
724
|
+
switch (e.declineReason) {
|
|
725
|
+
case 'insufficient_funds': notifyUser('Please use a different card');
|
|
726
|
+
case 'card_expired': notifyUser('Your card has expired');
|
|
727
|
+
case 'fraud_suspected': alertFraudTeam(e);
|
|
728
|
+
}
|
|
729
|
+
},
|
|
730
|
+
PaymentProviderError: (e) => {
|
|
731
|
+
logToDatadog({ provider: e.provider, status: e.statusCode });
|
|
732
|
+
retryWithBackup(e.provider);
|
|
733
|
+
},
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
### Type Helpers
|
|
739
|
+
|
|
740
|
+
```typescript
|
|
741
|
+
import { type TagOf, type ErrorByTag } from '@jagreehal/workflow';
|
|
742
|
+
|
|
743
|
+
type PaymentError = PaymentDeclinedError | PaymentProviderError;
|
|
744
|
+
|
|
745
|
+
// Extract the tag literal type
|
|
746
|
+
type Tags = TagOf<PaymentError>; // 'PaymentDeclinedError' | 'PaymentProviderError'
|
|
747
|
+
|
|
748
|
+
// Extract a specific variant from the union
|
|
749
|
+
type Declined = ErrorByTag<PaymentError, 'PaymentDeclinedError'>; // PaymentDeclinedError
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
### Reserved Keys & Cause Handling
|
|
753
|
+
|
|
754
|
+
**Reserved property names** are stripped from props to preserve Error semantics:
|
|
755
|
+
|
|
756
|
+
| Key | Reason |
|
|
757
|
+
|-----|--------|
|
|
758
|
+
| `_tag` | Discriminant for pattern matching (cannot be forged) |
|
|
759
|
+
| `name` | Error.name (shown in stack traces/logs) |
|
|
760
|
+
| `message` | Error.message (shown in logs/telemetry) |
|
|
761
|
+
| `stack` | Error.stack (the stack trace) |
|
|
762
|
+
|
|
763
|
+
```typescript
|
|
764
|
+
// These reserved keys are silently stripped - use different names!
|
|
765
|
+
class BadExample extends TaggedError('BadExample')<{
|
|
766
|
+
message: string; // ❌ Won't work - use 'details' or 'description' instead
|
|
767
|
+
id: string;
|
|
768
|
+
}> {}
|
|
769
|
+
|
|
770
|
+
// Better approach:
|
|
771
|
+
class GoodExample extends TaggedError('GoodExample')<{
|
|
772
|
+
details: string; // ✅ Custom prop name
|
|
773
|
+
id: string;
|
|
774
|
+
}> {}
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
**The `cause` property** is special - it can be used as a user prop for domain data:
|
|
778
|
+
|
|
779
|
+
```typescript
|
|
780
|
+
// cause as domain data (e.g., structured validation errors)
|
|
781
|
+
class ValidationError extends TaggedError('ValidationError')<{
|
|
782
|
+
cause: { field: string; reason: string }; // ✅ Allowed as user prop
|
|
783
|
+
}> {}
|
|
784
|
+
|
|
785
|
+
const error = new ValidationError({
|
|
786
|
+
cause: { field: 'email', reason: 'invalid format' },
|
|
787
|
+
});
|
|
788
|
+
console.log(error.cause); // { field: 'email', reason: 'invalid format' }
|
|
789
|
+
```
|
|
790
|
+
|
|
791
|
+
**Conflict detection**: You cannot provide `cause` in both props AND ErrorOptions:
|
|
792
|
+
|
|
793
|
+
```typescript
|
|
794
|
+
// This throws TypeError at runtime!
|
|
795
|
+
const error = new ValidationError(
|
|
796
|
+
{ cause: { field: 'email', reason: 'invalid' } }, // cause in props
|
|
797
|
+
{ cause: new Error('original') } // cause in options
|
|
798
|
+
);
|
|
799
|
+
// TypeError: cannot provide 'cause' in props when also setting ErrorOptions.cause
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
Use ErrorOptions.cause for error chaining (linking to the original error):
|
|
803
|
+
|
|
804
|
+
```typescript
|
|
805
|
+
class NetworkError extends TaggedError('NetworkError')<{
|
|
806
|
+
url: string;
|
|
807
|
+
statusCode: number;
|
|
808
|
+
}> {}
|
|
809
|
+
|
|
810
|
+
try {
|
|
811
|
+
await fetch('/api');
|
|
812
|
+
} catch (original) {
|
|
813
|
+
// Chain to original error via ErrorOptions (not props)
|
|
814
|
+
throw new NetworkError(
|
|
815
|
+
{ url: '/api', statusCode: 500 },
|
|
816
|
+
{ cause: original } // ✅ Error chaining
|
|
817
|
+
);
|
|
818
|
+
}
|
|
819
|
+
```
|
|
820
|
+
|
|
821
|
+
### Summary
|
|
822
|
+
|
|
823
|
+
- **String literals**: Simple, great for distinct states without extra data
|
|
824
|
+
- **TaggedError**: Rich errors with context, exhaustive matching, proper stack traces
|
|
825
|
+
- **`match()`**: Forces you to handle every variant (compile-time safety)
|
|
826
|
+
- **`matchPartial()`**: Handle some variants with a catch-all fallback
|
|
583
827
|
|
|
584
828
|
## Recipes & Patterns
|
|
585
829
|
|
package/dist/core.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var q=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var ye=Object.prototype.hasOwnProperty;var me=(e,t)=>{for(var n in t)q(e,n,{get:t[n],enumerable:!0})},we=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let y of Ee(t))!ye.call(e,y)&&y!==n&&q(e,y,{get:()=>t[y],enumerable:!(a=ce(t,y))||a.enumerable});return e};var Te=e=>we(q({},"__esModule",{value:!0}),e);var He={};me(He,{EARLY_EXIT_SYMBOL:()=>Z,STEP_TIMEOUT_MARKER:()=>D,UnwrapError:()=>W,all:()=>Xe,allAsync:()=>Ye,allSettled:()=>$e,allSettledAsync:()=>Ge,andThen:()=>Oe,any:()=>Be,anyAsync:()=>qe,bimap:()=>Fe,createEarlyExit:()=>oe,err:()=>d,from:()=>be,fromNullable:()=>_e,fromPromise:()=>Pe,getStepTimeoutMeta:()=>re,isEarlyExit:()=>se,isErr:()=>de,isOk:()=>ke,isStepTimeoutError:()=>z,isUnexpectedError:()=>ne,map:()=>ve,mapError:()=>Me,mapErrorTry:()=>je,mapTry:()=>Ke,match:()=>Ie,ok:()=>g,orElse:()=>Ne,orElseAsync:()=>Ve,partition:()=>Je,recover:()=>Le,recoverAsync:()=>We,run:()=>Q,tap:()=>Ue,tapError:()=>De,tryAsync:()=>he,unwrap:()=>Se,unwrapOr:()=>ge,unwrapOrElse:()=>Ae});module.exports=Te(He);var g=e=>({ok:!0,value:e}),d=(e,t)=>({ok:!1,error:e,...t?.cause!==void 0?{cause:t.cause}:{}}),ke=e=>e.ok,de=e=>!e.ok,ne=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",D=Symbol.for("step_timeout_marker");function z(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:D in e}function re(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(D in e)return e[D]}}var Z=Symbol("early-exit");function oe(e,t){return{[Z]:!0,error:e,meta:t}}function se(e){return typeof e=="object"&&e!==null&&e[Z]===!0}var ue=Symbol("mapper-exception");function fe(e){return{[ue]:!0,thrown:e}}function Re(e){return typeof e=="object"&&e!==null&&e[ue]===!0}function Ce(e){return typeof e=="string"?{name:e}:e??{}}function G(e,t){let{backoff:n,initialDelay:a,maxDelay:y,jitter:A}=t,x;switch(n){case"fixed":x=a;break;case"linear":x=a*e;break;case"exponential":x=a*Math.pow(2,e-1);break}if(x=Math.min(x,y),A){let r=x*.25*Math.random();x=x+r}return Math.floor(x)}function H(e){return new Promise(t=>setTimeout(t,e))}var te=Symbol("timeout");async function xe(e,t,n){let a=new AbortController,y=t.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:t.ms,attempt:n.attempt},A,x=new Promise((I,R)=>{A=setTimeout(()=>{a.abort(),R({[te]:!0,error:y})},t.ms)}),r;t.signal?r=Promise.resolve(e(a.signal)):r=Promise.resolve(e());try{return await Promise.race([r,x])}catch(I){if(typeof I=="object"&&I!==null&&I[te]===!0){let R=I.error;if(typeof R=="object"&&R!==null&&R.type!=="STEP_TIMEOUT"){let V={timeoutMs:t.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};D in R?R[D]=V:Object.defineProperty(R,D,{value:V,enumerable:!1,writable:!0,configurable:!1})}throw R}throw I}finally{clearTimeout(A)}}var F={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Q(e,t){let{onError:n,onEvent:a,catchUnexpected:y,workflowId:A,context:x}=t&&typeof t=="object"?t:{},r=A??crypto.randomUUID(),I=!n&&!y,R=[],V=0,X=o=>o??`step_${++V}`,E=o=>{if(o.type==="step_success"){let P=o.stepId;for(let h=R.length-1;h>=0;h--){let K=R[h];if(K.type==="race"&&!K.winnerId){K.winnerId=P;break}}}a?.(o,x)},O=oe,ee=o=>se(o),Y=(o,P)=>I?P?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o,...P.resultCause!==void 0?{cause:P.resultCause}:{}}}:P?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:o,thrown:P.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o}}:o,ae=o=>o.origin==="result"?o.resultCause:o.thrown,ie=o=>({type:"UNEXPECTED_ERROR",cause:o.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:o.error,...o.meta.resultCause!==void 0?{cause:o.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:o.error,thrown:o.meta.thrown}});try{let P=function(w,p){let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1;R.push({scopeId:i,type:"parallel"});let C=()=>{if(u)return;u=!0;let c=R.findIndex(l=>l.scopeId===i);c!==-1&&R.splice(c,1),E({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s})};E({type:"scope_start",workflowId:r,scopeId:i,scopeType:"parallel",name:w,ts:Date.now()});try{let c=await p();if(C(),!c.ok)throw n?.(c.error,w),O(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw C(),c}})()},h=function(w,p){let i=Object.keys(w),s=p.name??`Parallel(${i.join(", ")})`,u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let C=performance.now(),c=!1;R.push({scopeId:u,type:"parallel"});let l=()=>{if(c)return;c=!0;let T=R.findIndex(f=>f.scopeId===u);T!==-1&&R.splice(T,1),E({type:"scope_end",workflowId:r,scopeId:u,ts:Date.now(),durationMs:performance.now()-C})};E({type:"scope_start",workflowId:r,scopeId:u,scopeType:"parallel",name:s,ts:Date.now()});try{let T=await new Promise(_=>{if(i.length===0){_([]);return}let v=!1,S=i.length,N=new Array(i.length);for(let M=0;M<i.length;M++){let j=i[M],$=M;Promise.resolve(w[j]()).catch(k=>d({type:"PROMISE_REJECTED",cause:k},{cause:{type:"PROMISE_REJECTION",reason:k}})).then(k=>{if(!v){if(!k.ok){v=!0,_([{key:j,result:k}]);return}N[$]={key:j,result:k},S--,S===0&&_(N)}})}});l();let f={};for(let{key:_,result:v}of T){if(!v.ok)throw n?.(v.error,_),O(v.error,{origin:"result",resultCause:v.cause});f[_]=v.value}return f}catch(T){throw l(),T}})()};var ze=P,Qe=h;let o=(w,p)=>(async()=>{let i=Ce(p),{name:s,key:u,retry:C,timeout:c}=i,l=X(u),T=a,f=T?performance.now():0;if(!(typeof w=="function")){if(C&&C.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 S={attempts:Math.max(1,C?.attempts??1),backoff:C?.backoff??F.backoff,initialDelay:C?.initialDelay??F.initialDelay,maxDelay:C?.maxDelay??F.maxDelay,jitter:C?.jitter??F.jitter,retryOn:C?.retryOn??F.retryOn,onRetry:C?.onRetry??F.onRetry};a&&E({type:"step_start",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now()});let N;for(let k=1;k<=S.attempts;k++){let le=T?performance.now():0;try{let m;if(typeof w=="function"?c?m=await xe(w,c,{name:s,key:u,attempt:k}):m=await w():m=await w,m.ok){let U=performance.now()-f;return E({type:"step_success",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:U}),u&&E({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:U,result:m}),m.value}if(N=m,k<S.attempts&&S.retryOn(m.error,k)){let U=G(k,S);E({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:k+1,maxAttempts:S.attempts,delayMs:U,error:m.error}),S.onRetry(m.error,k,U),await H(U);continue}S.attempts>1&&E({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-f,attempts:k,lastError:m.error});break}catch(m){let U=performance.now()-le;if(ee(m))throw E({type:"step_aborted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:U}),m;if(z(m)){let b=re(m),J=c?.ms??b?.timeoutMs??0;if(E({type:"step_timeout",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),timeoutMs:J,attempt:k}),k<S.attempts&&S.retryOn(m,k)){let B=G(k,S);E({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:k+1,maxAttempts:S.attempts,delayMs:B,error:m}),S.onRetry(m,k,B),await H(B);continue}S.attempts>1&&E({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-f,attempts:k,lastError:m})}if(k<S.attempts&&S.retryOn(m,k)){let b=G(k,S);E({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:k+1,maxAttempts:S.attempts,delayMs:b,error:m}),S.onRetry(m,k,b),await H(b);continue}S.attempts>1&&!z(m)&&E({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-f,attempts:k,lastError:m});let L=performance.now()-f;if(y){let b;try{b=y(m)}catch(J){throw fe(J)}throw E({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:L,error:b}),u&&E({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:L,result:d(b,{cause:m}),meta:{origin:"throw",thrown:m}}),n?.(b,s),O(b,{origin:"throw",thrown:m})}else{let b={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:m}};throw E({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:L,error:b}),u&&E({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:L,result:d(b,{cause:m}),meta:{origin:"throw",thrown:m}}),m}}}let M=N,j=performance.now()-f,$=Y(M.error,{origin:"result",resultCause:M.cause});throw E({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:j,error:$}),u&&E({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:j,result:M,meta:{origin:"result",resultCause:M.cause}}),n?.(M.error,s),O(M.error,{origin:"result",resultCause:M.cause})})();o.try=(w,p)=>{let i=p.name,s=p.key,u=X(s),C="error"in p?()=>p.error:p.onError,c=a;return(async()=>{let l=c?performance.now():0;a&&E({type:"step_start",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now()});try{let T=await w(),f=performance.now()-l;return E({type:"step_success",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:f}),s&&E({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:f,result:g(T)}),T}catch(T){let f=C(T),_=performance.now()-l,v=Y(f,{origin:"throw",thrown:T});throw E({type:"step_error",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:_,error:v}),s&&E({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:_,result:d(f,{cause:T}),meta:{origin:"throw",thrown:T}}),n?.(f,i),O(f,{origin:"throw",thrown:T})}})()},o.fromResult=(w,p)=>{let i=p.name,s=p.key,u=X(s),C="error"in p?()=>p.error:p.onError,c=a;return(async()=>{let l=c?performance.now():0;a&&E({type:"step_start",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now()});let T=await w();if(T.ok){let f=performance.now()-l;return E({type:"step_success",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:f}),s&&E({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:f,result:g(T.value)}),T.value}else{let f=C(T.error),_=performance.now()-l,v=Y(f,{origin:"result",resultCause:T.error});throw E({type:"step_error",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:_,error:v}),s&&E({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:_,result:d(f,{cause:T.error}),meta:{origin:"result",resultCause:T.error}}),n?.(f,i),O(f,{origin:"result",resultCause:T.error})}})()},o.retry=(w,p)=>o(w,{name:p.name,key:p.key,retry:{attempts:p.attempts,backoff:p.backoff,initialDelay:p.initialDelay,maxDelay:p.maxDelay,jitter:p.jitter,retryOn:p.retryOn,onRetry:p.onRetry},timeout:p.timeout}),o.withTimeout=(w,p)=>o(w,{name:p.name,key:p.key,timeout:p}),o.parallel=((...w)=>{if(typeof w[0]=="string"){let p=w[0],i=w[1];return P(p,i)}else{let p=w[0],i=w[1]??{};return h(p,i)}}),o.race=(w,p)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1,C={scopeId:i,type:"race",winnerId:void 0};R.push(C);let c=()=>{if(u)return;u=!0;let l=R.findIndex(T=>T.scopeId===i);l!==-1&&R.splice(l,1),E({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s,winnerId:C.winnerId})};E({type:"scope_start",workflowId:r,scopeId:i,scopeType:"race",name:w,ts:Date.now()});try{let l=await p();if(c(),!l.ok)throw n?.(l.error,w),O(l.error,{origin:"result",resultCause:l.cause});return l.value}catch(l){throw c(),l}})()},o.allSettled=(w,p)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1;R.push({scopeId:i,type:"allSettled"});let C=()=>{if(u)return;u=!0;let c=R.findIndex(l=>l.scopeId===i);c!==-1&&R.splice(c,1),E({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s})};E({type:"scope_start",workflowId:r,scopeId:i,scopeType:"allSettled",name:w,ts:Date.now()});try{let c=await p();if(C(),!c.ok)throw n?.(c.error,w),O(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw C(),c}})()};let pe=await e(o);return g(pe)}catch(o){if(Re(o))throw o.thrown;if(ee(o)){let h=ae(o.meta);if(y||n)return d(o.error,{cause:h});if(ne(o.error))return d(o.error,{cause:h});let K=ie(o);return d(K,{cause:h})}if(y){let h=y(o);return n?.(h,"unexpected"),d(h,{cause:o})}let P={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:o}};return n?.(P,"unexpected"),d(P,{cause:o})}}Q.strict=(e,t)=>Q(e,t);var W=class extends Error{constructor(n,a){super(`Unwrap called on an error result: ${String(n)}`);this.error=n;this.cause=a;this.name="UnwrapError"}},Se=e=>{if(e.ok)return e.value;throw new W(e.error,e.cause)},ge=(e,t)=>e.ok?e.value:t,Ae=(e,t)=>e.ok?e.value:t(e.error,e.cause);function be(e,t){try{return g(e())}catch(n){return t?d(t(n),{cause:n}):d(n)}}async function Pe(e,t){try{return g(await e)}catch(n){return t?d(t(n),{cause:n}):d(n)}}async function he(e,t){try{return g(await e())}catch(n){return t?d(t(n),{cause:n}):d(n)}}function _e(e,t){return e!=null?g(e):d(t())}function ve(e,t){return e.ok?g(t(e.value)):e}function Me(e,t){return e.ok?e:d(t(e.error),{cause:e.cause})}function Ie(e,t){return e.ok?t.ok(e.value):t.err(e.error,e.cause)}function Oe(e,t){return e.ok?t(e.value):e}function Ue(e,t){return e.ok&&t(e.value),e}function De(e,t){return e.ok||t(e.error,e.cause),e}function Ke(e,t,n){if(!e.ok)return e;try{return g(t(e.value))}catch(a){return d(n(a),{cause:a})}}function je(e,t,n){if(e.ok)return e;try{return d(t(e.error),{cause:e.cause})}catch(a){return d(n(a),{cause:a})}}function Fe(e,t,n){return e.ok?g(t(e.value)):d(n(e.error),{cause:e.cause})}function Ne(e,t){return e.ok?e:t(e.error,e.cause)}async function Ve(e,t){let n=await e;return n.ok?n:t(n.error,n.cause)}function Le(e,t){return e.ok?g(e.value):g(t(e.error,e.cause))}async function We(e,t){let n=await e;return n.ok?g(n.value):g(await t(n.error,n.cause))}function Xe(e){let t=[];for(let n of e){if(!n.ok)return n;t.push(n.value)}return g(t)}async function Ye(e){return e.length===0?g([]):new Promise(t=>{let n=!1,a=e.length,y=new Array(e.length);for(let A=0;A<e.length;A++){let x=A;Promise.resolve(e[x]).catch(r=>d({type:"PROMISE_REJECTED",cause:r},{cause:{type:"PROMISE_REJECTION",reason:r}})).then(r=>{if(!n){if(!r.ok){n=!0,t(r);return}y[x]=r.value,a--,a===0&&t(g(y))}})}})}function $e(e){let t=[],n=[];for(let a of e)a.ok?t.push(a.value):n.push({error:a.error,cause:a.cause});return n.length>0?d(n):g(t)}function Je(e){let t=[],n=[];for(let a of e)a.ok?t.push(a.value):n.push(a.error);return{values:t,errors:n}}function Be(e){if(e.length===0)return d({type:"EMPTY_INPUT",message:"any() requires at least one Result"});let t=null;for(let n of e){if(n.ok)return n;t||(t=n)}return t}async function qe(e){return e.length===0?d({type:"EMPTY_INPUT",message:"anyAsync() requires at least one Result"}):new Promise(t=>{let n=!1,a=e.length,y=null;for(let A of e)Promise.resolve(A).catch(x=>d({type:"PROMISE_REJECTED",cause:x},{cause:{type:"PROMISE_REJECTION",reason:x}})).then(x=>{if(!n){if(x.ok){n=!0,t(x);return}y||(y=x),a--,a===0&&t(y)}})})}async function Ge(e){let t=await Promise.all(e.map(y=>Promise.resolve(y).then(A=>({status:"result",result:A})).catch(A=>({status:"rejected",error:{type:"PROMISE_REJECTED",cause:A},cause:{type:"PROMISE_REJECTION",reason:A}})))),n=[],a=[];for(let y of t)y.status==="rejected"?a.push({error:y.error,cause:y.cause}):y.result.ok?n.push(y.result.value):a.push({error:y.result.error,cause:y.result.cause});return a.length>0?d(a):g(n)}0&&(module.exports={EARLY_EXIT_SYMBOL,STEP_TIMEOUT_MARKER,UnwrapError,all,allAsync,allSettled,allSettledAsync,andThen,any,anyAsync,bimap,createEarlyExit,err,from,fromNullable,fromPromise,getStepTimeoutMeta,isEarlyExit,isErr,isOk,isStepTimeoutError,isUnexpectedError,map,mapError,mapErrorTry,mapTry,match,ok,orElse,orElseAsync,partition,recover,recoverAsync,run,tap,tapError,tryAsync,unwrap,unwrapOr,unwrapOrElse});
|
|
1
|
+
"use strict";var G=Object.defineProperty;var Ee=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var we=Object.prototype.hasOwnProperty;var me=(e,t)=>{for(var n in t)G(e,n,{get:t[n],enumerable:!0})},Te=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let w of ye(t))!we.call(e,w)&&w!==n&&G(e,w,{get:()=>t[w],enumerable:!(a=Ee(t,w))||a.enumerable});return e};var ke=e=>Te(G({},"__esModule",{value:!0}),e);var Qe={};me(Qe,{EARLY_EXIT_SYMBOL:()=>ee,STEP_TIMEOUT_MARKER:()=>D,UnwrapError:()=>X,all:()=>$e,allAsync:()=>Je,allSettled:()=>Be,allSettledAsync:()=>ze,andThen:()=>Ue,any:()=>Ge,anyAsync:()=>He,bimap:()=>Ne,createEarlyExit:()=>se,err:()=>f,from:()=>Pe,fromNullable:()=>ve,fromPromise:()=>he,getStepTimeoutMeta:()=>oe,hydrate:()=>ie,isEarlyExit:()=>ue,isErr:()=>fe,isOk:()=>de,isSerializedResult:()=>Ye,isStepTimeoutError:()=>Q,isUnexpectedError:()=>re,map:()=>Me,mapError:()=>Ie,mapErrorTry:()=>Fe,mapTry:()=>je,match:()=>Oe,ok:()=>g,orElse:()=>Ve,orElseAsync:()=>Le,partition:()=>qe,recover:()=>We,recoverAsync:()=>Xe,run:()=>Z,tap:()=>De,tapError:()=>Ke,tryAsync:()=>_e,unwrap:()=>ge,unwrapOr:()=>Ae,unwrapOrElse:()=>be});module.exports=ke(Qe);var g=e=>({ok:!0,value:e}),f=(e,t)=>({ok:!1,error:e,...t?.cause!==void 0?{cause:t.cause}:{}}),de=e=>e.ok,fe=e=>!e.ok,re=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",D=Symbol.for("step_timeout_marker");function Q(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:D in e}function oe(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(D in e)return e[D]}}var ee=Symbol("early-exit");function se(e,t){return{[ee]:!0,error:e,meta:t}}function ue(e){return typeof e=="object"&&e!==null&&e[ee]===!0}var ae=Symbol("mapper-exception");function Re(e){return{[ae]:!0,thrown:e}}function Ce(e){return typeof e=="object"&&e!==null&&e[ae]===!0}function xe(e){return typeof e=="string"?{name:e}:e??{}}function H(e,t){let{backoff:n,initialDelay:a,maxDelay:w,jitter:A}=t,E;switch(n){case"fixed":E=a;break;case"linear":E=a*e;break;case"exponential":E=a*Math.pow(2,e-1);break}if(E=Math.min(E,w),A){let r=E*.25*Math.random();E=E+r}return Math.floor(E)}function z(e){return new Promise(t=>setTimeout(t,e))}var ne=Symbol("timeout");async function Se(e,t,n){let a=new AbortController,w=t.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:t.ms,attempt:n.attempt},A,E=new Promise((I,C)=>{A=setTimeout(()=>{a.abort(),C({[ne]:!0,error:w})},t.ms)}),r;t.signal?r=Promise.resolve(e(a.signal)):r=Promise.resolve(e());try{return await Promise.race([r,E])}catch(I){if(typeof I=="object"&&I!==null&&I[ne]===!0){let C=I.error;if(typeof C=="object"&&C!==null&&C.type!=="STEP_TIMEOUT"){let L={timeoutMs:t.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};D in C?C[D]=L:Object.defineProperty(C,D,{value:L,enumerable:!1,writable:!0,configurable:!1})}throw C}throw I}finally{clearTimeout(A)}}var F={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Z(e,t){let{onError:n,onEvent:a,catchUnexpected:w,workflowId:A,context:E}=t&&typeof t=="object"?t:{},r=A??crypto.randomUUID(),I=!n&&!w,C=[],L=0,Y=o=>o??`step_${++L}`,y=o=>{let b=o.context!==void 0||E===void 0?o:{...o,context:E};if(b.type==="step_success"){let M=b.stepId;for(let K=C.length-1;K>=0;K--){let N=C[K];if(N.type==="race"&&!N.winnerId){N.winnerId=M;break}}}a?.(b,E)},O=se,te=o=>ue(o),$=(o,b)=>I?b?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o,...b.resultCause!==void 0?{cause:b.resultCause}:{}}}:b?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:o,thrown:b.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o}}:o,pe=o=>o.origin==="result"?o.resultCause:o.thrown,le=o=>({type:"UNEXPECTED_ERROR",cause:o.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:o.error,...o.meta.resultCause!==void 0?{cause:o.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:o.error,thrown:o.meta.thrown}});try{let b=function(T,p){let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1;C.push({scopeId:i,type:"parallel"});let x=()=>{if(u)return;u=!0;let c=C.findIndex(l=>l.scopeId===i);c!==-1&&C.splice(c,1),y({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s})};y({type:"scope_start",workflowId:r,scopeId:i,scopeType:"parallel",name:T,ts:Date.now()});try{let c=await p();if(x(),!c.ok)throw n?.(c.error,T,E),O(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw x(),c}})()},M=function(T,p){let i=Object.keys(T),s=p.name??`Parallel(${i.join(", ")})`,u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let x=performance.now(),c=!1;C.push({scopeId:u,type:"parallel"});let l=()=>{if(c)return;c=!0;let k=C.findIndex(R=>R.scopeId===u);k!==-1&&C.splice(k,1),y({type:"scope_end",workflowId:r,scopeId:u,ts:Date.now(),durationMs:performance.now()-x})};y({type:"scope_start",workflowId:r,scopeId:u,scopeType:"parallel",name:s,ts:Date.now()});try{let k=await new Promise(h=>{if(i.length===0){h([]);return}let _=!1,S=i.length,V=new Array(i.length);for(let v=0;v<i.length;v++){let j=i[v],J=v;Promise.resolve(T[j]()).catch(d=>f({type:"PROMISE_REJECTED",cause:d},{cause:{type:"PROMISE_REJECTION",reason:d}})).then(d=>{if(!_){if(!d.ok){_=!0,h([{key:j,result:d}]);return}V[J]={key:j,result:d},S--,S===0&&h(V)}})}});l();let R={};for(let{key:h,result:_}of k){if(!_.ok)throw n?.(_.error,h,E),O(_.error,{origin:"result",resultCause:_.cause});R[h]=_.value}return R}catch(k){throw l(),k}})()};var Ze=b,et=M;let o=(T,p)=>(async()=>{let i=xe(p),{name:s,key:u,retry:x,timeout:c}=i,l=Y(u),k=a,R=k?performance.now():0;if(!(typeof T=="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 S={attempts:Math.max(1,x?.attempts??1),backoff:x?.backoff??F.backoff,initialDelay:x?.initialDelay??F.initialDelay,maxDelay:x?.maxDelay??F.maxDelay,jitter:x?.jitter??F.jitter,retryOn:x?.retryOn??F.retryOn,onRetry:x?.onRetry??F.onRetry};a&&y({type:"step_start",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now()});let V;for(let d=1;d<=S.attempts;d++){let ce=k?performance.now():0;try{let m;if(typeof T=="function"?c?m=await Se(T,c,{name:s,key:u,attempt:d}):m=await T():m=await T,m.ok){let U=performance.now()-R;return y({type:"step_success",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:U}),u&&y({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:U,result:m}),m.value}if(V=m,d<S.attempts&&S.retryOn(m.error,d)){let U=H(d,S);y({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:d+1,maxAttempts:S.attempts,delayMs:U,error:m.error}),S.onRetry(m.error,d,U),await z(U);continue}S.attempts>1&&y({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-R,attempts:d,lastError:m.error});break}catch(m){let U=performance.now()-ce;if(te(m))throw y({type:"step_aborted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:U}),m;if(Q(m)){let P=oe(m),B=c?.ms??P?.timeoutMs??0;if(y({type:"step_timeout",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),timeoutMs:B,attempt:d}),d<S.attempts&&S.retryOn(m,d)){let q=H(d,S);y({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:d+1,maxAttempts:S.attempts,delayMs:q,error:m}),S.onRetry(m,d,q),await z(q);continue}S.attempts>1&&y({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-R,attempts:d,lastError:m})}if(d<S.attempts&&S.retryOn(m,d)){let P=H(d,S);y({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:d+1,maxAttempts:S.attempts,delayMs:P,error:m}),S.onRetry(m,d,P),await z(P);continue}S.attempts>1&&!Q(m)&&y({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-R,attempts:d,lastError:m});let W=performance.now()-R;if(w){let P;try{P=w(m)}catch(B){throw Re(B)}throw y({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:W,error:P}),u&&y({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:W,result:f(P,{cause:m}),meta:{origin:"throw",thrown:m}}),n?.(P,s,E),O(P,{origin:"throw",thrown:m})}else{let P={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:m}};throw y({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:W,error:P}),u&&y({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:W,result:f(P,{cause:m}),meta:{origin:"throw",thrown:m}}),m}}}let v=V,j=performance.now()-R,J=$(v.error,{origin:"result",resultCause:v.cause});throw y({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:j,error:J}),u&&y({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:j,result:v,meta:{origin:"result",resultCause:v.cause}}),n?.(v.error,s,E),O(v.error,{origin:"result",resultCause:v.cause})})();o.try=(T,p)=>{let i=p.name,s=p.key,u=Y(s),x="error"in p?()=>p.error:p.onError,c=a;return(async()=>{let l=c?performance.now():0;a&&y({type:"step_start",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now()});try{let k=await T(),R=performance.now()-l;return y({type:"step_success",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:R}),s&&y({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:R,result:g(k)}),k}catch(k){let R=x(k),h=performance.now()-l,_=$(R,{origin:"throw",thrown:k});throw y({type:"step_error",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:h,error:_}),s&&y({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:h,result:f(R,{cause:k}),meta:{origin:"throw",thrown:k}}),n?.(R,i,E),O(R,{origin:"throw",thrown:k})}})()},o.fromResult=(T,p)=>{let i=p.name,s=p.key,u=Y(s),x="error"in p?()=>p.error:p.onError,c=a;return(async()=>{let l=c?performance.now():0;a&&y({type:"step_start",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now()});let k=await T();if(k.ok){let R=performance.now()-l;return y({type:"step_success",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:R}),s&&y({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:R,result:g(k.value)}),k.value}else{let R=x(k.error),h=performance.now()-l,_=$(R,{origin:"result",resultCause:k.error});throw y({type:"step_error",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:h,error:_}),s&&y({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:h,result:f(R,{cause:k.error}),meta:{origin:"result",resultCause:k.error}}),n?.(R,i,E),O(R,{origin:"result",resultCause:k.error})}})()},o.retry=(T,p)=>o(T,{name:p.name,key:p.key,retry:{attempts:p.attempts,backoff:p.backoff,initialDelay:p.initialDelay,maxDelay:p.maxDelay,jitter:p.jitter,retryOn:p.retryOn,onRetry:p.onRetry},timeout:p.timeout}),o.withTimeout=(T,p)=>o(T,{name:p.name,key:p.key,timeout:p}),o.parallel=((...T)=>{if(typeof T[0]=="string"){let p=T[0],i=T[1];return b(p,i)}else{let p=T[0],i=T[1]??{};return M(p,i)}}),o.race=(T,p)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1,x={scopeId:i,type:"race",winnerId:void 0};C.push(x);let c=()=>{if(u)return;u=!0;let l=C.findIndex(k=>k.scopeId===i);l!==-1&&C.splice(l,1),y({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s,winnerId:x.winnerId})};y({type:"scope_start",workflowId:r,scopeId:i,scopeType:"race",name:T,ts:Date.now()});try{let l=await p();if(c(),!l.ok)throw n?.(l.error,T,E),O(l.error,{origin:"result",resultCause:l.cause});return l.value}catch(l){throw c(),l}})()},o.allSettled=(T,p)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1;C.push({scopeId:i,type:"allSettled"});let x=()=>{if(u)return;u=!0;let c=C.findIndex(l=>l.scopeId===i);c!==-1&&C.splice(c,1),y({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s})};y({type:"scope_start",workflowId:r,scopeId:i,scopeType:"allSettled",name:T,ts:Date.now()});try{let c=await p();if(x(),!c.ok)throw n?.(c.error,T,E),O(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw x(),c}})()};let N=await e(o);return g(N)}catch(o){if(Ce(o))throw o.thrown;if(te(o)){let M=pe(o.meta);if(w||n)return f(o.error,{cause:M});if(re(o.error))return f(o.error,{cause:M});let K=le(o);return f(K,{cause:M})}if(w){let M=w(o);return n?.(M,"unexpected",E),f(M,{cause:o})}let b={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:o}};return n?.(b,"unexpected",E),f(b,{cause:o})}}Z.strict=(e,t)=>Z(e,t);var X=class extends Error{constructor(n,a){super(`Unwrap called on an error result: ${String(n)}`);this.error=n;this.cause=a;this.name="UnwrapError"}},ge=e=>{if(e.ok)return e.value;throw new X(e.error,e.cause)},Ae=(e,t)=>e.ok?e.value:t,be=(e,t)=>e.ok?e.value:t(e.error,e.cause);function Pe(e,t){try{return g(e())}catch(n){return t?f(t(n),{cause:n}):f(n)}}async function he(e,t){try{return g(await e)}catch(n){return t?f(t(n),{cause:n}):f(n)}}async function _e(e,t){try{return g(await e())}catch(n){return t?f(t(n),{cause:n}):f(n)}}function ve(e,t){return e!=null?g(e):f(t())}function Me(e,t){return e.ok?g(t(e.value)):e}function Ie(e,t){return e.ok?e:f(t(e.error),{cause:e.cause})}function Oe(e,t){return e.ok?t.ok(e.value):t.err(e.error,e.cause)}function Ue(e,t){return e.ok?t(e.value):e}function De(e,t){return e.ok&&t(e.value),e}function Ke(e,t){return e.ok||t(e.error,e.cause),e}function je(e,t,n){if(!e.ok)return e;try{return g(t(e.value))}catch(a){return f(n(a),{cause:a})}}function Fe(e,t,n){if(e.ok)return e;try{return f(t(e.error),{cause:e.cause})}catch(a){return f(n(a),{cause:a})}}function Ne(e,t,n){return e.ok?g(t(e.value)):f(n(e.error),{cause:e.cause})}function Ve(e,t){return e.ok?e:t(e.error,e.cause)}async function Le(e,t){let n=await e;return n.ok?n:t(n.error,n.cause)}function We(e,t){return e.ok?g(e.value):g(t(e.error,e.cause))}async function Xe(e,t){let n=await e;return n.ok?g(n.value):g(await t(n.error,n.cause))}function ie(e){return e!==null&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&(e.ok===!0&&"value"in e||e.ok===!1&&"error"in e)?e:null}function Ye(e){return ie(e)!==null}function $e(e){let t=[];for(let n of e){if(!n.ok)return n;t.push(n.value)}return g(t)}async function Je(e){return e.length===0?g([]):new Promise(t=>{let n=!1,a=e.length,w=new Array(e.length);for(let A=0;A<e.length;A++){let E=A;Promise.resolve(e[E]).catch(r=>f({type:"PROMISE_REJECTED",cause:r},{cause:{type:"PROMISE_REJECTION",reason:r}})).then(r=>{if(!n){if(!r.ok){n=!0,t(r);return}w[E]=r.value,a--,a===0&&t(g(w))}})}})}function Be(e){let t=[],n=[];for(let a of e)a.ok?t.push(a.value):n.push({error:a.error,cause:a.cause});return n.length>0?f(n):g(t)}function qe(e){let t=[],n=[];for(let a of e)a.ok?t.push(a.value):n.push(a.error);return{values:t,errors:n}}function Ge(e){if(e.length===0)return f({type:"EMPTY_INPUT",message:"any() requires at least one Result"});let t=null;for(let n of e){if(n.ok)return n;t||(t=n)}return t}async function He(e){return e.length===0?f({type:"EMPTY_INPUT",message:"anyAsync() requires at least one Result"}):new Promise(t=>{let n=!1,a=e.length,w=null;for(let A of e)Promise.resolve(A).catch(E=>f({type:"PROMISE_REJECTED",cause:E},{cause:{type:"PROMISE_REJECTION",reason:E}})).then(E=>{if(!n){if(E.ok){n=!0,t(E);return}w||(w=E),a--,a===0&&t(w)}})})}async function ze(e){let t=await Promise.all(e.map(w=>Promise.resolve(w).then(A=>({status:"result",result:A})).catch(A=>({status:"rejected",error:{type:"PROMISE_REJECTED",cause:A},cause:{type:"PROMISE_REJECTION",reason:A}})))),n=[],a=[];for(let w of t)w.status==="rejected"?a.push({error:w.error,cause:w.cause}):w.result.ok?n.push(w.result.value):a.push({error:w.result.error,cause:w.result.cause});return a.length>0?f(a):g(n)}0&&(module.exports={EARLY_EXIT_SYMBOL,STEP_TIMEOUT_MARKER,UnwrapError,all,allAsync,allSettled,allSettledAsync,andThen,any,anyAsync,bimap,createEarlyExit,err,from,fromNullable,fromPromise,getStepTimeoutMeta,hydrate,isEarlyExit,isErr,isOk,isSerializedResult,isStepTimeoutError,isUnexpectedError,map,mapError,mapErrorTry,mapTry,match,ok,orElse,orElseAsync,partition,recover,recoverAsync,run,tap,tapError,tryAsync,unwrap,unwrapOr,unwrapOrElse});
|
|
2
2
|
//# sourceMappingURL=core.cjs.map
|