import { log_error, log_info } from "$lib/logger"; import { Temporal } from "temporal-polyfill"; import { http_account } from "$lib/api/account"; import { is_guid, session_storage_get_json, session_storage_set_json } from "./helpers"; import { SECONDS_BETWEEN_SESSION_CHECK, StorageKeys } from "./configuration"; import type { Session } from "$lib/models/internal/ISession"; export async function is_active(forceRefresh: boolean = false): Promise { const nowEpoch = Temporal.Now.instant().epochSeconds; const data = session_storage_get_json(StorageKeys.session) as Session; const expiryEpoch = data?.lastChecked + SECONDS_BETWEEN_SESSION_CHECK; const lastCheckIsStaleOrNone = !is_guid(data?.profile?.id) || (expiryEpoch < nowEpoch); if (forceRefresh || lastCheckIsStaleOrNone) { return await call_api(); } else { const sessionIsValid = data.profile && is_guid(data.profile.id); if (!sessionIsValid) { clear_session_data(); log_info("Session data is not valid"); } return sessionIsValid; } } export async function end_session(cb: Function): Promise { await http_account.logout_async(); clear_session_data(); if (typeof cb === "function") cb(); } async function call_api(): Promise { log_info("Getting profile data while checking session state"); try { const response = await http_account.get_profile_async(true); if (response.ok) { const userData = await response.json(); if (is_guid(userData.id) && userData.username) { const session = { profile: userData, lastChecked: Temporal.Now.instant().epochSeconds } as Session; session_storage_set_json(StorageKeys.session, session); log_info("Successfully got profile data while checking session state"); return true; } else { log_error("Api returned invalid data while getting profile data"); clear_session_data(); return false; } } else { log_error("Api returned unsuccessfully while getting profile data"); clear_session_data(); return false; } } catch (e) { log_error(e); clear_session_data(); return false; } } export function clear_session_data() { session_storage_set_json(StorageKeys.session, {}); log_info("Cleared session data."); } export function get_session_data(): Session { return session_storage_get_json(StorageKeys.session) as Session; }