v1.1.0: session guard on all game routes + register + sign-in screen (ISS-107)
CI / build + unit + e2e (pull_request) Failing after 26m20s
CI / build + unit + e2e (pull_request) Failing after 26m20s
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
'use client';
|
||||
|
||||
// v1.1.0 (ISS-107) — client-side session handling shared by every authenticated fetcher, the
|
||||
// sign-in screen and the admin panel. The server mints sessions at /api/login + /api/register;
|
||||
// we only store the id in localStorage and echo it back as X-Flight-Session.
|
||||
|
||||
export const SESSION_STORAGE_KEY = 'flight.session';
|
||||
|
||||
export function storedSession(): string | null {
|
||||
if (typeof window === 'undefined') return null;
|
||||
try {
|
||||
return window.localStorage.getItem(SESSION_STORAGE_KEY);
|
||||
} catch {
|
||||
return null; // storage blocked (private mode) — treat as signed out
|
||||
}
|
||||
}
|
||||
|
||||
// Headers for an authenticated fetch. Empty object when no session is stored, so callers can
|
||||
// spread it into their existing header objects without branching.
|
||||
export function sessionHeaders(session: string | null = storedSession()): Record<string, string> {
|
||||
return session ? { 'X-Flight-Session': session } : {};
|
||||
}
|
||||
|
||||
export function storeSession(sessionId: string): void {
|
||||
window.localStorage.setItem(SESSION_STORAGE_KEY, sessionId);
|
||||
}
|
||||
|
||||
export function clearStoredSession(): void {
|
||||
try {
|
||||
window.localStorage.removeItem(SESSION_STORAGE_KEY);
|
||||
} catch {
|
||||
// storage blocked — nothing to clear
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user