import { cookies } from "next/headers"; import { SignJWT, jwtVerify } from "jose"; export const SESSION_COOKIE_NAME = "session"; const secret = new TextEncoder().encode( process.env.SESSION_SECRET ?? "dev-insecure-secret-change-me-in-production", ); export interface SessionPayload { sub: string; username: string; } export async function createSessionToken(payload: SessionPayload): Promise { return new SignJWT({ username: payload.username }) .setProtectedHeader({ alg: "HS256" }) .setSubject(payload.sub) .setIssuedAt() .setExpirationTime("30d") .sign(secret); } export async function verifySessionToken(token: string): Promise { try { const { payload } = await jwtVerify(token, secret); if (typeof payload.sub !== "string" || typeof payload.username !== "string") return null; return { sub: payload.sub, username: payload.username }; } catch { return null; } } /** Server Component helper — reads and verifies the session cookie. */ export async function getSession(): Promise { const jar = await cookies(); const token = jar.get(SESSION_COOKIE_NAME)?.value; if (!token) return null; return verifySessionToken(token); }