trybox 0.10.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -32,18 +32,18 @@ if (result.ok) {
32
32
 
33
33
  ## Error Handling
34
34
 
35
- `trybox` normalizes all errors into a `ResultError` object with a stable `code`.
35
+ `trybox` normalizes all errors into a `TypedError` instance with a stable `code`.
36
36
 
37
- ### The `ResultError` Object
37
+ ### The `TypedError` Shape
38
38
 
39
- All errors are normalized to this structure:
39
+ All errors are normalized to this shape:
40
40
 
41
41
  ```typescript
42
- type ResultError<Code extends string = string> = {
42
+ type TypedError<Code extends string = string, Meta = unknown> = {
43
43
  code: Code; // Stable error code (e.g. "TIMEOUT", "HTTP")
44
44
  message: string; // Human-readable message
45
45
  cause?: unknown; // Original error
46
- meta?: Record<string, any>; // Extra metadata (e.g. status code, validation errors)
46
+ meta?: Meta; // Extra metadata (optional)
47
47
  status?: number; // Optional HTTP status (if applicable)
48
48
  };
49
49
  ```
@@ -108,15 +108,21 @@ const runner = trybox({
108
108
  Executes a single function with retry and error handling.
109
109
 
110
110
  ```typescript
111
+ import trybox, { RetryStrategies } from "trybox";
112
+
111
113
  await runner.run(fn, {
112
- retries: 3,
113
- retryDelay: (attempt) => attempt * 1000,
114
- onSuccess: (data) => console.log("Success:", data),
115
- onError: (err) => console.error("Error:", err),
114
+ retry: {
115
+ maxRetries: 3,
116
+ strategy: RetryStrategies.fixed(1000),
117
+ },
118
+ hooks: {
119
+ onSuccess: (data) => console.log("Success:", data),
120
+ onError: (err) => console.error("Error:", err),
121
+ },
116
122
  });
117
123
  ```
118
124
 
119
- ### `runner.allSettled(tasks, options?)`
125
+ ### `runner.runAll(tasks, options?)`
120
126
 
121
127
  Executes multiple tasks with concurrency control. Returns all results (success or failure).
122
128
 
@@ -127,21 +133,20 @@ const tasks = [
127
133
  () => fetch("/api/3"),
128
134
  ];
129
135
 
130
- const results = await runner.allSettled(tasks, {
136
+ const results = await runner.runAll(tasks, {
131
137
  concurrency: 2,
132
- mode: "settle", // or "fail-fast"
133
138
  });
134
139
  ```
135
140
 
136
- ### `runner.all(tasks, options?)`
141
+ ### `runner.runOrThrowAll(tasks, options?)`
137
142
 
138
143
  Like `Promise.all` but with concurrency control. Throws the first normalized error if any fails.
139
144
 
140
145
  ```typescript
141
146
  try {
142
- const data = await runner.all(tasks, { concurrency: 5 });
147
+ const data = await runner.runOrThrowAll(tasks, { concurrency: 5 });
143
148
  } catch (err) {
144
- // err is ResultError
149
+ // err is TypedError
145
150
  console.error(err.code);
146
151
  }
147
152
  ```
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});function K(r,e){return t=>{for(let n of r){let u=n(t);if(u)return u}return e(t)}}function v(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 N(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}:v(r)}function D(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")}var $=r=>new Promise(e=>setTimeout(e,r));function G(r,e,t){return Math.max(e,Math.min(t,r))}function Q(r,e,t,n,u,l){let s=typeof r=="function"?r(e,t):typeof r=="number"?r:n,R=sr(u??"linear",s,e),i=l!=null?G(R,0,l):R;return Number.isFinite(i)?i:0}function V(r,e){if(r<=0||!e)return r;let t=typeof e=="object"&&e.rng?e.rng:Math.random,n=typeof e=="number"?e:e===true?.5:typeof e=="object"&&e.ratio!=null?e.ratio:.5,u=G(n,0,1);return (typeof e=="object"&&e.mode?e.mode:"full")==="equal"?r*(1-u)+t()*r*u:r+t()*r*u}function sr(r,e,t){if(typeof r=="function"){let l=r(t);return l>=0?l:0}let n=e>=0?e:0,u=t>=1?t:1;if(r==="linear")return n;if(r==="exponential")return n*Math.pow(2,u-1);if(r==="fibonacci"){if(u<=2)return n;let l=1,s=1;for(let R=3;R<=u;R++){let i=l+s;l=s,s=i;}return n*s}return n}async function O(r,e={}){let{toError:t=N,mapError:n,onError:u,onSuccess:l,onFinally:s,ignoreAbort:R=true,retries:i=0,retryDelay:x,shouldRetry:E=()=>true,jitter:y={ratio:.5,mode:"full"},backoffStrategy:o,maxDelay:m,timeout:f,signal:a,onRetry:g,logger:d,onAbort:w}=e,M=i>0?300:0;if(D(e),a?.aborted)try{w?.(a);}finally{let b=t(new DOMException("Aborted","AbortError")),A=n?n(b):b;return R||u?.(A),s?.(),{ok:false,data:null,error:A,metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,lastError:A}}}let I=Date.now(),T=0,H,U=0;for(;;){let b=new AbortController;a&&(a.aborted?b.abort(a.reason):a.addEventListener("abort",()=>b.abort(a.reason),{once:true}));let A=null;f&&f>0&&(A=setTimeout(()=>{b.abort(new DOMException("Timeout","TimeoutError"));},f));try{let P=new Promise((k,C)=>{b.signal.aborted?C(b.signal.reason):b.signal.addEventListener("abort",()=>C(b.signal.reason),{once:!0});}),p=await Promise.race([r({signal:b.signal}),P]);A&&clearTimeout(A);try{l?.(p);}catch(k){d?.error?.("run:onSuccess failed",t(k));}try{s?.();}catch(k){d?.error?.("run:onFinally failed",t(k));}let L=Date.now()-I,h={totalAttempts:T+1,totalRetries:T,totalDuration:L,lastError:H};return d?.debug?.("run:success",{attempts:h.totalAttempts,duration:h.totalDuration}),{ok:!0,data:p,error:null,metrics:h}}catch(P){let p=t(P);if(n&&(p=n(p)),p?.code==="ABORTED"||P instanceof DOMException&&P.name==="AbortError"||a?.aborted)try{if(a)try{w?.(a);}catch(c){d?.error?.("run:onAbort failed",t(c));}}finally{if(!R)try{u?.(p);}catch(q){d?.error?.("run:onError failed",t(q));}try{s?.();}catch(q){d?.error?.("run:onFinally failed",t(q));}let c=Date.now()-I,_={totalAttempts:T+1,totalRetries:T,totalDuration:c,lastError:p};return d?.debug?.("run:aborted",{attempt:T,duration:_.totalDuration}),{ok:false,data:null,error:p,metrics:_}}H=p;let h=T+1,k={totalAttempts:h,elapsedTime:Date.now()-I,startTime:I,lastDelay:U>0?U:void 0},C=await Promise.resolve(E(h,p,k));if(T<i&&C){T=h;let c=Q(x,T,p,M,o,m);(!Number.isFinite(c)||c<0)&&(c=0),c=V(c,y),U=c,g?.(T,p,c),d?.debug?.("run:retry",{attempt:T,delay:c}),c>0&&await $(c);continue}try{u?.(p);}catch(c){d?.error?.("run:onError failed",t(c));}try{s?.();}catch(c){d?.error?.("run:onFinally failed",t(c));}let nr=Date.now()-I,ur={totalAttempts:T+1,totalRetries:T,totalDuration:nr,lastError:p};return d?.error?.("run:error",p),{ok:false,data:null,error:p,metrics:ur}}}}var lr=r=>r.status==="ok";async function W(r,e={}){let{concurrency:t=1/0,mode:n="settle",...u}=e;if(D(u),r.length===0)return [];let l=Number.isFinite(t)?Math.max(1,Math.floor(t)):1/0,s=new Array(r.length),R=0,i=false,x=(o,m)=>{s[o]=m.ok?{status:"ok",ok:true,data:m.data,error:null}:{status:"error",ok:false,data:null,error:m.error};},E=()=>{for(let o=0;o<r.length;o++)s[o]||(s[o]={status:"skipped",ok:false,data:null,error:null});};if(l>=r.length)return (await Promise.all(r.map(m=>O(m,u)))).forEach((m,f)=>{x(f,m);}),s;let y=async()=>{for(;;){if(i)return;let o=R++;if(o>=r.length)return;let m=r[o];if(!m)continue;let f=await O(m,u);if(x(o,f),!f.ok&&n==="fail-fast"){i=true;return}}};return await Promise.all(Array.from({length:Math.min(l,r.length)},()=>y())),E(),s}async function J(r,e={}){let{concurrency:t=1/0,...n}=e;if(D(n),r.length===0)return [];let u=Number.isFinite(t)?Math.max(1,Math.floor(t)):1/0,l=new Array(r.length);if(u>=r.length)return await Promise.all(r.map(async(E,y)=>{let o=await O(E,n);if(!o.ok)throw o.error;l[y]=o.data;})),l;let s=0,R=false,i=null,x=async()=>{for(;;){if(R)return;let E=s++;if(E>=r.length)return;let y=r[E];if(!y)continue;let o=await O(y,n);if(!o.ok){i??(i=o.error),R=true;return}l[E]=o.data;}};if(await Promise.all(Array.from({length:Math.min(u,r.length)},()=>x())),i)throw i;return l}var F=class extends Error{constructor(){super("Circuit open"),this.name="CircuitOpenError";}},X=r=>r instanceof F||r instanceof Error&&r.name==="CircuitOpenError"?{code:"CIRCUIT_OPEN",message:"Circuit open",cause:r}:null,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,ar={circuitOpen:X,abort:Y,timeout:Z,httpStatus:j,aggregate:rr,string:er,message:tr};function z(){return [X,Y,Z,j,rr,er,tr]}var S=class{constructor(e){this.matcher=e;}toError(e){return t=>this.matcher(t)?e(t):null}},ir={instance(r){return new S(e=>e instanceof r)},when(r){return new S(r)}};var B=(r,e)=>t=>e?e(r?r(t):t):r?r(t):t;function or(r={}){let{rules:e=[],rulesMode:t="extend",fallback:n=f=>v(f),toError:u,ignoreAbort:l=true,mapError:s,circuitBreaker:R}=r,i=[],x=z()||[];e.length>0?t==="extend"?i=[...e,...x]:i=[...e]:t==="extend"?i=x:i=[];let E=u??(i.length>0?K(i,n):N),y=0,o=null,m=null;return {run(f,a={}){let g=R,d=Date.now();if(g&&o&&d<o){let w=E(new F),M=B(s,a.mapError)(w);return a.onError?.(M),a.onFinally?.(),Promise.resolve({ok:false,data:null,error:M,metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,lastError:M}})}return O(f,{toError:E,ignoreAbort:l,...a,mapError:B(s,a.mapError)}).then(w=>(g&&(w.ok?o&&Date.now()>=o?(m&&m>0&&m--,(!m||m<=0)&&(o=null,y=0,m=null)):y=0:o&&Date.now()>=o?(o=Date.now()+g.resetTimeout,m=g.halfOpenRequests??1,y=0):o||(y++,y>=g.failureThreshold&&(o=Date.now()+g.resetTimeout,m=g.halfOpenRequests??1))),w))},all(f,a={}){return W(f,{toError:E,ignoreAbort:l,...a,mapError:B(s,a.mapError)})},allOrThrow(f,a={}){return J(f,{toError:E,ignoreAbort:l,...a,mapError:B(s,a.mapError)})}}}function mr(r={}){return or(r)}exports.createNormalizer=K;exports.default=mr;exports.defaultFallback=v;exports.errorRule=ir;exports.isSuccess=lr;exports.rules=ar;exports.run=O;exports.runAll=W;exports.runAllOrThrow=J;exports.toResultError=N;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var j=Object.defineProperty;var ee=(e,r,t)=>r in e?j(e,r,{enumerable:true,configurable:true,writable:true,value:t}):e[r]=t;var l=(e,r,t)=>ee(e,typeof r!="symbol"?r+"":r,t);var E=class extends Error{constructor(t,n){super(t);l(this,"cause");l(this,"meta");l(this,"status");l(this,"timestamp");this.timestamp=new Date,this.name=this.constructor.name,this.cause=n?.cause,this.meta=n?.meta,this.status=n?.status,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor);}is(t){return this.code===t}withMeta(t){return Object.assign(this,{meta:t})}withStatus(t){return Object.assign(this,{status:t})}withCause(t){return Object.assign(this,{cause:t})}toJSON(){return {name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),cause:this.cause,stack:this.stack}}},S=class extends E{constructor(t,n){super(`Operation timed out after ${t}ms`,{cause:n});l(this,"code","TIMEOUT");}};var g=class extends E{constructor(t,n){super(`Circuit breaker is open, reset after ${t}ms`,{cause:n});l(this,"code","CIRCUIT_OPEN");}},P=class extends E{constructor(t,n,o){super(t,{cause:o,meta:{validationErrors:n}});this.validationErrors=n;l(this,"code","VALIDATION");}};var N=class extends E{constructor(t,n){super(t,{cause:n});l(this,"code","UNKNOWN");}};var b=e=>{if(e<0||!Number.isFinite(e))throw new Error(`Invalid milliseconds: must be a non-negative finite number, got ${e}`);return e},k=e=>{if(e<0||!Number.isInteger(e))throw new Error(`Invalid retry count: must be a non-negative integer, got ${e}`);return e},B=e=>{if(e<1||!Number.isInteger(e))throw new Error(`Invalid concurrency limit: must be a positive integer, got ${e}`);return e},re=e=>{if(e<0||e>100||!Number.isFinite(e))throw new Error(`Invalid percentage: must be between 0 and 100, got ${e}`);return e},te=e=>{if(!Number.isInteger(e)||e<100||e>599)throw new Error(`Invalid status code: must be an integer between 100-599, got ${e}`);return e};var D=class{constructor(r){l(this,"state");l(this,"config");this.config={failureThreshold:k(r.failureThreshold),resetTimeout:b(r.resetTimeout),halfOpenRequests:k(r.halfOpenRequests),shouldCountAsFailure:r.shouldCountAsFailure},this.state={state:"closed",failureCount:0,halfOpenCount:0};}async canExecute(){if(this.updateStateIfNeeded(),this.state.state==="open")return false;if(this.state.state==="half-open"){if(this.state.halfOpenCount>=this.config.halfOpenRequests)return false;this.state={...this.state,halfOpenCount:this.state.halfOpenCount+1};}return true}async recordSuccess(){switch(this.state.state){case "closed":this.state={...this.state,failureCount:0};break;case "half-open":this.state={state:"closed",failureCount:0,halfOpenCount:0};break;}}async recordFailure(r){if(!(this.config.shouldCountAsFailure?.(r)??true))return;let n=new Date;switch(this.state.state){case "closed":{let o=this.state.failureCount+1;o>=this.config.failureThreshold?this.state={state:"open",failureCount:o,halfOpenCount:0,lastFailureTime:n,nextAttemptTime:new Date(n.getTime()+this.config.resetTimeout)}:this.state={...this.state,failureCount:o,lastFailureTime:n};break}case "half-open":this.state={state:"open",failureCount:this.state.failureCount+1,halfOpenCount:0,lastFailureTime:n,nextAttemptTime:new Date(n.getTime()+this.config.resetTimeout)};break;case "open":this.state={...this.state,lastFailureTime:n,nextAttemptTime:new Date(n.getTime()+this.config.resetTimeout)};break}}getState(){return this.updateStateIfNeeded(),{...this.state,canExecute:this.state.state!=="open"}}createOpenError(){let r=this.state.nextAttemptTime?b(Math.max(0,this.state.nextAttemptTime.getTime()-Date.now())):this.config.resetTimeout;return new g(r)}forceState(r){this.state={state:r,failureCount:0,halfOpenCount:0};}reset(){this.state={state:"closed",failureCount:0,halfOpenCount:0};}updateStateIfNeeded(){this.state.state==="open"&&this.state.nextAttemptTime&&new Date>=this.state.nextAttemptTime&&(this.state={...this.state,state:"half-open",halfOpenCount:0});}};var H=(e,r)=>t=>{for(let n of e){let o=n(t);if(o!==null)return o}return r(t)},$=e=>r=>r instanceof E?r:r instanceof Error?new e(r.message,r):typeof r=="string"?new e(r):new e("Unknown error occurred",r);var ne=e=>{if(typeof e!="object"||e===null)return false;let r=e;return typeof r.status=="number"||typeof r.statusCode=="number"},oe=e=>{if(typeof e!="object"||e===null)return false;let r=e;return typeof r.code=="string"&&r.code.length>0},se=e=>{if(e instanceof Error){if(e.name==="TypeError")return true;let r=e.message.toLowerCase();if(r.includes("fetch")&&r.includes("failed")||r.includes("network"))return true}if(oe(e)){let r=(e.code??"").toUpperCase();return r==="ECONNRESET"||r==="ECONNREFUSED"||r==="ETIMEDOUT"||r==="ENOTFOUND"||r==="EAI_AGAIN"}return false},M=class{constructor(r){this.predicate=r;}toCode(r){return new v(this.predicate,r)}toError(r){return t=>{if(!this.predicate(t))return null;let n=r(t),o=n.code;class s extends E{constructor(){super(n.message,{cause:n.cause??t,meta:n.meta,status:n.status});l(this,"code",o);}}return new s}}},v=class{constructor(r,t){this.predicate=r;this.errorCode=t;}with(r){return t=>{if(!this.predicate(t))return null;let n=r(t),o=this.errorCode;class s extends E{constructor(){super(n.message,{cause:n.cause,meta:n.meta,status:n.status});l(this,"code",o);}}return new s}}},f={when:e=>new M(e),instance:e=>new M(r=>r instanceof e),code:e=>({for:r=>new v(r,e)}),string:(e,r)=>({when:t=>f.when(t).toCode(r).with(n=>({message:n===e?e:`${r}: ${n}`,cause:n}))}),httpStatus:(e,r)=>({for:t=>f.when(t).toCode(r??`HTTP_${e}`).with(n=>({message:`HTTP ${e} error`,cause:n}))})};var x={typed:(e=>e instanceof E?e:null),abort:f.when(e=>e instanceof DOMException&&e.name==="AbortError").toCode("ABORTED").with(e=>({message:e.message||"Operation was aborted",cause:e})),timeout:f.when(e=>e instanceof Error&&e.name==="TimeoutError").toCode("TIMEOUT").with(e=>({message:e.message||"Operation timed out",cause:e})),network:f.when(e=>se(e)).toCode("NETWORK").with(e=>({message:(e.message||"Network error"),cause:e})),http:f.when(e=>{if(!ne(e))return false;let r=e,t=r.status??r.statusCode;return typeof t=="number"&&t>=400}).toCode("HTTP").with(e=>{let r=e.status??e.statusCode;return {message:e.message||`HTTP ${r??"error"} error`,cause:e,status:typeof r=="number"?r:void 0}}),unknown:f.when(e=>e instanceof Error&&!(e instanceof E)).toCode("UNKNOWN").with(e=>({message:e.message||"Unknown error occurred",cause:e}))};var ae=[x.typed,x.abort,x.timeout,x.http,x.network,x.unknown];var ie={when:e=>f.when(e),instance:e=>f.instance(e)},V=ae;f.when(e=>e instanceof g).toCode("CIRCUIT_OPEN").with(e=>({message:e.message,cause:e}));f.when(e=>e instanceof P).toCode("VALIDATION").with(e=>({message:e.message,cause:e}));var ue={fixed:e=>({type:"fixed",delay:e}),exponential:(e,r=2,t)=>({type:"exponential",base:e,factor:r,maxDelay:t}),fibonacci:(e,r)=>({type:"fibonacci",base:e,maxDelay:r}),custom:e=>({type:"custom",calculate:e})},W=(e,r,t)=>{switch(e.type){case "fixed":return e.delay;case "exponential":{let n=e.base*e.factor**(Number(r)-1);return e.maxDelay?Math.min(n,e.maxDelay):n}case "fibonacci":{let n=e.base*ce(Number(r));return e.maxDelay?Math.min(n,e.maxDelay):n}case "custom":return e.calculate(r,t);default:return e}},ce=e=>{if(e<=1)return 1;let r=1,t=1;for(let n=2;n<=e;n++){let o=r+t;r=t,t=o;}return t};var J=(e,r)=>new Promise((t,n)=>{if(r?.aborted){n(new DOMException("Aborted","AbortError"));return}let o=i=>{r&&i&&r.removeEventListener("abort",i);},s,a=()=>{s&&clearTimeout(s),o(a),n(new DOMException("Aborted","AbortError"));};s=setTimeout(()=>{o(a),t();},e),r?.addEventListener("abort",a,{once:true});});var le=e=>{if(e.toError)return e.toError;let r=e.rulesMode??"extend",t=e.rules??[],n=V,o=e.fallback??(a=>$(N)(a)),s=r==="replace"?t:[...t,...n];return H(s,o)},L=class e{constructor(r={}){l(this,"circuitBreaker");l(this,"config");l(this,"lastCircuitState");let{rules:t,rulesMode:n,fallback:o,toError:s,mapError:a,...i}=r,p=le(r),u={...i,errorHandling:{normalizer:p,mapError:a}};this.config=u,u.circuitBreaker&&(this.circuitBreaker=new D(u.circuitBreaker),this.lastCircuitState=this.circuitBreaker.getState().state);}async execute(r,t={}){let n={...this.config,...t};if(this.circuitBreaker){let s=this.lastCircuitState??this.circuitBreaker.getState().state,a=await this.circuitBreaker.canExecute(),i=this.circuitBreaker.getState().state;if(s!==i)try{n.hooks?.onCircuitStateChange?.(s,i);}catch{}if(this.lastCircuitState=i,!a)return {type:"failure",ok:false,data:null,error:this.circuitBreaker.createOpenError(),metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,retryHistory:[]}}}let o=await me(r,n);if(this.circuitBreaker){let s=this.lastCircuitState??this.circuitBreaker.getState().state;o.ok?await this.circuitBreaker.recordSuccess():await this.circuitBreaker.recordFailure(o.error);let a=this.circuitBreaker.getState().state;if(s!==a)try{n.hooks?.onCircuitStateChange?.(s,a);}catch{}this.lastCircuitState=a;}return o}async executeOrThrow(r,t={}){let n=await this.execute(r,t);if(n.ok)return n.data;throw n.error}async executeAll(r,t={}){let n={...this.config,...t},o=n.concurrency??Number.POSITIVE_INFINITY,s=Number.isFinite(o)?Number(B(o)):Number.POSITIVE_INFINITY,a=new Array(r.length),i=0,p=async()=>{for(;;){let h=i;if(i++,h>=r.length)return;let y=r[h];if(!y)return;a[h]=await this.execute(y,n);}},u=Array.from({length:Math.min(s,r.length)},()=>p());return await Promise.all(u),a}async executeAllOrThrow(r,t={}){let n=await this.executeAll(r,t);for(let o of n)if(!o.ok)throw o.error;return n.map(o=>{if(!o.ok)throw o.error;return o.data})}getCircuitBreakerState(){return this.circuitBreaker?.getState()}resetCircuitBreaker(){this.circuitBreaker?.reset();}getConfig(){return {...this.config}}withConfig(r){let{errorHandling:t,...n}=this.config,{errorHandling:o,...s}=r,a=o?.normalizer??t.normalizer,i=o?.mapError??t.mapError;return new e({...n,...s,toError:a,mapError:i})}withErrorType(r={}){return new e(r)}};function K(e){return new L(e)}async function me(e,r){let{signal:t,ignoreAbort:n=true,timeout:o,retry:s,errorHandling:a,hooks:i,logger:p}=r,u=(A,...c)=>{try{A?.(...c);}catch{}},h,y=0,R=0,T=[],O=Date.now(),{signal:C,cleanup:G}=pe(t);try{if(C.aborted){u(i?.onAbort,C);let c=a.normalizer(new DOMException("Aborted","AbortError")),m=a.mapError?a.mapError(c):c;return {type:"aborted",ok:!1,data:null,error:m,metrics:{totalAttempts:y,totalRetries:R,totalDuration:Date.now()-O,lastError:m,retryHistory:T}}}let A=async c=>{y=c;try{let m=e({signal:C}),w=o?await de(m,o,C):await m;return u(i?.onSuccess,w),u(p?.info,`Task succeeded on attempt ${c}`),w}catch(m){let w=a.normalizer(m),d=a.mapError?a.mapError(w):w;h=d,d.code==="ABORTED"&&u(i?.onAbort,C),n&&d.code==="ABORTED"||(u(i?.onError,d),u(p?.error,`Task failed on attempt ${c}`,d));let Q=k(s?.maxRetries??0);if(c<=Number(Q)){let _=s?.shouldRetry,X={totalAttempts:Number(y),elapsedTime:Date.now()-O,startTime:new Date(O),lastDelay:T[T.length-1]?.delay?Number(T[T.length-1]?.delay):void 0};if(!_||_(c,d,X)){let Z=s?W(s.strategy,c,d):0,F=Ee(Z,s?.jitter),z=b(F);return T.push({attempt:c,error:d,delay:z,timestamp:new Date}),u(i?.onRetry,c,d,F),u(p?.info,`Retrying in ${F}ms (attempt ${c+1})`),await J(z,C),A(c+1)}}throw d}};try{let c=await A(1);R=y>0?Number(y)-1:0;let m={totalAttempts:y,totalRetries:R,totalDuration:Date.now()-O,retryHistory:T};return u(i?.onFinally,m),{type:"success",ok:!0,data:c,error:null,metrics:m}}catch(c){let m=h??a.normalizer(c),w=m.code==="TIMEOUT"?"timeout":m.code==="ABORTED"?"aborted":"failure";R=y>0?Number(y)-1:0;let d={totalAttempts:y,totalRetries:R,totalDuration:Date.now()-O,lastError:m,retryHistory:T};return u(i?.onFinally,d),{type:w,ok:!1,data:null,error:m,metrics:d}}}finally{G();}}function pe(e){let r=new AbortController;if(!e)return {signal:r.signal,cleanup:()=>{}};let t=()=>r.abort();return e.aborted?(t(),{signal:r.signal,cleanup:()=>{}}):(e.addEventListener("abort",t,{once:true}),{signal:r.signal,cleanup:()=>e.removeEventListener("abort",t)})}async function de(e,r,t){return new Promise((n,o)=>{if(t?.aborted){o(new DOMException("Aborted","AbortError"));return}let s=false,a=setTimeout(()=>{s=true,p(),o(new S(b(r)));},r),i=()=>{s||(s=true,p(),o(new DOMException("Aborted","AbortError")));},p=()=>{clearTimeout(a),t?.removeEventListener("abort",i);};t?.addEventListener("abort",i,{once:true}),e.then(u=>{s||(s=true,p(),n(u));},u=>{s||(s=true,p(),o(u));});})}function Ee(e,r){if(!r||r.type==="none"||e<=0)return e;switch(r.type){case "full":{let t=Number(r.ratio)/100,n=Math.max(0,Number(e)*(1-t)),o=Number(e);return n+Math.random()*(o-n)}case "equal":{let t=Number(r.ratio)/100,n=Number(e)*t/2;return Number(e)-n+Math.random()*n}case "custom":return r.calculate(e);default:return r}}function q(e){let r=K(e);return {run:(t,n)=>r.execute(t,n),execute:(t,n)=>r.execute(t,n),runOrThrow:(t,n)=>r.executeOrThrow(t,n),executeOrThrow:(t,n)=>r.executeOrThrow(t,n),runAll:(t,n)=>r.executeAll(t,n),executeAll:(t,n)=>r.executeAll(t,n),runOrThrowAll:(t,n)=>r.executeAllOrThrow(t,n),executeOrThrowAll:(t,n)=>r.executeAllOrThrow(t,n)}}var Ze=q,U,I=()=>(U||(U=q()),U),ye=(e,r)=>I().execute(e,r),fe=(e,r)=>I().executeOrThrow(e,r),xe=(e,r)=>I().executeAll(e,r),Y=(e,r)=>I().executeOrThrowAll(e,r),je=Y,er=ye,rr=fe,tr=xe,nr=Y;exports.RetryStrategies=ue;exports.asConcurrencyLimit=B;exports.asMilliseconds=b;exports.asPercentage=re;exports.asRetryCount=k;exports.asStatusCode=te;exports.default=Ze;exports.errorRule=ie;exports.execute=ye;exports.executeAll=xe;exports.executeAllOrThrow=Y;exports.executeOrThrow=fe;exports.executeOrThrowAll=je;exports.run=er;exports.runAll=tr;exports.runOrThrow=rr;exports.runOrThrowAll=nr;exports.trybox=q;//# 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/runAll.ts","../src/runner/runAllOrThrow.ts","../src/error/core.ts","../src/error/builder.ts","../src/runner/runner.ts","../src/index.ts"],"names":["createNormalizer","rules","fallback","err","r","out","defaultFallback","toResultError","validateOptions","options","sleep","ms","resolve","clamp","n","min","max","resolveRetryDelay","retryDelay","attempt","defaultBaseDelay","backoffStrategy","maxDelay","base","backoff","computeBackoffDelay","applyJitter","delay","jitter","rng","ratio","strategy","v","b","a","prev","curr","i","next","run","fn","toError","mapError","onError","onSuccess","onFinally","ignoreAbort","retries","shouldRetry","timeout","signal","onRetry","logger","onAbort","mapped","startedAt","lastError","lastDelay","controller","timeoutId","abortPromise","_","reject","data","e","totalDuration","metrics","nextAttempt","context","decision","isSuccess","runAll","tasks","concurrency","mode","runOptions","limit","results","nextIndex","aborted","setResult","markSkipped","t","worker","task","runAllOrThrow","firstError","CircuitOpenError","circuitOpen","abort","httpStatus","obj","status","aggregate","string","message","getDefaultRules","ErrorRuleBuilder","matcher","mapper","errorRule","ctor","predicate","composeMapError","local","createRunner","opts","rulesMode","customToError","defaultMapError","defaultCircuitBreaker","effectiveRules","defaultRulesList","failureCount","openUntil","halfOpenRequired","cb","now","fns","trybox"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ResultError, Rule } from \"./types\";\n\nexport function createNormalizer<E extends ResultError>(\n rules: Rule<E>[],\n fallback: (err: unknown) => E\n) {\n return (err: unknown): E => {\n for (const r of rules) {\n const out = r(err);\n if (out) return out;\n }\n return fallback(err);\n };\n}\n\n// General fallback (without depending on fetch / http)\nexport function defaultFallback(err: unknown): ResultError {\n if (err instanceof Error) {\n // In browsers, network errors sometimes fall as TypeError (fetch),\n // but this is not 100% universal; we treat it as best-effort.\n const code = err.name === \"TypeError\" ? \"NETWORK\" : \"UNKNOWN\";\n return { code, message: err.message || \"Something went wrong\", cause: err };\n }\n return { code: \"UNKNOWN\", message: \"Something went wrong\", cause: err };\n}\n\n// \"default\" normalizer that includes abort rule (very useful in UI)\nexport function toResultError(err: unknown): ResultError {\n // AbortError (browser / fetch / AbortController)\n if (err instanceof DOMException && err.name === \"AbortError\") {\n return { code: \"ABORTED\", message: \"Request cancelled\", cause: err };\n }\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n return { code: \"TIMEOUT\", message: \"Request timed out\", cause: err };\n }\n return defaultFallback(err);\n}\n","import type { ResultError } from \"./error/types\";\n\nexport type RetryDelayFn<E> = (attempt: number, err: E) => number;\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport type Jitter =\n | boolean\n | number // ratio 0..1\n | { ratio?: number; mode?: \"full\" | \"equal\"; rng?: () => number };\n\n/**\n * Backoff strategy to calculate the delay between retries.\n * - \"linear\": uses the base delay as is in each attempt.\n * - \"exponential\": multiplies the delay by 2^(attempt-1).\n * - \"fibonacci\": multiplies by F(attempt) (classic Fibonacci sequence).\n * - function: custom function based on the attempt number.\n */\nexport type BackoffStrategy =\n | \"linear\"\n | \"exponential\"\n | \"fibonacci\"\n | ((attempt: number) => number);\n\n/**\n * Retry options for `run`, `runAll` and `runAllOrThrow`.\n */\nexport type RetryOptions<E extends ResultError = ResultError> = {\n /**\n * Number of retries to perform (does not include the initial attempt).\n * @default 0\n */\n retries?: number;\n /**\n * Delay between attempts:\n * - number: fixed delay (ms)\n * - () => number: lazy delay (evaluated per attempt)\n * - (attempt, err) => number: delay based on attempt and last error\n * @default 0 or a default baseDelay if retries are present\n */\n retryDelay?: number | (() => number) | RetryDelayFn<E>;\n /**\n * Decides whether to retry given a specific error.\n * Can be synchronous or asynchronous.\n * Receives the next attempt number and a context with accumulated metrics.\n * @default () => true\n */\n shouldRetry?: (\n attempt: number,\n error: E,\n context: RetryContext\n ) => boolean | Promise<boolean>;\n /**\n * Random jitter to avoid thundering herd:\n * - true: default ratio 0.5\n * - false: no jitter\n * - number: ratio 0..1\n * - object: full control (ratio, mode, rng)\n * @default 0.5\n */\n jitter?: Jitter;\n /**\n * Backoff strategy to apply on the calculated delay.\n * @default \"linear\"\n */\n backoffStrategy?: BackoffStrategy;\n /**\n * Upper limit of the delay after backoff and before jitter.\n * @default undefined (no limit)\n */\n maxDelay?: number;\n};\n\n/**\n * Context for `shouldRetry` with accumulated metrics of the current attempt.\n */\nexport type RetryContext = {\n /** Total attempts (including the next retry). */\n totalAttempts: number;\n /** Elapsed time in ms since the start of `run`. */\n elapsedTime: number;\n /** Timestamp (ms) when the execution started. */\n startTime: number;\n /** The delay (ms) applied before the last attempt, if any. */\n lastDelay?: number;\n};\n\n/**\n * Main options for `run` and extended to `runAll`/`runAllOrThrow`.\n */\nexport type RunOptions<\n T,\n E extends ResultError = ResultError\n> = RetryOptions<E> & {\n /**\n * Normalizes an unknown error value to your type `E`.\n * If not provided, a default normalizer is used.\n */\n toError?: (err: unknown) => E;\n /**\n * Optional transformation applied after `toError`.\n * Useful for adjusting messages, codes, or adding metadata.\n */\n mapError?: (error: E) => E;\n /**\n * Callback on failure (not called if `ignoreAbort` and error is ABORTED).\n */\n onError?: (error: E) => void;\n /**\n * Callback on success.\n */\n onSuccess?: (data: T) => void;\n /**\n * Callback that always executes at the end (success or error).\n */\n onFinally?: () => void;\n /**\n * If true, aborts (ABORTED) are not considered fatal errors:\n * `onError` is not called and `{ ok: false, error }` is returned.\n * @default true\n */\n ignoreAbort?: boolean;\n /**\n * Signal for native work cancellation.\n * If aborted, it cuts with `AbortError`.\n */\n signal?: AbortSignal;\n /**\n * Maximum timeout in ms for the work; expires with `TimeoutError`.\n */\n timeout?: number;\n /**\n * Retry observability: receives attempt, error, and next delay.\n */\n onRetry?: (attempt: number, error: E, nextDelay: number) => void;\n /**\n * Optional structured logger for debug and errors.\n */\n logger?: {\n debug?: (msg: string, meta?: unknown) => 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\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<E extends ResultError = ResultError> = {\n totalAttempts: number;\n totalRetries: number;\n totalDuration: number;\n lastError?: E;\n};\n\nexport type RunResult<T, E extends ResultError = ResultError> =\n | { ok: true; data: T; error: null; metrics?: Metrics<E> }\n | { ok: false; data: null; error: E; metrics?: Metrics<E> };\n\n/**\n * Validates common execution/retry options.\n */\nexport function validateOptions<T, E extends ResultError = ResultError>(\n options: RunOptions<T, E>\n): void {\n if (options.retries != null && options.retries < 0) {\n throw new Error(\"retries must be >= 0\");\n }\n if (options.timeout != null && options.timeout <= 0) {\n throw new Error(\"timeout must be > 0\");\n }\n if (options.maxDelay != null && options.maxDelay < 0) {\n throw new Error(\"maxDelay must be >= 0\");\n }\n // const cb = options.circuitBreaker;\n // if (cb) {\n // if (cb.failureThreshold < 1) {\n // throw new Error(\"failureThreshold must be >= 1\");\n // }\n // if (cb.resetTimeout <= 0) {\n // throw new Error(\"resetTimeout must be > 0\");\n // }\n // if (cb.halfOpenRequests != null && cb.halfOpenRequests < 1) {\n // throw new Error(\"halfOpenRequests must be >= 1\");\n // }\n // }\n}\n","import type { Jitter, RetryDelayFn, BackoffStrategy } from \"./types\";\n\nexport const sleep = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function clamp(n: number, min: number, max: number) {\n return Math.max(min, Math.min(max, n));\n}\n\nexport function resolveRetryDelay<E>(\n retryDelay: number | RetryDelayFn<E> | undefined,\n attempt: number,\n err: E,\n defaultBaseDelay: number,\n backoffStrategy?: BackoffStrategy,\n maxDelay?: number\n): number {\n let base =\n typeof retryDelay === \"function\"\n ? (retryDelay as RetryDelayFn<E>)(attempt, err)\n : typeof retryDelay === \"number\"\n ? (retryDelay as number)\n : typeof retryDelay === \"undefined\"\n ? defaultBaseDelay\n : defaultBaseDelay;\n\n const backoff = computeBackoffDelay(\n backoffStrategy ?? \"linear\",\n base,\n attempt\n );\n\n const out = maxDelay != null ? clamp(backoff, 0, maxDelay) : backoff;\n return Number.isFinite(out) ? out : 0;\n}\n\nexport function applyJitter(delay: number, jitter: Jitter | undefined): number {\n if (delay <= 0 || !jitter) return delay;\n\n const rng =\n typeof jitter === \"object\" && jitter.rng ? jitter.rng : Math.random;\n\n // reasonable defaults\n const ratio =\n typeof jitter === \"number\"\n ? jitter\n : jitter === true\n ? 0.5\n : typeof jitter === \"object\" && jitter.ratio != null\n ? jitter.ratio\n : 0.5;\n\n const r = clamp(ratio, 0, 1);\n\n const mode = typeof jitter === \"object\" && jitter.mode ? jitter.mode : \"full\";\n\n // \"full\": 0..delay*r extra (recommended to avoid thundering herd)\n // \"equal\": delay*(1-r) + random(0..delay*r)\n if (mode === \"equal\") {\n return delay * (1 - r) + rng() * delay * r;\n }\n\n // full jitter: add random extra up to delay*r\n return delay + rng() * delay * r;\n}\n\nexport function computeBackoffDelay(\n strategy: BackoffStrategy,\n base: number,\n attempt: number\n): number {\n if (typeof strategy === \"function\") {\n const v = strategy(attempt);\n return v >= 0 ? v : 0;\n }\n const b = base >= 0 ? base : 0;\n const a = attempt >= 1 ? attempt : 1;\n if (strategy === \"linear\") return b;\n if (strategy === \"exponential\") return b * Math.pow(2, a - 1);\n if (strategy === \"fibonacci\") {\n if (a <= 2) return b;\n let prev = 1;\n let curr = 1;\n for (let i = 3; i <= a; i++) {\n const next = prev + curr;\n prev = curr;\n curr = next;\n }\n return b * curr;\n }\n return b;\n}\n","import type { ResultError } from \"../error/types\";\nimport { toResultError as defaultToResultError } from \"../error/normalize\";\nimport type { MaybePromise, RunOptions, RunResult } from \"../types\";\nimport { validateOptions } from \"../types\";\nimport { applyJitter, resolveRetryDelay, sleep } from \"../utils\";\n\n/**\n * Executes an async operation and returns a Result instead of throwing.\n *\n * Errors are normalized into an `ResultError` (or a custom error type `E`)\n * using the provided `toError` function.\n *\n * This utility is framework-agnostic and works in browsers, Node.js,\n * React effects, and any async context.\n */\nexport async function run<T, E extends ResultError = ResultError>(\n fn: (ctx?: { signal: AbortSignal }) => MaybePromise<T>,\n options: RunOptions<T, E> = {}\n): Promise<RunResult<T, E>> {\n const {\n toError = defaultToResultError as unknown as (err: unknown) => E,\n mapError,\n onError,\n onSuccess,\n onFinally,\n ignoreAbort = true,\n retries = 0,\n retryDelay,\n shouldRetry = () => true,\n jitter = { ratio: 0.5, mode: \"full\" },\n backoffStrategy,\n maxDelay,\n timeout,\n signal,\n onRetry,\n logger,\n onAbort,\n } = options;\n\n const defaultBaseDelay = retries > 0 ? 300 : 0;\n\n validateOptions(options);\n\n if (signal?.aborted) {\n try {\n onAbort?.(signal);\n } finally {\n const err = toError(new DOMException(\"Aborted\", \"AbortError\"));\n const mapped = mapError ? mapError(err) : err;\n if (!ignoreAbort) {\n onError?.(mapped);\n }\n onFinally?.();\n return {\n ok: false,\n data: null,\n error: mapped,\n metrics: {\n totalAttempts: 0,\n totalRetries: 0,\n totalDuration: 0,\n lastError: mapped,\n },\n };\n }\n }\n\n const startedAt = Date.now();\n let attempt = 0;\n let lastError: E | undefined;\n let lastDelay = 0;\n\n while (true) {\n const controller = new AbortController();\n if (signal) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n } else {\n signal.addEventListener(\n \"abort\",\n () => controller.abort(signal.reason),\n {\n once: true,\n }\n );\n }\n }\n\n let timeoutId: any = null;\n if (timeout && timeout > 0) {\n timeoutId = setTimeout(() => {\n controller.abort(new DOMException(\"Timeout\", \"TimeoutError\"));\n }, timeout);\n }\n\n try {\n const abortPromise = new Promise<never>((_, reject) => {\n if (controller.signal.aborted) {\n reject(controller.signal.reason);\n } else {\n controller.signal.addEventListener(\n \"abort\",\n () => reject(controller.signal.reason),\n { once: true }\n );\n }\n });\n\n const data = await Promise.race([\n fn({ signal: controller.signal }),\n abortPromise,\n ]);\n\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 + 1,\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 startTime: startedAt,\n lastDelay: lastDelay > 0 ? lastDelay : undefined,\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 lastDelay = delay;\n\n onRetry?.(attempt, err, delay);\n logger?.debug?.(\"run:retry\", { attempt, delay });\n if (delay > 0) await sleep(delay);\n continue;\n }\n\n // Final failure or aborted\n try {\n onError?.(err);\n } catch (e) {\n logger?.error?.(\"run:onError failed\", toError(e));\n }\n try {\n onFinally?.();\n } catch (e) {\n logger?.error?.(\"run:onFinally failed\", toError(e));\n }\n const totalDuration = Date.now() - startedAt;\n const metrics = {\n totalAttempts: attempt + 1,\n totalRetries: attempt,\n totalDuration,\n lastError: err,\n };\n logger?.error?.(\"run:error\", err);\n return { ok: false, data: null, error: err, metrics };\n }\n }\n}\n","import { run } from \"./run\";\nimport type { ResultError } from \"../error/types\";\nimport type { MaybePromise, RunOptions, RunResult } from \"../types\";\nimport { validateOptions } from \"../types\";\n\n/**\n * Discriminated result per item in `runAll`:\n * - \"ok\": successful task with `data`\n * - \"error\": failed task with `error`\n * - \"skipped\": task not executed due to cancellation/fail-fast/concurrency\n */\nexport type RunAllItemResult<T, E extends ResultError = ResultError> =\n | { status: \"ok\"; ok: true; data: T; error: null }\n | { status: \"error\"; ok: false; data: null; error: E }\n | { status: \"skipped\"; ok: false; data: null; error: null };\n\n/** Helper to discriminate successful results. */\nexport type SuccessResult<T> = Extract<\n RunAllItemResult<T, any>,\n { status: \"ok\" }\n>;\n/** Helper to discriminate error results. */\nexport type ErrorResult<E> = Extract<\n RunAllItemResult<any, E extends ResultError ? E : ResultError>,\n { status: \"error\" }\n>;\n\n/** Type guard that detects `status: \"ok\"` with `data` typing. */\nexport const isSuccess = <T, E extends ResultError = ResultError>(\n r: RunAllItemResult<T, E>\n): r is SuccessResult<T> => r.status === \"ok\";\n\nexport type RunAllOptions<T, E extends ResultError = ResultError> = RunOptions<\n T,\n E\n> & {\n /**\n * Maximum number of concurrent tasks to run.\n * @default Infinity\n */\n concurrency?: number;\n\n /**\n * Execution mode regarding errors.\n * - \"settle\": Run all tasks (default).\n * - \"fail-fast\": Stop starting new tasks if one fails.\n * @default \"settle\"\n */\n mode?: \"settle\" | \"fail-fast\";\n};\n\nexport async function runAll<T, E extends ResultError = ResultError>(\n tasks: Array<() => MaybePromise<T>>,\n options: RunAllOptions<T, E> = {}\n): Promise<RunAllItemResult<T, E>[]> {\n const { concurrency = Infinity, mode = \"settle\", ...runOptions } = options;\n validateOptions(runOptions);\n\n if (tasks.length === 0) return [];\n\n const limit = Number.isFinite(concurrency)\n ? Math.max(1, Math.floor(concurrency))\n : Infinity;\n\n const results: RunAllItemResult<T, E>[] = new Array(tasks.length);\n\n let nextIndex = 0;\n let aborted = false;\n\n const setResult = (i: number, r: RunResult<T, E>) => {\n results[i] = r.ok\n ? { status: \"ok\", ok: true, data: r.data, error: null }\n : { status: \"error\", ok: false, data: null, error: r.error };\n };\n\n const markSkipped = () => {\n for (let i = 0; i < tasks.length; i++) {\n if (results[i]) continue;\n results[i] = {\n status: \"skipped\",\n ok: false,\n data: null,\n error: null,\n };\n }\n };\n\n // Run all in parallel if unlimited or limit >= count\n if (limit >= tasks.length) {\n const rs = await Promise.all(tasks.map((t) => run<T, E>(t, runOptions)));\n rs.forEach((r, i) => {\n setResult(i, r);\n });\n return results;\n }\n\n const worker = async () => {\n while (true) {\n if (aborted) return;\n\n const i = nextIndex++;\n if (i >= tasks.length) return;\n\n const task = tasks[i];\n if (!task) continue; // skip if task is undefined\n\n const r = await run<T, E>(task, runOptions);\n setResult(i, r);\n\n if (!r.ok) {\n if (mode === \"fail-fast\") {\n aborted = true;\n return;\n }\n }\n }\n };\n\n await Promise.all(\n Array.from({ length: Math.min(limit, tasks.length) }, () => worker())\n );\n\n markSkipped();\n return results;\n}\n","import { run } from \"./run\";\nimport type { ResultError } from \"../error/types\";\nimport type { RunOptions } from \"../types\";\nimport { validateOptions } from \"../types\";\nimport type { MaybePromise } from \"../types\";\n\n/**\n * Options for `runAllOrThrow`:\n * - Inherits all options from `RunOptions`\n * - `concurrency`: limit of simultaneous tasks; if one fails, it throws\n */\nexport type RunAllOrThrowOptions<\n T,\n E extends ResultError = ResultError\n> = RunOptions<T, E> & {\n /**\n * Maximum number of concurrent tasks to run.\n * @default Infinity\n */\n concurrency?: number;\n};\n\nexport async function runAllOrThrow<T, E extends ResultError = ResultError>(\n tasks: Array<() => MaybePromise<T>>,\n options: RunAllOrThrowOptions<T, E> = {}\n): Promise<T[]> {\n const { concurrency = Infinity, ...runOptions } = options;\n validateOptions(runOptions);\n\n if (tasks.length === 0) return [];\n\n const limit = Number.isFinite(concurrency)\n ? Math.max(1, Math.floor(concurrency))\n : Infinity;\n\n const data: T[] = new Array(tasks.length);\n\n // Run all in parallel if unlimited or limit >= count\n if (limit >= tasks.length) {\n await Promise.all(\n tasks.map(async (t, i) => {\n const r = await run<T, E>(t, runOptions);\n if (!r.ok) throw r.error;\n data[i] = r.data;\n })\n );\n return data;\n }\n\n let nextIndex = 0;\n let aborted = false;\n let firstError: E | null = null;\n\n const worker = async () => {\n while (true) {\n if (aborted) return;\n\n const i = nextIndex++;\n if (i >= tasks.length) return;\n\n const task = tasks[i];\n if (!task) continue; // skip if task is undefined\n\n const r = await run<T, E>(task, runOptions);\n\n if (!r.ok) {\n firstError ??= r.error;\n aborted = true;\n return;\n }\n\n data[i] = r.data;\n }\n };\n\n await Promise.all(\n Array.from({ length: Math.min(limit, tasks.length) }, () => worker())\n );\n\n if (firstError) throw firstError;\n\n // Safety fill\n return data;\n}\n","import type { ResultError, Rule, InferErrorFromRules } from \"./types\";\n\nexport class CircuitOpenError extends Error {\n constructor() {\n super(\"Circuit open\");\n this.name = \"CircuitOpenError\";\n }\n}\n\nexport const circuitOpen: Rule<ResultError<\"CIRCUIT_OPEN\">> = (err) => {\n // console.log(\"Checking CircuitOpenError\", err, err instanceof CircuitOpenError);\n if (\n err instanceof CircuitOpenError ||\n (err instanceof Error && err.name === \"CircuitOpenError\")\n ) {\n return {\n code: \"CIRCUIT_OPEN\",\n message: \"Circuit open\",\n cause: err,\n };\n }\n return null;\n};\n\nexport const abort: Rule<ResultError<\"ABORTED\">> = (err) => {\n if (err instanceof DOMException && err.name === \"AbortError\") {\n return { code: \"ABORTED\", message: \"Request cancelled\", cause: err };\n }\n if (err instanceof Error && err.name === \"AbortError\") {\n return {\n code: \"ABORTED\",\n message: err.message || \"Request cancelled\",\n cause: err,\n };\n }\n return null;\n};\n\nexport const timeout: Rule<ResultError<\"TIMEOUT\">> = (err) => {\n if (err instanceof DOMException && err.name === \"TimeoutError\") {\n return { code: \"TIMEOUT\", message: \"Request timed out\", cause: err };\n }\n if (err instanceof Error && err.name === \"TimeoutError\") {\n return {\n code: \"TIMEOUT\",\n message: err.message || \"Request timed out\",\n cause: err,\n };\n }\n return null;\n};\n\nexport const httpStatus: Rule<ResultError<\"HTTP\">> = (err) => {\n if (typeof err === \"object\" && err !== null) {\n const obj = err as Record<string, unknown>;\n const status = obj.status ?? obj.statusCode;\n if (typeof status === \"number\") {\n return {\n code: \"HTTP\",\n message:\n typeof obj.message === \"string\"\n ? obj.message\n : `HTTP Error ${status}`,\n status,\n cause: err,\n };\n }\n }\n return null;\n};\n\nexport const aggregate: Rule<ResultError<\"UNKNOWN\", { errors: unknown[] }>> = (\n err\n) => {\n if (typeof AggregateError !== \"undefined\" && err instanceof AggregateError) {\n return {\n code: \"UNKNOWN\",\n message: err.message || \"Multiple errors occurred\",\n cause: err,\n meta: { errors: err.errors as unknown[] },\n };\n }\n return null;\n};\n\nexport const string: Rule<ResultError<\"UNKNOWN\">> = (err) => {\n if (typeof err === \"string\") {\n return { code: \"UNKNOWN\", message: err, cause: err };\n }\n return null;\n};\n\nexport const message: Rule<ResultError<\"UNKNOWN\">> = (err) => {\n if (\n typeof err === \"object\" &&\n err !== null &&\n \"message\" in err &&\n typeof (err as { message: unknown }).message === \"string\"\n ) {\n return {\n code: \"UNKNOWN\",\n message: (err as { message: string }).message,\n cause: err,\n };\n }\n return null;\n};\n\nexport const rules = {\n circuitOpen,\n abort,\n timeout,\n httpStatus,\n aggregate,\n string,\n message,\n} satisfies Record<string, Rule<ResultError>>;\n\nexport function getDefaultRules() {\n return [\n circuitOpen,\n abort,\n timeout,\n httpStatus,\n aggregate,\n string,\n message,\n ] as const;\n}\n\nexport const defaultRules = getDefaultRules();\n\nexport type DefaultRules = typeof defaultRules;\nexport type DefaultError = InferErrorFromRules<DefaultRules>;\n","import type { ResultError, Rule } from \"./types\";\n\nclass ErrorRuleBuilder<E> {\n constructor(private readonly matcher: (err: unknown) => err is E) {}\n\n toError<const Out extends ResultError>(mapper: (err: E) => Out): Rule<Out> {\n return (err: unknown) => {\n if (!this.matcher(err)) return null;\n return mapper(err);\n };\n }\n}\n\nexport const errorRule = {\n instance<E extends new (...args: any[]) => unknown>(ctor: E) {\n return new ErrorRuleBuilder<InstanceType<E>>(\n (err): err is InstanceType<E> => err instanceof ctor\n );\n },\n\n when<E = unknown>(predicate: (err: unknown) => err is E) {\n return new ErrorRuleBuilder<E>(predicate);\n },\n};\n","import type { ResultError, Rule, InferErrorFromRules } from \"../error/types\";\nimport {\n getDefaultRules,\n CircuitOpenError,\n type DefaultError,\n} from \"../error/core\";\nimport {\n createNormalizer,\n defaultFallback,\n toResultError,\n} from \"../error/normalize\";\nimport { run as baseRun } from \"./run\";\nimport type { MaybePromise, RunOptions, RunResult } from \"../types\";\nimport type { CircuitBreakerOptions } from \"../types\";\nimport {\n runAllOrThrow as baseRunAllOrThrow,\n type RunAllOrThrowOptions,\n} from \"./runAllOrThrow\";\nimport {\n runAll as baseRunAll,\n type RunAllItemResult,\n type RunAllOptions,\n} from \"./runAll\";\n\nexport type RulesMode = \"extend\" | \"replace\";\n\nexport type CreateRunnerOptions<E extends ResultError = ResultError> = {\n /**\n * Custom matchers to use for normalizing errors.\n * If not provided, the default matchers are used.\n */\n rules?: Rule<E>[];\n\n /**\n * How to treat provided rules in relation to default rules.\n * - \"extend\": Use default rules after custom rules (default).\n * - \"replace\": Use only custom rules (and fallback).\n */\n rulesMode?: RulesMode;\n\n /**\n * Custom fallback function to use for normalizing errors.\n * If not provided, the default fallback is used.\n */\n fallback?: (err: unknown) => E;\n\n /**\n * If you want a completely custom normalizer, you can provide it directly.\n * If set, `matchers` and `fallback` are ignored.\n */\n toError?: (err: unknown) => E;\n\n /** Default for run options */\n ignoreAbort?: boolean;\n\n /** Optional default mapper for all runs */\n mapError?: (error: E) => E;\n /**\n * Circuit breaker configuration (applies to all executions of the Runner).\n */\n circuitBreaker?: CircuitBreakerOptions;\n};\n\nconst composeMapError =\n <E>(base?: (e: E) => E, local?: (e: E) => E) =>\n (e: E) =>\n local ? local(base ? base(e) : e) : base ? base(e) : e;\n\nexport interface Runner<E extends ResultError> {\n run<T>(\n fn: () => Promise<T>,\n options?: RunOptions<T, E>\n ): Promise<RunResult<T, E>>;\n 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?: RunAllOrThrowOptions<T, E>\n ): Promise<T[]>;\n}\n\nexport function createRunner(\n opts?: Omit<CreateRunnerOptions<ResultError>, \"rules\">\n): Runner<ResultError>;\n\nexport function createRunner<const TRules extends readonly Rule<any>[]>(\n opts: {\n rules: TRules;\n rulesMode: \"replace\";\n } & Omit<\n CreateRunnerOptions<InferErrorFromRules<TRules>>,\n \"rules\" | \"rulesMode\"\n >\n): Runner<InferErrorFromRules<TRules>>;\n\nexport function createRunner<const TRules extends readonly Rule<any>[]>(\n opts: {\n rules: TRules;\n rulesMode?: \"extend\";\n } & Omit<\n CreateRunnerOptions<InferErrorFromRules<TRules> | DefaultError>,\n \"rules\" | \"rulesMode\"\n >\n): Runner<InferErrorFromRules<TRules> | DefaultError>;\n\nexport function createRunner<const TRules extends readonly Rule<any>[] = []>(\n opts: any = {}\n): any {\n type E = InferErrorFromRules<TRules>;\n\n const {\n rules = [],\n rulesMode = \"extend\",\n fallback = (e: unknown) => defaultFallback(e) as unknown as E,\n toError: customToError,\n ignoreAbort = true,\n mapError: defaultMapError,\n circuitBreaker: defaultCircuitBreaker,\n } = opts as CreateRunnerOptions<E>;\n\n let effectiveRules: Rule<E>[] = [];\n const defaultRulesList = (getDefaultRules() || []) as unknown as Rule<E>[];\n\n if (rules.length > 0) {\n if (rulesMode === \"extend\") {\n effectiveRules = [...rules, ...defaultRulesList];\n } else {\n effectiveRules = [...rules];\n }\n } else {\n // If no custom rules, and extend -> use default rules\n if (rulesMode === \"extend\") {\n effectiveRules = defaultRulesList;\n } else {\n effectiveRules = [];\n }\n }\n\n const toError =\n customToError ??\n (effectiveRules.length > 0\n ? createNormalizer<E>(effectiveRules, fallback)\n : (toResultError as unknown as (e: unknown) => E));\n\n let failureCount = 0;\n let openUntil: number | null = null;\n let halfOpenRequired: 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 = defaultCircuitBreaker;\n const now = Date.now();\n\n if (cb) {\n if (openUntil && now < openUntil) {\n const err = toError(new CircuitOpenError());\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 }\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\n if (!r.ok) {\n // Failure\n if (openUntil && Date.now() >= openUntil) {\n // Half-open failure -> Open immediately\n openUntil = Date.now() + cb.resetTimeout;\n halfOpenRequired = cb.halfOpenRequests ?? 1;\n failureCount = 0;\n } else if (!openUntil) {\n // Closed failure -> Count threshold\n failureCount++;\n if (failureCount >= cb.failureThreshold) {\n openUntil = Date.now() + cb.resetTimeout;\n halfOpenRequired = cb.halfOpenRequests ?? 1;\n }\n }\n } else {\n // Success\n if (openUntil && Date.now() >= openUntil) {\n // Half-open success\n if (halfOpenRequired && halfOpenRequired > 0) {\n halfOpenRequired--;\n }\n if (!halfOpenRequired || halfOpenRequired <= 0) {\n // Closed\n openUntil = null;\n failureCount = 0;\n halfOpenRequired = null;\n }\n } else {\n // Closed success -> Reset failure count\n failureCount = 0;\n }\n }\n return r;\n });\n },\n all<T>(\n fns: Array<() => MaybePromise<T>>,\n options: RunAllOptions<T, E> = {}\n ): Promise<RunAllItemResult<T, E>[]> {\n return baseRunAll(fns, {\n toError,\n ignoreAbort,\n ...options,\n mapError: composeMapError(defaultMapError, options.mapError),\n });\n },\n allOrThrow<T>(\n fns: Array<() => MaybePromise<T>>,\n options: RunAllOrThrowOptions<T, E> = {}\n ): Promise<T[]> {\n return baseRunAllOrThrow(fns, {\n toError,\n ignoreAbort,\n ...options,\n mapError: composeMapError(defaultMapError, options.mapError),\n });\n },\n };\n}\n","export { run } from \"./runner/run\";\nexport { runAll, type RunAllItemResult } from \"./runner/runAll\";\nexport type {\n RunAllOptions,\n SuccessResult,\n ErrorResult,\n} from \"./runner/runAll\";\nexport { isSuccess } from \"./runner/runAll\";\nexport { runAllOrThrow } from \"./runner/runAllOrThrow\";\nexport type { RunOptions, RunResult, RetryOptions } from \"./types\";\nexport type {\n BackoffStrategy,\n CircuitBreakerOptions,\n Metrics,\n RetryContext,\n} from \"./types\";\n\nexport type { ResultError, ResultErrorCode } from \"./error/types\";\nexport {\n toResultError,\n defaultFallback,\n createNormalizer,\n} from \"./error/normalize\";\nexport { rules } from \"./error/core\";\n\nexport { errorRule } from \"./error/builder\";\n\nimport type { ResultError, Rule, InferErrorFromRules } from \"./error/types\";\nimport { createRunner } from \"./runner/runner\";\nimport type { CreateRunnerOptions, Runner } from \"./runner/runner\";\nimport type { DefaultError } from \"./error/core\";\n\nexport default function trybox(\n options?: Omit<CreateRunnerOptions<ResultError>, \"rules\">\n): Runner<ResultError>;\n\nexport default function trybox<const TRules extends readonly Rule<any>[]>(\n options: {\n rules: TRules;\n rulesMode: \"replace\";\n } & Omit<\n CreateRunnerOptions<InferErrorFromRules<TRules>>,\n \"rules\" | \"rulesMode\"\n >\n): Runner<InferErrorFromRules<TRules>>;\n\nexport default function trybox<const TRules extends readonly Rule<any>[]>(\n options: {\n rules: TRules;\n rulesMode?: \"extend\";\n } & Omit<\n CreateRunnerOptions<InferErrorFromRules<TRules> | DefaultError>,\n \"rules\" | \"rulesMode\"\n >\n): Runner<InferErrorFromRules<TRules> | DefaultError>;\n\nexport default function trybox(options: any = {}): any {\n return createRunner(options);\n}\n"]}
1
+ {"version":3,"sources":["../src/error/typed-error.ts","../src/types/branded-types.ts","../src/circuit-breaker/breaker.ts","../src/error/error-normalizer.ts","../src/error/error-builder.ts","../src/error/error-rules.ts","../src/retry/retry-strategies.ts","../src/utils/timing.ts","../src/core/executor.ts","../src/index.ts"],"names":["TypedError","message","opts","__publicField","code","meta","status","cause","TimeoutError","timeout","CircuitOpenError","resetAfter","ValidationError","validationErrors","UnknownError","asMilliseconds","n","asRetryCount","asConcurrencyLimit","asPercentage","asStatusCode","CircuitBreaker","config","error","now","newFailureCount","state","createErrorNormalizer","rules","fallback","rule","result","createFallbackNormalizer","ErrorClass","hasNumericStatus","err","candidate","hasStringCode","isNetworkish","msg","ErrorRuleBuilder","predicate","ErrorMapper","mapper","out","CustomError","errorCode","mapped","CustomTypedError","createErrorRule","BuiltinRules","builtInRules","errorRule","defaultRules","RetryStrategies","delay","base","factor","maxDelay","calculate","calculateDelay","strategy","attempt","expDelay","fibDelay","fibonacci","prev","curr","i","next","sleep","ms","signal","resolve","reject","cleanup","onAbort","timeoutId","buildNormalizer","rulesMode","userRules","builtins","Executor","_Executor","options","_rules","_rulesMode","_fallback","_toError","mapError","executionConfig","normalizer","baseConfig","task","mergedConfig","before","canExecute","after","executeInternal","r","tasks","rawConcurrency","concurrency","idx","worker","current","workers","results","additionalConfig","currentHandling","nextHandling","extraConfig","createExecutor","outerSignal","ignoreAbort","retry","errorHandling","hooks","logger","safeCall","fn","args","lastError","totalAttempts","totalRetries","retryHistory","startTime","compositeSignal","cleanupCompositeSignal","createCompositeSignal","e","runAttempt","p","data","withTimeout","norm","maxRetries","shouldRetry","ctx","baseDelayMs","delayMs","applyJitter","metrics","finalError","kind","controller","abort","promise","timeoutMs","settled","value","jitter","ratio","min","max","halfWindow","trybox","ex","runOptions","index_default","singleton","getSingleton","execute","executeOrThrow","executeAll","executeAllOrThrow","executeOrThrowAll","run","runOrThrow","runAll","runOrThrowAll"],"mappings":"sEAQO,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,IAAA,CAAA,YAAA,CAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA,CAAA,OAAA,CAAA,EAAA,QAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAeA,EAAf,cAGG,KAAM,CAOf,WAAA,CACCC,CAAAA,CACAC,EACC,CACD,KAAA,CAAMD,CAAO,CAAA,CATdE,CAAAA,CAAA,KAAS,OAAA,CAAA,CACTA,CAAAA,CAAA,KAAS,MAAA,CAAA,CACTA,CAAAA,CAAA,KAAS,QAAA,CAAA,CACTA,CAAAA,CAAA,IAAA,CAAS,WAAA,CAAA,CAOR,KAAK,SAAA,CAAY,IAAI,KACrB,IAAA,CAAK,IAAA,CAAO,KAAK,WAAA,CAAY,IAAA,CAC5B,KAA6B,KAAA,CAAQD,CAAAA,EAAM,MAC3C,IAAA,CAAyB,IAAA,CAAOA,GAAM,IAAA,CACtC,IAAA,CAA6B,OAASA,CAAAA,EAAM,MAAA,CAEzC,KAAA,CAAM,iBAAA,EACT,MAAM,iBAAA,CAAkB,IAAA,CAAM,KAAK,WAAW,EAEhD,CAGA,EAAA,CAAqBE,CAAAA,CAA8C,CAClE,OAAQ,IAAA,CAAK,OAAoBA,CAClC,CAGA,SAAkBC,CAAAA,CAA6B,CAC9C,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAM,CAAE,KAAAA,CAAK,CAAC,CACpC,CAGA,UAAA,CAAWC,EAA2C,CACrD,OAAO,OAAO,MAAA,CAAO,IAAA,CAAM,CAAE,MAAA,CAAAA,CAAO,CAAC,CACtC,CAGA,UAAUC,CAAAA,CAA2C,CACpD,OAAO,MAAA,CAAO,OAAO,IAAA,CAAM,CAAE,MAAAA,CAAM,CAAC,CACrC,CAGA,MAAA,EAAkC,CACjC,OAAO,CACN,KAAM,IAAA,CAAK,IAAA,CACX,KAAM,IAAA,CAAK,IAAA,CACX,QAAS,IAAA,CAAK,OAAA,CACd,SAAA,CAAW,IAAA,CAAK,UAAU,WAAA,EAAY,CACtC,MAAO,IAAA,CAAK,KAAA,CACZ,MAAO,IAAA,CAAK,KACb,CACD,CACD,CAAA,CAGaC,EAAN,cAA2BR,CAAsB,CAGvD,WAAA,CAAYS,CAAAA,CAAuBF,EAAiB,CACnD,KAAA,CAAM,CAAA,0BAAA,EAA6BE,CAAO,KAAM,CAAE,KAAA,CAAAF,CAAM,CAAC,CAAA,CAH1DJ,EAAA,IAAA,CAAS,MAAA,CAAO,WAIhB,CACD,CAAA,CAUO,IAAMO,CAAAA,CAAN,cAA+BV,CAA2B,CAGhE,WAAA,CAAYW,EAA0BJ,CAAAA,CAAiB,CACtD,KAAA,CAAM,CAAA,qCAAA,EAAwCI,CAAU,CAAA,EAAA,CAAA,CAAM,CAAE,MAAAJ,CAAM,CAAC,EAHxEJ,CAAAA,CAAA,IAAA,CAAS,OAAO,cAAA,EAIhB,CACD,EAIaS,CAAAA,CAAN,cAA8BZ,CAAyC,CAG7E,WAAA,CACCC,EACgBY,CAAAA,CAChBN,CAAAA,CACC,CACD,KAAA,CAAMN,EAAS,CAAE,KAAA,CAAAM,EAAO,IAAA,CAAM,CAAE,iBAAAM,CAAiB,CAAE,CAAC,CAAA,CAHpC,IAAA,CAAA,gBAAA,CAAAA,EAJjBV,CAAAA,CAAA,IAAA,CAAS,OAAO,YAAA,EAQhB,CACD,EA6BO,IAAMW,CAAAA,CAAN,cAA2Bd,CAAsB,CAGvD,WAAA,CAAYC,CAAAA,CAAiBM,EAAiB,CAC7C,KAAA,CAAMN,EAAS,CAAE,KAAA,CAAAM,CAAM,CAAC,CAAA,CAHzBJ,EAAA,IAAA,CAAS,MAAA,CAAO,WAIhB,CACD,CAAA,KC5HaY,CAAAA,CAAkBC,CAAAA,EAA4B,CAC1D,GAAIA,EAAI,CAAA,EAAK,CAAC,OAAO,QAAA,CAASA,CAAC,EAC9B,MAAM,IAAI,MACT,CAAA,gEAAA,EAAmEA,CAAC,EACrE,CAAA,CAED,OAAOA,CACR,CAAA,CAEaC,CAAAA,CAAgBD,GAA0B,CACtD,GAAIA,CAAAA,CAAI,CAAA,EAAK,CAAC,MAAA,CAAO,SAAA,CAAUA,CAAC,CAAA,CAC/B,MAAM,IAAI,KAAA,CACT,CAAA,yDAAA,EAA4DA,CAAC,CAAA,CAC9D,CAAA,CAED,OAAOA,CACR,CAAA,CAEaE,EAAsBF,CAAAA,EAAgC,CAClE,GAAIA,CAAAA,CAAI,CAAA,EAAK,CAAC,MAAA,CAAO,UAAUA,CAAC,CAAA,CAC/B,MAAM,IAAI,KAAA,CACT,8DAA8DA,CAAC,CAAA,CAChE,EAED,OAAOA,CACR,EAEaG,EAAAA,CAAgBH,CAAAA,EAA0B,CACtD,GAAIA,CAAAA,CAAI,GAAKA,CAAAA,CAAI,GAAA,EAAO,CAAC,MAAA,CAAO,SAASA,CAAC,CAAA,CACzC,MAAM,IAAI,KAAA,CAAM,sDAAsDA,CAAC,CAAA,CAAE,EAE1E,OAAOA,CACR,EAEaI,EAAAA,CAAgBJ,CAAAA,EAA0B,CACtD,GAAI,CAAC,OAAO,SAAA,CAAUA,CAAC,CAAA,EAAKA,CAAAA,CAAI,KAAOA,CAAAA,CAAI,GAAA,CAC1C,MAAM,IAAI,KAAA,CACT,gEAAgEA,CAAC,CAAA,CAClE,EAED,OAAOA,CACR,ECfO,IAAMK,CAAAA,CAAN,KAAwD,CAS9D,WAAA,CAAYC,EAAiC,CAR7CnB,CAAAA,CAAA,IAAA,CAAQ,OAAA,CAAA,CACRA,EAAA,IAAA,CAAiB,QAAA,CAAA,CAQhB,KAAK,MAAA,CAAS,CACb,iBAAkBc,CAAAA,CAAaK,CAAAA,CAAO,gBAAgB,CAAA,CACtD,YAAA,CAAcP,EAAeO,CAAAA,CAAO,YAAY,EAChD,gBAAA,CAAkBL,CAAAA,CAAaK,EAAO,gBAAgB,CAAA,CACtD,oBAAA,CAAsBA,CAAAA,CAAO,oBAC9B,CAAA,CACA,IAAA,CAAK,MAAQ,CACZ,KAAA,CAAO,SACP,YAAA,CAAc,CAAA,CACd,cAAe,CAChB,EACD,CAGA,MAAM,UAAA,EAA+B,CAEpC,GADA,IAAA,CAAK,qBAAoB,CACrB,IAAA,CAAK,KAAA,CAAM,KAAA,GAAU,OACxB,OAAO,MAAA,CAER,GAAI,IAAA,CAAK,KAAA,CAAM,QAAU,WAAA,CAAa,CACrC,GAAI,IAAA,CAAK,KAAA,CAAM,eAAiB,IAAA,CAAK,MAAA,CAAO,iBAC3C,OAAO,MAAA,CAER,KAAK,KAAA,CAAQ,CACZ,GAAG,IAAA,CAAK,MACR,aAAA,CAAgB,IAAA,CAAK,MAAM,aAAA,CAAgB,CAC5C,EACD,CACA,OAAO,KACR,CAGA,MAAM,eAA+B,CACpC,OAAQ,KAAK,KAAA,CAAM,KAAA,EAClB,KAAK,QAAA,CAEJ,IAAA,CAAK,KAAA,CAAQ,CACZ,GAAG,IAAA,CAAK,MACR,YAAA,CAAc,CACf,EACA,MAED,KAAK,YAEJ,IAAA,CAAK,KAAA,CAAQ,CACZ,KAAA,CAAO,QAAA,CACP,aAAc,CAAA,CACd,aAAA,CAAe,CAChB,CAAA,CACA,MAKF,CACD,CAGA,MAAM,aAAA,CAAcC,CAAAA,CAAyB,CAG5C,GAAI,EAFgB,KAAK,MAAA,CAAO,oBAAA,GAAuBA,CAAK,CAAA,EAAK,IAAA,CAAA,CAGhE,OAGD,IAAMC,CAAAA,CAAM,IAAI,IAAA,CAEhB,OAAQ,IAAA,CAAK,KAAA,CAAM,OAClB,KAAK,SAAU,CACd,IAAMC,EAAmB,IAAA,CAAK,KAAA,CAAM,aAAe,CAAA,CAE/CA,CAAAA,EAAmB,KAAK,MAAA,CAAO,gBAAA,CAElC,KAAK,KAAA,CAAQ,CACZ,MAAO,MAAA,CACP,YAAA,CAAcA,CAAAA,CACd,aAAA,CAAe,EACf,eAAA,CAAiBD,CAAAA,CACjB,gBAAiB,IAAI,IAAA,CAAKA,EAAI,OAAA,EAAQ,CAAI,KAAK,MAAA,CAAO,YAAY,CACnE,CAAA,CAGA,IAAA,CAAK,MAAQ,CACZ,GAAG,KAAK,KAAA,CACR,YAAA,CAAcC,CAAAA,CACd,eAAA,CAAiBD,CAClB,CAAA,CAED,KACD,CAEA,KAAK,WAAA,CAEJ,KAAK,KAAA,CAAQ,CACZ,MAAO,MAAA,CACP,YAAA,CAAe,KAAK,KAAA,CAAM,YAAA,CAAe,EACzC,aAAA,CAAe,CAAA,CACf,gBAAiBA,CAAAA,CACjB,eAAA,CAAiB,IAAI,IAAA,CAAKA,EAAI,OAAA,EAAQ,CAAI,KAAK,MAAA,CAAO,YAAY,CACnE,CAAA,CACA,MAED,KAAK,MAAA,CAEJ,IAAA,CAAK,MAAQ,CACZ,GAAG,KAAK,KAAA,CACR,eAAA,CAAiBA,EACjB,eAAA,CAAiB,IAAI,IAAA,CAAKA,CAAAA,CAAI,SAAQ,CAAI,IAAA,CAAK,OAAO,YAAY,CACnE,EACA,KACF,CACD,CAGA,QAAA,EAAgC,CAC/B,YAAK,mBAAA,EAAoB,CAClB,CACN,GAAG,IAAA,CAAK,MACR,UAAA,CAAY,IAAA,CAAK,KAAA,CAAM,KAAA,GAAU,MAClC,CACD,CAGA,iBAAoC,CACnC,IAAMb,EAAa,IAAA,CAAK,KAAA,CAAM,gBAC3BI,CAAAA,CACA,IAAA,CAAK,IAAI,CAAA,CAAG,IAAA,CAAK,MAAM,eAAA,CAAgB,OAAA,GAAY,IAAA,CAAK,GAAA,EAAK,CAC9D,EACC,IAAA,CAAK,MAAA,CAAO,aAEf,OAAO,IAAIL,EAAiBC,CAAU,CACvC,CAGA,UAAA,CAAWe,CAAAA,CAA2B,CACrC,IAAA,CAAK,KAAA,CAAQ,CACZ,KAAA,CAAAA,CAAAA,CACA,aAAc,CAAA,CACd,aAAA,CAAe,CAChB,EACD,CAGA,KAAA,EAAc,CACb,KAAK,KAAA,CAAQ,CACZ,MAAO,QAAA,CACP,YAAA,CAAc,EACd,aAAA,CAAe,CAChB,EACD,CAGQ,mBAAA,EAA4B,CAC/B,IAAA,CAAK,KAAA,CAAM,QAAU,MAAA,EAAU,IAAA,CAAK,KAAA,CAAM,eAAA,EACjC,IAAI,IAAA,EACL,IAAA,CAAK,MAAM,eAAA,GAErB,IAAA,CAAK,MAAQ,CACZ,GAAG,KAAK,KAAA,CACR,KAAA,CAAO,YACP,aAAA,CAAe,CAChB,GAGH,CACD,CAAA,CCjMO,IAAMC,CAAAA,CAAwB,CACpCC,CAAAA,CACAC,CAAAA,GAEQN,GAAsB,CAC7B,IAAA,IAAWO,KAAQF,CAAAA,CAAO,CACzB,IAAMG,CAAAA,CAASD,CAAAA,CAAKP,CAAK,CAAA,CACzB,GAAIQ,IAAW,IAAA,CACd,OAAOA,CAET,CACA,OAAOF,EAASN,CAAK,CACtB,EAIYS,CAAAA,CACZC,CAAAA,EAEQV,GACHA,CAAAA,YAAiBvB,CAAAA,CACbuB,EAGJA,CAAAA,YAAiB,KAAA,CACb,IAAIU,CAAAA,CAAWV,CAAAA,CAAM,QAASA,CAAK,CAAA,CAEvC,OAAOA,CAAAA,EAAU,QAAA,CACb,IAAIU,CAAAA,CAAWV,CAAK,EAErB,IAAIU,CAAAA,CAAW,wBAAA,CAA0BV,CAAK,ECjCvD,IAAMW,EAAAA,CAAoBC,GAAuC,CAChE,GAAI,OAAOA,CAAAA,EAAQ,QAAA,EAAYA,IAAQ,IAAA,CAAM,OAAO,OACpD,IAAMC,CAAAA,CAAYD,EAClB,OACC,OAAOC,EAAU,MAAA,EAAW,QAAA,EAC5B,OAAOA,CAAAA,CAAU,YAAe,QAElC,CAAA,CAEMC,GAAiBF,CAAAA,EAAqC,CAC3D,GAAI,OAAOA,CAAAA,EAAQ,UAAYA,CAAAA,GAAQ,IAAA,CAAM,OAAO,MAAA,CACpD,IAAMC,EAAYD,CAAAA,CAClB,OAAO,OAAOC,CAAAA,CAAU,IAAA,EAAS,QAAA,EAAYA,CAAAA,CAAU,KAAK,MAAA,CAAS,CACtE,EAEME,EAAAA,CAAgBH,CAAAA,EAA6C,CAClE,GAAIA,CAAAA,YAAe,MAAO,CAEzB,GAAIA,EAAI,IAAA,GAAS,WAAA,CAAa,OAAO,KAAA,CACrC,IAAMI,EAAMJ,CAAAA,CAAI,OAAA,CAAQ,WAAA,EAAY,CAEpC,GADII,CAAAA,CAAI,QAAA,CAAS,OAAO,CAAA,EAAKA,CAAAA,CAAI,SAAS,QAAQ,CAAA,EAC9CA,EAAI,QAAA,CAAS,SAAS,EAAG,OAAO,KACrC,CAEA,GAAIF,EAAAA,CAAcF,CAAG,CAAA,CAAG,CACvB,IAAM/B,CAAAA,CAAAA,CAAQ+B,EAAI,IAAA,EAAQ,EAAA,EAAI,aAAY,CAC1C,OACC/B,IAAS,YAAA,EACTA,CAAAA,GAAS,gBACTA,CAAAA,GAAS,WAAA,EACTA,IAAS,WAAA,EACTA,CAAAA,GAAS,WAEX,CAEA,OAAO,MACR,CAAA,CAGaoC,CAAAA,CAAN,KAA0B,CAChC,YAA6BC,CAAAA,CAAuC,CAAvC,eAAAA,EAAwC,CAErE,OAA+BrC,CAAAA,CAAS,CACvC,OAAO,IAAIsC,CAAAA,CAAkB,KAAK,SAAA,CAAWtC,CAAI,CAClD,CAIA,OAAA,CAQEuC,EAA0E,CAC3E,OAAQR,CAAAA,EAAiB,CACxB,GAAI,CAAC,IAAA,CAAK,UAAUA,CAAG,CAAA,CAAG,OAAO,IAAA,CACjC,IAAMS,EAAMD,CAAAA,CAAOR,CAAQ,EACrB/B,CAAAA,CAAOwC,CAAAA,CAAI,KAEjB,MAAMC,CAAAA,SAAoB7C,CAAqC,CAE9D,WAAA,EAAc,CACb,KAAA,CAAM4C,EAAI,OAAA,CAAS,CAClB,MAAOA,CAAAA,CAAI,KAAA,EAAST,EACpB,IAAA,CAAMS,CAAAA,CAAI,KACV,MAAA,CAAQA,CAAAA,CAAI,MACb,CAAC,CAAA,CANFzC,EAAA,IAAA,CAAS,MAAA,CAAOC,GAOhB,CACD,CAEA,OAAO,IAAIyC,CACZ,CACD,CACD,EAGaH,CAAAA,CAAN,KAAuC,CAC7C,WAAA,CACkBD,CAAAA,CACAK,EAChB,CAFgB,IAAA,CAAA,SAAA,CAAAL,EACA,IAAA,CAAA,SAAA,CAAAK,EACf,CAEH,IAAA,CACCH,CAAAA,CAMC,CACD,OAAQR,CAAAA,EAA0C,CACjD,GAAI,CAAC,IAAA,CAAK,SAAA,CAAUA,CAAG,CAAA,CAAG,OAAO,KACjC,IAAMY,CAAAA,CAASJ,EAAOR,CAAG,CAAA,CAEnBW,EAAY,IAAA,CAAK,SAAA,CACvB,MAAME,CAAAA,SAAyBhD,CAAiB,CAE/C,WAAA,EAAc,CACb,KAAA,CAAM+C,CAAAA,CAAO,QAAS,CACrB,KAAA,CAAOA,EAAO,KAAA,CACd,IAAA,CAAMA,EAAO,IAAA,CACb,MAAA,CAAQA,EAAO,MAChB,CAAC,EANF5C,CAAAA,CAAA,IAAA,CAAS,OAAO2C,CAAAA,EAOhB,CACD,CAEA,OAAO,IAAIE,CACZ,CACD,CACD,CAAA,CAGaC,CAAAA,CAAkB,CAC9B,IAAA,CAAUR,CAAAA,EACT,IAAID,CAAAA,CAAiBC,CAAS,EAE/B,QAAA,CAA0DR,CAAAA,EACzD,IAAIO,CAAAA,CACFL,CAAAA,EAAgCA,aAAeF,CACjD,CAAA,CAED,KAAyB7B,CAAAA,GAAa,CACrC,GAAA,CAASqC,CAAAA,EACR,IAAIC,CAAAA,CAAYD,CAAAA,CAAWrC,CAAI,CACjC,CAAA,CAAA,CAGA,OAAQ,CAAmBH,CAAAA,CAAiBG,KAAa,CACxD,IAAA,CAAUqC,GACTQ,CAAAA,CACE,IAAA,CAAKR,CAAS,CAAA,CACd,MAAA,CAAOrC,CAAI,CAAA,CACX,IAAA,CAAM+B,CAAAA,GAAS,CACf,QAASA,CAAAA,GAAQlC,CAAAA,CAAUA,EAAU,CAAA,EAAGG,CAAI,KAAK+B,CAAG,CAAA,CAAA,CACpD,MAAOA,CACR,CAAA,CAAE,CACL,CAAA,CAAA,CAGA,UAAA,CAAY,CAAmB7B,CAAAA,CAAgBF,CAAAA,IAAc,CAC5D,GAAA,CAASqC,CAAAA,EACRQ,CAAAA,CACE,IAAA,CAAKR,CAAS,CAAA,CACd,MAAA,CAAOrC,GAAQ,CAAA,KAAA,EAAQE,CAAM,EAAE,CAAA,CAC/B,IAAA,CAAM6B,IAAS,CACf,OAAA,CAAS,QAAQ7B,CAAM,CAAA,MAAA,CAAA,CACvB,MAAO6B,CACR,CAAA,CAAE,CACL,CAAA,CAGD,CAAA,CAsCO,IAAMe,CAAAA,CAAe,CAE3B,KAAA,EAASf,CAAAA,EACRA,aAAenC,CAAAA,CAAamC,CAAAA,CAAM,MAGnC,KAAA,CAAOc,CAAAA,CACL,KACCd,CAAAA,EACAA,CAAAA,YAAe,cAAgBA,CAAAA,CAAI,IAAA,GAAS,YAC9C,CAAA,CACC,MAAA,CAAO,SAAS,CAAA,CAChB,IAAA,CAAMA,CAAAA,GAAS,CACf,QAASA,CAAAA,CAAI,OAAA,EAAW,wBACxB,KAAA,CAAOA,CACR,EAAE,CAAA,CAGH,OAAA,CAASc,EACP,IAAA,CACCd,CAAAA,EACAA,aAAe,KAAA,EAASA,CAAAA,CAAI,OAAS,cACvC,CAAA,CACC,OAAO,SAAS,CAAA,CAChB,IAAA,CAAMA,CAAAA,GAAS,CACf,OAAA,CAASA,CAAAA,CAAI,SAAW,qBAAA,CACxB,KAAA,CAAOA,CACR,CAAA,CAAE,CAAA,CAGH,QAASc,CAAAA,CACP,IAAA,CAAMd,GAAoCG,EAAAA,CAAaH,CAAG,CAAC,CAAA,CAC3D,MAAA,CAAO,SAAS,CAAA,CAChB,IAAA,CAAMA,CAAAA,GAKC,CACN,SAHGA,EAAI,OAAA,EAAW,eAAA,CAAA,CAIlB,MAAOA,CACR,CAAA,CACA,EAGF,IAAA,CAAMc,CAAAA,CACJ,KAAMd,CAAAA,EAA8B,CACpC,GAAI,CAACD,EAAAA,CAAiBC,CAAG,CAAA,CACxB,OAAO,MAAA,CAER,IAAMC,EAAYD,CAAAA,CACZ7B,CAAAA,CAAS8B,EAAU,MAAA,EAAUA,CAAAA,CAAU,WAC7C,OAAO,OAAO9B,GAAW,QAAA,EAAYA,CAAAA,EAAU,GAChD,CAAC,CAAA,CACA,OAAO,MAAM,CAAA,CACb,KAAM6B,CAAAA,EAAQ,CACd,IAAM7B,CAAAA,CAAS6B,EAAI,MAAA,EAAUA,CAAAA,CAAI,WACjC,OAAO,CACN,QAASA,CAAAA,CAAI,OAAA,EAAW,QAAQ7B,CAAAA,EAAU,OAAO,SACjD,KAAA,CAAO6B,CAAAA,CACP,OAAQ,OAAO7B,CAAAA,EAAW,SAAWA,CAAAA,CAAS,MAC/C,CACD,CAAC,EAGF,OAAA,CAAS2C,CAAAA,CACP,KACCd,CAAAA,EACAA,CAAAA,YAAe,OAAS,EAAEA,CAAAA,YAAenC,EAC3C,CAAA,CACC,MAAA,CAAO,SAAS,CAAA,CAChB,IAAA,CAAMmC,IAAS,CACf,OAAA,CAASA,EAAI,OAAA,EAAW,wBAAA,CACxB,KAAA,CAAOA,CACR,EAAE,CACJ,CAAA,CClRO,IAAMgB,EAAAA,CAA4B,CACxCD,EAAa,KAAA,CACbA,CAAAA,CAAa,MACbA,CAAAA,CAAa,OAAA,CACbA,EAAa,IAAA,CACbA,CAAAA,CAAa,QACbA,CAAAA,CAAa,OACd,EAMO,IAAME,EAAAA,CAAY,CACxB,IAAA,CAAUX,GACTQ,CAAAA,CAAgB,IAAA,CAAKR,CAAS,CAAA,CAE/B,QAAA,CAA0DR,GACzDgB,CAAAA,CAAgB,QAAA,CAAShB,CAAU,CACrC,CAAA,CAGaoB,EAAeF,EAAAA,CAemBF,CAAAA,CAC7C,IAAA,CAAMd,GAAiCA,CAAAA,YAAezB,CAAgB,EACtE,MAAA,CAAO,cAAc,EACrB,IAAA,CAAMyB,CAAAA,GAAS,CACf,OAAA,CAASA,CAAAA,CAAI,QACb,KAAA,CAAOA,CACR,CAAA,CAAE,CAAA,CAG2Cc,CAAAA,CAC5C,IAAA,CAAMd,GAAgCA,CAAAA,YAAevB,CAAe,EACpE,MAAA,CAAO,YAAY,EACnB,IAAA,CAAMuB,CAAAA,GAAS,CACf,OAAA,CAASA,CAAAA,CAAI,QACb,KAAA,CAAOA,CACR,EAAE,EC3BI,IAAMmB,EAAAA,CAAkB,CAC9B,MAAQC,CAAAA,GAAuC,CAC9C,KAAM,OAAA,CACN,KAAA,CAAAA,CACD,CAAA,CAAA,CAEA,WAAA,CAAa,CACZC,CAAAA,CACAC,CAAAA,CAAiB,EACjBC,CAAAA,IACiC,CACjC,KAAM,aAAA,CACN,IAAA,CAAAF,EACA,MAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CACD,GAEA,SAAA,CAAW,CAACF,EAAcE,CAAAA,IAAiD,CAC1E,KAAM,WAAA,CACN,IAAA,CAAAF,EACA,QAAA,CAAAE,CACD,GAEA,MAAA,CACCC,CAAAA,GAC0B,CAC1B,IAAA,CAAM,QAAA,CACN,UAAAA,CACD,CAAA,CACD,CAAA,CAGaC,CAAAA,CAAiB,CAC7BC,CAAAA,CACAC,CAAAA,CACAvC,IACY,CACZ,OAAQsC,EAAS,IAAA,EAChB,KAAK,OAAA,CACJ,OAAOA,EAAS,KAAA,CAEjB,KAAK,cAAe,CACnB,IAAME,EAAWF,CAAAA,CAAS,IAAA,CAAOA,CAAAA,CAAS,MAAA,GAAW,OAAOC,CAAO,CAAA,CAAI,GACvE,OACCD,CAAAA,CAAS,SAAW,IAAA,CAAK,GAAA,CAAIE,EAAUF,CAAAA,CAAS,QAAQ,EAAIE,CAE9D,CAEA,KAAK,WAAA,CAAa,CACjB,IAAMC,CAAAA,CAAWH,CAAAA,CAAS,IAAA,CAAOI,EAAAA,CAAU,OAAOH,CAAO,CAAC,EAC1D,OACCD,CAAAA,CAAS,SAAW,IAAA,CAAK,GAAA,CAAIG,EAAUH,CAAAA,CAAS,QAAQ,EAAIG,CAE9D,CAEA,KAAK,QAAA,CACJ,OAAOH,EAAS,SAAA,CAAUC,CAAAA,CAASvC,CAAK,CAAA,CAGzC,QAEC,OAD2BsC,CAG7B,CACD,EAGMI,EAAAA,CAAajD,CAAAA,EAAsB,CACxC,GAAIA,CAAAA,EAAK,EAAG,OAAO,CAAA,CACnB,IAAIkD,CAAAA,CAAO,CAAA,CACPC,EAAO,CAAA,CACX,IAAA,IAASC,EAAI,CAAA,CAAGA,CAAAA,EAAKpD,CAAAA,CAAGoD,CAAAA,EAAAA,CAAK,CAC5B,IAAMC,CAAAA,CAAOH,EAAOC,CAAAA,CACpBD,CAAAA,CAAOC,EACPA,CAAAA,CAAOE,EACR,CACA,OAAOF,CACR,EC3GO,IAAMG,CAAAA,CAAQ,CACpBC,CAAAA,CACAC,CAAAA,GAEO,IAAI,OAAA,CAAQ,CAACC,CAAAA,CAASC,CAAAA,GAAW,CACvC,GAAIF,CAAAA,EAAQ,QAAS,CACpBE,CAAAA,CAAO,IAAI,YAAA,CAAa,SAAA,CAAW,YAAY,CAAC,CAAA,CAChD,MACD,CAEA,IAAMC,EAAWC,CAAAA,EAAyB,CACrCJ,GAAUI,CAAAA,EACbJ,CAAAA,CAAO,mBAAA,CAAoB,OAAA,CAASI,CAAO,EAE7C,CAAA,CAEIC,EACED,CAAAA,CAAU,IAAM,CACjBC,CAAAA,EAAW,YAAA,CAAaA,CAAS,CAAA,CACrCF,CAAAA,CAAQC,CAAO,CAAA,CACfF,CAAAA,CAAO,IAAI,YAAA,CAAa,SAAA,CAAW,YAAY,CAAC,EACjD,CAAA,CAEAG,CAAAA,CAAY,WAAW,IAAM,CAC5BF,EAAQC,CAAO,CAAA,CACfH,IACD,CAAA,CAAGF,CAAY,CAAA,CAEfC,CAAAA,EAAQ,iBAAiB,OAAA,CAASI,CAAAA,CAAS,CAAE,IAAA,CAAM,IAAK,CAAC,EAC1D,CAAC,CAAA,CC+BF,IAAME,GACL5E,CAAAA,EACwB,CACxB,GAAIA,CAAAA,CAAK,OAAA,CAAS,OAAOA,CAAAA,CAAK,OAAA,CAE9B,IAAM6E,CAAAA,CAAuB7E,CAAAA,CAAK,WAAa,QAAA,CACzC8E,CAAAA,CAAa9E,EAAK,KAAA,EAAS,GAC3B+E,CAAAA,CAAW5B,CAAAA,CAEXxB,CAAAA,CACL3B,CAAAA,CAAK,WACHiC,CAAAA,EACDH,CAAAA,CACClB,CAID,CAAA,CAAEqB,CAAG,GAEDP,CAAAA,CACLmD,CAAAA,GAAc,UAAYC,CAAAA,CAAY,CAAC,GAAGA,CAAAA,CAAW,GAAGC,CAAQ,CAAA,CACjE,OAAOtD,EAAsBC,CAAAA,CAAOC,CAAQ,CAC7C,CAAA,CAEaqD,EAAN,MAAMC,CAA4C,CAKxD,WAAA,CAAYC,CAAAA,CAA8B,EAAC,CAAG,CAJ9CjF,EAAA,IAAA,CAAiB,gBAAA,CAAA,CACjBA,EAAA,IAAA,CAAiB,QAAA,CAAA,CACjBA,EAAA,IAAA,CAAQ,kBAAA,CAAA,CAGP,GAAM,CACL,KAAA,CAAOkF,CAAAA,CACP,SAAA,CAAWC,EACX,QAAA,CAAUC,CAAAA,CACV,QAASC,CAAAA,CACT,QAAA,CAAAC,EACA,GAAGC,CACJ,EAAIN,CAAAA,CACEO,CAAAA,CAAab,GAAgBM,CAAO,CAAA,CACpCQ,EAAiC,CACtC,GAAGF,EACH,aAAA,CAAe,CACd,UAAA,CAAAC,CAAAA,CACA,SAAAF,CACD,CACD,EAEA,IAAA,CAAK,MAAA,CAASG,EAEVA,CAAAA,CAAW,cAAA,GACd,KAAK,cAAA,CAAiB,IAAIvE,EAAeuE,CAAAA,CAAW,cAAc,EAClE,IAAA,CAAK,gBAAA,CAAmB,KAAK,cAAA,CAAe,QAAA,EAAS,CAAE,KAAA,EAEzD,CAGA,MAAM,OAAA,CACLC,EACAT,CAAAA,CAAuC,GACN,CACjC,IAAMU,EAAe,CAAE,GAAG,KAAK,MAAA,CAAQ,GAAGV,CAAQ,CAAA,CAGlD,GAAI,KAAK,cAAA,CAAgB,CACxB,IAAMW,CAAAA,CACL,KAAK,gBAAA,EAAoB,IAAA,CAAK,eAAe,QAAA,EAAS,CAAE,MACnDC,CAAAA,CAAa,MAAM,KAAK,cAAA,CAAe,UAAA,GACvCC,CAAAA,CAAQ,IAAA,CAAK,eAAe,QAAA,EAAS,CAAE,MAC7C,GAAIF,CAAAA,GAAWE,CAAAA,CACd,GAAI,CACHH,CAAAA,CAAa,KAAA,EAAO,uBAAuBC,CAAAA,CAAQE,CAAK,EACzD,CAAA,KAAQ,CAER,CAGD,GADA,IAAA,CAAK,iBAAmBA,CAAAA,CACpB,CAACD,EAgBJ,OAbsC,CACrC,KAAM,SAAA,CACN,EAAA,CAAI,KAAA,CACJ,IAAA,CAAM,KACN,KAAA,CANa,IAAA,CAAK,eAAe,eAAA,EAAgB,CAOjD,QAAS,CACR,aAAA,CAAe,EACf,YAAA,CAAc,CAAA,CACd,cAAe,CAAA,CACf,YAAA,CAAc,EACf,CACD,CAIF,CAEA,IAAMjE,CAAAA,CAAS,MAAMmE,GAAgBL,CAAAA,CAAMC,CAAY,EAGvD,GAAI,IAAA,CAAK,eAAgB,CACxB,IAAMC,EACL,IAAA,CAAK,gBAAA,EAAoB,KAAK,cAAA,CAAe,QAAA,GAAW,KAAA,CACrDhE,CAAAA,CAAO,GACV,MAAM,IAAA,CAAK,cAAA,CAAe,aAAA,GAE1B,MAAM,IAAA,CAAK,eAAe,aAAA,CAAcA,CAAAA,CAAO,KAAK,CAAA,CAErD,IAAMkE,EAAQ,IAAA,CAAK,cAAA,CAAe,UAAS,CAAE,KAAA,CAC7C,GAAIF,CAAAA,GAAWE,CAAAA,CACd,GAAI,CACHH,CAAAA,CAAa,KAAA,EAAO,oBAAA,GAAuBC,EAAQE,CAAK,EACzD,MAAQ,CAER,CAED,KAAK,gBAAA,CAAmBA,EACzB,CAEA,OAAOlE,CACR,CAEA,MAAM,cAAA,CACL8D,EACAT,CAAAA,CAAuC,GAC1B,CACb,IAAMe,CAAAA,CAAI,MAAM,KAAK,OAAA,CAAQN,CAAAA,CAAMT,CAAO,CAAA,CAC1C,GAAIe,EAAE,EAAA,CAAI,OAAOA,EAAE,IAAA,CACnB,MAAMA,EAAE,KACT,CAGA,MAAM,UAAA,CACLC,CAAAA,CACAhB,EAAkE,EAAC,CAChC,CACnC,IAAMU,EAAe,CAAE,GAAG,KAAK,MAAA,CAAQ,GAAGV,CAAQ,CAAA,CAC5CiB,CAAAA,CAAiBP,EAAa,WAAA,EAAe,MAAA,CAAO,kBACpDQ,CAAAA,CAAc,MAAA,CAAO,SAASD,CAAc,CAAA,CAC/C,OAAOnF,CAAAA,CAAmBmF,CAAc,CAAC,CAAA,CACzC,OAAO,iBAAA,CAEJzD,CAAAA,CAA+B,IAAI,KAAA,CAAMwD,CAAAA,CAAM,MAAM,CAAA,CACvDG,CAAAA,CAAM,EAEJC,CAAAA,CAAS,SAAY,CAC1B,OAAa,CACZ,IAAMC,CAAAA,CAAUF,CAAAA,CAEhB,GADAA,CAAAA,EAAAA,CACIE,CAAAA,EAAWL,CAAAA,CAAM,MAAA,CAAQ,OAC7B,IAAMP,CAAAA,CAAOO,EAAMK,CAAO,CAAA,CAC1B,GAAI,CAACZ,CAAAA,CAAM,OACXjD,CAAAA,CAAI6D,CAAO,EAAI,MAAM,IAAA,CAAK,QAAQZ,CAAAA,CAAMC,CAAY,EACrD,CACD,CAAA,CAEMY,CAAAA,CAAU,KAAA,CAAM,KACrB,CAAE,MAAA,CAAQ,KAAK,GAAA,CAAIJ,CAAAA,CAAaF,EAAM,MAAM,CAAE,EAC9C,IAAMI,CAAAA,EACP,CAAA,CAEA,OAAA,MAAM,QAAQ,GAAA,CAAIE,CAAO,EAElB9D,CACR,CAEA,MAAM,iBAAA,CACLwD,EACAhB,CAAAA,CAAkE,GACnD,CACf,IAAMuB,EAAU,MAAM,IAAA,CAAK,WAAWP,CAAAA,CAAOhB,CAAO,EACpD,IAAA,IAAWe,CAAAA,IAAKQ,EACf,GAAI,CAACR,EAAE,EAAA,CAAI,MAAMA,CAAAA,CAAE,KAAA,CAEpB,OAAOQ,CAAAA,CAAQ,GAAA,CAAKR,GAAM,CACzB,GAAI,CAACA,CAAAA,CAAE,EAAA,CAAI,MAAMA,CAAAA,CAAE,KAAA,CACnB,OAAOA,CAAAA,CAAE,IACV,CAAC,CACF,CAKA,wBAAyB,CACxB,OAAO,IAAA,CAAK,cAAA,EAAgB,UAC7B,CAGA,qBAA4B,CAC3B,IAAA,CAAK,gBAAgB,KAAA,GACtB,CAGA,SAAA,EAAgC,CAC/B,OAAO,CAAE,GAAG,KAAK,MAAO,CACzB,CAGA,UAAA,CAAWS,CAAAA,CAA4D,CACtE,GAAM,CAAE,aAAA,CAAeC,CAAAA,CAAiB,GAAGjB,CAAW,CAAA,CAAI,KAAK,MAAA,CACzD,CAAE,cAAekB,CAAAA,CAAc,GAAGC,CAAY,CAAA,CAAIH,CAAAA,CAElDjB,EAAamB,CAAAA,EAAc,UAAA,EAAcD,EAAgB,UAAA,CACzDpB,CAAAA,CAAWqB,CAAAA,EAAc,QAAA,EAAYD,EAAgB,QAAA,CAE3D,OAAO,IAAI1B,CAAAA,CAAY,CACtB,GAAGS,CAAAA,CACH,GAAGmB,EACH,OAAA,CAASpB,CAAAA,CACT,SAAAF,CACD,CAAC,CACF,CAGA,aAAA,CACCnE,EAAsC,EAAC,CACzB,CACd,OAAO,IAAI6D,CAAAA,CAAY7D,CAA4B,CACpD,CACD,CAAA,CAYO,SAAS0F,CAAAA,CACf5B,CAAAA,CACc,CACd,OAAO,IAAIF,EAAYE,CAAO,CAC/B,CAEA,eAAec,EAAAA,CACdL,EACAvE,CAAAA,CACiC,CACjC,GAAM,CACL,OAAQ2F,CAAAA,CACR,WAAA,CAAAC,EAAc,IAAA,CACd,OAAA,CAAAzG,EACA,KAAA,CAAA0G,CAAAA,CACA,cAAAC,CAAAA,CACA,KAAA,CAAAC,EACA,MAAA,CAAAC,CACD,EAAIhG,CAAAA,CAEEiG,CAAAA,CAAW,CAChBC,CAAAA,CAAAA,GACGC,CAAAA,GACC,CACJ,GAAI,CACHD,CAAAA,GAAK,GAAGC,CAAI,EACb,CAAA,KAAQ,CAER,CACD,CAAA,CAEIC,EACAC,CAAAA,CAAgB,CAAA,CAChBC,EAAe,CAAA,CACbC,CAAAA,CAKD,EAAC,CACAC,CAAAA,CAAY,KAAK,GAAA,EAAI,CAErB,CAAE,MAAA,CAAQC,EAAiB,OAAA,CAASC,CAAuB,EAChEC,EAAAA,CAAsBhB,CAAW,EAElC,GAAI,CACH,GAAIc,CAAAA,CAAgB,OAAA,CAAS,CAC5BR,CAAAA,CACCF,CAAAA,EAAO,QACPU,CACD,CAAA,CAEA,IAAMG,CAAAA,CAAId,CAAAA,CAAc,UAAA,CACvB,IAAI,aAAa,SAAA,CAAW,YAAY,CACzC,CAAA,CACMrE,CAAAA,CAASqE,EAAc,QAAA,CAAWA,CAAAA,CAAc,SAASc,CAAC,CAAA,CAAIA,EACpE,OAAO,CACN,KAAM,SAAA,CACN,EAAA,CAAI,GACJ,IAAA,CAAM,IAAA,CACN,MAAOnF,CAAAA,CACP,OAAA,CAAS,CACR,aAAA,CAAA4E,CAAAA,CACA,aAAAC,CAAAA,CACA,aAAA,CAAgB,KAAK,GAAA,EAAI,CAAIE,EAC7B,SAAA,CAAW/E,CAAAA,CACX,aAAA8E,CACD,CACD,CACD,CAEA,IAAMM,EAAa,MAAOrE,CAAAA,EAAgC,CACzD6D,CAAAA,CAAgB7D,EAChB,GAAI,CACH,IAAMsE,CAAAA,CAAIvC,CAAAA,CAAK,CAAE,MAAA,CAAQkC,CAAgB,CAAC,CAAA,CACpCM,CAAAA,CAAO5H,EACV,MAAM6H,EAAAA,CAAYF,EAAG3H,CAAAA,CAASsH,CAAe,EAC7C,MAAMK,CAAAA,CACT,OAAAb,CAAAA,CACCF,GAAO,SAAA,CACPgB,CACD,EACAd,CAAAA,CACCD,CAAAA,EAAQ,KACR,CAAA,0BAAA,EAA6BxD,CAAO,EACrC,CAAA,CACOuE,CACR,OAASlG,CAAAA,CAAK,CACb,IAAMoG,CAAAA,CAAOnB,CAAAA,CAAc,WAAWjF,CAAG,CAAA,CACnCY,CAAAA,CAASqE,CAAAA,CAAc,SAC1BA,CAAAA,CAAc,QAAA,CAASmB,CAAI,CAAA,CAC3BA,CAAAA,CACHb,EAAY3E,CAAAA,CACRA,CAAAA,CAAO,OAAS,SAAA,EACnBwE,CAAAA,CACCF,GAAO,OAAA,CACPU,CACD,EAGKb,CAAAA,EAAenE,CAAAA,CAAO,OAAS,SAAA,GACpCwE,CAAAA,CACCF,CAAAA,EAAO,OAAA,CACPtE,CACD,CAAA,CACAwE,CAAAA,CACCD,GAAQ,KAAA,CACR,CAAA,uBAAA,EAA0BxD,CAAO,CAAA,CAAA,CACjCf,CACD,GAGD,IAAMyF,CAAAA,CAAavH,EAAakG,CAAAA,EAAO,UAAA,EAAc,CAAC,CAAA,CACtD,GAAIrD,GAAW,MAAA,CAAO0E,CAAU,CAAA,CAAG,CAClC,IAAMC,CAAAA,CAActB,CAAAA,EAAO,YACrBuB,CAAAA,CAAM,CACX,cAAe,MAAA,CAAOf,CAAa,EACnC,WAAA,CAAc,IAAA,CAAK,KAAI,CAAIG,CAAAA,CAC3B,UAAW,IAAI,IAAA,CAAKA,CAAS,CAAA,CAC7B,SAAA,CAAWD,CAAAA,CAAaA,CAAAA,CAAa,OAAS,CAAC,CAAA,EAAG,MAC/C,MAAA,CAAOA,CAAAA,CAAaA,EAAa,MAAA,CAAS,CAAC,GAAG,KAAK,CAAA,CACnD,MACJ,CAAA,CAEA,GAAI,CAACY,CAAAA,EAAeA,CAAAA,CAAY3E,EAASf,CAAAA,CAAQ2F,CAAG,CAAA,CAAG,CACtD,IAAMC,CAAAA,CAAcxB,CAAAA,CACjBvD,EAAeuD,CAAAA,CAAM,QAAA,CAAUrD,EAAuBf,CAAM,CAAA,CAC5D,EACG6F,CAAAA,CAAUC,EAAAA,CAAYF,EAAaxB,CAAAA,EAAO,MAAM,EAChD5D,CAAAA,CAAQxC,CAAAA,CAAe6H,CAAO,CAAA,CAEpC,OAAAf,CAAAA,CAAa,IAAA,CAAK,CACjB,OAAA,CAAS/D,CAAAA,CACT,MAAOf,CAAAA,CACP,KAAA,CAAAQ,EACA,SAAA,CAAW,IAAI,IAChB,CAAC,CAAA,CACDgE,EACCF,CAAAA,EAAO,OAAA,CACPvD,EACAf,CAAAA,CACA6F,CACD,EACArB,CAAAA,CACCD,CAAAA,EAAQ,IAAA,CACR,CAAA,YAAA,EAAesB,CAAO,CAAA,YAAA,EAAe9E,CAAAA,CAAU,CAAC,CAAA,CAAA,CACjD,CAAA,CAEA,MAAMQ,CAAAA,CAAMf,CAAAA,CAAiBwE,CAAe,CAAA,CACrCI,CAAAA,CAAWrE,EAAU,CAAC,CAC9B,CACD,CAEA,MAAMf,CACP,CACD,CAAA,CAEA,GAAI,CACH,IAAMsF,CAAAA,CAAO,MAAMF,EAAW,CAAC,CAAA,CAC/BP,EACCD,CAAAA,CAAiB,CAAA,CACZ,OAAOA,CAAa,CAAA,CAAI,EACzB,CAAA,CACL,IAAMmB,EAA+B,CACpC,aAAA,CAAAnB,EACA,YAAA,CAAAC,CAAAA,CACA,aAAA,CAAgB,IAAA,CAAK,KAAI,CAAIE,CAAAA,CAC7B,aAAAD,CACD,CAAA,CACA,OAAAN,CAAAA,CACCF,CAAAA,EAAO,UACPyB,CACD,CAAA,CACO,CAAE,IAAA,CAAM,SAAA,CAAW,GAAI,CAAA,CAAA,CAAM,IAAA,CAAAT,EAAM,KAAA,CAAO,IAAA,CAAM,OAAA,CAAAS,CAAQ,CAChE,CAAA,MAAS3G,CAAAA,CAAK,CACb,IAAM4G,CAAAA,CAAcrB,GAClBN,CAAAA,CAAc,UAAA,CAAWjF,CAAG,CAAA,CACxB6G,CAAAA,CACLD,EAAW,IAAA,GAAS,SAAA,CACjB,UACAA,CAAAA,CAAW,IAAA,GAAS,UACnB,SAAA,CACA,SAAA,CAELnB,CAAAA,CACCD,CAAAA,CAAiB,EACZ,MAAA,CAAOA,CAAa,EAAI,CAAA,CACzB,CAAA,CAEL,IAAMmB,CAAAA,CAA+B,CACpC,cAAAnB,CAAAA,CACA,YAAA,CAAAC,EACA,aAAA,CAAgB,IAAA,CAAK,KAAI,CAAIE,CAAAA,CAC7B,UAAWiB,CAAAA,CACX,YAAA,CAAAlB,CACD,CAAA,CAEA,OAAAN,CAAAA,CACCF,CAAAA,EAAO,UACPyB,CACD,CAAA,CACO,CACN,IAAA,CAAME,CAAAA,CACN,GAAI,CAAA,CAAA,CACJ,IAAA,CAAM,KACN,KAAA,CAAOD,CAAAA,CACP,QAAAD,CACD,CACD,CACD,CAAA,OAAE,CACDd,CAAAA,GACD,CACD,CAEA,SAASC,GAAsBzD,CAAAA,CAG7B,CACD,IAAMyE,CAAAA,CAAa,IAAI,gBACvB,GAAI,CAACzE,EACJ,OAAO,CAAE,OAAQyE,CAAAA,CAAW,MAAA,CAAQ,QAAS,IAAM,CAAC,CAAE,CAAA,CAGvD,IAAMC,CAAAA,CAAQ,IAAMD,EAAW,KAAA,EAAM,CACrC,OAAIzE,CAAAA,CAAO,OAAA,EACV0E,GAAM,CACC,CAAE,OAAQD,CAAAA,CAAW,MAAA,CAAQ,QAAS,IAAM,CAAC,CAAE,CAAA,GAGvDzE,CAAAA,CAAO,gBAAA,CAAiB,OAAA,CAAS0E,EAAO,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAC/C,CACN,MAAA,CAAQD,CAAAA,CAAW,OACnB,OAAA,CAAS,IAAMzE,EAAO,mBAAA,CAAoB,OAAA,CAAS0E,CAAK,CACzD,CAAA,CACD,CAEA,eAAeZ,EAAAA,CACda,CAAAA,CACAC,CAAAA,CACA5E,EACa,CACb,OAAO,IAAI,OAAA,CAAW,CAACC,EAASC,CAAAA,GAAW,CAC1C,GAAIF,CAAAA,EAAQ,OAAA,CAAS,CACpBE,CAAAA,CAAO,IAAI,aAAa,SAAA,CAAW,YAAY,CAAC,CAAA,CAChD,MACD,CAEA,IAAI2E,EAAU,KAAA,CACRxE,CAAAA,CAAY,WAAW,IAAM,CAClCwE,EAAU,IAAA,CACV1E,CAAAA,GACAD,CAAAA,CAAO,IAAIlE,EAAaO,CAAAA,CAAeqI,CAAS,CAAC,CAAC,EACnD,EAAGA,CAAS,CAAA,CAENxE,CAAAA,CAAU,IAAM,CACjByE,CAAAA,GACJA,CAAAA,CAAU,KACV1E,CAAAA,EAAQ,CACRD,EAAO,IAAI,YAAA,CAAa,UAAW,YAAY,CAAC,GACjD,CAAA,CAEMC,CAAAA,CAAU,IAAM,CACrB,YAAA,CAAaE,CAAS,CAAA,CACtBL,CAAAA,EAAQ,mBAAA,CAAoB,OAAA,CAASI,CAAO,EAC7C,CAAA,CAEAJ,GAAQ,gBAAA,CAAiB,OAAA,CAASI,EAAS,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAEzDuE,EAAQ,IAAA,CACNG,CAAAA,EAAU,CACND,CAAAA,GACJA,CAAAA,CAAU,KACV1E,CAAAA,EAAQ,CACRF,CAAAA,CAAQ6E,CAAK,GACd,CAAA,CACC/H,CAAAA,EAAU,CACN8H,CAAAA,GACJA,CAAAA,CAAU,KACV1E,CAAAA,EAAQ,CACRD,EAAOnD,CAAK,CAAA,EACb,CACD,EACD,CAAC,CACF,CAEA,SAASsH,GAAYD,CAAAA,CAAiBW,CAAAA,CAA+B,CAEpE,GADI,CAACA,CAAAA,EAAUA,CAAAA,CAAO,OAAS,MAAA,EAC3BX,CAAAA,EAAW,EAAG,OAAOA,CAAAA,CAEzB,OAAQW,CAAAA,CAAO,IAAA,EACd,KAAK,MAAA,CAAQ,CACZ,IAAMC,CAAAA,CAAQ,OAAOD,CAAAA,CAAO,KAAK,CAAA,CAAI,GAAA,CAC/BE,EAAM,IAAA,CAAK,GAAA,CAAI,EAAG,MAAA,CAAOb,CAAO,GAAK,CAAA,CAAIY,CAAAA,CAAM,EAC/CE,CAAAA,CAAM,MAAA,CAAOd,CAAO,CAAA,CAC1B,OAAQa,EAAM,IAAA,CAAK,MAAA,IAAYC,CAAAA,CAAMD,CAAAA,CACtC,CACA,KAAK,QAAS,CACb,IAAMD,EAAQ,MAAA,CAAOD,CAAAA,CAAO,KAAK,CAAA,CAAI,GAAA,CAC/BI,EAAc,MAAA,CAAOf,CAAO,EAAIY,CAAAA,CAAS,CAAA,CAE/C,OADa,MAAA,CAAOZ,CAAO,EAAIe,CAAAA,CAChB,IAAA,CAAK,MAAA,EAAO,CAAIA,CAChC,CACA,KAAK,SACJ,OAAOJ,CAAAA,CAAO,UAAUX,CAAO,CAAA,CAEhC,QAEC,OAD2BW,CAG7B,CACD,CCpgBO,SAASK,EACfxE,CAAAA,CACY,CACZ,IAAMyE,CAAAA,CAAK7C,CAAAA,CAAkB5B,CAAO,CAAA,CAEpC,OAAO,CACN,GAAA,CAAK,CAACS,CAAAA,CAAMiE,CAAAA,GAAeD,EAAG,OAAA,CAAQhE,CAAAA,CAAMiE,CAAU,CAAA,CACtD,OAAA,CAAS,CAACjE,CAAAA,CAAMiE,CAAAA,GAAeD,EAAG,OAAA,CAAQhE,CAAAA,CAAMiE,CAAU,CAAA,CAC1D,UAAA,CAAY,CAACjE,CAAAA,CAAMiE,IAAeD,CAAAA,CAAG,cAAA,CAAehE,EAAMiE,CAAU,CAAA,CACpE,eAAgB,CAACjE,CAAAA,CAAMiE,IAAeD,CAAAA,CAAG,cAAA,CAAehE,EAAMiE,CAAU,CAAA,CACxE,OAAQ,CAAC1D,CAAAA,CAAO0D,IAAeD,CAAAA,CAAG,UAAA,CAAWzD,CAAAA,CAAO0D,CAAU,EAC9D,UAAA,CAAY,CAAC1D,EAAO0D,CAAAA,GAAeD,CAAAA,CAAG,WAAWzD,CAAAA,CAAO0D,CAAU,EAClE,aAAA,CAAe,CAAC1D,EAAO0D,CAAAA,GACtBD,CAAAA,CAAG,kBAAkBzD,CAAAA,CAAO0D,CAAU,EACvC,iBAAA,CAAmB,CAAC1D,CAAAA,CAAO0D,CAAAA,GAC1BD,EAAG,iBAAA,CAAkBzD,CAAAA,CAAO0D,CAAU,CACxC,CACD,CAEA,IAAOC,EAAAA,CAAQH,EAEXI,CAAAA,CACEC,CAAAA,CAAe,KACfD,CAAAA,GAAWA,CAAAA,CAAYJ,GAAO,CAAA,CAC5BI,CAAAA,CAAAA,CAGKE,GAAU,CACtBrE,CAAAA,CACAT,CAAAA,GACI6E,CAAAA,GAAe,OAAA,CAAQpE,CAAAA,CAAMT,CAAmC,CAAA,CAExD+E,EAAAA,CAAiB,CAC7BtE,CAAAA,CACAT,CAAAA,GACI6E,GAAa,CAAE,cAAA,CAAepE,EAAMT,CAAmC,CAAA,CAE/DgF,GAAa,CACzBhE,CAAAA,CACAhB,IAEA6E,CAAAA,EAAa,CAAE,WACd7D,CAAAA,CACAhB,CACD,EAEYiF,CAAAA,CAAoB,CAChCjE,EACAhB,CAAAA,GAEA6E,CAAAA,GAAe,iBAAA,CACd7D,CAAAA,CACAhB,CACD,CAAA,CAEYkF,EAAAA,CAAoBD,EAEpBE,EAAAA,CAAML,EAAAA,CACNM,GAAaL,EAAAA,CACbM,EAAAA,CAASL,GACTM,EAAAA,CAAgBL","file":"index.cjs","sourcesContent":["/**\n * Modern typed error hierarchy with enhanced capabilities\n * Provides type-safe error handling with fluent API and metadata support\n */\n\nimport type { Milliseconds } from '../types/branded-types';\n\n// Base typed error class with enhanced capabilities\nexport abstract class TypedError<\n\tCode extends string = string,\n\tMeta = unknown,\n> extends Error {\n\tabstract readonly code: Code;\n\treadonly cause?: unknown;\n\treadonly meta?: Meta;\n\treadonly status?: number;\n\treadonly timestamp: Date;\n\n\tconstructor(\n\t\tmessage: string,\n\t\topts?: { cause?: unknown; meta?: Meta; status?: number },\n\t) {\n\t\tsuper(message);\n\t\tthis.timestamp = new Date();\n\t\tthis.name = this.constructor.name;\n\t\t(this as { cause?: unknown }).cause = opts?.cause;\n\t\t(this as { meta?: Meta }).meta = opts?.meta;\n\t\t(this as { status?: number }).status = opts?.status;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, this.constructor);\n\t\t}\n\t}\n\n\t// Type-safe error code checking\n\tis<C extends string>(code: C): this is TypedError<C> & { code: C } {\n\t\treturn (this.code as string) === code;\n\t}\n\n\t// Chainable metadata attachment\n\twithMeta<const M>(meta: M): this & { meta: M } {\n\t\treturn Object.assign(this, { meta });\n\t}\n\n\t// Chainable status code attachment\n\twithStatus(status: number): this & { status: number } {\n\t\treturn Object.assign(this, { status });\n\t}\n\n\t// Chainable cause attachment\n\twithCause(cause: unknown): this & { cause: unknown } {\n\t\treturn Object.assign(this, { cause });\n\t}\n\n\t// Convert to JSON representation\n\ttoJSON(): Record<string, unknown> {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcode: this.code,\n\t\t\tmessage: this.message,\n\t\t\ttimestamp: this.timestamp.toISOString(),\n\t\t\tcause: this.cause,\n\t\t\tstack: this.stack,\n\t\t};\n\t}\n}\n\n// Built-in error types with enhanced capabilities\nexport class TimeoutError extends TypedError<'TIMEOUT'> {\n\treadonly code = 'TIMEOUT' as const;\n\n\tconstructor(timeout: Milliseconds, cause?: unknown) {\n\t\tsuper(`Operation timed out after ${timeout}ms`, { cause });\n\t}\n}\n\nexport class AbortedError extends TypedError<'ABORTED'> {\n\treadonly code = 'ABORTED' as const;\n\n\tconstructor(reason?: string, cause?: unknown) {\n\t\tsuper(reason || 'Operation was aborted', { cause });\n\t}\n}\n\nexport class CircuitOpenError extends TypedError<'CIRCUIT_OPEN'> {\n\treadonly code = 'CIRCUIT_OPEN' as const;\n\n\tconstructor(resetAfter: Milliseconds, cause?: unknown) {\n\t\tsuper(`Circuit breaker is open, reset after ${resetAfter}ms`, { cause });\n\t}\n}\n\ntype ValidationMeta = { validationErrors: unknown[] };\n\nexport class ValidationError extends TypedError<'VALIDATION', ValidationMeta> {\n\treadonly code = 'VALIDATION' as const;\n\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly validationErrors: unknown[],\n\t\tcause?: unknown,\n\t) {\n\t\tsuper(message, { cause, meta: { validationErrors } });\n\t}\n}\n\nexport class NetworkError extends TypedError<'NETWORK'> {\n\treadonly code = 'NETWORK' as const;\n\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly statusCode?: number,\n\t\tcause?: unknown,\n\t) {\n\t\tsuper(message, { cause, status: statusCode });\n\t}\n}\n\ntype HttpMeta = { response?: unknown };\n\nexport class HttpError extends TypedError<'HTTP', HttpMeta> {\n\treadonly code = 'HTTP' as const;\n\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly response?: unknown,\n\t\tcause?: unknown,\n\t) {\n\t\tsuper(message, { cause, status, meta: { response } });\n\t}\n}\n\nexport class UnknownError extends TypedError<'UNKNOWN'> {\n\treadonly code = 'UNKNOWN' as const;\n\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(message, { cause });\n\t}\n}\n\n// Error code union for built-in errors\nexport type BuiltInErrorCode =\n\t| 'TIMEOUT'\n\t| 'ABORTED'\n\t| 'CIRCUIT_OPEN'\n\t| 'VALIDATION'\n\t| 'NETWORK'\n\t| 'HTTP'\n\t| 'UNKNOWN';\n\n// Error factory functions for convenience\nexport const createTimeoutError = (\n\ttimeout: Milliseconds,\n\tcause?: unknown,\n): TimeoutError => new TimeoutError(timeout, cause);\n\nexport const createAbortedError = (\n\treason?: string,\n\tcause?: unknown,\n): AbortedError => new AbortedError(reason, cause);\n\nexport const createCircuitOpenError = (\n\tresetAfter: Milliseconds,\n\tcause?: unknown,\n): CircuitOpenError => new CircuitOpenError(resetAfter, cause);\n\nexport const createValidationError = (\n\tmessage: string,\n\terrors: unknown[],\n\tcause?: unknown,\n): ValidationError => new ValidationError(message, errors, cause);\n\nexport const createNetworkError = (\n\tmessage: string,\n\tstatusCode?: number,\n\tcause?: unknown,\n): NetworkError => new NetworkError(message, statusCode, cause);\n\nexport const createHttpError = (\n\tmessage: string,\n\tstatus: number,\n\tresponse?: unknown,\n\tcause?: unknown,\n): HttpError => new HttpError(message, status, response, cause);\n\nexport const createUnknownError = (cause?: unknown): UnknownError =>\n\tnew UnknownError('Unknown error occurred', cause);\n","/**\n * Branded types for enhanced type safety and runtime validation\n * These provide compile-time guarantees while maintaining runtime checks\n */\n\n// Branded primitive types with runtime validation\nexport type Milliseconds = number & { readonly __brand: 'Milliseconds' };\nexport type RetryCount = number & { readonly __brand: 'RetryCount' };\nexport type ConcurrencyLimit = number & {\n\treadonly __brand: 'ConcurrencyLimit';\n};\nexport type Percentage = number & { readonly __brand: 'Percentage' };\nexport type StatusCode = number & { readonly __brand: 'StatusCode' };\n\n// Runtime validation functions that return branded types\nexport const asMilliseconds = (n: number): Milliseconds => {\n\tif (n < 0 || !Number.isFinite(n)) {\n\t\tthrow new Error(\n\t\t\t`Invalid milliseconds: must be a non-negative finite number, got ${n}`,\n\t\t);\n\t}\n\treturn n as Milliseconds;\n};\n\nexport const asRetryCount = (n: number): RetryCount => {\n\tif (n < 0 || !Number.isInteger(n)) {\n\t\tthrow new Error(\n\t\t\t`Invalid retry count: must be a non-negative integer, got ${n}`,\n\t\t);\n\t}\n\treturn n as RetryCount;\n};\n\nexport const asConcurrencyLimit = (n: number): ConcurrencyLimit => {\n\tif (n < 1 || !Number.isInteger(n)) {\n\t\tthrow new Error(\n\t\t\t`Invalid concurrency limit: must be a positive integer, got ${n}`,\n\t\t);\n\t}\n\treturn n as ConcurrencyLimit;\n};\n\nexport const asPercentage = (n: number): Percentage => {\n\tif (n < 0 || n > 100 || !Number.isFinite(n)) {\n\t\tthrow new Error(`Invalid percentage: must be between 0 and 100, got ${n}`);\n\t}\n\treturn n as Percentage;\n};\n\nexport const asStatusCode = (n: number): StatusCode => {\n\tif (!Number.isInteger(n) || n < 100 || n > 599) {\n\t\tthrow new Error(\n\t\t\t`Invalid status code: must be an integer between 100-599, got ${n}`,\n\t\t);\n\t}\n\treturn n as StatusCode;\n};\n\n// Type guards for branded types\nexport const isMilliseconds = (n: number): n is Milliseconds =>\n\tn >= 0 && Number.isFinite(n);\n\nexport const isRetryCount = (n: number): n is RetryCount =>\n\tn >= 0 && Number.isInteger(n);\n\nexport const isConcurrencyLimit = (n: number): n is ConcurrencyLimit =>\n\tn >= 1 && Number.isInteger(n);\n\nexport const isPercentage = (n: number): n is Percentage =>\n\tn >= 0 && n <= 100 && Number.isFinite(n);\n\nexport const isStatusCode = (n: number): n is StatusCode =>\n\tNumber.isInteger(n) && n >= 100 && n <= 599;\n\n// Utility functions for branded types\nexport const max = (\n\ta: Milliseconds | RetryCount | ConcurrencyLimit,\n\tb: Milliseconds | RetryCount | ConcurrencyLimit,\n): typeof a => ((a as number) > (b as number) ? a : b);\n\nexport const min = (\n\ta: Milliseconds | RetryCount | ConcurrencyLimit,\n\tb: Milliseconds | RetryCount | ConcurrencyLimit,\n): typeof a => ((a as number) < (b as number) ? a : b);\n","/**\n * Modern circuit breaker implementation with enhanced state management\n * Provides circuit breaker pattern with type safety and observability\n */\n\nimport { CircuitOpenError, type TypedError } from '../error/typed-error';\nimport {\n\tasMilliseconds,\n\tasRetryCount,\n\ttype Milliseconds,\n\ttype RetryCount,\n} from '../types/branded-types';\n\n// Circuit breaker configuration\nexport interface CircuitBreakerConfig<E extends TypedError = TypedError> {\n\t/** Number of consecutive failures before opening circuit */\n\treadonly failureThreshold: number;\n\n\t/** How long to wait before attempting to close circuit */\n\treadonly resetTimeout: number;\n\n\t/** Number of requests allowed in half-open state */\n\treadonly halfOpenRequests: number;\n\n\t/** Optional function to determine if error should count as failure */\n\treadonly shouldCountAsFailure?: (error: E) => boolean;\n}\n\n// Circuit breaker state\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\n// Internal state tracking\ninterface CircuitBreakerInternalState {\n\treadonly state: CircuitState;\n\treadonly failureCount: RetryCount;\n\treadonly halfOpenCount: RetryCount;\n\treadonly lastFailureTime?: Date;\n\treadonly nextAttemptTime?: Date;\n}\n\n// Modern circuit breaker implementation\nexport class CircuitBreaker<E extends TypedError = TypedError> {\n\tprivate state: CircuitBreakerInternalState;\n\tprivate readonly config: {\n\t\tfailureThreshold: RetryCount;\n\t\tresetTimeout: Milliseconds;\n\t\thalfOpenRequests: RetryCount;\n\t\tshouldCountAsFailure?: (error: E) => boolean;\n\t};\n\n\tconstructor(config: CircuitBreakerConfig<E>) {\n\t\tthis.config = {\n\t\t\tfailureThreshold: asRetryCount(config.failureThreshold),\n\t\t\tresetTimeout: asMilliseconds(config.resetTimeout),\n\t\t\thalfOpenRequests: asRetryCount(config.halfOpenRequests),\n\t\t\tshouldCountAsFailure: config.shouldCountAsFailure,\n\t\t};\n\t\tthis.state = {\n\t\t\tstate: 'closed',\n\t\t\tfailureCount: 0 as RetryCount,\n\t\t\thalfOpenCount: 0 as RetryCount,\n\t\t};\n\t}\n\n\t// Check if execution is allowed\n\tasync canExecute(): Promise<boolean> {\n\t\tthis.updateStateIfNeeded();\n\t\tif (this.state.state === 'open') {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.state.state === 'half-open') {\n\t\t\tif (this.state.halfOpenCount >= this.config.halfOpenRequests) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.state = {\n\t\t\t\t...this.state,\n\t\t\t\thalfOpenCount: (this.state.halfOpenCount + 1) as RetryCount,\n\t\t\t};\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Record successful execution\n\tasync recordSuccess(): Promise<void> {\n\t\tswitch (this.state.state) {\n\t\t\tcase 'closed':\n\t\t\t\t// Reset failure count on success\n\t\t\t\tthis.state = {\n\t\t\t\t\t...this.state,\n\t\t\t\t\tfailureCount: 0 as RetryCount,\n\t\t\t\t};\n\t\t\t\tbreak;\n\n\t\t\tcase 'half-open':\n\t\t\t\t// Close circuit on first success in half-open\n\t\t\t\tthis.state = {\n\t\t\t\t\tstate: 'closed',\n\t\t\t\t\tfailureCount: 0 as RetryCount,\n\t\t\t\t\thalfOpenCount: 0 as RetryCount,\n\t\t\t\t};\n\t\t\t\tbreak;\n\n\t\t\tcase 'open':\n\t\t\t\t// Should not happen, but handle gracefully\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Record failed execution\n\tasync recordFailure(error: E): Promise<void> {\n\t\tconst shouldCount = this.config.shouldCountAsFailure?.(error) ?? true;\n\n\t\tif (!shouldCount) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst now = new Date();\n\n\t\tswitch (this.state.state) {\n\t\t\tcase 'closed': {\n\t\t\t\tconst newFailureCount = (this.state.failureCount + 1) as RetryCount;\n\n\t\t\t\tif (newFailureCount >= this.config.failureThreshold) {\n\t\t\t\t\t// Open circuit\n\t\t\t\t\tthis.state = {\n\t\t\t\t\t\tstate: 'open',\n\t\t\t\t\t\tfailureCount: newFailureCount,\n\t\t\t\t\t\thalfOpenCount: 0 as RetryCount,\n\t\t\t\t\t\tlastFailureTime: now,\n\t\t\t\t\t\tnextAttemptTime: new Date(now.getTime() + this.config.resetTimeout),\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\t// Increment failure count\n\t\t\t\t\tthis.state = {\n\t\t\t\t\t\t...this.state,\n\t\t\t\t\t\tfailureCount: newFailureCount,\n\t\t\t\t\t\tlastFailureTime: now,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'half-open':\n\t\t\t\t// Open circuit immediately on failure in half-open\n\t\t\t\tthis.state = {\n\t\t\t\t\tstate: 'open',\n\t\t\t\t\tfailureCount: (this.state.failureCount + 1) as RetryCount,\n\t\t\t\t\thalfOpenCount: 0 as RetryCount,\n\t\t\t\t\tlastFailureTime: now,\n\t\t\t\t\tnextAttemptTime: new Date(now.getTime() + this.config.resetTimeout),\n\t\t\t\t};\n\t\t\t\tbreak;\n\n\t\t\tcase 'open':\n\t\t\t\t// Already open, just update failure time\n\t\t\t\tthis.state = {\n\t\t\t\t\t...this.state,\n\t\t\t\t\tlastFailureTime: now,\n\t\t\t\t\tnextAttemptTime: new Date(now.getTime() + this.config.resetTimeout),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Get current circuit state\n\tgetState(): CircuitBreakerState {\n\t\tthis.updateStateIfNeeded();\n\t\treturn {\n\t\t\t...this.state,\n\t\t\tcanExecute: this.state.state !== 'open',\n\t\t};\n\t}\n\n\t// Create error for when circuit is open\n\tcreateOpenError(): CircuitOpenError {\n\t\tconst resetAfter = this.state.nextAttemptTime\n\t\t\t? asMilliseconds(\n\t\t\t\t\tMath.max(0, this.state.nextAttemptTime.getTime() - Date.now()),\n\t\t\t\t)\n\t\t\t: this.config.resetTimeout;\n\n\t\treturn new CircuitOpenError(resetAfter);\n\t}\n\n\t// Force circuit to specific state (for testing/maintenance)\n\tforceState(state: CircuitState): void {\n\t\tthis.state = {\n\t\t\tstate,\n\t\t\tfailureCount: 0 as RetryCount,\n\t\t\thalfOpenCount: 0 as RetryCount,\n\t\t};\n\t}\n\n\t// Reset circuit to closed state\n\treset(): void {\n\t\tthis.state = {\n\t\t\tstate: 'closed',\n\t\t\tfailureCount: 0 as RetryCount,\n\t\t\thalfOpenCount: 0 as RetryCount,\n\t\t};\n\t}\n\n\t// Update state based on time\n\tprivate updateStateIfNeeded(): void {\n\t\tif (this.state.state === 'open' && this.state.nextAttemptTime) {\n\t\t\tconst now = new Date();\n\t\t\tif (now >= this.state.nextAttemptTime) {\n\t\t\t\t// Move to half-open state\n\t\t\t\tthis.state = {\n\t\t\t\t\t...this.state,\n\t\t\t\t\tstate: 'half-open',\n\t\t\t\t\thalfOpenCount: 0 as RetryCount,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Circuit breaker state information\nexport interface CircuitBreakerState {\n\treadonly state: CircuitState;\n\treadonly failureCount: RetryCount;\n\treadonly halfOpenCount: RetryCount;\n\treadonly lastFailureTime?: Date;\n\treadonly nextAttemptTime?: Date;\n\treadonly canExecute: boolean;\n}\n","/**\n * Modern error normalization system\n * Provides type-safe error transformation and normalization\n */\n\nimport { TypedError } from './typed-error';\n\n// Error normalizer function type\nexport type ErrorNormalizer<E extends TypedError = TypedError> = (\n\terror: unknown,\n) => E;\n\n// Built-in error normalizer rules\nexport type ErrorRule<E extends TypedError = TypedError> = (\n\terror: unknown,\n) => E | null;\n\n// Error normalization result\nexport type NormalizationResult<E extends TypedError> =\n\t| { success: true; error: E }\n\t| { success: false; originalError: unknown };\n\n// Create error normalizer from rules\nexport const createErrorNormalizer = <E extends TypedError>(\n\trules: ErrorRule<E>[],\n\tfallback: ErrorNormalizer<E>,\n): ErrorNormalizer<E> => {\n\treturn (error: unknown): E => {\n\t\tfor (const rule of rules) {\n\t\t\tconst result = rule(error);\n\t\t\tif (result !== null) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn fallback(error);\n\t};\n};\n\n// Create default fallback normalizer\nexport const createFallbackNormalizer = <E extends TypedError>(\n\tErrorClass: new (message: string, cause?: unknown) => E,\n): ErrorNormalizer<E> => {\n\treturn (error: unknown): E => {\n\t\tif (error instanceof TypedError) {\n\t\t\treturn error as unknown as E;\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\treturn new ErrorClass(error.message, error);\n\t\t}\n\t\tif (typeof error === 'string') {\n\t\t\treturn new ErrorClass(error);\n\t\t}\n\t\treturn new ErrorClass('Unknown error occurred', error);\n\t};\n};\n","/**\n * Modern fluent error rule builder\n * Provides type-safe error rule creation with enhanced ergonomics\n */\n\nimport type { ErrorRule } from './error-normalizer';\nimport { TypedError } from './typed-error';\n\ntype StatusCarrier = {\n\tstatus?: number;\n\tstatusCode?: number;\n\tmessage?: string;\n};\n\ntype CodeCarrier = {\n\tcode?: string;\n\tmessage?: string;\n\tname?: string;\n};\n\nconst hasNumericStatus = (err: unknown): err is StatusCarrier => {\n\tif (typeof err !== 'object' || err === null) return false;\n\tconst candidate = err as StatusCarrier;\n\treturn (\n\t\ttypeof candidate.status === 'number' ||\n\t\ttypeof candidate.statusCode === 'number'\n\t);\n};\n\nconst hasStringCode = (err: unknown): err is CodeCarrier => {\n\tif (typeof err !== 'object' || err === null) return false;\n\tconst candidate = err as CodeCarrier;\n\treturn typeof candidate.code === 'string' && candidate.code.length > 0;\n};\n\nconst isNetworkish = (err: unknown): err is Error | CodeCarrier => {\n\tif (err instanceof Error) {\n\t\t// Common fetch/network errors in browsers/Bun/Node.\n\t\tif (err.name === 'TypeError') return true;\n\t\tconst msg = err.message.toLowerCase();\n\t\tif (msg.includes('fetch') && msg.includes('failed')) return true;\n\t\tif (msg.includes('network')) return true;\n\t}\n\n\tif (hasStringCode(err)) {\n\t\tconst code = (err.code ?? '').toUpperCase();\n\t\treturn (\n\t\t\tcode === 'ECONNRESET' ||\n\t\t\tcode === 'ECONNREFUSED' ||\n\t\t\tcode === 'ETIMEDOUT' ||\n\t\t\tcode === 'ENOTFOUND' ||\n\t\t\tcode === 'EAI_AGAIN'\n\t\t);\n\t}\n\n\treturn false;\n};\n\n// Modern error rule builder with enhanced ergonomics\nexport class ErrorRuleBuilder<T> {\n\tconstructor(private readonly predicate: (err: unknown) => err is T) {}\n\n\ttoCode<const C extends string>(code: C) {\n\t\treturn new ErrorMapper<T, C>(this.predicate, code);\n\t}\n\n\t// Map to a typed error instance (compatible with existing tests)\n\t// The returned rule is usable in createErrorNormalizer/trybox({ rules }).\n\ttoError<\n\t\tconst Out extends {\n\t\t\tcode: string;\n\t\t\tmessage: string;\n\t\t\tmeta?: unknown;\n\t\t\tstatus?: number;\n\t\t\tcause?: unknown;\n\t\t},\n\t>(mapper: (err: T) => Out): ErrorRule<TypedError<Out['code'], Out['meta']>> {\n\t\treturn (err: unknown) => {\n\t\t\tif (!this.predicate(err)) return null;\n\t\t\tconst out = mapper(err as T);\n\t\t\tconst code = out.code as Out['code'];\n\n\t\t\tclass CustomError extends TypedError<Out['code'], Out['meta']> {\n\t\t\t\treadonly code = code;\n\t\t\t\tconstructor() {\n\t\t\t\t\tsuper(out.message, {\n\t\t\t\t\t\tcause: out.cause ?? err,\n\t\t\t\t\t\tmeta: out.meta,\n\t\t\t\t\t\tstatus: out.status,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new CustomError();\n\t\t};\n\t}\n}\n\n// Error mapper for code-based mapping\nexport class ErrorMapper<T, C extends string> {\n\tconstructor(\n\t\tprivate readonly predicate: (err: unknown) => err is T,\n\t\tprivate readonly errorCode: C,\n\t) {}\n\n\twith<const M = unknown>(\n\t\tmapper: (err: T) => {\n\t\t\tmessage: string;\n\t\t\tcause?: unknown;\n\t\t\tmeta?: M;\n\t\t\tstatus?: number;\n\t\t},\n\t) {\n\t\treturn (err: unknown): TypedError<C, M> | null => {\n\t\t\tif (!this.predicate(err)) return null;\n\t\t\tconst mapped = mapper(err);\n\n\t\t\tconst errorCode = this.errorCode;\n\t\t\tclass CustomTypedError extends TypedError<C, M> {\n\t\t\t\treadonly code = errorCode;\n\t\t\t\tconstructor() {\n\t\t\t\t\tsuper(mapped.message, {\n\t\t\t\t\t\tcause: mapped.cause,\n\t\t\t\t\t\tmeta: mapped.meta,\n\t\t\t\t\t\tstatus: mapped.status,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new CustomTypedError();\n\t\t};\n\t}\n}\n\n// Enhanced error rule factory with modern patterns\nexport const createErrorRule = {\n\twhen: <T>(predicate: (err: unknown) => err is T) =>\n\t\tnew ErrorRuleBuilder(predicate),\n\n\tinstance: <T extends new (...args: unknown[]) => unknown>(ErrorClass: T) =>\n\t\tnew ErrorRuleBuilder(\n\t\t\t(err): err is InstanceType<T> => err instanceof ErrorClass,\n\t\t),\n\n\tcode: <C extends string>(code: C) => ({\n\t\tfor: <T>(predicate: (err: unknown) => err is T) =>\n\t\t\tnew ErrorMapper(predicate, code),\n\t}),\n\n\t// Built-in error rules for common cases\n\tstring: <C extends string>(message: string, code: C) => ({\n\t\twhen: <T>(predicate: (err: unknown) => err is T) =>\n\t\t\tcreateErrorRule\n\t\t\t\t.when(predicate)\n\t\t\t\t.toCode(code)\n\t\t\t\t.with((err) => ({\n\t\t\t\t\tmessage: err === message ? message : `${code}: ${err}`,\n\t\t\t\t\tcause: err,\n\t\t\t\t})),\n\t}),\n\n\t// HTTP status error rule\n\thttpStatus: <C extends string>(status: number, code?: C) => ({\n\t\tfor: <T>(predicate: (err: unknown) => err is T) =>\n\t\t\tcreateErrorRule\n\t\t\t\t.when(predicate)\n\t\t\t\t.toCode(code ?? `HTTP_${status}`)\n\t\t\t\t.with((err) => ({\n\t\t\t\t\tmessage: `HTTP ${status} error`,\n\t\t\t\t\tcause: err,\n\t\t\t\t})),\n\t}),\n\n\t// NOTE: advanced helpers removed for simplicity\n} as const;\n\n// Legacy compatibility exports\nexport { ErrorRuleBuilder as errorRuleBuilder, ErrorMapper as errorMapper };\n\n// Utility functions for rule composition\nexport const combineRules = <E extends TypedError>(\n\t...rules: ErrorRule<E>[]\n): ErrorRule<E> => {\n\treturn (error: unknown): E | null => {\n\t\tfor (const rule of rules) {\n\t\t\tconst result = rule(error);\n\t\t\tif (result !== null) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n};\n\nexport const chainRules = (\n\t...rules: Array<ErrorRule<TypedError> | ((err: unknown) => TypedError | null)>\n): ErrorRule<TypedError> => {\n\treturn (error: unknown): TypedError | null => {\n\t\tconst currentError = error;\n\n\t\tfor (const rule of rules) {\n\t\t\tconst result = rule(currentError);\n\t\t\tif (result !== null) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t};\n};\n\n// Built-in error rule presets\nexport const BuiltinRules = {\n\t// Preserve TypedError instances as-is\n\ttyped: ((err: unknown): TypedError | null =>\n\t\terr instanceof TypedError ? err : null) as ErrorRule<TypedError>,\n\n\t// Abort errors\n\tabort: createErrorRule\n\t\t.when(\n\t\t\t(err): err is DOMException =>\n\t\t\t\terr instanceof DOMException && err.name === 'AbortError',\n\t\t)\n\t\t.toCode('ABORTED')\n\t\t.with((err) => ({\n\t\t\tmessage: err.message || 'Operation was aborted',\n\t\t\tcause: err,\n\t\t})),\n\n\t// Timeout errors\n\ttimeout: createErrorRule\n\t\t.when(\n\t\t\t(err): err is Error =>\n\t\t\t\terr instanceof Error && err.name === 'TimeoutError',\n\t\t)\n\t\t.toCode('TIMEOUT')\n\t\t.with((err) => ({\n\t\t\tmessage: err.message || 'Operation timed out',\n\t\t\tcause: err,\n\t\t})),\n\n\t// Network errors\n\tnetwork: createErrorRule\n\t\t.when((err): err is Error | CodeCarrier => isNetworkish(err))\n\t\t.toCode('NETWORK')\n\t\t.with((err) => {\n\t\t\tconst message =\n\t\t\t\terr instanceof Error\n\t\t\t\t\t? err.message || 'Network error'\n\t\t\t\t\t: err.message || 'Network error';\n\t\t\treturn {\n\t\t\t\tmessage,\n\t\t\t\tcause: err,\n\t\t\t};\n\t\t}),\n\n\t// HTTP errors (4xx, 5xx)\n\thttp: createErrorRule\n\t\t.when((err): err is StatusCarrier => {\n\t\t\tif (!hasNumericStatus(err)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst candidate = err as StatusCarrier;\n\t\t\tconst status = candidate.status ?? candidate.statusCode;\n\t\t\treturn typeof status === 'number' && status >= 400;\n\t\t})\n\t\t.toCode('HTTP')\n\t\t.with((err) => {\n\t\t\tconst status = err.status ?? err.statusCode;\n\t\t\treturn {\n\t\t\t\tmessage: err.message || `HTTP ${status ?? 'error'} error`,\n\t\t\t\tcause: err,\n\t\t\t\tstatus: typeof status === 'number' ? status : undefined,\n\t\t\t};\n\t\t}),\n\n\t// Generic error fallback\n\tunknown: createErrorRule\n\t\t.when(\n\t\t\t(err): err is Error =>\n\t\t\t\terr instanceof Error && !(err instanceof TypedError),\n\t\t)\n\t\t.toCode('UNKNOWN')\n\t\t.with((err) => ({\n\t\t\tmessage: err.message || 'Unknown error occurred',\n\t\t\tcause: err,\n\t\t})),\n} as const;\n","/**\n * Built-in error rules for common error patterns\n * Provides ready-to-use error normalization rules\n */\n\nimport { BuiltinRules, createErrorRule } from './error-builder';\nimport type { ErrorRule } from './error-normalizer';\nimport { CircuitOpenError, ValidationError } from './typed-error';\n\n// Built-in error rules export\nexport { BuiltinRules };\n\n// Combined built-in rules array\nexport const builtInRules: ErrorRule[] = [\n\tBuiltinRules.typed,\n\tBuiltinRules.abort,\n\tBuiltinRules.timeout,\n\tBuiltinRules.http,\n\tBuiltinRules.network,\n\tBuiltinRules.unknown,\n];\n\n// Export createErrorRule for convenience\nexport { createErrorRule };\n\n// Error rule factory for creating custom rules\nexport const errorRule = {\n\twhen: <T>(predicate: (err: unknown) => err is T) =>\n\t\tcreateErrorRule.when(predicate),\n\n\tinstance: <T extends new (...args: unknown[]) => unknown>(ErrorClass: T) =>\n\t\tcreateErrorRule.instance(ErrorClass),\n} as const;\n\n// Default error rule set\nexport const defaultRules = builtInRules;\n\n// Timeout error rule\nexport const timeoutErrorRule: ErrorRule = BuiltinRules.timeout;\n\n// Aborted error rule\nexport const abortedErrorRule: ErrorRule = BuiltinRules.abort;\n\n// Network error rule\nexport const networkErrorRule: ErrorRule = BuiltinRules.network;\n\n// HTTP error rule\nexport const httpErrorRule: ErrorRule = BuiltinRules.http;\n\n// Circuit breaker error rule\nexport const circuitOpenErrorRule: ErrorRule = createErrorRule\n\t.when((err): err is CircuitOpenError => err instanceof CircuitOpenError)\n\t.toCode('CIRCUIT_OPEN')\n\t.with((err) => ({\n\t\tmessage: err.message,\n\t\tcause: err,\n\t}));\n\n// Validation error rule\nexport const validationErrorRule: ErrorRule = createErrorRule\n\t.when((err): err is ValidationError => err instanceof ValidationError)\n\t.toCode('VALIDATION')\n\t.with((err) => ({\n\t\tmessage: err.message,\n\t\tcause: err,\n\t}));\n","/**\n * Modern retry strategies with enhanced capabilities\n * Provides various retry patterns with type safety\n */\n\nimport type { RetryCount } from '../types/branded-types';\n\n// Modern retry strategy types\nexport type RetryStrategy =\n\t| FixedDelayStrategy\n\t| ExponentialBackoffStrategy\n\t| FibonacciBackoffStrategy\n\t| CustomDelayStrategy;\n\nexport interface FixedDelayStrategy {\n\treadonly type: 'fixed';\n\treadonly delay: number;\n}\n\nexport interface ExponentialBackoffStrategy {\n\treadonly type: 'exponential';\n\treadonly base: number;\n\treadonly factor: number;\n\treadonly maxDelay?: number;\n}\n\nexport interface FibonacciBackoffStrategy {\n\treadonly type: 'fibonacci';\n\treadonly base: number;\n\treadonly maxDelay?: number;\n}\n\nexport interface CustomDelayStrategy {\n\treadonly type: 'custom';\n\treadonly calculate: (attempt: RetryCount, error: unknown) => number;\n}\n\n// Strategy factory functions\nexport const RetryStrategies = {\n\tfixed: (delay: number): FixedDelayStrategy => ({\n\t\ttype: 'fixed',\n\t\tdelay,\n\t}),\n\n\texponential: (\n\t\tbase: number,\n\t\tfactor: number = 2,\n\t\tmaxDelay?: number,\n\t): ExponentialBackoffStrategy => ({\n\t\ttype: 'exponential',\n\t\tbase,\n\t\tfactor,\n\t\tmaxDelay,\n\t}),\n\n\tfibonacci: (base: number, maxDelay?: number): FibonacciBackoffStrategy => ({\n\t\ttype: 'fibonacci',\n\t\tbase,\n\t\tmaxDelay,\n\t}),\n\n\tcustom: (\n\t\tcalculate: (attempt: RetryCount, error: unknown) => number,\n\t): CustomDelayStrategy => ({\n\t\ttype: 'custom',\n\t\tcalculate,\n\t}),\n} as const;\n\n// Delay calculation functions\nexport const calculateDelay = (\n\tstrategy: RetryStrategy,\n\tattempt: RetryCount,\n\terror: unknown,\n): number => {\n\tswitch (strategy.type) {\n\t\tcase 'fixed': {\n\t\t\treturn strategy.delay;\n\t\t}\n\t\tcase 'exponential': {\n\t\t\tconst expDelay = strategy.base * strategy.factor ** (Number(attempt) - 1);\n\t\t\treturn (\n\t\t\t\tstrategy.maxDelay ? Math.min(expDelay, strategy.maxDelay) : expDelay\n\t\t\t) as number;\n\t\t}\n\n\t\tcase 'fibonacci': {\n\t\t\tconst fibDelay = strategy.base * fibonacci(Number(attempt));\n\t\t\treturn (\n\t\t\t\tstrategy.maxDelay ? Math.min(fibDelay, strategy.maxDelay) : fibDelay\n\t\t\t) as number;\n\t\t}\n\n\t\tcase 'custom': {\n\t\t\treturn strategy.calculate(attempt, error);\n\t\t}\n\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = strategy;\n\t\t\treturn _exhaustive;\n\t\t}\n\t}\n};\n\n// Fibonacci sequence calculator\nconst fibonacci = (n: number): number => {\n\tif (n <= 1) return 1;\n\tlet prev = 1;\n\tlet curr = 1;\n\tfor (let i = 2; i <= n; i++) {\n\t\tconst next = prev + curr;\n\t\tprev = curr;\n\t\tcurr = next;\n\t}\n\treturn curr;\n};\n\n// Utility functions for strategy validation\nexport const validateStrategy = (strategy: RetryStrategy): void => {\n\tswitch (strategy.type) {\n\t\tcase 'fixed': {\n\t\t\tif (strategy.delay <= 0) {\n\t\t\t\tthrow new Error('Fixed delay must be positive');\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'exponential':\n\t\t\tif (strategy.base <= 0) {\n\t\t\t\tthrow new Error('Exponential base delay must be positive');\n\t\t\t}\n\t\t\tif (strategy.factor <= 1) {\n\t\t\t\tthrow new Error('Exponential factor must be greater than 1');\n\t\t\t}\n\t\t\tif (strategy.maxDelay && strategy.maxDelay <= 0) {\n\t\t\t\tthrow new Error('Exponential max delay must be positive');\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'fibonacci':\n\t\t\tif (strategy.base <= 0) {\n\t\t\t\tthrow new Error('Fibonacci base delay must be positive');\n\t\t\t}\n\t\t\tif (strategy.maxDelay && strategy.maxDelay <= 0) {\n\t\t\t\tthrow new Error('Fibonacci max delay must be positive');\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'custom':\n\t\t\t// Cannot validate custom function at runtime\n\t\t\tbreak;\n\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = strategy;\n\t\t\tthrow new Error(`Unknown strategy type: ${_exhaustive}`);\n\t\t}\n\t}\n};\n","/**\n * Modern utility functions for timing and common operations\n * Provides enhanced utilities with type safety\n */\n\nimport type { Milliseconds } from '../types/branded-types';\n\n// Enhanced sleep function with cancellation support\nexport const sleep = (\n\tms: number | Milliseconds,\n\tsignal?: AbortSignal,\n): Promise<void> => {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new DOMException('Aborted', 'AbortError'));\n\t\t\treturn;\n\t\t}\n\n\t\tconst cleanup = (onAbort?: () => void) => {\n\t\t\tif (signal && onAbort) {\n\t\t\t\tsignal.removeEventListener('abort', onAbort);\n\t\t\t}\n\t\t};\n\n\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\t\tconst onAbort = () => {\n\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\tcleanup(onAbort);\n\t\t\treject(new DOMException('Aborted', 'AbortError'));\n\t\t};\n\n\t\ttimeoutId = setTimeout(() => {\n\t\t\tcleanup(onAbort);\n\t\t\tresolve();\n\t\t}, ms as number);\n\n\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\t});\n};\n\n// Enhanced timeout with promise race\nexport const withTimeout = <T>(\n\tpromise: Promise<T>,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<T> => {\n\treturn new Promise<T>((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new DOMException('Aborted', 'AbortError'));\n\t\t\treturn;\n\t\t}\n\n\t\tlet settled = false;\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(new Error(`Operation timed out after ${timeoutMs}ms`));\n\t\t}, timeoutMs);\n\n\t\tconst onAbort = () => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(new DOMException('Aborted', 'AbortError'));\n\t\t};\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tsignal?.removeEventListener('abort', onAbort);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\n\t\tpromise.then(\n\t\t\t(value) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tcleanup();\n\t\t\t\tresolve(value);\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t},\n\t\t);\n\t});\n};\n\n// Debounce function with type safety\nexport const debounce = <T extends (...args: unknown[]) => unknown>(\n\tfunc: T,\n\tdelay: Milliseconds,\n): T => {\n\tlet timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n\treturn ((...args: Parameters<T>) => {\n\t\tif (timeoutId !== null) {\n\t\t\tclearTimeout(timeoutId);\n\t\t}\n\n\t\ttimeoutId = setTimeout(() => {\n\t\t\tfunc(...args);\n\t\t\ttimeoutId = null;\n\t\t}, delay);\n\t}) as T;\n};\n\n// Throttle function with type safety\nexport const throttle = <T extends (...args: unknown[]) => unknown>(\n\tfunc: T,\n\tdelay: Milliseconds,\n): T => {\n\tlet lastCallTime = 0;\n\tlet timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n\treturn ((...args: Parameters<T>) => {\n\t\tconst now = Date.now();\n\n\t\tif (now - lastCallTime >= delay) {\n\t\t\tlastCallTime = now;\n\t\t\tfunc(...args);\n\t\t} else if (timeoutId === null) {\n\t\t\ttimeoutId = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tlastCallTime = Date.now();\n\t\t\t\t\tfunc(...args);\n\t\t\t\t\ttimeoutId = null;\n\t\t\t\t},\n\t\t\t\tdelay - (now - lastCallTime),\n\t\t\t);\n\t\t}\n\t}) as T;\n};\n\n// Retry with exponential backoff\nexport const retry = async <T>(\n\toperation: () => Promise<T>,\n\tmaxRetries: number,\n\tbaseDelay: Milliseconds,\n\tbackoffFactor: number = 2,\n): Promise<T> => {\n\tlet lastError: Error | undefined;\n\n\tfor (let attempt = 0; attempt <= maxRetries; attempt++) {\n\t\ttry {\n\t\t\treturn await operation();\n\t\t} catch (error) {\n\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\n\t\t\tif (attempt === maxRetries) {\n\t\t\t\tthrow lastError;\n\t\t\t}\n\n\t\t\tconst delay = baseDelay * backoffFactor ** attempt;\n\t\t\tawait sleep(delay as Milliseconds);\n\t\t}\n\t}\n\n\tthrow lastError ?? new Error('Operation failed after retries');\n};\n\n// Measure execution time\nexport const measureTime = async <T>(\n\toperation: () => Promise<T>,\n): Promise<{ result: T; duration: Milliseconds }> => {\n\tconst start = Date.now();\n\tconst result = await operation();\n\tconst duration = (Date.now() - start) as Milliseconds;\n\n\treturn { result, duration };\n};\n\n// Create a promise with external resolve/reject\nexport const createDeferred = <T = void>(): {\n\tpromise: Promise<T>;\n\tresolve: (value: T) => void;\n\treject: (reason?: unknown) => void;\n} => {\n\tlet resolve: ((value: T) => void) | undefined;\n\tlet reject: ((reason?: unknown) => void) | undefined;\n\n\tconst promise = new Promise<T>((res, rej) => {\n\t\tresolve = res;\n\t\treject = rej;\n\t});\n\n\tif (!resolve || !reject) {\n\t\tthrow new Error('Promise executor did not initialize resolve/reject');\n\t}\n\n\treturn { promise, resolve, reject };\n};\n\n// Safe JSON parsing with error handling\nexport const safeJsonParse = <T = unknown>(\n\ttext: string,\n\tfallback?: T,\n): T | null => {\n\ttry {\n\t\treturn JSON.parse(text) as T;\n\t} catch {\n\t\treturn fallback ?? null;\n\t}\n};\n\n// Safe JSON stringify with error handling\nexport const safeJsonStringify = (\n\tvalue: unknown,\n\tfallback?: string,\n): string | null => {\n\ttry {\n\t\treturn JSON.stringify(value);\n\t} catch {\n\t\treturn fallback ?? null;\n\t}\n};\n","/**\n * Modern executor with enhanced capabilities\n * Provides comprehensive task execution with circuit breaker and retry logic\n */\n\nimport { CircuitBreaker } from '../circuit-breaker/breaker';\nimport type { ErrorNormalizer, ErrorRule } from '../error/error-normalizer';\nimport {\n\tcreateErrorNormalizer,\n\tcreateFallbackNormalizer,\n} from '../error/error-normalizer';\nimport { defaultRules } from '../error/error-rules';\nimport {\n\ttype AbortedError,\n\ttype CircuitOpenError,\n\ttype HttpError,\n\ttype NetworkError,\n\tTimeoutError,\n\ttype TypedError,\n\tUnknownError,\n\ttype ValidationError,\n} from '../error/typed-error';\nimport { calculateDelay } from '../retry/retry-strategies';\nimport {\n\tasConcurrencyLimit,\n\tasMilliseconds,\n\tasRetryCount,\n\ttype Milliseconds,\n\ttype RetryCount,\n} from '../types/branded-types';\nimport type { ExecutionConfig, JitterConfig } from '../types/config-types';\nimport type { ExecutionMetrics, ExecutionResult } from '../types/result-types';\nimport { sleep } from '../utils/timing';\n\n// Modern executor with enhanced capabilities\nexport type RulesMode = 'extend' | 'replace';\n\nexport type DefaultError =\n\t| AbortedError\n\t| TimeoutError\n\t| NetworkError\n\t| HttpError\n\t| CircuitOpenError\n\t| ValidationError\n\t| UnknownError;\n\ntype NonNull<T> = T extends null ? never : T;\ntype RuleReturn<R> = R extends (err: unknown) => infer Out\n\t? NonNull<Out>\n\t: never;\n\nexport type InferErrorFromRules<\n\tTRules extends readonly ErrorRule<TypedError>[],\n> = TRules extends readonly []\n\t? TypedError\n\t: RuleReturn<TRules[number]> | UnknownError;\n\nexport type ExecutorOptions<E extends TypedError = TypedError> = Omit<\n\tPartial<ExecutionConfig<E>>,\n\t'errorHandling'\n> & {\n\trules?: Array<ErrorRule<E>>;\n\trulesMode?: RulesMode;\n\tfallback?: (err: unknown) => E;\n\ttoError?: (err: unknown) => E;\n\tmapError?: (error: E) => E;\n};\n\nconst buildNormalizer = <E extends TypedError>(\n\topts: ExecutorOptions<E>,\n): ErrorNormalizer<E> => {\n\tif (opts.toError) return opts.toError;\n\n\tconst rulesMode: RulesMode = opts.rulesMode ?? 'extend';\n\tconst userRules = (opts.rules ?? []) as Array<ErrorRule<E>>;\n\tconst builtins = defaultRules as unknown as Array<ErrorRule<E>>;\n\n\tconst fallback =\n\t\topts.fallback ??\n\t\t((err: unknown) =>\n\t\t\tcreateFallbackNormalizer(\n\t\t\t\tUnknownError as unknown as new (\n\t\t\t\t\tmessage: string,\n\t\t\t\t\tcause?: unknown,\n\t\t\t\t) => E,\n\t\t\t)(err));\n\n\tconst rules =\n\t\trulesMode === 'replace' ? userRules : [...userRules, ...builtins];\n\treturn createErrorNormalizer(rules, fallback);\n};\n\nexport class Executor<E extends TypedError = TypedError> {\n\tprivate readonly circuitBreaker?: CircuitBreaker<E>;\n\tprivate readonly config: ExecutionConfig<E>;\n\tprivate lastCircuitState?: 'closed' | 'open' | 'half-open';\n\n\tconstructor(options: ExecutorOptions<E> = {}) {\n\t\tconst {\n\t\t\trules: _rules,\n\t\t\trulesMode: _rulesMode,\n\t\t\tfallback: _fallback,\n\t\t\ttoError: _toError,\n\t\t\tmapError,\n\t\t\t...executionConfig\n\t\t} = options;\n\t\tconst normalizer = buildNormalizer(options);\n\t\tconst baseConfig: ExecutionConfig<E> = {\n\t\t\t...executionConfig,\n\t\t\terrorHandling: {\n\t\t\t\tnormalizer,\n\t\t\t\tmapError,\n\t\t\t},\n\t\t};\n\n\t\tthis.config = baseConfig;\n\n\t\tif (baseConfig.circuitBreaker) {\n\t\t\tthis.circuitBreaker = new CircuitBreaker(baseConfig.circuitBreaker);\n\t\t\tthis.lastCircuitState = this.circuitBreaker.getState().state;\n\t\t}\n\t}\n\n\t// Execute a single task\n\tasync execute<T>(\n\t\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\t\toptions: Partial<ExecutionConfig<E>> = {},\n\t): Promise<ExecutionResult<T, E>> {\n\t\tconst mergedConfig = { ...this.config, ...options };\n\n\t\t// Circuit breaker check\n\t\tif (this.circuitBreaker) {\n\t\t\tconst before =\n\t\t\t\tthis.lastCircuitState ?? this.circuitBreaker.getState().state;\n\t\t\tconst canExecute = await this.circuitBreaker.canExecute();\n\t\t\tconst after = this.circuitBreaker.getState().state;\n\t\t\tif (before !== after) {\n\t\t\t\ttry {\n\t\t\t\t\tmergedConfig.hooks?.onCircuitStateChange?.(before, after);\n\t\t\t\t} catch {\n\t\t\t\t\t// Hooks must never affect control flow.\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.lastCircuitState = after;\n\t\t\tif (!canExecute) {\n\t\t\t\tconst error = this.circuitBreaker.createOpenError() as E;\n\n\t\t\t\tconst result: ExecutionResult<T, E> = {\n\t\t\t\t\ttype: 'failure',\n\t\t\t\t\tok: false,\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror,\n\t\t\t\t\tmetrics: {\n\t\t\t\t\t\ttotalAttempts: 0 as RetryCount,\n\t\t\t\t\t\ttotalRetries: 0 as RetryCount,\n\t\t\t\t\t\ttotalDuration: 0 as Milliseconds,\n\t\t\t\t\t\tretryHistory: [],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\n\t\tconst result = await executeInternal(task, mergedConfig);\n\n\t\t// Update circuit breaker state\n\t\tif (this.circuitBreaker) {\n\t\t\tconst before =\n\t\t\t\tthis.lastCircuitState ?? this.circuitBreaker.getState().state;\n\t\t\tif (result.ok) {\n\t\t\t\tawait this.circuitBreaker.recordSuccess();\n\t\t\t} else {\n\t\t\t\tawait this.circuitBreaker.recordFailure(result.error);\n\t\t\t}\n\t\t\tconst after = this.circuitBreaker.getState().state;\n\t\t\tif (before !== after) {\n\t\t\t\ttry {\n\t\t\t\t\tmergedConfig.hooks?.onCircuitStateChange?.(before, after);\n\t\t\t\t} catch {\n\t\t\t\t\t// Hooks must never affect control flow.\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.lastCircuitState = after;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tasync executeOrThrow<T>(\n\t\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\t\toptions: Partial<ExecutionConfig<E>> = {},\n\t): Promise<T> {\n\t\tconst r = await this.execute(task, options);\n\t\tif (r.ok) return r.data;\n\t\tthrow r.error;\n\t}\n\n\t// Execute multiple tasks with concurrency control\n\tasync executeAll<T>(\n\t\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\t\toptions: Partial<ExecutionConfig<E> & { concurrency?: number }> = {},\n\t): Promise<ExecutionResult<T, E>[]> {\n\t\tconst mergedConfig = { ...this.config, ...options };\n\t\tconst rawConcurrency = mergedConfig.concurrency ?? Number.POSITIVE_INFINITY;\n\t\tconst concurrency = Number.isFinite(rawConcurrency)\n\t\t\t? Number(asConcurrencyLimit(rawConcurrency))\n\t\t\t: Number.POSITIVE_INFINITY;\n\n\t\tconst out: ExecutionResult<T, E>[] = new Array(tasks.length);\n\t\tlet idx = 0;\n\n\t\tconst worker = async () => {\n\t\t\twhile (true) {\n\t\t\t\tconst current = idx;\n\t\t\t\tidx++;\n\t\t\t\tif (current >= tasks.length) return;\n\t\t\t\tconst task = tasks[current];\n\t\t\t\tif (!task) return;\n\t\t\t\tout[current] = await this.execute(task, mergedConfig);\n\t\t\t}\n\t\t};\n\n\t\tconst workers = Array.from(\n\t\t\t{ length: Math.min(concurrency, tasks.length) },\n\t\t\t() => worker(),\n\t\t);\n\n\t\tawait Promise.all(workers);\n\n\t\treturn out;\n\t}\n\n\tasync executeAllOrThrow<T>(\n\t\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\t\toptions: Partial<ExecutionConfig<E> & { concurrency?: number }> = {},\n\t): Promise<T[]> {\n\t\tconst results = await this.executeAll(tasks, options);\n\t\tfor (const r of results) {\n\t\t\tif (!r.ok) throw r.error;\n\t\t}\n\t\treturn results.map((r) => {\n\t\t\tif (!r.ok) throw r.error;\n\t\t\treturn r.data;\n\t\t});\n\t}\n\n\t// (additional helpers removed; prefer compose outside)\n\n\t// Get current circuit breaker state\n\tgetCircuitBreakerState() {\n\t\treturn this.circuitBreaker?.getState();\n\t}\n\n\t// Reset circuit breaker\n\tresetCircuitBreaker(): void {\n\t\tthis.circuitBreaker?.reset();\n\t}\n\n\t// Get executor configuration\n\tgetConfig(): ExecutionConfig<E> {\n\t\treturn { ...this.config };\n\t}\n\n\t// Create a new executor with merged configuration\n\twithConfig(additionalConfig: Partial<ExecutionConfig<E>>): Executor<E> {\n\t\tconst { errorHandling: currentHandling, ...baseConfig } = this.config;\n\t\tconst { errorHandling: nextHandling, ...extraConfig } = additionalConfig;\n\n\t\tconst normalizer = nextHandling?.normalizer ?? currentHandling.normalizer;\n\t\tconst mapError = nextHandling?.mapError ?? currentHandling.mapError;\n\n\t\treturn new Executor<E>({\n\t\t\t...baseConfig,\n\t\t\t...extraConfig,\n\t\t\ttoError: normalizer,\n\t\t\tmapError,\n\t\t});\n\t}\n\n\t// Create a new executor with different error type\n\twithErrorType<T extends TypedError>(\n\t\tconfig: Partial<ExecutionConfig<T>> = {},\n\t): Executor<T> {\n\t\treturn new Executor<T>(config as ExecutionConfig<T>);\n\t}\n}\n\nexport function createExecutor<\n\tconst TRules extends readonly ErrorRule<TypedError>[],\n>(\n\toptions: Omit<ExecutorOptions<InferErrorFromRules<TRules>>, 'rules'> & {\n\t\trules: TRules;\n\t},\n): Executor<InferErrorFromRules<TRules>>;\nexport function createExecutor<E extends TypedError = DefaultError>(\n\toptions?: ExecutorOptions<E>,\n): Executor<E>;\nexport function createExecutor<E extends TypedError = DefaultError>(\n\toptions?: ExecutorOptions<E>,\n): Executor<E> {\n\treturn new Executor<E>(options);\n}\n\nasync function executeInternal<T, E extends TypedError>(\n\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\tconfig: ExecutionConfig<E>,\n): Promise<ExecutionResult<T, E>> {\n\tconst {\n\t\tsignal: outerSignal,\n\t\tignoreAbort = true,\n\t\ttimeout,\n\t\tretry,\n\t\terrorHandling,\n\t\thooks,\n\t\tlogger,\n\t} = config;\n\n\tconst safeCall = (\n\t\tfn: ((...args: unknown[]) => unknown) | undefined,\n\t\t...args: unknown[]\n\t) => {\n\t\ttry {\n\t\t\tfn?.(...args);\n\t\t} catch {\n\t\t\t// Observability must never affect control flow.\n\t\t}\n\t};\n\n\tlet lastError: E | undefined;\n\tlet totalAttempts = 0 as RetryCount;\n\tlet totalRetries = 0 as RetryCount;\n\tconst retryHistory: Array<{\n\t\tattempt: RetryCount;\n\t\terror: E;\n\t\tdelay: Milliseconds;\n\t\ttimestamp: Date;\n\t}> = [];\n\tconst startTime = Date.now();\n\n\tconst { signal: compositeSignal, cleanup: cleanupCompositeSignal } =\n\t\tcreateCompositeSignal(outerSignal);\n\n\ttry {\n\t\tif (compositeSignal.aborted) {\n\t\t\tsafeCall(\n\t\t\t\thooks?.onAbort as unknown as (...a: unknown[]) => unknown,\n\t\t\t\tcompositeSignal,\n\t\t\t);\n\t\t\t// normalize abort immediately\n\t\t\tconst e = errorHandling.normalizer(\n\t\t\t\tnew DOMException('Aborted', 'AbortError'),\n\t\t\t);\n\t\t\tconst mapped = errorHandling.mapError ? errorHandling.mapError(e) : e;\n\t\t\treturn {\n\t\t\t\ttype: 'aborted',\n\t\t\t\tok: false,\n\t\t\t\tdata: null,\n\t\t\t\terror: mapped,\n\t\t\t\tmetrics: {\n\t\t\t\t\ttotalAttempts,\n\t\t\t\t\ttotalRetries,\n\t\t\t\t\ttotalDuration: (Date.now() - startTime) as Milliseconds,\n\t\t\t\t\tlastError: mapped,\n\t\t\t\t\tretryHistory,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst runAttempt = async (attempt: number): Promise<T> => {\n\t\t\ttotalAttempts = attempt as RetryCount;\n\t\t\ttry {\n\t\t\t\tconst p = task({ signal: compositeSignal });\n\t\t\t\tconst data = timeout\n\t\t\t\t\t? await withTimeout(p, timeout, compositeSignal)\n\t\t\t\t\t: await p;\n\t\t\t\tsafeCall(\n\t\t\t\t\thooks?.onSuccess as unknown as (...a: unknown[]) => unknown,\n\t\t\t\t\tdata,\n\t\t\t\t);\n\t\t\t\tsafeCall(\n\t\t\t\t\tlogger?.info as unknown as (...a: unknown[]) => unknown,\n\t\t\t\t\t`Task succeeded on attempt ${attempt}`,\n\t\t\t\t);\n\t\t\t\treturn data;\n\t\t\t} catch (err) {\n\t\t\t\tconst norm = errorHandling.normalizer(err);\n\t\t\t\tconst mapped = errorHandling.mapError\n\t\t\t\t\t? errorHandling.mapError(norm)\n\t\t\t\t\t: norm;\n\t\t\t\tlastError = mapped;\n\t\t\t\tif (mapped.code === 'ABORTED') {\n\t\t\t\t\tsafeCall(\n\t\t\t\t\t\thooks?.onAbort as unknown as (...a: unknown[]) => unknown,\n\t\t\t\t\t\tcompositeSignal,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!(ignoreAbort && mapped.code === 'ABORTED')) {\n\t\t\t\t\tsafeCall(\n\t\t\t\t\t\thooks?.onError as unknown as (...a: unknown[]) => unknown,\n\t\t\t\t\t\tmapped,\n\t\t\t\t\t);\n\t\t\t\t\tsafeCall(\n\t\t\t\t\t\tlogger?.error as unknown as (...a: unknown[]) => unknown,\n\t\t\t\t\t\t`Task failed on attempt ${attempt}`,\n\t\t\t\t\t\tmapped,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst maxRetries = asRetryCount(retry?.maxRetries ?? 0);\n\t\t\t\tif (attempt <= Number(maxRetries)) {\n\t\t\t\t\tconst shouldRetry = retry?.shouldRetry;\n\t\t\t\t\tconst ctx = {\n\t\t\t\t\t\ttotalAttempts: Number(totalAttempts) as unknown as number,\n\t\t\t\t\t\telapsedTime: (Date.now() - startTime) as number,\n\t\t\t\t\t\tstartTime: new Date(startTime),\n\t\t\t\t\t\tlastDelay: retryHistory[retryHistory.length - 1]?.delay\n\t\t\t\t\t\t\t? Number(retryHistory[retryHistory.length - 1]?.delay)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (!shouldRetry || shouldRetry(attempt, mapped, ctx)) {\n\t\t\t\t\t\tconst baseDelayMs = retry\n\t\t\t\t\t\t\t? calculateDelay(retry.strategy, attempt as RetryCount, mapped)\n\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\tconst delayMs = applyJitter(baseDelayMs, retry?.jitter);\n\t\t\t\t\t\tconst delay = asMilliseconds(delayMs);\n\n\t\t\t\t\t\tretryHistory.push({\n\t\t\t\t\t\t\tattempt: attempt as RetryCount,\n\t\t\t\t\t\t\terror: mapped,\n\t\t\t\t\t\t\tdelay,\n\t\t\t\t\t\t\ttimestamp: new Date(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tsafeCall(\n\t\t\t\t\t\t\thooks?.onRetry as unknown as (...a: unknown[]) => unknown,\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tmapped,\n\t\t\t\t\t\t\tdelayMs,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsafeCall(\n\t\t\t\t\t\t\tlogger?.info as unknown as (...a: unknown[]) => unknown,\n\t\t\t\t\t\t\t`Retrying in ${delayMs}ms (attempt ${attempt + 1})`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tawait sleep(delay as number, compositeSignal);\n\t\t\t\t\t\treturn runAttempt(attempt + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthrow mapped;\n\t\t\t}\n\t\t};\n\n\t\ttry {\n\t\t\tconst data = await runAttempt(1);\n\t\t\ttotalRetries =\n\t\t\t\ttotalAttempts > (0 as RetryCount)\n\t\t\t\t\t? ((Number(totalAttempts) - 1) as RetryCount)\n\t\t\t\t\t: (0 as RetryCount);\n\t\t\tconst metrics: ExecutionMetrics<E> = {\n\t\t\t\ttotalAttempts,\n\t\t\t\ttotalRetries,\n\t\t\t\ttotalDuration: (Date.now() - startTime) as Milliseconds,\n\t\t\t\tretryHistory,\n\t\t\t};\n\t\t\tsafeCall(\n\t\t\t\thooks?.onFinally as unknown as (...a: unknown[]) => unknown,\n\t\t\t\tmetrics,\n\t\t\t);\n\t\t\treturn { type: 'success', ok: true, data, error: null, metrics };\n\t\t} catch (err) {\n\t\t\tconst finalError = (lastError ??\n\t\t\t\t(errorHandling.normalizer(err) as E)) as E;\n\t\t\tconst kind: 'failure' | 'timeout' | 'aborted' =\n\t\t\t\tfinalError.code === 'TIMEOUT'\n\t\t\t\t\t? 'timeout'\n\t\t\t\t\t: finalError.code === 'ABORTED'\n\t\t\t\t\t\t? 'aborted'\n\t\t\t\t\t\t: 'failure';\n\n\t\t\ttotalRetries =\n\t\t\t\ttotalAttempts > (0 as RetryCount)\n\t\t\t\t\t? ((Number(totalAttempts) - 1) as RetryCount)\n\t\t\t\t\t: (0 as RetryCount);\n\n\t\t\tconst metrics: ExecutionMetrics<E> = {\n\t\t\t\ttotalAttempts,\n\t\t\t\ttotalRetries,\n\t\t\t\ttotalDuration: (Date.now() - startTime) as Milliseconds,\n\t\t\t\tlastError: finalError,\n\t\t\t\tretryHistory,\n\t\t\t};\n\n\t\t\tsafeCall(\n\t\t\t\thooks?.onFinally as unknown as (...a: unknown[]) => unknown,\n\t\t\t\tmetrics,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\ttype: kind,\n\t\t\t\tok: false,\n\t\t\t\tdata: null,\n\t\t\t\terror: finalError,\n\t\t\t\tmetrics,\n\t\t\t};\n\t\t}\n\t} finally {\n\t\tcleanupCompositeSignal();\n\t}\n}\n\nfunction createCompositeSignal(signal?: AbortSignal): {\n\tsignal: AbortSignal;\n\tcleanup: () => void;\n} {\n\tconst controller = new AbortController();\n\tif (!signal) {\n\t\treturn { signal: controller.signal, cleanup: () => {} };\n\t}\n\n\tconst abort = () => controller.abort();\n\tif (signal.aborted) {\n\t\tabort();\n\t\treturn { signal: controller.signal, cleanup: () => {} };\n\t}\n\n\tsignal.addEventListener('abort', abort, { once: true });\n\treturn {\n\t\tsignal: controller.signal,\n\t\tcleanup: () => signal.removeEventListener('abort', abort),\n\t};\n}\n\nasync function withTimeout<T>(\n\tpromise: Promise<T>,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\treturn new Promise<T>((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new DOMException('Aborted', 'AbortError'));\n\t\t\treturn;\n\t\t}\n\n\t\tlet settled = false;\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(new TimeoutError(asMilliseconds(timeoutMs)));\n\t\t}, timeoutMs);\n\n\t\tconst onAbort = () => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(new DOMException('Aborted', 'AbortError'));\n\t\t};\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tsignal?.removeEventListener('abort', onAbort);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\n\t\tpromise.then(\n\t\t\t(value) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tcleanup();\n\t\t\t\tresolve(value);\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t},\n\t\t);\n\t});\n}\n\nfunction applyJitter(delayMs: number, jitter?: JitterConfig): number {\n\tif (!jitter || jitter.type === 'none') return delayMs;\n\tif (delayMs <= 0) return delayMs;\n\n\tswitch (jitter.type) {\n\t\tcase 'full': {\n\t\t\tconst ratio = Number(jitter.ratio) / 100;\n\t\t\tconst min = Math.max(0, Number(delayMs) * (1 - ratio));\n\t\t\tconst max = Number(delayMs);\n\t\t\treturn (min + Math.random() * (max - min)) as number;\n\t\t}\n\t\tcase 'equal': {\n\t\t\tconst ratio = Number(jitter.ratio) / 100;\n\t\t\tconst halfWindow = (Number(delayMs) * ratio) / 2;\n\t\t\tconst base = Number(delayMs) - halfWindow;\n\t\t\treturn (base + Math.random() * halfWindow) as number;\n\t\t}\n\t\tcase 'custom': {\n\t\t\treturn jitter.calculate(delayMs);\n\t\t}\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = jitter;\n\t\t\treturn _exhaustive;\n\t\t}\n\t}\n}\n","/**\n * Public API: legacy runner-first.\n *\n * Default export is a factory that creates an internal Executor instance.\n * The Executor class and the old functional facade are intentionally not\n * exported from the package surface.\n */\n\nimport type { ErrorRule } from './error/error-normalizer';\nimport type { TypedError } from './error/typed-error';\nimport type { ExecutionConfig } from './types/config-types';\nimport type { ExecutionResult } from './types/result-types';\nimport {\n\tcreateExecutor,\n\ttype DefaultError,\n\ttype ExecutorOptions,\n\ttype InferErrorFromRules,\n\ttype RulesMode,\n} from './core/executor';\n\nexport { errorRule } from './error/error-rules';\nexport { RetryStrategies } from './retry/retry-strategies';\n\nexport {\n\tasConcurrencyLimit,\n\tasMilliseconds,\n\tasPercentage,\n\tasRetryCount,\n\tasStatusCode,\n} from './types/branded-types';\nexport type {\n\tConcurrencyLimit,\n\tMilliseconds,\n\tPercentage,\n\tRetryCount,\n\tStatusCode,\n} from './types/branded-types';\n\nexport type { RulesMode, ExecutorOptions };\nexport type { ExecutionConfig } from './types/config-types';\nexport type {\n\tAbortedResult,\n\tExecutionMetrics,\n\tExecutionResult,\n\tFailureResult,\n\tSuccessResult,\n\tTimeoutResult,\n} from './types/result-types';\n\nexport type Runner<E extends TypedError = TypedError> = {\n\trun: <T>(\n\t\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\t\toptions?: Partial<ExecutionConfig<E>>,\n\t) => Promise<ExecutionResult<T, E>>;\n\texecute: <T>(\n\t\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\t\toptions?: Partial<ExecutionConfig<E>>,\n\t) => Promise<ExecutionResult<T, E>>;\n\trunOrThrow: <T>(\n\t\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\t\toptions?: Partial<ExecutionConfig<E>>,\n\t) => Promise<T>;\n\texecuteOrThrow: <T>(\n\t\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\t\toptions?: Partial<ExecutionConfig<E>>,\n\t) => Promise<T>;\n\trunAll: <T>(\n\t\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\t\toptions?: Partial<ExecutionConfig<E> & { concurrency?: number }>,\n\t) => Promise<Array<ExecutionResult<T, E>>>;\n\texecuteAll: <T>(\n\t\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\t\toptions?: Partial<ExecutionConfig<E> & { concurrency?: number }>,\n\t) => Promise<Array<ExecutionResult<T, E>>>;\n\trunOrThrowAll: <T>(\n\t\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\t\toptions?: Partial<ExecutionConfig<E> & { concurrency?: number }>,\n\t) => Promise<T[]>;\n\texecuteOrThrowAll: <T>(\n\t\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\t\toptions?: Partial<ExecutionConfig<E> & { concurrency?: number }>,\n\t) => Promise<T[]>;\n};\n\nexport function trybox<const TRules extends readonly ErrorRule<TypedError>[]>(\n\toptions: Omit<ExecutorOptions<InferErrorFromRules<TRules>>, 'rules'> & {\n\t\trules: TRules;\n\t},\n): Runner<InferErrorFromRules<TRules>>;\nexport function trybox<E extends TypedError = DefaultError>(\n\toptions?: ExecutorOptions<E>,\n): Runner<E>;\nexport function trybox<E extends TypedError = DefaultError>(\n\toptions?: ExecutorOptions<E>,\n): Runner<E> {\n\tconst ex = createExecutor<E>(options);\n\n\treturn {\n\t\trun: (task, runOptions) => ex.execute(task, runOptions),\n\t\texecute: (task, runOptions) => ex.execute(task, runOptions),\n\t\trunOrThrow: (task, runOptions) => ex.executeOrThrow(task, runOptions),\n\t\texecuteOrThrow: (task, runOptions) => ex.executeOrThrow(task, runOptions),\n\t\trunAll: (tasks, runOptions) => ex.executeAll(tasks, runOptions),\n\t\texecuteAll: (tasks, runOptions) => ex.executeAll(tasks, runOptions),\n\t\trunOrThrowAll: (tasks, runOptions) =>\n\t\t\tex.executeAllOrThrow(tasks, runOptions),\n\t\texecuteOrThrowAll: (tasks, runOptions) =>\n\t\t\tex.executeAllOrThrow(tasks, runOptions),\n\t};\n}\n\nexport default trybox;\n\nlet singleton: Runner | undefined;\nconst getSingleton = (): Runner => {\n\tif (!singleton) singleton = trybox();\n\treturn singleton;\n};\n\nexport const execute = <T, E extends TypedError = DefaultError>(\n\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\toptions?: Partial<ExecutionConfig<E>>,\n) => getSingleton().execute(task, options as Partial<ExecutionConfig>);\n\nexport const executeOrThrow = <T, E extends TypedError = DefaultError>(\n\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\toptions?: Partial<ExecutionConfig<E>>,\n) => getSingleton().executeOrThrow(task, options as Partial<ExecutionConfig>);\n\nexport const executeAll = <T, E extends TypedError = DefaultError>(\n\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\toptions?: Partial<ExecutionConfig<E> & { concurrency?: number }>,\n) =>\n\tgetSingleton().executeAll(\n\t\ttasks,\n\t\toptions as Partial<ExecutionConfig & { concurrency?: number }>,\n\t);\n\nexport const executeAllOrThrow = <T, E extends TypedError = DefaultError>(\n\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\toptions?: Partial<ExecutionConfig<E> & { concurrency?: number }>,\n) =>\n\tgetSingleton().executeOrThrowAll(\n\t\ttasks,\n\t\toptions as Partial<ExecutionConfig & { concurrency?: number }>,\n\t);\n\nexport const executeOrThrowAll = executeAllOrThrow;\n\nexport const run = execute;\nexport const runOrThrow = executeOrThrow;\nexport const runAll = executeAll;\nexport const runOrThrowAll = executeAllOrThrow;\n"]}