import EventEmitter from 'eventemitter3'
import axios from 'axios'

var request$1 = function (_a) {
  var _b = _a.method,
    method = _b === void 0 ? 'POST' : _b,
    url = _a.url,
    data = _a.data,
    headers = _a.headers
  return new Promise(function (resolve, reject) {
    uni.request({
      url: url,
      method: method,
      data: data,
      header: headers,
      success: function (res) {
        var data = res.data
        if (data.code !== 200) {
          return reject(data.msg)
        }
        resolve(data)
      },
      fail: function (err) {
        reject(err)
      },
    })
  })
}
var uniappRequestHelper = request$1

/******************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise, SuppressedError, Symbol */

var extendStatics = function (d, b) {
  extendStatics =
    Object.setPrototypeOf ||
    ({ __proto__: [] } instanceof Array &&
      function (d, b) {
        d.__proto__ = b
      }) ||
    function (d, b) {
      for (var p in b)
        if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]
    }
  return extendStatics(d, b)
}

function __extends(d, b) {
  if (typeof b !== 'function' && b !== null)
    throw new TypeError(
      'Class extends value ' + String(b) + ' is not a constructor or null'
    )
  extendStatics(d, b)
  function __() {
    this.constructor = d
  }
  d.prototype =
    b === null ? Object.create(b) : ((__.prototype = b.prototype), new __())
}

var __assign = function () {
  __assign =
    Object.assign ||
    function __assign(t) {
      for (var s, i = 1, n = arguments.length; i < n; i++) {
        s = arguments[i]
        for (var p in s)
          if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]
      }
      return t
    }
  return __assign.apply(this, arguments)
}

function __awaiter(thisArg, _arguments, P, generator) {
  function adopt(value) {
    return value instanceof P
      ? value
      : new P(function (resolve) {
          resolve(value)
        })
  }
  return new (P || (P = Promise))(function (resolve, reject) {
    function fulfilled(value) {
      try {
        step(generator.next(value))
      } catch (e) {
        reject(e)
      }
    }
    function rejected(value) {
      try {
        step(generator['throw'](value))
      } catch (e) {
        reject(e)
      }
    }
    function step(result) {
      result.done
        ? resolve(result.value)
        : adopt(result.value).then(fulfilled, rejected)
    }
    step((generator = generator.apply(thisArg, _arguments || [])).next())
  })
}

function __generator(thisArg, body) {
  var _ = {
      label: 0,
      sent: function () {
        if (t[0] & 1) throw t[1]
        return t[1]
      },
      trys: [],
      ops: [],
    },
    f,
    y,
    t,
    g
  return (
    (g = { next: verb(0), throw: verb(1), return: verb(2) }),
    typeof Symbol === 'function' &&
      (g[Symbol.iterator] = function () {
        return this
      }),
    g
  )
  function verb(n) {
    return function (v) {
      return step([n, v])
    }
  }
  function step(op) {
    if (f) throw new TypeError('Generator is already executing.')
    while ((g && ((g = 0), op[0] && (_ = 0)), _))
      try {
        if (
          ((f = 1),
          y &&
            (t =
              op[0] & 2
                ? y['return']
                : op[0]
                ? y['throw'] || ((t = y['return']) && t.call(y), 0)
                : y.next) &&
            !(t = t.call(y, op[1])).done)
        )
          return t
        if (((y = 0), t)) op = [op[0] & 2, t.value]
        switch (op[0]) {
          case 0:
          case 1:
            t = op
            break
          case 4:
            _.label++
            return { value: op[1], done: false }
          case 5:
            _.label++
            y = op[1]
            op = [0]
            continue
          case 7:
            op = _.ops.pop()
            _.trys.pop()
            continue
          default:
            if (
              !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) &&
              (op[0] === 6 || op[0] === 2)
            ) {
              _ = 0
              continue
            }
            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
              _.label = op[1]
              break
            }
            if (op[0] === 6 && _.label < t[1]) {
              _.label = t[1]
              t = op
              break
            }
            if (t && _.label < t[2]) {
              _.label = t[2]
              _.ops.push(op)
              break
            }
            if (t[2]) _.ops.pop()
            _.trys.pop()
            continue
        }
        op = body.call(thisArg, _)
      } catch (e) {
        op = [6, e]
        y = 0
      } finally {
        f = t = 0
      }
    if (op[0] & 5) throw op[1]
    return { value: op[0] ? op[1] : void 0, done: true }
  }
}

function __values(o) {
  var s = typeof Symbol === 'function' && Symbol.iterator,
    m = s && o[s],
    i = 0
  if (m) return m.call(o)
  if (o && typeof o.length === 'number')
    return {
      next: function () {
        if (o && i >= o.length) o = void 0
        return { value: o && o[i++], done: !o }
      },
    }
  throw new TypeError(
    s ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'
  )
}

function __read(o, n) {
  var m = typeof Symbol === 'function' && o[Symbol.iterator]
  if (!m) return o
  var i = m.call(o),
    r,
    ar = [],
    e
  try {
    while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value)
  } catch (error) {
    e = { error: error }
  } finally {
    try {
      if (r && !r.done && (m = i['return'])) m.call(i)
    } finally {
      if (e) throw e.error
    }
  }
  return ar
}

function __spreadArray(to, from, pack) {
  if (pack || arguments.length === 2)
    for (var i = 0, l = from.length, ar; i < l; i++) {
      if (ar || !(i in from)) {
        if (!ar) ar = Array.prototype.slice.call(from, 0, i)
        ar[i] = from[i]
      }
    }
  return to.concat(ar || Array.prototype.slice.call(from))
}

typeof SuppressedError === 'function'
  ? SuppressedError
  : function (error, suppressed, message) {
      var e = new Error(message)
      return (
        (e.name = 'SuppressedError'),
        (e.error = error),
        (e.suppressed = suppressed),
        e
      )
    }

