import turnstile from "$lib/api/turnstile"; import { currentApiURL } from "$lib/api/api-url"; import type { CobaltSession, CobaltErrorResponse, CobaltSessionResponse } from "$lib/types/api"; let cache: CobaltSession | undefined; export const requestSession = async () => { const apiEndpoint = `${currentApiURL()}/session`; let requestHeaders = {}; const turnstileResponse = turnstile.getResponse(); if (turnstileResponse) { requestHeaders = { "cf-turnstile-response": turnstileResponse }; } const response: CobaltSessionResponse = await fetch(apiEndpoint, { method: "POST", redirect: "manual", signal: AbortSignal.timeout(10000), headers: requestHeaders, }) .then(r => r.json()) .catch((e) => { if (e?.message?.includes("timed out")) { return { status: "error", error: { code: "error.api.timed_out" } } as CobaltErrorResponse } }); turnstile.reset(); return response; } export const getSession = async () => { const currentTime = () => Math.floor(new Date().getTime() / 1000); if (cache?.token && cache?.exp - 2 > currentTime()) { return cache; } const newSession = await requestSession(); if (!newSession) return { status: "error", error: { code: "error.api.unreachable" } } as CobaltErrorResponse if (!("status" in newSession)) { newSession.exp = currentTime() + newSession.exp; cache = newSession; } return newSession; }