const API = ""; /** Stored when cookie-based session is unavailable (e.g. HF Space proxy). */ const AUTH_TOKEN_KEY = "web_ui_auth_token"; export function apiFetch(input: RequestInfo | URL, init: RequestInit = {}): Promise { const headers = new Headers(init.headers); const token = sessionStorage.getItem(AUTH_TOKEN_KEY); if (token) headers.set("Authorization", `Bearer ${token}`); return fetch(input, { ...init, credentials: "include", headers }); } const ME_TIMEOUT_MS = 15_000; /** Session check; sends Bearer token when present (HF Space / no cookie). Aborts if the server never responds. */ export async function fetchMe(): Promise<{ authenticated: boolean }> { const c = new AbortController(); const id = setTimeout(() => c.abort(), ME_TIMEOUT_MS); try { const r = await apiFetch(`${API}/api/me`, { signal: c.signal }); if (!r.ok) throw new Error("me failed"); return r.json(); } finally { clearTimeout(id); } } export async function login(password: string): Promise { const r = await fetch(`${API}/api/login`, { method: "POST", headers: { "Content-Type": "application/json" }, credentials: "include", body: JSON.stringify({ password }), }); const j = (await r.json().catch(() => ({}))) as { detail?: string; auth_token?: string }; if (!r.ok) { throw new Error(j.detail || "Login failed"); } if (j.auth_token) sessionStorage.setItem(AUTH_TOKEN_KEY, j.auth_token); } export async function logout(): Promise { await apiFetch(`${API}/api/logout`, { method: "POST" }); sessionStorage.removeItem(AUTH_TOKEN_KEY); }