import { get_user, validate_session, } from '@/db/db'; import { deleteCookie, getCookie } from 'hono/cookie'; import { createMiddleware } from 'hono/factory'; import { InvalidSessionError, UserNotFoundError } from '@/lib/errors'; import { SESSION_TOKEN_DURATION_MS } from '@/lib/constants'; export const session_auth = createMiddleware(async (c, next) => { const session_cookie = getCookie(c, 'session'); if (!session_cookie) { return c.redirect("/login?error=UnauthorizedError"); } let session; try { session = await validate_session(session_cookie); } catch (e) { deleteCookie(c, 'session'); return c.redirect(`/login?error=${(e as Error).name}`); } if (!session || new Date(session.issued_at).getTime() + SESSION_TOKEN_DURATION_MS < Date.now()) { deleteCookie(c, 'session'); return c.redirect(`/login?error=${new InvalidSessionError().name}`); }; const user = await get_user(session.user_id!); if (!user) { deleteCookie(c, 'session'); return c.redirect(`/login?error=${new UserNotFoundError().name}`); } delete (user as any).password; // remove password field c.set('user', user); // accessable from c.get('user'); await next(); });