// /**
//  * 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 redisClient = null;
 
//  let provider = Container.get(RedisConfigProvider);
//  if (provider) init_redis();
 
//  async function init_redis() {
//      try {
//          let config = await provider.getRedisConfig();
 
//          redisClient = new IORedis(Object.assign({
//              /**
//                  https://www.npmjs.com/package/ioredis
//                  默认情况下，每重试 20 次，所有挂起的命令都会被刷新并显示一个错误。这样可以确保在连接断开时命令不会永远等待。
//                  将 maxRetriesPerRequest 设置null为禁用此行为，并且每个命令将永远等待，直到连接再次处于活动状态（这是 ioredis v4 之前的默认行为）。
//               */
//              maxRetriesPerRequest: 1,
//              //懒连接
//              lazyConnect: true,
//              //关闭离线队列
//              enableOfflineQueue: false
//          }, config));
 
//          redisClient.on("error", error => {
//              if (error.code === 'ECONNREFUSED') {
//                  throttle1(() => { logger.error(`redis`, error); });
//              } else {
//                  logger.error(`redis`, error);
//              }
//          });
 
//          logger.error('redis初始化成功');
//      } catch (error) {
//          logger.error('redis初始化失败', error);
//      }
//  }
 
 
 
 
 
 
 
 
 
 
 
 /**
  * ioredis客户端模块
  * @date 2022-03
  * @author 何华东
  */
 
 import { logger } from "mslib";
 import { Container } from "typescript-ioc";
 import Contants from "./Contants";
 const IORedis = require("ioredis");
 
 /**
  * redis客户端实例
  * 
  * 模块被加载时，从ioc读取配置config.ioredis并自动创建该实例，如果未配置则为空
  * 
  * 当开启国际化&场端环境（process.env['SUB_NODE_ENV']=PARK）&redis未配置密码时，会自动从sqlite读取redis密码
  * 
  * 默认配置为关闭离线队列，延迟连接(懒连接)，如果确定项目会使用redis，需要关闭延迟连接，否则第一次调用会抛出异常
  * 
  * 具体配置参考官方文档
  * 
  * https://www.npmjs.com/package/ioredis
  */
 export let redisClient = null;
 
 let config = Container.getValue('config.ioredis');
 logger.info(`redis config:${JSON.stringify(config)}`);
 if (config) init_redis();
 
 async function init_redis() {
     let redis_pwd;
 
     let global_config = Container.getValue('config.global');
 
     //场端环境自动从sqlite读取redis密码
     if (global_config?.enabled === true && Contants.IS_PARK && !config.password) {
         try {
             const knexInstance = require('knex')({
                 client: 'sqlite3',
                 connection: {
                     filename: "/home/keytop/data/lotconfig.db"
                 }
             });
 
             let configs = await knexInstance('t_config').where({ session: 'redis', name: 'password' });
             if (configs && configs.length > 0 && configs[0].value) redis_pwd = configs[0]?.value;
 
             logger.info(`从sqlite读取redis密码成功,${!redis_pwd ? '未设置密码' : '******'}`);
         } catch (error) {
             logger.error('从sqlite读取redis密码失败', error);
         }
     }
 
     redisClient = new IORedis(Object.assign({
         /**
             https://www.npmjs.com/package/ioredis
             默认情况下，每重试 20 次，所有挂起的命令都会被刷新并显示一个错误。这样可以确保在连接断开时命令不会永远等待。
             将 maxRetriesPerRequest 设置null为禁用此行为，并且每个命令将永远等待，直到连接再次处于活动状态（这是 ioredis v4 之前的默认行为）。
          */
         maxRetriesPerRequest: 0,
         //懒连接
         lazyConnect: true,
         //关闭离线队列
         enableOfflineQueue: false
     }, redis_pwd ? { password: redis_pwd } : {}, config));
 
     redisClient.on("error", error => {
         //服务器连接失败,会频繁触发异常
         if (error.code === 'ECONNREFUSED') return;
         logger.error(`redis`, error);
     });
 }