var request = uniappRequestHelper
var Storage = /** @class */ (function () {
  function Storage(type, salt) {
    this.store = new Map()
    this.type = 'memory'
    this.salt = '__salt__'
    type && (this.type = type)
    salt && (this.salt = salt)
  }
  Storage.prototype.get = function (key) {
    var value
    switch (this.type) {
      case 'memory':
        return this.store.get(key)
      case 'localStorage':
      case 'sessionStorage':
        value = uni.getStorageSync(''.concat(this.salt).concat(key))
        return value
    }
  }
  Storage.prototype.set = function (key, value) {
    switch (this.type) {
      case 'memory':
        this.store.set(key, value)
        break
      case 'localStorage':
      case 'sessionStorage':
        uni.setStorageSync(''.concat(this.salt).concat(key), value)
        break
    }
  }
  Storage.prototype.remove = function (key) {
    switch (this.type) {
      case 'memory':
        this.store.delete(key)
        break
      case 'localStorage':
      case 'sessionStorage':
        uni.removeStorageSync(''.concat(this.salt).concat(key))
        break
    }
  }
  return Storage
})()
var uniappStorage = Storage

var index = uniappStorage
var url$1 = 'https://statistic.live.126.net/statics/report/xkit/action'
var EventTracking = /** @class */ (function () {
  function EventTracking(_a) {
    var appKey = _a.appKey,
      version = _a.version,
      component = _a.component,
      nertcVersion = _a.nertcVersion,
      imVersion = _a.imVersion,
      _b = _a.os,
      os = _b === void 0 ? '' : _b,
      _c = _a.framework,
      framework = _c === void 0 ? '' : _c,
      _d = _a.language,
      language = _d === void 0 ? '' : _d,
      _e = _a.container,
      container = _e === void 0 ? '' : _e,
      _f = _a.platform,
      platform = _f === void 0 ? 'Web' : _f,
      _g = _a.channel,
      channel = _g === void 0 ? 'netease' : _g
    this.platform = platform
    this.appKey = appKey
    this.version = version
    this.component = component
    this.nertcVersion = nertcVersion
    this.imVersion = imVersion
    this.channel = channel
    this.os = os
    this.framework = framework
    this.language = language
    this.container = container
  }
  EventTracking.prototype.track = function (reportType, data) {
    return __awaiter(this, void 0, void 0, function () {
      var _a,
        appKey,
        version,
        component,
        nertcVersion,
        imVersion,
        platform,
        channel,
        os,
        framework,
        language,
        container,
        timeStamp
      return __generator(this, function (_c) {
        switch (_c.label) {
          case 0:
            ;(_a = this),
              (appKey = _a.appKey),
              (version = _a.version),
              (component = _a.component),
              (nertcVersion = _a.nertcVersion),
              (imVersion = _a.imVersion),
              (platform = _a.platform),
              (channel = _a.channel),
              (os = _a.os),
              (framework = _a.framework),
              (language = _a.language),
              (container = _a.container)
            timeStamp = Date.now()
            _c.label = 1
          case 1:
            _c.trys.push([1, 3, , 4])
            return [
              4 /*yield*/,
              request({
                method: 'POST',
                url: url$1,
                data: {
                  appKey: appKey,
                  version: version,
                  component: component,
                  timeStamp: timeStamp,
                  nertcVersion: nertcVersion,
                  imVersion: imVersion,
                  platform: platform,
                  reportType: reportType,
                  data: data,
                  channel: channel,
                  os: os,
                  framework: framework,
                  language: language,
                  container: container,
                },
              }),
            ]
          case 2:
            _c.sent()
            return [3 /*break*/, 4]
          case 3:
            _c.sent()
            return [3 /*break*/, 4]
          case 4:
            return [2 /*return*/]
        }
      })
    })
  }
  return EventTracking
})()
var EventTracking$1 = EventTracking

/**
 * 判断元素是否可见
 * 融合了 IntersectionObserver 与 visibilityChange 事件
 */
var VisibilityObserver = /** @class */ (function (_super) {
  __extends(VisibilityObserver, _super)
  // 入参说明参考：https://developer.mozilla.org/zh-CN/docs/Web/API/Intersection_Observer_API
  function VisibilityObserver(options) {
    var _this = _super.call(this) || this
    _this.visibilityState = document.visibilityState
    _this.entries = []
    _this._visibilitychange = function () {
      _this.visibilityState = document.visibilityState
      _this._trigger()
    }
    _this.intersectionObserver = new IntersectionObserver(
      _this._intersectionObserverHandler.bind(_this),
      options
    )
    document.addEventListener('visibilitychange', _this._visibilitychange)
    return _this
  }
  VisibilityObserver.prototype.observe = function (target) {
    return this.intersectionObserver.observe(target)
  }
  VisibilityObserver.prototype.unobserve = function (target) {
    return this.intersectionObserver.unobserve(target)
  }
  VisibilityObserver.prototype.destroy = function () {
    this.intersectionObserver.disconnect()
    document.removeEventListener('visibilitychange', this._visibilitychange)
    this.entries = []
  }
  VisibilityObserver.prototype._intersectionObserverHandler = function (
    entries
  ) {
    this.entries = entries
    this._trigger()
  }
  VisibilityObserver.prototype._trigger = function () {
    var _this = this
    this.entries.forEach(function (item) {
      if (_this.visibilityState !== 'visible' || item.intersectionRatio <= 0) {
        _this.emit('visibleChange', {
          visible: false,
          target: item.target,
        })
        return
      }
      _this.emit('visibleChange', {
        visible: true,
        target: item.target,
      })
    })
  }
  return VisibilityObserver
})(EventEmitter)
var VisibilityObserver$1 = VisibilityObserver

var commonjsGlobal =
  typeof globalThis !== 'undefined'
    ? globalThis
    : typeof window !== 'undefined'
    ? window
    : typeof global !== 'undefined'
    ? global
    : typeof self !== 'undefined'
    ? self
    : {}

function createCommonjsModule(fn, module) {
  return (module = { exports: {} }), fn(module, module.exports), module.exports
}

