@alwatr/fetch
Version:
`@alwatr/fetch` is an enhanced, lightweight, and dependency-free wrapper for the native `fetch` API. It provides modern features like caching strategies, request retries, timeouts, and intelligent duplicate request handling, all in a compact package.
124 lines • 4.86 kB
TypeScript
import type { FetchError } from './error.js';
import type { HttpMethod, HttpRequestHeaders } from '@alwatr/http-primer';
import type { Duration } from '@alwatr/parse-duration';
/**
* A dictionary of query parameters.
* Keys are strings, and values can be strings, numbers, or booleans.
*/
export type QueryParams = DictionaryOpt<string | number | boolean>;
/**
* Defines the caching strategy for a fetch request.
*
* - `network_only`: Always fetches from the network.
* - `network_first`: Tries the network first, then falls back to the cache.
* - `cache_only`: Only fetches from the cache; fails if not found.
* - `cache_first`: Tries the cache first, then falls back to the network.
* - `update_cache`: Fetches from the network and updates the cache.
* - `stale_while_revalidate`: Serves from cache while revalidating in the background.
*/
export type CacheStrategy = 'network_only' | 'network_first' | 'cache_only' | 'cache_first' | 'update_cache' | 'stale_while_revalidate';
/**
* Defines the caching behavior for identical, parallel requests.
* - `never`: No deduplication is performed.
* - `always`: The response is cached for the lifetime of the application.
* - `until_load`: The response is cached until the initial request is complete.
* - `auto`: Automatically selects the best strategy (`until_load` in browsers, `always` otherwise).
*/
export type CacheDuplicate = 'never' | 'always' | 'until_load' | 'auto';
/**
* Defines the options for an Alwatr fetch request.
*/
export interface AlwatrFetchOptions_ {
/**
* The HTTP request method.
* @default 'GET'
*/
method: HttpMethod;
/**
* An object of request headers.
*/
headers: HttpRequestHeaders & DictionaryReq<string>;
/**
* Request timeout duration. Can be a number (milliseconds) or a string (e.g., '5s').
* Set to `0` to disable.
* @default '8s'
*/
timeout: Duration;
/**
* Number of times to retry a failed request.
* Retries occur on network errors, timeouts, or 5xx server responses.
* @default 3
*/
retry: number;
/**
* Delay before each retry attempt. Can be a number (milliseconds) or a string (e.g., '2s').
* @default '1s'
*/
retryDelay: Duration;
/**
* Strategy for handling duplicate parallel requests.
* Uniqueness is determined by method, URL, and request body.
* @default 'never'
*/
removeDuplicate: CacheDuplicate;
/**
* The caching strategy to use for the request.
* Requires a browser environment with Cache API support.
* @default 'network_only'
*/
cacheStrategy: CacheStrategy;
/**
* A callback function that is executed with the fresh response when using the 'stale_while_revalidate' cache strategy.
*/
revalidateCallback?: (response: Response) => void | Promise<void>;
/**
* Custom name for the CacheStorage instance.
* @default 'fetch_cache'
*/
cacheStorageName: string;
/**
* A JavaScript object to be sent as the request's JSON body.
* Automatically sets the 'Content-Type' header to 'application/json'.
*/
bodyJson?: JsonValue;
/**
* A JavaScript object of query parameters to be appended to the request URL.
*/
queryParams?: QueryParams;
/**
* A bearer token to be added to the 'Authorization' header.
*/
bearerToken?: string;
/**
* Alwatr-specific authentication credentials.
*/
alwatrAuth?: {
userId: string;
userToken: string;
};
}
/**
* Combined type for fetch options, including standard RequestInit properties.
*/
export type FetchOptions = Partial<AlwatrFetchOptions_> & Omit<RequestInit, 'headers'>;
export type FetchJsonOptions = FetchOptions & {
requireJsonResponseWithOkTrue?: true;
};
/**
* Represents the tuple returned by the fetch function.
* On success, it's `[Response, null]`. On failure, it's `[null, FetchError]`.
*/
export type FetchResponse = Promise<[Response, null] | [null, FetchError]>;
/**
* Defines the specific reason for a fetch failure.
* - `http_error`: An HTTP error status was received (e.g., 404, 500).
* - `timeout`: The request was aborted due to a timeout.
* - `cache_not_found`: The requested resource was not found in the cache_only strategy.
* - `network_error`: A generic network-level error occurred.
* - `aborted`: The request was aborted by a user-provided signal.
* - `json_parse_error`: The response body could not be parsed as JSON.
* - `json_response_error`: The response JSON "ok" property is not true.
* - `unknown_error`: An unspecified error occurred.
*/
export type FetchErrorReason = 'http_error' | 'cache_not_found' | 'timeout' | 'network_error' | 'aborted' | 'json_parse_error' | 'json_response_error' | 'unknown_error';
//# sourceMappingURL=type.d.ts.map