@autonomaai/service-utils 1.0.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/dist/env.d.ts +7 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +12 -0
- package/dist/env.js.map +1 -0
- package/dist/fastify.d.ts +15 -0
- package/dist/fastify.d.ts.map +1 -0
- package/dist/fastify.js +57 -0
- package/dist/fastify.js.map +1 -0
- package/dist/health.d.ts +17 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +15 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +22 -0
- package/dist/logger.js.map +1 -0
- package/dist/resilience/bulkhead.d.ts +95 -0
- package/dist/resilience/bulkhead.d.ts.map +1 -0
- package/dist/resilience/bulkhead.js +186 -0
- package/dist/resilience/bulkhead.js.map +1 -0
- package/dist/resilience/circuit-breaker.d.ts +111 -0
- package/dist/resilience/circuit-breaker.d.ts.map +1 -0
- package/dist/resilience/circuit-breaker.js +267 -0
- package/dist/resilience/circuit-breaker.js.map +1 -0
- package/dist/resilience/index.d.ts +15 -0
- package/dist/resilience/index.d.ts.map +1 -0
- package/dist/resilience/index.js +15 -0
- package/dist/resilience/index.js.map +1 -0
- package/dist/resilience/rate-limiter.d.ts +115 -0
- package/dist/resilience/rate-limiter.d.ts.map +1 -0
- package/dist/resilience/rate-limiter.js +257 -0
- package/dist/resilience/rate-limiter.js.map +1 -0
- package/dist/resilience/retry.d.ts +63 -0
- package/dist/resilience/retry.d.ts.map +1 -0
- package/dist/resilience/retry.js +190 -0
- package/dist/resilience/retry.js.map +1 -0
- package/dist/resilience/timeout.d.ts +62 -0
- package/dist/resilience/timeout.d.ts.map +1 -0
- package/dist/resilience/timeout.js +135 -0
- package/dist/resilience/timeout.js.map +1 -0
- package/dist/resilience/types.d.ts +163 -0
- package/dist/resilience/types.d.ts.map +1 -0
- package/dist/resilience/types.js +64 -0
- package/dist/resilience/types.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/resilience/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry Pattern with Exponential Backoff
|
|
3
|
+
*
|
|
4
|
+
* Automatically retries failed operations with configurable:
|
|
5
|
+
* - Max attempts
|
|
6
|
+
* - Exponential backoff
|
|
7
|
+
* - Jitter (randomization)
|
|
8
|
+
* - Retryable exceptions
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Using retry function
|
|
13
|
+
* const result = await retry(
|
|
14
|
+
* () => fetchData(),
|
|
15
|
+
* {
|
|
16
|
+
* maxAttempts: 3,
|
|
17
|
+
* initialDelay: 100,
|
|
18
|
+
* backoffMultiplier: 2,
|
|
19
|
+
* jitter: true
|
|
20
|
+
* }
|
|
21
|
+
* );
|
|
22
|
+
*
|
|
23
|
+
* // Using decorator
|
|
24
|
+
* class ApiClient {
|
|
25
|
+
* @withRetry({ maxAttempts: 3 })
|
|
26
|
+
* async fetchData(): Promise<Data> {
|
|
27
|
+
* // ...
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
import { RetryConfig } from './types.js';
|
|
33
|
+
/**
|
|
34
|
+
* Execute a function with retry logic
|
|
35
|
+
*
|
|
36
|
+
* @param fn - Async function to execute
|
|
37
|
+
* @param config - Retry configuration
|
|
38
|
+
* @returns Result from the function
|
|
39
|
+
* @throws RetryExhaustedError if all retries fail
|
|
40
|
+
*/
|
|
41
|
+
export declare function retry<T>(fn: () => Promise<T>, config?: Partial<RetryConfig>): Promise<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Decorator to add retry logic to a method
|
|
44
|
+
*/
|
|
45
|
+
export declare function withRetry(config?: Partial<RetryConfig>): <T extends (...args: any[]) => Promise<any>>(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T>;
|
|
46
|
+
/**
|
|
47
|
+
* Create a retry wrapper function
|
|
48
|
+
*/
|
|
49
|
+
export declare function createRetry(config?: Partial<RetryConfig>): <T>(fn: () => Promise<T>) => Promise<T>;
|
|
50
|
+
/**
|
|
51
|
+
* Retry with specific configuration presets
|
|
52
|
+
*/
|
|
53
|
+
export declare const retryPresets: {
|
|
54
|
+
/** Fast retry for transient errors */
|
|
55
|
+
fast: Partial<RetryConfig>;
|
|
56
|
+
/** Standard retry for API calls */
|
|
57
|
+
standard: Partial<RetryConfig>;
|
|
58
|
+
/** Aggressive retry for critical operations */
|
|
59
|
+
aggressive: Partial<RetryConfig>;
|
|
60
|
+
/** Conservative retry for rate-limited APIs */
|
|
61
|
+
conservative: Partial<RetryConfig>;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/resilience/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,WAAW,EAAuB,MAAM,YAAY,CAAC;AAwE9D;;;;;;;GAOG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAsCZ;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,IACpC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EACzD,QAAQ,GAAG,EACX,aAAa,MAAM,EACnB,YAAY,uBAAuB,CAAC,CAAC,CAAC,gCAUzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;IACvB,sCAAsC;UAOjC,OAAO,CAAC,WAAW,CAAC;IAEzB,mCAAmC;cAO9B,OAAO,CAAC,WAAW,CAAC;IAEzB,+CAA+C;gBAO1C,OAAO,CAAC,WAAW,CAAC;IAEzB,+CAA+C;kBAO1C,OAAO,CAAC,WAAW,CAAC;CAC1B,CAAC"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry Pattern with Exponential Backoff
|
|
3
|
+
*
|
|
4
|
+
* Automatically retries failed operations with configurable:
|
|
5
|
+
* - Max attempts
|
|
6
|
+
* - Exponential backoff
|
|
7
|
+
* - Jitter (randomization)
|
|
8
|
+
* - Retryable exceptions
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Using retry function
|
|
13
|
+
* const result = await retry(
|
|
14
|
+
* () => fetchData(),
|
|
15
|
+
* {
|
|
16
|
+
* maxAttempts: 3,
|
|
17
|
+
* initialDelay: 100,
|
|
18
|
+
* backoffMultiplier: 2,
|
|
19
|
+
* jitter: true
|
|
20
|
+
* }
|
|
21
|
+
* );
|
|
22
|
+
*
|
|
23
|
+
* // Using decorator
|
|
24
|
+
* class ApiClient {
|
|
25
|
+
* @withRetry({ maxAttempts: 3 })
|
|
26
|
+
* async fetchData(): Promise<Data> {
|
|
27
|
+
* // ...
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
import { RetryExhaustedError } from './types.js';
|
|
33
|
+
const DEFAULT_CONFIG = {
|
|
34
|
+
maxAttempts: 3,
|
|
35
|
+
initialDelay: 100,
|
|
36
|
+
maxDelay: 30000,
|
|
37
|
+
backoffMultiplier: 2,
|
|
38
|
+
jitter: true,
|
|
39
|
+
jitterFactor: 0.1,
|
|
40
|
+
retryableErrors: [],
|
|
41
|
+
nonRetryableErrors: []
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Calculate delay for a given attempt
|
|
45
|
+
*/
|
|
46
|
+
function calculateDelay(attempt, config) {
|
|
47
|
+
let delay = config.initialDelay * Math.pow(config.backoffMultiplier, attempt - 1);
|
|
48
|
+
delay = Math.min(delay, config.maxDelay);
|
|
49
|
+
if (config.jitter) {
|
|
50
|
+
const jitterFactor = config.jitterFactor || 0.1;
|
|
51
|
+
const jitterRange = delay * jitterFactor;
|
|
52
|
+
delay += Math.random() * jitterRange * 2 - jitterRange;
|
|
53
|
+
}
|
|
54
|
+
return Math.max(0, delay);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if an error should be retried
|
|
58
|
+
*/
|
|
59
|
+
function shouldRetry(error, config) {
|
|
60
|
+
// Check non-retryable errors first
|
|
61
|
+
if (config.nonRetryableErrors?.length) {
|
|
62
|
+
for (const nonRetryable of config.nonRetryableErrors) {
|
|
63
|
+
if (typeof nonRetryable === 'string') {
|
|
64
|
+
if (error.message.includes(nonRetryable) || error.name === nonRetryable) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (error instanceof nonRetryable) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// If no retryable errors specified, retry all
|
|
74
|
+
if (!config.retryableErrors?.length) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
// Check retryable errors
|
|
78
|
+
for (const retryable of config.retryableErrors) {
|
|
79
|
+
if (typeof retryable === 'string') {
|
|
80
|
+
if (error.message.includes(retryable) || error.name === retryable) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (error instanceof retryable) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Sleep for a given number of milliseconds
|
|
92
|
+
*/
|
|
93
|
+
function sleep(ms) {
|
|
94
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Execute a function with retry logic
|
|
98
|
+
*
|
|
99
|
+
* @param fn - Async function to execute
|
|
100
|
+
* @param config - Retry configuration
|
|
101
|
+
* @returns Result from the function
|
|
102
|
+
* @throws RetryExhaustedError if all retries fail
|
|
103
|
+
*/
|
|
104
|
+
export async function retry(fn, config) {
|
|
105
|
+
const mergedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
106
|
+
let lastError;
|
|
107
|
+
for (let attempt = 1; attempt <= mergedConfig.maxAttempts; attempt++) {
|
|
108
|
+
try {
|
|
109
|
+
return await fn();
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
lastError = error;
|
|
113
|
+
// Check if this is the last attempt
|
|
114
|
+
if (attempt === mergedConfig.maxAttempts) {
|
|
115
|
+
console.error(`All ${mergedConfig.maxAttempts} attempts failed:`, lastError.message);
|
|
116
|
+
throw new RetryExhaustedError(mergedConfig.maxAttempts, lastError);
|
|
117
|
+
}
|
|
118
|
+
// Check if error is retryable
|
|
119
|
+
if (!shouldRetry(lastError, mergedConfig)) {
|
|
120
|
+
console.error('Non-retryable error:', lastError.message);
|
|
121
|
+
throw lastError;
|
|
122
|
+
}
|
|
123
|
+
// Calculate delay and wait
|
|
124
|
+
const delay = calculateDelay(attempt, mergedConfig);
|
|
125
|
+
console.warn(`Attempt ${attempt}/${mergedConfig.maxAttempts} failed: ${lastError.message}. ` +
|
|
126
|
+
`Retrying in ${delay.toFixed(0)}ms`);
|
|
127
|
+
// Call retry callback if provided
|
|
128
|
+
mergedConfig.onRetry?.(lastError, attempt, delay);
|
|
129
|
+
await sleep(delay);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// This should never be reached, but TypeScript needs it
|
|
133
|
+
throw lastError;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Decorator to add retry logic to a method
|
|
137
|
+
*/
|
|
138
|
+
export function withRetry(config) {
|
|
139
|
+
return function (target, propertyKey, descriptor) {
|
|
140
|
+
const originalMethod = descriptor.value;
|
|
141
|
+
descriptor.value = async function (...args) {
|
|
142
|
+
return retry(() => originalMethod.apply(this, args), config);
|
|
143
|
+
};
|
|
144
|
+
return descriptor;
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Create a retry wrapper function
|
|
149
|
+
*/
|
|
150
|
+
export function createRetry(config) {
|
|
151
|
+
return (fn) => retry(fn, config);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Retry with specific configuration presets
|
|
155
|
+
*/
|
|
156
|
+
export const retryPresets = {
|
|
157
|
+
/** Fast retry for transient errors */
|
|
158
|
+
fast: {
|
|
159
|
+
maxAttempts: 3,
|
|
160
|
+
initialDelay: 50,
|
|
161
|
+
maxDelay: 500,
|
|
162
|
+
backoffMultiplier: 2,
|
|
163
|
+
jitter: true
|
|
164
|
+
},
|
|
165
|
+
/** Standard retry for API calls */
|
|
166
|
+
standard: {
|
|
167
|
+
maxAttempts: 3,
|
|
168
|
+
initialDelay: 100,
|
|
169
|
+
maxDelay: 5000,
|
|
170
|
+
backoffMultiplier: 2,
|
|
171
|
+
jitter: true
|
|
172
|
+
},
|
|
173
|
+
/** Aggressive retry for critical operations */
|
|
174
|
+
aggressive: {
|
|
175
|
+
maxAttempts: 5,
|
|
176
|
+
initialDelay: 200,
|
|
177
|
+
maxDelay: 30000,
|
|
178
|
+
backoffMultiplier: 2,
|
|
179
|
+
jitter: true
|
|
180
|
+
},
|
|
181
|
+
/** Conservative retry for rate-limited APIs */
|
|
182
|
+
conservative: {
|
|
183
|
+
maxAttempts: 3,
|
|
184
|
+
initialDelay: 1000,
|
|
185
|
+
maxDelay: 60000,
|
|
186
|
+
backoffMultiplier: 3,
|
|
187
|
+
jitter: true
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/resilience/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeout Pattern
|
|
3
|
+
*
|
|
4
|
+
* Ensures operations complete within a specified time limit.
|
|
5
|
+
* Prevents hanging operations from blocking resources.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* try {
|
|
10
|
+
* const result = await withTimeout(
|
|
11
|
+
* () => fetchData(),
|
|
12
|
+
* { timeout: 5000, message: 'Fetch data timed out' }
|
|
13
|
+
* );
|
|
14
|
+
* } catch (error) {
|
|
15
|
+
* if (error instanceof TimeoutError) {
|
|
16
|
+
* // Handle timeout
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { TimeoutConfig } from './types.js';
|
|
22
|
+
/**
|
|
23
|
+
* Execute a function with a timeout
|
|
24
|
+
*
|
|
25
|
+
* @param fn - Async function to execute
|
|
26
|
+
* @param config - Timeout configuration
|
|
27
|
+
* @returns Result from the function
|
|
28
|
+
* @throws TimeoutError if operation exceeds timeout
|
|
29
|
+
*/
|
|
30
|
+
export declare function timeout<T>(fn: () => Promise<T>, config?: Partial<TimeoutConfig>): Promise<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Decorator to apply timeout to a method
|
|
33
|
+
*/
|
|
34
|
+
export declare function withTimeout(config?: Partial<TimeoutConfig>): <T extends (...args: any[]) => Promise<any>>(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T>;
|
|
35
|
+
/**
|
|
36
|
+
* Create a timeout wrapper function
|
|
37
|
+
*/
|
|
38
|
+
export declare function createTimeout(config?: Partial<TimeoutConfig>): <T>(fn: () => Promise<T>) => Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Timeout presets for common use cases
|
|
41
|
+
*/
|
|
42
|
+
export declare const timeoutPresets: {
|
|
43
|
+
/** Fast timeout for health checks */
|
|
44
|
+
healthCheck: Partial<TimeoutConfig>;
|
|
45
|
+
/** Standard timeout for API calls */
|
|
46
|
+
api: Partial<TimeoutConfig>;
|
|
47
|
+
/** Extended timeout for complex operations */
|
|
48
|
+
extended: Partial<TimeoutConfig>;
|
|
49
|
+
/** Long timeout for batch operations */
|
|
50
|
+
batch: Partial<TimeoutConfig>;
|
|
51
|
+
/** Short timeout for cache operations */
|
|
52
|
+
cache: Partial<TimeoutConfig>;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Create a racing timeout - returns first result or times out
|
|
56
|
+
*/
|
|
57
|
+
export declare function raceWithTimeout<T>(promises: Array<Promise<T>>, config?: Partial<TimeoutConfig>): Promise<T>;
|
|
58
|
+
/**
|
|
59
|
+
* Execute with deadline (absolute time)
|
|
60
|
+
*/
|
|
61
|
+
export declare function withDeadline<T>(fn: () => Promise<T>, deadline: Date, message?: string): Promise<T>;
|
|
62
|
+
//# sourceMappingURL=timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../src/resilience/timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAOzD;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAC7B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CA8BZ;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,IACxC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EACzD,QAAQ,GAAG,EACX,aAAa,MAAM,EACnB,YAAY,uBAAuB,CAAC,CAAC,CAAC,gCAUzC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB,qCAAqC;iBAIhC,OAAO,CAAC,aAAa,CAAC;IAE3B,qCAAqC;SAIhC,OAAO,CAAC,aAAa,CAAC;IAE3B,8CAA8C;cAIzC,OAAO,CAAC,aAAa,CAAC;IAE3B,wCAAwC;WAInC,OAAO,CAAC,aAAa,CAAC;IAE3B,yCAAyC;WAIpC,OAAO,CAAC,aAAa,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,QAAQ,EAAE,IAAI,EACd,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,CAAC,CAUZ"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeout Pattern
|
|
3
|
+
*
|
|
4
|
+
* Ensures operations complete within a specified time limit.
|
|
5
|
+
* Prevents hanging operations from blocking resources.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* try {
|
|
10
|
+
* const result = await withTimeout(
|
|
11
|
+
* () => fetchData(),
|
|
12
|
+
* { timeout: 5000, message: 'Fetch data timed out' }
|
|
13
|
+
* );
|
|
14
|
+
* } catch (error) {
|
|
15
|
+
* if (error instanceof TimeoutError) {
|
|
16
|
+
* // Handle timeout
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { TimeoutError } from './types.js';
|
|
22
|
+
const DEFAULT_CONFIG = {
|
|
23
|
+
timeout: 30000,
|
|
24
|
+
message: undefined
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Execute a function with a timeout
|
|
28
|
+
*
|
|
29
|
+
* @param fn - Async function to execute
|
|
30
|
+
* @param config - Timeout configuration
|
|
31
|
+
* @returns Result from the function
|
|
32
|
+
* @throws TimeoutError if operation exceeds timeout
|
|
33
|
+
*/
|
|
34
|
+
export async function timeout(fn, config) {
|
|
35
|
+
const mergedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
let settled = false;
|
|
38
|
+
const timer = setTimeout(() => {
|
|
39
|
+
if (!settled) {
|
|
40
|
+
settled = true;
|
|
41
|
+
mergedConfig.onTimeout?.();
|
|
42
|
+
reject(new TimeoutError(mergedConfig.timeout, mergedConfig.message));
|
|
43
|
+
}
|
|
44
|
+
}, mergedConfig.timeout);
|
|
45
|
+
fn()
|
|
46
|
+
.then(result => {
|
|
47
|
+
if (!settled) {
|
|
48
|
+
settled = true;
|
|
49
|
+
clearTimeout(timer);
|
|
50
|
+
resolve(result);
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
.catch(error => {
|
|
54
|
+
if (!settled) {
|
|
55
|
+
settled = true;
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
reject(error);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Decorator to apply timeout to a method
|
|
64
|
+
*/
|
|
65
|
+
export function withTimeout(config) {
|
|
66
|
+
return function (target, propertyKey, descriptor) {
|
|
67
|
+
const originalMethod = descriptor.value;
|
|
68
|
+
descriptor.value = async function (...args) {
|
|
69
|
+
return timeout(() => originalMethod.apply(this, args), config);
|
|
70
|
+
};
|
|
71
|
+
return descriptor;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a timeout wrapper function
|
|
76
|
+
*/
|
|
77
|
+
export function createTimeout(config) {
|
|
78
|
+
return (fn) => timeout(fn, config);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Timeout presets for common use cases
|
|
82
|
+
*/
|
|
83
|
+
export const timeoutPresets = {
|
|
84
|
+
/** Fast timeout for health checks */
|
|
85
|
+
healthCheck: {
|
|
86
|
+
timeout: 1000,
|
|
87
|
+
message: 'Health check timed out'
|
|
88
|
+
},
|
|
89
|
+
/** Standard timeout for API calls */
|
|
90
|
+
api: {
|
|
91
|
+
timeout: 10000,
|
|
92
|
+
message: 'API call timed out'
|
|
93
|
+
},
|
|
94
|
+
/** Extended timeout for complex operations */
|
|
95
|
+
extended: {
|
|
96
|
+
timeout: 30000,
|
|
97
|
+
message: 'Operation timed out'
|
|
98
|
+
},
|
|
99
|
+
/** Long timeout for batch operations */
|
|
100
|
+
batch: {
|
|
101
|
+
timeout: 120000,
|
|
102
|
+
message: 'Batch operation timed out'
|
|
103
|
+
},
|
|
104
|
+
/** Short timeout for cache operations */
|
|
105
|
+
cache: {
|
|
106
|
+
timeout: 100,
|
|
107
|
+
message: 'Cache operation timed out'
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Create a racing timeout - returns first result or times out
|
|
112
|
+
*/
|
|
113
|
+
export async function raceWithTimeout(promises, config) {
|
|
114
|
+
const mergedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
115
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
116
|
+
setTimeout(() => {
|
|
117
|
+
mergedConfig.onTimeout?.();
|
|
118
|
+
reject(new TimeoutError(mergedConfig.timeout, mergedConfig.message));
|
|
119
|
+
}, mergedConfig.timeout);
|
|
120
|
+
});
|
|
121
|
+
return Promise.race([...promises, timeoutPromise]);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Execute with deadline (absolute time)
|
|
125
|
+
*/
|
|
126
|
+
export async function withDeadline(fn, deadline, message) {
|
|
127
|
+
const now = Date.now();
|
|
128
|
+
const deadlineMs = deadline.getTime();
|
|
129
|
+
const remainingMs = deadlineMs - now;
|
|
130
|
+
if (remainingMs <= 0) {
|
|
131
|
+
throw new TimeoutError(0, message || 'Deadline already passed');
|
|
132
|
+
}
|
|
133
|
+
return timeout(fn, { timeout: remainingMs, message });
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/resilience/timeout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilience Pattern Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for all resilience patterns.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Circuit breaker states
|
|
8
|
+
*/
|
|
9
|
+
export declare enum CircuitState {
|
|
10
|
+
CLOSED = "closed",
|
|
11
|
+
OPEN = "open",
|
|
12
|
+
HALF_OPEN = "half_open"
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Circuit breaker configuration
|
|
16
|
+
*/
|
|
17
|
+
export interface CircuitBreakerConfig {
|
|
18
|
+
/** Unique name for this circuit breaker */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Number of failures before opening circuit */
|
|
21
|
+
failureThreshold: number;
|
|
22
|
+
/** Time in ms before attempting recovery */
|
|
23
|
+
recoveryTimeout: number;
|
|
24
|
+
/** Max calls allowed in half-open state */
|
|
25
|
+
halfOpenMaxCalls: number;
|
|
26
|
+
/** Failure rate threshold (0-1) to trip breaker */
|
|
27
|
+
failureRateThreshold?: number;
|
|
28
|
+
/** Exceptions that don't count as failures */
|
|
29
|
+
excludedErrors?: Array<new (...args: any[]) => Error>;
|
|
30
|
+
/** Callback when circuit opens */
|
|
31
|
+
onOpen?: () => void;
|
|
32
|
+
/** Callback when circuit closes */
|
|
33
|
+
onClose?: () => void;
|
|
34
|
+
/** Callback when circuit enters half-open */
|
|
35
|
+
onHalfOpen?: () => void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Circuit breaker statistics
|
|
39
|
+
*/
|
|
40
|
+
export interface CircuitBreakerStats {
|
|
41
|
+
totalCalls: number;
|
|
42
|
+
successfulCalls: number;
|
|
43
|
+
failedCalls: number;
|
|
44
|
+
rejectedCalls: number;
|
|
45
|
+
lastFailureTime?: number;
|
|
46
|
+
lastSuccessTime?: number;
|
|
47
|
+
state: CircuitState;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Retry policy configuration
|
|
51
|
+
*/
|
|
52
|
+
export interface RetryConfig {
|
|
53
|
+
/** Maximum number of attempts */
|
|
54
|
+
maxAttempts: number;
|
|
55
|
+
/** Initial delay in ms */
|
|
56
|
+
initialDelay: number;
|
|
57
|
+
/** Maximum delay in ms */
|
|
58
|
+
maxDelay: number;
|
|
59
|
+
/** Backoff multiplier */
|
|
60
|
+
backoffMultiplier: number;
|
|
61
|
+
/** Add jitter to delays */
|
|
62
|
+
jitter: boolean;
|
|
63
|
+
/** Jitter factor (0-1) */
|
|
64
|
+
jitterFactor?: number;
|
|
65
|
+
/** Error codes/types that are retryable */
|
|
66
|
+
retryableErrors?: Array<string | (new (...args: any[]) => Error)>;
|
|
67
|
+
/** Error codes/types that should NOT be retried */
|
|
68
|
+
nonRetryableErrors?: Array<string | (new (...args: any[]) => Error)>;
|
|
69
|
+
/** Callback on each retry */
|
|
70
|
+
onRetry?: (error: Error, attempt: number, delay: number) => void;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Bulkhead configuration
|
|
74
|
+
*/
|
|
75
|
+
export interface BulkheadConfig {
|
|
76
|
+
/** Maximum concurrent executions */
|
|
77
|
+
maxConcurrent: number;
|
|
78
|
+
/** Maximum queued requests */
|
|
79
|
+
maxQueued: number;
|
|
80
|
+
/** Queue timeout in ms */
|
|
81
|
+
queueTimeout: number;
|
|
82
|
+
/** Callback when bulkhead is full */
|
|
83
|
+
onReject?: () => void;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Rate limiter configuration
|
|
87
|
+
*/
|
|
88
|
+
export interface RateLimiterConfig {
|
|
89
|
+
/** Time window in ms */
|
|
90
|
+
windowMs: number;
|
|
91
|
+
/** Maximum requests per window */
|
|
92
|
+
maxRequests: number;
|
|
93
|
+
/** Key generator function */
|
|
94
|
+
keyGenerator?: (context: any) => string;
|
|
95
|
+
/** Skip successful requests */
|
|
96
|
+
skipSuccessfulRequests?: boolean;
|
|
97
|
+
/** Skip failed requests */
|
|
98
|
+
skipFailedRequests?: boolean;
|
|
99
|
+
/** Callback when rate limit exceeded */
|
|
100
|
+
onLimitReached?: (key: string) => void;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Timeout configuration
|
|
104
|
+
*/
|
|
105
|
+
export interface TimeoutConfig {
|
|
106
|
+
/** Timeout in ms */
|
|
107
|
+
timeout: number;
|
|
108
|
+
/** Custom timeout error message */
|
|
109
|
+
message?: string;
|
|
110
|
+
/** Callback on timeout */
|
|
111
|
+
onTimeout?: () => void;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Fallback configuration
|
|
115
|
+
*/
|
|
116
|
+
export interface FallbackConfig<T> {
|
|
117
|
+
/** Fallback strategy */
|
|
118
|
+
strategy: 'cache' | 'default' | 'function' | 'error';
|
|
119
|
+
/** Default value for 'default' strategy */
|
|
120
|
+
defaultValue?: T;
|
|
121
|
+
/** Fallback function for 'function' strategy */
|
|
122
|
+
fallbackFn?: () => T | Promise<T>;
|
|
123
|
+
/** Cache TTL in ms for 'cache' strategy */
|
|
124
|
+
cacheTTL?: number;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Combined resilience options
|
|
128
|
+
*/
|
|
129
|
+
export interface ResilienceOptions<T = any> {
|
|
130
|
+
circuitBreaker?: Partial<CircuitBreakerConfig>;
|
|
131
|
+
retry?: Partial<RetryConfig>;
|
|
132
|
+
bulkhead?: Partial<BulkheadConfig>;
|
|
133
|
+
rateLimiter?: Partial<RateLimiterConfig>;
|
|
134
|
+
timeout?: Partial<TimeoutConfig>;
|
|
135
|
+
fallback?: FallbackConfig<T>;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Error types
|
|
139
|
+
*/
|
|
140
|
+
export declare class CircuitBreakerOpenError extends Error {
|
|
141
|
+
readonly name: string;
|
|
142
|
+
readonly retryAfter: number;
|
|
143
|
+
constructor(name: string, retryAfter: number);
|
|
144
|
+
}
|
|
145
|
+
export declare class BulkheadFullError extends Error {
|
|
146
|
+
readonly name: string;
|
|
147
|
+
constructor(name: string);
|
|
148
|
+
}
|
|
149
|
+
export declare class RateLimitExceededError extends Error {
|
|
150
|
+
readonly key: string;
|
|
151
|
+
readonly retryAfter: number;
|
|
152
|
+
constructor(key: string, retryAfter: number);
|
|
153
|
+
}
|
|
154
|
+
export declare class TimeoutError extends Error {
|
|
155
|
+
readonly timeout: number;
|
|
156
|
+
constructor(timeout: number, message?: string);
|
|
157
|
+
}
|
|
158
|
+
export declare class RetryExhaustedError extends Error {
|
|
159
|
+
readonly attempts: number;
|
|
160
|
+
readonly lastError: Error;
|
|
161
|
+
constructor(attempts: number, lastError: Error);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resilience/types.ts"],"names":[],"mappings":"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"}
|