Files
AtreidesAssetsFree/server/sessions.mjs
T
2026-10-29 11:57:29 +01:00

80 lines
2.0 KiB
JavaScript

// Generated, do not edit. sha256:267314982d9469bd348aa537982dfb5f7b94157d526aea6cbeeb8cefdfe06595
import { randomBytes } from 'node:crypto';
import { CONFIG } from '../shared/config.js';
const nieuwToken = () => randomBytes(32).toString('hex');
export function createSessionStore({ ttlMs = CONFIG.AUTH.SESSION_TTL_MS, now = Date.now } = {}) {
const sessies = new Map();
const verlopen = (aangemaakt) => now() - aangemaakt >= ttlMs;
return {
create() {
for (const [token, aangemaakt] of sessies) if (verlopen(aangemaakt)) sessies.delete(token);
const token = nieuwToken();
sessies.set(token, now());
return token;
},
isValid(token) {
if (typeof token !== 'string' || !token) return false;
const aangemaakt = sessies.get(token);
if (aangemaakt === undefined) return false;
if (verlopen(aangemaakt)) { sessies.delete(token); return false; }
return true;
},
drop(token) {
return sessies.delete(token);
},
size() {
return sessies.size;
},
};
}
export function createAttemptLimiter({
free = CONFIG.AUTH.LOGIN_ATTEMPTS.FREE,
baseLockMs = CONFIG.AUTH.LOGIN_ATTEMPTS.BASE_LOCK_MS,
maxLockMs = CONFIG.AUTH.LOGIN_ATTEMPTS.MAX_LOCK_MS,
now = Date.now,
} = {}) {
const pogingen = new Map();
const wachttijd = (missers) => {
if (missers <= free) return 0;
return Math.min(maxLockMs, baseLockMs * 2 ** (missers - free - 1));
};
return {
retryAfterMs(adres) {
const staat = pogingen.get(adres);
if (!staat) return 0;
const over = staat.laatste + wachttijd(staat.missers) - now();
if (over <= 0) {
if (over < -maxLockMs) pogingen.delete(adres);
return 0;
}
return over;
},
fail(adres) {
const staat = pogingen.get(adres) || { missers: 0, laatste: 0 };
staat.missers += 1;
staat.laatste = now();
pogingen.set(adres, staat);
return wachttijd(staat.missers);
},
succeed(adres) {
pogingen.delete(adres);
},
size() {
return pogingen.size;
},
};
}