From c5d7b565a88583251526cbdb97ece8b46f8d7fe5 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Tue, 27 May 2025 14:45:58 +0330 Subject: [PATCH] fixed bugs --- src/app.module.ts | 2 +- src/redis/redis.service.ts | 17 +++++++++++++++-- src/socket/socket.gateway.ts | 4 ++++ src/socket/socket.service.ts | 23 +++++++++++++++++++---- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index c6136f4..e357534 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -19,9 +19,9 @@ import { RedisModule } from './redis/redis.module'; entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: process.env.DB_SYNC === 'true', }), + RedisModule, SocketModule, NotificationModule, - RedisModule, ], }) export class AppModule {} diff --git a/src/redis/redis.service.ts b/src/redis/redis.service.ts index e30d4c7..44fca1e 100644 --- a/src/redis/redis.service.ts +++ b/src/redis/redis.service.ts @@ -1,8 +1,9 @@ -import { Injectable, OnModuleInit } from '@nestjs/common'; +import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { createClient, RedisClientType } from 'redis'; @Injectable() export class RedisService implements OnModuleInit { + private readonly logger = new Logger(RedisService.name); private client: RedisClientType; async onModuleInit() { @@ -10,10 +11,22 @@ export class RedisService implements OnModuleInit { url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`, }); - this.client.on('error', (err) => console.error('Redis Error:', err)); + this.client.on('ready', () => this.logger.log('Redis is ready!')); + this.client.on('error', (err) => + this.logger.error('Redis Error:', err.message || err), + ); await this.client.connect(); } + async waitForReady(retries = 10, interval = 200): Promise { + for (let i = 0; i < retries; i++) { + if (this.client?.isOpen) return true; + await new Promise((res) => setTimeout(res, interval)); + } + + return false; + } + getClient() { return this.client; } diff --git a/src/socket/socket.gateway.ts b/src/socket/socket.gateway.ts index 90d226d..fec7264 100644 --- a/src/socket/socket.gateway.ts +++ b/src/socket/socket.gateway.ts @@ -20,6 +20,10 @@ export class SocketGateway implements OnGatewayConnection { constructor(private socketService: SocketService) {} + async afterInit() { + await this.socketService.clearAllOnlineClients(); + } + async handleConnection(client: Socket) { const token: ClientToken = client.handshake.auth.token; diff --git a/src/socket/socket.service.ts b/src/socket/socket.service.ts index 0b93d40..3897a7a 100644 --- a/src/socket/socket.service.ts +++ b/src/socket/socket.service.ts @@ -24,6 +24,25 @@ export class SocketService { private readonly redisService: RedisService, ) {} + async clearAllOnlineClients() { + const ready = await this.redisService.waitForReady(); + + if (!ready) { + this.logger.warn('Redis is not ready after retries. Skipping cleanup.'); + return; + } + + const client = this.redisService.getClient(); + const keys = await client.keys('online_clients:*'); + for (const key of keys) { + await client.del(key); + } + + this.logger.log( + `🧹 Cleared ${keys.length} online client records from Redis.`, + ); + } + private getRedisKey(token: ClientToken): string { return `online_clients:${token.user_id}-${token.telephone_id}`; } @@ -87,10 +106,6 @@ export class SocketService { }; } - getClientKey(token: ClientToken): string { - return `${token.user_id}-${token.telephone_id}`; - } - async addOnlineClient(token: any, socketId: string) { const client = this.redisService.getClient(); const key = this.getRedisKey(token);