UNPKG

@kohanajs/mod-session

Version:
73 lines (56 loc) 1.87 kB
const { ORM, KohanaJS } = require('kohanajs'); const { randomUUID } = require('node:crypto'); const Session = ORM.require('Session'); const HelperCrypto = KohanaJS.require('helper/Crypto'); class HelperSession { static async read(request, database, options) { const config = { ...KohanaJS.config.session, ...options }; const signedSessionID = request.cookies[config.name]; if (!signedSessionID) { HelperSession.create(request); return; } const seg = signedSessionID.split('.'); const sid = seg[0]; const sign = seg[1]; const verify = await HelperCrypto.verify(config.secret, sign, sid); if (!verify) { HelperSession.create(request); return; } const model = await ORM.readBy(Session, 'sid', [sid], { database }); // sid not in database, create new session. if (!model?.id) { HelperSession.create(request); return; } request.session = { id: model.id, sid: model.sid, ...JSON.parse(model.sess) }; } static create(request) { request.session = { id: null, sid: randomUUID(), }; } static async write(request, cookies, database, options) { const config = { ...KohanaJS.config.session, ...options }; const cookieConfig = config.cookie; const { secret } = config; const model = new Session(request.session.id, { database }); const data = { ...request.session }; model.sid = data.sid; delete data.sid; delete data.id; model.expired = Date.now() + (cookieConfig.maxAge ?? 43200000); model.sess = JSON.stringify(data); await model.write(); const sign = await HelperCrypto.sign(secret, model.sid); const cookieName = `${model.sid}.${sign}`; cookies.push({ name: config.name, value: cookieName, options: cookieConfig, }); } } module.exports = HelperSession;