Quick Start
Wrap your Axios instance and start making resilient requests. The axiosInstance property is a drop-in replacement for direct Axios usage.
Functional API (recommended)
import { createRetryer } from 'axios-retryer';
const retryer = createRetryer({
retries: 3,
debug: false,
});
// Drop-in replacement for axios
const { data } = await retryer.axiosInstance.get('https://api.example.com/users');
console.log(data); Class-based API
import { RetryManager } from 'axios-retryer';
const manager = new RetryManager({ retries: 3 });
const { data } = await manager.axiosInstance.get('/api/users'); With your existing Axios instance
import axios from 'axios';
import { createRetryer } from 'axios-retryer';
const baseAxios = axios.create({
baseURL: 'https://api.example.com',
timeout: 5000,
headers: { 'X-App-Version': '2.0' },
});
const retryer = createRetryer({
retries: 3,
axiosInstance: baseAxios, // uses your existing instance
});
// axiosInstance is the same object — base URL, headers, interceptors all preserved
await retryer.axiosInstance.get('/users'); Add plugins
Start with core, then layer in plugins as your app needs them:
import { createRetryer } from 'axios-retryer';
import { createTokenRefreshPlugin } from 'axios-retryer/plugins/TokenRefreshPlugin';
import { createCircuitBreaker } from 'axios-retryer/plugins/CircuitBreakerPlugin';
import { createCachePlugin } from 'axios-retryer/plugins/CachingPlugin';
import { createMetricsPlugin } from 'axios-retryer/plugins/MetricsPlugin';
// Chain .use() so TypeScript includes every plugin's events on `retryer`
const retryer = createRetryer({ retries: 3, maxConcurrentRequests: 8 })
.use(
createTokenRefreshPlugin(async (axiosInstance) => {
const refreshToken = localStorage.getItem('refreshToken');
const { data } = await axiosInstance.post('/auth/refresh', { refreshToken });
localStorage.setItem('accessToken', data.accessToken);
return { token: data.accessToken };
}),
)
.use(
createCircuitBreaker({
failureThreshold: 5,
openTimeout: 30_000,
}),
)
.use(createCachePlugin({ timeToRevalidate: 60_000, maxItems: 200 }))
.use(createMetricsPlugin());
retryer.on('onMetricsUpdated', (m) => console.log('retries:', m.successfulRetries));
// Make requests
const { data } = await retryer.axiosInstance.get('/api/products'); Request priorities
import { createRetryer, AXIOS_RETRYER_REQUEST_PRIORITIES } from 'axios-retryer';
const retryer = createRetryer({ maxConcurrentRequests: 3 });
// CRITICAL requests skip the queue ahead of everything else
retryer.axiosInstance.post('/auth/login', creds, {
__axiosRetryer: { priority: AXIOS_RETRYER_REQUEST_PRIORITIES.CRITICAL },
});
// Background work is processed last
retryer.axiosInstance.post('/analytics/event', eventData, {
__axiosRetryer: { priority: AXIOS_RETRYER_REQUEST_PRIORITIES.LOW },
}); Cancellation
// Cancel a specific request by ID
const config = await retryer.axiosInstance.get('/api/data', {
__axiosRetryer: { requestId: 'my-request' },
}).catch(() => {});
retryer.cancelRequest('my-request');
// Cancel everything
retryer.cancelAllRequests(); Try it live
Interactive sandbox — run scenarios in the browser with mocked HTTP (no install).