services/redis.js

const { default: Redis } = require('ioredis');
const { setHealth } = require('./health');
const logger = require('../logger').child({ module: 'redis' });

let redis_instance = null;

/**
 * 
 * @returns {Redis | null}
 */
const startRedis = () => {
    if (!process.env.REDIS_URL) {
        return redis_instance;
    }
    setHealth('redis', 'wait');
    
    redis_instance = new Redis(process.env.REDIS_URL);

    redis_instance.on('connect', () => {
        logger.info('Redis is connected');
        setHealth('redis', 'connect');
    })

    redis_instance.on('ready', () => {
        logger.info('Redis is ready');
        setHealth('redis', 'ready');
    });

    redis_instance.on('error', error => {
        logger.error(`${error}`, { error: error.stack || error });
    });

    redis_instance.on('reconnecting', time_to => {
        logger.info(`Redis is reconnecting in ${time_to}`);
        setHealth('redis', 'reconnecting');
    });

    redis_instance.on('close', () => {
        logger.info('Redis connection closed');
        setHealth('redis', 'close');
    });

    redis_instance.on('end', () => {
        logger.info('Redis ends connection');
        setHealth('redis', 'off');
    });

    return redis_instance;
};

/**
 * 
 * @returns {Redis | null}
 */
const getRedis = () => redis_instance;

module.exports = {
    startRedis,
    getRedis
}