cobalt/web/src/lib/api/server-info.ts

74 lines
2 KiB
TypeScript

import { browser } from "$app/environment";
import { get } from "svelte/store";
import { currentApiURL } from "$lib/api/api-url";
import { turnstileCreated, turnstileEnabled, turnstileSolved } from "$lib/state/turnstile";
import cachedInfo from "$lib/state/server-info";
import type { CobaltServerInfoResponse, CobaltErrorResponse, CobaltServerInfo } from "$lib/types/api";
export type CobaltServerInfoCache = {
info: CobaltServerInfo,
origin: string,
}
const request = async () => {
const apiEndpoint = `${currentApiURL()}/`;
const response: CobaltServerInfoResponse = await fetch(apiEndpoint, {
redirect: "manual",
signal: AbortSignal.timeout(10000),
})
.then(r => r.json())
.catch((e) => {
if (e?.message?.includes("timed out")) {
return {
status: "error",
error: {
code: "error.api.timed_out"
}
} as CobaltErrorResponse
}
});
return response;
}
// reload the page if turnstile is now disabled, but was previously loaded and not solved
const reloadIfTurnstileDisabled = () => {
if (browser && !get(turnstileEnabled) && get(turnstileCreated) && !get(turnstileSolved)) {
window.location.reload();
}
}
export const getServerInfo = async () => {
const cache = get(cachedInfo);
if (cache && cache.origin === currentApiURL()) {
reloadIfTurnstileDisabled();
return true
}
const freshInfo = await request();
if (!freshInfo || !("cobalt" in freshInfo)) {
return false;
}
if (!("status" in freshInfo)) {
cachedInfo.set({
info: freshInfo,
origin: currentApiURL(),
});
// reload the page if turnstile sitekey changed
if (browser && get(turnstileEnabled) && cache && cache?.info?.cobalt?.turnstileSitekey !== freshInfo?.cobalt?.turnstileSitekey) {
window.location.reload();
}
reloadIfTurnstileDisabled();
return true;
}
return false;
}