This guide walks you through the most common use cases for the Resilience library, from simple function wrapping to adding retries and timeouts.
1
Wrapping Your First Function
Start by wrapping an async function with basic resilience features. The withResilience function converts any function into a resilient version.
import { withResilience } from '@oldwhisper/resilience';async function fetchUserData(userId: string) { const response = await fetch(`/api/users/${userId}`); return response.json();}// Wrap it with resilienceconst resilientFetch = withResilience(fetchUserData, { name: 'fetchUserData', timeoutMs: 5000 // 5 second timeout});// Use it like the original functionconst userData = await resilientFetch('user-123');
The withResilience function always returns an async function, even if your original function is synchronous.
2
Adding Retries
Network calls can fail temporarily. Add automatic retries to handle transient failures:
const resilientFetch = withResilience(fetchUserData, { name: 'fetchUserData', retries: 3, // Retry up to 3 times timeoutMs: 5000});
This will attempt the function up to 4 times total (1 initial attempt + 3 retries) before throwing an error.
3
Configuring Backoff Strategies
Add delays between retries to avoid overwhelming a failing service.
You can wrap synchronous functions too, but note they become async:
function calculateSum(a: number, b: number) { return a + b;}const resilientSum = withResilience(calculateSum, { name: 'sum', timeoutMs: 1000});// Must use await, even though the original is syncconst result = await resilientSum(5, 3);