'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var json_jsonParse = require('../json/json-parse.js');

/**
 * 通过七彩石 SDK 拉取配置（适用于 Node.js 服务端）
 * 支持 v3Get 和 v3GetGroup 两种模式，内置内存缓存和文件缓存
 * @param {object} config 配置信息
 * @param {ISecretInfo} config.secretInfo 密钥信息，包含 appId、userId、secretKey、groupName、envName
 * @param {any} config.sdk 七彩石 SDK 实例（需包含 Rainbow、AccessType、AddrType）
 * @param {string} config.key 要获取的配置 key
 * @param {Record<string, any>} [config.initOptions] Rainbow 初始化额外选项
 * @param {boolean} [config.isFetchGroup=false] 是否使用 v3GetGroup 获取整组配置
 * @param {boolean} [config.tryJsonParse=true] 是否尝试 JSON.parse 解析返回值
 * @param {any} [config.rainbow] 外部传入的 Rainbow 实例（传入后不会自动 exit）
 * @returns {Promise<any>} 配置值
 * @example
 * ```ts
 * import * as sdk from 'rainbow-sdk';
 *
 * const config = await fetchRainbowConfigFromSdk({
 *   secretInfo: {
 *     appId: 'xxx',
 *     userId: 'xxx',
 *     secretKey: 'xxx',
 *     groupName: 'default',
 *     envName: 'prod',
 *   },
 *   sdk,
 *   key: 'my_config_key',
 * });
 * ```
 */
function fetchRainbowConfigFromSdk(_ref) {
  var secretInfo = _ref.secretInfo,
    sdk = _ref.sdk,
    initOptions = _ref.initOptions,
    key = _ref.key,
    _ref$isFetchGroup = _ref.isFetchGroup,
    isFetchGroup = _ref$isFetchGroup === void 0 ? false : _ref$isFetchGroup,
    _ref$tryJsonParse = _ref.tryJsonParse,
    tryJsonParse = _ref$tryJsonParse === void 0 ? true : _ref$tryJsonParse,
    rainbow = _ref.rainbow;
  return new Promise(function (resolve, reject) {
    var Rainbow = sdk.Rainbow,
      AccessType = sdk.AccessType,
      AddrType = sdk.AddrType;
    var httpOptions = Object.assign({
      accessType: AccessType.Default,
      // 一次性脚本时，防止 exit 不生效
      addrType: rainbow ? undefined : AddrType.Domain,
      // 0.4.0 及以上版本默认开启缓存
      // //【可选】使用内存缓存，无特殊情况都要开启。业务需严格按照规范打开本地内存缓存，保证当七彩石后端出现异常后，线上业务服务还可以正常运行。若用户强制关闭本地缓存，将实时强依赖七彩石，业务需自己做好兜底措施，否则会有风险隐患。
      isUsingLocalCache: true,
      // //【可选】使用文件缓存，无特殊情况都要开启。原因同上
      isUsingFileCache: true
    }, initOptions || {});
    var innerRainbow = rainbow || new Rainbow(httpOptions);
    var api = isFetchGroup ? 'v3GetGroup' : 'v3Get';
    innerRainbow[api]({
      appID: secretInfo.appId || secretInfo.appID,
      userID: secretInfo.userId || secretInfo.userID,
      secretKey: secretInfo.secretKey,
      group: secretInfo.groupName,
      envName: secretInfo.envName || 'Default'
    }, key).then(function (res) {
      if (tryJsonParse) {
        var result = json_jsonParse.safeJsonParse(res, res);
        resolve(result);
        return;
      }
      resolve(res);
    })["catch"](function (err) {
      reject(err);
    })["finally"](function () {
      var _a;
      if (!rainbow) {
        (_a = innerRainbow.exit) === null || _a === void 0 ? void 0 : _a.call(innerRainbow);
      }
    })["catch"](function () {});
  });
}

exports.fetchRainbowConfigFromSdk = fetchRainbowConfigFromSdk;
