UNPKG

@astro-utils/forms

Version:

Server component for Astro (call server functions from client side with validation and state management)

40 lines (39 loc) 1.28 kB
import { FORM_OPTIONS } from './settings.js'; import jwt from 'jsonwebtoken'; import cookie from 'cookie'; import { deepStrictEqual } from 'assert'; export class JWTSession { constructor(cookies) { this.cookies = cookies; this.lastData = {}; this.sessionData = {}; this.loadData(); } loadData() { const cookieContent = this.cookies.get(FORM_OPTIONS.session.cookieName)?.value; if (!cookieContent) return; try { this.sessionData = jwt.verify(cookieContent, FORM_OPTIONS.secret).session || {}; this.lastData = structuredClone(this.sessionData); } catch { } } save() { try { deepStrictEqual(this.sessionData, this.lastData); } catch { const token = jwt.sign({ session: this.sessionData }, FORM_OPTIONS.secret, { expiresIn: FORM_OPTIONS.session.cookieOptions.maxAge }); this.stringifyCookie = cookie.serialize(FORM_OPTIONS.session.cookieName, token, FORM_OPTIONS.session.cookieOptions); } } setCookieHeader(headers) { this.save(); if (this.stringifyCookie) { headers.set('Set-Cookie', this.stringifyCookie); } } }