export const API = "http://127.0.0.1:8000"; export const POLL = 15_000; export const POLL_HEAVY = 60_000; export const POLL_HIDDEN = 120_000; export const FETCH_TIMEOUT = 12_000; export function pollDelay({ok = true, base = POLL, failures = 0} = {}) { const hidden = typeof document !== "undefined" && document.visibilityState === "hidden"; const failureDelay = ok ? base : Math.min(base * 2 ** Math.min(failures, 4), 300_000); return hidden ? Math.max(failureDelay, POLL_HIDDEN) : failureDelay; } export function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } export async function apiFetch(path, options = {}) { const url = path.startsWith("http") ? path : `${API}${path}`; const timeout = options.timeout ?? FETCH_TIMEOUT; const ctrl = new AbortController(); const timer = setTimeout(() => ctrl.abort(), timeout); try { return await fetch(url, {...options, signal: ctrl.signal}); } finally { clearTimeout(timer); } }