var loglevel = createCommonjsModule(function (module) {
  /*
   * loglevel - https://github.com/pimterry/loglevel
   *
   * Copyright (c) 2013 Tim Perry
   * Licensed under the MIT license.
   */
  ;(function (root, definition) {
    if (module.exports) {
      module.exports = definition()
    } else {
      root.log = definition()
    }
  })(commonjsGlobal, function () {
    // Slightly dubious tricks to cut down minimized file size
    var noop = function () {}
    var undefinedType = 'undefined'
    var isIE =
      typeof window !== undefinedType &&
      typeof window.navigator !== undefinedType &&
      /Trident\/|MSIE /.test(window.navigator.userAgent)

    var logMethods = ['trace', 'debug', 'info', 'warn', 'error']

    var _loggersByName = {}
    var defaultLogger = null

    // Cross-browser bind equivalent that works at least back to IE6
    function bindMethod(obj, methodName) {
      var method = obj[methodName]
      if (typeof method.bind === 'function') {
        return method.bind(obj)
      } else {
        try {
          return Function.prototype.bind.call(method, obj)
        } catch (e) {
          // Missing bind shim or IE8 + Modernizr, fallback to wrapping
          return function () {
            return Function.prototype.apply.apply(method, [obj, arguments])
          }
        }
      }
    }

    // Trace() doesn't print the message in IE, so for that case we need to wrap it
    function traceForIE() {
      if (console.log) {
        if (console.log.apply) {
          console.log.apply(console, arguments)
        } else {
          // In old IE, native console methods themselves don't have apply().
          Function.prototype.apply.apply(console.log, [console, arguments])
        }
      }
      if (console.trace) console.trace()
    }

    // Build the best logging method possible for this env
    // Wherever possible we want to bind, not wrap, to preserve stack traces
    function realMethod(methodName) {
      if (methodName === 'debug') {
        methodName = 'log'
      }

      if (typeof console === undefinedType) {
        return false // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives
      } else if (methodName === 'trace' && isIE) {
        return traceForIE
      } else if (console[methodName] !== undefined) {
        return bindMethod(console, methodName)
      } else if (console.log !== undefined) {
        return bindMethod(console, 'log')
      } else {
        return noop
      }
    }

    // These private functions always need `this` to be set properly

    function replaceLoggingMethods() {
      /*jshint validthis:true */
      var level = this.getLevel()

      // Replace the actual methods.
      for (var i = 0; i < logMethods.length; i++) {
        var methodName = logMethods[i]
        this[methodName] =
          i < level ? noop : this.methodFactory(methodName, level, this.name)
      }

      // Define log.log as an alias for log.debug
      this.log = this.debug

      // Return any important warnings.
      if (typeof console === undefinedType && level < this.levels.SILENT) {
        return 'No console available for logging'
      }
    }

    // In old IE versions, the console isn't present until you first open it.
    // We build realMethod() replacements here that regenerate logging methods
    function enableLoggingWhenConsoleArrives(methodName) {
      return function () {
        if (typeof console !== undefinedType) {
          replaceLoggingMethods.call(this)
          this[methodName].apply(this, arguments)
        }
      }
    }

    // By default, we use closely bound real methods wherever possible, and
    // otherwise we wait for a console to appear, and then try again.
    function defaultMethodFactory(methodName, _level, _loggerName) {
      /*jshint validthis:true */
      return (
        realMethod(methodName) ||
        enableLoggingWhenConsoleArrives.apply(this, arguments)
      )
    }

    function Logger(name, factory) {
      // Private instance variables.
      var self = this
      /**
       * The level inherited from a parent logger (or a global default). We
       * cache this here rather than delegating to the parent so that it stays
       * in sync with the actual logging methods that we have installed (the
       * parent could change levels but we might not have rebuilt the loggers
       * in this child yet).
       * @type {number}
       */
      var inheritedLevel
      /**
       * The default level for this logger, if any. If set, this overrides
       * `inheritedLevel`.
       * @type {number|null}
       */
      var defaultLevel
      /**
       * A user-specific level for this logger. If set, this overrides
       * `defaultLevel`.
       * @type {number|null}
       */
      var userLevel

      var storageKey = 'loglevel'
      if (typeof name === 'string') {
        storageKey += ':' + name
      } else if (typeof name === 'symbol') {
        storageKey = undefined
      }

      function persistLevelIfPossible(levelNum) {
        var levelName = (logMethods[levelNum] || 'silent').toUpperCase()

        if (typeof window === undefinedType || !storageKey) return

        // Use localStorage if available
        try {
          window.localStorage[storageKey] = levelName
          return
        } catch (ignore) {}

        // Use session cookie as fallback
        try {
          window.document.cookie =
            encodeURIComponent(storageKey) + '=' + levelName + ';'
        } catch (ignore) {}
      }

      function getPersistedLevel() {
        var storedLevel

        if (typeof window === undefinedType || !storageKey) return

        try {
          storedLevel = window.localStorage[storageKey]
        } catch (ignore) {}

        // Fallback to cookies if local storage gives us nothing
        if (typeof storedLevel === undefinedType) {
          try {
            var cookie = window.document.cookie
            var cookieName = encodeURIComponent(storageKey)
            var location = cookie.indexOf(cookieName + '=')
            if (location !== -1) {
              storedLevel = /^([^;]+)/.exec(
                cookie.slice(location + cookieName.length + 1)
              )[1]
            }
          } catch (ignore) {}
        }

        // If the stored level is not valid, treat it as if nothing was stored.
        if (self.levels[storedLevel] === undefined) {
          storedLevel = undefined
        }

        return storedLevel
      }

      function clearPersistedLevel() {
        if (typeof window === undefinedType || !storageKey) return

        // Use localStorage if available
        try {
          window.localStorage.removeItem(storageKey)
        } catch (ignore) {}

        // Use session cookie as fallback
        try {
          window.document.cookie =
            encodeURIComponent(storageKey) +
            '=; expires=Thu, 01 Jan 1970 00:00:00 UTC'
        } catch (ignore) {}
      }

      function normalizeLevel(input) {
        var level = input
        if (
          typeof level === 'string' &&
          self.levels[level.toUpperCase()] !== undefined
        ) {
          level = self.levels[level.toUpperCase()]
        }
        if (
          typeof level === 'number' &&
          level >= 0 &&
          level <= self.levels.SILENT
        ) {
          return level
        } else {
          throw new TypeError(
            'log.setLevel() called with invalid level: ' + input
          )
        }
      }

      /*
       *
       * Public logger API - see https://github.com/pimterry/loglevel for details
       *
       */

      self.name = name

      self.levels = {
        TRACE: 0,
        DEBUG: 1,
        INFO: 2,
        WARN: 3,
        ERROR: 4,
        SILENT: 5,
      }

      self.methodFactory = factory || defaultMethodFactory

      self.getLevel = function () {
        if (userLevel != null) {
          return userLevel
        } else if (defaultLevel != null) {
          return defaultLevel
        } else {
          return inheritedLevel
        }
      }

      self.setLevel = function (level, persist) {
        userLevel = normalizeLevel(level)
        if (persist !== false) {
          // defaults to true
          persistLevelIfPossible(userLevel)
        }

        // NOTE: in v2, this should call rebuild(), which updates children.
        return replaceLoggingMethods.call(self)
      }

      self.setDefaultLevel = function (level) {
        defaultLevel = normalizeLevel(level)
        if (!getPersistedLevel()) {
          self.setLevel(level, false)
        }
      }

      self.resetLevel = function () {
        userLevel = null
        clearPersistedLevel()
        replaceLoggingMethods.call(self)
      }

      self.enableAll = function (persist) {
        self.setLevel(self.levels.TRACE, persist)
      }

      self.disableAll = function (persist) {
        self.setLevel(self.levels.SILENT, persist)
      }

      self.rebuild = function () {
        if (defaultLogger !== self) {
          inheritedLevel = normalizeLevel(defaultLogger.getLevel())
        }
        replaceLoggingMethods.call(self)

        if (defaultLogger === self) {
          for (var childName in _loggersByName) {
            _loggersByName[childName].rebuild()
          }
        }
      }

      // Initialize all the internal levels.
      inheritedLevel = normalizeLevel(
        defaultLogger ? defaultLogger.getLevel() : 'WARN'
      )
      var initialLevel = getPersistedLevel()
      if (initialLevel != null) {
        userLevel = normalizeLevel(initialLevel)
      }
      replaceLoggingMethods.call(self)
    }

    /*
     *
     * Top-level API
     *
     */

    defaultLogger = new Logger()

    defaultLogger.getLogger = function getLogger(name) {
      if (
        (typeof name !== 'symbol' && typeof name !== 'string') ||
        name === ''
      ) {
        throw new TypeError('You must supply a name when creating a logger.')
      }

      var logger = _loggersByName[name]
      if (!logger) {
        logger = _loggersByName[name] = new Logger(
          name,
          defaultLogger.methodFactory
        )
      }
      return logger
    }

    // Grab the current global log variable in case of overwrite
    var _log = typeof window !== undefinedType ? window.log : undefined
    defaultLogger.noConflict = function () {
      if (typeof window !== undefinedType && window.log === defaultLogger) {
        window.log = _log
      }

      return defaultLogger
    }

    defaultLogger.getLoggers = function getLoggers() {
      return _loggersByName
    }

    // ES6 default export, for compatibility
    defaultLogger['default'] = defaultLogger

    return defaultLogger
  })
})

