< Summary

Information
Class: session.server.ts
Assembly: app.lib
File(s): /home/runner/work/ClutterStock/ClutterStock/frontend/app/lib/session.server.ts
Tag: 58_25416222083
Line coverage
8%
Covered lines: 2
Uncovered lines: 22
Coverable lines: 24
Total lines: 60
Line coverage: 8.3%
Branch coverage
0%
Covered branches: 0
Total branches: 8
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/ClutterStock/ClutterStock/frontend/app/lib/session.server.ts

#LineLine coverage
 1import type { ToastInput } from "~/lib/toasts";
 2import { redis } from "./redis.server";
 3
 4export interface SessionUser {
 5  sub: string;
 6  name?: string;
 7  preferred_username?: string;
 8  email?: string;
 9  groups?: string[] | null;
 10}
 11
 12export interface Session {
 13  accessToken: string;
 14  refreshToken: string;
 15  expiresAt: number; // Unix seconds
 16  idToken: string;
 17  user: SessionUser;
 18  flashes?: ToastInput[];
 19}
 20
 221const COOKIE = "clutterstock_sid";
 222const TTL = 7 * 24 * 60 * 60; // 7 days
 23
 024export function getSid(request: Request): string | undefined {
 025  const cookie = request.headers.get("cookie") ?? "";
 026  return /(?:^|;\s*)clutterstock_sid=([^;]+)/.exec(cookie)?.[1];
 27}
 28
 029export async function getSession(
 30  request: Request,
 31): Promise<{ sid: string; data: Session } | null> {
 032  const sid = getSid(request);
 033  if (!sid) return null;
 034  const raw = await redis().get(`session:${sid}`);
 035  if (!raw) return null;
 036  return { sid, data: JSON.parse(raw) as Session };
 37}
 38
 039export async function createSession(data: Session): Promise<string> {
 040  const sid = crypto.randomUUID();
 041  await redis().set(`session:${sid}`, JSON.stringify(data), { EX: TTL });
 042  return sid;
 43}
 44
 045export async function updateSession(sid: string, data: Session): Promise<void> {
 046  const ttl = await redis().ttl(`session:${sid}`);
 047  await redis().set(`session:${sid}`, JSON.stringify(data), { EX: ttl > 0 ? ttl : TTL });
 48}
 49
 050export async function destroySession(sid: string): Promise<void> {
 051  await redis().del(`session:${sid}`);
 52}
 53
 054export function sessionCookie(sid: string): string {
 055  return `${COOKIE}=${sid}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${TTL}`;
 56}
 57
 058export function clearCookie(): string {
 059  return `${COOKIE}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`;
 60}