feat: Enhance regimen filtering logic and add timeout to authenticatedFetch

This commit is contained in:
AlexeerCT
2026-01-02 15:46:25 -06:00
parent c95c7f7c55
commit 5dce19ebdf
3 changed files with 51 additions and 11 deletions

View File

@@ -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);