var log = loglevel

function createLoggerDecorator(MODULE_NAME, logger) {
  return function (__, propKey, descriptor) {
    var method = descriptor.value
    descriptor.value = function () {
      var args = []
      for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i]
      }
      return __awaiter(this, void 0, void 0, function () {
        var methodName, res, err_1
        return __generator(this, function (_a) {
          switch (_a.label) {
            case 0:
              if (!logger) {
                // @ts-ignore
                logger = this.logger
              }
              if (
                ['log', 'error'].some(function (item) {
                  return !logger[item]
                })
              ) {
                console.warn(
                  'loggerDecorator warning: your logger is not complete'
                )
              }
              methodName = method.name || propKey || ''
              _a.label = 1
            case 1:
              _a.trys.push([1, 3, , 4])
              logger === null || logger === void 0
                ? void 0
                : logger.log.apply(
                    logger,
                    __spreadArray(
                      [MODULE_NAME, methodName],
                      __read(args),
                      false
                    )
                  )
              return [4 /*yield*/, method.apply(this, args)]
            case 2:
              res = _a.sent()
              logger === null || logger === void 0
                ? void 0
                : logger.log(
                    MODULE_NAME,
                    ''.concat(methodName, ' success: '),
                    res
                  )
              return [2 /*return*/, res]
            case 3:
              err_1 = _a.sent()
              logger === null || logger === void 0
                ? void 0
                : logger.error(
                    MODULE_NAME,
                    ''.concat(methodName, ' failed: '),
                    err_1
                  )
              throw err_1
            case 4:
              return [2 /*return*/]
          }
        })
      })
    }
  }
}

