trybox 0.1.1 → 0.9.5

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 CHANGED
@@ -1,58 +1,154 @@
1
- ````
1
+ # trybox
2
2
 
3
- ---
3
+ Run sync/async functions and return a typed Result instead of throwing. `trybox` provides powerful error normalization, retry logic, and concurrency control.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install trybox
9
+ # or
10
+ bun add trybox
11
+ ```
12
+
13
+ ## Basic Usage
14
+
15
+ ```typescript
16
+ import trybox from "trybox";
17
+
18
+ const runner = trybox();
19
+
20
+ const result = await runner.run(async () => {
21
+ const res = await fetch("/api/data");
22
+ if (!res.ok) throw new Error("Failed");
23
+ return res.json();
24
+ });
25
+
26
+ if (result.ok) {
27
+ console.log(result.data);
28
+ } else {
29
+ console.error(result.error.message);
30
+ }
31
+ ```
32
+
33
+ ## Error Handling
34
+
35
+ `trybox` normalizes all errors into a `ResultError` object with a stable `code`.
36
+
37
+ ### The `ResultError` Object
38
+
39
+ All errors are normalized to this structure:
40
+
41
+ ```typescript
42
+ type ResultError<Code extends string = string> = {
43
+ code: Code; // Stable error code (e.g. "TIMEOUT", "HTTP")
44
+ message: string; // Human-readable message
45
+ cause?: unknown; // Original error
46
+ meta?: Record<string, any>; // Extra metadata (e.g. status code, validation errors)
47
+ status?: number; // Optional HTTP status (if applicable)
48
+ };
49
+ ```
50
+
51
+ ### Default Rules
52
+
53
+ If no custom rules are provided, `trybox` applies these default rules:
54
+
55
+ - **ABORTED**: Detects `AbortError` (e.g., from `AbortController`).
56
+ - **TIMEOUT**: Detects `TimeoutError`.
57
+ - **HTTP**: Detects objects with `status` or `statusCode` (number).
58
+ - **UNKNOWN**: Fallback for other errors (strings, generic errors).
59
+
60
+ ```typescript
61
+ const result = await runner.run(fetchData);
62
+
63
+ if (!result.ok) {
64
+ switch (result.error.code) {
65
+ case "ABORTED":
66
+ // Handle cancellation
67
+ break;
68
+ case "TIMEOUT":
69
+ // Handle timeout
70
+ break;
71
+ case "HTTP":
72
+ console.log("Status:", result.error.status);
73
+ break;
74
+ }
75
+ }
76
+ ```
77
+
78
+ ### Custom Rules
79
+
80
+ You can define custom error rules to map specific exceptions to typed error codes.
81
+
82
+ ```typescript
83
+ import trybox, { errorRule } from "trybox";
84
+
85
+ const runner = trybox({
86
+ rules: [
87
+ // Map specific error string to a code
88
+ errorRule
89
+ .when((e) => e === "foo")
90
+ .toError(() => ({
91
+ code: "CUSTOM_FOO",
92
+ message: "Foo happened",
93
+ })),
94
+ // Map class instance
95
+ errorRule.instance(MyCustomError).toError((e) => ({
96
+ code: "MY_ERROR",
97
+ message: e.message,
98
+ meta: { details: e.details },
99
+ })),
100
+ ],
101
+ });
102
+ ```
4
103
 
5
104
  ## API
6
105
 
7
- ### `run(fn, options?)`
106
+ ### `runner.run(fn, options?)`
8
107
 
9
- Executes a single async function.
108
+ Executes a single function with retry and error handling.
10
109
 
11
- ```ts
110
+ ```typescript
12
111
  await runner.run(fn, {
13
112
  retries: 3,
14
113
  retryDelay: (attempt) => attempt * 1000,
15
- onError: (err) => toast.error(err.message),
16
- onSuccess: (data) => console.log(data),
114
+ onSuccess: (data) => console.log("Success:", data),
115
+ onError: (err) => console.error("Error:", err),
17
116
  });
18
- ````
117
+ ```
19
118
 
20
- ### `runAllSettled(tasks, options?)`
119
+ ### `runner.allSettled(tasks, options?)`
21
120
 
22
- Executes multiple tasks with concurrency control. Returns a discriminated union for each result.
121
+ Executes multiple tasks with concurrency control. Returns all results (success or failure).
23
122
 
24
- ```ts
123
+ ```typescript
25
124
  const tasks = [
26
125
  () => fetch("/api/1"),
27
126
  () => fetch("/api/2"),
28
127
  () => fetch("/api/3"),
29
128
  ];
30
129
 
31
- // Run max 2 at a time, settle all results
32
130
  const results = await runner.allSettled(tasks, {
33
131
  concurrency: 2,
34
- mode: "settle", // "fail-fast" is also supported
132
+ mode: "settle", // or "fail-fast"
35
133
  });
36
134
  ```
37
135
 
38
- ### `runAll(tasks, options?)`
136
+ ### `runner.all(tasks, options?)`
39
137
 
40
- Like `Promise.all` but with concurrency control and retries. Throws the first error (normalized).
138
+ Like `Promise.all` but with concurrency control. Throws the first normalized error if any fails.
41
139
 
42
- ```ts
140
+ ```typescript
43
141
  try {
44
142
  const data = await runner.all(tasks, { concurrency: 5 });
45
143
  } catch (err) {
46
- // err is your typed AppError
144
+ // err is ResultError
47
145
  console.error(err.code);
48
146
  }
49
147
  ```
50
148
 
51
- ---
52
-
53
149
  ## React Example
54
150
 
