Files
DLE/backend/config/session.js
2026-03-01 22:03:48 +03:00

72 lines
2.3 KiB
JavaScript

/**
* Copyright (c) 2024-2026 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
const session = require('express-session');
const pgSession = require('connect-pg-simple')(session);
const db = require('../db');
const crypto = require('crypto');
let onPoolChangeCallback = null;
function setPoolChangeCallback(cb) {
onPoolChangeCallback = cb;
}
let sessionMiddleware = createSessionMiddleware();
function createSessionMiddleware() {
const isProduction = process.env.NODE_ENV === 'production';
return session({
store: new pgSession({
pool: db.getPool(),
tableName: 'session',
// Обработка ошибок подключения к БД для сессий
errorLog: (err) => {
// Логируем только как предупреждение, не как критическую ошибку
// Таймауты подключения - это нормальная ситуация при перегрузке
if (err && err.message && err.message.includes('timeout exceeded')) {
console.warn('[session] Timeout подключения к БД для сессии (не критично):', err.message);
} else if (err) {
console.error('[session] Ошибка подключения к БД для сессии:', err.message);
}
},
}),
secret: process.env.SESSION_SECRET || crypto.randomBytes(32).toString('hex'),
name: 'sessionId',
resave: true,
saveUninitialized: false,
cookie: {
maxAge: 30 * 24 * 60 * 60 * 1000,
httpOnly: true,
secure: false, // false для локального Docker (HTTP)
sameSite: 'lax', // lax для локального Docker
path: '/',
},
});
}
function reloadSessionMiddleware() {
sessionMiddleware = createSessionMiddleware();
if (onPoolChangeCallback) {
onPoolChangeCallback();
}
}
module.exports = {
get sessionMiddleware() {
return sessionMiddleware;
},
reloadSessionMiddleware,
setPoolChangeCallback,
};