148 lines
3.4 KiB
TypeScript
148 lines
3.4 KiB
TypeScript
|
|
/**
|
||
|
|
* Main webrequest function - fetch-compatible API
|
||
|
|
*/
|
||
|
|
|
||
|
|
import type { IWebrequestOptions } from './webrequest.types.js';
|
||
|
|
import { WebrequestClient } from './webrequest.client.js';
|
||
|
|
|
||
|
|
// Global default client
|
||
|
|
const defaultClient = new WebrequestClient();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Fetch-compatible webrequest function
|
||
|
|
* Drop-in replacement for fetch() with caching, retry, and fault tolerance
|
||
|
|
*
|
||
|
|
* @param input - URL or Request object
|
||
|
|
* @param init - Request options (standard RequestInit + webrequest extensions)
|
||
|
|
* @returns Promise<Response>
|
||
|
|
*
|
||
|
|
* @example
|
||
|
|
* ```typescript
|
||
|
|
* // Simple GET request
|
||
|
|
* const response = await webrequest('https://api.example.com/data');
|
||
|
|
* const data = await response.json();
|
||
|
|
*
|
||
|
|
* // With caching
|
||
|
|
* const response = await webrequest('https://api.example.com/data', {
|
||
|
|
* cacheStrategy: 'cache-first',
|
||
|
|
* cacheMaxAge: 60000
|
||
|
|
* });
|
||
|
|
*
|
||
|
|
* // With retry
|
||
|
|
* const response = await webrequest('https://api.example.com/data', {
|
||
|
|
* retry: {
|
||
|
|
* maxAttempts: 3,
|
||
|
|
* backoff: 'exponential'
|
||
|
|
* }
|
||
|
|
* });
|
||
|
|
*
|
||
|
|
* // With fallback URLs
|
||
|
|
* const response = await webrequest('https://api.example.com/data', {
|
||
|
|
* fallbackUrls: ['https://backup.example.com/data'],
|
||
|
|
* retry: true
|
||
|
|
* });
|
||
|
|
* ```
|
||
|
|
*/
|
||
|
|
export async function webrequest(
|
||
|
|
input: string | Request | URL,
|
||
|
|
init?: IWebrequestOptions,
|
||
|
|
): Promise<Response> {
|
||
|
|
const url = input instanceof Request ? input.url : String(input);
|
||
|
|
const request = input instanceof Request ? input : new Request(url, init);
|
||
|
|
|
||
|
|
return await defaultClient.request(request, init);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Convenience method: GET request returning JSON
|
||
|
|
*/
|
||
|
|
webrequest.getJson = async function <T = any>(
|
||
|
|
url: string,
|
||
|
|
options?: IWebrequestOptions,
|
||
|
|
): Promise<T> {
|
||
|
|
return await defaultClient.getJson<T>(url, options);
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Convenience method: POST request with JSON body
|
||
|
|
*/
|
||
|
|
webrequest.postJson = async function <T = any>(
|
||
|
|
url: string,
|
||
|
|
data: any,
|
||
|
|
options?: IWebrequestOptions,
|
||
|
|
): Promise<T> {
|
||
|
|
return await defaultClient.postJson<T>(url, data, options);
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Convenience method: PUT request with JSON body
|
||
|
|
*/
|
||
|
|
webrequest.putJson = async function <T = any>(
|
||
|
|
url: string,
|
||
|
|
data: any,
|
||
|
|
options?: IWebrequestOptions,
|
||
|
|
): Promise<T> {
|
||
|
|
return await defaultClient.putJson<T>(url, data, options);
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Convenience method: DELETE request
|
||
|
|
*/
|
||
|
|
webrequest.deleteJson = async function <T = any>(
|
||
|
|
url: string,
|
||
|
|
options?: IWebrequestOptions,
|
||
|
|
): Promise<T> {
|
||
|
|
return await defaultClient.deleteJson<T>(url, options);
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Add a global request interceptor
|
||
|
|
*/
|
||
|
|
webrequest.addRequestInterceptor = function (interceptor) {
|
||
|
|
defaultClient.addRequestInterceptor(interceptor);
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Add a global response interceptor
|
||
|
|
*/
|
||
|
|
webrequest.addResponseInterceptor = function (interceptor) {
|
||
|
|
defaultClient.addResponseInterceptor(interceptor);
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Add a global error interceptor
|
||
|
|
*/
|
||
|
|
webrequest.addErrorInterceptor = function (interceptor) {
|
||
|
|
defaultClient.addErrorInterceptor(interceptor);
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Clear all global interceptors
|
||
|
|
*/
|
||
|
|
webrequest.clearInterceptors = function () {
|
||
|
|
defaultClient.clearInterceptors();
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Clear the cache
|
||
|
|
*/
|
||
|
|
webrequest.clearCache = async function () {
|
||
|
|
await defaultClient.clearCache();
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Create a new WebrequestClient with custom configuration
|
||
|
|
*/
|
||
|
|
webrequest.createClient = function (
|
||
|
|
options?: Partial<IWebrequestOptions>,
|
||
|
|
): WebrequestClient {
|
||
|
|
return new WebrequestClient(options);
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the default client
|
||
|
|
*/
|
||
|
|
webrequest.getDefaultClient = function (): WebrequestClient {
|
||
|
|
return defaultClient;
|
||
|
|
};
|