fixed bugs

This commit is contained in:
AmirHossein Mahmoodi
2025-05-27 14:45:58 +03:30
parent e17c7b899c
commit c5d7b565a8
4 changed files with 39 additions and 7 deletions

View File

@@ -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 {}

View File

@@ -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<boolean> {
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;
}

View File

@@ -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;

View File

@@ -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);