import {logError, logInfo} from "$lib/logger"; import { Temporal } from "temporal-polyfill"; import { get_profile_for_active_check, logout } 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 "$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(); logInfo("Session data is not valid"); } return sessionIsValid; } } export async function end_session(cb: Function): Promise { await logout(); clear_session_data(); cb(); } async function call_api(): Promise { logInfo("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); logInfo("Successfully got profile data while checking session state"); return true; } else { logError("Api returned invalid data while getting profile data"); clear_session_data(); return false; } } else { logError("Api returned unsuccessfully while getting profile data"); clear_session_data(); return false; } } catch (e) { logError(e); clear_session_data(); return false; } } export function clear_session_data() { session_storage_set_json(StorageKeys.session, {}); logInfo("Cleared session data."); } export function get_session_data(): ISession { return session_storage_get_json(StorageKeys.session) as ISession; }