function sensitiveInfoFilter(content) {
  var regexs = [
    'scene/apps/[a-z0-9]{32}/',
    '"rtcKey":"[a-z0-9]{32}"',
    '"imKey":"[a-z0-9]{32}"',
    '"appkey":"[a-z0-9]{32}"',
    '"appkey": "[a-z0-9]{32}"',
    'appkey:"[a-z0-9]{32}"',
    'appkey: "[a-z0-9]{32}"',
    '"appkey":[a-z0-9]{32}',
    '"appkey": [a-z0-9]{32}',
    'appkey:[a-z0-9]{32}',
    'appkey: [a-z0-9]{32}',
  ]
  var templates = [
    'scene/apps/***/',
    '"rtcKey":"***"',
    '"imKey":"***"',
    '"appkey":"***"',
    '"appkey": "***"',
    'appkey:"***"',
    'appkey: "***"',
    '"appkey":***',
    '"appkey": ***',
    'appkey:***',
    'appkey: ***',
  ]
  regexs.forEach(function (regex, index) {
    var reg = new RegExp(regex, 'gi')
    content = content.replace(reg, templates[index])
  })
  return content
}
var logDebug = function (_a) {
  var _b =
      _a === void 0
        ? {
            appName: '',
            version: '',
            storeWindow: false,
            needStringify: true,
          }
        : _a,
    level = _b.level,
    _c = _b.appName,
    appName = _c === void 0 ? '' : _c,
    _d = _b.storeWindow,
    storeWindow = _d === void 0 ? false : _d,
    _e = _b.needStringify,
    needStringify = _e === void 0 ? true : _e
  var genTime = function () {
    var now = new Date()
    var year = now.getFullYear()
    var month = now.getMonth() + 1
    var day = now.getDate()
    var hour = now.getHours() < 10 ? '0'.concat(now.getHours()) : now.getHours()
    var min =
      now.getMinutes() < 10 ? '0'.concat(now.getMinutes()) : now.getMinutes()
    var s =
      now.getSeconds() < 10 ? '0'.concat(now.getSeconds()) : now.getSeconds()
    var nowString = ''
      .concat(year, '-')
      .concat(month, '-')
      .concat(day, ' ')
      .concat(hour, ':')
      .concat(min, ':')
      .concat(s)
    return nowString
  }
  var genUserAgent = function () {
    try {
      var ua = navigator.userAgent.toLocaleLowerCase()
      var re = /(msie|firefox|chrome|opera|version).*?([\d.]+)/
      var m = ua.match(re) || []
      var browser = m[1].replace(/version/, 'safari')
      var ver = m[2]
      return {
        browser: browser,
        ver: ver,
      }
    } catch (error) {
      return null
    }
  }
  var proxyLog = function () {
    var _log = new Proxy(log, {
      get: function (target, prop) {
        var _a, _b
        if (!(prop in target)) {
          return
        }
        var func = target[prop]
        if (
          !['log', 'info', 'warn', 'error', 'trace', 'debug'].includes(prop)
        ) {
          return func
        }
        var prefix = genTime()
        if (genUserAgent()) {
          prefix += '['
            .concat(
              (_a = genUserAgent()) === null || _a === void 0
                ? void 0
                : _a.browser,
              ' '
            )
            .concat(
              (_b = genUserAgent()) === null || _b === void 0 ? void 0 : _b.ver,
              ']'
            )
        }
        prefix +=
          '['.concat(
            {
              log: 'L',
              info: 'I',
              warn: 'W',
              error: 'E',
              trace: 'E',
              debug: 'D',
            }[prop],
            ']'
          ) +
          '['.concat(appName, ']') +
          ':'
        // eslint-disable-next-line @typescript-eslint/no-this-alias
        var that = this
        return function () {
          var args = []
          for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i]
          }
          if (needStringify) {
            for (var i = 0; i < args.length; i++) {
              if (typeof args[i] === 'object') {
                try {
                  args[i] = JSON.stringify(args[i])
                } catch (_a) {
                  console.warn('[日志打印对象无法序列化]', args[i])
                }
              }
              if (typeof args[i] === 'string') {
                args[i] = sensitiveInfoFilter(args[i])
              }
            }
          }
          return func.apply(that, __spreadArray([prefix], __read(args), false))
        }
      },
    })
    return _log
  }
  var logger = proxyLog()
  if (level) {
    logger.setLevel(level)
  }
  if (storeWindow) {
    // @ts-ignore
    window.__LOGGER__ = logger
  }
  return logger
}
var logDebug$1 = logDebug

