| import { cookies } from 'next/headers'
|
|
|
| export interface AnonymousSession {
|
| codeId: string
|
| sessionHash: string
|
| roomId?: string
|
| expiresAt: number
|
| }
|
|
|
| const SESSION_COOKIE_NAME = 'letschat_anonymous_session'
|
| const DEFAULT_SESSION_DURATION = 30 * 24 * 60 * 60 * 1000
|
|
|
| export async function setAnonymousSession(session: AnonymousSession) {
|
|
|
|
|
|
|
|
|
| const cookieStore = await cookies() as any
|
|
|
| const effectiveExpiresAt = session.expiresAt || (Date.now() + DEFAULT_SESSION_DURATION)
|
| const maxAgeSeconds = Math.max(1, Math.floor((effectiveExpiresAt - Date.now()) / 1000))
|
|
|
| cookieStore.set(SESSION_COOKIE_NAME, JSON.stringify({ ...session, expiresAt: effectiveExpiresAt }), {
|
| httpOnly: true,
|
| secure: process.env.NODE_ENV === 'production',
|
| sameSite: 'lax',
|
| maxAge: maxAgeSeconds,
|
| path: '/'
|
| })
|
| }
|
|
|
| export async function getAnonymousSession(): Promise<AnonymousSession | null> {
|
| try {
|
|
|
| const cookieStore = await cookies() as any
|
| const sessionCookie = cookieStore.get(SESSION_COOKIE_NAME)
|
|
|
| if (!sessionCookie?.value) {
|
| return null
|
| }
|
|
|
| const session: AnonymousSession = JSON.parse(sessionCookie.value)
|
|
|
|
|
| if (Date.now() > session.expiresAt) {
|
| await clearAnonymousSession()
|
| return null
|
| }
|
|
|
| return session
|
| } catch (error) {
|
| console.error('Error parsing anonymous session:', error)
|
| await clearAnonymousSession()
|
| return null
|
| }
|
| }
|
|
|
| export async function clearAnonymousSession() { |
| |
| const cookieStore = await cookies() as any |
| |
| if (typeof cookieStore.delete === 'function') { |
| cookieStore.delete(SESSION_COOKIE_NAME) |
| } else { |
| cookieStore.set(SESSION_COOKIE_NAME, '', { maxAge: 0, path: '/' }) |
| } |
| } |
|
|