- 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.
		
			
				
	
	
		
			144 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * Core type definitions for @push.rocks/webrequest v4
 | |
|  */
 | |
| 
 | |
| // ==================
 | |
| // Cache Types
 | |
| // ==================
 | |
| 
 | |
| export type TCacheStrategy =
 | |
|   | 'network-first'
 | |
|   | 'cache-first'
 | |
|   | 'stale-while-revalidate'
 | |
|   | 'network-only'
 | |
|   | 'cache-only';
 | |
| 
 | |
| export type TStandardCacheMode =
 | |
|   | 'default'
 | |
|   | 'no-store'
 | |
|   | 'reload'
 | |
|   | 'no-cache'
 | |
|   | 'force-cache'
 | |
|   | 'only-if-cached';
 | |
| 
 | |
| export interface ICacheEntry {
 | |
|   response: ArrayBuffer;
 | |
|   headers: Record<string, string>;
 | |
|   timestamp: number;
 | |
|   etag?: string;
 | |
|   lastModified?: string;
 | |
|   maxAge?: number;
 | |
|   url: string;
 | |
|   status: number;
 | |
|   statusText: string;
 | |
| }
 | |
| 
 | |
| export interface ICacheOptions {
 | |
|   /** Standard cache mode (fetch API compatible) */
 | |
|   cache?: TStandardCacheMode;
 | |
|   /** Advanced cache strategy */
 | |
|   cacheStrategy?: TCacheStrategy;
 | |
|   /** Maximum age in milliseconds */
 | |
|   cacheMaxAge?: number;
 | |
|   /** Custom cache key generator */
 | |
|   cacheKey?: string | ((request: Request) => string);
 | |
|   /** Force revalidation even if cached */
 | |
|   revalidate?: boolean;
 | |
| }
 | |
| 
 | |
| // ==================
 | |
| // Retry Types
 | |
| // ==================
 | |
| 
 | |
| export type TBackoffStrategy = 'exponential' | 'linear' | 'constant';
 | |
| 
 | |
| export interface IRetryOptions {
 | |
|   /** Maximum number of retry attempts (default: 3) */
 | |
|   maxAttempts?: number;
 | |
|   /** Backoff strategy (default: 'exponential') */
 | |
|   backoff?: TBackoffStrategy;
 | |
|   /** Initial delay in milliseconds (default: 1000) */
 | |
|   initialDelay?: number;
 | |
|   /** Maximum delay in milliseconds (default: 30000) */
 | |
|   maxDelay?: number;
 | |
|   /** Status codes or function to determine if retry should occur */
 | |
|   retryOn?: number[] | ((response: Response, error?: Error) => boolean);
 | |
|   /** Callback on each retry attempt */
 | |
|   onRetry?: (attempt: number, error: Error, nextDelay: number) => void;
 | |
| }
 | |
| 
 | |
| // ==================
 | |
| // Interceptor Types
 | |
| // ==================
 | |
| 
 | |
| export type TRequestInterceptor = (
 | |
|   request: Request,
 | |
| ) => Request | Promise<Request>;
 | |
| export type TResponseInterceptor = (
 | |
|   response: Response,
 | |
| ) => Response | Promise<Response>;
 | |
| 
 | |
| export interface IInterceptors {
 | |
|   request?: TRequestInterceptor[];
 | |
|   response?: TResponseInterceptor[];
 | |
| }
 | |
| 
 | |
| // ==================
 | |
| // Main Options
 | |
| // ==================
 | |
| 
 | |
| export interface IWebrequestOptions extends Omit<RequestInit, 'cache'> {
 | |
|   // Caching
 | |
|   cache?: TStandardCacheMode;
 | |
|   cacheStrategy?: TCacheStrategy;
 | |
|   cacheMaxAge?: number;
 | |
|   cacheKey?: string | ((request: Request) => string);
 | |
|   revalidate?: boolean;
 | |
| 
 | |
|   // Retry & Fault Tolerance
 | |
|   retry?: boolean | IRetryOptions;
 | |
|   fallbackUrls?: string[];
 | |
|   timeout?: number;
 | |
| 
 | |
|   // Interceptors
 | |
|   interceptors?: IInterceptors;
 | |
| 
 | |
|   // Deduplication
 | |
|   deduplicate?: boolean;
 | |
| 
 | |
|   // Logging
 | |
|   logging?: boolean;
 | |
| }
 | |
| 
 | |
| // ==================
 | |
| // Result Types
 | |
| // ==================
 | |
| 
 | |
| export interface IWebrequestSuccess<T> {
 | |
|   ok: true;
 | |
|   data: T;
 | |
|   response: Response;
 | |
| }
 | |
| 
 | |
| export interface IWebrequestError {
 | |
|   ok: false;
 | |
|   error: Error;
 | |
|   response?: Response;
 | |
| }
 | |
| 
 | |
| export type TWebrequestResult<T> = IWebrequestSuccess<T> | IWebrequestError;
 | |
| 
 | |
| // ==================
 | |
| // Internal Types
 | |
| // ==================
 | |
| 
 | |
| export interface ICacheMetadata {
 | |
|   maxAge: number;
 | |
|   etag?: string;
 | |
|   lastModified?: string;
 | |
|   immutable: boolean;
 | |
|   noCache: boolean;
 | |
|   noStore: boolean;
 | |
|   mustRevalidate: boolean;
 | |
| }
 |