import type { Cookies } from "@sveltejs/kit"; import { SessionApp, type Session } from "./sessions"; import { UserApp, type User } from "./users"; import { JoseApp } from "$lib/server/utils/jtw-utils"; import { logger } from "$lib/server/utils/logger"; import { SESSION_COOKIE_NAME } from "$lib/shared/constants"; export class AppData { public session: Session public user: User public constructor( session: Session, user: User ) { this.session = session this.user = user } public async toCookie() { const signedSession = await JoseApp.signObject({token: this.session.sessionToken}) const encodedSession = btoa(signedSession) return encodedSession } public static async extractAppDataFromCookies(cookies: Cookies) { const encodedSessionToken = cookies.get(SESSION_COOKIE_NAME) logger.debug(`Session Cookie: ${encodedSessionToken}`, "APP Session Building 1") if (!encodedSessionToken) { return null } const decodedSessionToken = atob(encodedSessionToken) logger.debug(`Session Cookie: ${decodedSessionToken}`, "APP Session Building 2") const candidateToken = (await JoseApp.verifyObject(decodedSessionToken)) if (!candidateToken) { cookies.delete(SESSION_COOKIE_NAME, { path: "/" }) return null } const sessionToken : string = candidateToken.token logger.debug(`Session Token: ${sessionToken}`, "APP Session Building 3") const session = SessionApp.getSessionFromToken(sessionToken) if (!session) { return null } const user = UserApp.getUserFromSession( session ) return new AppData( session, user ) } public toString() { return `User:\t${this.user}\nSession:\t${this.session}` } }