trybox 0.11.0 → 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 +20 -15
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +173 -85
- package/dist/index.d.ts +173 -85
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/package.json +3 -2
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 `
|
|
35
|
+
`trybox` normalizes all errors into a `TypedError` instance with a stable `code`.
|
|
36
36
|
|
|
37
|
-
### The `
|
|
37
|
+
### The `TypedError` Shape
|
|
38
38
|
|
|
39
|
-
All errors are normalized to this
|
|
39
|
+
All errors are normalized to this shape:
|
|
40
40
|
|
|
41
41
|
```typescript
|
|
42
|
-
type
|
|
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?:
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
147
|
+
const data = await runner.runOrThrowAll(tasks, { concurrency: 5 });
|
|
143
148
|
} catch (err) {
|
|
144
|
-
// err is
|
|
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';var K=Object.defineProperty;var W=(e,r,o)=>r in e?K(e,r,{enumerable:true,configurable:true,writable:true,value:o}):e[r]=o;var i=(e,r,o)=>W(e,typeof r!="symbol"?r+"":r,o);var E=class extends Error{constructor(o,t){super(o);i(this,"cause");i(this,"meta");i(this,"status");i(this,"timestamp");this.timestamp=new Date,this.name=this.constructor.name,this.cause=t?.cause,this.meta=t?.meta,this.status=t?.status,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor);}is(o){return this.code===o}withMeta(o){return Object.assign(this,{meta:o})}withStatus(o){return Object.assign(this,{status:o})}withCause(o){return Object.assign(this,{cause:o})}toJSON(){return {name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),cause:this.cause,stack:this.stack}}},M=class extends E{constructor(o,t){super(`Operation timed out after ${o}ms`,{cause:t});i(this,"code","TIMEOUT");}};var h=class extends E{constructor(o,t){super(`Circuit breaker is open, reset after ${o}ms`,{cause:t});i(this,"code","CIRCUIT_OPEN");}},A=class extends E{constructor(o,t,n){super(o,{cause:n,meta:{validationErrors:t}});this.validationErrors=t;i(this,"code","VALIDATION");}};var S=class extends E{constructor(o,t){super(o,{cause:t});i(this,"code","UNKNOWN");}};var D=class{constructor(r){i(this,"state");i(this,"config");this.config=r,this.state={state:"closed",failureCount:0,halfOpenCount:0};}async canExecute(){return this.updateStateIfNeeded(),this.state.state!=="open"}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 t=new Date;switch(this.state.state){case "closed":{let n=this.state.failureCount+1;n>=this.config.failureThreshold?this.state={state:"open",failureCount:n,halfOpenCount:0,lastFailureTime:t,nextAttemptTime:new Date(t.getTime()+this.config.resetTimeout)}:this.state={...this.state,failureCount:n,lastFailureTime:t};break}case "half-open":this.state={state:"open",failureCount:this.state.failureCount+1,halfOpenCount:0,lastFailureTime:t,nextAttemptTime:new Date(t.getTime()+this.config.resetTimeout)};break;case "open":this.state={...this.state,lastFailureTime:t,nextAttemptTime:new Date(t.getTime()+this.config.resetTimeout)};break}}getState(){return this.updateStateIfNeeded(),{...this.state,canExecute:this.state.state!=="open"}}createOpenError(){let r=this.state.nextAttemptTime?this.state.nextAttemptTime.getTime()-Date.now():this.config.resetTimeout;return new h(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)=>o=>{for(let t of e){let n=t(o);if(n!==null)return n}return r(o)},U=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 z=e=>{if(typeof e!="object"||e===null)return false;let r=e;return typeof r.status=="number"||typeof r.statusCode=="number"},P=class{constructor(r){this.predicate=r;}toCode(r){return new N(this.predicate,r)}toError(r){return o=>{if(!this.predicate(o))return null;let t=r(o),n=t.code;class s extends E{constructor(){super(t.message,{cause:t.cause??o,meta:t.meta,status:t.status});i(this,"code",n);}}return new s}}},N=class{constructor(r,o){this.predicate=r;this.errorCode=o;}with(r){return o=>{if(!this.predicate(o))return null;let t=r(o),n=this.errorCode;class s extends E{constructor(){super(t.message,{cause:t.cause,meta:t.meta,status:t.status});i(this,"code",n);}}return new s}}},p={when:e=>new P(e),instance:e=>new P(r=>r instanceof e),code:e=>({for:r=>new N(r,e)}),string:(e,r)=>({when:o=>p.when(o).toCode(r).with(t=>({message:t===e?e:`${r}: ${t}`,cause:t}))}),httpStatus:(e,r)=>({for:o=>p.when(o).toCode(r??`HTTP_${e}`).with(t=>({message:`HTTP ${e} error`,cause:t}))})};var y={abort:p.when(e=>e instanceof DOMException&&e.name==="AbortError").toCode("ABORTED").with(e=>({message:e.message||"Operation was aborted",cause:e})),timeout:p.when(e=>e instanceof Error&&e.name==="TimeoutError").toCode("TIMEOUT").with(e=>({message:e.message||"Operation timed out",cause:e})),network:p.when(e=>z(e)).toCode("NETWORK").with(e=>{let r=e.status??e.statusCode;return {message:e.message||`Network error with status ${r??"unknown"}`,cause:e}}),http:p.when(e=>{if(!z(e))return false;let r=e,o=r.status??r.statusCode;return typeof o=="number"&&o>=400}).toCode("HTTP").with(e=>{let r=e.status??e.statusCode;return {message:e.message||`HTTP ${r??"error"} error`,cause:e}}),unknown:p.when(e=>e instanceof Error).toCode("UNKNOWN").with(e=>({message:e.message||"Unknown error occurred",cause:e}))};var j=[y.abort,y.timeout,y.network,y.http,y.unknown];var L={when:e=>p.when(e),instance:e=>p.instance(e)},$=j;p.when(e=>e instanceof h).toCode("CIRCUIT_OPEN").with(e=>({message:e.message,cause:e}));p.when(e=>e instanceof A).toCode("VALIDATION").with(e=>({message:e.message,cause:e}));var _=(e,r,o)=>{switch(e.type){case "fixed":return e.delay;case "exponential":{let t=e.base*e.factor**(Number(r)-1);return e.maxDelay?Math.min(t,e.maxDelay):t}case "fibonacci":{let t=e.base*J(Number(r));return e.maxDelay?Math.min(t,e.maxDelay):t}case "custom":return e.calculate(r,o);default:return e}},J=e=>{if(e<=1)return 1;let r=1,o=1;for(let t=2;t<=e;t++){let n=r+o;r=o,o=n;}return o};var v=(e,r)=>new Promise((o,t)=>{if(r?.aborted){t(new DOMException("Aborted","AbortError"));return}let n=setTimeout(()=>{o();},e),s=()=>{clearTimeout(n),t(new DOMException("Aborted","AbortError"));};r?.addEventListener("abort",s,{once:true});});var q=e=>{if(e.toError)return e.toError;let r=e.rulesMode??"extend",o=e.rules??[],t=$,n=e.fallback??(u=>U(S)(u)),s=r==="replace"?o:[...o,...t];return H(s,n)},C=class e{constructor(r={}){i(this,"circuitBreaker");i(this,"config");let{rules:o,rulesMode:t,fallback:n,toError:s,mapError:u,...l}=r,x=q(r),m={...l,errorHandling:{normalizer:x,mapError:u}};this.config=m,m.circuitBreaker&&(this.circuitBreaker=new D(m.circuitBreaker));}async execute(r,o={}){let t={...this.config,...o};if(this.circuitBreaker&&!await this.circuitBreaker.canExecute())return {type:"failure",ok:false,data:null,error:this.circuitBreaker.createOpenError(),metrics:{totalAttempts:0,totalRetries:0,totalDuration:0,retryHistory:[]}};let n=await Y(r,t);return this.circuitBreaker&&(n.ok?await this.circuitBreaker.recordSuccess():await this.circuitBreaker.recordFailure(n.error)),n}async executeOrThrow(r,o={}){let t=await this.execute(r,o);if(t.ok)return t.data;throw t.error}async executeAll(r,o={}){let t={...this.config,...o},n=t.concurrency??Number.POSITIVE_INFINITY,s=new Array(r.length),u=0,l=async()=>{for(;;){let m=u;if(u++,m>=r.length)return;let f=r[m];if(!f)return;s[m]=await this.execute(f,t);}},x=Array.from({length:Math.min(n,r.length)},()=>l());return await Promise.all(x),s}async executeAllOrThrow(r,o={}){let t=await this.executeAll(r,o);for(let n of t)if(!n.ok)throw n.error;return t.map(n=>{if(!n.ok)throw n.error;return n.data})}getCircuitBreakerState(){return this.circuitBreaker?.getState()}resetCircuitBreaker(){this.circuitBreaker?.reset();}getConfig(){return {...this.config}}withConfig(r){let{errorHandling:o,...t}=this.config,{errorHandling:n,...s}=r;return new e({...t,...s})}withErrorType(r={}){return new e(r)}};async function Y(e,r){let{signal:o,ignoreAbort:t=true,timeout:n,retry:s,errorHandling:u,hooks:l,logger:x}=r,m,f=0,b=0,T=[],g=Date.now(),R=G(o);if(R.aborted){let a=u.normalizer(new DOMException("Aborted","AbortError")),c=u.mapError?u.mapError(a):a;return {type:"aborted",ok:false,data:null,error:c,metrics:{totalAttempts:f,totalRetries:b,totalDuration:Date.now()-g,lastError:c,retryHistory:T}}}let B=async a=>{f=a;try{let c=e({signal:R}),w=n?await Q(c,n,R):await c;return l?.onSuccess?.(w),x?.info?.(`Task succeeded on attempt ${a}`),w}catch(c){let w=u.normalizer(c),d=u.mapError?u.mapError(w):w;if(m=d,t&&d.code==="ABORTED"||(l?.onError?.(d),x?.error?.(`Task failed on attempt ${a}`,d)),a<=(s?.maxRetries??0)){let F=s?.shouldRetry,V={totalAttempts:f,elapsedTime:Date.now()-g,startTime:new Date(g),lastDelay:T[T.length-1]?.delay};if(!F||F(a,d,V)){let O=s?_(s.strategy,a,d):0;return T.push({attempt:a,error:d,delay:O,timestamp:new Date}),b=a-1,l?.onRetry?.(a,d,O),x?.info?.(`Retrying in ${O}ms (attempt ${a+1})`),await v(O,R),B(a+1)}}throw d}};try{let a=await B(1),c={totalAttempts:f,totalRetries:b,totalDuration:Date.now()-g,retryHistory:T};return l?.onFinally?.(c),{type:"success",ok:!0,data:a,error:null,metrics:c}}catch(a){let c=m??u.normalizer(a),w=c.code==="TIMEOUT"?"timeout":c.code==="ABORTED"?"aborted":"failure",d={totalAttempts:f,totalRetries:b,totalDuration:Date.now()-g,lastError:c,retryHistory:T};return l?.onFinally?.(d),{type:w,ok:false,data:null,error:c,metrics:d}}}function G(e){let r=new AbortController;if(!e)return r.signal;let o=()=>r.abort();return e.aborted?(o(),r.signal):(e.addEventListener("abort",o,{once:true}),r.signal)}async function Q(e,r,o){let t=v(r,o).then(()=>{throw new M(r)});return Promise.race([e,t])}var I,k=e=>e?new C(e):(I||(I=new C),I);async function X(e,r){return k().execute(e,r)}async function Z(e,r){return k().executeOrThrow(e,r)}async function ee(e,r){return k().executeAll(e,r)}async function re(e,r){return k().executeAllOrThrow(e,r)}exports.Executor=C;exports.errorRule=L;exports.execute=X;exports.executeAll=ee;exports.executeAllOrThrow=re;exports.executeOrThrow=Z;exports.getExecutor=k;//# 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
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/error/typed-error.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/core/execution.ts"],"names":["TypedError","message","opts","__publicField","code","meta","status","cause","TimeoutError","timeout","CircuitOpenError","resetAfter","ValidationError","validationErrors","UnknownError","CircuitBreaker","config","error","now","newFailureCount","state","createErrorNormalizer","rules","fallback","rule","result","createFallbackNormalizer","ErrorClass","hasNumericStatus","err","candidate","ErrorRuleBuilder","predicate","ErrorMapper","mapper","out","CustomError","errorCode","mapped","CustomTypedError","createErrorRule","BuiltinRules","builtInRules","errorRule","defaultRules","calculateDelay","strategy","attempt","expDelay","fibDelay","fibonacci","n","prev","curr","i","next","sleep","ms","signal","resolve","reject","timeoutId","onAbort","buildNormalizer","rulesMode","userRules","builtins","Executor","_Executor","options","_rules","_rulesMode","_fallback","_toError","mapError","executionConfig","normalizer","baseConfig","task","mergedConfig","executeInternal","r","tasks","concurrency","idx","worker","current","workers","results","additionalConfig","_currentHandling","_newHandling","extraConfig","outerSignal","ignoreAbort","retry","errorHandling","hooks","logger","lastError","totalAttempts","totalRetries","retryHistory","startTime","compositeSignal","createCompositeSignal","e","runAttempt","p","data","withTimeout","norm","shouldRetry","ctx","delay","metrics","finalError","kind","controller","abort","promise","timeoutPromise","singleton","getExecutor","execute","executeOrThrow","executeAll","executeAllOrThrow"],"mappings":"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","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 * 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 type { Milliseconds, RetryCount } 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: RetryCount;\n\n\t/** How long to wait before attempting to close circuit */\n\treadonly resetTimeout: Milliseconds;\n\n\t/** Number of requests allowed in half-open state */\n\treadonly halfOpenRequests: RetryCount;\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: CircuitBreakerConfig<E>;\n\n\tconstructor(config: CircuitBreakerConfig<E>) {\n\t\tthis.config = config;\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\treturn this.state.state !== 'open';\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? ((this.state.nextAttemptTime.getTime() - Date.now()) as Milliseconds)\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\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\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// 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 StatusCarrier => hasNumericStatus(err))\n\t\t.toCode('NETWORK')\n\t\t.with((err) => {\n\t\t\tconst status = err.status ?? err.statusCode;\n\t\t\treturn {\n\t\t\t\tmessage:\n\t\t\t\t\terr.message || `Network error with status ${status ?? 'unknown'}`,\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};\n\t\t}),\n\n\t// Generic error fallback\n\tunknown: createErrorRule\n\t\t.when((err): err is Error => err instanceof Error)\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.abort,\n\tBuiltinRules.timeout,\n\tBuiltinRules.network,\n\tBuiltinRules.http,\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 { Milliseconds, 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: Milliseconds;\n}\n\nexport interface ExponentialBackoffStrategy {\n\treadonly type: 'exponential';\n\treadonly base: Milliseconds;\n\treadonly factor: number;\n\treadonly maxDelay?: Milliseconds;\n}\n\nexport interface FibonacciBackoffStrategy {\n\treadonly type: 'fibonacci';\n\treadonly base: Milliseconds;\n\treadonly maxDelay?: Milliseconds;\n}\n\nexport interface CustomDelayStrategy {\n\treadonly type: 'custom';\n\treadonly calculate: (attempt: RetryCount, error: unknown) => Milliseconds;\n}\n\n// Strategy factory functions\nexport const RetryStrategies = {\n\tfixed: (delay: Milliseconds): FixedDelayStrategy => ({\n\t\ttype: 'fixed',\n\t\tdelay,\n\t}),\n\n\texponential: (\n\t\tbase: Milliseconds,\n\t\tfactor: number = 2,\n\t\tmaxDelay?: Milliseconds,\n\t): ExponentialBackoffStrategy => ({\n\t\ttype: 'exponential',\n\t\tbase,\n\t\tfactor,\n\t\tmaxDelay,\n\t}),\n\n\tfibonacci: (\n\t\tbase: Milliseconds,\n\t\tmaxDelay?: Milliseconds,\n\t): FibonacciBackoffStrategy => ({\n\t\ttype: 'fibonacci',\n\t\tbase,\n\t\tmaxDelay,\n\t}),\n\n\tcustom: (\n\t\tcalculate: (attempt: RetryCount, error: unknown) => Milliseconds,\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): Milliseconds => {\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 Milliseconds;\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 Milliseconds;\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 timeoutId = setTimeout(() => {\n\t\t\tresolve();\n\t\t}, ms as number);\n\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeoutId);\n\t\t\treject(new DOMException('Aborted', 'AbortError'));\n\t\t};\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: Milliseconds,\n\tsignal?: AbortSignal,\n): Promise<T> => {\n\tconst timeoutPromise = sleep(timeoutMs, signal).then(() => {\n\t\tthrow new Error(`Operation timed out after ${timeoutMs}ms`);\n\t});\n\n\treturn Promise.race([promise, timeoutPromise]);\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 type { Milliseconds, RetryCount } from '../types/branded-types';\nimport type { ExecutionConfig } 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\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}\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 canExecute = await this.circuitBreaker.canExecute();\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\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}\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 concurrency = mergedConfig.concurrency ?? 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\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: _newHandling, ...extraConfig } = additionalConfig;\n\t\treturn new Executor<E>({\n\t\t\t...baseConfig,\n\t\t\t...extraConfig,\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<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\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 compositeSignal = createCompositeSignal(outerSignal);\n\tif (compositeSignal.aborted) {\n\t\t// normalize abort immediately\n\t\tconst e = errorHandling.normalizer(\n\t\t\tnew DOMException('Aborted', 'AbortError'),\n\t\t);\n\t\tconst mapped = errorHandling.mapError ? errorHandling.mapError(e) : e;\n\t\treturn {\n\t\t\ttype: 'aborted',\n\t\t\tok: false,\n\t\t\tdata: null,\n\t\t\terror: mapped,\n\t\t\tmetrics: {\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: mapped,\n\t\t\t\tretryHistory,\n\t\t\t},\n\t\t};\n\t}\n\n\tconst runAttempt = async (attempt: number): Promise<T> => {\n\t\ttotalAttempts = attempt as RetryCount;\n\t\ttry {\n\t\t\tconst p = task({ signal: compositeSignal });\n\t\t\tconst data = timeout\n\t\t\t\t? await withTimeout(p, timeout, compositeSignal)\n\t\t\t\t: await p;\n\t\t\thooks?.onSuccess?.(data);\n\t\t\tlogger?.info?.(`Task succeeded on attempt ${attempt}`);\n\t\t\treturn data;\n\t\t} catch (err) {\n\t\t\tconst norm = errorHandling.normalizer(err);\n\t\t\tconst mapped = errorHandling.mapError\n\t\t\t\t? errorHandling.mapError(norm)\n\t\t\t\t: norm;\n\t\t\tlastError = mapped;\n\n\t\t\tif (!(ignoreAbort && mapped.code === 'ABORTED')) {\n\t\t\t\thooks?.onError?.(mapped);\n\t\t\t\tlogger?.error?.(`Task failed on attempt ${attempt}`, mapped);\n\t\t\t}\n\n\t\t\tif (attempt <= (retry?.maxRetries ?? (0 as RetryCount))) {\n\t\t\t\tconst shouldRetry = retry?.shouldRetry;\n\t\t\t\tconst ctx = {\n\t\t\t\t\ttotalAttempts: totalAttempts,\n\t\t\t\t\telapsedTime: (Date.now() - startTime) as Milliseconds,\n\t\t\t\t\tstartTime: new Date(startTime),\n\t\t\t\t\tlastDelay: retryHistory[retryHistory.length - 1]?.delay,\n\t\t\t\t};\n\n\t\t\t\tif (!shouldRetry || shouldRetry(attempt as RetryCount, mapped, ctx)) {\n\t\t\t\t\tconst delay = retry\n\t\t\t\t\t\t? (calculateDelay(\n\t\t\t\t\t\t\t\tretry.strategy,\n\t\t\t\t\t\t\t\tattempt as RetryCount,\n\t\t\t\t\t\t\t\tmapped,\n\t\t\t\t\t\t\t) as Milliseconds)\n\t\t\t\t\t\t: (0 as Milliseconds);\n\n\t\t\t\t\tretryHistory.push({\n\t\t\t\t\t\tattempt: attempt as RetryCount,\n\t\t\t\t\t\terror: mapped,\n\t\t\t\t\t\tdelay,\n\t\t\t\t\t\ttimestamp: new Date(),\n\t\t\t\t\t});\n\n\t\t\t\t\ttotalRetries = (attempt - 1) as RetryCount;\n\t\t\t\t\thooks?.onRetry?.(attempt as RetryCount, mapped, delay);\n\t\t\t\t\tlogger?.info?.(`Retrying in ${delay}ms (attempt ${attempt + 1})`);\n\n\t\t\t\t\tawait sleep(delay as number, compositeSignal);\n\t\t\t\t\treturn runAttempt(attempt + 1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow mapped;\n\t\t}\n\t};\n\n\ttry {\n\t\tconst data = await runAttempt(1);\n\t\tconst metrics: ExecutionMetrics<E> = {\n\t\t\ttotalAttempts,\n\t\t\ttotalRetries,\n\t\t\ttotalDuration: (Date.now() - startTime) as Milliseconds,\n\t\t\tretryHistory,\n\t\t};\n\t\thooks?.onFinally?.(metrics);\n\t\treturn { type: 'success', ok: true, data, error: null, metrics };\n\t} catch (err) {\n\t\tconst finalError = (lastError ?? (errorHandling.normalizer(err) as E)) as E;\n\t\tconst kind: 'failure' | 'timeout' | 'aborted' =\n\t\t\tfinalError.code === 'TIMEOUT'\n\t\t\t\t? 'timeout'\n\t\t\t\t: finalError.code === 'ABORTED'\n\t\t\t\t\t? 'aborted'\n\t\t\t\t\t: 'failure';\n\n\t\tconst metrics: ExecutionMetrics<E> = {\n\t\t\ttotalAttempts,\n\t\t\ttotalRetries,\n\t\t\ttotalDuration: (Date.now() - startTime) as Milliseconds,\n\t\t\tlastError: finalError,\n\t\t\tretryHistory,\n\t\t};\n\n\t\thooks?.onFinally?.(metrics);\n\t\treturn {\n\t\t\ttype: kind,\n\t\t\tok: false,\n\t\t\tdata: null,\n\t\t\terror: finalError,\n\t\t\tmetrics,\n\t\t};\n\t}\n}\n\nfunction createCompositeSignal(signal?: AbortSignal): AbortSignal {\n\tconst controller = new AbortController();\n\tif (!signal) return controller.signal;\n\tconst abort = () => controller.abort();\n\tif (signal.aborted) {\n\t\tabort();\n\t\treturn controller.signal;\n\t}\n\tsignal.addEventListener('abort', abort, { once: true });\n\treturn controller.signal;\n}\n\nasync function withTimeout<T>(\n\tpromise: Promise<T>,\n\ttimeout: Milliseconds,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tconst timeoutPromise = sleep(timeout as number, signal).then(() => {\n\t\tthrow new TimeoutError(timeout);\n\t});\n\treturn Promise.race([promise, timeoutPromise]);\n}\n","/**\n * Thin functional facade over a singleton Executor.\n * No business logic lives here; it forwards to `src/core/executor.ts`.\n */\n\nimport type { TypedError } from '../error/typed-error';\nimport type { ExecutionConfig } from '../types/config-types';\nimport { Executor, type ExecutorOptions } from './executor';\n\nlet singleton: Executor<TypedError> | undefined;\n\nexport const getExecutor = <E extends TypedError = TypedError>(\n\toptions?: ExecutorOptions<E>,\n): Executor<E> => {\n\tif (!options) {\n\t\tif (!singleton) singleton = new Executor();\n\t\treturn singleton as unknown as Executor<E>;\n\t}\n\treturn new Executor<E>(options);\n};\n\nexport async function execute<T, E extends TypedError = TypedError>(\n\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\toptions?: Partial<ExecutionConfig<E>>,\n) {\n\treturn getExecutor<E>().execute(task, options);\n}\n\nexport async function executeOrThrow<T, E extends TypedError = TypedError>(\n\ttask: (ctx: { signal: AbortSignal }) => Promise<T>,\n\toptions?: Partial<ExecutionConfig<E>>,\n) {\n\treturn getExecutor<E>().executeOrThrow(task, options);\n}\n\nexport async function executeAll<T, E extends TypedError = TypedError>(\n\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\toptions?: Partial<ExecutionConfig<E> & { concurrency?: number }>,\n) {\n\treturn getExecutor<E>().executeAll(tasks, options);\n}\n\nexport async function executeAllOrThrow<T, E extends TypedError = TypedError>(\n\ttasks: Array<(ctx: { signal: AbortSignal }) => Promise<T>>,\n\toptions?: Partial<ExecutionConfig<E> & { concurrency?: number }>,\n) {\n\treturn getExecutor<E>().executeAllOrThrow(tasks, 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":"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","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"]}
|