From 26feb2bbf809bcbbeec63e9300225f7ab387b488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 26 Jun 2024 14:16:41 -0400 Subject: [PATCH] perf: cleanup sessions every 30 seconds instead of everytime addSession is called --- src/user/auth.js | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/user/auth.js b/src/user/auth.js index 0ce177f183..da1e0c80ed 100644 --- a/src/user/auth.js +++ b/src/user/auth.js @@ -2,6 +2,8 @@ const validator = require('validator'); const _ = require('lodash'); +const winston = require('winston'); +const cronJob = require('cron').CronJob; const db = require('../database'); const meta = require('../meta'); const events = require('../events'); @@ -11,6 +13,21 @@ const utils = require('../utils'); module.exports = function (User) { User.auth = {}; + const uidsToClean = Object.create(null); + + new cronJob('*/30 * * * * *', (async () => { + const uids = Object.keys(uidsToClean); + try { + await Promise.all(uids.map(async (uid) => { + await cleanExpiredSessions(uid); + await revokeSessionsAboveThreshold(uid); + delete uidsToClean[uid]; + })); + } catch (err) { + winston.error(err.stack); + } + }), null, true); + User.auth.logAttempt = async function (uid, ip) { if (!(parseInt(uid, 10) > 0)) { return; @@ -101,12 +118,12 @@ module.exports = function (User) { if (!(parseInt(uid, 10) > 0)) { return; } - await cleanExpiredSessions(uid); + const now = Date.now(); + uidsToClean[uid] = now; await Promise.all([ - db.sortedSetAdd(`uid:${uid}:sessions`, Date.now(), sessionId), + db.sortedSetAdd(`uid:${uid}:sessions`, now, sessionId), db.setObjectField(`uid:${uid}:sessionUUID:sessionId`, uuid, sessionId), ]); - await revokeSessionsAboveThreshold(uid); }; async function revokeSessionsAboveThreshold(uid) {