@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
JavaScript
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);
}
}
}