import { type Session, type SessionData } from "express-session"; import type { Empty, ProcDecoratorGenerator } from "./base.js"; export type SessionCtx = { session: { clear: () => Promise; removeItem: (key: string) => boolean; getItem: (key: string) => T | undefined; setItem: (key: string, value: unknown) => void; raw: Session & Partial & Record; } } export function StartSession(): ProcDecoratorGenerator { return (inCtx, req) => { if (!req.session) { throw 'Express-session required'; } const sessionObj = { raw: req.session } as SessionCtx['session']; sessionObj.clear = () => { return new Promise((resolve) => { sessionObj.raw = req.session.regenerate(resolve) as SessionCtx['session']['raw']; }) } sessionObj.removeItem = (key: string): boolean => { if (key in sessionObj.raw) { delete sessionObj.raw[key]; return true; } return false; } sessionObj.getItem = (key: string): T | undefined => { if (!(key in sessionObj.raw)) { return undefined; } return sessionObj.raw[key] as T; } sessionObj.setItem = (key: string, value: T | undefined): void => { if (value === undefined) { sessionObj.removeItem(key); return; } sessionObj.raw[key] = value; } return [ { result: true, }, { session: sessionObj, ...inCtx, } ] } }