55
- ```ts
151
+ ```typescript
56
152
  useEffect(() => {
57
153
  let cancelled = false;
58
154
 
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';function B(r,e){return t=>{for(let u of r){let n=u(t);if(n)return n}return e(t)}}function N(r){return r instanceof Error?{code:r.name==="TypeError"?"NETWORK":"UNKNOWN",message:r.message||"Something went wrong",cause:r}:{code:"UNKNOWN",message:"Something went wrong",cause:r}}function D(r){return r instanceof DOMException&&r.name==="AbortError"?{code:"ABORTED",message:"Request cancelled",cause:r}:r instanceof DOMException&&r.name==="TimeoutError"?{code:"TIMEOUT",message:"Request timed out",cause:r}:N(r)}function O(r){if(r.retries!=null&&r.retries<0)throw new Error("retries must be >= 0");if(r.timeout!=null&&r.timeout<=0)throw new Error("timeout must be > 0");if(r.maxDelay!=null&&r.maxDelay<0)throw new Error("maxDelay must be >= 0");let e=r.circuitBreaker;if(e){if(e.failureThreshold<1)throw new Error("failureThreshold must be >= 1");if(e.resetTimeout<=0)throw new Error("resetTimeout must be > 0");if(e.halfOpenRequests!=null&&e.halfOpenRequests<1)throw new Error("halfOpenRequests must be >= 1")}}var J=r=>new Promise(e=>setTimeout(e,r));function z(r,e,t){return Math.max(e,Math.min(t,r))}function H(r,e,t,u,n,s){let a=typeof r=="function"?r(e,t):typeof r=="number"?r:u,i=Q(n??"linear",a,e),p=s!=null?z(i,0,s):i;return Number.isFinite(p)?p:0}function _(r,e){if(r<=0||!e)return r;let t=typeof e=="object"&&e.rng?e.rng:Math.random,u=typeof e=="number"?e:e===true?.5:typeof e=="object"&&e.ratio!=null?e.ratio:.5,n=z(u,0,1);return (typeof e=="object"&&e.mode?e.mode:"full")==="equal"?r*(1-n)+t()*r*n:r+t()*r*n}function Q(r,e,t){if(typeof r=="function"){let s=r(t);return s>=0?s:0}let u=e>=0?e:0,n=t>=1?t:1;if(r==="linear")return u;if(r==="exponential")return u*Math.pow(2,n-1);if(r==="fibonacci"){if(n<=2)return u;let s=1,a=1;for(let i=3;i<=n;i++){let p=s+a;s=a,a=p;}return u*a}return u}async function g(r,e={}){let{toError:t=D,mapError:u,onError:n,onSuccess:s,onFinally:a,ignoreAbort:i=true,retries:p=0,retryDelay:y,shouldRetry:f=()=>true,jitter:E={ratio:.5,mode:"full"},backoffStrategy:o,maxDelay:m,timeout:A,signal:R,onRetry:x,logger:b,onAbort:q}=e,$=p>0?300:0;if(O(e),R?.aborted)try{q?.(R);}finally{let T=t(new DOMException("Aborted","AbortError")),l=u?u(T):T;return i||n?.(l),a?.(),{ok:false,data:null,error:l,metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,lastError:l}}}let M=Date.now(),d=0,U;for(;;)try{let T=null,l=A&&A>0?new Promise((w,K)=>{T=setTimeout(()=>K(new DOMException("Timeout","TimeoutError")),A);}):null,I=await(l?Promise.race([r(),l]):r());T&&clearTimeout(T);try{s?.(I);}catch(w){b?.error?.("run:onSuccess failed",t(w));}try{a?.();}catch(w){b?.error?.("run:onFinally failed",t(w));}let h=Date.now()-M,k={totalAttempts:d+1,totalRetries:d,totalDuration:h,lastError:U};return b?.debug?.("run:success",{attempts:k.totalAttempts,duration:k.totalDuration}),{ok:!0,data:I,error:null,metrics:k}}catch(T){let l=t(T);if(u&&(l=u(l)),l?.code==="ABORTED"||T instanceof DOMException&&T.name==="AbortError"||R?.aborted)try{if(R)try{q?.(R);}catch(c){b?.error?.("run:onAbort failed",t(c));}}finally{if(!i)try{n?.(l);}catch(F){b?.error?.("run:onError failed",t(F));}try{a?.();}catch(F){b?.error?.("run:onFinally failed",t(F));}let c=Date.now()-M,W={totalAttempts:d,totalRetries:d,totalDuration:c,lastError:l};return b?.debug?.("run:aborted",{attempt:d,duration:W.totalDuration}),{ok:false,data:null,error:l,metrics:W}}U=l;let h=d+1,k={totalAttempts:h,elapsedTime:Date.now()-M},w=await Promise.resolve(f(h,l,k));if(d<p&&w){d=h;let c=H(y,d,l,$,o,m);(!Number.isFinite(c)||c<0)&&(c=0),c=_(c,E),x?.(d,l,c),b?.debug?.("run:retry",{attempt:d,delay:c}),c>0&&await J(c);continue}try{n?.(l);}catch(c){b?.error?.("run:onError failed",t(c));}try{a?.();}catch(c){b?.error?.("run:onFinally failed",t(c));}let G=Date.now()-M,L={totalAttempts:d+1,totalRetries:d,totalDuration:G,lastError:l};return b?.error?.("run:error",l),{ok:false,data:null,error:l,metrics:L}}}var V=r=>r.status==="ok";async function v(r,e={}){let{concurrency:t=1/0,mode:u="settle",...n}=e;if(O(n),r.length===0)return [];let s=Number.isFinite(t)?Math.max(1,Math.floor(t)):1/0,a=new Array(r.length),i=0,p=false,y=(o,m)=>{a[o]=m.ok?{status:"ok",ok:true,data:m.data,error:null}:{status:"error",ok:false,data:null,error:m.error};},f=()=>{for(let o=0;o<r.length;o++)a[o]||(a[o]={status:"skipped",ok:false,data:null,error:null});};if(s>=r.length)return (await Promise.all(r.map(m=>g(m,n)))).forEach((m,A)=>{y(A,m);}),a;let E=async()=>{for(;;){if(p)return;let o=i++;if(o>=r.length)return;let m=r[o];if(!m)continue;let A=await g(m,n);if(y(o,A),!A.ok&&u==="fail-fast"){p=true;return}}};return await Promise.all(Array.from({length:Math.min(s,r.length)},()=>E())),f(),a}async function C(r,e={}){let{concurrency:t=1/0,...u}=e;if(O(u),r.length===0)return [];let n=Number.isFinite(t)?Math.max(1,Math.floor(t)):1/0,s=new Array(r.length);if(n>=r.length)return await Promise.all(r.map(async(f,E)=>{let o=await g(f,u);if(!o.ok)throw o.error;s[E]=o.data;})),s;let a=0,i=false,p=null,y=async()=>{for(;;){if(i)return;let f=a++;if(f>=r.length)return;let E=r[f];if(!E)continue;let o=await g(E,u);if(!o.ok){p??(p=o.error),i=true;return}s[f]=o.data;}};if(await Promise.all(Array.from({length:Math.min(n,r.length)},()=>y())),p)throw p;return s}var X=r=>r instanceof DOMException&&r.name==="AbortError"?{code:"ABORTED",message:"Request cancelled",cause:r}:r instanceof Error&&r.name==="AbortError"?{code:"ABORTED",message:r.message||"Request cancelled",cause:r}:null,Y=r=>r instanceof DOMException&&r.name==="TimeoutError"?{code:"TIMEOUT",message:"Request timed out",cause:r}:r instanceof Error&&r.name==="TimeoutError"?{code:"TIMEOUT",message:r.message||"Request timed out",cause:r}:null,Z=r=>{if(typeof r=="object"&&r!==null){let e=r,t=e.status??e.statusCode;if(typeof t=="number")return {code:"HTTP",message:typeof e.message=="string"?e.message:`HTTP Error ${t}`,status:t,cause:r}}return null},j=r=>typeof AggregateError<"u"&&r instanceof AggregateError?{code:"UNKNOWN",message:r.message||"Multiple errors occurred",cause:r,meta:{errors:r.errors}}:null,rr=r=>typeof r=="string"?{code:"UNKNOWN",message:r,cause:r}:null,er=r=>typeof r=="object"&&r!==null&&"message"in r&&typeof r.message=="string"?{code:"UNKNOWN",message:r.message,cause:r}:null,tr={abort:X,timeout:Y,httpStatus:Z,aggregate:j,string:rr,message:er};var S=class{constructor(e){this.matcher=e;}toError(e){return t=>this.matcher(t)?e(t):null}},or={instance(r){return new S(e=>e instanceof r)},when(r){return new S(r)}};var P=(r,e)=>t=>e?e(r?r(t):t):r?r(t):t;function nr(r={}){let{rules:e=[],fallback:t=E=>N(E),toError:u,ignoreAbort:n=true,mapError:s,circuitBreaker:a}=r,i=u??(e.length>0?B(e,t):D),p=0,y=null,f=null;return {run(E,o={}){let m=o.circuitBreaker??a,A=Date.now();if(m){if(y&&A<y){let R=i(new Error("Circuit open")),x=P(s,o.mapError)(R);return o.onError?.(x),o.onFinally?.(),Promise.resolve({ok:false,data:null,error:x,metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,lastError:x}})}if(y&&A>=y&&(y=null,p=0,f=m.halfOpenRequests??1),f!=null)if(f<=0){let R=i(new Error("Circuit half-open limit")),x=P(s,o.mapError)(R);return o.onError?.(x),o.onFinally?.(),Promise.resolve({ok:false,data:null,error:x,metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,lastError:x}})}else f--;}return g(E,{toError:i,ignoreAbort:n,...o,mapError:P(s,o.mapError)}).then(R=>(m&&(R.ok?(p=0,y=null,f=null):(p++,p>=m.failureThreshold&&(y=Date.now()+m.resetTimeout,f=null))),R))},allSettled(E,o={}){return v(E,{toError:i,ignoreAbort:n,...o,mapError:P(s,o.mapError)})},all(E,o={}){return C(E,{toError:i,ignoreAbort:n,...o,mapError:P(s,o.mapError)})}}}exports.createNormalizer=B;exports.createRunner=nr;exports.defaultFallback=N;exports.errorRule=or;exports.isSuccess=V;exports.rules=tr;exports.run=g;exports.runAll=C;exports.runAllSettled=v;exports.toAppError=D;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});function C(r,e){return t=>{for(let n of r){let u=n(t);if(u)return u}return e(t)}}function S(r){return r instanceof Error?{code:r.name==="TypeError"?"NETWORK":"UNKNOWN",message:r.message||"Something went wrong",cause:r}:{code:"UNKNOWN",message:"Something went wrong",cause:r}}function P(r){return r instanceof DOMException&&r.name==="AbortError"?{code:"ABORTED",message:"Request cancelled",cause:r}:r instanceof DOMException&&r.name==="TimeoutError"?{code:"TIMEOUT",message:"Request timed out",cause:r}:S(r)}function k(r){if(r.retries!=null&&r.retries<0)throw new Error("retries must be >= 0");if(r.timeout!=null&&r.timeout<=0)throw new Error("timeout must be > 0");if(r.maxDelay!=null&&r.maxDelay<0)throw new Error("maxDelay must be >= 0");let e=r.circuitBreaker;if(e){if(e.failureThreshold<1)throw new Error("failureThreshold must be >= 1");if(e.resetTimeout<=0)throw new Error("resetTimeout must be > 0");if(e.halfOpenRequests!=null&&e.halfOpenRequests<1)throw new Error("halfOpenRequests must be >= 1")}}var H=r=>new Promise(e=>setTimeout(e,r));function L(r,e,t){return Math.max(e,Math.min(t,r))}function _(r,e,t,n,u,l){let s=typeof r=="function"?r(e,t):typeof r=="number"?r:n,E=X(u??"linear",s,e),a=l!=null?L(E,0,l):E;return Number.isFinite(a)?a:0}function $(r,e){if(r<=0||!e)return r;let t=typeof e=="object"&&e.rng?e.rng:Math.random,n=typeof e=="number"?e:e===true?.5:typeof e=="object"&&e.ratio!=null?e.ratio:.5,u=L(n,0,1);return (typeof e=="object"&&e.mode?e.mode:"full")==="equal"?r*(1-u)+t()*r*u:r+t()*r*u}function X(r,e,t){if(typeof r=="function"){let l=r(t);return l>=0?l:0}let n=e>=0?e:0,u=t>=1?t:1;if(r==="linear")return n;if(r==="exponential")return n*Math.pow(2,u-1);if(r==="fibonacci"){if(u<=2)return n;let l=1,s=1;for(let E=3;E<=u;E++){let a=l+s;l=s,s=a;}return n*s}return n}async function w(r,e={}){let{toError:t=P,mapError:n,onError:u,onSuccess:l,onFinally:s,ignoreAbort:E=true,retries:a=0,retryDelay:g,shouldRetry:R=()=>true,jitter:d={ratio:.5,mode:"full"},backoffStrategy:o,maxDelay:c,timeout:f,signal:i,onRetry:h,logger:y,onAbort:T}=e,O=a>0?300:0;if(k(e),i?.aborted)try{T?.(i);}finally{let x=t(new DOMException("Aborted","AbortError")),m=n?n(x):x;return E||u?.(m),s?.(),{ok:false,data:null,error:m,metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,lastError:m}}}let I=Date.now(),b=0,W;for(;;)try{let x=null,m=f&&f>0?new Promise((A,J)=>{x=setTimeout(()=>J(new DOMException("Timeout","TimeoutError")),f);}):null,v=await(m?Promise.race([r(),m]):r());x&&clearTimeout(x);try{l?.(v);}catch(A){y?.error?.("run:onSuccess failed",t(A));}try{s?.();}catch(A){y?.error?.("run:onFinally failed",t(A));}let M=Date.now()-I,D={totalAttempts:b+1,totalRetries:b,totalDuration:M,lastError:W};return y?.debug?.("run:success",{attempts:D.totalAttempts,duration:D.totalDuration}),{ok:!0,data:v,error:null,metrics:D}}catch(x){let m=t(x);if(n&&(m=n(m)),m?.code==="ABORTED"||x instanceof DOMException&&x.name==="AbortError"||i?.aborted)try{if(i)try{T?.(i);}catch(p){y?.error?.("run:onAbort failed",t(p));}}finally{if(!E)try{u?.(m);}catch(B){y?.error?.("run:onError failed",t(B));}try{s?.();}catch(B){y?.error?.("run:onFinally failed",t(B));}let p=Date.now()-I,z={totalAttempts:b,totalRetries:b,totalDuration:p,lastError:m};return y?.debug?.("run:aborted",{attempt:b,duration:z.totalDuration}),{ok:false,data:null,error:m,metrics:z}}W=m;let M=b+1,D={totalAttempts:M,elapsedTime:Date.now()-I},A=await Promise.resolve(R(M,m,D));if(b<a&&A){b=M;let p=_(g,b,m,O,o,c);(!Number.isFinite(p)||p<0)&&(p=0),p=$(p,d),h?.(b,m,p),y?.debug?.("run:retry",{attempt:b,delay:p}),p>0&&await H(p);continue}try{u?.(m);}catch(p){y?.error?.("run:onError failed",t(p));}try{s?.();}catch(p){y?.error?.("run:onFinally failed",t(p));}let Q=Date.now()-I,V={totalAttempts:b+1,totalRetries:b,totalDuration:Q,lastError:m};return y?.error?.("run:error",m),{ok:false,data:null,error:m,metrics:V}}}var Y=r=>r.status==="ok";async function q(r,e={}){let{concurrency:t=1/0,mode:n="settle",...u}=e;if(k(u),r.length===0)return [];let l=Number.isFinite(t)?Math.max(1,Math.floor(t)):1/0,s=new Array(r.length),E=0,a=false,g=(o,c)=>{s[o]=c.ok?{status:"ok",ok:true,data:c.data,error:null}:{status:"error",ok:false,data:null,error:c.error};},R=()=>{for(let o=0;o<r.length;o++)s[o]||(s[o]={status:"skipped",ok:false,data:null,error:null});};if(l>=r.length)return (await Promise.all(r.map(c=>w(c,u)))).forEach((c,f)=>{g(f,c);}),s;let d=async()=>{for(;;){if(a)return;let o=E++;if(o>=r.length)return;let c=r[o];if(!c)continue;let f=await w(c,u);if(g(o,f),!f.ok&&n==="fail-fast"){a=true;return}}};return await Promise.all(Array.from({length:Math.min(l,r.length)},()=>d())),R(),s}async function U(r,e={}){let{concurrency:t=1/0,...n}=e;if(k(n),r.length===0)return [];let u=Number.isFinite(t)?Math.max(1,Math.floor(t)):1/0,l=new Array(r.length);if(u>=r.length)return await Promise.all(r.map(async(R,d)=>{let o=await w(R,n);if(!o.ok)throw o.error;l[d]=o.data;})),l;let s=0,E=false,a=null,g=async()=>{for(;;){if(E)return;let R=s++;if(R>=r.length)return;let d=r[R];if(!d)continue;let o=await w(d,n);if(!o.ok){a??(a=o.error),E=true;return}l[R]=o.data;}};if(await Promise.all(Array.from({length:Math.min(u,r.length)},()=>g())),a)throw a;return l}var Z=r=>r instanceof DOMException&&r.name==="AbortError"?{code:"ABORTED",message:"Request cancelled",cause:r}:r instanceof Error&&r.name==="AbortError"?{code:"ABORTED",message:r.message||"Request cancelled",cause:r}:null,j=r=>r instanceof DOMException&&r.name==="TimeoutError"?{code:"TIMEOUT",message:"Request timed out",cause:r}:r instanceof Error&&r.name==="TimeoutError"?{code:"TIMEOUT",message:r.message||"Request timed out",cause:r}:null,rr=r=>{if(typeof r=="object"&&r!==null){let e=r,t=e.status??e.statusCode;if(typeof t=="number")return {code:"HTTP",message:typeof e.message=="string"?e.message:`HTTP Error ${t}`,status:t,cause:r}}return null},er=r=>typeof AggregateError<"u"&&r instanceof AggregateError?{code:"UNKNOWN",message:r.message||"Multiple errors occurred",cause:r,meta:{errors:r.errors}}:null,tr=r=>typeof r=="string"?{code:"UNKNOWN",message:r,cause:r}:null,or=r=>typeof r=="object"&&r!==null&&"message"in r&&typeof r.message=="string"?{code:"UNKNOWN",message:r.message,cause:r}:null,K={abort:Z,timeout:j,httpStatus:rr,aggregate:er,string:tr,message:or};var F=class{constructor(e){this.matcher=e;}toError(e){return t=>this.matcher(t)?e(t):null}},nr={instance(r){return new F(e=>e instanceof r)},when(r){return new F(r)}};var N=(r,e)=>t=>e?e(r?r(t):t):r?r(t):t;function G(r={}){let{rules:e=[],rulesMode:t="extend",fallback:n=f=>S(f),toError:u,ignoreAbort:l=true,mapError:s,circuitBreaker:E}=r,a=[],g=Object.values(K);e.length>0?t==="extend"?a=[...e,...g]:a=[...e]:t==="extend"?a=g:a=[];let R=u??(a.length>0?C(a,n):P),d=0,o=null,c=null;return {run(f,i={}){let h=i.circuitBreaker??E,y=Date.now();if(h){if(o&&y<o){let T=R(new Error("Circuit open")),O=N(s,i.mapError)(T);return i.onError?.(O),i.onFinally?.(),Promise.resolve({ok:false,data:null,error:O,metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,lastError:O}})}if(o&&y>=o&&(o=null,d=0,c=h.halfOpenRequests??1),c!=null)if(c<=0){let T=R(new Error("Circuit half-open limit")),O=N(s,i.mapError)(T);return i.onError?.(O),i.onFinally?.(),Promise.resolve({ok:false,data:null,error:O,metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,lastError:O}})}else c--;}return w(f,{toError:R,ignoreAbort:l,...i,mapError:N(s,i.mapError)}).then(T=>(h&&(T.ok?(d=0,o=null,c=null):(d++,d>=h.failureThreshold&&(o=Date.now()+h.resetTimeout,c=null))),T))},allSettled(f,i={}){return q(f,{toError:R,ignoreAbort:l,...i,mapError:N(s,i.mapError)})},all(f,i={}){return U(f,{toError:R,ignoreAbort:l,...i,mapError:N(s,i.mapError)})}}}function ur(r={}){return G(r)}exports.createNormalizer=C;exports.default=ur;exports.defaultFallback=S;exports.errorRule=nr;exports.isSuccess=Y;exports.rules=K;exports.run=w;exports.runAll=U;exports.runAllSettled=q;exports.toResultError=P;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/error/normalize.ts","../src/types.ts","../src/utils.ts","../src/runner/run.ts","../src/runner/runAllSettled.ts","../src/runner/runAll.ts","../src/error/core.ts","../src/error/builder.ts","../src/runner/runner.ts"],"names":["createNormalizer","rules","fallback","err","r","out","defaultFallback","toAppError","validateOptions","options","cb","sleep","ms","resolve","clamp","n","min","max","resolveRetryDelay","retryDelay","attempt","defaultBaseDelay","backoffStrategy","maxDelay","base","backoff","computeBackoffDelay","applyJitter","delay","jitter","rng","ratio","strategy","v","b","a","prev","curr","next","run","fn","toError","mapError","onError","onSuccess","onFinally","ignoreAbort","retries","shouldRetry","timeout","signal","onRetry","logger","onAbort","mapped","startedAt","lastError","timeoutId","timeoutPromise","_","reject","data","e","totalDuration","metrics","nextAttempt","context","decision","isSuccess","runAllSettled","tasks","concurrency","mode","runOptions","limit","results","nextIndex","aborted","setResult","i","markSkipped","t","worker","task","runAll","firstError","abort","httpStatus","obj","status","aggregate","string","message","ErrorRuleBuilder","matcher","mapper","errorRule","ctor","predicate","composeMapError","local","createRunner","opts","customToError","defaultMapError","defaultCircuitBreaker","failureCount","openUntil","halfOpenRemaining","now","fns"],"mappings":"aAEO,SAASA,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACA,CACA,OAAQC,GAAoB,CAC1B,IAAA,IAAWC,CAAAA,IAAKH,CAAAA,CAAO,CACrB,IAAMI,EAAMD,CAAAA,CAAED,CAAG,CAAA,CACjB,GAAIE,CAAAA,CAAK,OAAOA,CAClB,CACA,OAAOH,CAAAA,CAASC,CAAG,CACrB,CACF,CAGO,SAASG,CAAAA,CAAgBH,CAAAA,CAAwB,CACtD,OAAIA,CAAAA,YAAe,MAIV,CAAE,IAAA,CADIA,CAAAA,CAAI,IAAA,GAAS,WAAA,CAAc,SAAA,CAAY,UACrC,OAAA,CAASA,CAAAA,CAAI,OAAA,EAAW,sBAAA,CAAwB,KAAA,CAAOA,CAAI,CAAA,CAErE,CAAE,IAAA,CAAM,SAAA,CAAW,OAAA,CAAS,sBAAA,CAAwB,KAAA,CAAOA,CAAI,CACxE,CAGO,SAASI,CAAAA,CAAWJ,CAAAA,CAAwB,CAEjD,OAAIA,aAAe,YAAA,EAAgBA,CAAAA,CAAI,IAAA,GAAS,YAAA,CACvC,CAAE,IAAA,CAAM,UAAW,OAAA,CAAS,mBAAA,CAAqB,KAAA,CAAOA,CAAI,CAAA,CAEjEA,CAAAA,YAAe,cAAgBA,CAAAA,CAAI,IAAA,GAAS,cAAA,CACvC,CAAE,IAAA,CAAM,SAAA,CAAW,QAAS,mBAAA,CAAqB,KAAA,CAAOA,CAAI,CAAA,CAE9DG,CAAAA,CAAgBH,CAAG,CAC5B,CC2IO,SAASK,CAAAA,CACdC,CAAAA,CACM,CACN,GAAIA,EAAQ,OAAA,EAAW,IAAA,EAAQA,CAAAA,CAAQ,OAAA,CAAU,CAAA,CAC/C,MAAM,IAAI,KAAA,CAAM,sBAAsB,CAAA,CAExC,GAAIA,CAAAA,CAAQ,OAAA,EAAW,IAAA,EAAQA,EAAQ,OAAA,EAAW,CAAA,CAChD,MAAM,IAAI,KAAA,CAAM,qBAAqB,EAEvC,GAAIA,CAAAA,CAAQ,QAAA,EAAY,IAAA,EAAQA,CAAAA,CAAQ,QAAA,CAAW,EACjD,MAAM,IAAI,KAAA,CAAM,uBAAuB,CAAA,CAEzC,IAAMC,EAAKD,CAAAA,CAAQ,cAAA,CACnB,GAAIC,CAAAA,CAAI,CACN,GAAIA,EAAG,gBAAA,CAAmB,CAAA,CACxB,MAAM,IAAI,KAAA,CAAM,+BAA+B,EAEjD,GAAIA,CAAAA,CAAG,YAAA,EAAgB,CAAA,CACrB,MAAM,IAAI,MAAM,0BAA0B,CAAA,CAE5C,GAAIA,CAAAA,CAAG,gBAAA,EAAoB,IAAA,EAAQA,CAAAA,CAAG,gBAAA,CAAmB,CAAA,CACvD,MAAM,IAAI,KAAA,CAAM,+BAA+B,CAEnD,CACF,CCrMO,IAAMC,CAAAA,CAASC,CAAAA,EACpB,IAAI,OAAA,CAASC,GAAY,UAAA,CAAWA,CAAAA,CAASD,CAAE,CAAC,CAAA,CAE3C,SAASE,EAAMC,CAAAA,CAAWC,CAAAA,CAAaC,CAAAA,CAAa,CACzD,OAAO,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAKF,CAAC,CAAC,CACvC,CAEO,SAASG,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAjB,CAAAA,CACAkB,CAAAA,CACAC,EACAC,CAAAA,CACQ,CACR,IAAIC,CAAAA,CACF,OAAOL,CAAAA,EAAe,WACjBA,CAAAA,CAA+BC,CAAAA,CAASjB,CAAG,CAAA,CAC5C,OAAOgB,CAAAA,EAAe,QAAA,CACrBA,CAAAA,CAEDE,CAAAA,CAGAI,CAAAA,CAAUC,CAAAA,CACdJ,CAAAA,EAAmB,QAAA,CACnBE,CAAAA,CACAJ,CACF,CAAA,CAEMf,CAAAA,CAAMkB,CAAAA,EAAY,IAAA,CAAOT,CAAAA,CAAMW,CAAAA,CAAS,EAAGF,CAAQ,CAAA,CAAIE,CAAAA,CAC7D,OAAO,MAAA,CAAO,QAAA,CAASpB,CAAG,CAAA,CAAIA,CAAAA,CAAM,CACtC,CAEO,SAASsB,CAAAA,CAAYC,EAAeC,CAAAA,CAAoC,CAC7E,GAAID,CAAAA,EAAS,CAAA,EAAK,CAACC,EAAQ,OAAOD,CAAAA,CAElC,IAAME,CAAAA,CACJ,OAAOD,CAAAA,EAAW,UAAYA,CAAAA,CAAO,GAAA,CAAMA,CAAAA,CAAO,GAAA,CAAM,IAAA,CAAK,MAAA,CAGzDE,EACJ,OAAOF,CAAAA,EAAW,QAAA,CACdA,CAAAA,CACAA,CAAAA,GAAW,IAAA,CACX,EAAA,CACA,OAAOA,CAAAA,EAAW,QAAA,EAAYA,CAAAA,CAAO,KAAA,EAAS,IAAA,CAC9CA,CAAAA,CAAO,MACP,EAAA,CAEAzB,CAAAA,CAAIU,CAAAA,CAAMiB,CAAAA,CAAO,CAAA,CAAG,CAAC,EAM3B,OAAA,CAJa,OAAOF,CAAAA,EAAW,QAAA,EAAYA,CAAAA,CAAO,IAAA,CAAOA,EAAO,IAAA,CAAO,MAAA,IAI1D,OAAA,CACJD,CAAAA,EAAS,CAAA,CAAIxB,CAAAA,CAAAA,CAAK0B,GAAI,CAAIF,CAAAA,CAAQxB,CAAAA,CAIpCwB,CAAAA,CAAQE,CAAAA,EAAI,CAAIF,EAAQxB,CACjC,CAEO,SAASsB,CAAAA,CACdM,CAAAA,CACAR,CAAAA,CACAJ,EACQ,CACR,GAAI,OAAOY,CAAAA,EAAa,UAAA,CAAY,CAClC,IAAMC,CAAAA,CAAID,CAAAA,CAASZ,CAAO,CAAA,CAC1B,OAAOa,CAAAA,EAAK,CAAA,CAAIA,CAAAA,CAAI,CACtB,CACA,IAAMC,CAAAA,CAAIV,CAAAA,EAAQ,CAAA,CAAIA,EAAO,CAAA,CACvBW,CAAAA,CAAIf,CAAAA,EAAW,CAAA,CAAIA,CAAAA,CAAU,CAAA,CACnC,GAAIY,CAAAA,GAAa,QAAA,CAAU,OAAOE,CAAAA,CAClC,GAAIF,CAAAA,GAAa,cAAe,OAAOE,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAC,CAAA,CAC5D,GAAIH,CAAAA,GAAa,WAAA,CAAa,CAC5B,GAAIG,GAAK,CAAA,CAAG,OAAOD,CAAAA,CACnB,IAAIE,CAAAA,CAAO,CAAA,CACPC,EAAO,CAAA,CACX,IAAA,IAAS,CAAA,CAAI,CAAA,CAAG,CAAA,EAAKF,CAAAA,CAAG,IAAK,CAC3B,IAAMG,CAAAA,CAAOF,CAAAA,CAAOC,CAAAA,CACpBD,CAAAA,CAAOC,CAAAA,CACPA,CAAAA,CAAOC,EACT,CACA,OAAOJ,CAAAA,CAAIG,CACb,CACA,OAAOH,CACT,CC5EA,eAAsBK,CAAAA,CACpBC,CAAAA,CACA/B,CAAAA,CAA4B,EAAC,CACH,CAC1B,GAAM,CACJ,OAAA,CAAAgC,CAAAA,CAAUlC,EACV,QAAA,CAAAmC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CAAc,IAAA,CACd,OAAA,CAAAC,CAAAA,CAAU,CAAA,CACV,WAAA5B,CAAAA,CACA,WAAA,CAAA6B,CAAAA,CAAc,IAAM,IAAA,CACpB,MAAA,CAAAnB,EAAS,CAAE,KAAA,CAAO,EAAA,CAAK,IAAA,CAAM,MAAO,CAAA,CACpC,gBAAAP,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,OAAA,CAAA0B,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CACF,CAAA,CAAI5C,EAEEY,CAAAA,CAAmB0B,CAAAA,CAAU,CAAA,CAAI,GAAA,CAAM,CAAA,CAI7C,GAFAvC,EAAgBC,CAAO,CAAA,CAEnByC,CAAAA,EAAQ,OAAA,CACV,GAAI,CACFG,IAAUH,CAAM,EAClB,CAAA,OAAE,CACA,IAAM/C,CAAAA,CAAMsC,EAAQ,IAAI,YAAA,CAAa,SAAA,CAAW,YAAY,CAAC,CAAA,CACvDa,EAASZ,CAAAA,CAAWA,CAAAA,CAASvC,CAAG,CAAA,CAAIA,CAAAA,CAC1C,OAAK2C,GACHH,CAAAA,GAAUW,CAAM,CAAA,CAElBT,CAAAA,IAAY,CACL,CACL,GAAI,KAAA,CACJ,IAAA,CAAM,IAAA,CACN,KAAA,CAAOS,CAAAA,CACP,OAAA,CAAS,CACP,aAAA,CAAe,CAAA,CACf,YAAA,CAAc,CAAA,CACd,aAAA,CAAe,CAAA,CACf,SAAA,CAAWA,CACb,CACF,CACF,CAGF,IAAMC,CAAAA,CAAY,IAAA,CAAK,KAAI,CACvBnC,CAAAA,CAAU,CAAA,CACVoC,CAAAA,CAEJ,OACE,GAAI,CACF,IAAIC,CAAAA,CAAiB,IAAA,CACfC,CAAAA,CACJT,CAAAA,EAAWA,CAAAA,CAAU,EACjB,IAAI,OAAA,CAAe,CAACU,CAAAA,CAAGC,CAAAA,GAAW,CAChCH,EAAY,UAAA,CACV,IAAMG,CAAAA,CAAO,IAAI,YAAA,CAAa,SAAA,CAAW,cAAc,CAAC,CAAA,CACxDX,CACF,EACF,CAAC,CAAA,CACD,KAEAY,CAAAA,CAAO,MAAOH,CAAAA,CAChB,OAAA,CAAQ,IAAA,CAAK,CAAClB,CAAAA,EAAG,CAAGkB,CAAc,CAAC,CAAA,CACnClB,CAAAA,EAAG,CAAA,CACHiB,CAAAA,EAAW,aAAaA,CAAS,CAAA,CACrC,GAAI,CACFb,CAAAA,GAAYiB,CAAI,EAClB,CAAA,MAASC,CAAAA,CAAG,CACVV,CAAAA,EAAQ,KAAA,GAAQ,sBAAA,CAAwBX,EAAQqB,CAAC,CAAC,EACpD,CACA,GAAI,CACFjB,MACF,CAAA,MAASiB,CAAAA,CAAG,CACVV,CAAAA,EAAQ,KAAA,GAAQ,uBAAwBX,CAAAA,CAAQqB,CAAC,CAAC,EACpD,CACA,IAAMC,EAAgB,IAAA,CAAK,GAAA,EAAI,CAAIR,CAAAA,CAC7BS,CAAAA,CAAU,CACd,cAAe5C,CAAAA,CAAU,CAAA,CACzB,YAAA,CAAcA,CAAAA,CACd,aAAA,CAAA2C,CAAAA,CACA,SAAA,CAAAP,CACF,CAAA,CACA,OAAAJ,CAAAA,EAAQ,KAAA,GAAQ,aAAA,CAAe,CAC7B,SAAUY,CAAAA,CAAQ,aAAA,CAClB,QAAA,CAAUA,CAAAA,CAAQ,aACpB,CAAC,EACM,CAAE,EAAA,CAAI,CAAA,CAAA,CAAM,IAAA,CAAAH,CAAAA,CAAM,KAAA,CAAO,KAAM,OAAA,CAAAG,CAAQ,CAChD,CAAA,MAASF,CAAAA,CAAG,CACV,IAAI3D,CAAAA,CAAMsC,CAAAA,CAAQqB,CAAC,CAAA,CAQnB,GAPIpB,CAAAA,GAAUvC,CAAAA,CAAMuC,EAASvC,CAAG,CAAA,CAAA,CAG7BA,CAAAA,EAAa,IAAA,GAAS,SAAA,EACtB2D,CAAAA,YAAa,cAAgBA,CAAAA,CAAE,IAAA,GAAS,YAAA,EACzCZ,CAAAA,EAAQ,OAAA,CAGR,GAAI,CACF,GAAIA,CAAAA,CACF,GAAI,CACFG,CAAAA,GAAUH,CAAM,EAClB,CAAA,MAASY,CAAAA,CAAG,CACVV,CAAAA,EAAQ,KAAA,GAAQ,oBAAA,CAAsBX,CAAAA,CAAQqB,CAAC,CAAC,EAClD,CAEJ,CAAA,OAAE,CACA,GAAI,CAAChB,CAAAA,CACH,GAAI,CACFH,CAAAA,GAAUxC,CAAG,EACf,OAAS2D,CAAAA,CAAG,CACVV,CAAAA,EAAQ,KAAA,GAAQ,oBAAA,CAAsBX,CAAAA,CAAQqB,CAAC,CAAC,EAClD,CAEF,GAAI,CACFjB,CAAAA,KACF,CAAA,MAASiB,CAAAA,CAAG,CACVV,CAAAA,EAAQ,KAAA,GAAQ,sBAAA,CAAwBX,EAAQqB,CAAC,CAAC,EACpD,CACA,IAAMC,CAAAA,CAAgB,KAAK,GAAA,EAAI,CAAIR,CAAAA,CAC7BS,CAAAA,CAAU,CACd,aAAA,CAAe5C,CAAAA,CACf,YAAA,CAAcA,CAAAA,CACd,aAAA,CAAA2C,CAAAA,CACA,SAAA,CAAW5D,CACb,CAAA,CACA,OAAAiD,CAAAA,EAAQ,KAAA,GAAQ,aAAA,CAAe,CAC7B,OAAA,CAAAhC,CAAAA,CACA,SAAU4C,CAAAA,CAAQ,aACpB,CAAC,CAAA,CACM,CAAE,EAAA,CAAI,MAAO,IAAA,CAAM,IAAA,CAAM,KAAA,CAAO7D,CAAAA,CAAK,OAAA,CAAA6D,CAAQ,CACtD,CAGFR,CAAAA,CAAYrD,CAAAA,CACZ,IAAM8D,CAAAA,CAAc7C,CAAAA,CAAU,CAAA,CACxB8C,EAAU,CACd,aAAA,CAAeD,CAAAA,CACf,WAAA,CAAa,IAAA,CAAK,GAAA,GAAQV,CAC5B,CAAA,CACMY,CAAAA,CAAW,MAAM,OAAA,CAAQ,OAAA,CAC7BnB,EAAYiB,CAAAA,CAAa9D,CAAAA,CAAK+D,CAAO,CACvC,CAAA,CAGA,GAFiB9C,CAAAA,CAAU2B,CAAAA,EAAWoB,CAAAA,CAExB,CACZ/C,CAAAA,CAAU6C,CAAAA,CAEV,IAAIrC,CAAAA,CAAQV,EACVC,CAAAA,CACAC,CAAAA,CACAjB,CAAAA,CACAkB,CAAAA,CACAC,CAAAA,CACAC,CACF,GAEI,CAAC,MAAA,CAAO,QAAA,CAASK,CAAK,CAAA,EAAKA,CAAAA,CAAQ,KAAGA,CAAAA,CAAQ,CAAA,CAAA,CAElDA,CAAAA,CAAQD,CAAAA,CAAYC,CAAAA,CAAOC,CAAM,EAEjCsB,CAAAA,GAAU/B,CAAAA,CAASjB,CAAAA,CAAKyB,CAAK,CAAA,CAC7BwB,CAAAA,EAAQ,QAAQ,WAAA,CAAa,CAAE,OAAA,CAAAhC,CAAAA,CAAS,KAAA,CAAAQ,CAAM,CAAC,CAAA,CAC3CA,CAAAA,CAAQ,CAAA,EAAG,MAAMjB,CAAAA,CAAMiB,CAAK,EAChC,QACF,CAGA,GAAI,CACFe,CAAAA,GAAUxC,CAAG,EACf,CAAA,MAAS2D,CAAAA,CAAG,CACVV,CAAAA,EAAQ,KAAA,GAAQ,oBAAA,CAAsBX,CAAAA,CAAQqB,CAAC,CAAC,EAClD,CACA,GAAI,CACFjB,CAAAA,KACF,CAAA,MAASiB,CAAAA,CAAG,CACVV,CAAAA,EAAQ,KAAA,GAAQ,sBAAA,CAAwBX,EAAQqB,CAAC,CAAC,EACpD,CACA,IAAMC,CAAAA,CAAgB,IAAA,CAAK,GAAA,EAAI,CAAIR,CAAAA,CAC7BS,CAAAA,CAAU,CACd,aAAA,CAAe5C,CAAAA,CAAU,EACzB,YAAA,CAAcA,CAAAA,CACd,aAAA,CAAA2C,CAAAA,CACA,SAAA,CAAW5D,CACb,EACA,OAAAiD,CAAAA,EAAQ,KAAA,GAAQ,WAAA,CAAajD,CAAG,CAAA,CACzB,CAAE,EAAA,CAAI,KAAA,CAAO,IAAA,CAAM,IAAA,CAAM,KAAA,CAAOA,CAAAA,CAAK,OAAA,CAAA6D,CAAQ,CACtD,CAEJ,CCvLO,IAAMI,CAAAA,CACX,CAAA,EAC0B,EAAE,MAAA,GAAW,KAqBzC,eAAsBC,CAAAA,CACpBC,CAAAA,CACA7D,CAAAA,CAA+B,EAAC,CACG,CACnC,GAAM,CAAE,WAAA,CAAA8D,CAAAA,CAAc,IAAU,IAAA,CAAAC,CAAAA,CAAO,QAAA,CAAU,GAAGC,CAAW,CAAA,CAAIhE,EAGnE,GAFAD,CAAAA,CAAgBiE,CAAU,CAAA,CAEtBH,CAAAA,CAAM,MAAA,GAAW,EAAG,OAAO,EAAC,CAEhC,IAAMI,CAAAA,CAAQ,MAAA,CAAO,SAASH,CAAW,CAAA,CACrC,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,MAAMA,CAAW,CAAC,CAAA,CACnC,CAAA,CAAA,CAAA,CAEEI,CAAAA,CAAoC,IAAI,KAAA,CAAML,CAAAA,CAAM,MAAM,CAAA,CAE5DM,CAAAA,CAAY,CAAA,CACZC,CAAAA,CAAU,KAAA,CAERC,EAAY,CAACC,CAAAA,CAAW3E,CAAAA,GAAuB,CACnDuE,CAAAA,CAAQI,CAAC,EAAI3E,CAAAA,CAAE,EAAA,CACX,CAAE,MAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,KAAM,IAAA,CAAMA,CAAAA,CAAE,IAAA,CAAM,KAAA,CAAO,IAAK,CAAA,CACpD,CAAE,MAAA,CAAQ,OAAA,CAAS,EAAA,CAAI,KAAA,CAAO,IAAA,CAAM,IAAA,CAAM,MAAOA,CAAAA,CAAE,KAAM,EAC/D,CAAA,CAEM4E,CAAAA,CAAc,IAAM,CACxB,IAAA,IAASD,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIT,CAAAA,CAAM,MAAA,CAAQS,IAC5BJ,CAAAA,CAAQI,CAAC,CAAA,GACbJ,CAAAA,CAAQI,CAAC,CAAA,CAAI,CACX,MAAA,CAAQ,SAAA,CACR,EAAA,CAAI,KAAA,CACJ,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,IACT,CAAA,EAEJ,CAAA,CAGA,GAAIL,CAAAA,EAASJ,CAAAA,CAAM,MAAA,CAEjB,QADW,MAAM,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAM,GAAA,CAAKW,CAAAA,EAAM1C,EAAU0C,CAAAA,CAAGR,CAAU,CAAC,CAAC,CAAA,EACpE,OAAA,CAAQ,CAACrE,CAAAA,CAAG2E,CAAAA,GAAM,CACnBD,CAAAA,CAAUC,CAAAA,CAAG3E,CAAC,EAChB,CAAC,CAAA,CACMuE,CAAAA,CAGT,IAAMO,CAAAA,CAAS,SAAY,CACzB,OAAa,CACX,GAAIL,CAAAA,CAAS,OAEb,IAAME,EAAIH,CAAAA,EAAAA,CACV,GAAIG,CAAAA,EAAKT,CAAAA,CAAM,MAAA,CAAQ,OAEvB,IAAMa,CAAAA,CAAOb,CAAAA,CAAMS,CAAC,CAAA,CACpB,GAAI,CAACI,CAAAA,CAAM,SAEX,IAAM/E,CAAAA,CAAI,MAAMmC,CAAAA,CAAU4C,CAAAA,CAAMV,CAAU,EAG1C,GAFAK,CAAAA,CAAUC,CAAAA,CAAG3E,CAAC,CAAA,CAEV,CAACA,EAAE,EAAA,EACDoE,CAAAA,GAAS,WAAA,CAAa,CACxBK,CAAAA,CAAU,IAAA,CACV,MACF,CAEJ,CACF,CAAA,CAEA,OAAA,MAAM,OAAA,CAAQ,GAAA,CACZ,KAAA,CAAM,KAAK,CAAE,MAAA,CAAQ,IAAA,CAAK,GAAA,CAAIH,CAAAA,CAAOJ,CAAAA,CAAM,MAAM,CAAE,CAAA,CAAG,IAAMY,CAAAA,EAAQ,CACtE,EAEAF,CAAAA,EAAY,CACLL,CACT,CCtGA,eAAsBS,CAAAA,CACpBd,CAAAA,CACA7D,CAAAA,CAAsC,EAAC,CACzB,CACd,GAAM,CAAE,WAAA,CAAA8D,EAAc,CAAA,CAAA,CAAA,CAAU,GAAGE,CAAW,CAAA,CAAIhE,CAAAA,CAGlD,GAFAD,EAAgBiE,CAAU,CAAA,CAEtBH,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,OAAO,EAAC,CAEhC,IAAMI,CAAAA,CAAQ,MAAA,CAAO,QAAA,CAASH,CAAW,EACrC,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMA,CAAW,CAAC,CAAA,CACnC,CAAA,CAAA,CAAA,CAEEV,CAAAA,CAAY,IAAI,KAAA,CAAMS,CAAAA,CAAM,MAAM,CAAA,CAGxC,GAAII,CAAAA,EAASJ,CAAAA,CAAM,MAAA,CACjB,OAAA,MAAM,QAAQ,GAAA,CACZA,CAAAA,CAAM,GAAA,CAAI,MAAOW,CAAAA,CAAGF,CAAAA,GAAM,CACxB,IAAM3E,CAAAA,CAAI,MAAMmC,CAAAA,CAAU0C,CAAAA,CAAGR,CAAU,CAAA,CACvC,GAAI,CAACrE,CAAAA,CAAE,EAAA,CAAI,MAAMA,CAAAA,CAAE,KAAA,CACnByD,EAAKkB,CAAC,CAAA,CAAI3E,CAAAA,CAAE,KACd,CAAC,CACH,EACOyD,CAAAA,CAGT,IAAIe,CAAAA,CAAY,CAAA,CACZC,CAAAA,CAAU,KAAA,CACVQ,EAAuB,IAAA,CAErBH,CAAAA,CAAS,SAAY,CACzB,OAAa,CACX,GAAIL,CAAAA,CAAS,OAEb,IAAME,CAAAA,CAAIH,CAAAA,EAAAA,CACV,GAAIG,GAAKT,CAAAA,CAAM,MAAA,CAAQ,OAEvB,IAAMa,CAAAA,CAAOb,CAAAA,CAAMS,CAAC,CAAA,CACpB,GAAI,CAACI,CAAAA,CAAM,SAEX,IAAM/E,CAAAA,CAAI,MAAMmC,CAAAA,CAAU4C,CAAAA,CAAMV,CAAU,CAAA,CAE1C,GAAI,CAACrE,EAAE,EAAA,CAAI,CACTiF,CAAAA,GAAAA,CAAAA,CAAejF,CAAAA,CAAE,KAAA,CAAA,CACjByE,CAAAA,CAAU,KACV,MACF,CAEAhB,CAAAA,CAAKkB,CAAC,CAAA,CAAI3E,CAAAA,CAAE,KACd,CACF,CAAA,CAMA,GAJA,MAAM,OAAA,CAAQ,GAAA,CACZ,MAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,IAAA,CAAK,GAAA,CAAIsE,CAAAA,CAAOJ,EAAM,MAAM,CAAE,CAAA,CAAG,IAAMY,CAAAA,EAAQ,CACtE,CAAA,CAEIG,CAAAA,CAAY,MAAMA,CAAAA,CAGtB,OAAOxB,CACT,CCjFO,IAAMyB,CAAAA,CAAoCnF,CAAAA,EAC3CA,CAAAA,YAAe,YAAA,EAAgBA,CAAAA,CAAI,IAAA,GAAS,YAAA,CACvC,CAAE,IAAA,CAAM,SAAA,CAAW,OAAA,CAAS,mBAAA,CAAqB,KAAA,CAAOA,CAAI,CAAA,CAEjEA,CAAAA,YAAe,KAAA,EAASA,CAAAA,CAAI,IAAA,GAAS,YAAA,CAChC,CACL,IAAA,CAAM,SAAA,CACN,OAAA,CAASA,CAAAA,CAAI,OAAA,EAAW,mBAAA,CACxB,MAAOA,CACT,CAAA,CAEK,IAAA,CAGI8C,CAAAA,CAAsC9C,CAAAA,EAC7CA,CAAAA,YAAe,YAAA,EAAgBA,CAAAA,CAAI,IAAA,GAAS,cAAA,CACvC,CAAE,IAAA,CAAM,SAAA,CAAW,OAAA,CAAS,oBAAqB,KAAA,CAAOA,CAAI,CAAA,CAEjEA,CAAAA,YAAe,KAAA,EAASA,CAAAA,CAAI,OAAS,cAAA,CAChC,CACL,IAAA,CAAM,SAAA,CACN,OAAA,CAASA,CAAAA,CAAI,SAAW,mBAAA,CACxB,KAAA,CAAOA,CACT,CAAA,CAEK,IAAA,CAGIoF,CAAAA,CAAsCpF,CAAAA,EAAQ,CACzD,GAAI,OAAOA,CAAAA,EAAQ,QAAA,EAAYA,CAAAA,GAAQ,IAAA,CAAM,CAC3C,IAAMqF,CAAAA,CAAMrF,CAAAA,CACNsF,CAAAA,CAASD,CAAAA,CAAI,MAAA,EAAUA,EAAI,UAAA,CACjC,GAAI,OAAOC,CAAAA,EAAW,QAAA,CACpB,OAAO,CACL,IAAA,CAAM,MAAA,CACN,OAAA,CAAS,OAAOD,CAAAA,CAAI,OAAA,EAAY,SAAWA,CAAAA,CAAI,OAAA,CAAU,CAAA,WAAA,EAAcC,CAAM,CAAA,CAAA,CAC7E,MAAA,CAAAA,EACA,KAAA,CAAOtF,CACT,CAEJ,CACA,OAAO,IACT,EAEauF,CAAAA,CACXvF,CAAAA,EAEI,OAAO,cAAA,CAAmB,GAAA,EAAeA,CAAAA,YAAe,eACnD,CACL,IAAA,CAAM,SAAA,CACN,OAAA,CAASA,CAAAA,CAAI,OAAA,EAAW,0BAAA,CACxB,KAAA,CAAOA,CAAAA,CACP,IAAA,CAAM,CAAE,MAAA,CAAQA,CAAAA,CAAI,MAAoB,CAC1C,CAAA,CAEK,IAAA,CAGIwF,EAAAA,CAAqCxF,CAAAA,EAC5C,OAAOA,CAAAA,EAAQ,SACV,CAAE,IAAA,CAAM,SAAA,CAAW,OAAA,CAASA,CAAAA,CAAK,KAAA,CAAOA,CAAI,CAAA,CAE9C,IAAA,CAGIyF,EAAAA,CAAsCzF,CAAAA,EAE/C,OAAOA,CAAAA,EAAQ,UACfA,CAAAA,GAAQ,IAAA,EACR,SAAA,GAAaA,CAAAA,EACb,OAAQA,CAAAA,CAA6B,SAAY,QAAA,CAE1C,CAAE,IAAA,CAAM,SAAA,CAAW,OAAA,CAAUA,CAAAA,CAA4B,QAAS,KAAA,CAAOA,CAAI,CAAA,CAE/E,IAAA,CAGIF,EAAAA,CAAQ,CACnB,MAAAqF,CAAAA,CACA,OAAA,CAAArC,CAAAA,CACA,UAAA,CAAAsC,CAAAA,CACA,SAAA,CAAAG,CAAAA,CACA,MAAA,CAAAC,EAAAA,CACA,OAAA,CAAAC,EACF,ECpFA,IAAMC,CAAAA,CAAN,KAA0B,CACxB,WAAA,CAA6BC,CAAAA,CAAqC,CAArC,IAAA,CAAA,OAAA,CAAAA,EAAsC,CAEnE,OAAA,CAAoCC,CAAAA,CAAoC,CACtE,OAAQ5F,CAAAA,EACD,IAAA,CAAK,QAAQA,CAAG,CAAA,CACd4F,CAAAA,CAAO5F,CAAG,CAAA,CADc,IAGnC,CACF,CAAA,CAEa6F,EAAAA,CAAY,CACvB,QAAA,CAAoDC,CAAAA,CAAS,CAC3D,OAAO,IAAIJ,CAAAA,CACR1F,CAAAA,EAAgCA,CAAAA,YAAe8F,CAClD,CACF,EAEA,IAAA,CAAkBC,CAAAA,CAAuC,CACvD,OAAO,IAAIL,CAAAA,CAAoBK,CAAS,CAC1C,CACF,ECwBA,IAAMC,CAAAA,CACJ,CAAI3E,CAAAA,CAAoB4E,CAAAA,GACvBtC,CAAAA,EACCsC,CAAAA,CAAQA,CAAAA,CAAM5E,CAAAA,CAAOA,CAAAA,CAAKsC,CAAC,EAAIA,CAAC,CAAA,CAAItC,CAAAA,CAAOA,CAAAA,CAAKsC,CAAC,CAAA,CAAIA,EA4BlD,SAASuC,EAAAA,CACdC,CAAAA,CAAY,EAAC,CACR,CAGL,GAAM,CACJ,KAAA,CAAArG,CAAAA,CAAQ,EAAC,CACT,QAAA,CAAAC,CAAAA,CAAY4D,CAAAA,EAAexD,CAAAA,CAAgBwD,CAAC,CAAA,CAC5C,OAAA,CAASyC,CAAAA,CACT,WAAA,CAAAzD,EAAc,IAAA,CACd,QAAA,CAAU0D,CAAAA,CACV,cAAA,CAAgBC,CAClB,CAAA,CAAIH,EAEE7D,CAAAA,CACJ8D,CAAAA,GACCtG,CAAAA,CAAM,MAAA,CAAS,CAAA,CACZD,CAAAA,CAAoBC,EAA+BC,CAAQ,CAAA,CAC1DK,CAAAA,CAAAA,CAEHmG,CAAAA,CAAe,CAAA,CACfC,CAAAA,CAA2B,IAAA,CAC3BC,CAAAA,CAAmC,IAAA,CAEvC,OAAO,CACL,GAAA,CACEpE,CAAAA,CACA/B,CAAAA,CAA4B,EAAC,CACH,CAC1B,IAAMC,CAAAA,CAAKD,CAAAA,CAAQ,cAAA,EAAkBgG,EAC/BI,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAErB,GAAInG,CAAAA,CAAI,CACN,GAAIiG,CAAAA,EAAaE,CAAAA,CAAMF,CAAAA,CAAW,CAChC,IAAMxG,EAAMsC,CAAAA,CAAQ,IAAI,KAAA,CAAM,cAAc,CAAC,CAAA,CACvCa,EAAS6C,CAAAA,CACbK,CAAAA,CACA/F,CAAAA,CAAQ,QACV,CAAA,CAAEN,CAAG,EACL,OAAAM,CAAAA,CAAQ,OAAA,GAAU6C,CAAM,CAAA,CACxB7C,CAAAA,CAAQ,aAAY,CACb,OAAA,CAAQ,OAAA,CAAQ,CACrB,EAAA,CAAI,KAAA,CACJ,IAAA,CAAM,IAAA,CACN,KAAA,CAAO6C,CAAAA,CACP,OAAA,CAAS,CACP,aAAA,CAAe,CAAA,CACf,aAAc,CAAA,CACd,aAAA,CAAe,CAAA,CACf,SAAA,CAAWA,CACb,CACF,CAAC,CACH,CAMA,GALIqD,CAAAA,EAAaE,CAAAA,EAAOF,CAAAA,GACtBA,EAAY,IAAA,CACZD,CAAAA,CAAe,CAAA,CACfE,CAAAA,CAAoBlG,CAAAA,CAAG,gBAAA,EAAoB,CAAA,CAAA,CAEzCkG,CAAAA,EAAqB,IAAA,CACvB,GAAIA,CAAAA,EAAqB,CAAA,CAAG,CAC1B,IAAMzG,EAAMsC,CAAAA,CAAQ,IAAI,KAAA,CAAM,yBAAyB,CAAC,CAAA,CAClDa,EAAS6C,CAAAA,CACbK,CAAAA,CACA/F,CAAAA,CAAQ,QACV,CAAA,CAAEN,CAAG,EACL,OAAAM,CAAAA,CAAQ,OAAA,GAAU6C,CAAM,CAAA,CACxB7C,CAAAA,CAAQ,SAAA,IAAY,CACb,OAAA,CAAQ,OAAA,CAAQ,CACrB,EAAA,CAAI,KAAA,CACJ,IAAA,CAAM,KACN,KAAA,CAAO6C,CAAAA,CACP,OAAA,CAAS,CACP,aAAA,CAAe,CAAA,CACf,aAAc,CAAA,CACd,aAAA,CAAe,CAAA,CACf,SAAA,CAAWA,CACb,CACF,CAAC,CACH,CAAA,KACEsD,CAAAA,GAGN,CAEA,OAAOrE,CAAAA,CAAQC,EAAI,CACjB,OAAA,CAAAC,CAAAA,CACA,WAAA,CAAAK,CAAAA,CACA,GAAGrC,EACH,QAAA,CAAU0F,CAAAA,CAAgBK,CAAAA,CAAiB/F,CAAAA,CAAQ,QAAQ,CAC7D,CAAC,CAAA,CAAE,IAAA,CAAML,CAAAA,GACFM,CAAAA,GACAN,CAAAA,CAAE,EAAA,EAOLsG,EAAe,CAAA,CACfC,CAAAA,CAAY,IAAA,CACZC,CAAAA,CAAoB,IAAA,GARpBF,CAAAA,EAAAA,CACIA,CAAAA,EAAgBhG,CAAAA,CAAG,gBAAA,GACrBiG,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAAIjG,CAAAA,CAAG,aAC5BkG,CAAAA,CAAoB,IAAA,CAAA,CAAA,CAAA,CAOjBxG,CAAAA,CACR,CACH,CAAA,CACA,UAAA,CACE0G,EACArG,CAAAA,CAA+B,EAAC,CACG,CACnC,OAAO4D,CAAAA,CAAkByC,EAAK,CAC5B,OAAA,CAAArE,CAAAA,CACA,WAAA,CAAAK,CAAAA,CACA,GAAGrC,CAAAA,CACH,QAAA,CAAU0F,CAAAA,CAAgBK,CAAAA,CAAiB/F,CAAAA,CAAQ,QAAQ,CAC7D,CAAC,CACH,CAAA,CACA,GAAA,CACEqG,CAAAA,CACArG,CAAAA,CAA4B,EAAC,CACf,CACd,OAAO2E,CAAAA,CAAW0B,CAAAA,CAAK,CACrB,OAAA,CAAArE,CAAAA,CACA,YAAAK,CAAAA,CACA,GAAGrC,CAAAA,CACH,QAAA,CAAU0F,CAAAA,CAAgBK,CAAAA,CAAiB/F,CAAAA,CAAQ,QAAQ,CAC7D,CAAC,CACH,CACF,CACF","file":"index.cjs","sourcesContent":["import type { AppError, Rule } from \"./types\";\n\nexport function createNormalizer<E extends AppError>(\n rules: Rule<E>[],\n fallback: (err: unknown) => E\n) {\n return (err: unknown): E => {\n for (const r of rules) {\n const out = r(err);\n if (out) return out;\n }\n return fallback(err);\n };\n}\n\n// General fallback (without depending on fetch / http)\nexport function defaultFallback(err: unknown): AppError {\n if (err instanceof Error) {\n // In browsers, network errors sometimes fall as TypeError (fetch),\n // but this is not 100% universal; we treat it as best-effort.\n const code = err.name === \"TypeError\" ? \"NETWORK\" : \"UNKNOWN\";\n return { code, message: err.message || \"Something went wrong\", cause: err };\n }\n return { code: \"UNKNOWN\", message: \"Something went wrong\", cause: err };\n}\n\n// \"default\" normalizer that includes abort rule (very useful in UI)\nexport function toAppError(err: unknown): AppError {\n // AbortError (browser / fetch / AbortController)\n if (err instanceof DOMException && err.name === \"AbortError\") {\n return { code: \"ABORTED\", message: \"Request cancelled\", cause: err };\n }\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n return { code: \"TIMEOUT\", message: \"Request timed out\", cause: err };\n }\n return defaultFallback(err);\n}\n","import type { AppError } from \"./error/types\";\n\nexport type RetryDelayFn<E> = (attempt: number, err: E) => number;\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport type Jitter =\n | boolean\n | number // ratio 0..1\n | { ratio?: number; mode?: \"full\" | \"equal\"; rng?: () => number };\n\n/**\n * Backoff strategy to calculate the delay between retries.\n * - \"linear\": uses the base delay as is in each attempt.\n * - \"exponential\": multiplies the delay by 2^(attempt-1).\n * - \"fibonacci\": multiplies by F(attempt) (classic Fibonacci sequence).\n * - function: custom function based on the attempt number.\n */\nexport type BackoffStrategy =\n | \"linear\"\n | \"exponential\"\n | \"fibonacci\"\n | ((attempt: number) => number);\n\n/**\n * Retry options for `run`, `runAll` and `runAllOrThrow`.\n */\nexport type RetryOptions<E extends AppError = AppError> = {\n /**\n * Number of retries to perform (does not include the initial attempt).\n * @default 0\n */\n retries?: number;\n /**\n * Delay between attempts:\n * - number: fixed delay (ms)\n * - () => number: lazy delay (evaluated per attempt)\n * - (attempt, err) => number: delay based on attempt and last error\n * @default 0 or a default baseDelay if retries are present\n */\n retryDelay?: number | (() => number) | RetryDelayFn<E>;\n /**\n * Decides whether to retry given a specific error.\n * Can be synchronous or asynchronous.\n * Receives the next attempt number and a context with accumulated metrics.\n * @default () => true\n */\n shouldRetry?: (\n attempt: number,\n error: E,\n context: RetryContext\n ) => boolean | Promise<boolean>;\n /**\n * Random jitter to avoid thundering herd:\n * - true: default ratio 0.5\n * - false: no jitter\n * - number: ratio 0..1\n * - object: full control (ratio, mode, rng)\n * @default 0.5\n */\n jitter?: Jitter;\n /**\n * Backoff strategy to apply on the calculated delay.\n * @default \"linear\"\n */\n backoffStrategy?: BackoffStrategy;\n /**\n * Upper limit of the delay after backoff and before jitter.\n * @default undefined (no limit)\n */\n maxDelay?: number;\n};\n\n/**\n * Context for `shouldRetry` with accumulated metrics of the current attempt.\n */\nexport type RetryContext = {\n /** Total attempts (including the next retry). */\n totalAttempts: number;\n /** Elapsed time in ms since the start of `run`. */\n elapsedTime: number;\n};\n\n/**\n * Main options for `run` and extended to `runAll`/`runAllOrThrow`.\n */\nexport type RunOptions<T, E extends AppError = AppError> = RetryOptions<E> & {\n /**\n * Normalizes an unknown error value to your type `E`.\n * If not provided, a default normalizer is used.\n */\n toError?: (err: unknown) => E;\n /**\n * Optional transformation applied after `toError`.\n * Useful for adjusting messages, codes, or adding metadata.\n */\n mapError?: (error: E) => E;\n /**\n * Callback on failure (not called if `ignoreAbort` and error is ABORTED).\n */\n onError?: (error: E) => void;\n /**\n * Callback on success.\n */\n onSuccess?: (data: T) => void;\n /**\n * Callback that always executes at the end (success or error).\n */\n onFinally?: () => void;\n /**\n * If true, aborts (ABORTED) are not considered fatal errors:\n * `onError` is not called and `{ ok: false, error }` is returned.\n * @default true\n */\n ignoreAbort?: boolean;\n /**\n * Signal for native work cancellation.\n * If aborted, it cuts with `AbortError`.\n */\n signal?: AbortSignal;\n /**\n * Maximum timeout in ms for the work; expires with `TimeoutError`.\n */\n timeout?: number;\n /**\n * Retry observability: receives attempt, error, and next delay.\n */\n onRetry?: (attempt: number, error: E, nextDelay: number) => void;\n /**\n * Optional structured logger for debug and errors.\n */\n logger?: {\n debug?: (msg: string, meta?: any) => void;\n error?: (msg: string, error: E) => void;\n };\n /**\n * Callback on abort, useful for reacting to `AbortSignal`.\n */\n onAbort?: (signal: AbortSignal) => void;\n /**\n * Per-call circuit breaker configuration.\n * If not defined, can use the default value from `Runner`.\n */\n circuitBreaker?: CircuitBreakerOptions;\n};\n\n/**\n * Circuit breaker configuration options:\n * - failureThreshold: number of consecutive failures to open the circuit\n * - resetTimeout: time in ms it remains open before attempting half-open\n * - halfOpenRequests: allowed quantity in half-open state\n */\nexport type CircuitBreakerOptions = {\n failureThreshold: number;\n resetTimeout: number;\n halfOpenRequests?: number;\n};\n\n/**\n * Execution metrics optionally returned in `RunResult`.\n */\nexport type Metrics = {\n totalAttempts: number;\n totalRetries: number;\n totalDuration: number;\n lastError?: AppError;\n};\n\nexport type RunResult<T, E extends AppError = AppError> =\n | { ok: true; data: T; error: null; metrics?: Metrics }\n | { ok: false; data: null; error: E; metrics?: Metrics };\n\n/**\n * Validates common execution/retry options.\n */\nexport function validateOptions<T, E extends AppError = AppError>(\n options: RunOptions<T, E>\n): void {\n if (options.retries != null && options.retries < 0) {\n throw new Error(\"retries must be >= 0\");\n }\n if (options.timeout != null && options.timeout <= 0) {\n throw new Error(\"timeout must be > 0\");\n }\n if (options.maxDelay != null && options.maxDelay < 0) {\n throw new Error(\"maxDelay must be >= 0\");\n }\n const cb = options.circuitBreaker;\n if (cb) {\n if (cb.failureThreshold < 1) {\n throw new Error(\"failureThreshold must be >= 1\");\n }\n if (cb.resetTimeout <= 0) {\n throw new Error(\"resetTimeout must be > 0\");\n }\n if (cb.halfOpenRequests != null && cb.halfOpenRequests < 1) {\n throw new Error(\"halfOpenRequests must be >= 1\");\n }\n }\n}\n","import type { Jitter, RetryDelayFn, BackoffStrategy } from \"./types\";\n\nexport const sleep = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function clamp(n: number, min: number, max: number) {\n return Math.max(min, Math.min(max, n));\n}\n\nexport function resolveRetryDelay<E>(\n retryDelay: number | RetryDelayFn<E> | undefined,\n attempt: number,\n err: E,\n defaultBaseDelay: number,\n backoffStrategy?: BackoffStrategy,\n maxDelay?: number\n): number {\n let base =\n typeof retryDelay === \"function\"\n ? (retryDelay as RetryDelayFn<E>)(attempt, err)\n : typeof retryDelay === \"number\"\n ? (retryDelay as number)\n : typeof retryDelay === \"undefined\"\n ? defaultBaseDelay\n : defaultBaseDelay;\n\n const backoff = computeBackoffDelay(\n backoffStrategy ?? \"linear\",\n base,\n attempt\n );\n\n const out = maxDelay != null ? clamp(backoff, 0, maxDelay) : backoff;\n return Number.isFinite(out) ? out : 0;\n}\n\nexport function applyJitter(delay: number, jitter: Jitter | undefined): number {\n if (delay <= 0 || !jitter) return delay;\n\n const rng =\n typeof jitter === \"object\" && jitter.rng ? jitter.rng : Math.random;\n\n // reasonable defaults\n const ratio =\n typeof jitter === \"number\"\n ? jitter\n : jitter === true\n ? 0.5\n : typeof jitter === \"object\" && jitter.ratio != null\n ? jitter.ratio\n : 0.5;\n\n const r = clamp(ratio, 0, 1);\n\n const mode = typeof jitter === \"object\" && jitter.mode ? jitter.mode : \"full\";\n\n // \"full\": 0..delay*r extra (recommended to avoid thundering herd)\n // \"equal\": delay*(1-r) + random(0..delay*r)\n if (mode === \"equal\") {\n return delay * (1 - r) + rng() * delay * r;\n }\n\n // full jitter: add random extra up to delay*r\n return delay + rng() * delay * r;\n}\n\nexport function computeBackoffDelay(\n strategy: BackoffStrategy,\n base: number,\n attempt: number\n): number {\n if (typeof strategy === \"function\") {\n const v = strategy(attempt);\n return v >= 0 ? v : 0;\n }\n const b = base >= 0 ? base : 0;\n const a = attempt >= 1 ? attempt : 1;\n if (strategy === \"linear\") return b;\n if (strategy === \"exponential\") return b * Math.pow(2, a - 1);\n if (strategy === \"fibonacci\") {\n if (a <= 2) return b;\n let prev = 1;\n let curr = 1;\n for (let i = 3; i <= a; i++) {\n const next = prev + curr;\n prev = curr;\n curr = next;\n }\n return b * curr;\n }\n return b;\n}\n","import type { AppError } from \"../error/types\";\nimport { toAppError as defaultToAppError } from \"../error/normalize\";\nimport type { MaybePromise, RunOptions, RunResult } from \"../types\";\nimport { validateOptions } from \"../types\";\nimport { applyJitter, resolveRetryDelay, sleep } from \"../utils\";\n\n/**\n * Executes an async operation and returns a Result instead of throwing.\n *\n * Errors are normalized into an `AppError` (or a custom error type `E`)\n * using the provided `toError` function.\n *\n * This utility is framework-agnostic and works in browsers, Node.js,\n * React effects, and any async context.\n */\nexport async function run<T, E extends AppError = AppError>(\n fn: () => MaybePromise<T>,\n options: RunOptions<T, E> = {}\n): Promise<RunResult<T, E>> {\n const {\n toError = defaultToAppError as unknown as (err: unknown) => E,\n mapError,\n onError,\n onSuccess,\n onFinally,\n ignoreAbort = true,\n retries = 0,\n retryDelay,\n shouldRetry = () => true,\n jitter = { ratio: 0.5, mode: \"full\" },\n backoffStrategy,\n maxDelay,\n timeout,\n signal,\n onRetry,\n logger,\n onAbort,\n } = options;\n\n const defaultBaseDelay = retries > 0 ? 300 : 0;\n\n validateOptions(options);\n\n if (signal?.aborted) {\n try {\n onAbort?.(signal);\n } finally {\n const err = toError(new DOMException(\"Aborted\", \"AbortError\"));\n const mapped = mapError ? mapError(err) : err;\n if (!ignoreAbort) {\n onError?.(mapped);\n }\n onFinally?.();\n return {\n ok: false,\n data: null,\n error: mapped,\n metrics: {\n totalAttempts: 0,\n totalRetries: 0,\n totalDuration: 0,\n lastError: mapped,\n },\n };\n }\n }\n\n const startedAt = Date.now();\n let attempt = 0;\n let lastError: E | undefined;\n\n while (true) {\n try {\n let timeoutId: any = null;\n const timeoutPromise =\n timeout && timeout > 0\n ? new Promise<never>((_, reject) => {\n timeoutId = setTimeout(\n () => reject(new DOMException(\"Timeout\", \"TimeoutError\")),\n timeout\n );\n })\n : null;\n\n const data = await (timeoutPromise\n ? Promise.race([fn(), timeoutPromise])\n : fn());\n if (timeoutId) clearTimeout(timeoutId);\n try {\n onSuccess?.(data);\n } catch (e) {\n logger?.error?.(\"run:onSuccess failed\", toError(e));\n }\n try {\n onFinally?.();\n } catch (e) {\n logger?.error?.(\"run:onFinally failed\", toError(e));\n }\n const totalDuration = Date.now() - startedAt;\n const metrics = {\n totalAttempts: attempt + 1,\n totalRetries: attempt,\n totalDuration,\n lastError,\n };\n logger?.debug?.(\"run:success\", {\n attempts: metrics.totalAttempts,\n duration: metrics.totalDuration,\n });\n return { ok: true, data, error: null, metrics };\n } catch (e) {\n let err = toError(e);\n if (mapError) err = mapError(err);\n\n const isAborted =\n (err as any)?.code === \"ABORTED\" ||\n (e instanceof DOMException && e.name === \"AbortError\") ||\n signal?.aborted;\n\n if (isAborted) {\n try {\n if (signal) {\n try {\n onAbort?.(signal);\n } catch (e) {\n logger?.error?.(\"run:onAbort failed\", toError(e));\n }\n }\n } finally {\n if (!ignoreAbort) {\n try {\n onError?.(err);\n } catch (e) {\n logger?.error?.(\"run:onError failed\", toError(e));\n }\n }\n try {\n onFinally?.();\n } catch (e) {\n logger?.error?.(\"run:onFinally failed\", toError(e));\n }\n const totalDuration = Date.now() - startedAt;\n const metrics = {\n totalAttempts: attempt,\n totalRetries: attempt,\n totalDuration,\n lastError: err,\n };\n logger?.debug?.(\"run:aborted\", {\n attempt,\n duration: metrics.totalDuration,\n });\n return { ok: false, data: null, error: err, metrics };\n }\n }\n\n lastError = err;\n const nextAttempt = attempt + 1;\n const context = {\n totalAttempts: nextAttempt,\n elapsedTime: Date.now() - startedAt,\n };\n const decision = await Promise.resolve(\n shouldRetry(nextAttempt, err, context)\n );\n const canRetry = attempt < retries && decision;\n\n if (canRetry) {\n attempt = nextAttempt;\n\n let delay = resolveRetryDelay(\n retryDelay,\n attempt,\n err,\n defaultBaseDelay,\n backoffStrategy,\n maxDelay\n );\n\n if (!Number.isFinite(delay) || delay < 0) delay = 0;\n\n delay = applyJitter(delay, jitter);\n\n onRetry?.(attempt, err, delay);\n logger?.debug?.(\"run:retry\", { attempt, delay });\n if (delay > 0) await sleep(delay);\n continue;\n }\n\n // Final failure or aborted\n try {\n onError?.(err);\n } catch (e) {\n logger?.error?.(\"run:onError failed\", toError(e));\n }\n try {\n onFinally?.();\n } catch (e) {\n logger?.error?.(\"run:onFinally failed\", toError(e));\n }\n const totalDuration = Date.now() - startedAt;\n const metrics = {\n totalAttempts: attempt + 1,\n totalRetries: attempt,\n totalDuration,\n lastError: err,\n };\n logger?.error?.(\"run:error\", err);\n return { ok: false, data: null, error: err, metrics };\n }\n }\n}\n","import { run } from \"./run\";\nimport type { AppError } from \"../error/types\";\nimport type { MaybePromise, RunOptions, RunResult } from \"../types\";\nimport { validateOptions } from \"../types\";\n\n/**\n * Discriminated result per item in `runAllSettled`:\n * - \"ok\": successful task with `data`\n * - \"error\": failed task with `error`\n * - \"skipped\": task not executed due to cancellation/fail-fast/concurrency\n */\nexport type RunAllItemResult<T, E extends AppError = AppError> =\n | { status: \"ok\"; ok: true; data: T; error: null }\n | { status: \"error\"; ok: false; data: null; error: E }\n | { status: \"skipped\"; ok: false; data: null; error: null };\n\n/** Helper to discriminate successful results. */\nexport type SuccessResult<T> = Extract<\n RunAllItemResult<T, any>,\n { status: \"ok\" }\n>;\n/** Helper to discriminate error results. */\nexport type ErrorResult<E> = Extract<\n RunAllItemResult<any, E extends AppError ? E : AppError>,\n { status: \"error\" }\n>;\n\n/** Type guard that detects `status: \"ok\"` with `data` typing. */\nexport const isSuccess = <T, E extends AppError = AppError>(\n r: RunAllItemResult<T, E>\n): r is SuccessResult<T> => r.status === \"ok\";\n\nexport type RunAllOptions<T, E extends AppError = AppError> = RunOptions<\n T,\n E\n> & {\n /**\n * Maximum number of concurrent tasks to run.\n * @default Infinity\n */\n concurrency?: number;\n\n /**\n * Execution mode regarding errors.\n * - \"settle\": Run all tasks (default).\n * - \"fail-fast\": Stop starting new tasks if one fails.\n * @default \"settle\"\n */\n mode?: \"settle\" | \"fail-fast\";\n};\n\nexport async function runAllSettled<T, E extends AppError = AppError>(\n tasks: Array<() => MaybePromise<T>>,\n options: RunAllOptions<T, E> = {}\n): Promise<RunAllItemResult<T, E>[]> {\n const { concurrency = Infinity, mode = \"settle\", ...runOptions } = options;\n validateOptions(runOptions);\n\n if (tasks.length === 0) return [];\n\n const limit = Number.isFinite(concurrency)\n ? Math.max(1, Math.floor(concurrency))\n : Infinity;\n\n const results: RunAllItemResult<T, E>[] = new Array(tasks.length);\n\n let nextIndex = 0;\n let aborted = false;\n\n const setResult = (i: number, r: RunResult<T, E>) => {\n results[i] = r.ok\n ? { status: \"ok\", ok: true, data: r.data, error: null }\n : { status: \"error\", ok: false, data: null, error: r.error };\n };\n\n const markSkipped = () => {\n for (let i = 0; i < tasks.length; i++) {\n if (results[i]) continue;\n results[i] = {\n status: \"skipped\",\n ok: false,\n data: null,\n error: null,\n };\n }\n };\n\n // Run all in parallel if unlimited or limit >= count\n if (limit >= tasks.length) {\n const rs = await Promise.all(tasks.map((t) => run<T, E>(t, runOptions)));\n rs.forEach((r, i) => {\n setResult(i, r);\n });\n return results;\n }\n\n const worker = async () => {\n while (true) {\n if (aborted) return;\n\n const i = nextIndex++;\n if (i >= tasks.length) return;\n\n const task = tasks[i];\n if (!task) continue; // skip if task is undefined\n\n const r = await run<T, E>(task, runOptions);\n setResult(i, r);\n\n if (!r.ok) {\n if (mode === \"fail-fast\") {\n aborted = true;\n return;\n }\n }\n }\n };\n\n await Promise.all(\n Array.from({ length: Math.min(limit, tasks.length) }, () => worker())\n );\n\n markSkipped();\n return results;\n}\n","import { run } from \"./run\";\nimport type { AppError } from \"../error/types\";\nimport type { RunOptions } from \"../types\";\nimport { validateOptions } from \"../types\";\nimport type { MaybePromise } from \"bun\";\n\n/**\n * Options for `runAll`:\n * - Inherits all options from `RunOptions`\n * - `concurrency`: limit of simultaneous tasks; if one fails, it throws\n */\nexport type RunAllOrThrowOptions<T, E extends AppError = AppError> = RunOptions<\n T,\n E\n> & {\n /**\n * Maximum number of concurrent tasks to run.\n * @default Infinity\n */\n concurrency?: number;\n};\n\nexport async function runAll<T, E extends AppError = AppError>(\n tasks: Array<() => MaybePromise<T>>,\n options: RunAllOrThrowOptions<T, E> = {}\n): Promise<T[]> {\n const { concurrency = Infinity, ...runOptions } = options;\n validateOptions(runOptions);\n\n if (tasks.length === 0) return [];\n\n const limit = Number.isFinite(concurrency)\n ? Math.max(1, Math.floor(concurrency))\n : Infinity;\n\n const data: T[] = new Array(tasks.length);\n\n // Run all in parallel if unlimited or limit >= count\n if (limit >= tasks.length) {\n await Promise.all(\n tasks.map(async (t, i) => {\n const r = await run<T, E>(t, runOptions);\n if (!r.ok) throw r.error;\n data[i] = r.data;\n })\n );\n return data;\n }\n\n let nextIndex = 0;\n let aborted = false;\n let firstError: E | null = null;\n\n const worker = async () => {\n while (true) {\n if (aborted) return;\n\n const i = nextIndex++;\n if (i >= tasks.length) return;\n\n const task = tasks[i];\n if (!task) continue; // skip if task is undefined\n\n const r = await run<T, E>(task, runOptions);\n\n if (!r.ok) {\n firstError ??= r.error;\n aborted = true;\n return;\n }\n\n data[i] = r.data;\n }\n };\n\n await Promise.all(\n Array.from({ length: Math.min(limit, tasks.length) }, () => worker())\n );\n\n if (firstError) throw firstError;\n\n // Safety fill\n return data;\n}\n","import type { AppError, Rule } from \"./types\";\n\nexport const abort: Rule<AppError<\"ABORTED\">> = (err) => {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n return { code: \"ABORTED\", message: \"Request cancelled\", cause: err };\n }\n if (err instanceof Error && err.name === \"AbortError\") {\n return {\n code: \"ABORTED\",\n message: err.message || \"Request cancelled\",\n cause: err,\n };\n }\n return null;\n};\n\nexport const timeout: Rule<AppError<\"TIMEOUT\">> = (err) => {\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n return { code: \"TIMEOUT\", message: \"Request timed out\", cause: err };\n }\n if (err instanceof Error && err.name === \"TimeoutError\") {\n return {\n code: \"TIMEOUT\",\n message: err.message || \"Request timed out\",\n cause: err,\n };\n }\n return null;\n};\n\nexport const httpStatus: Rule<AppError<\"HTTP\">> = (err) => {\n if (typeof err === \"object\" && err !== null) {\n const obj = err as Record<string, unknown>;\n const status = obj.status ?? obj.statusCode;\n if (typeof status === \"number\") {\n return {\n code: \"HTTP\",\n message: typeof obj.message === \"string\" ? obj.message : `HTTP Error ${status}`,\n status,\n cause: err,\n };\n }\n }\n return null;\n};\n\nexport const aggregate: Rule<AppError<\"UNKNOWN\", { errors: unknown[] }>> = (\n err\n) => {\n if (typeof AggregateError !== \"undefined\" && err instanceof AggregateError) {\n return {\n code: \"UNKNOWN\",\n message: err.message || \"Multiple errors occurred\",\n cause: err,\n meta: { errors: err.errors as unknown[] },\n };\n }\n return null;\n};\n\nexport const string: Rule<AppError<\"UNKNOWN\">> = (err) => {\n if (typeof err === \"string\") {\n return { code: \"UNKNOWN\", message: err, cause: err };\n }\n return null;\n};\n\nexport const message: Rule<AppError<\"UNKNOWN\">> = (err) => {\n if (\n typeof err === \"object\" &&\n err !== null &&\n \"message\" in err &&\n typeof (err as { message: unknown }).message === \"string\"\n ) {\n return { code: \"UNKNOWN\", message: (err as { message: string }).message, cause: err };\n }\n return null;\n};\n\nexport const rules = {\n abort,\n timeout,\n httpStatus,\n aggregate,\n string,\n message,\n} satisfies Record<string, Rule<AppError>>;\n","import type { AppError, Rule } from \"./types\";\n\nclass ErrorRuleBuilder<E> {\n constructor(private readonly matcher: (err: unknown) => err is E) {}\n\n toError<const Out extends AppError>(mapper: (err: E) => Out): Rule<Out> {\n return (err: unknown) => {\n if (!this.matcher(err)) return null;\n return mapper(err);\n };\n }\n}\n\nexport const errorRule = {\n instance<E extends new (...args: any[]) => unknown>(ctor: E) {\n return new ErrorRuleBuilder<InstanceType<E>>(\n (err): err is InstanceType<E> => err instanceof ctor\n );\n },\n\n when<E = unknown>(predicate: (err: unknown) => err is E) {\n return new ErrorRuleBuilder<E>(predicate);\n },\n};\n","import type { AppError, Rule, InferErrorFromRules } from \"../error/types\";\nimport {\n createNormalizer,\n defaultFallback,\n toAppError,\n} from \"../error/normalize\";\nimport { run as baseRun } from \"./run\";\nimport type { MaybePromise, RunOptions, RunResult } from \"../types\";\nimport type { CircuitBreakerOptions } from \"../types\";\nimport { runAll as baseRunAll } from \"./runAll\";\nimport {\n runAllSettled as baseRunAllSettled,\n type RunAllItemResult,\n type RunAllOptions,\n} from \"./runAllSettled\";\n\nexport type CreateRunnerOptions<E extends AppError = AppError> = {\n /**\n * Custom matchers to use for normalizing errors.\n * If not provided, the default matchers are used.\n */\n rules?: Rule<E>[];\n\n /**\n * Custom fallback function to use for normalizing errors.\n * If not provided, the default fallback is used.\n */\n fallback?: (err: unknown) => E;\n\n /**\n * If you want a completely custom normalizer, you can provide it directly.\n * If set, `matchers` and `fallback` are ignored.\n */\n toError?: (err: unknown) => E;\n\n /** Default for run options */\n ignoreAbort?: boolean;\n\n /** Optional default mapper for all runs */\n mapError?: (error: E) => E;\n /**\n * Default circuit breaker for all executions of the instance.\n * Can be overridden by `options.circuitBreaker` in each `run`.\n */\n circuitBreaker?: CircuitBreakerOptions;\n};\n\nconst composeMapError =\n <E>(base?: (e: E) => E, local?: (e: E) => E) =>\n (e: E) =>\n local ? local(base ? base(e) : e) : base ? base(e) : e;\n\nexport interface Runner<E extends AppError> {\n run<T>(\n fn: () => Promise<T>,\n options?: RunOptions<T, E>\n ): Promise<RunResult<T, E>>;\n all<T>(\n fns: Array<() => MaybePromise<T>>,\n options?: RunAllOptions<T, E>\n ): Promise<RunAllItemResult<T, E>[]>;\n allOrThrow<T>(\n fns: Array<() => MaybePromise<T>>,\n options?: RunOptions<T, E>\n ): Promise<T[]>;\n}\n\nexport function createRunner(\n opts?: Omit<CreateRunnerOptions<AppError>, \"rules\">\n): Runner<AppError>;\n\nexport function createRunner<const TRules extends readonly Rule<any>[]>(\n opts: { rules: TRules } & Omit<\n CreateRunnerOptions<InferErrorFromRules<TRules>>,\n \"rules\"\n >\n): Runner<InferErrorFromRules<TRules>>;\n\nexport function createRunner<const TRules extends readonly Rule<any>[] = []>(\n opts: any = {}\n): any {\n type E = InferErrorFromRules<TRules>;\n\n const {\n rules = [],\n fallback = (e: unknown) => defaultFallback(e) as unknown as E,\n toError: customToError,\n ignoreAbort = true,\n mapError: defaultMapError,\n circuitBreaker: defaultCircuitBreaker,\n } = opts as CreateRunnerOptions<E>;\n\n const toError =\n customToError ??\n (rules.length > 0\n ? createNormalizer<E>(rules as unknown as Rule<E>[], fallback)\n : (toAppError as unknown as (e: unknown) => E));\n\n let failureCount = 0;\n let openUntil: number | null = null;\n let halfOpenRemaining: number | null = null;\n\n return {\n run<T>(\n fn: () => Promise<T>,\n options: RunOptions<T, E> = {}\n ): Promise<RunResult<T, E>> {\n const cb = options.circuitBreaker ?? defaultCircuitBreaker;\n const now = Date.now();\n\n if (cb) {\n if (openUntil && now < openUntil) {\n const err = toError(new Error(\"Circuit open\"));\n const mapped = composeMapError(\n defaultMapError,\n options.mapError\n )(err);\n options.onError?.(mapped);\n options.onFinally?.();\n return Promise.resolve({\n ok: false,\n data: null,\n error: mapped,\n metrics: {\n totalAttempts: 0,\n totalRetries: 0,\n totalDuration: 0,\n lastError: mapped,\n },\n });\n }\n if (openUntil && now >= openUntil) {\n openUntil = null;\n failureCount = 0;\n halfOpenRemaining = cb.halfOpenRequests ?? 1;\n }\n if (halfOpenRemaining != null) {\n if (halfOpenRemaining <= 0) {\n const err = toError(new Error(\"Circuit half-open limit\"));\n const mapped = composeMapError(\n defaultMapError,\n options.mapError\n )(err);\n options.onError?.(mapped);\n options.onFinally?.();\n return Promise.resolve({\n ok: false,\n data: null,\n error: mapped,\n metrics: {\n totalAttempts: 0,\n totalRetries: 0,\n totalDuration: 0,\n lastError: mapped,\n },\n });\n } else {\n halfOpenRemaining--;\n }\n }\n }\n\n return baseRun(fn, {\n toError,\n ignoreAbort,\n ...options,\n mapError: composeMapError(defaultMapError, options.mapError),\n }).then((r) => {\n if (!cb) return r;\n if (!r.ok) {\n failureCount++;\n if (failureCount >= cb.failureThreshold) {\n openUntil = Date.now() + cb.resetTimeout;\n halfOpenRemaining = null;\n }\n } else {\n failureCount = 0;\n openUntil = null;\n halfOpenRemaining = null;\n }\n return r;\n });\n },\n allSettled<T>(\n fns: Array<() => Promise<T>>,\n options: RunAllOptions<T, E> = {}\n ): Promise<RunAllItemResult<T, E>[]> {\n return baseRunAllSettled(fns, {\n toError,\n ignoreAbort,\n ...options,\n mapError: composeMapError(defaultMapError, options.mapError),\n });\n },\n all<T>(\n fns: (() => Promise<T>)[],\n options: RunOptions<T, E> = {}\n ): Promise<T[]> {\n return baseRunAll(fns, {\n toError,\n ignoreAbort,\n ...options,\n mapError: composeMapError(defaultMapError, options.mapError),\n });\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/error/normalize.ts","../src/types.ts","../src/utils.ts","../src/runner/run.ts","../src/runner/runAllSettled.ts","../src/runner/runAll.ts","../src/error/core.ts","../src/error/builder.ts","../src/runner/runner.ts","../src/index.ts"],"names":["createNormalizer","rules","fallback","err","r","out","defaultFallback","toResultError","validateOptions","options","cb","sleep","ms","resolve","clamp","n","min","max","resolveRetryDelay","retryDelay","attempt","defaultBaseDelay","backoffStrategy","maxDelay","base","backoff","computeBackoffDelay","applyJitter","delay","jitter","rng","ratio","strategy","v","b","a","prev","curr","i","next","run","fn","toError","mapError","onError","onSuccess","onFinally","ignoreAbort","retries","shouldRetry","timeout","signal","onRetry","logger","onAbort","mapped","startedAt","lastError","timeoutId","timeoutPromise","_","reject","data","e","totalDuration","metrics","nextAttempt","context","decision","isSuccess","runAllSettled","tasks","concurrency","mode","runOptions","limit","results","nextIndex","aborted","setResult","markSkipped","t","worker","task","runAll","firstError","abort","httpStatus","obj","status","aggregate","string","message","ErrorRuleBuilder","matcher","mapper","errorRule","ctor","predicate","composeMapError","local","createRunner","opts","rulesMode","customToError","defaultMapError","defaultCircuitBreaker","effectiveRules","defaultRulesList","failureCount","openUntil","halfOpenRemaining","now","fns","trybox"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ResultError, Rule } from \"./types\";\n\nexport function createNormalizer<E extends ResultError>(\n rules: Rule<E>[],\n fallback: (err: unknown) => E\n) {\n return (err: unknown): E => {\n for (const r of rules) {\n const out = r(err);\n if (out) return out;\n }\n return fallback(err);\n };\n}\n\n// General fallback (without depending on fetch / http)\nexport function defaultFallback(err: unknown): ResultError {\n if (err instanceof Error) {\n // In browsers, network errors sometimes fall as TypeError (fetch),\n // but this is not 100% universal; we treat it as best-effort.\n const code = err.name === \"TypeError\" ? \"NETWORK\" : \"UNKNOWN\";\n return { code, message: err.message || \"Something went wrong\", cause: err };\n }\n return { code: \"UNKNOWN\", message: \"Something went wrong\", cause: err };\n}\n\n// \"default\" normalizer that includes abort rule (very useful in UI)\nexport function toResultError(err: unknown): ResultError {\n // AbortError (browser / fetch / AbortController)\n if (err instanceof DOMException && err.name === \"AbortError\") {\n return { code: \"ABORTED\", message: \"Request cancelled\", cause: err };\n }\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n return { code: \"TIMEOUT\", message: \"Request timed out\", cause: err };\n }\n return defaultFallback(err);\n}\n","import type { ResultError } from \"./error/types\";\n\nexport type RetryDelayFn<E> = (attempt: number, err: E) => number;\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport type Jitter =\n | boolean\n | number // ratio 0..1\n | { ratio?: number; mode?: \"full\" | \"equal\"; rng?: () => number };\n\n/**\n * Backoff strategy to calculate the delay between retries.\n * - \"linear\": uses the base delay as is in each attempt.\n * - \"exponential\": multiplies the delay by 2^(attempt-1).\n * - \"fibonacci\": multiplies by F(attempt) (classic Fibonacci sequence).\n * - function: custom function based on the attempt number.\n */\nexport type BackoffStrategy =\n | \"linear\"\n | \"exponential\"\n | \"fibonacci\"\n | ((attempt: number) => number);\n\n/**\n * Retry options for `run`, `runAll` and `runAllOrThrow`.\n */\nexport type RetryOptions<E extends ResultError = ResultError> = {\n /**\n * Number of retries to perform (does not include the initial attempt).\n * @default 0\n */\n retries?: number;\n /**\n * Delay between attempts:\n * - number: fixed delay (ms)\n * - () => number: lazy delay (evaluated per attempt)\n * - (attempt, err) => number: delay based on attempt and last error\n * @default 0 or a default baseDelay if retries are present\n */\n retryDelay?: number | (() => number) | RetryDelayFn<E>;\n /**\n * Decides whether to retry given a specific error.\n * Can be synchronous or asynchronous.\n * Receives the next attempt number and a context with accumulated metrics.\n * @default () => true\n */\n shouldRetry?: (\n attempt: number,\n error: E,\n context: RetryContext\n ) => boolean | Promise<boolean>;\n /**\n * Random jitter to avoid thundering herd:\n * - true: default ratio 0.5\n * - false: no jitter\n * - number: ratio 0..1\n * - object: full control (ratio, mode, rng)\n * @default 0.5\n */\n jitter?: Jitter;\n /**\n * Backoff strategy to apply on the calculated delay.\n * @default \"linear\"\n */\n backoffStrategy?: BackoffStrategy;\n /**\n * Upper limit of the delay after backoff and before jitter.\n * @default undefined (no limit)\n */\n maxDelay?: number;\n};\n\n/**\n * Context for `shouldRetry` with accumulated metrics of the current attempt.\n */\nexport type RetryContext = {\n /** Total attempts (including the next retry). */\n totalAttempts: number;\n /** Elapsed time in ms since the start of `run`. */\n elapsedTime: number;\n};\n\n/**\n * Main options for `run` and extended to `runAll`/`runAllOrThrow`.\n */\nexport type RunOptions<\n T,\n E extends ResultError = ResultError\n> = RetryOptions<E> & {\n /**\n * Normalizes an unknown error value to your type `E`.\n * If not provided, a default normalizer is used.\n */\n toError?: (err: unknown) => E;\n /**\n * Optional transformation applied after `toError`.\n * Useful for adjusting messages, codes, or adding metadata.\n */\n mapError?: (error: E) => E;\n /**\n * Callback on failure (not called if `ignoreAbort` and error is ABORTED).\n */\n onError?: (error: E) => void;\n /**\n * Callback on success.\n */\n onSuccess?: (data: T) => void;\n /**\n * Callback that always executes at the end (success or error).\n */\n onFinally?: () => void;\n /**\n * If true, aborts (ABORTED) are not considered fatal errors:\n * `onError` is not called and `{ ok: false, error }` is returned.\n * @default true\n */\n ignoreAbort?: boolean;\n /**\n * Signal for native work cancellation.\n * If aborted, it cuts with `AbortError`.\n */\n signal?: AbortSignal;\n /**\n * Maximum timeout in ms for the work; expires with `TimeoutError`.\n */\n timeout?: number;\n /**\n * Retry observability: receives attempt, error, and next delay.\n */\n onRetry?: (attempt: number, error: E, nextDelay: number) => void;\n /**\n * Optional structured logger for debug and errors.\n */\n logger?: {\n debug?: (msg: string, meta?: any) => void;\n error?: (msg: string, error: E) => void;\n };\n /**\n * Callback on abort, useful for reacting to `AbortSignal`.\n */\n onAbort?: (signal: AbortSignal) => void;\n /**\n * Per-call circuit breaker configuration.\n * If not defined, can use the default value from `Runner`.\n */\n circuitBreaker?: CircuitBreakerOptions;\n};\n\n/**\n * Circuit breaker configuration options:\n * - failureThreshold: number of consecutive failures to open the circuit\n * - resetTimeout: time in ms it remains open before attempting half-open\n * - halfOpenRequests: allowed quantity in half-open state\n */\nexport type CircuitBreakerOptions = {\n failureThreshold: number;\n resetTimeout: number;\n halfOpenRequests?: number;\n};\n\n/**\n * Execution metrics optionally returned in `RunResult`.\n */\nexport type Metrics = {\n totalAttempts: number;\n totalRetries: number;\n totalDuration: number;\n lastError?: ResultError;\n};\n\nexport type RunResult<T, E extends ResultError = ResultError> =\n | { ok: true; data: T; error: null; metrics?: Metrics }\n | { ok: false; data: null; error: E; metrics?: Metrics };\n\n/**\n * Validates common execution/retry options.\n */\nexport function validateOptions<T, E extends ResultError = ResultError>(\n options: RunOptions<T, E>\n): void {\n if (options.retries != null && options.retries < 0) {\n throw new Error(\"retries must be >= 0\");\n }\n if (options.timeout != null && options.timeout <= 0) {\n throw new Error(\"timeout must be > 0\");\n }\n if (options.maxDelay != null && options.maxDelay < 0) {\n throw new Error(\"maxDelay must be >= 0\");\n }\n const cb = options.circuitBreaker;\n if (cb) {\n if (cb.failureThreshold < 1) {\n throw new Error(\"failureThreshold must be >= 1\");\n }\n if (cb.resetTimeout <= 0) {\n throw new Error(\"resetTimeout must be > 0\");\n }\n if (cb.halfOpenRequests != null && cb.halfOpenRequests < 1) {\n throw new Error(\"halfOpenRequests must be >= 1\");\n }\n }\n}\n","import type { Jitter, RetryDelayFn, BackoffStrategy } from \"./types\";\n\nexport const sleep = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function clamp(n: number, min: number, max: number) {\n return Math.max(min, Math.min(max, n));\n}\n\nexport function resolveRetryDelay<E>(\n retryDelay: number | RetryDelayFn<E> | undefined,\n attempt: number,\n err: E,\n defaultBaseDelay: number,\n backoffStrategy?: BackoffStrategy,\n maxDelay?: number\n): number {\n let base =\n typeof retryDelay === \"function\"\n ? (retryDelay as RetryDelayFn<E>)(attempt, err)\n : typeof retryDelay === \"number\"\n ? (retryDelay as number)\n : typeof retryDelay === \"undefined\"\n ? defaultBaseDelay\n : defaultBaseDelay;\n\n const backoff = computeBackoffDelay(\n backoffStrategy ?? \"linear\",\n base,\n attempt\n );\n\n const out = maxDelay != null ? clamp(backoff, 0, maxDelay) : backoff;\n return Number.isFinite(out) ? out : 0;\n}\n\nexport function applyJitter(delay: number, jitter: Jitter | undefined): number {\n if (delay <= 0 || !jitter) return delay;\n\n const rng =\n typeof jitter === \"object\" && jitter.rng ? jitter.rng : Math.random;\n\n // reasonable defaults\n const ratio =\n typeof jitter === \"number\"\n ? jitter\n : jitter === true\n ? 0.5\n : typeof jitter === \"object\" && jitter.ratio != null\n ? jitter.ratio\n : 0.5;\n\n const r = clamp(ratio, 0, 1);\n\n const mode = typeof jitter === \"object\" && jitter.mode ? jitter.mode : \"full\";\n\n // \"full\": 0..delay*r extra (recommended to avoid thundering herd)\n // \"equal\": delay*(1-r) + random(0..delay*r)\n if (mode === \"equal\") {\n return delay * (1 - r) + rng() * delay * r;\n }\n\n // full jitter: add random extra up to delay*r\n return delay + rng() * delay * r;\n}\n\nexport function computeBackoffDelay(\n strategy: BackoffStrategy,\n base: number,\n attempt: number\n): number {\n if (typeof strategy === \"function\") {\n const v = strategy(attempt);\n return v >= 0 ? v : 0;\n }\n const b = base >= 0 ? base : 0;\n const a = attempt >= 1 ? attempt : 1;\n if (strategy === \"linear\") return b;\n if (strategy === \"exponential\") return b * Math.pow(2, a - 1);\n if (strategy === \"fibonacci\") {\n if (a <= 2) return b;\n let prev = 1;\n let curr = 1;\n for (let i = 3; i <= a; i++) {\n const next = prev + curr;\n prev = curr;\n curr = next;\n }\n return b * curr;\n }\n return b;\n}\n","import type { ResultError } from \"../error/types\";\nimport { toResultError as defaultToResultError } from \"../error/normalize\";\nimport type { MaybePromise, RunOptions, RunResult } from \"../types\";\nimport { validateOptions } from \"../types\";\nimport { applyJitter, resolveRetryDelay, sleep } from \"../utils\";\n\n/**\n * Executes an async operation and returns a Result instead of throwing.\n *\n * Errors are normalized into an `ResultError` (or a custom error type `E`)\n * using the provided `toError` function.\n *\n * This utility is framework-agnostic and works in browsers, Node.js,\n * React effects, and any async context.\n */\nexport async function run<T, E extends ResultError = ResultError>(\n fn: () => MaybePromise<T>,\n options: RunOptions<T, E> = {}\n): Promise<RunResult<T, E>> {\n const {\n toError = defaultToResultError as unknown as (err: unknown) => E,\n mapError,\n onError,\n onSuccess,\n onFinally,\n ignoreAbort = true,\n retries = 0,\n retryDelay,\n shouldRetry = () => true,\n jitter = { ratio: 0.5, mode: \"full\" },\n backoffStrategy,\n maxDelay,\n timeout,\n signal,\n onRetry,\n logger,\n onAbort,\n } = options;\n\n const defaultBaseDelay = retries > 0 ? 300 : 0;\n\n validateOptions(options);\n\n if (signal?.aborted) {\n try {\n onAbort?.(signal);\n } finally {\n const err = toError(new DOMException(\"Aborted\", \"AbortError\"));\n const mapped = mapError ? mapError(err) : err;\n if (!ignoreAbort) {\n onError?.(mapped);\n }\n onFinally?.();\n return {\n ok: false,\n data: null,\n error: mapped,\n metrics: {\n totalAttempts: 0,\n totalRetries: 0,\n totalDuration: 0,\n lastError: mapped,\n },\n };\n }\n }\n\n const startedAt = Date.now();\n let attempt = 0;\n let lastError: E | undefined;\n\n while (true) {\n try {\n let timeoutId: any = null;\n const timeoutPromise =\n timeout && timeout > 0\n ? new Promise<never>((_, reject) => {\n timeoutId = setTimeout(\n () => reject(new DOMException(\"Timeout\", \"TimeoutError\")),\n timeout\n );\n })\n : null;\n\n const data = await (timeoutPromise\n ? Promise.race([fn(), timeoutPromise])\n : fn());\n if (timeoutId) clearTimeout(timeoutId);\n try {\n onSuccess?.(data);\n } catch (e) {\n logger?.error?.(\"run:onSuccess failed\", toError(e));\n }\n try {\n onFinally?.();\n } catch (e) {\n logger?.error?.(\"run:onFinally failed\", toError(e));\n }\n const totalDuration = Date.now() - startedAt;\n const metrics = {\n totalAttempts: attempt + 1,\n totalRetries: attempt,\n totalDuration,\n lastError,\n };\n logger?.debug?.(\"run:success\", {\n attempts: metrics.totalAttempts,\n duration: metrics.totalDuration,\n });\n return { ok: true, data, error: null, metrics };\n } catch (e) {\n let err = toError(e);\n if (mapError) err = mapError(err);\n\n const isAborted =\n (err as any)?.code === \"ABORTED\" ||\n (e instanceof DOMException && e.name === \"AbortError\") ||\n signal?.aborted;\n\n if (isAborted) {\n try {\n if (signal) {\n try {\n onAbort?.(signal);\n } catch (e) {\n logger?.error?.(\"run:onAbort failed\", toError(e));\n }\n }\n } finally {\n if (!ignoreAbort) {\n try {\n onError?.(err);\n } catch (e) {\n logger?.error?.(\"run:onError failed\", toError(e));\n }\n }\n try {\n onFinally?.();\n } catch (e) {\n logger?.error?.(\"run:onFinally failed\", toError(e));\n }\n const totalDuration = Date.now() - startedAt;\n const metrics = {\n totalAttempts: attempt,\n totalRetries: attempt,\n totalDuration,\n lastError: err,\n };\n logger?.debug?.(\"run:aborted\", {\n attempt,\n duration: metrics.totalDuration,\n });\n return { ok: false, data: null, error: err, metrics };\n }\n }\n\n lastError = err;\n const nextAttempt = attempt + 1;\n const context = {\n totalAttempts: nextAttempt,\n elapsedTime: Date.now() - startedAt,\n };\n const decision = await Promise.resolve(\n shouldRetry(nextAttempt, err, context)\n );\n const canRetry = attempt < retries && decision;\n\n if (canRetry) {\n attempt = nextAttempt;\n\n let delay = resolveRetryDelay(\n retryDelay,\n attempt,\n err,\n defaultBaseDelay,\n backoffStrategy,\n maxDelay\n );\n\n if (!Number.isFinite(delay) || delay < 0) delay = 0;\n\n delay = applyJitter(delay, jitter);\n\n onRetry?.(attempt, err, delay);\n logger?.debug?.(\"run:retry\", { attempt, delay });\n if (delay > 0) await sleep(delay);\n continue;\n }\n\n // Final failure or aborted\n try {\n onError?.(err);\n } catch (e) {\n logger?.error?.(\"run:onError failed\", toError(e));\n }\n try {\n onFinally?.();\n } catch (e) {\n logger?.error?.(\"run:onFinally failed\", toError(e));\n }\n const totalDuration = Date.now() - startedAt;\n const metrics = {\n totalAttempts: attempt + 1,\n totalRetries: attempt,\n totalDuration,\n lastError: err,\n };\n logger?.error?.(\"run:error\", err);\n return { ok: false, data: null, error: err, metrics };\n }\n }\n}\n","import { run } from \"./run\";\nimport type { ResultError } from \"../error/types\";\nimport type { MaybePromise, RunOptions, RunResult } from \"../types\";\nimport { validateOptions } from \"../types\";\n\n/**\n * Discriminated result per item in `runAllSettled`:\n * - \"ok\": successful task with `data`\n * - \"error\": failed task with `error`\n * - \"skipped\": task not executed due to cancellation/fail-fast/concurrency\n */\nexport type RunAllItemResult<T, E extends ResultError = ResultError> =\n | { status: \"ok\"; ok: true; data: T; error: null }\n | { status: \"error\"; ok: false; data: null; error: E }\n | { status: \"skipped\"; ok: false; data: null; error: null };\n\n/** Helper to discriminate successful results. */\nexport type SuccessResult<T> = Extract<\n RunAllItemResult<T, any>,\n { status: \"ok\" }\n>;\n/** Helper to discriminate error results. */\nexport type ErrorResult<E> = Extract<\n RunAllItemResult<any, E extends ResultError ? E : ResultError>,\n { status: \"error\" }\n>;\n\n/** Type guard that detects `status: \"ok\"` with `data` typing. */\nexport const isSuccess = <T, E extends ResultError = ResultError>(\n r: RunAllItemResult<T, E>\n): r is SuccessResult<T> => r.status === \"ok\";\n\nexport type RunAllOptions<T, E extends ResultError = ResultError> = RunOptions<\n T,\n E\n> & {\n /**\n * Maximum number of concurrent tasks to run.\n * @default Infinity\n */\n concurrency?: number;\n\n /**\n * Execution mode regarding errors.\n * - \"settle\": Run all tasks (default).\n * - \"fail-fast\": Stop starting new tasks if one fails.\n * @default \"settle\"\n */\n mode?: \"settle\" | \"fail-fast\";\n};\n\nexport async function runAllSettled<T, E extends ResultError = ResultError>(\n tasks: Array<() => MaybePromise<T>>,\n options: RunAllOptions<T, E> = {}\n): Promise<RunAllItemResult<T, E>[]> {\n const { concurrency = Infinity, mode = \"settle\", ...runOptions } = options;\n validateOptions(runOptions);\n\n if (tasks.length === 0) return [];\n\n const limit = Number.isFinite(concurrency)\n ? Math.max(1, Math.floor(concurrency))\n : Infinity;\n\n const results: RunAllItemResult<T, E>[] = new Array(tasks.length);\n\n let nextIndex = 0;\n let aborted = false;\n\n const setResult = (i: number, r: RunResult<T, E>) => {\n results[i] = r.ok\n ? { status: \"ok\", ok: true, data: r.data, error: null }\n : { status: \"error\", ok: false, data: null, error: r.error };\n };\n\n const markSkipped = () => {\n for (let i = 0; i < tasks.length; i++) {\n if (results[i]) continue;\n results[i] = {\n status: \"skipped\",\n ok: false,\n data: null,\n error: null,\n };\n }\n };\n\n // Run all in parallel if unlimited or limit >= count\n if (limit >= tasks.length) {\n const rs = await Promise.all(tasks.map((t) => run<T, E>(t, runOptions)));\n rs.forEach((r, i) => {\n setResult(i, r);\n });\n return results;\n }\n\n const worker = async () => {\n while (true) {\n if (aborted) return;\n\n const i = nextIndex++;\n if (i >= tasks.length) return;\n\n const task = tasks[i];\n if (!task) continue; // skip if task is undefined\n\n const r = await run<T, E>(task, runOptions);\n setResult(i, r);\n\n if (!r.ok) {\n if (mode === \"fail-fast\") {\n aborted = true;\n return;\n }\n }\n }\n };\n\n await Promise.all(\n Array.from({ length: Math.min(limit, tasks.length) }, () => worker())\n );\n\n markSkipped();\n return results;\n}\n","import { run } from \"./run\";\nimport type { ResultError } from \"../error/types\";\nimport type { RunOptions } from \"../types\";\nimport { validateOptions } from \"../types\";\nimport type { MaybePromise } from \"bun\";\n\n/**\n * Options for `runAll`:\n * - Inherits all options from `RunOptions`\n * - `concurrency`: limit of simultaneous tasks; if one fails, it throws\n */\nexport type RunAllOrThrowOptions<\n T,\n E extends ResultError = ResultError\n> = RunOptions<T, E> & {\n /**\n * Maximum number of concurrent tasks to run.\n * @default Infinity\n */\n concurrency?: number;\n};\n\nexport async function runAll<T, E extends ResultError = ResultError>(\n tasks: Array<() => MaybePromise<T>>,\n options: RunAllOrThrowOptions<T, E> = {}\n): Promise<T[]> {\n const { concurrency = Infinity, ...runOptions } = options;\n validateOptions(runOptions);\n\n if (tasks.length === 0) return [];\n\n const limit = Number.isFinite(concurrency)\n ? Math.max(1, Math.floor(concurrency))\n : Infinity;\n\n const data: T[] = new Array(tasks.length);\n\n // Run all in parallel if unlimited or limit >= count\n if (limit >= tasks.length) {\n await Promise.all(\n tasks.map(async (t, i) => {\n const r = await run<T, E>(t, runOptions);\n if (!r.ok) throw r.error;\n data[i] = r.data;\n })\n );\n return data;\n }\n\n let nextIndex = 0;\n let aborted = false;\n let firstError: E | null = null;\n\n const worker = async () => {\n while (true) {\n if (aborted) return;\n\n const i = nextIndex++;\n if (i >= tasks.length) return;\n\n const task = tasks[i];\n if (!task) continue; // skip if task is undefined\n\n const r = await run<T, E>(task, runOptions);\n\n if (!r.ok) {\n firstError ??= r.error;\n aborted = true;\n return;\n }\n\n data[i] = r.data;\n }\n };\n\n await Promise.all(\n Array.from({ length: Math.min(limit, tasks.length) }, () => worker())\n );\n\n if (firstError) throw firstError;\n\n // Safety fill\n return data;\n}\n","import type { ResultError, Rule } from \"./types\";\n\nexport const abort: Rule<ResultError<\"ABORTED\">> = (err) => {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n return { code: \"ABORTED\", message: \"Request cancelled\", cause: err };\n }\n if (err instanceof Error && err.name === \"AbortError\") {\n return {\n code: \"ABORTED\",\n message: err.message || \"Request cancelled\",\n cause: err,\n };\n }\n return null;\n};\n\nexport const timeout: Rule<ResultError<\"TIMEOUT\">> = (err) => {\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n return { code: \"TIMEOUT\", message: \"Request timed out\", cause: err };\n }\n if (err instanceof Error && err.name === \"TimeoutError\") {\n return {\n code: \"TIMEOUT\",\n message: err.message || \"Request timed out\",\n cause: err,\n };\n }\n return null;\n};\n\nexport const httpStatus: Rule<ResultError<\"HTTP\">> = (err) => {\n if (typeof err === \"object\" && err !== null) {\n const obj = err as Record<string, unknown>;\n const status = obj.status ?? obj.statusCode;\n if (typeof status === \"number\") {\n return {\n code: \"HTTP\",\n message:\n typeof obj.message === \"string\"\n ? obj.message\n : `HTTP Error ${status}`,\n status,\n cause: err,\n };\n }\n }\n return null;\n};\n\nexport const aggregate: Rule<ResultError<\"UNKNOWN\", { errors: unknown[] }>> = (\n err\n) => {\n if (typeof AggregateError !== \"undefined\" && err instanceof AggregateError) {\n return {\n code: \"UNKNOWN\",\n message: err.message || \"Multiple errors occurred\",\n cause: err,\n meta: { errors: err.errors as unknown[] },\n };\n }\n return null;\n};\n\nexport const string: Rule<ResultError<\"UNKNOWN\">> = (err) => {\n if (typeof err === \"string\") {\n return { code: \"UNKNOWN\", message: err, cause: err };\n }\n return null;\n};\n\nexport const message: Rule<ResultError<\"UNKNOWN\">> = (err) => {\n if (\n typeof err === \"object\" &&\n err !== null &&\n \"message\" in err &&\n typeof (err as { message: unknown }).message === \"string\"\n ) {\n return {\n code: \"UNKNOWN\",\n message: (err as { message: string }).message,\n cause: err,\n };\n }\n return null;\n};\n\nexport const rules = {\n abort,\n timeout,\n httpStatus,\n aggregate,\n string,\n message,\n} satisfies Record<string, Rule<ResultError>>;\n","import type { ResultError, Rule } from \"./types\";\n\nclass ErrorRuleBuilder<E> {\n constructor(private readonly matcher: (err: unknown) => err is E) {}\n\n toError<const Out extends ResultError>(mapper: (err: E) => Out): Rule<Out> {\n return (err: unknown) => {\n if (!this.matcher(err)) return null;\n return mapper(err);\n };\n }\n}\n\nexport const errorRule = {\n instance<E extends new (...args: any[]) => unknown>(ctor: E) {\n return new ErrorRuleBuilder<InstanceType<E>>(\n (err): err is InstanceType<E> => err instanceof ctor\n );\n },\n\n when<E = unknown>(predicate: (err: unknown) => err is E) {\n return new ErrorRuleBuilder<E>(predicate);\n },\n};\n","import type { ResultError, Rule, InferErrorFromRules } from \"../error/types\";\nimport { rules as defaultRules } from \"../error/core\";\nimport {\n createNormalizer,\n defaultFallback,\n toResultError,\n} from \"../error/normalize\";\nimport { run as baseRun } from \"./run\";\nimport type { MaybePromise, RunOptions, RunResult } from \"../types\";\nimport type { CircuitBreakerOptions } from \"../types\";\nimport { runAll as baseRunAll, type RunAllOrThrowOptions } from \"./runAll\";\nimport {\n runAllSettled as baseRunAllSettled,\n type RunAllItemResult,\n type RunAllOptions,\n} from \"./runAllSettled\";\n\nexport type RulesMode = \"extend\" | \"replace\";\n\nexport type CreateRunnerOptions<E extends ResultError = ResultError> = {\n /**\n * Custom matchers to use for normalizing errors.\n * If not provided, the default matchers are used.\n */\n rules?: Rule<E>[];\n\n /**\n * How to treat provided rules in relation to default rules.\n * - \"extend\": Use default rules after custom rules (default).\n * - \"replace\": Use only custom rules (and fallback).\n */\n rulesMode?: RulesMode;\n\n /**\n * Custom fallback function to use for normalizing errors.\n * If not provided, the default fallback is used.\n */\n fallback?: (err: unknown) => E;\n\n /**\n * If you want a completely custom normalizer, you can provide it directly.\n * If set, `matchers` and `fallback` are ignored.\n */\n toError?: (err: unknown) => E;\n\n /** Default for run options */\n ignoreAbort?: boolean;\n\n /** Optional default mapper for all runs */\n mapError?: (error: E) => E;\n /**\n * Default circuit breaker for all executions of the instance.\n * Can be overridden by `options.circuitBreaker` in each `run`.\n */\n circuitBreaker?: CircuitBreakerOptions;\n};\n\nconst composeMapError =\n <E>(base?: (e: E) => E, local?: (e: E) => E) =>\n (e: E) =>\n local ? local(base ? base(e) : e) : base ? base(e) : e;\n\nexport interface Runner<E extends ResultError> {\n run<T>(\n fn: () => Promise<T>,\n options?: RunOptions<T, E>\n ): Promise<RunResult<T, E>>;\n allSettled<T>(\n fns: Array<() => MaybePromise<T>>,\n options?: RunAllOptions<T, E>\n ): Promise<RunAllItemResult<T, E>[]>;\n all<T>(\n fns: Array<() => MaybePromise<T>>,\n options?: RunOptions<T, E>\n ): Promise<T[]>;\n}\n\nexport function createRunner(\n opts?: Omit<CreateRunnerOptions<ResultError>, \"rules\">\n): Runner<ResultError>;\n\nexport function createRunner<const TRules extends readonly Rule<any>[]>(\n opts: { rules: TRules } & Omit<\n CreateRunnerOptions<InferErrorFromRules<TRules>>,\n \"rules\"\n >\n): Runner<InferErrorFromRules<TRules>>;\n\nexport function createRunner<const TRules extends readonly Rule<any>[] = []>(\n opts: any = {}\n): any {\n type E = InferErrorFromRules<TRules>;\n\n const {\n rules = [],\n rulesMode = \"extend\",\n fallback = (e: unknown) => defaultFallback(e) as unknown as E,\n toError: customToError,\n ignoreAbort = true,\n mapError: defaultMapError,\n circuitBreaker: defaultCircuitBreaker,\n } = opts as CreateRunnerOptions<E>;\n\n let effectiveRules: Rule<E>[] = [];\n const defaultRulesList = Object.values(defaultRules) as unknown as Rule<E>[];\n\n if (rules.length > 0) {\n if (rulesMode === \"extend\") {\n effectiveRules = [...rules, ...defaultRulesList];\n } else {\n effectiveRules = [...rules];\n }\n } else {\n // If no custom rules, and extend -> use default rules\n if (rulesMode === \"extend\") {\n effectiveRules = defaultRulesList;\n } else {\n effectiveRules = [];\n }\n }\n\n const toError =\n customToError ??\n (effectiveRules.length > 0\n ? createNormalizer<E>(effectiveRules, fallback)\n : (toResultError as unknown as (e: unknown) => E));\n\n let failureCount = 0;\n let openUntil: number | null = null;\n let halfOpenRemaining: number | null = null;\n\n return {\n run<T>(\n fn: () => Promise<T>,\n options: RunOptions<T, E> = {}\n ): Promise<RunResult<T, E>> {\n const cb = options.circuitBreaker ?? defaultCircuitBreaker;\n const now = Date.now();\n\n if (cb) {\n if (openUntil && now < openUntil) {\n const err = toError(new Error(\"Circuit open\"));\n const mapped = composeMapError(\n defaultMapError,\n options.mapError\n )(err);\n options.onError?.(mapped);\n options.onFinally?.();\n return Promise.resolve({\n ok: false,\n data: null,\n error: mapped,\n metrics: {\n totalAttempts: 0,\n totalRetries: 0,\n totalDuration: 0,\n lastError: mapped,\n },\n });\n }\n if (openUntil && now >= openUntil) {\n openUntil = null;\n failureCount = 0;\n halfOpenRemaining = cb.halfOpenRequests ?? 1;\n }\n if (halfOpenRemaining != null) {\n if (halfOpenRemaining <= 0) {\n const err = toError(new Error(\"Circuit half-open limit\"));\n const mapped = composeMapError(\n defaultMapError,\n options.mapError\n )(err);\n options.onError?.(mapped);\n options.onFinally?.();\n return Promise.resolve({\n ok: false,\n data: null,\n error: mapped,\n metrics: {\n totalAttempts: 0,\n totalRetries: 0,\n totalDuration: 0,\n lastError: mapped,\n },\n });\n } else {\n halfOpenRemaining--;\n }\n }\n }\n\n return baseRun(fn, {\n toError,\n ignoreAbort,\n ...options,\n mapError: composeMapError(defaultMapError, options.mapError),\n }).then((r) => {\n if (!cb) return r;\n if (!r.ok) {\n failureCount++;\n if (failureCount >= cb.failureThreshold) {\n openUntil = Date.now() + cb.resetTimeout;\n halfOpenRemaining = null;\n }\n } else {\n failureCount = 0;\n openUntil = null;\n halfOpenRemaining = null;\n }\n return r;\n });\n },\n allSettled<T>(\n fns: Array<() => Promise<T>>,\n options: RunAllOptions<T, E> = {}\n ): Promise<RunAllItemResult<T, E>[]> {\n return baseRunAllSettled(fns, {\n toError,\n ignoreAbort,\n ...options,\n mapError: composeMapError(defaultMapError, options.mapError),\n });\n },\n all<T>(\n fns: (() => Promise<T>)[],\n options: RunAllOrThrowOptions<T, E> = {}\n ): Promise<T[]> {\n return baseRunAll(fns, {\n toError,\n ignoreAbort,\n ...options,\n mapError: composeMapError(defaultMapError, options.mapError),\n });\n },\n };\n}\n","export { run } from \"./runner/run\";\nexport { runAllSettled, type RunAllItemResult } from \"./runner/runAllSettled\";\nexport type {\n RunAllOptions,\n SuccessResult,\n ErrorResult,\n} from \"./runner/runAllSettled\";\nexport { isSuccess } from \"./runner/runAllSettled\";\nexport { runAll } from \"./runner/runAll\";\nexport type { RunOptions, RunResult, RetryOptions } from \"./types\";\nexport type {\n BackoffStrategy,\n CircuitBreakerOptions,\n Metrics,\n RetryContext,\n} from \"./types\";\n\nexport type { ResultError, ResultErrorCode } from \"./error/types\";\nexport {\n toResultError,\n defaultFallback,\n createNormalizer,\n} from \"./error/normalize\";\nexport { rules } from \"./error/core\";\n\nexport { errorRule } from \"./error/builder\";\n\nimport type { ResultError, Rule, InferErrorFromRules } from \"./error/types\";\nimport { createRunner } from \"./runner/runner\";\nimport type { CreateRunnerOptions, Runner } from \"./runner/runner\";\n\nexport default function trybox(\n options?: Omit<CreateRunnerOptions<ResultError>, \"rules\">\n): Runner<ResultError>;\n\nexport default function trybox<const TRules extends readonly Rule<any>[]>(\n options: { rules: TRules } & Omit<\n CreateRunnerOptions<InferErrorFromRules<TRules>>,\n \"rules\"\n >\n): Runner<InferErrorFromRules<TRules>>;\n\nexport default function trybox(options: any = {}): any {\n return createRunner(options);\n}\n"]}