Error recovery — handle and recover from failures gracefully.
1class RecoverySystem {2 constructor() {3 this.strategies = new Map();4 this.fallbacks = new Map();5 }67 registerStrategy(errorType, strategy) {8 this.strategies.set(errorType, strategy);9 }1011 registerFallback(service, fallback) {12 this.fallbacks.set(service, fallback);13 }1415 async execute(service, fn, ...args) {16 try {17 return await fn(...args);18 } catch (err) {19 // Try strategy20 const strategy = this.strategies.get(err.constructor.name);21 if (strategy) {22 return await strategy(err, ...args);23 }2425 // Try fallback26 const fallback = this.fallbacks.get(service);27 if (fallback) {28 return await fallback(...args);29 }3031 throw err;32 }33 }34}3536// Usage37const recovery = new RecoverySystem();3839// Retry on timeout40recovery.registerStrategy("TimeoutError", async (err, fn, ...args) => {41 for (let i = 0; i < 3; i++) {42 try {43 return await fn(...args);44 } catch (e) {45 if (i === 2) throw e;46 await new Promise(r => setTimeout(r, 1000 * (i + 1)));47 }48 }49});5051// Fallback to cache52recovery.registerFallback("api", async () => {53 return await redis.get("cached:data");54});5556const data = await recovery.execute("api", fetchData);