losi-network-manager
v1.0.3
Published
A robust wrapper around losi-tiny-http with advanced features
Maintainers
Readme
losi-network-manager
A robust HTTP client wrapper around losi-tiny-http with enterprise-grade features.
🎯 Features
- ✅ Smart Caching - In-memory and persistent storage (localStorage/sessionStorage)
- ✅ Request Queue & Offline Mode - Automatic queueing with concurrency control
- ✅ Automatic Token Refresh - Built-in auth middleware with token refresh
- ✅ Retry Strategy - Inherited from losi-tiny-http with exponential backoff
- ✅ Batch Requests - Execute multiple requests in parallel
- ✅ React Hooks -
useRequesthook for easy integration
📦 Installation
npm install losi-network-manager🚀 Quick Start
import { createNetworkManager } from 'losi-network-manager';
const api = createNetworkManager({
baseURL: 'https://api.example.com',
cache: { ttl: 60000, storage: 'memory' },
queue: { maxConcurrent: 5 },
retry: { attempts: 3, backoff: 'exponential', delay: 500 }
});
const response = await api.get('/users/1');
console.log(response.data);🔧 Configuration
Cache Configuration
const api = createNetworkManager({
cache: {
ttl: 60000, // Time to live in milliseconds
storage: 'memory' | 'local' | 'session'
}
});Queue Configuration
const api = createNetworkManager({
queue: {
maxConcurrent: 5 // Maximum concurrent requests
}
});Auth Configuration
const api = createNetworkManager({
auth: {
token: () => localStorage.getItem('token') || '',
refreshToken: async () => {
const response = await fetch('/auth/refresh');
const { token } = await response.json();
localStorage.setItem('token', token);
return token;
},
onRefreshSuccess: (newToken) => console.log('Token refreshed'),
onRefreshFailure: (error) => console.error('Refresh failed', error)
}
});📚 Usage Examples
Basic Requests
// GET
const user = await api.get('/users/1');
// POST
const newUser = await api.post('/users', { name: 'John' });
// PUT
const updated = await api.put('/users/1', { name: 'Jane' });
// PATCH
const patched = await api.patch('/users/1', { email: '[email protected]' });
// DELETE
await api.delete('/users/1');Caching
// First request - fetches from server
const data1 = await api.get('/posts/1');
// Second request - returns from cache (instant)
const data2 = await api.get('/posts/1');
// Skip cache
const fresh = await api.get('/posts/1', { skipCache: true });Batch Requests
const results = await api.batch([
() => api.get('/users/1'),
() => api.get('/users/2'),
() => api.get('/users/3')
]);
results.forEach((result, i) => {
if (result.status === 'fulfilled') {
console.log(`User ${i + 1}:`, result.value.data);
} else {
console.error(`User ${i + 1} failed:`, result.reason);
}
});React Hook
import { useRequest } from 'losi-network-manager';
function UserProfile({ userId }) {
const { data, error, loading, refetch } = useRequest(
api,
userId ? `user-${userId}` : null,
(client) => client.get(`/users/${userId}`)
);
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<div>
<h1>{data?.name}</h1>
<button onClick={refetch}>Refresh</button>
</div>
);
}🎨 Advanced Features
Priority Requests
// High priority request (processed first in queue)
await api.get('/critical-data', { priority: 'high' });
// Normal priority (default)
await api.get('/data', { priority: 'normal' });
// Low priority
await api.get('/analytics', { priority: 'low' });Offline Mode
The queue automatically detects offline/online status and queues requests when offline, then flushes them when back online.
🔥 Advanced Features
Retry with Jitter
Prevent thundering herd problem with jitter:
const api = createNetworkManager({
retry: {
attempts: 3,
backoff: 'exponential',
delay: 100,
jitter: true, // Add randomness to retry delays
maxDelay: 2000,
shouldRetry: (error, attempt) => {
// Custom retry logic
return error.response?.status >= 500;
}
}
});Request Deduplication
Prevent duplicate in-flight requests:
const api = createNetworkManager({
deduplication: true
});
// These two requests will only make ONE network call
const [result1, result2] = await Promise.all([
api.get('/users/1'),
api.get('/users/1') // Reuses the first request's promise
]);
// Check in-flight requests
console.log(api.getInFlightCount());Metrics Tracking
Track request performance and success rates:
const api = createNetworkManager({
metrics: true
});
// Make some requests...
await api.get('/users/1');
await api.post('/users', { name: 'John' });
// Get metrics
const metrics = api.getMetrics();
console.log('Total Requests:', metrics.totalRequests);
console.log('Success Rate:', metrics.successRate + '%');
console.log('Average Duration:', metrics.averageDuration + 'ms');
console.log('Requests by Method:', metrics.requestsByMethod);
console.log('Requests by Status:', metrics.requestsByStatus);
// Clear metrics
api.clearMetrics();📄 License
ISC
🤝 Contributing
Contributions welcome! This package wraps losi-tiny-http.
