feat: Enhance regimen filtering logic and add timeout to authenticatedFetch
This commit is contained in:
@@ -133,13 +133,15 @@ export async function refreshAccessToken(
|
||||
* @param cookies - Objeto de cookies de SvelteKit
|
||||
* @param fetch - Función fetch de SvelteKit
|
||||
* @param redirectUrl - URL a la que redirigir si falla la autenticación (opcional)
|
||||
* @param timeout - Timeout en milisegundos (default: 10000ms)
|
||||
*/
|
||||
export async function authenticatedFetch(
|
||||
endpoint: string,
|
||||
options: RequestInit = {},
|
||||
cookies: Cookies,
|
||||
fetch: typeof globalThis.fetch,
|
||||
redirectUrl?: string
|
||||
redirectUrl?: string,
|
||||
timeout: number = 10000
|
||||
): Promise<Response> {
|
||||
try {
|
||||
const baseUrl = getServerApiUrl();
|
||||
@@ -156,24 +158,43 @@ export async function authenticatedFetch(
|
||||
// Construir URL completa
|
||||
const url = endpoint.startsWith('http') ? endpoint : `${baseUrl}${endpoint}`;
|
||||
|
||||
// Crear AbortController para timeout
|
||||
const controller = new AbortController();
|
||||
const timeoutId = setTimeout(() => {
|
||||
console.error(`⏱️ [API] Timeout después de ${timeout}ms:`, endpoint);
|
||||
controller.abort();
|
||||
}, timeout);
|
||||
|
||||
// Realizar la petición inicial
|
||||
const headers = createAuthHeaders(accessToken, options.headers as Record<string, string>);
|
||||
let response = await fetch(url, {
|
||||
...options,
|
||||
headers
|
||||
headers,
|
||||
signal: controller.signal
|
||||
});
|
||||
|
||||
clearTimeout(timeoutId);
|
||||
|
||||
// Si es 401, intentar refrescar el token
|
||||
if (response.status === 401) {
|
||||
const newToken = await refreshAccessToken(cookies, fetch);
|
||||
|
||||
if (newToken) {
|
||||
// Reintentar la petición con el nuevo token
|
||||
const newController = new AbortController();
|
||||
const newTimeoutId = setTimeout(() => {
|
||||
console.error(`⏱️ [API] Timeout en retry después de ${timeout}ms:`, endpoint);
|
||||
newController.abort();
|
||||
}, timeout);
|
||||
|
||||
const newHeaders = createAuthHeaders(newToken, options.headers as Record<string, string>);
|
||||
response = await fetch(url, {
|
||||
...options,
|
||||
headers: newHeaders
|
||||
headers: newHeaders,
|
||||
signal: newController.signal
|
||||
});
|
||||
|
||||
clearTimeout(newTimeoutId);
|
||||
} else {
|
||||
// No se pudo refrescar, limpiar y redirigir
|
||||
clearAuthTokens(cookies);
|
||||
|
||||
Reference in New Issue
Block a user