@freshguard/freshguard-core 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +644 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +350 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/connectors/base-connector.d.ts +62 -0
  8. package/dist/connectors/base-connector.d.ts.map +1 -0
  9. package/dist/connectors/base-connector.js +549 -0
  10. package/dist/connectors/base-connector.js.map +1 -0
  11. package/dist/connectors/bigquery.d.ts +38 -0
  12. package/dist/connectors/bigquery.d.ts.map +1 -0
  13. package/dist/connectors/bigquery.js +406 -0
  14. package/dist/connectors/bigquery.js.map +1 -0
  15. package/dist/connectors/duckdb.d.ts +36 -0
  16. package/dist/connectors/duckdb.d.ts.map +1 -0
  17. package/dist/connectors/duckdb.js +364 -0
  18. package/dist/connectors/duckdb.js.map +1 -0
  19. package/dist/connectors/index.d.ts +7 -0
  20. package/dist/connectors/index.d.ts.map +1 -0
  21. package/dist/connectors/index.js +7 -0
  22. package/dist/connectors/index.js.map +1 -0
  23. package/dist/connectors/mysql.d.ts +32 -0
  24. package/dist/connectors/mysql.d.ts.map +1 -0
  25. package/dist/connectors/mysql.js +348 -0
  26. package/dist/connectors/mysql.js.map +1 -0
  27. package/dist/connectors/postgres.d.ts +31 -0
  28. package/dist/connectors/postgres.d.ts.map +1 -0
  29. package/dist/connectors/postgres.js +326 -0
  30. package/dist/connectors/postgres.js.map +1 -0
  31. package/dist/connectors/redshift.d.ts +32 -0
  32. package/dist/connectors/redshift.d.ts.map +1 -0
  33. package/dist/connectors/redshift.js +366 -0
  34. package/dist/connectors/redshift.js.map +1 -0
  35. package/dist/connectors/snowflake.d.ts +43 -0
  36. package/dist/connectors/snowflake.d.ts.map +1 -0
  37. package/dist/connectors/snowflake.js +442 -0
  38. package/dist/connectors/snowflake.js.map +1 -0
  39. package/dist/db/index.d.ts +9 -0
  40. package/dist/db/index.d.ts.map +1 -0
  41. package/dist/db/index.js +10 -0
  42. package/dist/db/index.js.map +1 -0
  43. package/dist/db/migrate.d.ts +12 -0
  44. package/dist/db/migrate.d.ts.map +1 -0
  45. package/dist/db/migrate.js +114 -0
  46. package/dist/db/migrate.js.map +1 -0
  47. package/dist/db/schema.d.ts +2053 -0
  48. package/dist/db/schema.d.ts.map +1 -0
  49. package/dist/db/schema.js +164 -0
  50. package/dist/db/schema.js.map +1 -0
  51. package/dist/errors/debug-factory.d.ts +23 -0
  52. package/dist/errors/debug-factory.d.ts.map +1 -0
  53. package/dist/errors/debug-factory.js +149 -0
  54. package/dist/errors/debug-factory.js.map +1 -0
  55. package/dist/errors/index.d.ts +119 -0
  56. package/dist/errors/index.d.ts.map +1 -0
  57. package/dist/errors/index.js +341 -0
  58. package/dist/errors/index.js.map +1 -0
  59. package/dist/index.d.ts +9 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +6 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/metadata/duckdb-storage.d.ts +31 -0
  64. package/dist/metadata/duckdb-storage.d.ts.map +1 -0
  65. package/dist/metadata/duckdb-storage.js +230 -0
  66. package/dist/metadata/duckdb-storage.js.map +1 -0
  67. package/dist/metadata/factory.d.ts +4 -0
  68. package/dist/metadata/factory.d.ts.map +1 -0
  69. package/dist/metadata/factory.js +23 -0
  70. package/dist/metadata/factory.js.map +1 -0
  71. package/dist/metadata/index.d.ts +6 -0
  72. package/dist/metadata/index.d.ts.map +1 -0
  73. package/dist/metadata/index.js +4 -0
  74. package/dist/metadata/index.js.map +1 -0
  75. package/dist/metadata/interface.d.ts +26 -0
  76. package/dist/metadata/interface.d.ts.map +1 -0
  77. package/dist/metadata/interface.js +2 -0
  78. package/dist/metadata/interface.js.map +1 -0
  79. package/dist/metadata/postgresql-storage.d.ts +32 -0
  80. package/dist/metadata/postgresql-storage.d.ts.map +1 -0
  81. package/dist/metadata/postgresql-storage.js +242 -0
  82. package/dist/metadata/postgresql-storage.js.map +1 -0
  83. package/dist/metadata/schema-config.d.ts +30 -0
  84. package/dist/metadata/schema-config.d.ts.map +1 -0
  85. package/dist/metadata/schema-config.js +94 -0
  86. package/dist/metadata/schema-config.js.map +1 -0
  87. package/dist/metadata/types.d.ts +35 -0
  88. package/dist/metadata/types.d.ts.map +1 -0
  89. package/dist/metadata/types.js +2 -0
  90. package/dist/metadata/types.js.map +1 -0
  91. package/dist/monitor/baseline-calculator.d.ts +30 -0
  92. package/dist/monitor/baseline-calculator.d.ts.map +1 -0
  93. package/dist/monitor/baseline-calculator.js +192 -0
  94. package/dist/monitor/baseline-calculator.js.map +1 -0
  95. package/dist/monitor/baseline-config.d.ts +37 -0
  96. package/dist/monitor/baseline-config.d.ts.map +1 -0
  97. package/dist/monitor/baseline-config.js +156 -0
  98. package/dist/monitor/baseline-config.js.map +1 -0
  99. package/dist/monitor/freshness.d.ts +5 -0
  100. package/dist/monitor/freshness.d.ts.map +1 -0
  101. package/dist/monitor/freshness.js +239 -0
  102. package/dist/monitor/freshness.js.map +1 -0
  103. package/dist/monitor/index.d.ts +5 -0
  104. package/dist/monitor/index.d.ts.map +1 -0
  105. package/dist/monitor/index.js +5 -0
  106. package/dist/monitor/index.js.map +1 -0
  107. package/dist/monitor/schema-baseline.d.ts +22 -0
  108. package/dist/monitor/schema-baseline.d.ts.map +1 -0
  109. package/dist/monitor/schema-baseline.js +211 -0
  110. package/dist/monitor/schema-baseline.js.map +1 -0
  111. package/dist/monitor/schema-changes.d.ts +5 -0
  112. package/dist/monitor/schema-changes.d.ts.map +1 -0
  113. package/dist/monitor/schema-changes.js +289 -0
  114. package/dist/monitor/schema-changes.js.map +1 -0
  115. package/dist/monitor/volume.d.ts +5 -0
  116. package/dist/monitor/volume.d.ts.map +1 -0
  117. package/dist/monitor/volume.js +262 -0
  118. package/dist/monitor/volume.js.map +1 -0
  119. package/dist/observability/logger.d.ts +63 -0
  120. package/dist/observability/logger.d.ts.map +1 -0
  121. package/dist/observability/logger.js +282 -0
  122. package/dist/observability/logger.js.map +1 -0
  123. package/dist/observability/metrics.d.ts +106 -0
  124. package/dist/observability/metrics.d.ts.map +1 -0
  125. package/dist/observability/metrics.js +441 -0
  126. package/dist/observability/metrics.js.map +1 -0
  127. package/dist/query-analyzer.js +526 -0
  128. package/dist/resilience/circuit-breaker.d.ts +94 -0
  129. package/dist/resilience/circuit-breaker.d.ts.map +1 -0
  130. package/dist/resilience/circuit-breaker.js +379 -0
  131. package/dist/resilience/circuit-breaker.js.map +1 -0
  132. package/dist/resilience/index.d.ts +7 -0
  133. package/dist/resilience/index.d.ts.map +1 -0
  134. package/dist/resilience/index.js +7 -0
  135. package/dist/resilience/index.js.map +1 -0
  136. package/dist/resilience/retry-policy.d.ts +87 -0
  137. package/dist/resilience/retry-policy.d.ts.map +1 -0
  138. package/dist/resilience/retry-policy.js +423 -0
  139. package/dist/resilience/retry-policy.js.map +1 -0
  140. package/dist/resilience/timeout-manager.d.ts +97 -0
  141. package/dist/resilience/timeout-manager.d.ts.map +1 -0
  142. package/dist/resilience/timeout-manager.js +339 -0
  143. package/dist/resilience/timeout-manager.js.map +1 -0
  144. package/dist/security/query-analyzer.d.ts +82 -0
  145. package/dist/security/query-analyzer.d.ts.map +1 -0
  146. package/dist/security/query-analyzer.js +381 -0
  147. package/dist/security/query-analyzer.js.map +1 -0
  148. package/dist/security/schema-cache.d.ts +95 -0
  149. package/dist/security/schema-cache.d.ts.map +1 -0
  150. package/dist/security/schema-cache.js +344 -0
  151. package/dist/security/schema-cache.js.map +1 -0
  152. package/dist/types/connector.d.ts +68 -0
  153. package/dist/types/connector.d.ts.map +1 -0
  154. package/dist/types/connector.js +26 -0
  155. package/dist/types/connector.js.map +1 -0
  156. package/dist/types.d.ts +244 -0
  157. package/dist/types.d.ts.map +1 -0
  158. package/dist/types.js +2 -0
  159. package/dist/types.js.map +1 -0
  160. package/dist/validation/index.d.ts +7 -0
  161. package/dist/validation/index.d.ts.map +1 -0
  162. package/dist/validation/index.js +5 -0
  163. package/dist/validation/index.js.map +1 -0
  164. package/dist/validation/runtime-validator.d.ts +70 -0
  165. package/dist/validation/runtime-validator.d.ts.map +1 -0
  166. package/dist/validation/runtime-validator.js +206 -0
  167. package/dist/validation/runtime-validator.js.map +1 -0
  168. package/dist/validation/sanitizers.d.ts +56 -0
  169. package/dist/validation/sanitizers.d.ts.map +1 -0
  170. package/dist/validation/sanitizers.js +264 -0
  171. package/dist/validation/sanitizers.js.map +1 -0
  172. package/dist/validation/schemas.d.ts +224 -0
  173. package/dist/validation/schemas.d.ts.map +1 -0
  174. package/dist/validation/schemas.js +263 -0
  175. package/dist/validation/schemas.js.map +1 -0
  176. package/dist/validators/index.d.ts +18 -0
  177. package/dist/validators/index.d.ts.map +1 -0
  178. package/dist/validators/index.js +209 -0
  179. package/dist/validators/index.js.map +1 -0
  180. package/package.json +91 -0
