import {Temporal} from "@js-temporal/polyfill"; import {get_profile_for_active_check} from "./api/user"; import {is_guid, session_storage_get_json, session_storage_set_json} from "./helpers"; import {SECONDS_BETWEEN_SESSION_CHECK, StorageKeys} from "./configuration"; import type {ISession} from "$shared/lib/models/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 ISession; 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(); console.log("Session data is not valid"); } return sessionIsValid; } } async function call_api(): Promise { console.log("Getting profile data while checking session state"); try { const response = await get_profile_for_active_check(); if (response.ok) { const userData = await response.data; if (is_guid(userData.id) && userData.username) { const session = { profile: userData, lastChecked: Temporal.Now.instant().epochSeconds } as ISession; session_storage_set_json(StorageKeys.session, session); console.log("Successfully got profile data while checking session state"); return true; } else { console.error("Api returned invalid data while getting profile data"); clear_session_data(); return false; } } else { console.error("Api returned unsuccessfully while getting profile data"); clear_session_data(); return false; } } catch (e) { console.error(e); clear_session_data(); return false; } } export function clear_session_data() { session_storage_set_json(StorageKeys.session, {}); console.log("Cleared session data."); } export function get_session_data(): ISession { return session_storage_get_json(StorageKeys.session) as ISession; }