Initial content
This commit is contained in:
+26
@@ -0,0 +1,26 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.MemoryRepository = void 0;
|
||||
const crypto_1 = require("crypto");
|
||||
class MemoryRepository {
|
||||
store = new Map();
|
||||
async createSession() {
|
||||
return { id: (0, crypto_1.randomUUID)(), data: {} };
|
||||
}
|
||||
async getSession(id) {
|
||||
const wrapper = this.store.get(id);
|
||||
if (wrapper && wrapper.expires > new Date(Date.now())) {
|
||||
return structuredClone(wrapper.session);
|
||||
}
|
||||
}
|
||||
async saveSession(session, expires) {
|
||||
this.store.set(session.id, { session, expires });
|
||||
}
|
||||
async touchSession(session, expires) {
|
||||
const wrapper = this.store.get(session.id);
|
||||
if (wrapper) {
|
||||
wrapper.expires = expires;
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.MemoryRepository = MemoryRepository;
|
||||
@@ -0,0 +1,34 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.customSessionMiddleware = void 0;
|
||||
//import { MemoryRepository } from "./memory_repository";
|
||||
const cookies_1 = require("../cookies");
|
||||
const orm_repository_1 = require("./orm_repository");
|
||||
const session_cookie_name = "custom_session";
|
||||
const expiry_seconds = 300;
|
||||
const getExpiryDate = () => new Date(Date.now() + (expiry_seconds * 1000));
|
||||
const customSessionMiddleware = () => {
|
||||
//const repo: SessionRepository = new MemoryRepository();
|
||||
const repo = new orm_repository_1.OrmRepository();
|
||||
return async (req, resp, next) => {
|
||||
const id = (0, cookies_1.getCookie)(req, session_cookie_name);
|
||||
const session = (id ? await repo.getSession(id) : undefined)
|
||||
?? await repo.createSession();
|
||||
req.session = session;
|
||||
(0, cookies_1.setCookie)(resp, session_cookie_name, session.id, {
|
||||
maxAge: expiry_seconds * 1000
|
||||
});
|
||||
resp.once("finish", async () => {
|
||||
if (Object.keys(session.data).length > 0) {
|
||||
if (req.method == "POST") {
|
||||
await repo.saveSession(session, getExpiryDate());
|
||||
}
|
||||
else {
|
||||
await repo.touchSession(session, getExpiryDate());
|
||||
}
|
||||
}
|
||||
});
|
||||
next();
|
||||
};
|
||||
};
|
||||
exports.customSessionMiddleware = customSessionMiddleware;
|
||||
@@ -0,0 +1,15 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.initializeModel = exports.SessionModel = void 0;
|
||||
const sequelize_1 = require("sequelize");
|
||||
class SessionModel extends sequelize_1.Model {
|
||||
}
|
||||
exports.SessionModel = SessionModel;
|
||||
const initializeModel = (sequelize) => {
|
||||
SessionModel.init({
|
||||
id: { type: sequelize_1.DataTypes.STRING, primaryKey: true },
|
||||
data: { type: sequelize_1.DataTypes.JSON },
|
||||
expires: { type: sequelize_1.DataTypes.DATE }
|
||||
}, { sequelize });
|
||||
};
|
||||
exports.initializeModel = initializeModel;
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.OrmRepository = void 0;
|
||||
const sequelize_1 = require("sequelize");
|
||||
const orm_models_1 = require("./orm_models");
|
||||
const crypto_1 = require("crypto");
|
||||
class OrmRepository {
|
||||
sequelize;
|
||||
constructor() {
|
||||
this.sequelize = new sequelize_1.Sequelize({
|
||||
dialect: "sqlite",
|
||||
storage: "orm_sessions.db",
|
||||
logging: console.log,
|
||||
logQueryParameters: true
|
||||
});
|
||||
this.initModelAndDatabase();
|
||||
}
|
||||
async initModelAndDatabase() {
|
||||
(0, orm_models_1.initializeModel)(this.sequelize);
|
||||
await this.sequelize.drop();
|
||||
await this.sequelize.sync();
|
||||
}
|
||||
async createSession() {
|
||||
return { id: (0, crypto_1.randomUUID)(), data: {} };
|
||||
}
|
||||
async getSession(id) {
|
||||
const dbsession = await orm_models_1.SessionModel.findOne({
|
||||
where: { id, expires: { [sequelize_1.Op.gt]: new Date(Date.now()) } }
|
||||
});
|
||||
if (dbsession) {
|
||||
return { id, data: dbsession.data };
|
||||
}
|
||||
}
|
||||
async saveSession(session, expires) {
|
||||
await orm_models_1.SessionModel.upsert({
|
||||
id: session.id,
|
||||
data: session.data,
|
||||
expires
|
||||
});
|
||||
}
|
||||
async touchSession(session, expires) {
|
||||
await orm_models_1.SessionModel.update({ expires }, { where: { id: session.id } });
|
||||
}
|
||||
}
|
||||
exports.OrmRepository = OrmRepository;
|
||||
@@ -0,0 +1,2 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.sessionMiddleware = exports.getSession = void 0;
|
||||
//import { Session } from "./repository";
|
||||
const express_session_1 = __importDefault(require("express-session"));
|
||||
const connect_session_sequelize_1 = __importDefault(require("connect-session-sequelize"));
|
||||
const sequelize_1 = require("sequelize");
|
||||
const getSession = (req) => req.session;
|
||||
exports.getSession = getSession;
|
||||
const sessionMiddleware = () => {
|
||||
const sequelize = new sequelize_1.Sequelize({
|
||||
dialect: "sqlite",
|
||||
storage: "pkg_sessions.db"
|
||||
});
|
||||
const store = new ((0, connect_session_sequelize_1.default)(express_session_1.default.Store))({
|
||||
db: sequelize
|
||||
});
|
||||
store.sync();
|
||||
return (0, express_session_1.default)({
|
||||
secret: "mysecret",
|
||||
store: store,
|
||||
cookie: { maxAge: 300 * 1000, sameSite: "strict" },
|
||||
resave: false, saveUninitialized: false
|
||||
});
|
||||
};
|
||||
exports.sessionMiddleware = sessionMiddleware;
|
||||
Reference in New Issue
Block a user