@@ -0,0 +1,423 @@
1
+ import { createComponentLogger } from '../observability/logger.js';
2
+ import { createComponentMetrics } from '../observability/metrics.js';
3
+ export class RetryExhaustedError extends Error {
4
+ attempts;
5
+ totalDuration;
6
+ lastError;
7
+ constructor(attempts, totalDuration, lastError) {
8
+ const message = `Retry exhausted after ${attempts.length} attempts (${totalDuration}ms). Last error: ${lastError.message}`;
9
+ super(message);
10
+ this.name = 'RetryExhaustedError';
11
+ this.attempts = attempts;
12
+ this.totalDuration = totalDuration;
13
+ this.lastError = lastError;
14
+ }
15
+ }
16
+ export class AttemptTimeoutError extends Error {
17
+ attemptNumber;
18
+ timeout;
19
+ constructor(attemptNumber, timeout) {
20
+ super(`Attempt ${attemptNumber} timed out after ${timeout}ms`);
21
+ this.name = 'AttemptTimeoutError';
22
+ this.attemptNumber = attemptNumber;
23
+ this.timeout = timeout;
24
+ }
25
+ }
26
+ const DEFAULT_CONFIG = {
27
+ maxAttempts: 3,
28
+ baseDelay: 100,
29
+ maxDelay: 5000,
30
+ backoffMultiplier: 2,
31
+ enableJitter: true,
32
+ logger: createComponentLogger('retry-policy'),
33
+ metrics: createComponentMetrics('retry-policy'),
34
+ enableDetailedLogging: false
35
+ };
36
+ export const DATABASE_RETRY_CONFIG = {
37
+ maxAttempts: 5,
38
+ baseDelay: 200,
39
+ maxDelay: 10000,
40
+ backoffMultiplier: 2,
41
+ enableJitter: true,
42
+ attemptTimeout: 30000,
43
+ retryCondition: (error) => {
44
+ const retryableErrors = [
45
+ 'connection',
46
+ 'timeout',
47
+ 'network',
48
+ 'econnreset',
49
+ 'enotfound',
50
+ 'temporarily unavailable',
51
+ 'service unavailable'
52
+ ];
53
+ const message = error.message.toLowerCase();
54
+ return retryableErrors.some(pattern => message.includes(pattern));
55
+ }
56
+ };
57
+ export const API_RETRY_CONFIG = {
58
+ maxAttempts: 3,
59
+ baseDelay: 1000,
60
+ maxDelay: 8000,
61
+ backoffMultiplier: 2,
62
+ enableJitter: true,
63
+ attemptTimeout: 10000,
64
+ retryCondition: (error, attempt) => {
65
+ if (error.message.includes('status')) {
66
+ const statusMatch = /status\s+(\d+)/i.exec(error.message);
67
+ if (statusMatch?.[1]) {
68
+ const status = parseInt(statusMatch[1]);
69
+ return status >= 500 && status < 600;
70
+ }
71
+ }
72
+ const networkErrors = ['timeout', 'network', 'connection'];
73
+ const hasNetworkError = networkErrors.some(pattern => error.message.toLowerCase().includes(pattern));
74
+ return hasNetworkError && attempt <= 2;
75
+ }
76
+ };
77
+ function calculateDelay(attempt, baseDelay, maxDelay, multiplier, enableJitter) {
78
+ const exponentialDelay = Math.min(baseDelay * Math.pow(multiplier, attempt - 1), maxDelay);
79
+ if (enableJitter) {
80
+ const jitter = Math.random() * 0.1 * exponentialDelay;
81
+ return Math.floor(exponentialDelay + (Math.random() > 0.5 ? jitter : -jitter));
82
+ }
83
+ return exponentialDelay;
84
+ }
85
+ function defaultRetryCondition(error, _attempt) {
86
+ const nonRetryableErrors = [
87
+ 'validation',
88
+ 'authentication',
89
+ 'authorization',
90
+ 'permission',
91
+ 'forbidden',
92
+ 'not found',
93
+ 'bad request'
94
+ ];
95
+ const message = error.message.toLowerCase();
96
+ const errorName = error.name.toLowerCase();
97
+ return !nonRetryableErrors.some(pattern => message.includes(pattern) || errorName.includes(pattern));
98
+ }
99
+ function sleep(ms) {
100
+ return new Promise(resolve => setTimeout(resolve, ms));
101
+ }
102
+ async function executeWithTimeout(fn, timeoutMs, attemptNumber = 1) {
103
+ if (timeoutMs <= 0) {
104
+ return fn();
105
+ }
106
+ const controller = new AbortController();
107
+ let timedOut = false;
108
+ const timeoutId = setTimeout(() => {
109
+ timedOut = true;
110
+ controller.abort();
111
+ }, timeoutMs);
112
+ try {
113
+ let result;
114
+ try {
115
+ result = await fn(controller.signal);
116
+ }
117
+ catch (sigError) {
118
+ result = await fn();
119
+ }
120
+ return result;
121
+ }
122
+ catch (error) {
123
+ if (timedOut || controller.signal.aborted) {
124
+ throw new AttemptTimeoutError(attemptNumber, timeoutMs);
125
+ }
126
+ throw error;
127
+ }
128
+ finally {
129
+ clearTimeout(timeoutId);
130
+ }
131
+ }
132
+ export class RetryPolicy {
133
+ config;
134
+ logger;
135
+ metrics;
136
+ enableDetailedLogging;
137
+ stats = {
138
+ totalExecutions: 0,
139
+ successfulExecutions: 0,
140
+ failedExecutions: 0,
141
+ totalAttempts: 0,
142
+ averageAttempts: 0,
143
+ averageDuration: 0,
144
+ successRate: 0,
145
+ lastExecutionTime: null
146
+ };
147
+ constructor(config = {}) {
148
+ this.config = {
149
+ ...DEFAULT_CONFIG,
150
+ retryCondition: config.retryCondition || defaultRetryCondition,
151
+ delayFunction: config.delayFunction || ((attempt, baseDelay, maxDelay) => calculateDelay(attempt, baseDelay, maxDelay, DEFAULT_CONFIG.backoffMultiplier, DEFAULT_CONFIG.enableJitter)),
152
+ attemptTimeout: config.attemptTimeout || 0,
153
+ name: config.name || 'RetryPolicy',
154
+ maxAttempts: config.maxAttempts || DEFAULT_CONFIG.maxAttempts,
155
+ baseDelay: config.baseDelay || DEFAULT_CONFIG.baseDelay,
156
+ maxDelay: config.maxDelay || DEFAULT_CONFIG.maxDelay,
157
+ backoffMultiplier: config.backoffMultiplier || DEFAULT_CONFIG.backoffMultiplier,
158
+ enableJitter: config.enableJitter !== undefined ? config.enableJitter : DEFAULT_CONFIG.enableJitter
159
+ };
160
+ this.logger = config.logger || createComponentLogger('retry-policy');
161
+ this.metrics = config.metrics || createComponentMetrics('retry_policy');
162
+ this.enableDetailedLogging = config.enableDetailedLogging !== false;
163
+ if (this.config.maxAttempts < 1) {
164
+ throw new Error('maxAttempts must be at least 1');
165
+ }
166
+ if (this.config.baseDelay < 0) {
167
+ throw new Error('baseDelay cannot be negative');
168
+ }
169
+ if (this.config.maxDelay < this.config.baseDelay) {
170
+ throw new Error('maxDelay must be >= baseDelay');
171
+ }
172
+ this.logger.info('Retry policy initialized', {
173
+ policyName: this.config.name,
174
+ maxAttempts: this.config.maxAttempts,
175
+ baseDelay: this.config.baseDelay,
176
+ maxDelay: this.config.maxDelay,
177
+ backoffMultiplier: this.config.backoffMultiplier,
178
+ enableJitter: this.config.enableJitter
179
+ });
180
+ }
181
+ async execute(fn) {
182
+ const result = await this.executeWithResult(fn);
183
+ if (result.success && result.data !== undefined) {
184
+ return result.data;
185
+ }
186
+ else {
187
+ throw result.error || new Error('Retry failed with unknown error');
188
+ }
189
+ }
190
+ async executeWithResult(fn) {
191
+ const attempts = [];
192
+ const startTime = Date.now();
193
+ this.stats.totalExecutions++;
194
+ this.stats.lastExecutionTime = new Date();
195
+ if (this.enableDetailedLogging) {
196
+ this.logger.debug('Starting retry execution', {
197
+ policyName: this.config.name,
198
+ maxAttempts: this.config.maxAttempts
199
+ });
200
+ }
201
+ for (let attempt = 1; attempt <= this.config.maxAttempts; attempt++) {
202
+ const attemptStartTime = new Date();
203
+ let attemptEndTime = null;
204
+ let error = null;
205
+ let result;
206
+ try {
207
+ if (this.config.attemptTimeout && this.config.attemptTimeout > 0) {
208
+ result = await executeWithTimeout(fn, this.config.attemptTimeout, attempt);
209
+ }
210
+ else {
211
+ result = await fn();
212
+ }
213
+ attemptEndTime = new Date();
214
+ const attemptInfo = {
215
+ attempt,
216
+ startTime: attemptStartTime,
217
+ endTime: attemptEndTime,
218
+ duration: attemptEndTime.getTime() - attemptStartTime.getTime(),
219
+ error: null,
220
+ delay: 0,
221
+ success: true
222
+ };
223
+ attempts.push(attemptInfo);
224
+ const totalDuration = Date.now() - startTime;
225
+ this.logger.info('Retry execution succeeded', {
226
+ policyName: this.config.name,
227
+ attempt,
228
+ duration: attemptInfo.duration,
229
+ totalDuration,
230
+ success: true
231
+ });
232
+ this.metrics.recordRetryAttempt(this.config.name, attempt, attemptInfo.duration, true, true);
233
+ this.updateStats(attempts, totalDuration, true);
234
+ return {
235
+ success: true,
236
+ data: result,
237
+ attempts,
238
+ totalDuration,
239
+ totalAttempts: attempt
240
+ };
241
+ }
242
+ catch (err) {
243
+ error = err;
244
+ attemptEndTime = new Date();
245
+ const attemptInfo = {
246
+ attempt,
247
+ startTime: attemptStartTime,
248
+ endTime: attemptEndTime,
249
+ duration: attemptEndTime.getTime() - attemptStartTime.getTime(),
250
+ error,
251
+ delay: 0,
252
+ success: false
253
+ };
254
+ const willRetry = attempt < this.config.maxAttempts && this.config.retryCondition(error, attempt);
255
+ if (willRetry) {
256
+ const delay = this.config.delayFunction(attempt, this.config.baseDelay, this.config.maxDelay);
257
+ attemptInfo.delay = delay;
258
+ attempts.push(attemptInfo);
259
+ this.logger.warn('Retry attempt failed, will retry', {
260
+ policyName: this.config.name,
261
+ attempt,
262
+ duration: attemptInfo.duration,
263
+ errorType: error.constructor.name,
264
+ errorMessage: error.message,
265
+ delay,
266
+ nextAttempt: attempt + 1,
267
+ maxAttempts: this.config.maxAttempts
268
+ });
269
+ this.metrics.recordRetryAttempt(this.config.name, attempt, attemptInfo.duration, false, false);
270
+ await sleep(delay);
271
+ }
272
+ else {
273
+ attempts.push(attemptInfo);
274
+ if (attempt >= this.config.maxAttempts) {
275
+ this.logger.error('Retry attempts exhausted', {
276
+ policyName: this.config.name,
277
+ attempt,
278
+ duration: attemptInfo.duration,
279
+ errorType: error.constructor.name,
280
+ errorMessage: error.message,
281
+ totalAttempts: this.config.maxAttempts
282
+ });
283
+ }
284
+ else {
285
+ this.logger.info('Retry not attempted due to retry condition', {
286
+ policyName: this.config.name,
287
+ attempt,
288
+ errorType: error.constructor.name,
289
+ errorMessage: error.message
290
+ });
291
+ }
292
+ this.metrics.recordRetryAttempt(this.config.name, attempt, attemptInfo.duration, false, true);
293
+ break;
294
+ }
295
+ }
296
+ }
297
+ const totalDuration = Date.now() - startTime;
298
+ this.updateStats(attempts, totalDuration, false);
299
+ const lastError = attempts[attempts.length - 1]?.error || new Error('Unknown error');
300
+ const retryExhaustedError = new RetryExhaustedError(attempts, totalDuration, lastError);
301
+ this.logger.error('Retry execution failed after all attempts', {
302
+ policyName: this.config.name,
303
+ totalAttempts: attempts.length,
304
+ totalDuration,
305
+ lastErrorType: lastError.constructor.name,
306
+ lastErrorMessage: lastError.message,
307
+ success: false
308
+ });
309
+ return {
310
+ success: false,
311
+ error: retryExhaustedError,
312
+ attempts,
313
+ totalDuration,
314
+ totalAttempts: attempts.length
315
+ };
316
+ }
317
+ updateStats(attempts, totalDuration, success) {
318
+ this.stats.totalAttempts += attempts.length;
319
+ if (success) {
320
+ this.stats.successfulExecutions++;
321
+ }
322
+ else {
323
+ this.stats.failedExecutions++;
324
+ }
325
+ this.stats.averageAttempts = this.stats.totalAttempts / this.stats.totalExecutions;
326
+ this.stats.averageDuration = ((this.stats.averageDuration * (this.stats.totalExecutions - 1) + totalDuration) /
327
+ this.stats.totalExecutions);
328
+ this.stats.successRate = (this.stats.successfulExecutions / this.stats.totalExecutions) * 100;
329
+ }
330
+ getStats() {
331
+ return {
332
+ ...this.stats,
333
+ averageAttempts: Math.round(this.stats.averageAttempts * 100) / 100,
334
+ averageDuration: Math.round(this.stats.averageDuration * 100) / 100,
335
+ successRate: Math.round(this.stats.successRate * 100) / 100
336
+ };
337
+ }
338
+ resetStats() {
339
+ this.stats = {
340
+ totalExecutions: 0,
341
+ successfulExecutions: 0,
342
+ failedExecutions: 0,
343
+ totalAttempts: 0,
344
+ averageAttempts: 0,
345
+ averageDuration: 0,
346
+ successRate: 0,
347
+ lastExecutionTime: null
348
+ };
349
+ }
350
+ getConfig() {
351
+ return {
352
+ ...this.config,
353
+ logger: this.logger,
354
+ metrics: this.metrics
355
+ };
356
+ }
357
+ withConfig(config) {
358
+ return new RetryPolicy({ ...this.config, ...config });
359
+ }
360
+ }
361
+ export async function executeWithRetry(fn, config) {
362
+ const policy = new RetryPolicy(config);
363
+ return policy.execute(fn);
364
+ }
365
+ export async function executeWithDatabaseRetry(fn) {
366
+ const policy = new RetryPolicy(DATABASE_RETRY_CONFIG);
367
+ return policy.execute(fn);
368
+ }
369
+ export async function executeWithApiRetry(fn) {
370
+ const policy = new RetryPolicy(API_RETRY_CONFIG);
371
+ return policy.execute(fn);
372
+ }
373
+ export class RetryPolicyRegistry {
374
+ policies = new Map();
375
+ register(name, config) {
376
+ const policy = new RetryPolicy({ ...config, name });
377
+ this.policies.set(name, policy);
378
+ return policy;
379
+ }
380
+ get(name) {
381
+ return this.policies.get(name);
382
+ }
383
+ getOrCreate(name, config) {
384
+ let policy = this.policies.get(name);
385
+ if (!policy) {
386
+ policy = new RetryPolicy({ ...(config || {}), name });
387
+ this.policies.set(name, policy);
388
+ }
389
+ return policy;
390
+ }
391
+ getAllPolicies() {
392
+ return new Map(this.policies);
393
+ }
394
+ getAllStats() {
395
+ const stats = {};
396
+ for (const [name, policy] of this.policies) {
397
+ stats[name] = policy.getStats();
398
+ }
399
+ return stats;
400
+ }
401
+ resetAllStats() {
402
+ for (const policy of this.policies.values()) {
403
+ policy.resetStats();
404
+ }
405
+ }
406
+ remove(name) {
407
+ return this.policies.delete(name);
408
+ }
409
+ clear() {
410
+ this.policies.clear();
411
+ }
412
+ }
413
+ export const defaultRetryPolicyRegistry = new RetryPolicyRegistry();
414
+ defaultRetryPolicyRegistry.register('database', DATABASE_RETRY_CONFIG);
415
+ defaultRetryPolicyRegistry.register('api', API_RETRY_CONFIG);
416
+ defaultRetryPolicyRegistry.register('default', {
417
+ maxAttempts: 3,
418
+ baseDelay: 100,
419
+ maxDelay: 5000,
420
+ backoffMultiplier: 2,
421
+ enableJitter: true
422
+ });
423
+ //# sourceMappingURL=retry-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-policy.js","sourceRoot":"","sources":["../../src/resilience/retry-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ export interface TimeoutConfig {
2
+ duration: number;
3
+ name?: string;
4
+ parent?: TimeoutManager;
5
+ message?: string;
6
+ propagateToChildren?: boolean;
7
+ }
8
+ export interface TimeoutResult<T> {
9
+ success: boolean;
10
+ data?: T;
11
+ error?: Error;
12
+ duration: number;
13
+ timedOut: boolean;
14
+ cancelled: boolean;
15
+ }
16
+ export interface TimeoutStats {
17
+ totalExecutions: number;
18
+ successfulExecutions: number;
19
+ timeoutCount: number;
20
+ cancelledCount: number;
21
+ averageDuration: number;
22
+ maxDuration: number;
23
+ minDuration: number;
24
+ timeoutRate: number;
25
+ lastExecutionTime: Date | null;
26
+ }
27
+ export interface ActiveTimeout {
28
+ id: string;
29
+ name: string;
30
+ startTime: Date;
31
+ duration: number;
32
+ controller: AbortController;
33
+ parent?: TimeoutManager;
34
+ children: Set<TimeoutManager>;
35
+ }
36
+ export declare class OperationTimeoutError extends Error {
37
+ readonly duration: number;
38
+ readonly operationName: string;
39
+ readonly timestamp: Date;
40
+ constructor(duration: number, operationName: string, customMessage?: string);
41
+ }
42
+ export declare class OperationCancelledError extends Error {
43
+ readonly operationName: string;
44
+ readonly timestamp: Date;
45
+ readonly reason: string;
46
+ constructor(operationName: string, reason?: string);
47
+ }
48
+ export declare class TimeoutManager {
49
+ private readonly controller;
50
+ private timeoutId;
51
+ private readonly config;
52
+ private startTime;
53
+ private endTime;
54
+ private readonly children;
55
+ private timeoutFired;
56
+ private stats;
57
+ constructor(config: TimeoutConfig);
58
+ execute<T>(fn: (signal: AbortSignal) => Promise<T>): Promise<T>;
59
+ executeWithResult<T>(fn: (signal: AbortSignal) => Promise<T>): Promise<TimeoutResult<T>>;
60
+ static executeWithTimeout<T>(fn: (signal: AbortSignal) => Promise<T>, duration: number, name?: string): Promise<T>;
61
+ static executeWithTimeoutResult<T>(fn: (signal: AbortSignal) => Promise<T>, duration: number, name?: string): Promise<TimeoutResult<T>>;
62
+ createChild(config: Omit<TimeoutConfig, 'parent'>): TimeoutManager;
63
+ addChild(child: TimeoutManager): void;
64
+ removeChild(child: TimeoutManager): void;
65
+ cancel(reason?: string): void;
66
+ private timeout;
67
+ private cleanup;
68
+ private updateStats;
69
+ isAborted(): boolean;
70
+ getSignal(): AbortSignal;
71
+ getConfig(): TimeoutConfig;
72
+ getStats(): TimeoutStats;
73
+ resetStats(): void;
74
+ getActiveTimeout(): ActiveTimeout | null;
75
+ getRemainingTime(): number;
76
+ getElapsedTime(): number;
77
+ }
78
+ export declare class TimeoutRegistry {
79
+ private readonly timeouts;
80
+ private readonly activeTimeouts;
81
+ create(name: string, config: Omit<TimeoutConfig, 'name'>): TimeoutManager;
82
+ get(name: string): TimeoutManager | undefined;
83
+ getOrCreate(name: string, config: Omit<TimeoutConfig, 'name'>): TimeoutManager;
84
+ remove(name: string): boolean;
85
+ getAllTimeouts(): Map<string, TimeoutManager>;
86
+ getActiveTimeouts(): Map<string, ActiveTimeout>;
87
+ getAllStats(): Record<string, TimeoutStats>;
88
+ cancelAll(reason?: string): void;
89
+ resetAllStats(): void;
90
+ clear(): void;
91
+ }
92
+ export declare function withTimeout<T>(fn: (signal: AbortSignal) => Promise<T>, timeoutMs: number, name?: string): Promise<T>;
93
+ export declare function withTimeoutResult<T>(fn: (signal: AbortSignal) => Promise<T>, timeoutMs: number, name?: string): Promise<TimeoutResult<T>>;
94
+ export declare function createDatabaseTimeout(operationName: string): TimeoutManager;
95
+ export declare function createApiTimeout(operationName: string): TimeoutManager;
96
+ export declare const defaultTimeoutRegistry: TimeoutRegistry;
97
+ //# sourceMappingURL=timeout-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-manager.d.ts","sourceRoot":"","sources":["../../src/resilience/timeout-manager.ts"],"names":[],"mappings":"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"}