@nahisaho/musubix-core 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/bin/musubix.js +18 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +27 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/auth/auth-manager.d.ts +320 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +580 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/cli/base.d.ts +58 -0
- package/dist/cli/base.d.ts.map +1 -0
- package/dist/cli/base.js +93 -0
- package/dist/cli/base.js.map +1 -0
- package/dist/cli/commands/help.d.ts +17 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +228 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +25 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +38 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +258 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/codegen/coding-standards.d.ts +250 -0
- package/dist/codegen/coding-standards.d.ts.map +1 -0
- package/dist/codegen/coding-standards.js +976 -0
- package/dist/codegen/coding-standards.js.map +1 -0
- package/dist/codegen/coverage-reporter.d.ts +264 -0
- package/dist/codegen/coverage-reporter.d.ts.map +1 -0
- package/dist/codegen/coverage-reporter.js +697 -0
- package/dist/codegen/coverage-reporter.js.map +1 -0
- package/dist/codegen/dependency-analyzer.d.ts +271 -0
- package/dist/codegen/dependency-analyzer.d.ts.map +1 -0
- package/dist/codegen/dependency-analyzer.js +661 -0
- package/dist/codegen/dependency-analyzer.js.map +1 -0
- package/dist/codegen/generator.d.ts +275 -0
- package/dist/codegen/generator.d.ts.map +1 -0
- package/dist/codegen/generator.js +781 -0
- package/dist/codegen/generator.js.map +1 -0
- package/dist/codegen/index.d.ts +18 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +27 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/integration-test-generator.d.ts +312 -0
- package/dist/codegen/integration-test-generator.d.ts.map +1 -0
- package/dist/codegen/integration-test-generator.js +765 -0
- package/dist/codegen/integration-test-generator.js.map +1 -0
- package/dist/codegen/pattern-conformance.d.ts +309 -0
- package/dist/codegen/pattern-conformance.d.ts.map +1 -0
- package/dist/codegen/pattern-conformance.js +590 -0
- package/dist/codegen/pattern-conformance.js.map +1 -0
- package/dist/codegen/quality-metrics.d.ts +235 -0
- package/dist/codegen/quality-metrics.d.ts.map +1 -0
- package/dist/codegen/quality-metrics.js +439 -0
- package/dist/codegen/quality-metrics.js.map +1 -0
- package/dist/codegen/security-scanner.d.ts +179 -0
- package/dist/codegen/security-scanner.d.ts.map +1 -0
- package/dist/codegen/security-scanner.js +495 -0
- package/dist/codegen/security-scanner.js.map +1 -0
- package/dist/codegen/static-analyzer.d.ts +188 -0
- package/dist/codegen/static-analyzer.d.ts.map +1 -0
- package/dist/codegen/static-analyzer.js +490 -0
- package/dist/codegen/static-analyzer.js.map +1 -0
- package/dist/codegen/unit-test-generator.d.ts +289 -0
- package/dist/codegen/unit-test-generator.d.ts.map +1 -0
- package/dist/codegen/unit-test-generator.js +634 -0
- package/dist/codegen/unit-test-generator.js.map +1 -0
- package/dist/design/adr-generator.d.ts +227 -0
- package/dist/design/adr-generator.d.ts.map +1 -0
- package/dist/design/adr-generator.js +423 -0
- package/dist/design/adr-generator.js.map +1 -0
- package/dist/design/c4-generator.d.ts +267 -0
- package/dist/design/c4-generator.d.ts.map +1 -0
- package/dist/design/c4-generator.js +453 -0
- package/dist/design/c4-generator.js.map +1 -0
- package/dist/design/framework-optimizer.d.ts +190 -0
- package/dist/design/framework-optimizer.d.ts.map +1 -0
- package/dist/design/framework-optimizer.js +589 -0
- package/dist/design/framework-optimizer.js.map +1 -0
- package/dist/design/index.d.ts +12 -0
- package/dist/design/index.d.ts.map +1 -0
- package/dist/design/index.js +13 -0
- package/dist/design/index.js.map +1 -0
- package/dist/design/pattern-detector.d.ts +270 -0
- package/dist/design/pattern-detector.d.ts.map +1 -0
- package/dist/design/pattern-detector.js +621 -0
- package/dist/design/pattern-detector.js.map +1 -0
- package/dist/design/solid-validator.d.ts +188 -0
- package/dist/design/solid-validator.d.ts.map +1 -0
- package/dist/design/solid-validator.js +579 -0
- package/dist/design/solid-validator.js.map +1 -0
- package/dist/error/data-persistence.d.ts +311 -0
- package/dist/error/data-persistence.d.ts.map +1 -0
- package/dist/error/data-persistence.js +586 -0
- package/dist/error/data-persistence.js.map +1 -0
- package/dist/error/graceful-degradation.d.ts +309 -0
- package/dist/error/graceful-degradation.d.ts.map +1 -0
- package/dist/error/graceful-degradation.js +510 -0
- package/dist/error/graceful-degradation.js.map +1 -0
- package/dist/error/index.d.ts +11 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +19 -0
- package/dist/error/index.js.map +1 -0
- package/dist/explanation/explanation-generator.d.ts +228 -0
- package/dist/explanation/explanation-generator.d.ts.map +1 -0
- package/dist/explanation/explanation-generator.js +662 -0
- package/dist/explanation/explanation-generator.js.map +1 -0
- package/dist/explanation/index.d.ts +11 -0
- package/dist/explanation/index.d.ts.map +1 -0
- package/dist/explanation/index.js +19 -0
- package/dist/explanation/index.js.map +1 -0
- package/dist/explanation/reasoning-chain.d.ts +314 -0
- package/dist/explanation/reasoning-chain.d.ts.map +1 -0
- package/dist/explanation/reasoning-chain.js +414 -0
- package/dist/explanation/reasoning-chain.js.map +1 -0
- package/dist/explanation/visual-explanation.d.ts +315 -0
- package/dist/explanation/visual-explanation.d.ts.map +1 -0
- package/dist/explanation/visual-explanation.js +667 -0
- package/dist/explanation/visual-explanation.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/requirements/decomposer.d.ts +235 -0
- package/dist/requirements/decomposer.d.ts.map +1 -0
- package/dist/requirements/decomposer.js +587 -0
- package/dist/requirements/decomposer.js.map +1 -0
- package/dist/requirements/related-finder.d.ts +261 -0
- package/dist/requirements/related-finder.d.ts.map +1 -0
- package/dist/requirements/related-finder.js +629 -0
- package/dist/requirements/related-finder.js.map +1 -0
- package/dist/traceability/impact.d.ts +196 -0
- package/dist/traceability/impact.d.ts.map +1 -0
- package/dist/traceability/impact.js +438 -0
- package/dist/traceability/impact.js.map +1 -0
- package/dist/traceability/index.d.ts +9 -0
- package/dist/traceability/index.d.ts.map +1 -0
- package/dist/traceability/index.js +10 -0
- package/dist/traceability/index.js.map +1 -0
- package/dist/traceability/manager.d.ts +266 -0
- package/dist/traceability/manager.d.ts.map +1 -0
- package/dist/traceability/manager.js +412 -0
- package/dist/traceability/manager.js.map +1 -0
- package/dist/types/common.d.ts +294 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +15 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/ears.d.ts +158 -0
- package/dist/types/ears.d.ts.map +1 -0
- package/dist/types/ears.js +33 -0
- package/dist/types/ears.js.map +1 -0
- package/dist/types/errors.d.ts +176 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +55 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/data-protector.d.ts +122 -0
- package/dist/utils/data-protector.d.ts.map +1 -0
- package/dist/utils/data-protector.js +275 -0
- package/dist/utils/data-protector.js.map +1 -0
- package/dist/utils/error-handler.d.ts +101 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +324 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/i18n-manager.d.ts +259 -0
- package/dist/utils/i18n-manager.d.ts.map +1 -0
- package/dist/utils/i18n-manager.js +554 -0
- package/dist/utils/i18n-manager.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +120 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +237 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/performance-profiler.d.ts +251 -0
- package/dist/utils/performance-profiler.d.ts.map +1 -0
- package/dist/utils/performance-profiler.js +458 -0
- package/dist/utils/performance-profiler.js.map +1 -0
- package/dist/utils/scalability-optimizer.d.ts +294 -0
- package/dist/utils/scalability-optimizer.d.ts.map +1 -0
- package/dist/utils/scalability-optimizer.js +606 -0
- package/dist/utils/scalability-optimizer.js.map +1 -0
- package/dist/utils/structured-logger.d.ts +294 -0
- package/dist/utils/structured-logger.d.ts.map +1 -0
- package/dist/utils/structured-logger.js +630 -0
- package/dist/utils/structured-logger.js.map +1 -0
- package/dist/utils/version-compatibility.d.ts +217 -0
- package/dist/utils/version-compatibility.d.ts.map +1 -0
- package/dist/utils/version-compatibility.js +443 -0
- package/dist/utils/version-compatibility.js.map +1 -0
- package/dist/validators/ears-validator.d.ts +182 -0
- package/dist/validators/ears-validator.d.ts.map +1 -0
- package/dist/validators/ears-validator.js +357 -0
- package/dist/validators/ears-validator.js.map +1 -0
- package/dist/validators/index.d.ts +8 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +9 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graceful Degradation
|
|
3
|
+
*
|
|
4
|
+
* Handles errors gracefully with fallback strategies
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module error/graceful-degradation
|
|
8
|
+
*
|
|
9
|
+
* @see REQ-ERR-001 - Graceful Degradation
|
|
10
|
+
* @see Article V - Safety Assurance
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* In-memory cache provider
|
|
14
|
+
*/
|
|
15
|
+
export class MemoryCacheProvider {
|
|
16
|
+
cache = new Map();
|
|
17
|
+
async get(key) {
|
|
18
|
+
const entry = this.cache.get(key);
|
|
19
|
+
if (!entry)
|
|
20
|
+
return null;
|
|
21
|
+
if (entry.expires && entry.expires < Date.now()) {
|
|
22
|
+
this.cache.delete(key);
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return entry.value;
|
|
26
|
+
}
|
|
27
|
+
async set(key, value, ttl) {
|
|
28
|
+
this.cache.set(key, {
|
|
29
|
+
value,
|
|
30
|
+
expires: ttl ? Date.now() + ttl : 0,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async delete(key) {
|
|
34
|
+
this.cache.delete(key);
|
|
35
|
+
}
|
|
36
|
+
async clear() {
|
|
37
|
+
this.cache.clear();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* In-memory queue provider
|
|
42
|
+
*/
|
|
43
|
+
export class MemoryQueueProvider {
|
|
44
|
+
queue = [];
|
|
45
|
+
counter = 0;
|
|
46
|
+
async enqueue(item) {
|
|
47
|
+
const id = `q-${Date.now()}-${++this.counter}`;
|
|
48
|
+
this.queue.push({ id, item });
|
|
49
|
+
return id;
|
|
50
|
+
}
|
|
51
|
+
async dequeue() {
|
|
52
|
+
const entry = this.queue.shift();
|
|
53
|
+
return entry ? entry.item : null;
|
|
54
|
+
}
|
|
55
|
+
async size() {
|
|
56
|
+
return this.queue.length;
|
|
57
|
+
}
|
|
58
|
+
async clear() {
|
|
59
|
+
this.queue = [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Default configuration
|
|
64
|
+
*/
|
|
65
|
+
export const DEFAULT_DEGRADATION_CONFIG = {
|
|
66
|
+
services: [],
|
|
67
|
+
healthCheckInterval: 30000,
|
|
68
|
+
autoRecovery: true,
|
|
69
|
+
maxQueueSize: 1000,
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Graceful Degradation Manager
|
|
73
|
+
*/
|
|
74
|
+
export class GracefulDegradation {
|
|
75
|
+
config;
|
|
76
|
+
serviceStatus;
|
|
77
|
+
currentLevel = 'full';
|
|
78
|
+
events = [];
|
|
79
|
+
eventCounter = 0;
|
|
80
|
+
healthCheckTimer;
|
|
81
|
+
cache;
|
|
82
|
+
queue;
|
|
83
|
+
constructor(config) {
|
|
84
|
+
this.config = { ...DEFAULT_DEGRADATION_CONFIG, ...config };
|
|
85
|
+
this.serviceStatus = new Map();
|
|
86
|
+
this.cache = config?.cacheProvider ?? new MemoryCacheProvider();
|
|
87
|
+
this.queue = config?.queueProvider ?? new MemoryQueueProvider();
|
|
88
|
+
// Initialize service status
|
|
89
|
+
for (const service of this.config.services) {
|
|
90
|
+
this.serviceStatus.set(service.name, {
|
|
91
|
+
service: service.name,
|
|
92
|
+
status: 'unknown',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Start health monitoring
|
|
98
|
+
*/
|
|
99
|
+
start() {
|
|
100
|
+
this.runHealthChecks();
|
|
101
|
+
this.healthCheckTimer = setInterval(() => this.runHealthChecks(), this.config.healthCheckInterval);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Stop health monitoring
|
|
105
|
+
*/
|
|
106
|
+
stop() {
|
|
107
|
+
if (this.healthCheckTimer) {
|
|
108
|
+
clearInterval(this.healthCheckTimer);
|
|
109
|
+
this.healthCheckTimer = undefined;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Register a service
|
|
114
|
+
*/
|
|
115
|
+
registerService(service) {
|
|
116
|
+
this.config.services.push(service);
|
|
117
|
+
this.serviceStatus.set(service.name, {
|
|
118
|
+
service: service.name,
|
|
119
|
+
status: 'unknown',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Execute operation with graceful degradation
|
|
124
|
+
*/
|
|
125
|
+
async execute(serviceName, operation, options) {
|
|
126
|
+
const service = this.config.services.find((s) => s.name === serviceName);
|
|
127
|
+
const status = this.serviceStatus.get(serviceName);
|
|
128
|
+
// Try normal operation if service is healthy
|
|
129
|
+
if (!status || status.status === 'healthy' || status.status === 'unknown') {
|
|
130
|
+
try {
|
|
131
|
+
const value = await this.withTimeout(operation, options?.timeout ?? 30000);
|
|
132
|
+
// Cache successful result
|
|
133
|
+
if (options?.cacheKey) {
|
|
134
|
+
await this.cache.set(options.cacheKey, value, service?.cacheTtl);
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
value,
|
|
138
|
+
degraded: false,
|
|
139
|
+
level: this.currentLevel,
|
|
140
|
+
warnings: [],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
// Service failed, try fallback
|
|
145
|
+
return this.executeFallback(serviceName, error, options);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Service is not healthy, go straight to fallback
|
|
149
|
+
return this.executeFallback(serviceName, new Error(`Service ${serviceName} is ${status.status}`), options);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Execute fallback strategy
|
|
153
|
+
*/
|
|
154
|
+
async executeFallback(serviceName, error, options) {
|
|
155
|
+
const service = this.config.services.find((s) => s.name === serviceName);
|
|
156
|
+
const strategies = service?.fallbackStrategies ?? ['default'];
|
|
157
|
+
const warnings = [`Primary operation failed: ${error.message}`];
|
|
158
|
+
for (const strategy of strategies) {
|
|
159
|
+
try {
|
|
160
|
+
const result = await this.executeStrategy(serviceName, strategy, options);
|
|
161
|
+
if (result !== null) {
|
|
162
|
+
return {
|
|
163
|
+
value: result,
|
|
164
|
+
degraded: true,
|
|
165
|
+
level: this.currentLevel,
|
|
166
|
+
strategy,
|
|
167
|
+
originalError: error,
|
|
168
|
+
warnings,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
warnings.push(`Fallback ${strategy} failed: ${e.message}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// All fallbacks failed
|
|
177
|
+
throw new Error(`All fallback strategies failed for ${serviceName}. ` +
|
|
178
|
+
`Warnings: ${warnings.join('; ')}`);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Execute a specific strategy
|
|
182
|
+
*/
|
|
183
|
+
async executeStrategy(serviceName, strategy, options) {
|
|
184
|
+
const service = this.config.services.find((s) => s.name === serviceName);
|
|
185
|
+
switch (strategy) {
|
|
186
|
+
case 'cache':
|
|
187
|
+
if (options?.cacheKey) {
|
|
188
|
+
const cached = await this.cache.get(options.cacheKey);
|
|
189
|
+
if (cached !== null)
|
|
190
|
+
return cached;
|
|
191
|
+
}
|
|
192
|
+
return null;
|
|
193
|
+
case 'default':
|
|
194
|
+
if (options?.defaultValue !== undefined) {
|
|
195
|
+
return options.defaultValue;
|
|
196
|
+
}
|
|
197
|
+
return null;
|
|
198
|
+
case 'retry':
|
|
199
|
+
// Retry logic would go here, but we've already failed
|
|
200
|
+
// This is more of a pre-failure strategy
|
|
201
|
+
return null;
|
|
202
|
+
case 'alternative':
|
|
203
|
+
if (service?.alternative) {
|
|
204
|
+
const altService = this.config.services.find((s) => s.name === service.alternative);
|
|
205
|
+
if (altService) {
|
|
206
|
+
// Would execute alternative service here
|
|
207
|
+
// For now, return null
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
case 'skip':
|
|
212
|
+
// Skip returns null to indicate operation skipped
|
|
213
|
+
return null;
|
|
214
|
+
case 'queue':
|
|
215
|
+
// Queue for later processing
|
|
216
|
+
if (await this.queue.size() < this.config.maxQueueSize) {
|
|
217
|
+
await this.queue.enqueue({
|
|
218
|
+
service: serviceName,
|
|
219
|
+
timestamp: new Date(),
|
|
220
|
+
options,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
return null;
|
|
224
|
+
case 'manual':
|
|
225
|
+
// Require manual intervention
|
|
226
|
+
return null;
|
|
227
|
+
default:
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Run health checks on all services
|
|
233
|
+
*/
|
|
234
|
+
async runHealthChecks() {
|
|
235
|
+
const results = new Map();
|
|
236
|
+
for (const service of this.config.services) {
|
|
237
|
+
const result = await this.checkServiceHealth(service);
|
|
238
|
+
results.set(service.name, result);
|
|
239
|
+
const previousStatus = this.serviceStatus.get(service.name);
|
|
240
|
+
this.serviceStatus.set(service.name, result);
|
|
241
|
+
// Handle status changes
|
|
242
|
+
if (previousStatus?.status !== result.status) {
|
|
243
|
+
if (result.status === 'unavailable' || result.status === 'degraded') {
|
|
244
|
+
this.handleServiceDegradation(service, result, previousStatus?.status);
|
|
245
|
+
}
|
|
246
|
+
else if (result.status === 'healthy' && previousStatus?.status !== 'healthy') {
|
|
247
|
+
this.handleServiceRecovery(service);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Recalculate overall degradation level
|
|
252
|
+
this.recalculateLevel();
|
|
253
|
+
return results;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Check health of a single service
|
|
257
|
+
*/
|
|
258
|
+
async checkServiceHealth(service) {
|
|
259
|
+
const startTime = Date.now();
|
|
260
|
+
try {
|
|
261
|
+
const healthy = await this.withTimeout(service.healthCheck, 5000);
|
|
262
|
+
const responseTime = Date.now() - startTime;
|
|
263
|
+
return {
|
|
264
|
+
service: service.name,
|
|
265
|
+
status: healthy ? 'healthy' : 'degraded',
|
|
266
|
+
responseTime,
|
|
267
|
+
lastSuccess: healthy ? new Date() : undefined,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
return {
|
|
272
|
+
service: service.name,
|
|
273
|
+
status: 'unavailable',
|
|
274
|
+
responseTime: Date.now() - startTime,
|
|
275
|
+
error: error.message,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Handle service degradation
|
|
281
|
+
*/
|
|
282
|
+
handleServiceDegradation(service, result, _previousStatus) {
|
|
283
|
+
const previousLevel = this.currentLevel;
|
|
284
|
+
const event = {
|
|
285
|
+
id: `deg-${Date.now()}-${++this.eventCounter}`,
|
|
286
|
+
timestamp: new Date(),
|
|
287
|
+
service: service.name,
|
|
288
|
+
previousLevel,
|
|
289
|
+
newLevel: this.currentLevel,
|
|
290
|
+
reason: result.error ?? `Service ${service.name} is ${result.status}`,
|
|
291
|
+
};
|
|
292
|
+
this.events.push(event);
|
|
293
|
+
this.config.onDegradation?.(event);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Handle service recovery
|
|
297
|
+
*/
|
|
298
|
+
handleServiceRecovery(service) {
|
|
299
|
+
this.config.onRecovery?.(service.name, this.currentLevel);
|
|
300
|
+
// Process queued items for this service
|
|
301
|
+
if (this.config.autoRecovery) {
|
|
302
|
+
this.processQueue(service.name).catch(() => { });
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Process queued items
|
|
307
|
+
*/
|
|
308
|
+
async processQueue(serviceName) {
|
|
309
|
+
let processed = 0;
|
|
310
|
+
const maxProcess = 10;
|
|
311
|
+
while (processed < maxProcess) {
|
|
312
|
+
const item = await this.queue.dequeue();
|
|
313
|
+
if (!item)
|
|
314
|
+
break;
|
|
315
|
+
if (item.service === serviceName) {
|
|
316
|
+
// Would re-execute the queued operation here
|
|
317
|
+
processed++;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
// Re-queue if not for this service
|
|
321
|
+
await this.queue.enqueue(item);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Recalculate overall degradation level
|
|
327
|
+
*/
|
|
328
|
+
recalculateLevel() {
|
|
329
|
+
const statuses = [...this.serviceStatus.values()];
|
|
330
|
+
// Count unavailable required services
|
|
331
|
+
const unavailableRequired = this.config.services.filter((s) => s.required && this.serviceStatus.get(s.name)?.status === 'unavailable');
|
|
332
|
+
// Count total unavailable
|
|
333
|
+
const totalUnavailable = statuses.filter((s) => s.status === 'unavailable').length;
|
|
334
|
+
// Count degraded
|
|
335
|
+
const totalDegraded = statuses.filter((s) => s.status === 'degraded').length;
|
|
336
|
+
// Determine level
|
|
337
|
+
if (unavailableRequired.length > 0) {
|
|
338
|
+
this.currentLevel = 'emergency';
|
|
339
|
+
}
|
|
340
|
+
else if (totalUnavailable > statuses.length / 2) {
|
|
341
|
+
this.currentLevel = 'offline';
|
|
342
|
+
}
|
|
343
|
+
else if (totalUnavailable > 0) {
|
|
344
|
+
this.currentLevel = 'minimal';
|
|
345
|
+
}
|
|
346
|
+
else if (totalDegraded > 0) {
|
|
347
|
+
this.currentLevel = 'reduced';
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
this.currentLevel = 'full';
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Get current degradation level
|
|
355
|
+
*/
|
|
356
|
+
getLevel() {
|
|
357
|
+
return this.currentLevel;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get service status
|
|
361
|
+
*/
|
|
362
|
+
getServiceStatus(serviceName) {
|
|
363
|
+
return this.serviceStatus.get(serviceName);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get all service statuses
|
|
367
|
+
*/
|
|
368
|
+
getAllStatuses() {
|
|
369
|
+
return new Map(this.serviceStatus);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Get degradation events
|
|
373
|
+
*/
|
|
374
|
+
getEvents(limit) {
|
|
375
|
+
const events = [...this.events].sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
|
|
376
|
+
return limit ? events.slice(0, limit) : events;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Check if a feature is available at current level
|
|
380
|
+
*/
|
|
381
|
+
isFeatureAvailable(requiredLevel) {
|
|
382
|
+
const levels = ['full', 'reduced', 'minimal', 'offline', 'emergency'];
|
|
383
|
+
return levels.indexOf(this.currentLevel) <= levels.indexOf(requiredLevel);
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Cache a value
|
|
387
|
+
*/
|
|
388
|
+
async cacheValue(key, value, ttl) {
|
|
389
|
+
await this.cache.set(key, value, ttl);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Get cached value
|
|
393
|
+
*/
|
|
394
|
+
async getCachedValue(key) {
|
|
395
|
+
return this.cache.get(key);
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Clear cache
|
|
399
|
+
*/
|
|
400
|
+
async clearCache() {
|
|
401
|
+
await this.cache.clear();
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Execute with timeout
|
|
405
|
+
*/
|
|
406
|
+
async withTimeout(operation, timeout) {
|
|
407
|
+
return new Promise((resolve, reject) => {
|
|
408
|
+
const timer = setTimeout(() => {
|
|
409
|
+
reject(new Error(`Operation timed out after ${timeout}ms`));
|
|
410
|
+
}, timeout);
|
|
411
|
+
operation()
|
|
412
|
+
.then((result) => {
|
|
413
|
+
clearTimeout(timer);
|
|
414
|
+
resolve(result);
|
|
415
|
+
})
|
|
416
|
+
.catch((error) => {
|
|
417
|
+
clearTimeout(timer);
|
|
418
|
+
reject(error);
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Create graceful degradation instance
|
|
425
|
+
*/
|
|
426
|
+
export function createGracefulDegradation(config) {
|
|
427
|
+
return new GracefulDegradation(config);
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Retry with exponential backoff
|
|
431
|
+
*/
|
|
432
|
+
export async function retryWithBackoff(operation, options) {
|
|
433
|
+
const maxAttempts = options?.maxAttempts ?? 3;
|
|
434
|
+
const initialDelay = options?.initialDelay ?? 1000;
|
|
435
|
+
const maxDelay = options?.maxDelay ?? 30000;
|
|
436
|
+
const backoffFactor = options?.backoffFactor ?? 2;
|
|
437
|
+
let lastError;
|
|
438
|
+
let delay = initialDelay;
|
|
439
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
440
|
+
try {
|
|
441
|
+
return await operation();
|
|
442
|
+
}
|
|
443
|
+
catch (error) {
|
|
444
|
+
lastError = error;
|
|
445
|
+
if (attempt < maxAttempts) {
|
|
446
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
447
|
+
delay = Math.min(delay * backoffFactor, maxDelay);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
throw lastError ?? new Error('Operation failed after retries');
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Circuit breaker
|
|
455
|
+
*/
|
|
456
|
+
export class CircuitBreaker {
|
|
457
|
+
threshold;
|
|
458
|
+
resetTimeout;
|
|
459
|
+
failures = 0;
|
|
460
|
+
lastFailure;
|
|
461
|
+
state = 'closed';
|
|
462
|
+
constructor(threshold = 5, resetTimeout = 60000) {
|
|
463
|
+
this.threshold = threshold;
|
|
464
|
+
this.resetTimeout = resetTimeout;
|
|
465
|
+
}
|
|
466
|
+
async execute(operation) {
|
|
467
|
+
if (this.state === 'open') {
|
|
468
|
+
if (this.shouldAttemptReset()) {
|
|
469
|
+
this.state = 'half-open';
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
throw new Error('Circuit breaker is open');
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
try {
|
|
476
|
+
const result = await operation();
|
|
477
|
+
this.onSuccess();
|
|
478
|
+
return result;
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
this.onFailure();
|
|
482
|
+
throw error;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
shouldAttemptReset() {
|
|
486
|
+
if (!this.lastFailure)
|
|
487
|
+
return true;
|
|
488
|
+
return Date.now() - this.lastFailure.getTime() > this.resetTimeout;
|
|
489
|
+
}
|
|
490
|
+
onSuccess() {
|
|
491
|
+
this.failures = 0;
|
|
492
|
+
this.state = 'closed';
|
|
493
|
+
}
|
|
494
|
+
onFailure() {
|
|
495
|
+
this.failures++;
|
|
496
|
+
this.lastFailure = new Date();
|
|
497
|
+
if (this.failures >= this.threshold) {
|
|
498
|
+
this.state = 'open';
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
getState() {
|
|
502
|
+
return this.state;
|
|
503
|
+
}
|
|
504
|
+
reset() {
|
|
505
|
+
this.failures = 0;
|
|
506
|
+
this.lastFailure = undefined;
|
|
507
|
+
this.state = 'closed';
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=graceful-degradation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graceful-degradation.js","sourceRoot":"","sources":["../../src/error/graceful-degradation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Recovery Module
|
|
3
|
+
*
|
|
4
|
+
* Provides graceful degradation and data persistence
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module error
|
|
8
|
+
*/
|
|
9
|
+
export { GracefulDegradation, createGracefulDegradation, retryWithBackoff, CircuitBreaker, MemoryCacheProvider, MemoryQueueProvider, type DegradationLevel, type ServiceStatus, type FallbackStrategy, type HealthCheckResult, type ServiceConfig, type FallbackAction, type DegradationEvent, type DegradedResult, type GracefulDegradationConfig, type CacheProvider, type QueueProvider, DEFAULT_DEGRADATION_CONFIG, } from './graceful-degradation.js';
|
|
10
|
+
export { DataPersistence, createDataPersistence, WriteAheadLog, MemoryStorageAdapter, FileStorageAdapter, type StorageBackend, type DataState, type Checkpoint, type Transaction, type TransactionOperation, type RecoveryResult, type PersistenceStatistics, type DataPersistenceConfig, type StorageAdapter, DEFAULT_PERSISTENCE_CONFIG, } from './data-persistence.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/error/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EAGnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAClB,KAAK,aAAa,EAGlB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAEL,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAGlB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EAGnB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Recovery Module
|
|
3
|
+
*
|
|
4
|
+
* Provides graceful degradation and data persistence
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module error
|
|
8
|
+
*/
|
|
9
|
+
export {
|
|
10
|
+
// Graceful Degradation
|
|
11
|
+
GracefulDegradation, createGracefulDegradation, retryWithBackoff, CircuitBreaker, MemoryCacheProvider, MemoryQueueProvider,
|
|
12
|
+
// Constants
|
|
13
|
+
DEFAULT_DEGRADATION_CONFIG, } from './graceful-degradation.js';
|
|
14
|
+
export {
|
|
15
|
+
// Data Persistence
|
|
16
|
+
DataPersistence, createDataPersistence, WriteAheadLog, MemoryStorageAdapter, FileStorageAdapter,
|
|
17
|
+
// Constants
|
|
18
|
+
DEFAULT_PERSISTENCE_CONFIG, } from './data-persistence.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/error/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO;AACL,uBAAuB;AACvB,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,mBAAmB;AAenB,YAAY;AACZ,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AAEnC,OAAO;AACL,mBAAmB;AACnB,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,kBAAkB;AAalB,YAAY;AACZ,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
|