import { SignJWT, jwtVerify } from 'jose' import { cookies } from 'next/headers' import { NextRequest, NextResponse } from 'next/server' const secretKey = process.env.JWT_SECRET || 'fallback-secret-key-do-not-use-in-prod' const key = new TextEncoder().encode(secretKey) export async function encrypt(payload: any) { return await new SignJWT(payload) .setProtectedHeader({ alg: 'HS256' }) .setIssuedAt() .setExpirationTime('24h') .sign(key) } export async function decrypt(input: string): Promise { const { payload } = await jwtVerify(input, key, { algorithms: ['HS256'], }) return payload } export async function login(username: string) { // Create the session const expires = new Date(Date.now() + 24 * 60 * 60 * 1000) const session = await encrypt({ username, expires }) // Save the session in a cookie const cookieStore = await cookies() cookieStore.set('session', session, { expires, httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'lax', path: '/', }) } export async function logout() { const cookieStore = await cookies() cookieStore.set('session', '', { expires: new Date(0), path: '/', }) } export async function getSession() { const cookieStore = await cookies() const session = cookieStore.get('session')?.value if (!session) return null try { return await decrypt(session) } catch (error) { return null } } export async function updateSession(request: NextRequest) { const session = request.cookies.get('session')?.value if (!session) return null try { const parsed = await decrypt(session) parsed.expires = new Date(Date.now() + 24 * 60 * 60 * 1000) const res = NextResponse.next() res.cookies.set({ name: 'session', value: await encrypt(parsed), httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'lax', path: '/', expires: parsed.expires, }) return res } catch (error) { return null } }