/**
 * 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);
//      });
//  }