cobalt/web/src/lib/api/session.ts
wukko a3c807a993
web/turnstile: use own callback for refreshing the widget
or at least try to, idk man, im so tired of cf turnstile
2024-11-19 00:20:27 +06:00

64 lines
1.6 KiB
TypeScript

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;
}