aboutsummaryrefslogtreecommitdiffstats
path: root/apps/kit/src/lib/session.ts
blob: ee79933c91289f33d93a05ee79cb7cb9e3ee2f00 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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<boolean> {
    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<void> {
    await logout();
    clear_session_data();
    cb();
}

async function call_api(): Promise<boolean> {
    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;
}