import type { AstroCookies } from 'astro' export type SessionData = { did?: string } const COOKIE_NAME = 'sid' // Simple cookie-based session using Web Crypto API export class Session { private data: SessionData = {} private cookies: AstroCookies constructor(cookies: AstroCookies, data: SessionData = {}) { this.cookies = cookies this.data = data } get did() { return this.data.did } set did(value: string | undefined) { this.data.did = value } async save() { const jsonData = JSON.stringify(this.data) // For simplicity, we'll just base64 encode the data // In production, you'd want proper encryption const encoded = btoa(jsonData) this.cookies.set(COOKIE_NAME, encoded, { httpOnly: true, secure: false, sameSite: 'lax', path: '/', maxAge: 60 * 60 * 24 * 30, // 30 days }) } destroy() { this.data = {} this.cookies.delete(COOKIE_NAME, { path: '/' }) } } export function getSession(cookies: AstroCookies): Session { const cookie = cookies.get(COOKIE_NAME) if (!cookie?.value) { return new Session(cookies) } try { const decoded = atob(cookie.value) const data = JSON.parse(decoded) as SessionData return new Session(cookies, data) } catch (err) { console.warn('Failed to decode session:', err) return new Session(cookies) } }