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}