/**
 * ioredis客户端模块
 * @date 2022-03
 * @author 何华东
 */

import { logger } from "mslib";
import { Container } from "typescript-ioc";
import { RedisConfigProvider } from "./Config";
import { throttle1 } from "./Utils";
const IORedis = require("ioredis");

export let ioredisClient = null;

let provider = Container.get(RedisConfigProvider);
if (!provider) init_ioredis();

async function init_ioredis() {
    try {
        let config = await provider.getRedisConfig();

        ioredisClient = new IORedis(Object.assign({
            /**
                https://www.npmjs.com/package/ioredis
                默认情况下，每重试 20 次，所有挂起的命令都会被刷新并显示一个错误。这样可以确保在连接断开时命令不会永远等待。
                将 maxRetriesPerRequest 设置null为禁用此行为，并且每个命令将永远等待，直到连接再次处于活动状态（这是 ioredis v4 之前的默认行为）。
             */
            maxRetriesPerRequest: 1,
            //懒连接
            lazyConnect: true,
            //关闭离线队列
            enableOfflineQueue: false
        }, config));

        ioredisClient.on("error", error => {
            if (error.code === 'ECONNREFUSED') {
                throttle1(() => { logger.error(`redis`, error); });
            } else {
                logger.error(`redis`, error);
            }
        });

        logger.error('ioredis初始化成功');
    } catch (error) {
        logger.error('ioredis初始化失败', error);
    }
}