at main 1.4 kB view raw
1import { globalCookieStore, env } from './env' 2import { getIronSession } from 'iron-session' 3import { cookies } from 'next/headers' 4 5export interface Session { 6 did?: string 7} 8 9const sessionOptions = { 10 cookieName: 'sid', 11 password: env.COOKIE_SECRET, 12} 13 14export async function getSession(): Promise<Session> { 15 const cookieStore = await cookies() 16 const session = await getIronSession<Session>(cookieStore, sessionOptions) 17 18 if (!session.did) { 19 const globalDid = globalCookieStore.get('session_did') 20 if (globalDid) { 21 session.did = globalDid 22 const updatedSession = await getIronSession<Session>(cookieStore, sessionOptions) 23 updatedSession.did = globalDid 24 await updatedSession.save() 25 } 26 } else { 27 globalCookieStore.set('session_did', session.did) 28 } 29 30 return session 31} 32 33export async function setSession(session: Session): Promise<void> { 34 const cookieStore = await cookies() 35 const ironSession = await getIronSession<Session>(cookieStore, sessionOptions) 36 37 ironSession.did = session.did 38 await ironSession.save() 39 40 if (session.did) { 41 globalCookieStore.set('session_did', session.did) 42 } 43} 44 45export async function clearSession(): Promise<void> { 46 const cookieStore = await cookies() 47 const ironSession = await getIronSession<Session>(cookieStore, sessionOptions) 48 49 ironSession.did = undefined 50 await ironSession.save() 51 52 globalCookieStore.delete('session_did') 53}