feat: Implement comprehensive web request handling with caching, retry, and interceptors
- Added cache strategies: NetworkFirst, CacheFirst, StaleWhileRevalidate, NetworkOnly, and CacheOnly. - Introduced InterceptorManager for managing request, response, and error interceptors. - Developed RetryManager for handling request retries with customizable backoff strategies. - Implemented RequestDeduplicator to prevent simultaneous identical requests. - Created timeout utilities for handling request timeouts. - Enhanced WebrequestClient to support global interceptors, caching, and retry logic. - Added convenience methods for common HTTP methods (GET, POST, PUT, DELETE) with JSON handling. - Established a fetch-compatible webrequest function for seamless integration. - Defined core type structures for caching, retry options, interceptors, and web request configurations.
This commit is contained in:
67
ts/retry/retry.strategies.ts
Normal file
67
ts/retry/retry.strategies.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
* Retry backoff strategies
|
||||
*/
|
||||
|
||||
import type { TBackoffStrategy } from '../webrequest.types.js';
|
||||
|
||||
export interface IBackoffCalculator {
|
||||
calculate(attempt: number, initialDelay: number, maxDelay: number): number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Exponential backoff strategy
|
||||
* Delay increases exponentially: initialDelay * 2^attempt
|
||||
*/
|
||||
export class ExponentialBackoff implements IBackoffCalculator {
|
||||
calculate(attempt: number, initialDelay: number, maxDelay: number): number {
|
||||
const delay = initialDelay * Math.pow(2, attempt - 1);
|
||||
return Math.min(delay, maxDelay);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Linear backoff strategy
|
||||
* Delay increases linearly: initialDelay * attempt
|
||||
*/
|
||||
export class LinearBackoff implements IBackoffCalculator {
|
||||
calculate(attempt: number, initialDelay: number, maxDelay: number): number {
|
||||
const delay = initialDelay * attempt;
|
||||
return Math.min(delay, maxDelay);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constant backoff strategy
|
||||
* Delay stays constant: initialDelay
|
||||
*/
|
||||
export class ConstantBackoff implements IBackoffCalculator {
|
||||
calculate(attempt: number, initialDelay: number, maxDelay: number): number {
|
||||
return Math.min(initialDelay, maxDelay);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get backoff calculator for a given strategy
|
||||
*/
|
||||
export function getBackoffCalculator(
|
||||
strategy: TBackoffStrategy,
|
||||
): IBackoffCalculator {
|
||||
switch (strategy) {
|
||||
case 'exponential':
|
||||
return new ExponentialBackoff();
|
||||
case 'linear':
|
||||
return new LinearBackoff();
|
||||
case 'constant':
|
||||
return new ConstantBackoff();
|
||||
default:
|
||||
return new ExponentialBackoff();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add jitter to delay to prevent thundering herd
|
||||
*/
|
||||
export function addJitter(delay: number, jitterFactor: number = 0.1): number {
|
||||
const jitter = delay * jitterFactor * Math.random();
|
||||
return delay + jitter;
|
||||
}
|
||||
Reference in New Issue
Block a user