File size: 1,441 Bytes
9a92a42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { createClient, RedisClientType } from 'redis';
import { REDIS_URL } from '../config/env.config';

let redisClient: RedisClientType;

export async function initializeRedis() {
  redisClient = createClient({
    url: REDIS_URL || 'redis://localhost:6379',
    socket: {
      reconnectStrategy: (retries) => {
        if (retries > 10) return new Error('Redis reconnect limit exceeded');
        return Math.min(retries * 100, 3000);
      }
    }
  });

  redisClient.on('error', (err) => console.error('Redis Client Error', err));
  redisClient.on('connect', () => console.log('Redis Client Connected'));
  redisClient.on('reconnecting', () => console.log('Redis Client Reconnecting...'));
  redisClient.on('ready', () => console.log('Redis Client Ready'));
  redisClient.on('end', () => console.log('Redis Client Connection Ended'));

  await redisClient.connect();
  return redisClient;
}

export async function getRedisClient(): Promise<RedisClientType> {
  if (!redisClient) {
    throw new Error('Redis client not initialized');
  }

  // Check if client is ready, if not try to reconnect
  if (!redisClient.isReady) {
    console.log('Redis client not ready, attempting to reconnect...');
    try {
      await redisClient.connect();
    } catch (err) {
      console.error('Failed to reconnect Redis client:', err);
      throw new Error('Redis client is not ready and reconnection failed');
    }
  }

  return redisClient;
}