Scratch space for learning atproto app development
1'use server'
2
3import assert from 'node:assert'
4import type { IncomingMessage, ServerResponse } from 'node:http'
5import { getIronSession } from 'iron-session'
6import { env } from '#/env'
7
8export type Session = { did: string }
9
10export async function createSession(req: IncomingMessage, res: ServerResponse<IncomingMessage>, did: string) {
11 const session = await getSessionRaw(req, res)
12 assert(!session.did, 'session already exists')
13 session.did = did
14 await session.save()
15 return { did: session.did }
16}
17
18export async function destroySession(req: IncomingMessage, res: ServerResponse<IncomingMessage>) {
19 const session = await getSessionRaw(req, res)
20 await session.destroy()
21 return null
22}
23
24export async function getSession(req: IncomingMessage, res: ServerResponse<IncomingMessage>) {
25 const session = await getSessionRaw(req, res)
26 if (!session.did) return null
27 return { did: session.did }
28}
29
30async function getSessionRaw(req: IncomingMessage, res: ServerResponse<IncomingMessage>) {
31 return await getIronSession<Session>(req, res, {
32 cookieName: 'sid',
33 password: env.COOKIE_SECRET,
34 })
35}