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

import { logger } from "mslib";
import Contants from "./Contants";
const IORedis = require("ioredis");

/**
 * 测试环境配置
 */
const test_config = {
    host: 'r-bp1qmwd11yi1ujmfbq.redis.rds.aliyuncs.com',
    port: 6379,
    password: 'Keytop123',
    database: 50
};

/**
 * 正式环境配置
 */
const prod_config = {
    host: 'r-bp117e21a00ae2e4.redis.rds.aliyuncs.com',
    port: 6379,
    password: 'Keytop123',
    database: 111
};

/**
 * 默认配置，插件默认连接本机配置，可以不用配
 */
let defaults = {};

export let config = null;

if (Contants.IS_PROD) config = prod_config;
else if (Contants.IS_LOCAL_DEBUG) config = defaults;
else if (Contants.IS_TEST || Contants.IS_DEBUG) config = test_config;
else config = defaults;

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

    /**
        当 Redis 无法处理命令时（在ready事件之前发送），默认情况下将其添加到离线队列中，当它可以处理时执行。
        enableOfflineQueue 您可以通过将选项设置为来禁用此功能false
     */
    enableOfflineQueue: false
});

/**
 * redis客户端实例,基于ioredis插件
 */
export const redisClient = new IORedis(config);

redisClient.on("error", error => {
    //服务器连接失败,会频繁触发异常
    if (error.code === 'ECONNREFUSED') return;

    logger.error(error);
});