unionlabs/union · error · Error
User is not logged in
Error message
User is not logged in
What it means
First guard in callJoinQueue: the ceremony app's reactive Supabase user store has no session (user.session is null), so there is no authenticated user to join the signing-queue RPC. The function throws instead of returning its boolean failure path, so callers must ensure auth before invoking.
Source
Thrown at ceremony/src/lib/supabase/index.ts:32
queryUserPublicHash,
queryUserQueuePosition,
queryUserWallet,
queryVerificationTime,
} from "$lib/supabase/queries.ts"
import { msToTimeString, sleep, timeToMs } from "$lib/utils/utils.ts"
export interface TimeResult {
verification: string | null
contribution: string | null
total: string
verificationMs: number
contributionMs: number
totalMs: number
}
export const callJoinQueue = async (code: string | null): Promise<boolean> => {
if (!user.session) {
throw new Error("User is not logged in")
}
const userId = user.session.user.id
if (!userId) {
throw new Error("User is not logged in")
}
try {
const { error } = await supabase.rpc("join_queue", { code_id: code })
if (error) {
console.log("Error joining queue:", error)
return false
}
return true
} catch (err) {
console.log("Unexpected error:", err)
return falseView on GitHub (pinned to 031785bb6d)
Solutions
- Ensure supabase.auth.getSession() has resolved and user.session is populated before rendering/enabling the join-queue action
- On app boot, await the INITIAL_SESSION event before calling session-dependent APIs
- Redirect the user to login (or trigger supabase.auth.signIn) and retry after authentication
Example fix
// before
await callJoinQueue(code)
// after
const { data: { session } } = await supabase.auth.getSession()
if (!session) {
await goto("/login")
return
}
await callJoinQueue(code) Defensive patterns
Strategy: validation
Validate before calling
const { data: { session } } = await supabase.auth.getSession()
if (!session) {
await goto("/login")
return
}
await callJoinQueue(code) Try / catch
try {
await callJoinQueue(code)
} catch (e) {
if (e instanceof Error && e.message === "User is not logged in") {
await goto("/login?redirect=/queue")
return
}
throw e
} Prevention
- Await the INITIAL_SESSION event on boot before enabling auth-dependent actions
- Gate queue actions on an authenticated store flag
- Subscribe to onAuthStateChange SIGNED_OUT to stop in-flight flows
When it happens
Trigger: Calling callJoinQueue before login finishes, after session expiry (idle JWT timeout), or on a hard refresh where the user store has not yet hydrated the restored session.
Common situations: Race between Supabase auth restoration (INITIAL_SESSION via onAuthStateChange) and UI button handlers; expired JWT after a long-idle tab; logout performed in another tab.
Related errors
AI-assisted analysis of unionlabs/union@031785bb6d (2026-08-16).
Data as JSON: /api/errors/f2c2db89c87b0b6c.
Report an issue: GitHub.