var EventPriority
;(function (EventPriority) {
  EventPriority[(EventPriority['LOW'] = 0)] = 'LOW'
  EventPriority[(EventPriority['NORMAL'] = 1)] = 'NORMAL'
  EventPriority[(EventPriority['HIGH'] = 2)] = 'HIGH'
})(EventPriority || (EventPriority = {}))
var ReportEvent = /** @class */ (function () {
  // private _report: XKitReporter
  function ReportEvent(options) {
    // static appInfo: AppInfo
    this.appKey = ''
    this.component = ''
    this.data = {}
    this.framework = ''
    this.version = ''
    this.startTime = 0
    this.endTime = 0
    this.duration = 0
    this.data.startTime = new Date().getTime()
    this.data.timeStamp = this.data.startTime
    this.eventId = options.eventId
    this.priority = options.priority
  }
  ReportEvent.prototype.end = function () {
    // 如果已经end过 不再end
    if (this.data.endTime && this.data.duration) {
      return
    }
    this.data.endTime = this.data.endTime || new Date().getTime()
    this.data.duration =
      this.data.duration || this.data.endTime - this.data.startTime
  }
  ReportEvent.prototype.setAppInfo = function (appInfo) {
    this.appKey = appInfo.appKey
    this.component = appInfo.component
    this.version = appInfo.version
    if (appInfo.framework) {
      this.framework = appInfo.framework
    }
  }
  ReportEvent.prototype.endWith = function (data) {
    var code = data.code,
      msg = data.msg,
      requestId = data.requestId,
      serverCost = data.serverCost
    // 过滤code非number类型
    if (typeof code != 'number') {
      this.data.code = -2
    } else {
      this.data.code = code
    }
    this.data.message = msg
    this.data.requestId = requestId
    this.data.serverCost = serverCost
    this.end()
  }
  ReportEvent.prototype.endWithSuccess = function (data) {
    if (data) {
      var requestId = data.requestId,
        serverCost = data.serverCost
      this.data.requestId = requestId
      this.data.serverCost = serverCost
    }
    this.data.code = 0
    this.data.message = 'success'
    this.end()
  }
  ReportEvent.prototype.endWithFailure = function (data) {
    if (data) {
      var requestId = data.requestId,
        serverCost = data.serverCost
      this.data.requestId = requestId
      this.data.serverCost = serverCost
    }
    this.data.code = -1
    this.data.message = 'failure'
    this.end()
  }
  ReportEvent.prototype.setParams = function (params) {
    this.data.params = __assign({}, params)
    return this
  }
  ReportEvent.prototype.addParams = function (params) {
    this.data.params = __assign(__assign({}, this.data.params), params)
    return this
  }
  ReportEvent.prototype.setData = function (data) {
    this.data = __assign(__assign({}, this.data), data)
  }
  ReportEvent.prototype.setUserId = function (userId) {
    this.data.userId = userId
  }
  return ReportEvent
})()
var EventStep = /** @class */ (function (_super) {
  __extends(EventStep, _super)
  function EventStep(options) {
    return _super.call(this, options) || this
  }
  return EventStep
})(ReportEvent)
var IntervalEvent = /** @class */ (function (_super) {
  __extends(IntervalEvent, _super)
  function IntervalEvent(options) {
    var _this = _super.call(this, options) || this
    _this._stepMap = new Map()
    return _this
  }
  IntervalEvent.prototype.beginStep = function (name) {
    if (this._stepMap.has(name)) {
      return this._stepMap[name]
    }
    var step = new EventStep({ eventId: name, priority: this.priority })
    step.setData({ step: name })
    this._stepMap.set(name, step)
    return step
  }
  IntervalEvent.prototype.addStep = function (data) {
    this._stepMap.set(data.eventId, data)
  }
  IntervalEvent.prototype.removeStep = function (eventId) {
    this._stepMap.delete(eventId)
  }
  IntervalEvent.prototype.endWith = function (data) {
    _super.prototype.endWith.call(this, data)
    this.end()
  }
  IntervalEvent.prototype.endWithSuccess = function (data) {
    _super.prototype.endWithSuccess.call(this, data)
    this.end()
  }
  IntervalEvent.prototype.endWithFailure = function (data) {
    _super.prototype.endWithFailure.call(this, data)
    this.end()
  }
  IntervalEvent.prototype.end = function () {
    var e_1, _a
    var steps = []
    _super.prototype.end.call(this)
    try {
      for (
        var _b = __values(this._stepMap.values()), _c = _b.next();
        !_c.done;
        _c = _b.next()
      ) {
        var step = _c.value
        // step.end()
        step.data.index = steps.length
        steps.push(step.data)
      }
    } catch (e_1_1) {
      e_1 = { error: e_1_1 }
    } finally {
      try {
        if (_c && !_c.done && (_a = _b.return)) _a.call(_b)
      } finally {
        if (e_1) throw e_1.error
      }
    }
    if (steps.length > 0) {
      this.data.steps = steps
    }
  }
  return IntervalEvent
})(EventStep)

/**
 * 异步频率控制
 * 一段时间内只请求一次，多余的用这一次执行的结果做为结果
 * @param fn
 * @param delay
 */
var frequencyControl = function (fn, delay) {
  var queue = []
  var last = 0
  var timer
  return function () {
    var _this = this
    var args = []
    for (var _i = 0; _i < arguments.length; _i++) {
      args[_i] = arguments[_i]
    }
    return new Promise(function (resolve, reject) {
      queue.push({ resolve: resolve, reject: reject })
      var cur = Date.now()
      var consumer = function (success, res) {
        while (queue.length) {
          var _a = queue.shift(),
            resolve_1 = _a.resolve,
            reject_1 = _a.reject
          success ? resolve_1(res) : reject_1(res)
        }
      }
      var excute = function () {
        last = cur
        if (!queue.length) return
        // @ts-ignore
        fn.apply(_this, args).then(
          function (res) {
            consumer(true, res)
          },
          function (err) {
            consumer(false, err)
          }
        )
      }
      if (cur - last > delay) {
        excute()
      } else {
        clearTimeout(timer)
        timer = setTimeout(function () {
          excute()
        }, delay)
      }
    })
  }
}
function getFileType(filename) {
  var fileMap = {
    img: /(png|gif|jpg)/i,
    pdf: /pdf$/i,
    word: /(doc|docx)$/i,
    excel: /(xls|xlsx)$/i,
    ppt: /(ppt|pptx)$/i,
    zip: /(zip|rar|7z)$/i,
    audio: /(mp3|wav|wmv)$/i,
    video: /(mp4|mkv|rmvb|wmv|avi|flv|mov)$/i,
  }
  return (
    Object.keys(fileMap).find(function (type) {
      return fileMap[type].test(filename)
    }) || ''
  )
}
/**
 * 解析输入的文件大小
 * @param size 文件大小，单位b
 * @param level 递归等级，对应fileSizeMap
 */
