@fortify-ts/retry
v0.2.1
Published
Retry pattern with backoff strategies for Fortify TS resilience library
Maintainers
Readme
@fortify-ts/retry
Retry pattern with configurable backoff strategies for the Fortify-TS resilience library.
Installation
npm install @fortify-ts/retry
# or
pnpm add @fortify-ts/retryFeatures
- Backoff Policies: Exponential, linear, and constant
- Configurable Delays: Initial delay, max delay, multiplier
- Jitter Support: Prevent thundering herd
- Custom Predicates:
isRetryablecallback - Retry Notifications:
onRetrycallback
Usage
Basic Usage
import { Retry } from '@fortify-ts/retry';
const retry = new Retry<Response>({
maxAttempts: 3,
initialDelay: 100,
});
const result = await retry.execute(async (signal) => {
return fetch('/api/data', { signal });
});Configuration Options
const retry = new Retry<Response>({
// Maximum attempts (including initial)
maxAttempts: 5,
// Initial delay between retries (ms)
initialDelay: 100,
// Maximum delay between retries (ms)
maxDelay: 10000,
// Backoff policy
backoffPolicy: 'exponential', // 'exponential' | 'linear' | 'constant'
// Delay multiplier for exponential/linear
multiplier: 2.0,
// Add random jitter to delays
jitter: true,
// Custom retry condition
isRetryable: (error) => {
if (error instanceof NetworkError) return true;
if (error instanceof ValidationError) return false;
return true;
},
// Retry notification
onRetry: (error, attempt) => {
console.log(`Retry ${attempt}: ${error.message}`);
},
// Optional logger
logger: myLogger,
});Backoff Policies
// Exponential: delay = initialDelay * (multiplier ^ attempt)
// 100ms → 200ms → 400ms → 800ms → 1600ms
const exponential = new Retry({ backoffPolicy: 'exponential' });
// Linear: delay = initialDelay * (multiplier * attempt)
// 100ms → 200ms → 300ms → 400ms → 500ms
const linear = new Retry({ backoffPolicy: 'linear' });
// Constant: delay = initialDelay
// 100ms → 100ms → 100ms → 100ms → 100ms
const constant = new Retry({ backoffPolicy: 'constant' });Marking Errors as Retryable
import { asRetryable, asNonRetryable } from '@fortify-ts/core';
// In your code, mark errors explicitly
if (isTemporary) {
throw asRetryable(new Error('Temporary failure'));
} else {
throw asNonRetryable(new Error('Permanent failure'));
}Configuration Reference
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| maxAttempts | number | 3 | Maximum attempts |
| initialDelay | number | 100 | Initial delay (ms) |
| maxDelay | number | - | Maximum delay (ms) |
| backoffPolicy | string | 'exponential' | Backoff policy |
| multiplier | number | 2.0 | Delay multiplier |
| jitter | boolean | false | Add jitter |
| isRetryable | function | - | Custom retry check |
| onRetry | function | - | Retry callback |
| logger | FortifyLogger | - | Optional logger |
License
MIT
