trybox 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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 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 w(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=V(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 V(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,G=p>0?300:0;if(w(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((O,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(O){b?.error?.("run:onSuccess failed",t(O));}try{a?.();}catch(O){b?.error?.("run:onFinally failed",t(O));}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},O=await Promise.resolve(f(h,l,k));if(d<p&&O){d=h;let c=H(y,d,l,G,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 L=Date.now()-M,Q={totalAttempts:d+1,totalRetries:d,totalDuration:L,lastError:l};return b?.error?.("run:error",l),{ok:false,data:null,error:l,metrics:Q}}}var X=r=>r.status==="ok";async function v(r,e={}){let{concurrency:t=1/0,mode:u="settle",...n}=e;if(w(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(w(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 Y=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,Z=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,j=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},rr=r=>typeof AggregateError<"u"&&r instanceof AggregateError?{code:"UNKNOWN",message:r.message||"Multiple errors occurred",cause:r,meta:{errors:r.errors}}:null,er=r=>typeof r=="string"?{code:"UNKNOWN",message:r,cause:r}:null,tr=r=>typeof r=="object"&&r!==null&&"message"in r&&typeof r.message=="string"?{code:"UNKNOWN",message:r.message,cause:r}:null,or={abort:Y,timeout:Z,httpStatus:j,aggregate:rr,string:er,message:tr};var S=class{constructor(e){this.matcher=e;}toError(e){return t=>this.matcher(t)?e(t):null}},nr={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 $(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)})}}}function ur(r){return $(r)}exports.createNormalizer=B;exports.default=ur;exports.defaultFallback=N;exports.errorRule=nr;exports.isSuccess=X;exports.rules=or;exports.run=g;exports.runAll=C;exports.runAllSettled=v;exports.toAppError=D;//# 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":"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","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","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","trybox"],"mappings":"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","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","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 { AppError, AppErrorCode } from \"./error/types\";\nexport {\n toAppError,\n defaultFallback,\n createNormalizer,\n} from \"./error/normalize\";\nexport { rules } from \"./error/core\";\n\nexport { errorRule } from \"./error/builder\";\n\nimport type { AppError } from \"./error/types\";\nimport { createRunner } from \"./runner/runner\";\nimport type { CreateRunnerOptions, Runner } from \"./runner/runner\";\n\nexport default function trybox(\n options?: CreateRunnerOptions\n): Runner<AppError> {\n return createRunner(options);\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -17,9 +17,6 @@ type AppError<Code extends string = AppErrorCode | (string & {}), Meta = unknown
17
17
  meta?: Meta;
18
18
  cause?: unknown;
19
19
  };
20
- type NonNull<T> = T extends null ? never : T;
21
- type RuleReturn<R> = R extends (err: unknown) => infer Out ? NonNull<Out> : never;
22
- type InferErrorFromRules<TRules extends readonly Rule<any>[]> = TRules extends readonly [] ? AppError : RuleReturn<TRules[number]> | AppError<"UNKNOWN">;
23
20
  type Rule<E extends AppError = AppError> = (err: unknown) => E | null;
24
21
 
25
22
  type RetryDelayFn<E> = (attempt: number, err: E) => number;
@@ -313,9 +310,7 @@ interface Runner<E extends AppError> {
313
310
  all<T>(fns: Array<() => MaybePromise<T>>, options?: RunAllOptions<T, E>): Promise<RunAllItemResult<T, E>[]>;
314
311
  allOrThrow<T>(fns: Array<() => MaybePromise<T>>, options?: RunOptions<T, E>): Promise<T[]>;
315
312
  }
316
- declare function createRunner(opts?: Omit<CreateRunnerOptions<AppError>, "rules">): Runner<AppError>;
317
- declare function createRunner<const TRules extends readonly Rule<any>[]>(opts: {
318
- rules: TRules;
319
- } & Omit<CreateRunnerOptions<InferErrorFromRules<TRules>>, "rules">): Runner<InferErrorFromRules<TRules>>;
320
313
 
321
- export { type AppError, type AppErrorCode, type BackoffStrategy, type CircuitBreakerOptions, type CreateRunnerOptions, type ErrorResult, type Metrics, type RetryContext, type RetryOptions, type RunAllItemResult, type RunAllOptions, type RunOptions, type RunResult, type SuccessResult, createNormalizer, createRunner, defaultFallback, errorRule, isSuccess, rules, run, runAll, runAllSettled, toAppError };
314
+ declare function trybox(options?: CreateRunnerOptions): Runner<AppError>;
315
+
316
+ export { type AppError, type AppErrorCode, type BackoffStrategy, type CircuitBreakerOptions, type ErrorResult, type Metrics, type RetryContext, type RetryOptions, type RunAllItemResult, type RunAllOptions, type RunOptions, type RunResult, type SuccessResult, createNormalizer, trybox as default, defaultFallback, errorRule, isSuccess, rules, run, runAll, runAllSettled, toAppError };
package/dist/index.d.ts CHANGED
@@ -17,9 +17,6 @@ type AppError<Code extends string = AppErrorCode | (string & {}), Meta = unknown
17
17
  meta?: Meta;
18
18
  cause?: unknown;
19
19
  };
20
- type NonNull<T> = T extends null ? never : T;
21
- type RuleReturn<R> = R extends (err: unknown) => infer Out ? NonNull<Out> : never;
22
- type InferErrorFromRules<TRules extends readonly Rule<any>[]> = TRules extends readonly [] ? AppError : RuleReturn<TRules[number]> | AppError<"UNKNOWN">;
23
20
  type Rule<E extends AppError = AppError> = (err: unknown) => E | null;
24
21
 
25
22
  type RetryDelayFn<E> = (attempt: number, err: E) => number;
@@ -313,9 +310,7 @@ interface Runner<E extends AppError> {
313
310
  all<T>(fns: Array<() => MaybePromise<T>>, options?: RunAllOptions<T, E>): Promise<RunAllItemResult<T, E>[]>;
314
311
  allOrThrow<T>(fns: Array<() => MaybePromise<T>>, options?: RunOptions<T, E>): Promise<T[]>;
315
312
  }
316
- declare function createRunner(opts?: Omit<CreateRunnerOptions<AppError>, "rules">): Runner<AppError>;
317
- declare function createRunner<const TRules extends readonly Rule<any>[]>(opts: {
318
- rules: TRules;
319
- } & Omit<CreateRunnerOptions<InferErrorFromRules<TRules>>, "rules">): Runner<InferErrorFromRules<TRules>>;
320
313
 
321
- export { type AppError, type AppErrorCode, type BackoffStrategy, type CircuitBreakerOptions, type CreateRunnerOptions, type ErrorResult, type Metrics, type RetryContext, type RetryOptions, type RunAllItemResult, type RunAllOptions, type RunOptions, type RunResult, type SuccessResult, createNormalizer, createRunner, defaultFallback, errorRule, isSuccess, rules, run, runAll, runAllSettled, toAppError };
314
+ declare function trybox(options?: CreateRunnerOptions): Runner<AppError>;
315
+
316
+ export { type AppError, type AppErrorCode, type BackoffStrategy, type CircuitBreakerOptions, type ErrorResult, type Metrics, type RetryContext, type RetryOptions, type RunAllItemResult, type RunAllOptions, type RunOptions, type RunResult, type SuccessResult, createNormalizer, trybox as default, defaultFallback, errorRule, isSuccess, rules, run, runAll, runAllSettled, toAppError };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 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)})}}}export{B as createNormalizer,nr as createRunner,N as defaultFallback,or as errorRule,V as isSuccess,tr as rules,g as run,C as runAll,v as runAllSettled,D as toAppError};//# sourceMappingURL=index.js.map
1
+ 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 w(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=V(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 V(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,G=p>0?300:0;if(w(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((O,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(O){b?.error?.("run:onSuccess failed",t(O));}try{a?.();}catch(O){b?.error?.("run:onFinally failed",t(O));}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},O=await Promise.resolve(f(h,l,k));if(d<p&&O){d=h;let c=H(y,d,l,G,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 L=Date.now()-M,Q={totalAttempts:d+1,totalRetries:d,totalDuration:L,lastError:l};return b?.error?.("run:error",l),{ok:false,data:null,error:l,metrics:Q}}}var X=r=>r.status==="ok";async function v(r,e={}){let{concurrency:t=1/0,mode:u="settle",...n}=e;if(w(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(w(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 Y=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,Z=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,j=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},rr=r=>typeof AggregateError<"u"&&r instanceof AggregateError?{code:"UNKNOWN",message:r.message||"Multiple errors occurred",cause:r,meta:{errors:r.errors}}:null,er=r=>typeof r=="string"?{code:"UNKNOWN",message:r,cause:r}:null,tr=r=>typeof r=="object"&&r!==null&&"message"in r&&typeof r.message=="string"?{code:"UNKNOWN",message:r.message,cause:r}:null,or={abort:Y,timeout:Z,httpStatus:j,aggregate:rr,string:er,message:tr};var S=class{constructor(e){this.matcher=e;}toError(e){return t=>this.matcher(t)?e(t):null}},nr={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 $(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)})}}}function ur(r){return $(r)}export{B as createNormalizer,ur as default,N as defaultFallback,nr as errorRule,X as isSuccess,or as rules,g as run,C as runAll,v as runAllSettled,D as toAppError};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -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":"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","file":"index.js","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","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","trybox"],"mappings":"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","file":"index.js","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","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 { AppError, AppErrorCode } from \"./error/types\";\nexport {\n toAppError,\n defaultFallback,\n createNormalizer,\n} from \"./error/normalize\";\nexport { rules } from \"./error/core\";\n\nexport { errorRule } from \"./error/builder\";\n\nimport type { AppError } from \"./error/types\";\nimport { createRunner } from \"./runner/runner\";\nimport type { CreateRunnerOptions, Runner } from \"./runner/runner\";\n\nexport default function trybox(\n options?: CreateRunnerOptions\n): Runner<AppError> {\n return createRunner(options);\n}\n"]}
@@ -1 +1 @@
1
- {"inputs":{"src/error/normalize.ts":{"bytes":1322,"imports":[],"format":"esm"},"src/types.ts":{"bytes":5747,"imports":[],"format":"esm"},"src/utils.ts":{"bytes":2436,"imports":[],"format":"esm"},"src/runner/run.ts":{"bytes":5668,"imports":[{"path":"src/error/normalize.ts","kind":"import-statement","original":"../error/normalize"},{"path":"src/types.ts","kind":"import-statement","original":"../types"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils"}],"format":"esm"},"src/runner/runAllSettled.ts":{"bytes":3389,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"src/runner/runAll.ts":{"bytes":1973,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"src/error/core.ts":{"bytes":2288,"imports":[],"format":"esm"},"src/error/builder.ts":{"bytes":668,"imports":[],"format":"esm"},"src/runner/runner.ts":{"bytes":5821,"imports":[{"path":"src/error/normalize.ts","kind":"import-statement","original":"../error/normalize"},{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/runner/runAll.ts","kind":"import-statement","original":"./runAll"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runAllSettled"}],"format":"esm"},"src/index.ts":{"bytes":814,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./runner/run"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runner/runAllSettled"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runner/runAllSettled"},{"path":"src/runner/runAll.ts","kind":"import-statement","original":"./runner/runAll"},{"path":"src/error/normalize.ts","kind":"import-statement","original":"./error/normalize"},{"path":"src/error/core.ts","kind":"import-statement","original":"./error/core"},{"path":"src/error/builder.ts","kind":"import-statement","original":"./error/builder"},{"path":"src/runner/runner.ts","kind":"import-statement","original":"./runner/runner"}],"format":"esm"}},"outputs":{"dist/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":43194},"dist/index.cjs":{"imports":[],"exports":["createNormalizer","createRunner","defaultFallback","errorRule","isSuccess","rules","run","runAll","runAllSettled","toAppError"],"entryPoint":"src/index.ts","inputs":{"src/error/normalize.ts":{"bytesInOutput":507},"src/types.ts":{"bytesInOutput":500},"src/utils.ts":{"bytesInOutput":782},"src/runner/run.ts":{"bytesInOutput":2044},"src/index.ts":{"bytesInOutput":0},"src/runner/runAllSettled.ts":{"bytesInOutput":747},"src/runner/runAll.ts":{"bytesInOutput":551},"src/error/core.ts":{"bytesInOutput":1070},"src/error/builder.ts":{"bytesInOutput":166},"src/runner/runner.ts":{"bytesInOutput":1115}},"bytes":7652}}}
1
+ {"inputs":{"src/error/normalize.ts":{"bytes":1322,"imports":[],"format":"esm"},"src/types.ts":{"bytes":5747,"imports":[],"format":"esm"},"src/utils.ts":{"bytes":2436,"imports":[],"format":"esm"},"src/runner/run.ts":{"bytes":5668,"imports":[{"path":"src/error/normalize.ts","kind":"import-statement","original":"../error/normalize"},{"path":"src/types.ts","kind":"import-statement","original":"../types"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils"}],"format":"esm"},"src/runner/runAllSettled.ts":{"bytes":3389,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"src/runner/runAll.ts":{"bytes":1973,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"src/error/core.ts":{"bytes":2288,"imports":[],"format":"esm"},"src/error/builder.ts":{"bytes":668,"imports":[],"format":"esm"},"src/runner/runner.ts":{"bytes":5821,"imports":[{"path":"src/error/normalize.ts","kind":"import-statement","original":"../error/normalize"},{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/runner/runAll.ts","kind":"import-statement","original":"./runAll"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runAllSettled"}],"format":"esm"},"src/index.ts":{"bytes":997,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./runner/run"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runner/runAllSettled"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runner/runAllSettled"},{"path":"src/runner/runAll.ts","kind":"import-statement","original":"./runner/runAll"},{"path":"src/error/normalize.ts","kind":"import-statement","original":"./error/normalize"},{"path":"src/error/core.ts","kind":"import-statement","original":"./error/core"},{"path":"src/error/builder.ts","kind":"import-statement","original":"./error/builder"},{"path":"src/runner/runner.ts","kind":"import-statement","original":"./runner/runner"}],"format":"esm"}},"outputs":{"dist/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44368},"dist/index.cjs":{"imports":[],"exports":["createNormalizer","default","defaultFallback","errorRule","isSuccess","rules","run","runAll","runAllSettled","toAppError"],"entryPoint":"src/index.ts","inputs":{"src/error/normalize.ts":{"bytesInOutput":507},"src/types.ts":{"bytesInOutput":500},"src/utils.ts":{"bytesInOutput":782},"src/runner/run.ts":{"bytesInOutput":2044},"src/index.ts":{"bytesInOutput":27},"src/runner/runAllSettled.ts":{"bytesInOutput":747},"src/runner/runAll.ts":{"bytesInOutput":551},"src/error/core.ts":{"bytesInOutput":1072},"src/error/builder.ts":{"bytesInOutput":166},"src/runner/runner.ts":{"bytesInOutput":1114}},"bytes":7675}}}
@@ -1 +1 @@
1
- {"inputs":{"src/error/normalize.ts":{"bytes":1322,"imports":[],"format":"esm"},"src/types.ts":{"bytes":5747,"imports":[],"format":"esm"},"src/utils.ts":{"bytes":2436,"imports":[],"format":"esm"},"src/runner/run.ts":{"bytes":5668,"imports":[{"path":"src/error/normalize.ts","kind":"import-statement","original":"../error/normalize"},{"path":"src/types.ts","kind":"import-statement","original":"../types"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils"}],"format":"esm"},"src/runner/runAllSettled.ts":{"bytes":3389,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"src/runner/runAll.ts":{"bytes":1973,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"src/error/core.ts":{"bytes":2288,"imports":[],"format":"esm"},"src/error/builder.ts":{"bytes":668,"imports":[],"format":"esm"},"src/runner/runner.ts":{"bytes":5821,"imports":[{"path":"src/error/normalize.ts","kind":"import-statement","original":"../error/normalize"},{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/runner/runAll.ts","kind":"import-statement","original":"./runAll"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runAllSettled"}],"format":"esm"},"src/index.ts":{"bytes":814,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./runner/run"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runner/runAllSettled"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runner/runAllSettled"},{"path":"src/runner/runAll.ts","kind":"import-statement","original":"./runner/runAll"},{"path":"src/error/normalize.ts","kind":"import-statement","original":"./error/normalize"},{"path":"src/error/core.ts","kind":"import-statement","original":"./error/core"},{"path":"src/error/builder.ts","kind":"import-statement","original":"./error/builder"},{"path":"src/runner/runner.ts","kind":"import-statement","original":"./runner/runner"}],"format":"esm"}},"outputs":{"dist/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":43194},"dist/index.js":{"imports":[],"exports":["createNormalizer","createRunner","defaultFallback","errorRule","isSuccess","rules","run","runAll","runAllSettled","toAppError"],"entryPoint":"src/index.ts","inputs":{"src/error/normalize.ts":{"bytesInOutput":507},"src/types.ts":{"bytesInOutput":500},"src/utils.ts":{"bytesInOutput":782},"src/runner/run.ts":{"bytesInOutput":2044},"src/index.ts":{"bytesInOutput":0},"src/runner/runAllSettled.ts":{"bytesInOutput":747},"src/runner/runAll.ts":{"bytesInOutput":551},"src/error/core.ts":{"bytesInOutput":1070},"src/error/builder.ts":{"bytesInOutput":166},"src/runner/runner.ts":{"bytesInOutput":1115}},"bytes":7652}}}
1
+ {"inputs":{"src/error/normalize.ts":{"bytes":1322,"imports":[],"format":"esm"},"src/types.ts":{"bytes":5747,"imports":[],"format":"esm"},"src/utils.ts":{"bytes":2436,"imports":[],"format":"esm"},"src/runner/run.ts":{"bytes":5668,"imports":[{"path":"src/error/normalize.ts","kind":"import-statement","original":"../error/normalize"},{"path":"src/types.ts","kind":"import-statement","original":"../types"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils"}],"format":"esm"},"src/runner/runAllSettled.ts":{"bytes":3389,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"src/runner/runAll.ts":{"bytes":1973,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"src/error/core.ts":{"bytes":2288,"imports":[],"format":"esm"},"src/error/builder.ts":{"bytes":668,"imports":[],"format":"esm"},"src/runner/runner.ts":{"bytes":5821,"imports":[{"path":"src/error/normalize.ts","kind":"import-statement","original":"../error/normalize"},{"path":"src/runner/run.ts","kind":"import-statement","original":"./run"},{"path":"src/runner/runAll.ts","kind":"import-statement","original":"./runAll"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runAllSettled"}],"format":"esm"},"src/index.ts":{"bytes":997,"imports":[{"path":"src/runner/run.ts","kind":"import-statement","original":"./runner/run"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runner/runAllSettled"},{"path":"src/runner/runAllSettled.ts","kind":"import-statement","original":"./runner/runAllSettled"},{"path":"src/runner/runAll.ts","kind":"import-statement","original":"./runner/runAll"},{"path":"src/error/normalize.ts","kind":"import-statement","original":"./error/normalize"},{"path":"src/error/core.ts","kind":"import-statement","original":"./error/core"},{"path":"src/error/builder.ts","kind":"import-statement","original":"./error/builder"},{"path":"src/runner/runner.ts","kind":"import-statement","original":"./runner/runner"}],"format":"esm"}},"outputs":{"dist/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":44368},"dist/index.js":{"imports":[],"exports":["createNormalizer","default","defaultFallback","errorRule","isSuccess","rules","run","runAll","runAllSettled","toAppError"],"entryPoint":"src/index.ts","inputs":{"src/error/normalize.ts":{"bytesInOutput":507},"src/types.ts":{"bytesInOutput":500},"src/utils.ts":{"bytesInOutput":782},"src/runner/run.ts":{"bytesInOutput":2044},"src/index.ts":{"bytesInOutput":27},"src/runner/runAllSettled.ts":{"bytesInOutput":747},"src/runner/runAll.ts":{"bytesInOutput":551},"src/error/core.ts":{"bytesInOutput":1072},"src/error/builder.ts":{"bytesInOutput":166},"src/runner/runner.ts":{"bytesInOutput":1114}},"bytes":7675}}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trybox",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Run sync/async functions and return a typed Result instead of throwing.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -36,8 +36,8 @@
36
36
  "typescript": "^5.0.0"
37
37
  },
38
38
  "license": "MIT",
39
- "homepage": "https://runtry-docs.pages.dev/",
40
- "bugs": "https://github.com/sebasxsala/runtry/issues",
39
+ "homepage": "https://trybox-docs.pages.dev/",
40
+ "bugs": "https://github.com/sebasxsala/trybox/issues",
41
41
  "author": {
42
42
  "name": "sebasxsala",
43
43
  "url": "https://github.com/sebasxsala"