var parseFileSize = function (size, level) {
  if (level === void 0) {
    level = 0
  }
  var fileSizeMap = {
    0: 'B',
    1: 'KB',
    2: 'MB',
    3: 'GB',
    4: 'TB',
  }
  var handler = function (size, level) {
    if (level >= Object.keys(fileSizeMap).length) {
      return 'the file is too big'
    }
    if (size < 1024) {
      return ''.concat(size).concat(fileSizeMap[level])
    }
    return handler(Math.round(size / 1024), level + 1)
  }
  return handler(size, level)
}
var addUrlSearch = function (url, search) {
  var urlObj = new URL(url)
  urlObj.search += (urlObj.search.startsWith('?') ? '&' : '?') + search
  return urlObj.href
}
function debounce(fn, wait) {
  var timer = null
  return function () {
    var _this = this
    var args = []
    for (var _i = 0; _i < arguments.length; _i++) {
      args[_i] = arguments[_i]
    }
    if (timer) {
      clearTimeout(timer)
      timer = null
    }
    timer = setTimeout(function () {
      // @ts-ignore
      fn.apply(_this, args)
    }, wait)
  }
}
function getOperatingSystem() {
  try {
    var userAgent = navigator.userAgent
    if (userAgent.includes('Windows')) {
      return 'Windows'
    } else if (userAgent.includes('Mac OS')) {
      return 'Mac OS'
    } else if (userAgent.includes('Linux')) {
      return 'Linux'
    } else if (userAgent.includes('Android')) {
      return 'Android'
    } else if (userAgent.includes('iOS')) {
      return 'iOS'
    } else {
      return 'Unknown'
    }
  } catch (_a) {
    return 'Unknown'
  }
}
function getBrowserInfo() {
  var browserName = 'Unknown'
  var browserVersion = ''
  try {
    var userAgent = navigator.userAgent
    // 判断是否为Chrome浏览器
    if (userAgent.indexOf('Chrome') !== -1) {
      browserName = 'Chrome'
      var start = userAgent.indexOf('Chrome') + 7
      var end = userAgent.indexOf(' ', start)
      browserVersion = userAgent.substring(start, end)
    }
    // 判断是否为Firefox浏览器
    else if (userAgent.indexOf('Firefox') !== -1) {
      browserName = 'Firefox'
      var start = userAgent.indexOf('Firefox') + 8
      browserVersion = userAgent.substring(start)
    }
    // 判断是否为Safari浏览器
    else if (userAgent.indexOf('Safari') !== -1) {
      browserName = 'Safari'
      var start = userAgent.indexOf('Version') + 8
      var end = userAgent.indexOf(' ', start)
      browserVersion = userAgent.substring(start, end)
    }
    // 判断是否为Edge浏览器
    else if (userAgent.indexOf('Edg') !== -1) {
      browserName = 'Edge'
      var start = userAgent.indexOf('Edg') + 4
      browserVersion = userAgent.substring(start)
    }
    // 判断是否为IE浏览器（IE11及以下版本）
    else if (userAgent.indexOf('MSIE') !== -1) {
      browserName = 'Internet Explorer'
      var start = userAgent.indexOf('MSIE') + 5
      var end = userAgent.indexOf(';', start)
      browserVersion = userAgent.substring(start, end)
    }
  } catch (error) {
    console.error('getBrowserInfo error:', error)
  }
  return {
    name: browserName,
    version: browserVersion,
  }
}

