From 2ea7db5154915f3e29a18d917a338a8db090daa7 Mon Sep 17 00:00:00 2001 From: Andrew Besedin Date: Thu, 19 Feb 2026 13:42:54 +0300 Subject: [PATCH] update: add auth messages clean service for periodic expired auth messages clean --- src/models/AuthMessages.ts | 16 +++++++++- src/server.ts | 2 ++ src/workers/authMessagesCleanService.ts | 41 +++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/workers/authMessagesCleanService.ts diff --git a/src/models/AuthMessages.ts b/src/models/AuthMessages.ts index a4b4922..0cbee63 100644 --- a/src/models/AuthMessages.ts +++ b/src/models/AuthMessages.ts @@ -1,4 +1,4 @@ -import { Transaction } from 'sequelize'; +import { Op, Transaction } from 'sequelize'; import AuthMessage from '@/schemes/AuthMessage'; @@ -68,6 +68,20 @@ class AuthMessagesModel { transaction, }); }; + + deleteAllExpired = async ( + { now }: { now: Date }, + { transaction }: { transaction?: Transaction } = {}, + ): Promise => { + await AuthMessage.destroy({ + where: { + expires_at: { + [Op.lt]: now, + }, + }, + transaction, + }); + }; } const authMessagesModel = new AuthMessagesModel(); diff --git a/src/server.ts b/src/server.ts index 4c20936..2c5ba0e 100644 --- a/src/server.ts +++ b/src/server.ts @@ -3,6 +3,7 @@ import express from 'express'; import http from 'http'; import { Server } from 'socket.io'; +import authMessagesCleanService from '@/workers/authMessagesCleanService'; import authRouter from './routes/auth.router'; import offersRouter from './routes/offers.router'; import userRouter from './routes/user.router'; @@ -73,6 +74,7 @@ process.on('unhandledRejection', (reason, promise) => { assetsUpdateChecker.run(); ordersModerationService.run(); + authMessagesCleanService.run(); exchangeModel.runPairStatsDaemon(); statsModel.init(); diff --git a/src/workers/authMessagesCleanService.ts b/src/workers/authMessagesCleanService.ts new file mode 100644 index 0000000..aa26c9a --- /dev/null +++ b/src/workers/authMessagesCleanService.ts @@ -0,0 +1,41 @@ +import authMessagesModel from '@/models/AuthMessages'; + +const CLEAN_INTERVAL = 60 * 60 * 1000; // 1 hour + +class AuthMessagesCleanService { + run = async () => { + console.log( + `Auth messages clean service is running. Cleaning interval: ${CLEAN_INTERVAL / 1000} sec.`, + ); + + async function clean() { + console.log(`[${new Date()}] Cleaning auth messages...`); + + await authMessagesModel.deleteAllExpired({ now: new Date() }); + + console.log(`[${new Date()}] Auth messages cleaned.`); + } + + // eslint-disable-next-line no-constant-condition + while (true) { + try { + await clean(); + } catch (error) { + console.log( + `[${new Date()}] Error while cleaning auth messages. Continuing on next iteration. Error:`, + ); + console.error(error); + } + + console.log( + `[${new Date()}] Auth messages cleaned. Next cleaning in ${CLEAN_INTERVAL / 1000} sec.`, + ); + + await new Promise((resolve) => setTimeout(resolve, CLEAN_INTERVAL)); + } + }; +} + +const authMessagesCleanService = new AuthMessagesCleanService(); + +export default authMessagesCleanService;