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

@@ -1,5 +1,4 @@
import { useEffect, useState } from 'react'
import { getSessionSafe } from '@/lib/supabase'
import { supabaseActivityRepo } from '@/persistence/supabase/activity-repo'
import { supabaseResourceRepo } from '@/persistence/supabase/resource-repo'
import { supabaseProcessRepo } from '@/persistence/supabase/process-repo'
@@ -30,8 +29,6 @@ export function useReportData(processId: string): ReportData {
setIsLoading(true)
setError(null)
try {
// Barrera única con timeout: garantiza sesión restaurada antes del fan-out en paralelo
await getSessionSafe()
const [proc, sim, acts, res] = await Promise.all([
supabaseProcessRepo.getById(processId),
supabaseSimulationRepo.getLatestByProcess(processId),