mirror of
https://github.com/KuekHaoYang/KVideo.git
synced 2026-08-13 07:43:43 +08:00
60 lines
1.3 KiB
TypeScript
60 lines
1.3 KiB
TypeScript
/**
|
|
* HTTP Utilities for API calls
|
|
* Handles timeouts and retries
|
|
*/
|
|
|
|
// Disable SSL verification for video sources with invalid certificates
|
|
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
|
|
|
const REQUEST_TIMEOUT = 15000;
|
|
const MAX_RETRIES = 3;
|
|
const RETRY_DELAY = 200;
|
|
|
|
/**
|
|
* Fetch with timeout support
|
|
*/
|
|
export async function fetchWithTimeout(
|
|
url: string,
|
|
options: RequestInit = {},
|
|
timeout: number = REQUEST_TIMEOUT
|
|
): Promise<Response> {
|
|
const controller = new AbortController();
|
|
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
|
|
try {
|
|
const response = await fetch(url, {
|
|
...options,
|
|
signal: controller.signal,
|
|
});
|
|
clearTimeout(timeoutId);
|
|
return response;
|
|
} catch (error) {
|
|
clearTimeout(timeoutId);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retry logic wrapper
|
|
*/
|
|
export async function withRetry<T>(
|
|
fn: () => Promise<T>,
|
|
retries: number = MAX_RETRIES
|
|
): Promise<T> {
|
|
let lastError: Error | null = null;
|
|
|
|
for (let i = 0; i <= retries; i++) {
|
|
try {
|
|
return await fn();
|
|
} catch (error) {
|
|
lastError = error as Error;
|
|
|
|
if (i < retries) {
|
|
await new Promise(resolve => setTimeout(resolve, RETRY_DELAY * (i + 1)));
|
|
}
|
|
}
|
|
}
|
|
|
|
throw lastError;
|
|
}
|