From 3b19f58e264561517409f7174c98adb1ecc0465e Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Santos Souza de Miranda Date: Sat, 24 Jan 2026 19:22:22 -0300 Subject: [PATCH] fix: wait for auth session before connecting to realtime channel On initial page load, the Supabase browser client's auth session may not be ready yet (still loading from cookies). The Realtime channel subscription silently fails without a valid access token. Now connect() awaits getSession() first, which ensures the token is available and also refreshes expired tokens on reconnect after inactivity. Co-Authored-By: Claude Opus 4.5 --- src/lib/collaboration/realtime.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/lib/collaboration/realtime.ts b/src/lib/collaboration/realtime.ts index e5b0cb8..800e273 100644 --- a/src/lib/collaboration/realtime.ts +++ b/src/lib/collaboration/realtime.ts @@ -77,6 +77,21 @@ export class RealtimeConnection { this.resetInactivityTimer() this.clearConnectionTimer() + // Ensure the Supabase client has a valid auth session before connecting. + // On initial page load, the session may still be loading from cookies. + try { + const { data: { session } } = await this.supabase.auth.getSession() + if (!session && !this.isDestroyed) { + // No session yet - wait briefly and retry + this.scheduleReconnect() + return + } + } catch { + // Session check failed - proceed anyway, channel will handle auth errors + } + + if (this.isDestroyed || this.isPaused) return + // Set a timeout: if we don't connect within CONNECTION_TIMEOUT_MS, retry this.connectionTimer = setTimeout(() => { if (this.isDestroyed || this.isPaused) return