From f6990e9808995c14065f43f141671872f350fc80 Mon Sep 17 00:00:00 2001 From: Ann Rose Date: Wed, 3 Jun 2026 17:52:24 +0530 Subject: [PATCH] Session Import Race Condition --- .../tv/data/repository/AuthRepository.kt | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/app/src/main/kotlin/com/arflix/tv/data/repository/AuthRepository.kt b/app/src/main/kotlin/com/arflix/tv/data/repository/AuthRepository.kt index 24e93dec..a4cc7bda 100644 --- a/app/src/main/kotlin/com/arflix/tv/data/repository/AuthRepository.kt +++ b/app/src/main/kotlin/com/arflix/tv/data/repository/AuthRepository.kt @@ -197,42 +197,43 @@ class AuthRepository @Inject constructor( val hasRefreshToken = !refreshToken.isNullOrBlank() var session: UserSession? = null - // Supabase SDK requires main thread for initialization (lifecycle observers) - // First try: Load from SessionManager via Supabase SDK - try { - session = withTimeoutOrNull(2_500L) { - withContext(Dispatchers.Main) { + for (attempt in 1..3) { + // First try: Load from SessionManager via Supabase SDK + try { + session = withContext(Dispatchers.IO) { supabase.auth.loadFromStorage(true) supabase.auth.currentSessionOrNull() } + } catch (e: Exception) { } - } catch (e: Exception) { - } - // Second try: Import from cached tokens - if (session == null && hasAccessToken && hasRefreshToken) { - try { - session = withTimeoutOrNull(2_500L) { - withContext(Dispatchers.Main) { + // Second try: Import from cached tokens + if (session == null && hasAccessToken && hasRefreshToken) { + try { + session = withContext(Dispatchers.IO) { supabase.auth.importAuthToken(accessToken ?: "", refreshToken ?: "", false, true) supabase.auth.currentSessionOrNull() } + if (session != null) { + // Save the imported session to SessionManager + storeSession(session) + } + } catch (e: Exception) { } - if (session != null) { - // Save the imported session to SessionManager - storeSession(session) - } - } catch (e: Exception) { } - } - // Third try: Refresh the session - if (session == null && hasRefreshToken) { - session = withTimeoutOrNull(3_000L) { - withContext(Dispatchers.Main) { - ensureValidSession() + // Third try: Refresh the session + if (session == null && hasRefreshToken) { + try { + session = withContext(Dispatchers.IO) { + ensureValidSession() + } + } catch (e: Exception) { } } + + if (session != null) break + if (attempt < 3) kotlinx.coroutines.delay(500L) } if (hasAccessToken || hasRefreshToken || session != null || !cachedUserId.isNullOrBlank()) { val userId = session?.user?.id ?: cachedUserId