fix(sprint-5/etapa-4e): lockAcquireTimeout 30s + eliminar getSessionSafe — corta freeze en guardar perfil

getSessionSafe() tenía un problema de diseño: Promise.race([getSession(), timeout])
abandona la Promise de getSession() cuando gana el timeout. La Promise abandonada
deja una operación en PROCESS_LOCKS[name] que bloquea el chain. Con lockAcquireTimeout=5s
(default), un token refresh lento dispara ProcessLockAcquireTimeoutError cuyo handler
hace await previousOperation (colgada) → freeze permanente.

Fix: lockAcquireTimeout: 30000 (margen para redes lentas) + eliminar getSessionSafe()
de supabase.ts, library-store, process-store y useReportData. Las queries Supabase
llaman getSession() internamente vía _getAccessToken() que espera initializePromise
automáticamente — la barrera era redundante.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-20 19:05:23 -03:00
parent 8142b07525
commit 3ebfd65a90
4 changed files with 5 additions and 25 deletions

View File

@@ -18,16 +18,10 @@ export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
// navigator.locks) — evita el deadlock a costa de no sincronizar refresh entre tabs,
// lo cual es aceptable para este producto (uso mayormente single-tab).
lock: processLock,
// Aumentado de 5000 (default) a 30000ms.
// Con 5s, un token refresh lento dispara ProcessLockAcquireTimeoutError, cuyo handler
// hace await previousOperation (colgada) → chain bloqueado permanente.
// 30s da margen para refresh en redes lentas o cold starts de Supabase Auth.
lockAcquireTimeout: 30000,
},
})
// supabase.auth.getSession() puede colgarse indefinidamente si el cliente queda
// esperando un lock interno (navigator.locks) que nunca se libera. Esta barrera
// nunca bloquea más de 4s: si no resuelve a tiempo, sigue de largo sin sesión confirmada
// en vez de dejar la UI con un spinner/skeleton infinito.
export async function getSessionSafe(): Promise<void> {
await Promise.race([
supabase.auth.getSession(),
new Promise((resolve) => setTimeout(resolve, 4000)),
])
}