var url = 'https://statistic.live.126.net/statics/report/common/form'
var HEADER_VALUE_SDK_TYPE = 'NEXKitStatistics'
var HEADER_VALUE_REPORTER_VERSION = '1.0.0'
var HEADER_VALUE_CONTENT_TYPE = 'application/json;charset=utf-8'
var EVENT_REPORT_INTERVAL = 5000
var MAX_EVENT_CACHE_SIZE = 100
var LOW_PRIORITY_RETRY = 0
var NORMAL_PRIORITY_RETRY = 2
var HIGH_PRIORITY_RETRY = 5
var MAX_RETRY_COUNT = 3
var XKitReporter = /** @class */ (function () {
  function XKitReporter(options) {
    this._eventsCache = []
    this._noReport = false // 是否上报数据
    this._configMap = new Map()
    this._retryCount = 0
    var browserInfo = getBrowserInfo()
    var appInfo = window.__XKitReporter__
    var userAgent = ''
    try {
      userAgent = navigator.userAgent
    } catch (_a) {
      console.log('navigator is not defined')
    }
    this.common = {
      imVersion: options.imVersion,
      nertcVersion: options.nertcVersion,
      platform: 'Web',
      osVer: browserInfo.version,
      userAgent: userAgent,
      manufacturer: '',
      model: browserInfo.name,
      packageId:
        (appInfo === null || appInfo === void 0 ? void 0 : appInfo.packageId) ||
        '',
      appVer:
        (appInfo === null || appInfo === void 0 ? void 0 : appInfo.appVer) ||
        '',
      appName:
        (appInfo === null || appInfo === void 0 ? void 0 : appInfo.appName) ||
        '',
      deviceId: options.deviceId,
    }
    this._logger = logDebug$1({
      level: 'debug',
      appName: 'XKitReporter',
      version: '2.0.0',
    })
  }
  XKitReporter.prototype.getConfig = function (appKey) {
    return __awaiter(this, void 0, void 0, function () {
      var _this = this
      return __generator(this, function (_a) {
        return [
          2 /*return*/,
          axios({
            method: 'GET',
            url: 'https://yiyong.netease.im/report_conf',
            headers: {
              platform: 'web',
              appKey: appKey,
            },
          })
            .then(function (res) {
              _this._configMap.set(appKey, res.data)
            })
            .catch(function () {
              _this._retryCount += 1
              if (_this._retryCount > MAX_RETRY_COUNT) {
                _this._retryCount = 0
                return
              }
              _this.getConfig(appKey)
            }),
        ]
      })
    })
  }
  XKitReporter.prototype.setNoReport = function (noReport) {
    this._noReport = noReport
  }
  XKitReporter.prototype.reportEvent = function (event, options) {
    // 如果禁止上包则返回
    if (this._noReport) {
      return
    }
    if (this._eventsCache.length >= MAX_EVENT_CACHE_SIZE) {
      this._evictEvent(event)
    } else {
      this._eventsCache.push(event)
    }
    this._scheduleReportEventsTask(
      options === null || options === void 0 ? void 0 : options.immediate
    )
  }
  XKitReporter.prototype._evictEvent = function (event) {
    var index = this._eventsCache.findIndex(function (item) {
      return item.priority < event.priority
    })
    this._eventsCache.push(event)
    if (index !== -1) {
      this._evictEvent(this._eventsCache[index])
    } else {
      this._logger.debug('Full event cache, evict event:', event)
      this._eventsCache = this._eventsCache.filter(function (item) {
        return item !== event
      })
    }
  }
  XKitReporter.prototype._scheduleReportEventsTask = function (immediate) {
    var _this = this
    if (immediate === void 0) {
      immediate = false
    }
    var execute = function () {
      return __awaiter(_this, void 0, void 0, function () {
        var groupByAppKey, _a, _b, _i, appKey, config
        return __generator(this, function (_c) {
          switch (_c.label) {
            case 0:
              groupByAppKey = this._eventsCache.reduce(function (acc, obj) {
                var key = obj.appKey
                if (!acc[key]) {
                  acc[key] = []
                }
                acc[key].push(obj)
                return acc
              }, {})
              _a = []
              for (_b in groupByAppKey) _a.push(_b)
              _i = 0
              _c.label = 1
            case 1:
              if (!(_i < _a.length)) return [3 /*break*/, 5]
              appKey = _a[_i]
              if (!!this._configMap.has(appKey)) return [3 /*break*/, 3]
              return [4 /*yield*/, this.getConfig(appKey)]
            case 2:
              _c.sent()
              _c.label = 3
            case 3:
              if (this._configMap.has(appKey)) {
                config = this._configMap.get(appKey)
                if (
                  !(config === null || config === void 0
                    ? void 0
                    : config.enabled)
                ) {
                  return [2 /*return*/]
                }
              }
              this._reportEventsToServer(appKey, groupByAppKey[appKey])
              _c.label = 4
            case 4:
              _i++
              return [3 /*break*/, 1]
            case 5:
              this._eventsCache = []
              return [2 /*return*/]
          }
        })
      })
    }
    if (immediate) {
      execute()
    }
    if (this._queueTimer) {
      return
    }
    this._queueTimer = setInterval(function () {
      if (_this._eventsCache.length === 0) {
        _this._queueTimer && clearInterval(_this._queueTimer)
        _this._queueTimer = undefined
        return
      }
      execute()
    }, EVENT_REPORT_INTERVAL)
  }
  XKitReporter.prototype._determineMaxRetry = function (events) {
    var e_1, _a
    var retry = LOW_PRIORITY_RETRY
    try {
      for (
        var events_1 = __values(events), events_1_1 = events_1.next();
        !events_1_1.done;
        events_1_1 = events_1.next()
      ) {
        var event_1 = events_1_1.value
        if (event_1.priority === EventPriority.HIGH) {
          retry = HIGH_PRIORITY_RETRY
          break
        }
        if (event_1.priority === EventPriority.NORMAL) {
          retry = NORMAL_PRIORITY_RETRY
        }
      }
    } catch (e_1_1) {
      e_1 = { error: e_1_1 }
    } finally {
      try {
        if (events_1_1 && !events_1_1.done && (_a = events_1.return))
          _a.call(events_1)
      } finally {
        if (e_1) throw e_1.error
      }
    }
    return retry
  }
  XKitReporter.prototype._reportEventsToServer = function (appKey, events) {
    return __awaiter(this, void 0, void 0, function () {
      var config, groupByEventId, maxRetry, retry, data, networkRequest
      var _this = this
      return __generator(this, function (_a) {
        if (!this._configMap.has(appKey)) {
          return [2 /*return*/]
        }
        config = this._configMap.get(appKey)
        groupByEventId = events.reduce(function (acc, obj) {
          var _a, _b, _c, _d
          if (
            ((_a =
              config === null || config === void 0
                ? void 0
                : config.blacklist) === null || _a === void 0
              ? void 0
              : _a.length) > 0 &&
            ((_b =
              config === null || config === void 0
                ? void 0
                : config.blacklist) === null || _b === void 0
              ? void 0
              : _b.includes(obj.component))
          ) {
            return acc
          }
          //blacklist 不包含A，whitelist 为空 ： 允许 A 上报
          if (
            ((_c =
              config === null || config === void 0
                ? void 0
                : config.whitelist) === null || _c === void 0
              ? void 0
              : _c.length) > 0 &&
            !((_d =
              config === null || config === void 0
                ? void 0
                : config.whitelist) === null || _d === void 0
              ? void 0
              : _d.includes(obj.component))
          ) {
            return acc
          }
          var key = obj.eventId
          if (!acc[key]) {
            acc[key] = []
          }
          acc[key].push(
            __assign(__assign({}, obj.data), {
              appKey: obj.appKey,
              component: obj.component,
              version: obj.version,
              framework: obj.framework,
            })
          )
          return acc
        }, {})
        maxRetry = this._determineMaxRetry(events)
        retry = 0
        data = {
          common: this.common,
          event: groupByEventId,
        }
        networkRequest = function () {
          request({
            method: 'POST',
            url: url,
            headers: {
              appkey: appKey,
              sdktype: HEADER_VALUE_SDK_TYPE,
              ver: HEADER_VALUE_REPORTER_VERSION,
              'Content-Type': HEADER_VALUE_CONTENT_TYPE,
            },
            data: data,
          }).catch(function () {
            if (retry <= maxRetry) {
              setTimeout(networkRequest, 2000 * retry)
            } else {
              _this._logger.debug(
                'Failed to report events to server after '.concat(
                  retry,
                  ' retries.'
                ),
                data
              )
            }
            retry++
          })
        }
        networkRequest()
        return [2 /*return*/]
      })
    })
  }
  XKitReporter.setAppInfo = function (info) {
    window.__XKitReporter__ = {
      packageId: info === null || info === void 0 ? void 0 : info.packageId,
      appName: info === null || info === void 0 ? void 0 : info.appName,
      appVer: info === null || info === void 0 ? void 0 : info.appVer,
    }
  }
  XKitReporter.getInstance = function (options) {
    if (!options) {
      if (!this.instance) {
        throw new Error('XKitReporter not initialized')
      }
      return this.instance
    }
    if (!this.instance) {
      this.instance = new XKitReporter(options)
    }
    return this.instance
  }
  return XKitReporter
})()
var XKitReporter$1 = XKitReporter

export {
  EventPriority,
  EventStep,
  EventTracking$1 as EventTracking,
  IntervalEvent,
  ReportEvent,
  index as Storage,
  VisibilityObserver$1 as VisibilityObserver,
  XKitReporter$1 as XKitReporter,
  addUrlSearch,
  createLoggerDecorator,
  debounce,
  frequencyControl,
  getBrowserInfo,
  getFileType,
  getOperatingSystem,
  logDebug$1 as logDebug,
  parseFileSize,
  request,
}
