UNPKG

zby-live-sdk

Version:

This is a live SDK for weclassroom.

27,150 lines 840 kB
/*!
 * zby-live-sdk.js v1.0.49-beta-20260807
 * 2026-8-7 why 
 * Released By TAL Weclassroom.
 */
'use strict';

function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }

var MD5 = _interopDefault(require('md5'));
var axios = _interopDefault(require('axios'));
var Qs = _interopDefault(require('qs'));
var io = _interopDefault(require('socket.io-client'));
var Protocol = _interopDefault(require('pomelo-protocol'));
var Protobuf = _interopDefault(require('pomelo-protobuf'));
var pako = _interopDefault(require('pako'));

function _typeof(obj) {
  if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
    _typeof = function (obj) {
      return typeof obj;
    };
  } else {
    _typeof = function (obj) {
      return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
    };
  }

  return _typeof(obj);
}

var REACT_ELEMENT_TYPE;

function _jsx(type, props, key, children) {
  if (!REACT_ELEMENT_TYPE) {
    REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol.for && Symbol.for("react.element") || 0xeac7;
  }

  var defaultProps = type && type.defaultProps;
  var childrenLength = arguments.length - 3;

  if (!props && childrenLength !== 0) {
    props = {
      children: void 0
    };
  }

  if (props && defaultProps) {
    for (var propName in defaultProps) {
      if (props[propName] === void 0) {
        props[propName] = defaultProps[propName];
      }
    }
  } else if (!props) {
    props = defaultProps || {};
  }

  if (childrenLength === 1) {
    props.children = children;
  } else if (childrenLength > 1) {
    var childArray = new Array(childrenLength);

    for (var i = 0; i < childrenLength; i++) {
      childArray[i] = arguments[i + 3];
    }

    props.children = childArray;
  }

  return {
    $$typeof: REACT_ELEMENT_TYPE,
    type: type,
    key: key === undefined ? null : '' + key,
    ref: null,
    props: props,
    _owner: null
  };
}

function _asyncIterator(iterable) {
  var method;

  if (typeof Symbol === "function") {
    if (Symbol.asyncIterator) {
      method = iterable[Symbol.asyncIterator];
      if (method != null) return method.call(iterable);
    }

    if (Symbol.iterator) {
      method = iterable[Symbol.iterator];
      if (method != null) return method.call(iterable);
    }
  }

  throw new TypeError("Object is not async iterable");
}

function _AwaitValue(value) {
  this.wrapped = value;
}

function _AsyncGenerator(gen) {
  var front, back;

  function send(key, arg) {
    return new Promise(function (resolve, reject) {
      var request = {
        key: key,
        arg: arg,
        resolve: resolve,
        reject: reject,
        next: null
      };

      if (back) {
        back = back.next = request;
      } else {
        front = back = request;
        resume(key, arg);
      }
    });
  }

  function resume(key, arg) {
    try {
      var result = gen[key](arg);
      var value = result.value;
      var wrappedAwait = value instanceof _AwaitValue;
      Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
        if (wrappedAwait) {
          resume("next", arg);
          return;
        }

        settle(result.done ? "return" : "normal", arg);
      }, function (err) {
        resume("throw", err);
      });
    } catch (err) {
      settle("throw", err);
    }
  }

  function settle(type, value) {
    switch (type) {
      case "return":
        front.resolve({
          value: value,
          done: true
        });
        break;

      case "throw":
        front.reject(value);
        break;

      default:
        front.resolve({
          value: value,
          done: false
        });
        break;
    }

    front = front.next;

    if (front) {
      resume(front.key, front.arg);
    } else {
      back = null;
    }
  }

  this._invoke = send;

  if (typeof gen.return !== "function") {
    this.return = undefined;
  }
}

if (typeof Symbol === "function" && Symbol.asyncIterator) {
  _AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
    return this;
  };
}

_AsyncGenerator.prototype.next = function (arg) {
  return this._invoke("next", arg);
};

_AsyncGenerator.prototype.throw = function (arg) {
  return this._invoke("throw", arg);
};

_AsyncGenerator.prototype.return = function (arg) {
  return this._invoke("return", arg);
};

function _wrapAsyncGenerator(fn) {
  return function () {
    return new _AsyncGenerator(fn.apply(this, arguments));
  };
}

function _awaitAsyncGenerator(value) {
  return new _AwaitValue(value);
}

function _asyncGeneratorDelegate(inner, awaitWrap) {
  var iter = {},
      waiting = false;

  function pump(key, value) {
    waiting = true;
    value = new Promise(function (resolve) {
      resolve(inner[key](value));
    });
    return {
      done: false,
      value: awaitWrap(value)
    };
  }

  ;

  if (typeof Symbol === "function" && Symbol.iterator) {
    iter[Symbol.iterator] = function () {
      return this;
    };
  }

  iter.next = function (value) {
    if (waiting) {
      waiting = false;
      return value;
    }

    return pump("next", value);
  };

  if (typeof inner.throw === "function") {
    iter.throw = function (value) {
      if (waiting) {
        waiting = false;
        throw value;
      }

      return pump("throw", value);
    };
  }

  if (typeof inner.return === "function") {
    iter.return = function (value) {
      return pump("return", value);
    };
  }

  return iter;
}

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  try {
    var info = gen[key](arg);
    var value = info.value;
  } catch (error) {
    reject(error);
    return;
  }

  if (info.done) {
    resolve(value);
  } else {
    Promise.resolve(value).then(_next, _throw);
  }
}

function _asyncToGenerator(fn) {
  return function () {
    var self = this,
        args = arguments;
    return new Promise(function (resolve, reject) {
      var gen = fn.apply(self, args);

      function _next(value) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
      }

      function _throw(err) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
      }

      _next(undefined);
    });
  };
}

function _classCallCheck(instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
}

function _defineProperties(target, props) {
  for (var i = 0; i < props.length; i++) {
    var descriptor = props[i];
    descriptor.enumerable = descriptor.enumerable || false;
    descriptor.configurable = true;
    if ("value" in descriptor) descriptor.writable = true;
    Object.defineProperty(target, descriptor.key, descriptor);
  }
}

function _createClass(Constructor, protoProps, staticProps) {
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  if (staticProps) _defineProperties(Constructor, staticProps);
  return Constructor;
}

function _defineEnumerableProperties(obj, descs) {
  for (var key in descs) {
    var desc = descs[key];
    desc.configurable = desc.enumerable = true;
    if ("value" in desc) desc.writable = true;
    Object.defineProperty(obj, key, desc);
  }

  if (Object.getOwnPropertySymbols) {
    var objectSymbols = Object.getOwnPropertySymbols(descs);

    for (var i = 0; i < objectSymbols.length; i++) {
      var sym = objectSymbols[i];
      var desc = descs[sym];
      desc.configurable = desc.enumerable = true;
      if ("value" in desc) desc.writable = true;
      Object.defineProperty(obj, sym, desc);
    }
  }

  return obj;
}

function _defaults(obj, defaults) {
  var keys = Object.getOwnPropertyNames(defaults);

  for (var i = 0; i < keys.length; i++) {
    var key = keys[i];
    var value = Object.getOwnPropertyDescriptor(defaults, key);

    if (value && value.configurable && obj[key] === undefined) {
      Object.defineProperty(obj, key, value);
    }
  }

  return obj;
}

function _defineProperty(obj, key, value) {
  if (key in obj) {
    Object.defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true
    });
  } else {
    obj[key] = value;
  }

  return obj;
}

function _extends() {
  _extends = Object.assign || function (target) {
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i];

      for (var key in source) {
        if (Object.prototype.hasOwnProperty.call(source, key)) {
          target[key] = source[key];
        }
      }
    }

    return target;
  };

  return _extends.apply(this, arguments);
}

function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i] != null ? arguments[i] : {};
    var ownKeys = Object.keys(source);

    if (typeof Object.getOwnPropertySymbols === 'function') {
      ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
        return Object.getOwnPropertyDescriptor(source, sym).enumerable;
      }));
    }

    ownKeys.forEach(function (key) {
      _defineProperty(target, key, source[key]);
    });
  }

  return target;
}

function _inherits(subClass, superClass) {
  if (typeof superClass !== "function" && superClass !== null) {
    throw new TypeError("Super expression must either be null or a function");
  }

  subClass.prototype = Object.create(superClass && superClass.prototype, {
    constructor: {
      value: subClass,
      writable: true,
      configurable: true
    }
  });
  if (superClass) _setPrototypeOf(subClass, superClass);
}

function _inheritsLoose(subClass, superClass) {
  subClass.prototype = Object.create(superClass.prototype);
  subClass.prototype.constructor = subClass;
  subClass.__proto__ = superClass;
}

function _getPrototypeOf(o) {
  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
    return o.__proto__ || Object.getPrototypeOf(o);
  };
  return _getPrototypeOf(o);
}

function _setPrototypeOf(o, p) {
  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
    o.__proto__ = p;
    return o;
  };

  return _setPrototypeOf(o, p);
}

function isNativeReflectConstruct() {
  if (typeof Reflect === "undefined" || !Reflect.construct) return false;
  if (Reflect.construct.sham) return false;
  if (typeof Proxy === "function") return true;

  try {
    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
    return true;
  } catch (e) {
    return false;
  }
}

function _construct(Parent, args, Class) {
  if (isNativeReflectConstruct()) {
    _construct = Reflect.construct;
  } else {
    _construct = function _construct(Parent, args, Class) {
      var a = [null];
      a.push.apply(a, args);
      var Constructor = Function.bind.apply(Parent, a);
      var instance = new Constructor();
      if (Class) _setPrototypeOf(instance, Class.prototype);
      return instance;
    };
  }

  return _construct.apply(null, arguments);
}

function _isNativeFunction(fn) {
  return Function.toString.call(fn).indexOf("[native code]") !== -1;
}

function _wrapNativeSuper(Class) {
  var _cache = typeof Map === "function" ? new Map() : undefined;

  _wrapNativeSuper = function _wrapNativeSuper(Class) {
    if (Class === null || !_isNativeFunction(Class)) return Class;

    if (typeof Class !== "function") {
      throw new TypeError("Super expression must either be null or a function");
    }

    if (typeof _cache !== "undefined") {
      if (_cache.has(Class)) return _cache.get(Class);

      _cache.set(Class, Wrapper);
    }

    function Wrapper() {
      return _construct(Class, arguments, _getPrototypeOf(this).constructor);
    }

    Wrapper.prototype = Object.create(Class.prototype, {
      constructor: {
        value: Wrapper,
        enumerable: false,
        writable: true,
        configurable: true
      }
    });
    return _setPrototypeOf(Wrapper, Class);
  };

  return _wrapNativeSuper(Class);
}

function _instanceof(left, right) {
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
    return right[Symbol.hasInstance](left);
  } else {
    return left instanceof right;
  }
}

function _interopRequireDefault(obj) {
  return obj && obj.__esModule ? obj : {
    default: obj
  };
}

function _interopRequireWildcard(obj) {
  if (obj && obj.__esModule) {
    return obj;
  } else {
    var newObj = {};

    if (obj != null) {
      for (var key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
          var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};

          if (desc.get || desc.set) {
            Object.defineProperty(newObj, key, desc);
          } else {
            newObj[key] = obj[key];
          }
        }
      }
    }

    newObj.default = obj;
    return newObj;
  }
}

function _newArrowCheck(innerThis, boundThis) {
  if (innerThis !== boundThis) {
    throw new TypeError("Cannot instantiate an arrow function");
  }
}

function _objectDestructuringEmpty(obj) {
  if (obj == null) throw new TypeError("Cannot destructure undefined");
}

function _objectWithoutPropertiesLoose(source, excluded) {
  if (source == null) return {};
  var target = {};
  var sourceKeys = Object.keys(source);
  var key, i;

  for (i = 0; i < sourceKeys.length; i++) {
    key = sourceKeys[i];
    if (excluded.indexOf(key) >= 0) continue;
    target[key] = source[key];
  }

  return target;
}

function _objectWithoutProperties(source, excluded) {
  if (source == null) return {};

  var target = _objectWithoutPropertiesLoose(source, excluded);

  var key, i;

  if (Object.getOwnPropertySymbols) {
    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);

    for (i = 0; i < sourceSymbolKeys.length; i++) {
      key = sourceSymbolKeys[i];
      if (excluded.indexOf(key) >= 0) continue;
      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
      target[key] = source[key];
    }
  }

  return target;
}

function _assertThisInitialized(self) {
  if (self === void 0) {
    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  }

  return self;
}

function _possibleConstructorReturn(self, call) {
  if (call && (typeof call === "object" || typeof call === "function")) {
    return call;
  }

  return _assertThisInitialized(self);
}

function _superPropBase(object, property) {
  while (!Object.prototype.hasOwnProperty.call(object, property)) {
    object = _getPrototypeOf(object);
    if (object === null) break;
  }

  return object;
}

function _get(target, property, receiver) {
  if (typeof Reflect !== "undefined" && Reflect.get) {
    _get = Reflect.get;
  } else {
    _get = function _get(target, property, receiver) {
      var base = _superPropBase(target, property);

      if (!base) return;
      var desc = Object.getOwnPropertyDescriptor(base, property);

      if (desc.get) {
        return desc.get.call(receiver);
      }

      return desc.value;
    };
  }

  return _get(target, property, receiver || target);
}

function set(target, property, value, receiver) {
  if (typeof Reflect !== "undefined" && Reflect.set) {
    set = Reflect.set;
  } else {
    set = function set(target, property, value, receiver) {
      var base = _superPropBase(target, property);

      var desc;

      if (base) {
        desc = Object.getOwnPropertyDescriptor(base, property);

        if (desc.set) {
          desc.set.call(receiver, value);
          return true;
        } else if (!desc.writable) {
          return false;
        }
      }

      desc = Object.getOwnPropertyDescriptor(receiver, property);

      if (desc) {
        if (!desc.writable) {
          return false;
        }

        desc.value = value;
        Object.defineProperty(receiver, property, desc);
      } else {
        _defineProperty(receiver, property, value);
      }

      return true;
    };
  }

  return set(target, property, value, receiver);
}

function _set(target, property, value, receiver, isStrict) {
  var s = set(target, property, value, receiver || target);

  if (!s && isStrict) {
    throw new Error('failed to set property');
  }

  return value;
}

function _taggedTemplateLiteral(strings, raw) {
  if (!raw) {
    raw = strings.slice(0);
  }

  return Object.freeze(Object.defineProperties(strings, {
    raw: {
      value: Object.freeze(raw)
    }
  }));
}

function _taggedTemplateLiteralLoose(strings, raw) {
  if (!raw) {
    raw = strings.slice(0);
  }

  strings.raw = raw;
  return strings;
}

function _temporalRef(val, name) {
  if (val === _temporalUndefined) {
    throw new ReferenceError(name + " is not defined - temporal dead zone");
  } else {
    return val;
  }
}

function _readOnlyError(name) {
  throw new Error("\"" + name + "\" is read-only");
}

function _classNameTDZError(name) {
  throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
}

var _temporalUndefined = {};

function _slicedToArray(arr, i) {
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
}

function _slicedToArrayLoose(arr, i) {
  return _arrayWithHoles(arr) || _iterableToArrayLimitLoose(arr, i) || _nonIterableRest();
}

function _toArray(arr) {
  return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest();
}

function _toConsumableArray(arr) {
  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
}

function _arrayWithoutHoles(arr) {
  if (Array.isArray(arr)) {
    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];

    return arr2;
  }
}

function _arrayWithHoles(arr) {
  if (Array.isArray(arr)) return arr;
}

function _iterableToArray(iter) {
  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
}

function _iterableToArrayLimit(arr, i) {
  var _arr = [];
  var _n = true;
  var _d = false;
  var _e = undefined;

  try {
    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
      _arr.push(_s.value);

      if (i && _arr.length === i) break;
    }
  } catch (err) {
    _d = true;
    _e = err;
  } finally {
    try {
      if (!_n && _i["return"] != null) _i["return"]();
    } finally {
      if (_d) throw _e;
    }
  }

  return _arr;
}

function _iterableToArrayLimitLoose(arr, i) {
  var _arr = [];

  for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
    _arr.push(_step.value);

    if (i && _arr.length === i) break;
  }

  return _arr;
}

function _nonIterableSpread() {
  throw new TypeError("Invalid attempt to spread non-iterable instance");
}

function _nonIterableRest() {
  throw new TypeError("Invalid attempt to destructure non-iterable instance");
}

function _skipFirstGeneratorNext(fn) {
  return function () {
    var it = fn.apply(this, arguments);
    it.next();
    return it;
  };
}

function _toPrimitive(input, hint) {
  if (typeof input !== "object" || input === null) return input;
  var prim = input[Symbol.toPrimitive];

  if (prim !== undefined) {
    var res = prim.call(input, hint || "default");
    if (typeof res !== "object") return res;
    throw new TypeError("@@toPrimitive must return a primitive value.");
  }

  return (hint === "string" ? String : Number)(input);
}

function _toPropertyKey(arg) {
  var key = _toPrimitive(arg, "string");

  return typeof key === "symbol" ? key : String(key);
}

function _initializerWarningHelper(descriptor, context) {
  throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and set to use loose mode. ' + 'To use proposal-class-properties in spec mode with decorators, wait for ' + 'the next major version of decorators in stage 2.');
}

function _initializerDefineProperty(target, property, descriptor, context) {
  if (!descriptor) return;
  Object.defineProperty(target, property, {
    enumerable: descriptor.enumerable,
    configurable: descriptor.configurable,
    writable: descriptor.writable,
    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
  });
}

function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
  var desc = {};
  Object['ke' + 'ys'](descriptor).forEach(function (key) {
    desc[key] = descriptor[key];
  });
  desc.enumerable = !!desc.enumerable;
  desc.configurable = !!desc.configurable;

  if ('value' in desc || desc.initializer) {
    desc.writable = true;
  }

  desc = decorators.slice().reverse().reduce(function (desc, decorator) {
    return decorator(target, property, desc) || desc;
  }, desc);

  if (context && desc.initializer !== void 0) {
    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
    desc.initializer = undefined;
  }

  if (desc.initializer === void 0) {
    Object['define' + 'Property'](target, property, desc);
    desc = null;
  }

  return desc;
}

var id$1 = 0;

function _classPrivateFieldLooseKey(name) {
  return "__private_" + id$1++ + "_" + name;
}

function _classPrivateFieldLooseBase(receiver, privateKey) {
  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
    throw new TypeError("attempted to use private field on non-instance");
  }

  return receiver;
}

function _classPrivateFieldGet(receiver, privateMap) {
  if (!privateMap.has(receiver)) {
    throw new TypeError("attempted to get private field on non-instance");
  }

  return privateMap.get(receiver).value;
}

function _classPrivateFieldSet(receiver, privateMap, value) {
  if (!privateMap.has(receiver)) {
    throw new TypeError("attempted to set private field on non-instance");
  }

  var descriptor = privateMap.get(receiver);

  if (!descriptor.writable) {
    throw new TypeError("attempted to set read only private field");
  }

  descriptor.value = value;
  return value;
}

function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
  if (receiver !== classConstructor) {
    throw new TypeError("Private static access of wrong provenance");
  }

  return descriptor.value;
}

function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
  if (receiver !== classConstructor) {
    throw new TypeError("Private static access of wrong provenance");
  }

  if (!descriptor.writable) {
    throw new TypeError("attempted to set read only private field");
  }

  descriptor.value = value;
  return value;
}

function _decorate(decorators, factory, superClass) {
  var r = factory(function initialize(O) {
    _initializeInstanceElements(O, decorated.elements);
  }, superClass);

  var decorated = _decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);

  _initializeClassElements(r.F, decorated.elements);

  return _runClassFinishers(r.F, decorated.finishers);
}

function _createElementDescriptor(def) {
  var key = _toPropertyKey(def.key);

  var descriptor;

  if (def.kind === "method") {
    descriptor = {
      value: def.value,
      writable: true,
      configurable: true,
      enumerable: false
    };
    Object.defineProperty(def.value, "name", {
      value: typeof key === "symbol" ? "" : key,
      configurable: true
    });
  } else if (def.kind === "get") {
    descriptor = {
      get: def.value,
      configurable: true,
      enumerable: false
    };
  } else if (def.kind === "set") {
    descriptor = {
      set: def.value,
      configurable: true,
      enumerable: false
    };
  } else if (def.kind === "field") {
    descriptor = {
      configurable: true,
      writable: true,
      enumerable: true
    };
  }

  var element = {
    kind: def.kind === "field" ? "field" : "method",
    key: key,
    placement: def.static ? "static" : def.kind === "field" ? "own" : "prototype",
    descriptor: descriptor
  };
  if (def.decorators) element.decorators = def.decorators;
  if (def.kind === "field") element.initializer = def.value;
  return element;
}

function _coalesceGetterSetter(element, other) {
  if (element.descriptor.get !== undefined) {
    other.descriptor.get = element.descriptor.get;
  } else {
    other.descriptor.set = element.descriptor.set;
  }
}

function _coalesceClassElements(elements) {
  var newElements = [];

  var isSameElement = function (other) {
    return other.kind === "method" && other.key === element.key && other.placement === element.placement;
  };

  for (var i = 0; i < elements.length; i++) {
    var element = elements[i];
    var other;

    if (element.kind === "method" && (other = newElements.find(isSameElement))) {
      if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
        if (_hasDecorators(element) || _hasDecorators(other)) {
          throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
        }

        other.descriptor = element.descriptor;
      } else {
        if (_hasDecorators(element)) {
          if (_hasDecorators(other)) {
            throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
          }

          other.decorators = element.decorators;
        }

        _coalesceGetterSetter(element, other);
      }
    } else {
      newElements.push(element);
    }
  }

  return newElements;
}

function _hasDecorators(element) {
  return element.decorators && element.decorators.length;
}

function _isDataDescriptor(desc) {
  return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
}

function _initializeClassElements(F, elements) {
  var proto = F.prototype;
  ["method", "field"].forEach(function (kind) {
    elements.forEach(function (element) {
      var placement = element.placement;

      if (element.kind === kind && (placement === "static" || placement === "prototype")) {
        var receiver = placement === "static" ? F : proto;

        _defineClassElement(receiver, element);
      }
    });
  });
}

function _initializeInstanceElements(O, elements) {
  ["method", "field"].forEach(function (kind) {
    elements.forEach(function (element) {
      if (element.kind === kind && element.placement === "own") {
        _defineClassElement(O, element);
      }
    });
  });
}

function _defineClassElement(receiver, element) {
  var descriptor = element.descriptor;

  if (element.kind === "field") {
    var initializer = element.initializer;
    descriptor = {
      enumerable: descriptor.enumerable,
      writable: descriptor.writable,
      configurable: descriptor.configurable,
      value: initializer === void 0 ? void 0 : initializer.call(receiver)
    };
  }

  Object.defineProperty(receiver, element.key, descriptor);
}

function _decorateClass(elements, decorators) {
  var newElements = [];
  var finishers = [];
  var placements = {
    static: [],
    prototype: [],
    own: []
  };
  elements.forEach(function (element) {
    _addElementPlacement(element, placements);
  });
  elements.forEach(function (element) {
    if (!_hasDecorators(element)) return newElements.push(element);

    var elementFinishersExtras = _decorateElement(element, placements);

    newElements.push(elementFinishersExtras.element);
    newElements.push.apply(newElements, elementFinishersExtras.extras);
    finishers.push.apply(finishers, elementFinishersExtras.finishers);
  });

  if (!decorators) {
    return {
      elements: newElements,
      finishers: finishers
    };
  }

  var result = _decorateConstructor(newElements, decorators);

  finishers.push.apply(finishers, result.finishers);
  result.finishers = finishers;
  return result;
}

function _addElementPlacement(element, placements, silent) {
  var keys = placements[element.placement];

  if (!silent && keys.indexOf(element.key) !== -1) {
    throw new TypeError("Duplicated element (" + element.key + ")");
  }

  keys.push(element.key);
}

function _decorateElement(element, placements) {
  var extras = [];
  var finishers = [];

  for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
    var keys = placements[element.placement];
    keys.splice(keys.indexOf(element.key), 1);

    var elementObject = _fromElementDescriptor(element);

    var elementFinisherExtras = _toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);

    element = elementFinisherExtras.element;

    _addElementPlacement(element, placements);

    if (elementFinisherExtras.finisher) {
      finishers.push(elementFinisherExtras.finisher);
    }

    var newExtras = elementFinisherExtras.extras;

    if (newExtras) {
      for (var j = 0; j < newExtras.length; j++) {
        _addElementPlacement(newExtras[j], placements);
      }

      extras.push.apply(extras, newExtras);
    }
  }

  return {
    element: element,
    finishers: finishers,
    extras: extras
  };
}

function _decorateConstructor(elements, decorators) {
  var finishers = [];

  for (var i = decorators.length - 1; i >= 0; i--) {
    var obj = _fromClassDescriptor(elements);

    var elementsAndFinisher = _toClassDescriptor((0, decorators[i])(obj) || obj);

    if (elementsAndFinisher.finisher !== undefined) {
      finishers.push(elementsAndFinisher.finisher);
    }

    if (elementsAndFinisher.elements !== undefined) {
      elements = elementsAndFinisher.elements;

      for (var j = 0; j < elements.length - 1; j++) {
        for (var k = j + 1; k < elements.length; k++) {
          if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
            throw new TypeError("Duplicated element (" + elements[j].key + ")");
          }
        }
      }
    }
  }

  return {
    elements: elements,
    finishers: finishers
  };
}

function _fromElementDescriptor(element) {
  var obj = {
    kind: element.kind,
    key: element.key,
    placement: element.placement,
    descriptor: element.descriptor
  };
  var desc = {
    value: "Descriptor",
    configurable: true
  };
  Object.defineProperty(obj, Symbol.toStringTag, desc);
  if (element.kind === "field") obj.initializer = element.initializer;
  return obj;
}

function _toElementDescriptors(elementObjects) {
  if (elementObjects === undefined) return;
  return _toArray(elementObjects).map(function (elementObject) {
    var element = _toElementDescriptor(elementObject);

    _disallowProperty(elementObject, "finisher", "An element descriptor");

    _disallowProperty(elementObject, "extras", "An element descriptor");

    return element;
  });
}

function _toElementDescriptor(elementObject) {
  var kind = String(elementObject.kind);

  if (kind !== "method" && kind !== "field") {
    throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
  }

  var key = _toPropertyKey(elementObject.key);

  var placement = String(elementObject.placement);

  if (placement !== "static" && placement !== "prototype" && placement !== "own") {
    throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
  }

  var descriptor = elementObject.descriptor;

  _disallowProperty(elementObject, "elements", "An element descriptor");

  var element = {
    kind: kind,
    key: key,
    placement: placement,
    descriptor: Object.assign({}, descriptor)
  };

  if (kind !== "field") {
    _disallowProperty(elementObject, "initializer", "A method descriptor");
  } else {
    _disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");

    _disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");

    _disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");

    element.initializer = elementObject.initializer;
  }

  return element;
}

function _toElementFinisherExtras(elementObject) {
  var element = _toElementDescriptor(elementObject);

  var finisher = _optionalCallableProperty(elementObject, "finisher");

  var extras = _toElementDescriptors(elementObject.extras);

  return {
    element: element,
    finisher: finisher,
    extras: extras
  };
}

function _fromClassDescriptor(elements) {
  var obj = {
    kind: "class",
    elements: elements.map(_fromElementDescriptor)
  };
  var desc = {
    value: "Descriptor",
    configurable: true
  };
  Object.defineProperty(obj, Symbol.toStringTag, desc);
  return obj;
}

function _toClassDescriptor(obj) {
  var kind = String(obj.kind);

  if (kind !== "class") {
    throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
  }

  _disallowProperty(obj, "key", "A class descriptor");

  _disallowProperty(obj, "placement", "A class descriptor");

  _disallowProperty(obj, "descriptor", "A class descriptor");

  _disallowProperty(obj, "initializer", "A class descriptor");

  _disallowProperty(obj, "extras", "A class descriptor");

  var finisher = _optionalCallableProperty(obj, "finisher");

  var elements = _toElementDescriptors(obj.elements);

  return {
    elements: elements,
    finisher: finisher
  };
}

function _disallowProperty(obj, name, objectType) {
  if (obj[name] !== undefined) {
    throw new TypeError(objectType + " can't have a ." + name + " property.");
  }
}

function _optionalCallableProperty(obj, name) {
  var value = obj[name];

  if (value !== undefined && typeof value !== "function") {
    throw new TypeError("Expected '" + name + "' to be a function");
  }

  return value;
}

function _runClassFinishers(constructor, finishers) {
  for (var i = 0; i < finishers.length; i++) {
    var newConstructor = (0, finishers[i])(constructor);

    if (newConstructor !== undefined) {
      if (typeof newConstructor !== "function") {
        throw new TypeError("Finishers must return a constructor.");
      }

      constructor = newConstructor;
    }
  }

  return constructor;
}

function _classPrivateMethodGet(receiver, privateSet, fn) {
  if (!privateSet.has(receiver)) {
    throw new TypeError("attempted to get private field on non-instance");
  }

  return fn;
}

function _classPrivateMethodSet() {
  throw new TypeError("attempted to reassign private method");
}

var prefix = {
  dev: 'dev-',
  test: 'test-',
  pre: 'pre-',
  online: ''
};
var urls = {
  api: 'api.weclassroom.com',
  report: 's.weclassroom.com'
};
var INSTITUTIONID_APPID_MAP = {
  test: {
    '2020': '580745',
    //素养小班课
    '1062': 'd46144',
    //素养大班课(小组课、通用课)
    '2021': 'c907b9',
    //素养组合小班课
    '1187': '580745',
    //素养同城课
    '2022': '',
    //素养伴学
    '2023': 'c1de11',
    //素养1v1
    '3000': '388257',
    //乐读小组
    '3001': '714eb2',
    //乐读小班
    '3004': 'c2813e',
    //乐读伴学
    '3005': '714eb2',
    //saas自习室
    '3006': '2d0893' //乐乐课堂

  },
  online: {
    '2020': '05214e',
    //素养小班课
    '1134': '4f1786',
    //素养大班课(小组课、通用课)
    '2021': 'cca684',
    //素养组合小班课
    '1187': '05214e',
    //素养同城课
    '2022': '',
    //素养伴学
    '2023': '68caa7',
    //素养1v1
    '3000': 'c82956',
    //乐读小组
    '3001': '812bb0',
    //乐读小班
    '3004': '3f5e09',
    //乐读伴学
    '3005': '812bb0',
    //saas自习室
    '3006': '2d0893' //乐乐课堂

  }
};
var version = '1.0.49-beta-20260807'; // export const version = '1.0.49-beta-saas-20230804';

var liveExt = {
  name: 'live',
  version: '1.0.0.0'
};
var toolExt = {
  name: 'tool',
  version: '1.0.0.0'
};
var defaultExt = {
  name: 'default_ext',
  version: '1.0.0.0'
};
var zegoExt = {
  name: 'zego_ext',
  version: '1.0.0.0'
};
var utilitiesExt = {
  name: 'utilities_ext',
  version: '1.0.0.0'
};
var talrtcExt = {
  name: 'talrtc_ext',
  version: '1.0.0.0'
}; // 小班=0,大班=1

var classType = 0;
var productName$1 = 'zby-live-sdk';
var zegoSdkName = 'zego';
var talSdkName = 'Tal';
var rtcSdkName = 'rtc';
var tmSdkName = 'tm';
var talrtcSdkName = 'talrtc';
var extensionInfo = {
  version: {
    default_ext: '1.0.0.0' // arora : '1.0.0.1',
    // rtc   : '1.0.0.0',
    // zego  : '1.0.0.0',
    // tool  : '1.0.0.0'

  }
};
var config = {
  isHttps: true,
  env: 'test',
  weblog: true,
  businessLinesType: 'saas' // saas | xes

};
var getBaseUrl = function getBaseUrl() {
  var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'api';
  var isHttps = config.isHttps,
      env = config.env;
  return "".concat(isHttps ? 'https://' : 'http://').concat(prefix[env ? env : 'online']).concat(urls[type]);
};
var getCloudApiDomain = function getCloudApiDomain() {
  if (window.zby_sdk_cloud_api_domain) {
    return window.zby_sdk_cloud_api_domain;
  }

  return getBaseUrl();
};
var reportUrls = {
  // test: 'test-dp.weclassroom.com:10443/report',
  // online: 'dp.weclassroom.com:443/report'
  test: 'testdp-s.weclassroom.com/report',
  online: 'dp-s.weclassroom.com/report '
};
var logAddressInit = {
  test: 'live_test_log',
  online: 'live_log'
}; // 从三方服务器获取时间戳

var timestampUrl = {
  suning: 'https://quan.suning.com/getSysTime.do',
  taobao: 'https://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp'
}; // 获取初始化数据

var apiCloudUrl = {
  saas: {
    test: 'https://test-api-cloud-control-zhibo.saasp.vdyoo.com/live-cloud-control',
    online: 'https://api-cloud-control-zhibo.saasp.vdyoo.com/live-cloud-control'
  },
  xes: {
    test: 'https://test-api-cloud-control-zhibo.speiyou.com/live-cloud-control',
    online: 'https://api-cloud-control-zhibo.speiyou.com/live-cloud-control'
  }
}; //切换sdk类型

var apiChangeSdkUrl = {
  saas: {
    test: 'https://test-cloud-platform-live.saasp.vdyoo.com/cloud-platform',
    online: 'https://cloud-platform-live.saasp.vdyoo.com/cloud-platform'
  },
  xes: {
    test: 'https://test-cloud-platform-live.speiyou.com/cloud-platform',
    online: 'https://cloud-platform-live.speiyou.com/cloud-platform'
  }
};
var rtcTokenUrl = {
  test: 'https://api2.xueersi.com/rtcapi2stage/peiyou/getRtcToken',
  online: 'https://api2.xueersi.com/rtcapi2/peiyou/getRtcToken'
};
var rtcTokenBackupUrl = {
  test: 'https://rtcapi2.eaydu.com/peiyou/getRtcToken',
  online: 'https://rtcapi2.eaydu.com/peiyou/getRtcToken'
};
var rtcTokenTimeoutConfig = {
  primary: {
    timeout: 5000,
    retries: 3
  },
  backup: {
    timeouts: [4000, 8000, 8000, 8000, 16000, 16000],
    retries: 5
  }
};
var getApiCloudBaseUrl$1 = function getApiCloudBaseUrl() {
  var env = config.env,
      businessLinesType = config.businessLinesType;
  return apiCloudUrl[businessLinesType] && apiCloudUrl[businessLinesType][env];
};
var getApiChangeSdkUrl = function getApiChangeSdkUrl() {
  var env = config.env,
      businessLinesType = config.businessLinesType;
  return apiChangeSdkUrl[businessLinesType] && apiChangeSdkUrl[businessLinesType][env];
};
var dabanReportUrl = '';
var logAddress = '';
var getReportBaseUrl = function getReportBaseUrl() {
  if (dabanReportUrl) {
    return dabanReportUrl;
  }

  var env = config.env;
  return "https://".concat(reportUrls[env]);
};
var getLogAddress = function getLogAddress() {
  var env = config.env;
  console.log("logAddresshsghsg ".concat(env, " ").concat(logAddressInit[env]));
  logAddress = logAddressInit[env]; // return logAddress;
};
var getapiChangeSdkUrl = function getapiChangeSdkUrl() {
  var env = config.env,
      businessLinesType = config.businessLinesType;
  return apiChangeSdkUrl[businessLinesType] && apiChangeSdkUrl[businessLinesType][env];
};
var getAppIdByInstitutionId = function getAppIdByInstitutionId(institutionId) {
  var env = config.env;
  var institutionIdAppIdMap = INSTITUTIONID_APPID_MAP[env];
  if (!institutionIdAppIdMap) return;
  return institutionIdAppIdMap[institutionId];
};
var getRTCTokenUrl = function getRTCTokenUrl() {
  var env = config.env;
  return rtcTokenUrl[env];
}; // 根据当前环境(test/online)返回对应的备用域名URL

var getRTCTokenBackupUrl = function getRTCTokenBackupUrl() {
  var env = config.env;
  return rtcTokenBackupUrl[env];
}; // 返回完整的超时配置对象,供其他模块使用

var getRTCTokenTimeoutConfig = function getRTCTokenTimeoutConfig() {
  return rtcTokenTimeoutConfig;
};
/**
 * pomelo备用域名
 * @type {{ host: string, port: number }[]}
 */

var pomeloBackupDomains = [];
var globalConfig = {
  version: version,
  extensionInfo: extensionInfo,
  getBaseUrl: getBaseUrl,
  pomeloBackupDomains: pomeloBackupDomains,
  usePomelo: true,
  config: config
};

var EM$1 = window.EM;

var cb = function cb(extName) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$1) {
    return function (name, args, sdkName) {
      var argsStr = _typeof(args) === 'object' ? JSON.stringify(_objectSpread({}, args, {
        classType: classType
      })) : args;
      return new Promise(function (resolve, reject) {
        EM$1.CallMethod(extName, name, argsStr, function (code, msg) {
          var msgbody = "".concat(extName, "--action: ").concat(sdkName || '', "--").concat(name || name.charAt(0).toLowerCase() + name.slice(1), " Code: ").concat(code, "\nMessage: ").concat(msg, "\nparams:").concat(JSON.stringify(args));

          if (code === 0) {
            name !== 'WriteLog' && defaultApi.writeLog && defaultApi.writeLog(msgbody, productName);
            resolve({
              code: code,
              msg: msg && /\{|\}/g.test(msg) && JSON.parse(msg)
            });
          } else {
            name !== 'WriteLog' && defaultApi.writeLog && defaultApi.writeLog(msgbody, productName, 'error');
            resolve({
              code: code,
              msg: msg
            });
          }
        });
      }).catch(function () {
        name !== 'WriteLog' && defaultApi.writeLog && defaultApi.writeLog("".concat(extName, "--action: ").concat(sdkName || '', "--").concat(name || name.charAt(0).toLowerCase() + name.slice(1), " Code: ").concat(code, "\nMessage: ").concat(msg, "\nparams:").concat(JSON.stringify(args)), productName, 'error');
      });
    };
  }
};

var callMethod = cb(defaultExt.name);
var BASSAPI = {
  // 初始化
  init: function init() {
    // 加载扩展
    if (EM$1) {
      return new Promise(function (resolve) {
        EM$1.Load(defaultExt.name, defaultExt.version, false, function () {
          resolve();
        });
      });
    }
  },
  writeLog: function writeLog(args) {
    return callMethod('WriteLog', args);
  },

  /**
   * @function 设置用户信息
   * @param {string} userId 用户id
   * @param {string} institutionId 机构id
   * @return: void
   */
  setUserInfo: function setUserInfo(userId, institutionId) {
    return callMethod('SetUserInfo', {
      user_id: userId + '',
      institution_id: institutionId + '',
      description: ''
    });
  }
};

/*eslint-disable*/

/*
 * @Author: why
 * @Date: 2020-05-25 17:07:03
 * @LastEditors: why
 * @LastEditTime: 2020-05-25 17:41:42
 * @Description: 
 */

/**
 * [js-sha256]{@link https://github.com/emn178/js-sha256}
 *
 * @version 0.9.0
 * @author Chen, Yi-Cyuan [emn178@gmail.com]
 * @copyright Chen, Yi-Cyuan 2014-2017
 * @license MIT
 */

/*jslint bitwise: true */
var ERROR = 'input is invalid type';
var WINDOW = (typeof window === "undefined" ? "undefined" : _typeof(window)) === 'object';
var root = WINDOW ? window : {};

if (root.JS_SHA256_NO_WINDOW) {
  WINDOW = false;
}

var WEB_WORKER = !WINDOW && (typeof self === "undefined" ? "undefined" : _typeof(self)) === 'object';
var NODE_JS = !root.JS_SHA256_NO_NODE_JS && (typeof process === "undefined" ? "undefined" : _typeof(process)) === 'object' && process.versions && process.versions.node;

if (NODE_JS) {
  root = global;
} else if (WEB_WORKER) {
  root = self;
}

var ARRAY_BUFFER = !root.JS_SHA256_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
var HEX_CHARS = '0123456789abcdef'.split('');
var EXTRA = [-2147483648, 8388608, 32768, 128];
var SHIFT = [24, 16, 8, 0];
var K = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
var blocks = [];

if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {
  Array.isArray = function (obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  };
}

if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
  ArrayBuffer.isView = function (obj) {
    return _typeof(obj) === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
  };
}

var createOutputMethod = function createOutputMethod(outputType, is224) {
  return function (message) {
    return new Sha256(is224, true).update(message)[outputType]();
  };
};

var createMethod = function createMethod(is224) {
  var method = createOutputMethod('hex', is224);

  method.create = function () {
    return new Sha256(is224);
  };

  method.update = function (message) {
    return method.create().update(message);
  };

  for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
    var type = OUTPUT_TYPES[i];
    method[type] = createOutputMethod(type, is224);
  }

  return method;
};

var createHmacOutputMethod = function createHmacOutputMethod(outputType, is224) {
  return function (key, message) {
    return new HmacSha256(key, is224, true).update(message)[outputType]();
  };
};

var createHmacMethod = function createHmacMethod(is224) {
  var method = createHmacOutputMethod('hex', is224);

  method.create = function (key) {
    return new HmacSha256(key, is224);
  };

  method.update = function (key, message) {
    return method.create(key).update(message);
  };

  for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
    var type = OUTPUT_TYPES[i];
    method[type] = createHmacOutputMethod(type, is224);
  }

  return method;
};

function Sha256(is224, sharedMemory) {
  if (sharedMemory) {
    blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
    this.blocks = blocks;
  } else {
    this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  }

  if (is224) {
    this.h0 = 0xc1059ed8;
    this.h1 = 0x367cd507;
    this.h2 = 0x3070dd17;
    this.h3 = 0xf70e5939;
    this.h4 = 0xffc00b31;
    this.h5 = 0x68581511;
    this.h6 = 0x64f98fa7;
    this.h7 = 0xbefa4fa4;
  } else {
    // 256
    this.h0 = 0x6a09e667;
    this.h1 = 0xbb67ae85;
    this.h2 = 0x3c6ef372;
    this.h3 = 0xa54ff53a;
    this.h4 = 0x510e527f;
    this.h5 = 0x9b05688c;
    this.h6 = 0x1f83d9ab;
    this.h7 = 0x5be0cd19;
  }

  this.block = this.start = this.bytes = this.hBytes = 0;
  this.finalized = this.hashed = false;
  this.first = true;
  this.is224 = is224;
}

Sha256.prototype.update = function (message) {
  if (this.finalized) {
    return;
  }

  var notString,
      type = _typeof(message);

  if (type !== 'string') {
    if (type === 'object') {
      if (message === null) {
        throw new Error(ERROR);
      } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
        message = new Uint8Array(message);
      } else if (!Array.isArray(message)) {
        if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
          throw new Error(ERROR);
        }
      }
    } else {
      throw new Error(ERROR);
    }

    notString = true;
  }

  var code,
      index = 0,
      i,
      length = message.length,
      blocks = this.blocks;

  while (index < length) {
    if (this.hashed) {
      this.hashed = false;
      blocks[0] = this.block;
      blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
    }

    if (notString) {
      for (i = this.start; index < length && i < 64; ++index) {
        blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
      }
    } else {
      for (i = this.start; index < length && i < 64; ++index) {
        code = message.charCodeAt(index);

        if (code < 0x80) {
          blocks[i >> 2] |= code << SHIFT[i++ & 3];
        } else if (code < 0x800) {
          blocks[i >> 2] |= (0xc0 | code >> 6) << SHIFT[i++ & 3];
          blocks[i >> 2] |= (0x80 | code & 0x3f) << SHIFT[i++ & 3];
        } else if (code < 0xd800 || code >= 0xe000) {
          blocks[i >> 2] |= (0xe0 | code >> 12) << SHIFT[i++ & 3];
          blocks[i >> 2] |= (0x80 | code >> 6 & 0x3f) << SHIFT[i++ & 3];
          blocks[i >> 2] |= (0x80 | code & 0x3f) << SHIFT[i++ & 3];
        } else {
          code = 0x10000 + ((code & 0x3ff) << 10 | message.charCodeAt(++index) & 0x3ff);
          blocks[i >> 2] |= (0xf0 | code >> 18) << SHIFT[i++ & 3];
          blocks[i >> 2] |= (0x80 | code >> 12 & 0x3f) << SHIFT[i++ & 3];
          blocks[i >> 2] |= (0x80 | code >> 6 & 0x3f) << SHIFT[i++ & 3];
          blocks[i >> 2] |= (0x80 | code & 0x3f) << SHIFT[i++ & 3];
        }
      }
    }

    this.lastByteIndex = i;
    this.bytes += i - this.start;

    if (i >= 64) {
      this.block = blocks[16];
      this.start = i - 64;
      this.hash();
      this.hashed = true;
    } else {
      this.start = i;
    }
  }

  if (this.bytes > 4294967295) {
    this.hBytes += this.bytes / 4294967296 << 0;
    this.bytes = this.bytes % 4294967296;
  }

  return this;
};

Sha256.prototype.finalize = function () {
  if (this.finalized) {
    return;
  }

  this.finalized = true;
  var blocks = this.blocks,
      i = this.lastByteIndex;
  blocks[16] = this.block;
  blocks[i >> 2] |= EXTRA[i & 3];
  this.block = blocks[16];

  if (i >= 56) {
    if (!this.hashed) {
      this.hash();
    }

    blocks[0] = this.block;
    blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  }

  blocks[14] = this.hBytes << 3 | this.bytes >>> 29;
  blocks[15] = this.bytes << 3;
  this.hash();
};

Sha256.prototype.hash = function () {
  var a = this.h0,
      b = this.h1,
      c = this.h2,
      d = this.h3,
      e = this.h4,
      f = this.h5,
      g = this.h6,
      h = this.h7,
      blocks = this.blocks,
      j,
      s0,
      s1,
      maj,
      t1,
      t2,
      ch,
      ab,
      da,
      cd,
      bc;

  for (j = 16; j < 64; ++j) {
    // rightrotate
    t1 = blocks[j - 15];
    s0 = (t1 >>> 7 | t1 << 25) ^ (t1 >>> 18 | t1 << 14) ^ t1 >>> 3;
    t1 = blocks[j - 2];
    s1 = (t1 >>> 17 | t1 << 15) ^ (t1 >>> 19 | t1 << 13) ^ t1 >>> 10;
    blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;
  }

  bc = b & c;

  for (j = 0; j < 64; j += 4) {
    if (this.first) {
      if (this.is224) {
        ab = 300032;
        t1 = blocks[0] - 1413257819;
        h = t1 - 150054599 << 0;
        d = t1 + 24177077 << 0;
      } else {
        ab = 704751109;
        t1 = blocks[0] - 210244248;
        h = t1 - 1521486534 << 0;
        d = t1 + 143694565 << 0;
      }

      this.first = false;
    } else {
      s0 = (a >>> 2 | a << 30) ^ (a >>> 13 | a << 19) ^ (a >>> 22 | a << 10);
      s1 = (e >>> 6 | e << 26) ^ (e >>> 11 | e << 21) ^ (e >>> 25 | e << 7);
      ab = a & b;
      maj = ab ^ a & c ^ bc;
      ch = e & f ^ ~e & g;
      t1 = h + s1 + ch + K[j] + blocks[j];
      t2 = s0 + maj;
      h = d + t1 << 0;
      d = t1 + t2 << 0;
    }

    s0 = (d >>> 2 | d << 30) ^ (d >>> 13 | d << 19) ^ (d >>> 22 | d << 10);
    s1 = (h >>> 6 | h << 26) ^ (h >>> 11 | h << 21) ^ (h >>> 25 | h << 7);
    da = d & a;
    maj = da ^ d & b ^ ab;
    ch = h & e ^ ~h & f;
    t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
    t2 = s0 + maj;
    g = c + t1 << 0;
    c = t1 + t2 << 0;
    s0 = (c >>> 2 | c << 30) ^ (c >>> 13 | c << 19) ^ (c >>> 22 | c << 10);
    s1 = (g >>> 6 | g << 26) ^ (g >>> 11 | g << 21) ^ (g >>> 25 | g << 7);
    cd = c & d;
    maj = cd ^ c & a ^ da;
    ch = g & h ^ ~g & e;
    t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
    t2 = s0 + maj;
    f = b + t1 << 0;
    b = t1 + t2 << 0;
    s0 = (b >>> 2 | b << 30) ^ (b >>> 13 | b << 19) ^ (b >>> 22 | b << 10);
    s1 = (f >>> 6 | f << 26) ^ (f >>> 11 | f << 21) ^ (f >>> 25 | f << 7);
    bc = b & c;
    maj = bc ^ b & d ^ cd;
    ch = f & g ^ ~f & h;
    t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
    t2 = s0 + maj;
    e = a + t1 << 0;
    a = t1 + t2 << 0;
  }

  this.h0 = this.h0 + a << 0;
  this.h1 = this.h1 + b << 0;
  this.h2 = this.h2 + c << 0;
  this.h3 = this.h3 + d << 0;
  this.h4 = this.h4 + e << 0;
  this.h5 = this.h5 + f << 0;
  this.h6 = this.h6 + g << 0;
  this.h7 = this.h7 + h << 0;
};

Sha256.prototype.hex = function () {
  this.finalize();
  var h0 = this.h0,
      h1 = this.h1,
      h2 = this.h2,
      h3 = this.h3,
      h4 = this.h4,
      h5 = this.h5,
      h6 = this.h6,
      h7 = this.h7;
  var hex = HEX_CHARS[h0 >> 28 & 0x0F] + HEX_CHARS[h0 >> 24 & 0x0F] + HEX_CHARS[h0 >> 20 & 0x0F] + HEX_CHARS[h0 >> 16 & 0x0F] + HEX_CHARS[h0 >> 12 & 0x0F] + HEX_CHARS[h0 >> 8 & 0x0F] + HEX_CHARS[h0 >> 4 & 0x0F] + HEX_CHARS[h0 & 0x0F] + HEX_CHARS[h1 >> 28 & 0x0F] + HEX_CHARS[h1 >> 24 & 0x0F] + HEX_CHARS[h1 >> 20 & 0x0F] + HEX_CHARS[h1 >> 16 & 0x0F] + HEX_CHARS[h1 >> 12 & 0x0F] + HEX_CHARS[h1 >> 8 & 0x0F] + HEX_CHARS[h1 >> 4 & 0x0F] + HEX_CHARS[h1 & 0x0F] + HEX_CHARS[h2 >> 28 & 0x0F] + HEX_CHARS[h2 >> 24 & 0x0F] + HEX_CHARS[h2 >> 20 & 0x0F] + HEX_CHARS[h2 >> 16 & 0x0F] + HEX_CHARS[h2 >> 12 & 0x0F] + HEX_CHARS[h2 >> 8 & 0x0F] + HEX_CHARS[h2 >> 4 & 0x0F] + HEX_CHARS[h2 & 0x0F] + HEX_CHARS[h3 >> 28 & 0x0F] + HEX_CHARS[h3 >> 24 & 0x0F] + HEX_CHARS[h3 >> 20 & 0x0F] + HEX_CHARS[h3 >> 16 & 0x0F] + HEX_CHARS[h3 >> 12 & 0x0F] + HEX_CHARS[h3 >> 8 & 0x0F] + HEX_CHARS[h3 >> 4 & 0x0F] + HEX_CHARS[h3 & 0x0F] + HEX_CHARS[h4 >> 28 & 0x0F] + HEX_CHARS[h4 >> 24 & 0x0F] + HEX_CHARS[h4 >> 20 & 0x0F] + HEX_CHARS[h4 >> 16 & 0x0F] + HEX_CHARS[h4 >> 12 & 0x0F] + HEX_CHARS[h4 >> 8 & 0x0F] + HEX_CHARS[h4 >> 4 & 0x0F] + HEX_CHARS[h4 & 0x0F] + HEX_CHARS[h5 >> 28 & 0x0F] + HEX_CHARS[h5 >> 24 & 0x0F] + HEX_CHARS[h5 >> 20 & 0x0F] + HEX_CHARS[h5 >> 16 & 0x0F] + HEX_CHARS[h5 >> 12 & 0x0F] + HEX_CHARS[h5 >> 8 & 0x0F] + HEX_CHARS[h5 >> 4 & 0x0F] + HEX_CHARS[h5 & 0x0F] + HEX_CHARS[h6 >> 28 & 0x0F] + HEX_CHARS[h6 >> 24 & 0x0F] + HEX_CHARS[h6 >> 20 & 0x0F] + HEX_CHARS[h6 >> 16 & 0x0F] + HEX_CHARS[h6 >> 12 & 0x0F] + HEX_CHARS[h6 >> 8 & 0x0F] + HEX_CHARS[h6 >> 4 & 0x0F] + HEX_CHARS[h6 & 0x0F];

  if (!this.is224) {
    hex += HEX_CHARS[h7 >> 28 & 0x0F] + HEX_CHARS[h7 >> 24 & 0x0F] + HEX_CHARS[h7 >> 20 & 0x0F] + HEX_CHARS[h7 >> 16 & 0x0F] + HEX_CHARS[h7 >> 12 & 0x0F] + HEX_CHARS[h7 >> 8 & 0x0F] + HEX_CHARS[h7 >> 4 & 0x0F] + HEX_CHARS[h7 & 0x0F];
  }

  return hex;
};

Sha256.prototype.toString = Sha256.prototype.hex;

Sha256.prototype.digest = function () {
  this.finalize();
  var h0 = this.h0,
      h1 = this.h1,
      h2 = this.h2,
      h3 = this.h3,
      h4 = this.h4,
      h5 = this.h5,
      h6 = this.h6,
      h7 = this.h7;
  var arr = [h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF];

  if (!this.is224) {
    arr.push(h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF);
  }

  return arr;
};

Sha256.prototype.array = Sha256.prototype.digest;

Sha256.prototype.arrayBuffer = function () {
  this.finalize();
  var buffer = new ArrayBuffer(this.is224 ? 28 : 32);
  var dataView = new DataView(buffer);
  dataView.setUint32(0, this.h0);
  dataView.setUint32(4, this.h1);
  dataView.setUint32(8, this.h2);
  dataView.setUint32(12, this.h3);
  dataView.setUint32(16, this.h4);
  dataView.setUint32(20, this.h5);
  dataView.setUint32(24, this.h6);

  if (!this.is224) {
    dataView.setUint32(28, this.h7);
  }

  return buffer;
};

function HmacSha256(key, is224, sharedMemory) {
  var i,
      type = _typeof(key);

  if (type === 'string') {
    var bytes = [],
        length = key.length,
        index = 0,
        code;

    for (i = 0; i < length; ++i) {
      code = key.charCodeAt(i);

      if (code < 0x80) {
        bytes[index++] = code;
      } else if (code < 0x800) {
        bytes[index++] = 0xc0 | code >> 6;
        bytes[index++] = 0x80 | code & 0x3f;
      } else if (code < 0xd800 || code >= 0xe000) {
        bytes[index++] = 0xe0 | code >> 12;
        bytes[index++] = 0x80 | code >> 6 & 0x3f;
        bytes[index++] = 0x80 | code & 0x3f;
      } else {
        code = 0x10000 + ((code & 0x3ff) << 10 | key.charCodeAt(++i) & 0x3ff);
        bytes[index++] = 0xf0 | code >> 18;
        bytes[index++] = 0x80 | code >> 12 & 0x3f;
        bytes[index++] = 0x80 | code >> 6 & 0x3f;
        bytes[index++] = 0x80 | code & 0x3f;
      }
    }

    key = bytes;
  } else {
    if (type === 'object') {
      if (key === null) {
        throw new Error(ERROR);
      } else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) {
        key = new Uint8Array(key);
      } else if (!Array.isArray(key)) {
        if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) {
          throw new Error(ERROR);
        }
      }
    } else {
      throw new Error(ERROR);
    }
  }

  if (key.length > 64) {
    key = new Sha256(is224, true).update(key).array();
  }

  var oKeyPad = [],
      iKeyPad = [];

  for (i = 0; i < 64; ++i) {
    var b = key[i] || 0;
    oKeyPad[i] = 0x5c ^ b;
    iKeyPad[i] = 0x36 ^ b;
  }

  Sha256.call(this, is224, sharedMemory);
  this.update(iKeyPad);
  this.oKeyPad = oKeyPad;
  this.inner = true;
  this.sharedMemory = sharedMemory;
}

HmacSha256.prototype = new Sha256();

HmacSha256.prototype.finalize = function () {
  Sha256.prototype.finalize.call(this);

  if (this.inner) {
    this.inner = false;
    var innerHash = this.array();
    Sha256.call(this, this.is224, this.sharedMemory);
    this.update(this.oKeyPad);
    this.update(innerHash);
    Sha256.prototype.finalize.call(this);
  }
};

var sha256 = {
  sha256: createMethod(),
  sha224: createMethod(true),
  hmacsha256: createHmacMethod(),
  hmacsha224: createHmacMethod(true)
};

/*
 * @Author: songge
 * @Date: 2020-08-31 16:13:51
 * @LastEditTime: 2020-08-31 19:21:52
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \demo9\51-demo\src\_zby_live_sdk\src\network\commonFetch.js
 */
/**
 * 真正的请求
 * @param url 请求地址
 * @param options 请求参数
 * @param method 请求方式
 */

var get = function get(params, url, timeout, headers) {
  return axios({
    method: 'get',
    url: url,
    timeout: timeout,
    params: params,
    headers: headers
  });
};

var post = function post(data, url, timeout, headers) {
  return axios({
    method: 'post',
    url: url,
    timeout: timeout,
    data: data,
    headers: headers
  });
};

var post1 = function post1(data, url, timeout, headers) {
  return axios({
    method: 'post',
    url: url,
    timeout: timeout,
    data: Qs.stringify(data),
    headers: headers
  });
};

function commonFetch(url, options) {
  var method = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'GET';
  var timeOut = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 60000;
  var headers = arguments.length > 4 ? arguments[4] : undefined;

  if (method === 'GET') {
    // 如果是GET请求,拼接url
    return get(options, url, timeOut, headers).then(function (res) {
      return res.data;
    });
  } else if (method === 'POST') {
    return post(options, url, timeOut, headers).then(function (res) {
      return res.data;
    });
  } else if (method === 'FROMDATA') {
    var _headers = {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    };
    return post1(options, url, timeOut, _headers).then(function (res) {
      return res.data;
    });
  }
}

/*
 * @Author: your name
 * @Date: 2020-08-28 17:06:45
 * @LastEditTime: 2020-12-15 13:18:45
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \1705\zby_live_sdk\src\network\api.js
 */

function getImServerAddress(param) {
  return commonFetch("".concat(getCloudApiDomain(), "/service/chat"), param, 'GET');
}
/**
 * @function 从三方服务器获取时间戳
 */

function getNetworkTimestampApi() {
  var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'taobao';
  return commonFetch(timestampUrl[name], 'GET');
} // 获取云控参数

function getCloudData(param) {
  return commonFetch("".concat(getApiCloudBaseUrl$1(), "/rtccloud/class/init"), param, 'GET', null, util.getVerifySign1());
} //获取初始化参数

function getInitParams(param) {
  var types = {
    student: '/v1/play/init',
    teacher: '/v1/push/init',
    assistant: '/v1/push/init'
  };
  var institutionId = param.institutionId,
      userId = param.userId,
      liveId = param.liveId,
      role = param.role;
  return commonFetch("".concat(getApiCloudBaseUrl$1()).concat(types[role]), {
    institutionId: institutionId,
    userId: userId,
    liveId: liveId
  }, 'GET');
} //获取新旧信道开关和地址

function getSwitchDomain(param) {
  return commonFetch("".concat(getApiCloudBaseUrl$1(), "/v1/switch/domain"), param, 'GET');
}
function dabanDataReport(param) {
  return commonFetch(getReportBaseUrl(), param, 'POST');
} //sdk切换(客户端直接调用)  根据上课情况手动操作,对单个组ID进行SDK切换
// export function changeSdkInRoom(param){
//   return commonFetch(`${getApiChangeSdkUrl()}/rtccloud/sdk/set/room/client`, param, 'FROMDATA');
// }

function changeSdkInRoom(param) {
  return commonFetch("".concat(getApiChangeSdkUrl(), "/rtccloud/sdk/set/lecture/client"), param, 'FROMDATA');
}
var getAndSetInitParams = async function getAndSetInitParams(args) {
  var res = await getInitParams(args);

  if (res && res.sdkInfo) {
    console.log("\u4E91\u63A7\u8BF7\u6C42\u8FD4\u56DE\u53C2\u6570\u6B63\u5E38 ".concat(JSON.stringify(res), ", ").concat(JSON.stringify(res.sdkInfo)));
    return res.sdkInfo[0].sdkName;
  } else {
    console.log("\u4E91\u63A7\u8BF7\u6C42\u8FD4\u56DE\u53C2\u6570\u9519\u8BEF ".concat(JSON.stringify(res)));
  }
};
/**
 * 第一阶段:请求主域名获取RTC Token
 * @param {Object} args 请求参数 
 * @param {number} retries 当前重试次数
 * @returns {Promise<string>} Token字符串 - 返回Promise对象
 */

var getRTCTokenPrimary = async function getRTCTokenPrimary(args) {
  var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  var onRetry = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
  // 获取超时配置
  var timeoutConfig = getRTCTokenTimeoutConfig();
  var ts = Date.now(); // 构建HTTP请求头

  var headers = {
    'X-Auth-Sign': MD5("py_client&".concat(ts, "60439d96cfbecc2de2872641aea204f2")),
    'traceid': util.uuid(),
    'X-Auth-Appid': 'py_client',
    'X-Auth-TimeStamp': '' + ts,
    'Content-Type': 'application/json'
  };

  try {
    // 发起HTTP请求,commonFetch是封装的HTTP请求函数
    var res = await commonFetch(getRTCTokenUrl(), args, 'POST', timeoutConfig.primary.timeout, headers);

    if (res.s === 10000) {
      defaultApi$1.writeLog("Primary domain token success: ".concat(res.d.token), undefined, 'info');
      return res.d.token;
    } else {
      defaultApi$1.writeLog("Primary domain token failed: ".concat(JSON.stringify(res)), undefined, 'error');
      throw new Error("Primary domain response error: ".concat(res.s));
    }
  } catch (err) {
    defaultApi$1.writeLog("Primary domain request failed: ".concat(JSON.stringify(err), ", retry times: ").concat(retries), undefined, 'error');

    if (retries < timeoutConfig.primary.retries) {
      if (typeof onRetry === 'function') onRetry();
      return getRTCTokenPrimary(args, retries + 1, onRetry);
    } else {
      throw new Error('Primary domain exhausted all retries');
    }
  }
};
/**
 * 第二阶段:请求备用域名获取RTC Token
 * @param {Object} args 请求参数 
 * @param {number} retries 当前重试次数 
 * @returns {Promise<string>} Token字符串 - 返回Promise对象
 */


var getRTCTokenBackup = async function getRTCTokenBackup(args) {
  var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  var onRetry = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
  var timeoutConfig = getRTCTokenTimeoutConfig();
  var ts = Date.now();
  var headers = {
    'X-Auth-Sign': MD5("py_client&".concat(ts, "60439d96cfbecc2de2872641aea204f2")),
    'traceid': util.uuid(),
    'X-Auth-Appid': 'py_client',
    'X-Auth-TimeStamp': '' + ts,
    'Content-Type': 'application/json'
  };

  try {
    var currentTimeout = timeoutConfig.backup.timeouts[retries];
    var res = await commonFetch(getRTCTokenBackupUrl(), args, 'POST', currentTimeout, headers);

    if (res.s === 10000) {
      defaultApi$1.writeLog("Backup domain token success: ".concat(res.d.token), undefined, 'info');
      return res.d.token;
    } else {
      defaultApi$1.writeLog("Backup domain token failed: ".concat(JSON.stringify(res)), undefined, 'error');
      throw new Error("Backup domain response error: ".concat(res.s));
    }
  } catch (err) {
    defaultApi$1.writeLog("Backup domain request failed: ".concat(JSON.stringify(err), ", retry times: ").concat(retries), undefined, 'error');

    if (retries < timeoutConfig.backup.retries) {
      if (typeof onRetry === 'function') onRetry();
      return getRTCTokenBackup(args, retries + 1, onRetry);
    } else {
      throw new Error('Backup domain exhausted all retries');
    }
  }
};
/**
 * 第三阶段:回退到自研引擎(返回空Token)
 * @returns {Promise<string>} 空字符串
 */


var getRTCTokenFallback = async function getRTCTokenFallback() {
  defaultApi$1.writeLog('All remote token requests failed, falling back to self-developed engine', undefined, 'warn'); // 返回空字符串,表示没有远程token,使用本地引擎

  return '';
};
/**
 * 实现三阶段重试机制
 * @param {Object} args 请求参数
 * @param {Object} options 可选配置
 * @returns {Promise<string>} Token字符串
 */


var getRTCToken = async function getRTCToken(args) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  var _options$enableBackup = options.enableBackup,
      enableBackup = _options$enableBackup === void 0 ? true : _options$enableBackup,
      _options$enableFallba = options.enableFallback,
      enableFallback = _options$enableFallba === void 0 ? true : _options$enableFallba,
      _options$logPrefix = options.logPrefix,
      logPrefix = _options$logPrefix === void 0 ? 'getRTCToken' : _options$logPrefix,
      _options$onRetry = options.onRetry,
      onRetry = _options$onRetry === void 0 ? null : _options$onRetry;
  defaultApi$1.writeLog("".concat(logPrefix, ": Starting token acquisition process"), undefined, 'info');

  try {
    defaultApi$1.writeLog("".concat(logPrefix, ": Phase 1 - Primary domain"), undefined, 'info');
    var primaryToken = await getRTCTokenPrimary(args, 0, onRetry);

    if (primaryToken) {
      defaultApi$1.writeLog("".concat(logPrefix, ": Primary domain success, token acquired"), undefined, 'info');
      return primaryToken;
    }
  } catch (err) {
    // 第一阶段失败:记录错误日志,但不抛出异常,这样可以让程序继续尝试后续阶段
    defaultApi$1.writeLog("".concat(logPrefix, ": Phase 1 failed: ").concat(err.message), undefined, 'error');
  } // 第二阶段:备用域名(如果启用)


  if (enableBackup) {
    try {
      defaultApi$1.writeLog("".concat(logPrefix, ": Phase 2 - Backup domain"), undefined, 'info');
      var backupToken = await getRTCTokenBackup(args, 0, onRetry);

      if (backupToken) {
        defaultApi$1.writeLog("".concat(logPrefix, ": Backup domain success, token acquired"), undefined, 'info');
        return backupToken;
      }
    } catch (err) {
      // 第二阶段失败:记录错误日志,但不抛出异常
      defaultApi$1.writeLog("".concat(logPrefix, ": Phase 2 failed: ").concat(err.message), undefined, 'error');
    }
  } // 第三阶段:回退机制(如果启用)


  if (enableFallback) {
    defaultApi$1.writeLog("".concat(logPrefix, ": Phase 3 - Fallback to self-developed engine"), undefined, 'warn');
    return await getRTCTokenFallback();
  } // 所有阶段都失败,且没有启用回退机制


  defaultApi$1.writeLog("".concat(logPrefix, ": All phases failed, no token available"), undefined, 'error');
  throw new Error('All token acquisition phases failed');
}; // 保持向后兼容的旧版本函数(标记为废弃)
// 这个函数是为了保持与旧代码的兼容性而保留的
// @deprecated 已废弃,请使用新的getRTCToken函数
// @param {Object} args 请求参数
// @param {number} retries 当前重试次数
// @returns {Promise<string>} Token字符串或空字符串

var getRTCTokenLegacy = async function getRTCTokenLegacy(args) {
  var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  console.warn('getRTCTokenLegacy is deprecated, use getRTCToken instead');
  var ts = Date.now();
  var headers = {
    'X-Auth-Sign': MD5("py_client&".concat(ts, "60439d96cfbecc2de2872641aea204f2")),
    'traceid': util.uuid(),
    'X-Auth-Appid': 'py_client',
    'X-Auth-TimeStamp': '' + ts,
    'Content-Type': 'application/json'
  };
  return commonFetch(getRTCTokenUrl(), args, 'POST', 5000, headers).then(function (res) {
    if (res.s === 10000) {
      return res.d.token;
    } else {
      defaultApi$1.writeLog("get token failed: ".concat(JSON.stringify(res)), undefined, 'error');
      throw new Error('get token failed');
    }
  }).catch(function (err) {
    defaultApi$1.writeLog("get token failed: ".concat(JSON.stringify(err), ", retry times: ").concat(retries), undefined, 'error');

    if (retries < 3) {
      return getRTCTokenLegacy(args, retries + 1);
    } else {
      return '';
    }
  });
};

var util = {
  // timestamp : 0,
  // diffTime : 0,

  /**
   * run the callback unitl checkFlag return true
   * @param {function | boolean} checkFlag
   * @param {function} callback
   * @param {*} param
   */
  waitFlagToRun: function waitFlagToRun(checkFlag, callback, param, options) {
    var _this = this;

    var count = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;

    /**
     * options
     * { repeatTimes : 重试次数限制
     *   interval    : 间隔时间,默认 100ms
     * }
     * */
    if (options && options.repeatTimes && count > options.repeatTimes) return;

    if (checkFlag()) {
      callback(param);
      return;
    } else {
      var interval = options && options.timer ? options.timer : 100;
      setTimeout(function () {
        _this.waitFlagToRun(checkFlag, callback, param, options, count + 1);
      }, interval);
    }
  },

  /**
   * query字符串参数排序
   * */
  queryStringSort: function queryStringSort(param) {
    return param.split('&').sort().join('&');
  },

  /**
   * 生成签名相关
   */
  getVerifySign: function getVerifySign(param) {
    var saultKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '7qIdL2kdYQzecQJplq8QXfzpolOgUGOM';

    //按照api要求,进行混合saultKey二次MD5处理
    if (typeof param == 'string') {
      return MD5(MD5(this.queryStringSort(param) + saultKey));
    } else if (_typeof(param) == 'object') {
      var arr = [];

      for (var key in param) {
        arr.push(key + '=' + param[key]);
      }

      var sortedQueryString = this.queryStringSort(arr.join('&'));
      return MD5(MD5(sortedQueryString) + saultKey);
    }
  },
  //根据值反查字典表中的键名
  getMapKeyByValue: function getMapKeyByValue(map, value) {
    var _iteratorNormalCompletion = true;
    var _didIteratorError = false;
    var _iteratorError = undefined;

    try {
      for (var _iterator = map[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
        var item = _step.value;

        if (map.get(item[0]) === value) {
          return item[0];
        }
      }
    } catch (err) {
      _didIteratorError = true;
      _iteratorError = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion && _iterator.return != null) {
          _iterator.return();
        }
      } finally {
        if (_didIteratorError) {
          throw _iteratorError;
        }
      }
    }
  },
  uuid: function uuid() {
    var s = [];
    var hexDigits = '0123456789abcdef';

    for (var i = 0; i < 36; i++) {
      s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
    }

    s[14] = '4';
    s[19] = hexDigits.substr(s[19] & 0x3 | 0x8, 1);
    s[8] = s[13] = s[18] = s[23] = '-';
    var uuid = s.join('');
    return uuid;
  },
  getVerifySign1: function getVerifySign1() {
    var appId = '1002';
    var key = 'OmAIqyYz0U1/guuFo4GH6nVGNVFeHAczwpsuXzMqKdw=';
    var timestamp = new Date().getTime();
    var RDM = this.uuid();
    return {
      appId: appId,
      RDM: RDM,
      timestamp: timestamp,
      Authorization: sha256.hmacsha256(key, "".concat(appId, "&").concat(timestamp, "&").concat(RDM))
    };
  },

  /**
   *
   * @param {String} idType id类型: userId, roomId, orgId
   * @param {Strig} streamUrl 流地址id
   */
  getDataFromStreamUrl: function getDataFromStreamUrl(idType, streamUrl) {
    // streamUrl 格式
    // '_orgId_roomId_userId_1'
    //倒序
    var obj = {
      userId: 1,
      roomId: 2,
      orgId: 3
    };

    if (!streamUrl) {
      return;
    } else {
      return streamUrl.split('_').reverse()[obj[idType]];
    }
  },
  // getCurrentExtensionVersions(ext_id){
  //   if(EM){
  //     EM.GetExtensionVersions('zego_ext',
  //       function(ec, content) {
  //       console.log('GetExtensionVersions EC:' + ec + '\nContent:' + content);
  //       });
  //   }
  // }
  //转换一下用户角色的定义 用户角色 '1=teacher'/'2=student'/'3=assistant'/'4=parent'
  translateRole: function translateRole(roleString) {
    if (typeof roleString == 'string') {
      if (roleString == 'teacher') {
        return '1';
      } else if (roleString == 'student') {
        return '2';
      } else if (roleString == 'assistant') {
        return '3';
      } else if (roleString == 'parent') {
        return '4';
      }
    }

    return roleString;
  },
  //转换一下用户角色的定义 用户角色 '1=teacher'/'2=student'/'3=assistant'/'4=parent'
  translateRoleBack: function translateRoleBack(roleNumber) {
    if (typeof roleNumber == 'string') {
      if (roleNumber == '1') {
        return 'teacher';
      } else if (roleNumber == '2') {
        return 'student';
      } else if (roleNumber == '3') {
        return 'assistant';
      } else if (roleNumber == '4') {
        return 'parent';
      }
    }

    return '';
  },
  throttle: function throttle(fn, delay) {
    var context = null,
        timer = null,
        args = null;
    return function () {
      context = this;
      args = arguments;
      if (timer) return;
      timer = setTimeout(function () {
        clearTimeout(timer);
        timer = null;
        fn.apply(context, args);
      }, delay);
    };
  },
  // 格式化当前时间
  currentTimeString: function currentTimeString() {
    var date = new Date();
    var fmt = 'yyyy-MM-dd hh:mm:ss:S';
    var o = {
      'M+': date.getMonth() + 1,
      //月份
      'd+': date.getDate(),
      //日
      'h+': date.getHours(),
      //小时
      'm+': date.getMinutes(),
      //分
      's+': date.getSeconds(),
      //秒
      'q+': Math.floor((date.getMonth() + 3) / 3),
      //季度
      'S': date.getMilliseconds() //毫秒

    };
    if (/(y+)/.test(fmt)) ;
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));

    for (var k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) ;
      fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
    }

    return fmt;
  },
  //notice返回端上想要的uid
  getUidByStreamId: function getUidByStreamId(streamId) {
    if (streamId.split('_').length == 5) {
      return streamId;
    }

    ;

    if (streamId && streamId.indexOf('_') > 0) {
      return streamId.split('_')[2];
    } else {
      return streamId;
    }
  },
  //数据上报返回真正的uid
  getUidByStreamIdDr: function getUidByStreamIdDr(streamId) {
    if (streamId && streamId.indexOf('_') > 0) {
      return streamId.split('_')[2];
    } else {
      return streamId;
    }
  },
  toFixed: function toFixed(num) {
    var bit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
    var backNum;

    try {
      backNum = parseFloat(num).toFixed(bit);
    } catch (error) {
      backNum = num;
    }

    return backNum;
  },
  getStreamId: function getStreamId(args) {
    var institutionId = args.institutionId,
        roomId = args.roomId,
        userId = args.userId,
        groupId = args.groupId;
    return "".concat(institutionId, "_").concat(groupId || roomId, "_").concat(userId, "_1");
  },
  getConfId: function getConfId(institutionId, roomId) {
    return "".concat(roomId, "_").concat(institutionId);
  },

  /**
   * 深拷贝
   * @param {*} obj 拷贝对象(object or array)
   * @param {*} cache 缓存数组
   */
  deepCopy: function (_deepCopy) {
    function deepCopy(_x) {
      return _deepCopy.apply(this, arguments);
    }

    deepCopy.toString = function () {
      return _deepCopy.toString();
    };

    return deepCopy;
  }(function (obj) {
    var cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];

    // typeof [] => 'object'
    // typeof {} => 'object'
    if (obj === null || _typeof(obj) !== 'object') {
      return obj;
    } // 如果传入的对象与缓存的相等, 则递归结束, 这样防止循环

    /**
     * 类似下面这种
     * var a = {b:1}
     * a.c = a
     * 资料: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value
     */


    var hit = cache.filter(function (c) {
      return c.original === obj;
    })[0];

    if (hit) {
      return hit.copy;
    }

    var copy = Array.isArray(obj) ? [] : {}; // 将copy首先放入cache, 因为我们需要在递归deepCopy的时候引用它

    cache.push({
      original: obj,
      copy: copy
    });
    Object.keys(obj).forEach(function (key) {
      copy[key] = deepCopy(obj[key], cache);
    });
    return copy;
  }),
  firstUpperCase: function firstUpperCase(key) {
    if (!key) {
      return key;
    }

    return key.charAt(0).toUpperCase() + key.slice(1);
  },
  getChromeVersion: function getChromeVersion() {
    var chromeVersion = navigator.userAgent;
    console.log('chromeVersion', chromeVersion);
    var res = chromeVersion.search(/Chrome\/68/); // res == -1 ;//非68版本要升级

    var isUpdateChromeVersion = res < 0 ? true : false;
    return isUpdateChromeVersion;
  },
  sleep: function sleep(time) {
    return new Promise(function (resolve) {
      return setTimeout(resolve, time);
    });
  } // 获取网络时间戳
  // async getNetworkTimeStamp() {
  //   let res;
  //   try {
  //     res = await getNetworkTimestampApi();
  //   } catch (e){
  //     console.log('getNetworkTimeStamp1',e);
  //   }
  //   const res1 = new Date().getTime();
  //   // let timestamp = 0;
  //   if (res && res.data.t) {
  //     this.timestamp = +res.data.t;
  //     this.diffTime = this.timestamp - res1;
  //     console.log('getNetworkTimeStamp10');
  //   } else {
  //     this.timestamp = new Date().getTime();
  //     this.diffTime = 0;
  //     console.log('getNetworkTimeStamp11');
  //   //   const res1 = await getNetworkTimestampApi('suning');
  //   //   if (res1.status === 200) {
  //   //     timestamp = +res1.data.sysTime1 * 1000;
  //   //   }
  //   }
  //   console.log('getNetworkTimeStamp2',this.timestamp,res1,this.diffTime);
  //   // await this.getDiffTime();
  //   // return this.timestamp;
  // },
  //防抖
  //   debounce(fn,wait){
  //     var timer = null;
  //     return function(){
  //         if(timer !== null){
  //             clearTimeout(timer);
  //         }
  //         timer = setTimeout(fn,wait);
  //     }
  // }

};

var defaultApi$1 = {
  logMap: {
    debug: 0,
    info: 1,
    warnning: 2,
    error: 3,
    critical: 4
  },
  error: async function error(msg) {
    return this.writeLog(msg, 'zby-live-sdk', 'error');
  },

  /**
   * @function 写日志
   * @param {string} msgbody 内容
   * @param {string} productName 产品名称
   * @param {string} msgtype 类型
   * @return: void
   */
  writeLog: async function writeLog(msgbody) {
    var productName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'zby-live-sdk';
    var msgtype = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'info';
    var logMap = {
      debug: 0,
      info: 1,
      warnning: 2,
      error: 3,
      critical: 4
    };
    msgbody = typeof msgbody === 'string' ? msgbody : JSON.stringify(msgbody);
    var args = {
      //日志级别,0:debug,1:info,2:warnning,3:error,4:critical
      'type': logMap[msgtype],
      'msg': "".concat(productName ? '[' + productName + ']--' : '', " ").concat(msgbody)
    };
    await BASSAPI.writeLog(args);

    if (config.weblog === true) {
      if (msgtype === 'info') {
        console.log("%c [".concat(util.currentTimeString(), "]--").concat(args.msg), 'color:#60acfc');
      } else {
        console.log("%c [".concat(util.currentTimeString(), "]--").concat(args.msg), 'color:#f00');
      }
    }
  }
};

/*
 * @Author: why
 * @Date: 2019-08-08 19:33:44
 * @LastEditors: why
 * @LastEditTime: 2019-09-09 15:02:54
 * @Description: 
 */

var EM$2 = window.EM; // 不需要写日志方法名集合

var noWriteLogNames = ['GetCurCpuMemInfo', 'WriteLog', 'IsStreamAudioMuted', 'IsStreamVideoMuted'];
var cb$1 = function cb(extName) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$2) {
    return function (name, args, sdkName) {
      var argsStr = _typeof(args) === 'object' ? JSON.stringify(_objectSpread({}, args, {
        classType: classType
      })) : args;
      return new Promise(function (resolve, reject) {
        EM$2.CallMethod(extName, name, argsStr, function (code, msg) {
          var msgbody = "".concat(extName, "--action: ").concat(sdkName || '', "--").concat(name || name.charAt(0).toLowerCase() + name.slice(1), " Code: ").concat(code, "\nMessage: ").concat(msg, "\nparams:").concat(JSON.stringify(args));

          if (code === 0) {
            !noWriteLogNames.includes(name) && defaultApi$1.writeLog && defaultApi$1.writeLog(msgbody, productName$1);
            resolve({
              code: code,
              msg: msg && /\{|\}/g.test(msg) && JSON.parse(msg)
            });
          } else {
            name !== 'WriteLog' && defaultApi$1.writeLog && defaultApi$1.writeLog(msgbody, productName$1, 'error');
            resolve({
              code: code,
              msg: msg
            });
          }
        });
      }).catch(function () {
        name !== 'WriteLog' && defaultApi$1.writeLog && defaultApi$1.writeLog("".concat(extName, "--action: ").concat(sdkName || '', "--").concat(name || name.charAt(0).toLowerCase() + name.slice(1), " Code: ").concat(code, "\nMessage: ").concat(msg, "\nparams:").concat(JSON.stringify(args)), productName$1, 'error');
      });
    };
  }
};

/*
 * @Author: why
 * @Date: 2019-08-08 19:33:44
 * @LastEditors: why
 * @LastEditTime: 2019-09-10 17:05:31
 * @Description: 
 */
var callMethod$1 = cb$1(toolExt.name);

/*
 * @Author: why
 * @Date: 2019-08-08 19:33:44
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2021-05-24 16:47:40
 * @Description:
 */
var EM$3 = window.EM;
var toolBaseApi = {
  // 获取本地CPU内存占比
  getCurCpuMemInfo: function getCurCpuMemInfo() {
    return callMethod$1('GetCurCpuMemInfo', null, 'getCurCpuMemInfo');
  },
  // ping给定的拉流url,调取一次ping30s后返回延迟及丢包信息抛出事件
  startLossDelayPing: function startLossDelayPing(args) {
    return callMethod$1('GetLossDelayInfo', args, 'startLossDelayPing');
  },
  // ping给定的拉流url,调取一次ping30s后返回延迟及丢包信息抛出事件
  startSocialLossDelayPing: function startSocialLossDelayPing(args) {
    return callMethod$1('GetSocialLossDelayInfo', args, 'startSocialLossDelayPing');
  },
  // 获取上报公共字段信息
  getCommonData: function getCommonData() {
    return callMethod$1('GetCommonData', {
      live_ext_ver: liveExt.version
    }, 'getCommonData');
  },
  // 打开一个路径选择窗口,返回选择的路径信息
  openDialog: function openDialog() {
    return callMethod$1('OpenDialog', null, 'openDialog');
  },
  // 跳转到给定url
  jumpPage: function jumpPage(url) {
    return callMethod$1('JumpPage', {
      url: url
    }, 'jumpPage');
  },
  // 获取指定磁盘的总容量及剩余容量
  getDiskSenseParameter: function getDiskSenseParameter(driver) {
    return callMethod$1('GetDiskSenseParameter', {
      driver: driver
    }, 'getDiskSenseParameter');
  },
  // 获取系统信息(系统名称,本地时间等)
  getSystemInformation: function getSystemInformation() {
    return callMethod$1('GetSystemInformation', null, 'getSystemInformation');
  },
  // 获取学生端页面版本号
  getPageVersion: function getPageVersion() {
    return callMethod$1('GetPageVersion', null, 'getPageVersion');
  },
  stopLossDelayInfo: function stopLossDelayInfo() {
    return callMethod$1('StopLossDelayInfo', null);
  },

  /**
  * @function 保存图片至桌面
  * @param { string } buf //base64编码图片数据
  * @param { string } fileName //图片文件名(带格式后缀)
  * @return: Promise
  */
  saveImgToDesktop: function saveImgToDesktop(buf, fileName) {
    return callMethod$1('SaveImgToDesktop', {
      buf: buf,
      fileName: fileName
    });
  },
  // 初始化
  init: function init() {
    // 加载扩展
    if (EM$3) {
      // return new Promise(resolve => {
      EM$3.Load(toolExt.name, toolExt.version, false, function () {
        // resolve();
        console.log('loadExt :zby_toolExt ......');
      }); // });
    }
  }
};

/*
 * @Author: your name
 * @Date: 2020-07-09 17:07:08
 * @LastEditTime: 2020-10-19 14:20:03
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \709\zby_live_sdk\src\tool\extend.js
 */
var api = {
  // 打开对话框用于选取文件路径
  openDialog: function openDialog() {
    return toolBaseApi.openDialog();
  },
  // 跳转页面
  jumpPage: function jumpPage(url) {
    return toolBaseApi.jumpPage(url);
  },
  // 获取指定磁盘的总容量及剩余容量
  getDiskSenseParameter: function getDiskSenseParameter(driver) {
    return toolBaseApi.getDiskSenseParameter(driver);
  },
  // 获取系统信息(系统名称,本地时间等)
  getSystemInformation: function getSystemInformation() {
    return toolBaseApi.getSystemInformation();
  },
  // 获取cpu信息
  getCurCpuMemInfo: function getCurCpuMemInfo() {
    return toolBaseApi.getCurCpuMemInfo();
  },
  // 获取cpu信息
  getPageVersion: function getPageVersion() {
    return toolBaseApi.getPageVersion();
  },
  getCommonData: function getCommonData() {
    return toolBaseApi.getCommonData();
  },
  saveImgToDesktop: function saveImgToDesktop(buf, fileName) {
    return toolBaseApi.saveImgToDesktop(buf, fileName);
  }
};

/*
 * @Author: why
 * @Date: 2019-08-08 19:33:44
 * @LastEditors: why
 * @LastEditTime: 2019-09-09 15:02:54
 * @Description: 
 */

var EM$4 = window.EM;
var hasAddListener = false;
var baseData1 = null;
var baseData2 = null;
var st = 2;
var timestamp = null;
var coreSDKVersion = null;
var realSDKType = '';

var addListener = function addListener() {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$4 && !hasAddListener) {
    hasAddListener = true;
    EM$4.AddListener('framework', function (event, data) {
      // if (data && data.indexOf(extensionId) > -1) {
      //   try {
      //     EMListenerId = JSON.parse(data)[extensionId];
      //     defaultApi.writeLog(`ZEGO::addListener-- EMListenerId: ${EMListenerId}`);
      //   } catch (error) {}
      // }
      if (!event || !data) {
        return;
      } // console.log('framework',event,data);


      var _data = JSON.parse(data);

      switch (event) {
        case 'SystemLocalTimeChange':
          timestamp = Number(_data.server_time_diff);
          console.log("SystemLocalTimeChange:: server_time_diff: ".concat(_data.server_time_diff, " ").concat(timestamp));
          break;
      }

      ;
    });
  }
};

addListener();

var getSystemInformation = function getSystemInformation() {
  if (EM$4) {
    return new Promise(function (resolve, reject) {
      EM$4.system.GetSystemInformation(function (code, msg) {
        defaultApi$1.writeLog("GetSystemInformation Code: ".concat(code, "\nMessage: ").concat(msg));
        resolve({
          code: code,
          msg: msg
        });
      });
    });
  }
};

var ReportLog = function ReportLog() {
  var logstore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'live_log';
  var args = arguments.length > 1 ? arguments[1] : undefined;

  if (EM$4) {
    // defaultApi.writeLog(`ReportLog event_name: ${args.lc.event_name}`);
    return new Promise(function (resolve, reject) {
      var logStr = JSON.stringify(args);
      EM$4.system.ReportLog(logstore, logStr, function (code, msg) {
        defaultApi$1.writeLog("ReportLog Code: ".concat(code, "\nMessage: ").concat(msg));
        logstore = undefined;
        logStr = undefined;
        resolve({
          code: code,
          msg: msg
        });
      });
    });
  }
};

var dataReport$1 = async function dataReport(args) {
  if (!window.zby_sdk_init_params) {
    return false;
  }

  var _window$zby_sdk_init_ = window.zby_sdk_init_params,
      userId = _window$zby_sdk_init_.userId,
      institutionId = _window$zby_sdk_init_.institutionId,
      projectId = _window$zby_sdk_init_.projectId,
      userName = _window$zby_sdk_init_.userName,
      role = _window$zby_sdk_init_.role,
      roomId = _window$zby_sdk_init_.roomId,
      teacherId = _window$zby_sdk_init_.teacherId,
      liveId = _window$zby_sdk_init_.liveId,
      serviceStatus = _window$zby_sdk_init_.serviceStatus,
      classMode = _window$zby_sdk_init_.classMode,
      liveType = _window$zby_sdk_init_.liveType;

  if (!userId || !institutionId) {
    return false;
  }

  if (timestamp == undefined) {
    getSystemInformation().then(function (res) {
      timestamp = Number(JSON.parse(res.msg).server_time_diff);
      console.log('wolaile', timestamp);
    }).catch(function (e) {
      // timestamp = 0;
      console.log('timestamp11', e, timestamp);
    });
  } else {
    console.log('timestamp12', timestamp);
  }

  if (!baseData1) {
    console.log('baseData11', baseData1);
    api.getCommonData(liveExt.version).then(function (res) {
      baseData1 = res.msg; // console.log('baseData12',baseData1);
    }); // console.log('baseData13',baseData1);
  }

  if (!baseData2) {
    baseData2 = await zbysdk$1.getSDKVersion();
  }

  if (!coreSDKVersion) {
    coreSDKVersion = await zbysdk$1.getSDKCoreVersion();
  }

  if (args.event_name === 'live_quality_hb') {
    Object.assign(args, {
      service_status: serviceStatus
    });
    st = 5;
  } else {
    st = 2;
  } // 公共字段


  var args0 = {
    bl: 1,
    bt: 1,
    ft: args.logstore ? '300' : liveType,
    st: st,
    tid: '-',
    uid: userId,
    pid: liveId,
    log_ver: '1.0.1',
    guid: '-' // js_version: version,
    // class_type: 2

  }; //基础信息

  var args1 = {
    role: role || 'student',
    room_id: roomId,
    js_version: version,
    live_sdk_type: window.zbyAVSDK_init_sdk_type,
    live_sdk_type_ex: realSDKType,
    live_sdk_version: '-',
    streamid: "".concat(institutionId, "_").concat(roomId, "_").concat(userId, "_1")
  };
  console.log('baseData14', baseData1);

  if (baseData1) {
    console.log('baseData15');
    var _baseData = baseData1,
        guid = _baseData.guid,
        tm_ext_version = _baseData.tm_ext_version,
        zego_ext_version = _baseData.zego_ext_version; // console.log('hsg_bbh',baseData1, tm_ext_version, zego_ext_version);

    Object.assign(window.zby_sdk_init_params, {
      guid: guid
    });
    Object.assign(args0, {
      guid: guid
    });
    Object.assign(args1, {
      live_sdk_version: window.zbyAVSDK_init_sdk_type == 'rtc' ? tm_ext_version : zego_ext_version
    });
  }

  if (baseData2) {
    // console.log('hsg_bbh',baseData2);
    Object.assign(args1, {
      media_sdk_version: baseData2,
      media_core_sdk_version: coreSDKVersion
    });
  }

  if (args.event_name === 'sdk_change') {
    baseData1 = null;
    baseData2 = null;
    coreSDKVersion = null;
  }

  var reportData = _objectSpread({
    // 其他
    // sdk_type: window.zbyAVSDK_init_sdk_type,
    lid: ++zbysdk$1.log_id,
    stime: timestamp ? new Date().getTime() + timestamp : new Date().getTime()
  }, args0, {
    // ...args1,
    // ...args2,
    // lc:JSON.stringify({...args1,...args})
    lc: _objectSpread({}, args1, args)
  }); // defaultApi.writeLog(`dataReport--${JSON.stringify(reportData)}`);


  defaultApi$1.writeLog("log_id--".concat(zbysdk$1.log_id, " event_name: ").concat(args.event_name));
  console.debug("[".concat(util.currentTimeString(), "]--[zby-live-sdk]-- DataReport: ").concat(JSON.stringify(reportData)));
  ReportLog(args.logstore, reportData); // dabanDataReport(reportData);
};

var dataReport$2 = {
  timestamp: timestamp,
  setRealSDKType: function setRealSDKType(type) {
    realSDKType = type;
  },
  // 心跳
  heartbeat: function heartbeat(args) {
    dataReport$1({
      event_name: 'live_quality_hb',
      event_content: _objectSpread({}, args)
    });
  },
  //设备检测(音视频)
  // deviceTest(args){
  //   dataReport({
  //     event_name: 'device_test',
  //     event_content:{...args}
  //   });
  // },
  //直播切换线路
  sdkChange: function sdkChange(args) {
    dataReport$1({
      event_name: 'sdk_change',
      event_content: _objectSpread({}, args)
    });
  },
  //老师静音/取消静音某学生
  // toggleMic(args){
  //   dataReport({
  //     event_name: 'toggle_mic',
  //     ...args
  //   });
  // },
  //音视频连接
  avConnect: function avConnect(args) {
    dataReport$1({
      event_name: 'av_connect',
      event_content: _objectSpread({}, args)
    });
  },
  //进入房间
  joinRoom: function joinRoom(args) {
    dataReport$1({
      event_name: 'join_room',
      event_content: _objectSpread({}, args)
    });
  },
  //进入房间结果
  joinRoomResult: function joinRoomResult(args) {
    dataReport$1({
      event_name: 'join_room_result',
      event_content: _objectSpread({}, args)
    });
  },
  //开始推流
  startPublish: function startPublish(args) {
    dataReport$1({
      event_name: 'start_publish',
      event_content: _objectSpread({}, args)
    });
  },
  //推流结果
  publishResult: function publishResult(args) {
    dataReport$1({
      event_name: 'publish_result',
      event_content: _objectSpread({}, args)
    });
  },
  //开始拉学生流
  startPull: function startPull(args) {
    dataReport$1({
      event_name: 'start_pull',
      event_content: _objectSpread({}, args)
    });
  },
  //拉流结果
  pullResult: function pullResult(args) {
    dataReport$1({
      event_name: 'pull_result',
      event_content: _objectSpread({}, args)
    });
  },
  //停止拉学生流
  stopPull: function stopPull(args) {
    dataReport$1({
      event_name: 'stop_pull',
      event_content: _objectSpread({}, args)
    });
  },
  //停止推流
  stopPublish: function stopPublish(args) {
    dataReport$1({
      event_name: 'stop_publish',
      event_content: _objectSpread({}, args)
    });
  },
  //退出教室
  leaveRoom: function leaveRoom(args) {
    dataReport$1({
      event_name: 'leave_room',
      event_content: _objectSpread({}, args)
    });
  },
  splitState: function splitState(args) {
    dataReport$1({
      event_name: 'split_state',
      event_content: _objectSpread({}, args)
    });
  },
  //设备状态变化
  deviceChange: function deviceChange(args) {
    dataReport$1({
      event_name: 'device_change',
      event_content: _objectSpread({}, args)
    });
  },
  //设备检测
  setDevice: function setDevice(args) {
    dataReport$1({
      event_name: 'set_device',
      event_content: _objectSpread({}, args)
    });
  },
  firstVideoSize: function firstVideoSize(args) {
    dataReport$1({
      event_name: 'first_video',
      event_content: _objectSpread({}, args)
    });
  },
  firstAudioSize: function firstAudioSize(args) {
    dataReport$1({
      event_name: 'first_audio',
      event_content: _objectSpread({}, args)
    });
  },
  //学生按住发言按钮
  startLianMai: function startLianMai(args) {
    dataReport$1({
      event_name: 'start_lianmai',
      event_content: _objectSpread({}, args)
    });
  },
  //学生取消发言按钮时上报
  endLianMai: function endLianMai(args) {
    dataReport$1({
      event_name: 'end_lianmai',
      event_content: _objectSpread({}, args)
    });
  },
  //收到开麦消息上报
  getStartLianMai: function getStartLianMai(args) {
    dataReport$1({
      event_name: 'get_start_lianmai',
      event_content: _objectSpread({}, args)
    });
  },
  //收到关麦消息上报
  getEndLianMai: function getEndLianMai(args) {
    dataReport$1({
      event_name: 'get_end_lianmai',
      event_content: _objectSpread({}, args)
    });
  },
  setPullVoice: function setPullVoice(args) {
    dataReport$1({
      event_name: 'set_pull_voice',
      event_content: _objectSpread({}, args)
    });
  },
  // turnPushResult(args){
  //   dataReport({
  //     event_name: 'turn_push_result',
  //     event_content:{...args}
  //   });
  // }
  pomeloJoinRoom: function pomeloJoinRoom(args) {
    dataReport$1({
      logstore: 'online_class_log',
      event_name: 'pomelo_join_room',
      event_content: _objectSpread({}, args)
    });
  },
  pomeloInitGate: function pomeloInitGate(args) {
    dataReport$1({
      logstore: 'online_class_log',
      event_name: 'pomelo_init_gate',
      event_content: _objectSpread({}, args)
    });
  },
  pomeloInitChat: function pomeloInitChat(args) {
    dataReport$1({
      logstore: 'online_class_log',
      event_name: 'pomelo_init_chat',
      event_content: _objectSpread({}, args)
    });
  },
  pomeloInitWebSocket: function pomeloInitWebSocket(args) {
    dataReport$1({
      logstore: 'online_class_log',
      event_name: 'pomelo_init_websocket',
      event_content: _objectSpread({}, args)
    });
  },
  pomeloSendMsg: function pomeloSendMsg(args) {
    dataReport$1({
      logstore: 'online_class_log',
      event_name: 'pomelo_send_msg',
      event_content: _objectSpread({}, args)
    });
  },
  pomeloRecvMsg: function pomeloRecvMsg(args) {
    dataReport$1({
      logstore: 'online_class_log',
      event_name: 'pomelo_recv_msg',
      event_content: _objectSpread({}, args)
    });
  },
  initFinished: function initFinished(args) {
    dataReport$1({
      event_name: 'init_finished',
      event_content: _objectSpread({}, args)
    });
  },
  takeSnapShot: function takeSnapShot(args) {
    dataReport$1({
      event_name: 'take_snap_shot',
      event_content: _objectSpread({}, args)
    });
  },
  remoteNetworkQuality: function remoteNetworkQuality(args) {
    dataReport$1({
      event_name: 'remote_network_quality',
      event_content: _objectSpread({}, args)
    });
  },
  localNetworkQuality: function localNetworkQuality(args) {
    dataReport$1({
      event_name: 'local_network_quality',
      event_content: _objectSpread({}, args)
    });
  },
  localConnectStatus: function localConnectStatus(args) {
    dataReport$1({
      event_name: 'local_connect_status',
      event_content: _objectSpread({}, args)
    });
  },
  pushStreamError: function pushStreamError() {},
  pushStreamWarning: function pushStreamWarning() {},
  deviceError: function deviceError(args) {
    dataReport$1({
      event_name: 'device_error',
      event_content: _objectSpread({}, args)
    });
  },
  startRecord: function startRecord(args) {
    dataReport$1({
      event_name: 'zby_start_record',
      event_content: _objectSpread({}, args)
    });
  },
  stopRecord: function stopRecord(args) {
    dataReport$1({
      event_name: 'zby_stop_record',
      event_content: _objectSpread({}, args)
    });
  },

  /**
   * @param {object} args
   * @param {number} args.result - 取token结果 1:成功 -1:失败
   * @param {number} args.error_count - 重试次数(不含首轮请求)
   */
  getRtcToken: function getRtcToken(args) {
    dataReport$1({
      event_name: 'get_rtc_token',
      event_content: _objectSpread({}, args)
    });
  },
  joinRtcChannel: function joinRtcChannel(args) {
    dataReport$1({
      event_name: 'join_rtc_channel',
      event_content: _objectSpread({}, args)
    });
  },

  /**
   * @param {object} args 
   * @param {number} args.state - pomelo连接状态 1:连接成功 2:连接中断 3:重连成功 4:重连失败
   * @param {string} args.desc - 连接状态描述,字符串
   */
  pomeloState: function pomeloState(args) {
    dataReport$1({
      event_name: 'pomelo_state',
      event_content: _objectSpread({}, args)
    });
  }
};

var _sdkStatus$updateLoca;
var noWriteLogNoticeNames = ['playerVolumeChanged', 'volume_change', 'real_time_mic_volume', 'pull_quality', 'push_quality', 'push_loss_delay', 'play_loss_delay', 'mic_capture_data'];
setTimeout(function () {
  zbysdk$1.noWriteLogNoticeNames = noWriteLogNoticeNames;
});

function notice(data) {
  if (!noWriteLogNoticeNames.includes(data.type)) {
    defaultApi$1.writeLog("NOTICE--".concat(JSON.stringify(data)));
  }

  try {
    zbysdk$1.notice(data);
  } catch (error) {
    console.error('zby-live-sdk callback error', data, error);
  }
}

var NOTICE = (_sdkStatus$updateLoca = {
  // sdk状态相关
  // 初始化前
  sdkStatus: function sdkStatus(data) {
    notice({
      type: 'sdk_status',
      data: data
    });
  },
  // 切换sdk完成后返回本地预览地址
  updateLocalPreview: function updateLocalPreview(data) {
    notice({
      type: 'update_local_preview',
      data: data
    });
  },
  // 设备热插拔
  hotPlug: function hotPlug(data) {
    notice({
      type: 'plug_and_unplug',
      data: data
    });
  },
  // 设备检测出现问题
  deviceError: function deviceError(data) {
    notice({
      type: 'device_error',
      data: data
    });
  },
  noDevice: function noDevice(data) {
    notice({
      type: 'no_device',
      data: data
    });
  },
  useredCamera: function useredCamera(data) {
    notice({
      type: 'usered_camera',
      data: data
    });
  },
  // 播放器音量变化
  playerVolumeChanged: function playerVolumeChanged(data) {
    notice({
      type: 'playerVolumeChanged',
      data: data
    });
  },
  // 同playerVolumeChanged
  volumeChange: function volumeChange(data) {
    notice({
      type: 'volume_change',
      data: data
    });
  },
  // 采集器麦克风音量变化
  captureMicVolumeChanged: function captureMicVolumeChanged(data) {
    notice({
      type: 'real_time_mic_volume',
      data: data
    });
  }
}, _defineProperty(_sdkStatus$updateLoca, "sdkStatus", function sdkStatus(data) {
  notice({
    type: 'sdk_status',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "speakerChanged", function speakerChanged(data) {
  notice({
    type: 'speaker_changed',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "defaultMicChanged", function defaultMicChanged(data) {
  notice({
    type: 'default_mic_changed',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "defaultSpeakerChanged", function defaultSpeakerChanged(data) {
  notice({
    type: 'default_speaker_changed',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "userJoin", function userJoin(data) {
  notice({
    type: 'user_join',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "deviceStatus", function deviceStatus(data) {
  notice({
    type: 'device_status',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "remoteVideoReady", function remoteVideoReady(data) {
  notice({
    type: 'remote_video_ready',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "remoteVideoRemoved", function remoteVideoRemoved(data) {
  notice({
    type: 'remote_video_removed',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "userResponse", function userResponse(data) {
  notice({
    type: 'userResponse',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "channelDisconnect", function channelDisconnect() {
  notice({
    type: 'channel_disconnect',
    data: {
      message: 'Channel disconnect'
    }
  });
}), _defineProperty(_sdkStatus$updateLoca, "channelReconnect", function channelReconnect() {
  notice({
    type: 'channel_reconnect',
    data: {
      message: 'Channel reconnect'
    }
  });
}), _defineProperty(_sdkStatus$updateLoca, "pushFlowSuccess", function pushFlowSuccess(data) {
  notice({
    type: 'pushFlowSuccess',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "pullFlowResult", function pullFlowResult(data) {
  notice({
    type: 'pullFlowResult',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "pullAudioFlowError", function pullAudioFlowError(data) {
  notice({
    type: 'pullAudioFlowError',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "playError", function playError(data) {
  notice({
    type: 'play_error',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "playErrorDetail", function playErrorDetail(data) {
  notice(data);
}), _defineProperty(_sdkStatus$updateLoca, "firstVideoSize", function firstVideoSize(data) {
  notice({
    type: 'firstVideoSize',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "firstAudioSize", function firstAudioSize(data) {
  notice({
    type: 'firstAudioSize',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "overMaxConnect", function overMaxConnect(data) {
  notice({
    type: 'overMaxConnect',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "pullQuality", function pullQuality(data) {
  notice({
    type: 'pull_quality',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "pushQuality", function pushQuality(data) {
  notice({
    type: 'push_quality',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "pushLossAndDelay", function pushLossAndDelay(data) {
  notice({
    type: 'push_loss_delay',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "playLossAndDelay", function playLossAndDelay(data) {
  notice({
    type: 'play_loss_delay',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "updateLocalPreview", function updateLocalPreview(data) {
  notice({
    type: 'update_local_preview',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "networkError", function networkError() {
  notice({
    type: 'network_error',
    data: {
      message: 'Network error'
    }
  });
}), _defineProperty(_sdkStatus$updateLoca, "networkRecovery", function networkRecovery() {
  notice({
    type: 'network_recovery',
    data: {
      message: 'Network recovery'
    }
  });
}), _defineProperty(_sdkStatus$updateLoca, "recordResponse", function recordResponse(data) {
  notice({
    type: 'record_response',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "streamStatus", function streamStatus(data) {
  notice({
    type: 'stream_status',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "join", function join(data) {
  notice({
    type: 'user_join',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "joinAck", function joinAck(data) {
  notice({
    type: 'user_response',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "addStream", function addStream(data) {
  notice({
    type: 'remote_video_ready',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "removeStream", function removeStream(data) {
  notice({
    type: 'remote_video_removed',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "updateStreamDeviceStatus", function updateStreamDeviceStatus(data) {
  notice({
    type: 'device_status',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "leave", function leave(data) {
  notice({
    type: 'user_leave',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "channelDisconnect", function channelDisconnect() {
  notice({
    type: 'channel_disconnect',
    data: {
      message: 'Channel disconnect'
    }
  });
}), _defineProperty(_sdkStatus$updateLoca, "userDisconnect", function userDisconnect(data) {
  notice({
    type: 'user_disconnect',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "zegoRecoveryStart", function zegoRecoveryStart() {
  notice({
    type: 'zego_recovery_start',
    data: {
      message: 'zego is killed'
    }
  });
}), _defineProperty(_sdkStatus$updateLoca, "liveRecoveryStart", function liveRecoveryStart() {
  notice({
    type: 'live_recovery_start',
    data: {
      message: 'live is killed'
    }
  });
}), _defineProperty(_sdkStatus$updateLoca, "seiReceived", function seiReceived(data) {
  notice({
    type: 'sei_received',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "pushStreamError", function pushStreamError(data) {
  notice({
    type: 'push_stream_error',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "pushStreamWarning", function pushStreamWarning(data) {
  notice({
    type: 'push_stream_warning',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "pullStreamError", function pullStreamError(data) {
  notice({
    type: 'pull_stream_error',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "pullStreamWarning", function pullStreamWarning(data) {
  notice({
    type: 'pull_stream_warning',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "remoteNetworkQuality", function remoteNetworkQuality(data) {
  notice({
    type: 'remote_network_quality',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "localNetworkQuality", function localNetworkQuality(data) {
  notice({
    type: 'local_network_quality',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "recordStateUpdate", function recordStateUpdate(data) {
  notice({
    type: 'record_state_update',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "recordFinished", function recordFinished(data) {
  notice({
    type: 'record_finished',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "recordError", function recordError(data) {
  notice({
    type: 'record_error',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "recordBegin", function recordBegin(data) {
  notice({
    type: 'record_begin',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "recordEnd", function recordEnd(data) {
  notice({
    type: 'record_end',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "beautifyError", function beautifyError(data) {
  notice({
    type: 'beautify_error',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "onAiStatus", function onAiStatus(data) {
  notice({
    type: 'aiStatus',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "onAiTTSMessage", function onAiTTSMessage(data) {
  notice({
    type: 'aigcTTSMessage',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "onAiMessage", function onAiMessage(data) {
  notice({
    type: 'aiMessage',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "mutualKick", function mutualKick(data) {
  notice({
    type: 'mutual_kick',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "onRecvMediaSideInfo", function onRecvMediaSideInfo(data) {
  notice({
    type: 'recv_media_side_info',
    data: data
  });
}), _defineProperty(_sdkStatus$updateLoca, "micCaptureData", function micCaptureData(data) {
  notice({
    type: 'mic_capture_data',
    data: data
  });
}), _sdkStatus$updateLoca);

var extensionId = 'utilities_ext'; // rtc小班课=0;rtc大班课=1

var classType$1 = 0;
/**
 * @function 调用端提供的回调方法
 * @param name:String 回调方法名
 * @param args 回调参数
 * @return Promise | void
 */

var callMethod$2 = function callMethod(name, args) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM) {
    return new Promise(function (resolve, reject) {
      EM.CallMethod(extensionId, name, JSON.stringify(_objectSpread({}, args, {
        classType: classType$1
      })), function (code, msg) {
        defaultApi$1.writeLog("".concat(name, " Code: ").concat(code, "\nMessage: ").concat(msg, "\nParams: ").concat(JSON.stringify(_objectSpread({}, args, {
          classType: classType$1
        }))));
        resolve({
          code: code,
          msg: msg
        });
      });
    });
  }
};
/**
 * @function 加载 Zego 扩展
 * @param extensionVersion:String 扩展版本号,必选
 * @return Promise | void
 */


(function loadUtils() {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM) {
    // return new Promise((resolve, reject) => {
    EM.Load(extensionId, utilitiesExt.version, false, function (code, msg) {
      defaultApi$1.writeLog("loadUtils Code: ".concat(code, "\nMessage: ").concat(msg));
      console.log('loadExt :zby_utilsExt ......'); // resolve({
      //   code,
      //   msg
      // });
    }); // });
  }
})();
/**
 * @function 卸载 Zego 扩展
 * @return Promise | void
 */


var unloadUtils = function unloadUtils() {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM) {
    return new Promise(function (resolve, reject) {
      EM.UnLoad(extensionId, function (code, msg) {
        defaultApi$1.writeLog("unloadUtils Code: ".concat(code, "\nMessage: ").concat(msg));
        resolve({
          code: code,
          msg: msg
        });
      });
    });
  }
};

var isAppleM1 = function isAppleM1() {
  defaultApi$1.writeLog("\u83B7\u53D6\u8BBE\u5907\u662F\u5426\u662FM1\u8BBE\u5907: isAppleM1 --start");
  return new Promise(function (resolve, reject) {
    EM.system.IsAppleSilicon(function (code, msg) {
      defaultApi$1.writeLog("\u83B7\u53D6\u8BBE\u5907\u662F\u5426\u662FM1\u8BBE\u5907: isAppleM1 code:".concat(code, " msg:").concat(msg));
      var data = JSON.parse(msg);
      resolve({
        code: code,
        data: data
      });
    });
  });
};
var isWinX64 = function isWinX64() {
  console.log('获取设备是否是WinX64设备: --start');
  return new Promise(function (resolve, reject) {
    if (!window.EM.GetClientArch) {
      resolve(false);
      return;
    }

    window.EM.GetClientArch(function (ec, content) {
      if (String(ec) === '0') {
        var statusObj = JSON.parse(content);
        resolve(statusObj.client_arch === 'x64');
      } else {
        resolve(false);
      }
    });
  });
};
/**
 * @function 获取设备状态
 * * @param { string  } devicename //(设备名称,可为空)
 * * @param { number } devicetype //(设备类型,1摄像头,2麦克风),3扬声器(mac端没有)
 * @return: Promise
*/

var getDeviceState = function getDeviceState(devicename, devicetype) {
  return callMethod$2('GetDeviceState', {
    devicetype: devicetype,
    devicename: devicename
  });
}; //获取设备状态


var getDevicePermissionsFun = async function getDevicePermissionsFun(devicename, devicetype) {
  defaultApi$1.writeLog("sdk action : getDevicePermissionsFun devicename: ".concat(devicename, " devicetype: ").concat(devicetype));

  try {
    var res = JSON.parse((await getDeviceState(devicename, devicetype)).msg).devicestate; // let codemsg = {
    //   '0':'有权限可用',
    //   '1':'没有询问是否开启权限',
    //   '2':'用户未授权',
    //   '3':'未授权,家长限制',
    //   '4':'未知权限类型',
    //   '5':'操作系统不支持权限管理',
    //   '6':'不可用(win10隐私关闭)',
    //   '7':'设备占用'
    // };
    // return codemsg[res];

    console.log('getDevicePermissions_res', res);
    return res;
  } catch (error) {
    console.log('getDevicePermissions_error', error);
    return 'error';
  }

  ;
};
var setMediaPermissionFun = function setMediaPermissionFun(enableVideo, enableMicrophone) {
  return callMethod$2('SetMediaPermission', {
    enableVideo: enableVideo,
    enableMicrophone: enableMicrophone
  });
};
var deviceListReport = {
  cameraList: {},
  micList: {},
  speakerList: {}
};

var extensionId$1 = 'live'; // 端提供的 API 入口

var EM$5 = window.EM; // 维护的一份播放器的 rtcPlayerId 与 streamId 的映射

var streamIdToRtcPlayerId = {}; // let streamIdToBlobUrl = {};

var rtcPlayerIdToStreamId = {}; // 已经停止的播放器

var stopedRtcPlayers = []; // 播放器 id 缓存

var rtcPlayerIds = []; // rtc 当前正在使用的摄像头的设备 id

var rtcNowUseCamera = ''; // 是否执行麦克风音量回调的标记

var runMicVolumeCb = false; // 是否创建了用于设备检测的采集器的标记

var deviceCheckerCaptureInit = false; // 是否执行过 Rtc 的 AddListener 的标志

var hasAddListener$1 = false; // 是否在课中的标志

var isInRoom = false; // 是否处于网络错误状态中的标志

var hasNetWrong = false; // 是否加入/离开 rtc room 成功

var hasJoinRtcRoom = false;
var hasLeaveRtcRoom = false; // rtc 底层流媒体数据上报地址配置

var _confId = null; // rtc小班课=0;rtc大班课=1

var classType$2 = 0; // 监听id

var EMListenerId = 0; //静音推流时,音量值是否上抛上层标志 false=没有声音不往上层通知/true=有声音有上层通知

var isNoticeMicVolumeRtc = false;
var isNoticeCarVolumeRtc = false;
/*
  1001--网络错误
  1002--播放器内部错误
  1003--调度服务器错误
  1004--转发服务器错误
  1005--无可用转发服务器
  2003--对端尚未进入教室
  2013–网络断开
*/

var rtcPlayerErrorCodes = ['1001', '1002', '1003', '1004', '1005', '2003', '2013', '2008', '1006'];
/*
2001-- 网络错误,通知业务层检查网络设置和推流地址, 对于直播, id与AddPushUrl返回值对应
2002-- 网络恢复, 对于直播, id与AddPushUrl返回值对应
2003--网络断开
2004--转发服务器错误
2005--调度服务器错误
2006--无可用转发服务器
2007--转发服务器能力不足
2008--摄像头视频宽高错误
2009--视频编码器初始化错误
2010--错误的摄像头ID
2011--错误的录音设备ID
2012--抓屏参数错误
2013--打开摄像头失败,一种可能是摄像头被其它进程占用
2014–-打开麦克风失败
2015--打开播放文件失败
3206--推流ID被占用
3309--只要 10 秒内和服务器无法建立连接就会触发一次且仅触发一次(仅互动流)
*/

var rtcCaptureErrorCodes = ['2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2012', '2013', '3206', '3309']; // 心跳

var heartBeatDataReportObj = {};
var heartBeatDataReportTimer = null;
var isFirstHeartBeatReport = false;
var streamIdRtcPlayerInfo = {};
var streamIdRtcPlayerInfo1 = {};
var rtcPlayerCodeToNames = {
  '1002': 'err_core',
  '1003': 'err_schedule_server',
  '1004': 'err_relay_server',
  '1005': 'err_no_available_relay_server',
  '2003': 'st_streamNotReady',
  '2013': 'network_disconnect'
}; //上报拼接状态
//window.zbyAVSDK_init_params

var paramInfo;
var captureBefore; //运控获取,一直不变(拼接前摄像头采集分辨率)

var captureEncodeBefore; //摄像头拼接前编码分辨率云控拿取

var screenEncodeBefore; //截屏窗拼接前编码分辨率	东奇提供
// let screenBefore;//拼接前截屏窗采集分辨率

var captureAfter; //一直不变(拼接前摄像头采集分辨率同上captureBefore)

var captureEncodeAfter; //摄像头拼接后编码分辨率

var screenEncodeAfter; //
// let screenAfter;//

var currStreamIdRtcPlayerInfo;
var stStreamNotReadyReport = {}; //记录底层推流回调的值

var dataRtcCapture = {};
/**
 * @function 调用端提供的回调方法
 * @param name:String 回调方法名,必选
 * @param args:Object 回调参数,必选
 * @return Promise | void
 */

var callMethod$3 = function callMethod(name, args) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$5) {
    return new Promise(function (resolve, reject) {
      var noneCamera = name === 'SetCameraDevice' && !args.close && !args.deviceID;
      var noneMicrophone = name === 'SetAudioDevice' && !args.deviceID;
      var noneSpeaker = name === 'SetSpeakerDevice' && !args.speakId;

      if (noneCamera || noneMicrophone || noneSpeaker) {
        return resolve();
      }

      EM$5.CallMethod(extensionId$1, name, JSON.stringify(_objectSpread({}, args, {
        classType: classType$2
      })), function (code, msg) {
        resolve({
          code: code,
          msg: msg
        });
        defaultApi$1.writeLog("".concat(name, " Code: ").concat(code, "\nParams: ").concat(JSON.stringify(_objectSpread({}, args, {
          classType: classType$2
        })), "\nMessage: ").concat(msg));

        var _msg = msg && JSON.parse(msg); // 数据上报


        switch (name) {
          case 'SetAppId':
            break;

          case 'SetConfId':
            break;

          case 'SetAudioDevice':
            if (code === 0 && _msg.ret === true) {
              window.zbyAVSDK_device_checker_init.microphone.use = args.deviceID;
            }

            break;

          case 'SetCameraDevice':
            if (code === 0 && _msg.ret === true) {
              window.zbyAVSDK_device_checker_init.camera.use = args.deviceID;

              if (args.deviceID) {
                rtcNowUseCamera = args.deviceID;
              }
            }

            break;

          case 'SetSpeakerDevice':
            if (code === 0) {
              window.zbyAVSDK_device_checker_init.speaker.use = args.speakId;
            }

            break;

          case 'CreateRtcCapture':
            if (code === 0 && args.renderid === 'deviceCheckerInit') {
              deviceCheckerCaptureInit = true;
            }

            break;
        }
      });
    });
  }
};
/**
 * @function 加载 Rtc 扩展
 * @param extensionVersion:String 扩展版本号,必选
 * @return Promise | void
 */


var loadRtc = function loadRtc(extensionVersion, cb) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$5) {
    return new Promise(function (resolve, reject) {
      removerListener();
      EM$5.Load(extensionId$1, extensionVersion, false, function (code, msg) {
        defaultApi$1.writeLog("loadRtc Code: ".concat(code, "\nMessage: ").concat(msg));
        addListener$1();
        resolve();
      });
    });
  }
};
/**
 * @function 卸载 Rtc 扩展
 * @return Promise | void
 */

var unloadRtc = function unloadRtc() {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$5) {
    return new Promise(function (resolve, reject) {
      EM$5.UnLoad(extensionId$1, function (code, msg) {
        defaultApi$1.writeLog("unloadRtc Code: ".concat(code, "\nMessage: ").concat(msg));
        resolve();
      });
    });
  }
};
/**
 * @function 添加扩展监听机制
 * @return void
 */

var addListener$1 = function addListener() {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$5 && !hasAddListener$1) {
    hasAddListener$1 = true;
    EM$5.AddListener(extensionId$1, function (event, data) {
      if (data && data.indexOf(extensionId$1) > -1) {
        try {
          var _data2 = JSON.parse(data);

          if (_data2[extensionId$1] !== undefined && EMListenerId == 0) {
            EMListenerId = _data2[extensionId$1];
            defaultApi$1.writeLog("RTC::addListener-- EMListenerId: ".concat(EMListenerId));
          }
        } catch (error) {}
      }

      if (!event || !data) {
        return;
      }

      var _d = JSON.parse(data);

      var _e = JSON.parse(event);

      if (_d && _d.classType === 1) {
        return false;
      }

      if (_e.hasOwnProperty('event_name')) {
        var name = _e.event_name;
        currStreamIdRtcPlayerInfo = streamIdRtcPlayerInfo[_d.streamid];

        switch (name) {
          case 'deviceStateChanged':
            {
              var deviceType = _d.deviceType; // 0=添加设备 1=移除设备 string

              var state = _d.deviceState;
              var deviceNameCamera = '';
              var deviceNameMic = '';
              var deviceNameSpeak = '';

              switch (deviceType) {
                // 摄像头热插拔
                case '1':
                  {
                    setCameraDevice({
                      deviceId: state == 1 ? '' : _d.deviceID,
                      close: false,
                      operationType: 'hotPlug',
                      deviceState: state,
                      changedDeviceId: _d.deviceID,
                      changedDeviceName: _d.deviceName
                    });
                    deviceNameCamera = _d.deviceName;
                  }
                  break;
                // 麦克风热插拔

                case '2':
                  {
                    setMicrophoneDevice({
                      deviceId: state == 1 ? '' : _d.deviceID,
                      operationType: 'hotPlug',
                      deviceState: state,
                      changedDeviceId: _d.deviceID,
                      changedDeviceName: _d.deviceName
                    });
                    deviceNameMic = _d.deviceName;
                  }
                  break;
                // 扬声器热插拔,暂时不做处理

                case '3':
                  {
                    // console.log('hsghsghsg扬声器热插拔',_d,state);
                    setSpeakerDevice({
                      speakId: state == 1 ? '' : _d.deviceID,
                      operationType: 'hotPlug',
                      deviceState: state,
                      changedDeviceId: _d.deviceID,
                      changedDeviceName: _d.deviceName
                    });
                    deviceNameSpeak = _d.deviceName;
                  }
                  break;
              } // try {
              //   dataReport.deviceTest({
              //     device: deviceType,
              //     fore_state: state == '0' ? 1 : 2 ,
              //     camera_name: deviceNameCamera,
              //     microphone_name: deviceNameMic,
              //     speaker_name: deviceNameSpeak
              //   });
              // } catch (e){
              // };

            }
            break;

          case 'rtcCaptureCycleDataReport':
            //推流 fps、bitrate
            {
              var keys = Object.keys(_d);

              if (isNoticeMicVolumeRtc) {
                if (keys.indexOf('volum') > -1 && window.zbyAVSDK_init_sdk_type === 'rtc') {
                  NOTICE.captureMicVolumeChanged({
                    volume: +_d.volum
                  });
                }
              }

              if (keys.indexOf('volum') > -1) {
                // heartBeatDataReportObj.volume.push(_d.volum);
                // console.log('声音回调',`${new Date().getMinutes()}:${new Date().getSeconds()}`,_d.volum);
                heartBeatDataReportObj.volume = heartBeatDataReportObj.volume + _d.volum + ',';
              }
            }
          // 拉流

          case 'rtcPlayCycleDataReport':
            {
              if (_d.errorcode && _d.errorcode == 7000) {
                NOTICE.playerVolumeChanged({
                  userId: util.getUidByStreamId(_d.streamid),
                  streamId: _d.streamid,
                  volume: _d.volume
                }); // currStreamIdRtcPlayerInfo && currStreamIdRtcPlayerInfo.volume.push(_d.volume);
                // streamIdRtcPlayerInfo[_d.streamid] && streamIdRtcPlayerInfo[_d.streamid].volume.push(_d.volume);

                if (streamIdRtcPlayerInfo[_d.streamid]) {
                  streamIdRtcPlayerInfo[_d.streamid].volume = streamIdRtcPlayerInfo[_d.streamid].volume + _d.volume + ',';
                }
              }

              ;

              if (_d.hasOwnProperty('codecBitRate')) {
                if (name === 'rtcPlayCycleDataReport') {
                  NOTICE.pullQuality({
                    video: {
                      userId: util.getUidByStreamId(_d.streamid),
                      streamId: _d.streamid,
                      bitrate: Math.round(_d.codecBitRate),
                      fps: Math.round(_d.codecFrameRate),
                      volume: _d.volume,
                      realTimeVolume: _d.realTimeVolume
                    }
                  });
                  NOTICE.playLossAndDelay({
                    userId: util.getUidByStreamId(_d.streamid),
                    delay: _d.delay,
                    lostrate: _d.lostrate
                  });
                }

                if (name === 'rtcCaptureCycleDataReport') {
                  NOTICE.pushQuality({
                    video: {
                      bitrate: Math.round(_d.codecBitRate),
                      fps: Math.round(_d.codecFrameRate)
                    }
                  });
                  NOTICE.pushLossAndDelay({
                    userId: util.getUidByStreamId(_d.streamid),
                    delay: _d.delay,
                    lostrate: _d.lostrate
                  });
                }

                heartBeatDataReportCalc(name, _d);
              }

              if (_d.hasOwnProperty('realTimeVolume') || _d.hasOwnProperty('volume')) {
                NOTICE.volumeChange({
                  userId: util.getUidByStreamId(_d.streamid),
                  streamId: _d.streamid,
                  volume: _d.volume
                });
              }
            }
            break;

          case 'OnLiveCaptureEvent':
            break;

          case 'OnRtcCaptureEvent':
            {
              if (_d && _d.hasOwnProperty('errorcode')) {
                var code = _d.errorcode;

                switch (code) {
                  case '1003':
                    if (window.zbyAVSDK_init_params.rtc.isTurnPush) {
                      sendRecordingMsg({
                        cmd: 'start'
                      });
                    }

                    if (hasNetWrong) {
                      hasNetWrong = false;
                      NOTICE.networkRecovery({
                        message: 'Network recovery'
                      });
                    }

                    try {
                      dataReport$2.publishResult({
                        code: '0' // publish_streamid: window.zbyAVSDK_init_params.rtc.streamId,

                      });
                      NOTICE.pushFlowSuccess({
                        code: 0,
                        publish_streamid: _d.streamid
                      });
                    } catch (e) {}

                    ;
                    break;

                  case '1005':
                    // 摄像头设备打开成功
                    // 大班数据上报
                    try {
                      dabanDataReport({
                        action: 'open_camera',
                        camera_status: 1,
                        uid: window.zbyAVSDK_init_params.rtc.userId
                      });
                    } catch (e) {}

                    break;

                  case '2011':
                    // 摄像头设备打开失败
                    // 大班数据上报
                    try {
                      dabanDataReport({
                        action: 'open_camera',
                        camera_status: 0,
                        uid: window.zbyAVSDK_init_params.rtc.userId
                      });
                    } catch (e) {}

                    break;

                  case '2008':
                    // 错误的摄像头ID
                    setCameraDevice({
                      deviceId: '',
                      close: false,
                      operationType: 'deviceError'
                    });
                    break;

                  case '1006':
                    // 麦克风设备打开成功
                    break;

                  case '2010': // 麦克风设备打开失败

                  case '2013': // 麦克风设备打开失败

                  case '2012': // 麦克风设备打开失败

                  case '2009':
                    // 错误的录音设备ID
                    setMicrophoneDevice({
                      deviceId: '',
                      operationType: 'deviceError'
                    });
                    break;
                  // 重试推流

                  case '2003':
                  case '2004':
                  case '2005':
                  case '2006':
                  case '2007':
                    // pushFlowExceptionHandler();
                    break;

                  case '2001':
                    hasNetWrong = true;
                    defaultApi$1.writeLog('error', 'Network error');
                    NOTICE.networkError({
                      message: 'Network error'
                    });
                    break;
                }

                if (rtcCaptureErrorCodes.includes(code)) {
                  try {
                    dataReport$2.publishResult({
                      code: code // publish_streamid: window.zbyAVSDK_init_params.rtc.streamId,

                    });
                  } catch (e) {}

                  ;
                }
              }
            }
            break;

          case 'OnSingleRecordResponse':
            {
              NOTICE.recordResponse(_d);
            }
            break;

          case 'live_recovery_start':
            {
              console.log('live_recovery_start');
              NOTICE.liveRecoveryStart();
            }
            break;

          case 'recordingMsg':
            {
              if (_d.cmd === 0) {
                var errorcode = _d.errorcode,
                    streamId = _d.streamId;

                try {
                  dataReport$2.turnPushResult({
                    errorcode: errorcode,
                    case: 'turn push',
                    streamid: streamId
                  });
                } catch (e) {}

                ;
              }
            }
            break;

          case 'OnRecvMediaSideInfo':
            {
              console.log('我是sei', _data);
              NOTICE.seiReceived({
                data: _data
              });
            }
            break;

          case 'VideoFrameInterval':
            {
              currStreamIdRtcPlayerInfo && (currStreamIdRtcPlayerInfo.video_ifg += _d.video_ifg);
            }
            break;

          case 'AudioFrameInterval':
            {
              currStreamIdRtcPlayerInfo && (currStreamIdRtcPlayerInfo.audio_ifg += _d.audio_ifg);
            }
            break;

          case 'OnRtcPlayError':
            {
              if (_d && _d.hasOwnProperty('errorcode')) {
                var _code = _d.errorcode;

                switch (_code) {
                  // 重试拉流
                  case '1002':
                  case '1003':
                  case '1004':
                  case '1005':
                  case '1006':
                  case '1007':
                    // pullFlowExceptionHandler(_d.streamid);
                    NOTICE.playError({
                      userId: util.getUidByStreamId(_d.streamid),
                      streamId: _d.streamid,
                      message: 'play error'
                    });
                    break;

                  case '1001':
                    hasNetWrong = true;
                    writeLog('error', 'Network error');
                    NOTICE.networkError({
                      message: 'Network error'
                    });
                    break;
                }

                if (rtcPlayerErrorCodes.includes(_code)) {
                  pullResultReport(_code, _d.streamid);
                }

                NOTICE.playErrorDetail({
                  type: rtcPlayerCodeToNames[_code],
                  data: {
                    userId: util.getUidByStreamId(_d.streamid),
                    streamId: _d.streamid,
                    allData: _d
                  }
                });
              }
            }
            break;

          case 'OnRtcPlayStatus':
            {
              if (_d && _d.hasOwnProperty('errorcode')) {
                var _code2 = _d.errorcode;

                switch (_code2) {
                  case '2004':
                    if (window.zbyAVSDK_init_params.rtc.role === 'student') {
                      // 大班数据上报
                      try {
                        dabanDataReport({
                          action: 'interact_play',
                          teammate_streamid: _d.streamid,
                          uid: window.zbyAVSDK_init_params.rtc.userId
                        });
                      } catch (e) {}
                    }

                    try {
                      NOTICE.firstVideoSize({
                        userId: util.getUidByStreamId(_d.streamid),
                        streamId: _d.streamid,
                        allData: _d
                      });
                      dataReport$2.firstVideoSize({
                        pull_streamid: _d.streamid,
                        pull_uid: util.getUidByStreamIdDr(_d.streamid),
                        code: '0'
                      });
                    } catch (e) {}

                    ;
                    pullResultReport(0, _d.streamid);
                    defaultApi$1.writeLog("RTC: pullStream success & haveFirstVideoSize  streamId: ".concat(_d.streamid));
                    break;

                  case '2014':
                    try {
                      NOTICE.firstAudioSize({
                        userId: util.getUidByStreamId(_d.streamid),
                        streamId: _d.streamid,
                        allData: _d
                      });
                      dataReport$2.firstAudioSize({
                        pull_streamid: _d.streamid,
                        pull_uid: util.getUidByStreamIdDr(_d.streamid),
                        code: '0'
                      });
                    } catch (e) {}

                    ;
                    break;

                  default:
                    break;
                }

                if (rtcPlayerErrorCodes.includes(_code2)) {
                  if (_code2 == 2003) {
                    //对端未推流
                    var first_time_marker = new Date().getTime();

                    if (!stStreamNotReadyReport.hasOwnProperty(_d.streamid)) {
                      stStreamNotReadyReport[_d.streamid] = new Date().getTime();
                      pullResultReport(_code2, _d.streamid);
                    } else {
                      if (first_time_marker - stStreamNotReadyReport[_d.streamid] >= 10 * 1000) {
                        pullResultReport(_code2, _d.streamid);
                        stStreamNotReadyReport[_d.streamid] = new Date().getTime();
                      }
                    }
                  } else {
                    pullResultReport(_code2, _d.streamid);
                  }
                }

                ;
                NOTICE.playErrorDetail({
                  type: rtcPlayerCodeToNames[_code2],
                  data: {
                    userId: util.getUidByStreamId(_d.streamid),
                    streamId: _d.streamid,
                    allData: _d
                  }
                });
              }
            }
            break;

          case 'beforeCombineCapInfoMsg':
            {
              screenEncodeBefore = _d.width + '*' + _d.height;

              try {
                dataReport$2.splitState({
                  camera_split_start_resolution: captureBefore,
                  //云控取一直不变ok
                  camera_split_start_encode_resolution: captureEncodeBefore,
                  //摄像头拼接前编码分辨率云控拿取
                  screen_split_start_encode_resolution: screenEncodeBefore,
                  //截屏窗拼接前编码分辨率	东奇提供
                  screen_split_start_resolution: screenEncodeBefore,
                  //截屏窗拼接前采集分辨率
                  split: '开始拼接'
                });
              } catch (e) {}

              ;
            }
            break;

          case 'afterCombineInfoMsg':
            {
              captureEncodeAfter = _d.head_width + '*' + _d.head_height;
              screenEncodeAfter = _d.cap_width + '*' + _d.cap_height;

              try {
                dataReport$2.splitState({
                  camera_split_end_resolution: captureAfter,
                  //云控取一直不变ok
                  camera_split_end_encode_resolution: captureEncodeAfter,
                  //摄像头拼接后编码分辨率
                  screen_split_end_encode_resolution: screenEncodeAfter,
                  //截屏窗拼接后编码分辨率
                  screen_split_end_resolution: screenEncodeAfter,
                  //截屏窗拼接后采集分辨率
                  split: '拼接完成'
                });
              } catch (e) {}

              ;
            }
            break;
        } // 去掉声音回调日志


        if (zbysdk$1.openListenerLog) {
          console.log("[zby-live-sdk]--RTC::Listener:: event: ".concat(name, ", data: ").concat(data));
        }
      }
    });
  }
}; //拉流上报


var pullResultReport = function pullResultReport(code, streamid) {
  try {
    dataReport$2.pullResult({
      code: code,
      pull_uid: util.getUidByStreamId(streamid),
      pull_streamid: streamid
    });
    NOTICE.pullFlowResult({
      code: code,
      pull_streamid: streamid
    });
  } catch (e) {}

  ;
};
/**
 * @function 添加扩展监听机制
 * @return void
 */


var removerListener = function removerListener() {
  hasAddListener$1 = false;
  defaultApi$1.writeLog("RTC::action--removerListener EMListenerId:".concat(EMListenerId));
  EM$5.RemoverListener(extensionId$1, EMListenerId, function (ec, content) {});
  EMListenerId = 0;
};
/**
 * @function 推流异常恢复
 */


var pushFlowExceptionHandler = async function pushFlowExceptionHandler() {
  await new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve();
    }, 1000);
  });
  defaultApi$1.writeLog('断网重推');
  defaultApi$1.writeLog('avsdk RTC::try to pushFlow again');
  await stopPush();
  await startPush();
};
/**
 * @function 拉流异常恢复
 */

var pullFlowExceptionHandler = async function pullFlowExceptionHandler(streamId) {
  await new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve();
    }, 1000);
  });
  defaultApi$1.writeLog('断网重拉');
  defaultApi$1.writeLog("avsdk RTC::try to pullFlow again, streamId : ".concat(streamId));
  await stop(streamId);
  await play(streamId);
};
/**
 * @function 设置 appId
 * @param appId:String 长度不能大于 100,必选
 * @return Promise | void
 */

var setAppId = function setAppId(appId) {
  return callMethod$3('SetAppId', {
    appId: appId
  });
};
/**
 * @function 设置用户名
 * @param userName:String 用户名,必选
 * @return Promise | void
 */

var setUserName = function setUserName(userName) {
  return callMethod$3('SetUserName', {
    userName: userName
  });
};
/**
 * @function 设置用户 id
 * @param userId:Number 用户 id,必选
 * @return Promise | void
 */

var setUserId = function setUserId(userId) {
  return callMethod$3('SetUserId', {
    userId: userId + ''
  });
};
/**
 * @function 设置课节 id
 * @param confId:String 长度不能大于 100
 * @return Promise | void
 */

var setConfId = function setConfId(confId) {
  defaultApi$1.writeLog("RTC SetConfId: ".concat(confId));
  _confId = confId;
  return callMethod$3('SetConfId', {
    confId: confId
  });
};
/**
 * @function 进入音视频房间
 * @return Promise | void
 */

var joinRtcRoom = async function joinRtcRoom() {
  await callMethod$3('JoinRoom', {});
  return new Promise(function (resolve, reject) {
    var timer = setInterval(function () {
      if (hasJoinRtcRoom) {
        clearInterval(timer);
        resolve();
      }
    }, 50);
  });
};
/**
 * @function 退出音视频房间
 * @return Promise | void
 */

var leaveRtcRoom = async function leaveRtcRoom() {
  await callMethod$3('LeaveRoom', {});
  return new Promise(function (resolve, reject) {
    var timer = setInterval(function () {
      if (hasLeaveRtcRoom) {
        clearInterval(timer);
        resolve();
      }
    }, 50);
  });
};
/**
 * @function 开始混流
 * @param  args:Object 混流设置信息
 * @return Promise | void
 * {
'sequence':x,//混流任务序列号
'inputStreams':[
{
'confId':'xxx',
'streamId':'xxxx',
'mediaControl':x,//0所有1音频2视频
'left':x,
'top':x,
'right':x,
'bottom':x
}
],
'outputStream':{
'pushType';x,
'rtmpUrls';'xxx',
'videoFps':x,//视频帧率
'videoRate':x,//视频码率
'audioRate':x,//音频码率
'videoWidth':x,//合成视频宽度
'videoHeight':x,//合成视频高度
'audioFormat':x,//音频格式,0aac
'audioChannels':x,//音频声道数目
'backgroudColor':x//背景色10进制?
}
}
 */

var startRoomMixRecord = function startRoomMixRecord(args) {
  return callMethod$3('StartRoomMixRecord', args);
};
/**
 * @function 开始混流 id
 * @param  args: Object 停止混流设置信息
 * {'sequence':x}//混流任务序列号
 * @return Promise | void
 */

var stopRoomMixRecord = function stopRoomMixRecord(args) {
  return callMethod$3('StopRoomMixRecord', args);
};
/**
 * @function 开始单路录制--暂停使用
 * @param  sequence: String
 * @param  streamId: String 流 id
 * @return Promise | void
 */

var startSingleRecord = function startSingleRecord() {
  var sequence = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  var streamId = arguments.length > 1 ? arguments[1] : undefined;
  return callMethod$3('StartSingleRecord', {
    sequence: sequence,
    streamId: streamId,
    confId: _getConfId(streamId)
  });
};
/**
 * @function 停止单路录制--暂停使用
 * @param  streamId: String 停止混流设置信息
 * @return Promise | void
 */

var stopSingleRecord = function stopSingleRecord(streamId) {
  return callMethod$3('StopSingleRecord', {
    streamId: streamId,
    confId: _getConfId(streamId)
  });
};
/**
 * @function 创建 Rtc Capture对象
 * @param renderId:String 采集器的渲染 id,必选
 * @return Promise | void
 */

var createRtcCapture = function createRtcCapture(renderId) {
  if (renderId === 'deviceCheckerInit' && deviceCheckerCaptureInit) {
    return;
  }

  return callMethod$3('CreateRtcCapture', {
    source: 'camera',
    renderid: renderId
  });
}; // 设置采集器配置

var setRtcCaptureParams = async function setRtcCaptureParams(args, from) {
  if (!from) {
    await setCaptureRenderID(args.streamId);
    await setCaptureStreamId(args.streamId);
  }

  await setCameraParam(args.previewResolutionWidth, args.previewResolutionHeight, args.previewCaptureFps);
  await setEncodeParam(args.encodedResolutionWidth, args.encodedResolutionHeight, args.encodeCaptureFps);
  await setBitRate(args.encodeCaptureBitrate);
};
/**
   * @function 加载采集插件的输入数据  //调用后,rtc 可以向采集插件传送摄像头数据,用于拼接 
   * @return: Promise
   */


var rtcLoadCollectionEntry = function rtcLoadCollectionEntry() {
  return callMethod$3('RtcLoadCollectionEntry', {});
};
/**
 * @function 加载采集插件的输出数据  //调用后,rtc 可以向采集插件传送学生流数据(加载截屏插件,获取截屏插件设置拉流头像回调函数)
 * @param stream_ids array 设置需要拼接的学生头像流id,按数组顺序拼接
 * @return: Promise
 */


var rtcLoadCollectionEntry2 = function rtcLoadCollectionEntry2(stream_ids) {
  return callMethod$3('RtcLoadCollectionEntry2', {
    stream_ids: stream_ids
  });
};
/**
 * @function 获取摄像头个数
 * @return Promise | void
 */

var getCameraDeviceCount = function getCameraDeviceCount() {
  return callMethod$3('GetCameraDeviceCount', {});
};
/**
 * @function 获取摄像头列表
 * @return Promise | void
 */

var getCameraDevice = async function getCameraDevice() {
  var cameraListObject = JSON.parse((await callMethod$3('GetCameraDevice', {})).msg);
  var cameraKeys = [];

  if (cameraListObject) {
    cameraKeys = Object.keys(cameraListObject);
  }

  var cameraList = [];

  for (var i = 0, len = cameraKeys.length; i < len; i++) {
    cameraList.push({
      deviceId: cameraListObject[cameraKeys[i]].deviceID,
      deviceName: cameraListObject[cameraKeys[i]].deviceName,
      isDefault: cameraListObject[cameraKeys[i]].bDefault
    });
    deviceListReport.cameraList[cameraListObject[cameraKeys[i]].deviceID] = cameraListObject[cameraKeys[i]].deviceName; // console.log('hsghsghsg_9',deviceListReport.cameraList);
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.camera) {
    window.zbyAVSDK_device_checker_init.camera = {};
  }

  window.zbyAVSDK_device_checker_init.camera.hasTest = true;
  window.zbyAVSDK_device_checker_init.camera.list = cameraList;
  return cameraList;
};
/**
 * @function 获取扬声器个数
 * @return Promise | void
 */

var getSpeakerDeviceCount = function getSpeakerDeviceCount() {
  return callMethod$3('GetSpeakerDeviceCount', {});
};
/**
 * @function 获取扬声器列表
 * @return Promise | void
 */

var getSpeakerDevice = async function getSpeakerDevice() {
  var speakerListObject = JSON.parse((await callMethod$3('GetSpeakerDevice', {})).msg);
  var speakerKeys = [];

  if (speakerListObject) {
    speakerKeys = Object.keys(speakerListObject);
  }

  var speakerList = [];

  for (var i = 0, len = speakerKeys.length; i < len; i++) {
    speakerList.push({
      deviceId: speakerListObject[speakerKeys[i]].deviceID,
      deviceName: speakerListObject[speakerKeys[i]].deviceName,
      isDefault: speakerListObject[speakerKeys[i]].bDefault
    });
    deviceListReport.speakerList[speakerListObject[speakerKeys[i]].deviceID] = speakerListObject[speakerKeys[i]].deviceName; // console.log('hsghsghsg_8',deviceListReport.speakerList);
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.speaker) {
    window.zbyAVSDK_device_checker_init.speaker = {};
  }

  window.zbyAVSDK_device_checker_init.speaker.hasTest = true;
  window.zbyAVSDK_device_checker_init.speaker.list = speakerList;
  return speakerList;
};
/**
 * @function 获取麦克风个数
 * @return Promise | void
 */

var getMicrophoneDeviceCount = function getMicrophoneDeviceCount() {
  return callMethod$3('GetMicrophoneDeviceCount', {});
};
/**
 * @function 获取麦克风列表
 * @return Promise | void
 */

var getMicrophoneDevice = async function getMicrophoneDevice() {
  var microphoneListObject = JSON.parse((await callMethod$3('GetMicrophoneDevice', {})).msg);
  var microphoneKeys = [];

  if (microphoneListObject) {
    microphoneKeys = Object.keys(microphoneListObject);
  }

  var microphoneList = [];

  for (var i = 0, len = microphoneKeys.length; i < len; i++) {
    microphoneList.push({
      deviceId: microphoneListObject[microphoneKeys[i]].deviceID,
      deviceName: microphoneListObject[microphoneKeys[i]].deviceName,
      isDefault: microphoneListObject[microphoneKeys[i]].bDefault
    });
    deviceListReport.micList[microphoneListObject[microphoneKeys[i]].deviceID] = microphoneListObject[microphoneKeys[i]].deviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.microphone) {
    window.zbyAVSDK_device_checker_init.microphone = {};
  }

  window.zbyAVSDK_device_checker_init.microphone.hasTest = true;
  window.zbyAVSDK_device_checker_init.microphone.list = microphoneList;
  return microphoneList;
};
/**
 * @function 指定麦克风设备
 * @param deviceId:String 麦克风设备 id,必选
 * @param operationType:String 操作类型,可选
 * 'device_error' -> 设备出错处理,'plug_and_unplug' -> 热插拔处理,
 * 不传即是普通的设置麦克风设备的行为
 * @return Promise | void
 */

var setMicrophoneDevice = async function setMicrophoneDevice(args) {
  var deviceId = args.deviceId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var microPhoneData;

  if (!deviceId) {
    microPhoneData = await getMicrophoneDevice();

    if (microPhoneData.length) {
      var hasGetMicrophone = false;
      var _iteratorNormalCompletion = true;
      var _didIteratorError = false;
      var _iteratorError = undefined;

      try {
        for (var _iterator = microPhoneData[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
          var item = _step.value;

          if (item.isDefault) {
            deviceId = item.deviceId;
            deviceName = item.deviceName;
            hasGetMicrophone = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError = true;
        _iteratorError = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion && _iterator.return != null) {
            _iterator.return();
          }
        } finally {
          if (_didIteratorError) {
            throw _iteratorError;
          }
        }
      }

      if (!hasGetMicrophone) {
        deviceId = microPhoneData[0].deviceId;
        deviceName = microPhoneData[0].deviceName;
      }
    } else {
      deviceId = '';
    }

    if (deviceId === '') {
      NOTICE.noDevice({
        deviceType: 'microphone'
      });
    }
  }

  try {
    dataReport$2.setDevice({
      device_type: 2,
      device_id: deviceId,
      device_name: deviceListReport.micList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? +deviceState + 1 : '-'
    });
    window.zbyAVSDK_device_checker_init.microphone.name = deviceListReport.micList[deviceId];
  } catch (e) {}

  ;
  await callMethod$3('SetAudioDevice', {
    deviceID: deviceId
  });

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!microPhoneData) {
      microPhoneData = await getMicrophoneDevice();
      deviceName = deviceListReport.micList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'microphone',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: microPhoneData,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }
};
/**
 * @function 获取麦克风音量
 * @return Promise | void
 */

var getMicrophoneVolume = function getMicrophoneVolume() {
  return callMethod$3('GetMicrophoneVolume', {});
};
/**
 * @function 设置麦克风音量
 * @param volume:Number 音量,必选
 * @param bMuteDevice:Boolean 是否静音,可选
 * 不传的话默认为 false 不静音
 * @return Promise | void
 */

var setMicrophoneVolume = function setMicrophoneVolume(volume, bMuteDevice) {
  if (typeof bMuteDevice === 'undefined') {
    bMuteDevice = false;
  }

  return callMethod$3('SetMicrophoneVolume', {
    bMuteDevice: bMuteDevice,
    volume: volume
  });
};
/**
 * @function 开启/关闭麦克风音量回调
 * @param open:Boolean true -> 开启,false -> 关闭,必选
 * @return void
 */

var openMicVolumeCb = function openMicVolumeCb(open) {// if (open) {
  //   runMicVolumeCb = true;
  // } else {
  //   runMicVolumeCb = false;
  // }
};
/**
 * @function 获取当前应用程序音量
 * @return Promise | void
 */

var getCurrentAppSessionVolume = function getCurrentAppSessionVolume() {
  return callMethod$3('GetCurrentAppSessionVolume', {});
};
/**
 * @function 设置当前应用程序音量
 * @param volume:Number 音量,必选
 * @param mute:Boolean 是否静音,可选
 * 不传的话默认为 false 不静音
 * @return Promise | void
 */

var setCurrentAppSessionVolume = function setCurrentAppSessionVolume(volume, mute) {
  if (typeof mute === 'undefined') {
    mute = false;
  }

  return callMethod$3('SetCurrentAppSessionVolume', {
    muted: mute,
    volume: volume
  });
};
/**
 * @function 设置当前应用程序静音
 * @param mute:Boolean 是否静音,必选
 * @return Promise | void
 */

var setApplicationMute = function setApplicationMute(mute) {
  return callMethod$3('SetApplicationMute', {
    muted: mute
  });
};
/**
 * @function 设置预览窗口
 * @param x:Number x 坐标,必选,推荐 0
 * @param y:Number y 坐标,必选,推荐 0
 * @param width:Number 宽,必选,推荐 300
 * @param height:Number 高,必选,推荐 300
 * @return Promise | void
 */

var setPreviewPos = function setPreviewPos(x, y, width, height) {
  return callMethod$3('SetPreviewPos', {
    x: x,
    y: y,
    width: width,
    height: height
  });
};
/**
 * @function 指定摄像头设备
 * @param deviceId:String 摄像头设备 id,必选
 * @param close:Boolean true -> 关闭摄像头,false -> 不关闭摄像头
 * Rtc 关闭摄像头是通过指定空的设备来实现的,因此需要做特化
 * @param operationType:String 操作类型,可选
 * 'device_error' -> 设备出错处理,'plug_and_unplug' -> 热插拔处理,
 * 不传即是普通的设置摄像头设备的行为
 * @return Promise | void
 */

var setCameraDevice = async function setCameraDevice(args) {
  defaultApi$1.writeLog("sdk action : setCameraDevice args:".concat(JSON.stringify(args)));
  var deviceId = args.deviceId,
      close = args.close,
      operationType = args.operationType,
      deviceState = args.deviceState,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var cameraData;

  if (!deviceId && !close) {
    cameraData = await getCameraDevice();

    if (cameraData.length) {
      var hasGetCamare = false;
      var _iteratorNormalCompletion2 = true;
      var _didIteratorError2 = false;
      var _iteratorError2 = undefined;

      try {
        for (var _iterator2 = cameraData[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
          var item = _step2.value;

          if (item.isDefault) {
            deviceId = item.deviceId;
            deviceName = item.deviceName;
            hasGetCamare = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError2 = true;
        _iteratorError2 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
            _iterator2.return();
          }
        } finally {
          if (_didIteratorError2) {
            throw _iteratorError2;
          }
        }
      }

      if (!hasGetCamare) {
        deviceId = cameraData[0].deviceId;
        deviceName = cameraData[0].deviceName;
      }

      deviceId = cameraData[0].deviceId;
      deviceName = cameraData[0].deviceName;
    } else {
      deviceId = '';
    }

    if (deviceId === '') {
      NOTICE.noDevice({
        deviceType: 'camera'
      });
    }
  }

  try {
    dataReport$2.setDevice({
      device_type: 1,
      device_id: deviceId,
      device_name: deviceListReport.cameraList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? +deviceState + 1 : '-'
    });
    window.zbyAVSDK_device_checker_init.camera.name = deviceListReport.cameraList[deviceId];
  } catch (e) {}

  ;
  await callMethod$3('SetCameraDevice', {
    deviceID: deviceId,
    close: close
  });

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!cameraData) {
      cameraData = await getCameraDevice();
      deviceName = deviceListReport.cameraList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'camera',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: cameraData,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }

  try {
    NOTICE.useredCamera({
      deviceId: deviceId,
      deviceName: deviceName
    });
  } catch (e) {}

  ;
};
/**
 * @function 获取摄像头所支持的分辨率
 * @param deviceId:String 设备id
 * @return Promise | void
 */

var getCameraSupportedRes = function getCameraSupportedRes(deviceId) {
  return callMethod$3('GetCameraSupportedResolution', {
    deviceId: deviceId
  });
};
/**
 * @function 设置事件上报链接
 * @param reportSvr:String 上报服务器链接,必选
 * @return Promise | void
 */

var setEventReportSvr = function setEventReportSvr(reportSvr) {
  return callMethod$3('SetEventReportSvr', {
    reportSvr: reportSvr
  });
};
/**
 * @function 设置摄像头参数
 * @param width:Number 分辨率宽,必选,推荐 1280
 * @param height:Number 分辨率高,必选,推荐 720
 * @param frameRate:Number 帧率,必选,推荐 15
 * @return Promise | void
 */

var setCameraParam = function setCameraParam(width, height, frameRate) {
  return callMethod$3('SetCameraParam', {
    width: width,
    height: height,
    frameRate: frameRate
  });
};
/**
 * @function 指定扬声器
 * @param speakId:String 扬声器 id,必选
 * @return Promise | void
 */

var setSpeakerDevice = async function setSpeakerDevice(args) {
  defaultApi$1.writeLog("sdk action : setSpeakerDevice args:".concat(JSON.stringify(args)));
  var speakId = args.speakId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var speakerData;

  if (!speakId) {
    speakerData = await getSpeakerDevice();

    if (speakerData.length) {
      var hasGetSpeaker = false;
      var _iteratorNormalCompletion3 = true;
      var _didIteratorError3 = false;
      var _iteratorError3 = undefined;

      try {
        for (var _iterator3 = speakerData[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
          var item = _step3.value;

          if (item.isDefault) {
            speakId = item.deviceId;
            deviceName = item.deviceName;
            hasGetSpeaker = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError3 = true;
        _iteratorError3 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
            _iterator3.return();
          }
        } finally {
          if (_didIteratorError3) {
            throw _iteratorError3;
          }
        }
      }

      if (!hasGetSpeaker) {
        speakId = speakerData[0].deviceId;
        deviceName = speakerData[0].deviceName;
      }
    } else {
      speakId = '';
    }

    if (speakId === '') {
      NOTICE.noDevice({
        deviceType: 'speaker'
      });
    }
  }

  try {
    dataReport$2.setDevice({
      device_type: 3,
      device_id: speakId,
      device_name: deviceListReport.speakerList[speakId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? +deviceState + 1 : '-'
    });
    window.zbyAVSDK_device_checker_init.speaker.name = deviceListReport.speakerList[speakId];
  } catch (e) {
    console.error('error', e);
  }

  ; // console.log('hsghsghsg3',speakId);

  await callMethod$3('SetSpeakerDevice', {
    speakId: speakId
  });

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!speakerData) {
      speakerData = await getSpeakerDevice();
      deviceName = deviceListReport.speakerList[speakId];
    }

    NOTICE[operationType]({
      deviceType: 'speaker',
      useDeviceId: speakId,
      useDeviceName: deviceName,
      deviceList: speakerData,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }
};
/**
 * @function 设置扬声器音量
 * @param volume:Number 音量,必选
 * @param muted:Boolean 是否静音,可选
 * 不传的话就默认为 false 不静音
 * @return Promise | void
 */

var setSpeakerVolume = function setSpeakerVolume(volume, muted) {
  if (typeof muted === 'undefined') {
    muted = false;
  }

  return callMethod$3('SetSpeakerVolume', {
    muted: muted,
    volume: volume
  });
};
/**
 * @function 设置扬声器静音
 * @param mute:Boolean 是否静音,可选
 * @return Promise | void
 */

var setSpeakerMute = function setSpeakerMute(mute) {
  // try {
  //   dataReport.deviceChange({
  //     device: 3,
  //     device_state: mute ? 0 :1
  //   });
  // } catch (e){};
  return callMethod$3('SetSpeakerMute', {
    muted: mute
  });
};
/**
 * @function 获取扬声器音量
 * @return Promise | void
 */

var getSpeakerVolume = function getSpeakerVolume() {
  return callMethod$3('GetSpeakerVolume', {});
};
/**
 * @function 设置拉流的播放器静音
 * @param streamId:String 被拉取的流的 id,必选
 * @param mute:Boolean 是否静音,必选 true 静音| false不静音
 * @return Promise | void
 */

var setMute = function setMute(streamId, mute) {
  var rtcPlayerId = streamIdToRtcPlayerId[streamId];
  return pullAudioFlow(rtcPlayerId, mute);
};
/**
   * @function 是否拉取音频流--通过播放器id控制
   * @param operation:Boolean,必选,true 静音| false不静音
   * @param playerId:Number,必选,播放器id
   * @return Promise | void
   */

var pullAudioFlow = function pullAudioFlow(playerId, operation, operator, streamid) {
  defaultApi$1.writeLog("pullAudioFlow -- playerId ".concat(playerId, " operation ").concat(operation, " streamId ").concat(streamid));

  if (streamid) {
    if (streamIdToRtcPlayerId[streamid] == undefined) {
      NOTICE.pullAudioFlowError({
        streamid: streamid
      });
      return;
    } else {
      playerId = streamIdToRtcPlayerId[streamid];
      console.log('pullAudioFlow-playerId', playerId, streamIdToPreviewId);
    }
  }

  var streamId = rtcPlayerIdToStreamId[playerId];

  try {
    streamIdRtcPlayerInfo1[streamId].audio_type = !operation;
    console.log('pullAudioFlow_rtc ::rtcPlayerIdToStreamId', streamId, rtcPlayerIdToStreamId);
    console.log('pullAudioFlow_rtc ::streamIdRtcPlayerInfo1', streamId, streamIdRtcPlayerInfo1);
  } catch (e) {
    console.log('pullAudioFlow_rtc ::streamIdRtcPlayerInfo1--error', e);
  }

  ; // console.log('hghghg',streamIdRtcPlayerInfo1[streamId]);

  try {
    if (operator) {
      dataReport$2.setPullVoice({
        code: +!operation,
        pull_uid: util.getUidByStreamId(streamId),
        pull_streamid: streamId,
        playerId: playerId
      });
    }
  } catch (e) {}

  ;
  return callMethod$3('SetMute', {
    muted: operation,
    id: playerId
  });
};
/**
 * @function 控制只拉音频流
 * @param streamId:String 被拉取的流的 id,必选
 * @param audioOnly:Boolean 是否只拉音频流,必选,true -> 只拉音频流,false -> 音视频都拉
 * @return Promise | void
 */

var controlPullAudioOnly = function controlPullAudioOnly(streamId, audioOnly) {
  try {
    streamIdRtcPlayerInfo1[streamId].video_type = !audioOnly;
    console.log('controlPullAudioOnly_rtc ::streamIdRtcPlayerInfo1', streamId, streamIdRtcPlayerInfo1);
  } catch (e) {
    console.log('controlPullAudioOnly_rtc ::streamIdRtcPlayerInfo1--error', e);
  }

  var rtcPlayerId = streamIdToRtcPlayerId[streamId];
  return callMethod$3('ControlPullAudioOnly', {
    id: rtcPlayerId,
    audioOnly: audioOnly
  });
};
/**
 * @function 启动摄像头
 * @return Promise | void
 */

var startPreview = function startPreview() {
  // try {
  //   dataReport.deviceChange({
  //     device: 1,
  //     device_state: 1
  //   });
  // } catch (e){};
  return callMethod$3('StartPreview', {});
};
/**
 * @function 设置推流的编码参数
 * @param width:Number 宽,必须,推荐 1280
 * @param height:Number 高,必须,推荐 720
 * @param frameRate:Number 码率,必须,推荐 15
 * @return Promise | void
 */

var setEncodeParam = function setEncodeParam(width, height, frameRate) {
  return callMethod$3('SetEncodeParam', {
    width: width,
    height: height,
    frameRate: frameRate
  });
};
/**
 * @function 设置推流的比特率
 * @param bps:Number 码率,必选,推荐 512000
 * @return Promise | void
 */

var setBitRate = function setBitRate(bps) {
  return callMethod$3('SetBitRate', {
    bps: bps
  });
};
/**
 * @function 设置推流的的 streamId
 * @param streamId:String 推流 id,必选,长度不能超过100个字符
 * @return Promise | void
 */

var setCaptureStreamId = function setCaptureStreamId(streamId) {
  return callMethod$3('SetCaptureStreamId', {
    streamid: streamId
  });
};
/**
 * @function 设置本地摄像头采集器的渲染 id
 * @param renderId:String 渲染 id,传入推流 id 即可,必选
 * @return Promise | void
 */

var setCaptureRenderID = function setCaptureRenderID(renderId) {
  return callMethod$3('SetCaptureRenderID', {
    renderid: renderId
  });
};
/**
 * @function 开始推流到服务器
 * 如果收到 error,SDK 回到 startPush 之前的状态,
 * 应用程序需要重新设置正确的参数,并 startPush
 * @return Promise | void
 */

var startPush = function startPush() {
  if (!isFirstHeartBeatReport) {
    isFirstHeartBeatReport = true;
    heartBeatDataReport('start');
  }

  return callMethod$3('StartPush', {});
};
/**
 * @function 停止推流
 * @return Promise | void
 */

var stopPush = function stopPush() {
  // try {
  //   dataReport.stopPublish({publish_streamid:window.zbyAVSDK_init_params.rtc.streamId});
  // } catch (error) {
  // }
  return callMethod$3('StopPush', {});
};
/**
 * @function 关闭摄像头
 * @return Promise | void
 */

var stopPreview = function stopPreview() {
  // try {
  //   dataReport.deviceChange({
  //     device: 1,
  //     device_state: 0
  //   });
  // } catch (e){};
  return callMethod$3('StopPreview', {});
};
/**
 * @function 销毁采集器对象
 * @return Promise | void
 */

var captureDestroy = async function captureDestroy() {
  await stopPreview();
  return callMethod$3('CaptureDestroy', {});
};
/**
 * @function 销毁引擎
 * @return Promise | void
 */

var destroyEngine = function destroyEngine() {
  return callMethod$3('DestroyEngine', {});
};
/**
 * @function 创建视频播放器
 * @param pos:Object
 * {
 *   x,        // Number,x 坐标,必选,推荐 500
 *   y,        // Number,y 坐标,必选,推荐 500
 *   width,    // Number,宽,必选,推荐 300
 *   height    // Number,高,必选,推荐 300
 * }
 * @param renderId:String,渲染 id,必选
 * @return Promise | void
 */

var createRtcPlayer = function createRtcPlayer(pos, renderId) {
  return callMethod$3('CreateRtcPlayer', {
    pos: pos,
    renderid: renderId
  });
};
/**
 * @function 设置被拉取的流的 id
 * @param streamId:String 被拉取的流的 id,必选
 * @return Promise | void
 */

var setPlayerStreamId = function setPlayerStreamId(rtcPlayerId, streamId) {
  var args = {
    streamid: streamId,
    id: rtcPlayerId,
    // 跨组拉流
    confId: _getConfId(streamId)
  };
  defaultApi$1.writeLog("RTC::SetPlayerStreamId streamId: ".concat(streamId, " id: ").concat(rtcPlayerId, " confId:\n  ").concat(util.getDataFromStreamUrl('roomId', streamId), "\n  args : ").concat(JSON.stringify(args), "\n  "));
  return callMethod$3('SetPlayerStreamId', args);
};
/**
 * @function 设置被拉取的流的渲染 id
 * @param renderId:String 拉流的渲染 id,必选,传入被拉取的流的 id 即可
 * @return Promise | void
 */

var setPlayRenderID = function setPlayRenderID(rtcPlayerId, renderId) {
  defaultApi$1.writeLog("RTC::SetPlayRenderID streamId: ".concat(renderId, " id: ").concat(rtcPlayerId));
  return callMethod$3('SetPlayRenderID', {
    renderid: renderId,
    id: rtcPlayerId
  });
};
/**
 * @function 关闭客户端
 * @param streamId:String 被拉取的流的 id,必选
 * @return Promise | void
 */

var playDestroy = function playDestroy(streamId) {
  var rtcPlayerId = streamIdToRtcPlayerId[streamId];
  defaultApi$1.writeLog("RTC::PlayDestroy streamId: ".concat(streamId, " id: ").concat(rtcPlayerId));
  delete streamIdToRtcPlayerId[streamId];
  delete streamIdRtcPlayerInfo[streamId];
  return callMethod$3('PlayDestroy', {
    id: rtcPlayerId
  });
};
/**
 * @function 开启本地或者远程的视频视图
 * @param isLocal:Boolean 是否是本地的视频预览,必选
 * @param streamId:String 要拉取的视频流的 id,可选,只有拉取远程的视频流的时候才是必选的
 * @param domId:String <video> 标签的 id,可选
 * 如果传了 domId,就把视频绑定到对应的 <video> 标签上
 * @return Promise | void,可从 Promise 中获取 src,Promise.then((src) => {})
 */

var startLocalOrRemotePreview = async function startLocalOrRemotePreview(isLocal, streamId, domId, rtcPlayerId) {
  defaultApi$1.writeLog("".concat(streamId, "----streamId-rtc----"));
  var isUpdateChromeVersion = await util.getChromeVersion(); // 预览本地视频的话,流 id 从全局配置中获取

  if (isLocal) {
    streamId = isInRoom ? window.zbyAVSDK_init_params && window.zbyAVSDK_init_params.rtc.streamId : 'deviceCheckerInit';
  }

  var externalConstraints = {
    audio: false,
    video: {
      mandatory: {
        chromeMediaSource: 'external',
        chromeMediaSourceId: "ems://TM/".concat(streamId)
      }
    }
  };
  return new Promise(function (resolve, reject) {
    var handleExternalSuccess = function handleExternalSuccess(stream) {
      defaultApi$1.writeLog("".concat(stream, "----stream-rtc----"));

      stream.oninactive = function () {
        defaultApi$1.writeLog('Stream inactive');
      };

      var src = isUpdateChromeVersion ? stream : window.URL.createObjectURL(stream);
      console.log('内核升级', isUpdateChromeVersion);

      if (domId && document.querySelector(domId)) {
        if (isUpdateChromeVersion) {
          console.log('内核升级1');
          document.querySelector(domId).srcObject = src;
        } else {
          console.log('内核升级2');
          document.querySelector(domId).src = src;
        }
      }

      defaultApi$1.writeLog("setVidoeSrc, rtcPlayerId: ".concat(rtcPlayerId, ", streamId:").concat(streamId, ", domId: ").concat(domId, ", src: ").concat(src));
      resolve(src);
    };

    var handleExternalError = function handleExternalError(error) {
      if (error.name === 'ConstraintNotSatisfiedError') {
        console.error('ConstraintNotSatisfiedError');
      } else if (error.name === 'PermissionDeniedError') {
        console.error('Permissions have not been granted to use your camera and ' + 'microphone, you need to allow the page access to your devices in ' + 'order for the demo to work.');
      }

      console.error("getUserMedia error: ".concat(error.name), error);

      if (domId) {
        document.querySelector(domId).src = '';
      }

      reject('');
    };

    if (navigator.webkitGetUserMedia) {
      navigator.webkitGetUserMedia(externalConstraints, handleExternalSuccess, handleExternalError);
    }
  });
};
/**
 * @function 初始化
 * @param args:Object
 * {
 *   extensionVersion,  // String,扩展版本号,必选
 *   appId,             // String,Rtc 秘钥,必选
 *   userName,          // String,用户名,必选
 *   userId,            // Number,用户 id,必选
 *   roomId,            // String,房间 id,必选
 *   streamId           // String,流 id,必选
 * }
 * @return Promise | void
 */

var init = async function init(args) {
  var usedDevices = window.zbyAVSDK_device_checker_init;
  var devices = args.devices;
  args.devices = {
    camera: devices && devices.camera || usedDevices && usedDevices.camera && usedDevices.camera.use || '',
    microphone: devices && devices.microphone || usedDevices && usedDevices.microphone && usedDevices.microphone.use || '',
    speaker: devices && devices.speaker || usedDevices && usedDevices.speaker && usedDevices.speaker.use || ''
  };
  await loadRtc(args.extensionVersion); // setStatisticsInterval(1000);

  addListener$1();
  await setAppId(args.appId);
  await setUserName(args.userName);
  await setUserId(args.userId);
  await setConfId(args.confId); // await joinRtcRoom();

  if (deviceCheckerCaptureInit) {
    await captureDestroy();
    deviceCheckerCaptureInit = false;
  } // if (args.role === 'teacher' && args.classMode === 1) {
  //   await setUserRole(1);
  // }
  //小班课 需要加载采集插件的输入数据,为了拼接rtc头像


  if (args.classMode === 1 || args.classMode === 2) {
    rtcLoadCollectionEntry();
  }

  ;
  await createRtcCapture(args.streamId);
  await setDefaultDevice(args.devices, 'default');
  await setRtcCaptureParams(args);
  await setPreviewMute(true);
  await muteLocalVideo(true);
  await startPreview();
  isInRoom = true;
  window.current_sdk_type = 'rtc';
  defaultApi$1.writeLog('rtc init finished current_sdk_type : rtc');
  paramInfo = window.zbyAVSDK_init_params.rtc;
  captureBefore = paramInfo.encodedResolutionWidth + '*' + paramInfo.encodedResolutionHeight; //运控获取,一直不变(拼接前摄像头采集分辨率)

  captureEncodeBefore = paramInfo.previewResolutionWidth + '*' + paramInfo.previewResolutionHeight; //摄像头拼接前编码分辨率云控拿取

  captureAfter = captureBefore;
};
/**
 * @function 恢复
 */

var recoverSdk = async function recoverSdk(args) {
  addListener$1();
  await setRtcCaptureParams(args);
  await setPreviewMute(true);
  _confId = args.confId;
  var zby_sdk_rtcPlayerIds = localStorage.getItem('zby_sdk_rtcPlayerIds');

  if (zby_sdk_rtcPlayerIds) {
    rtcPlayerIds = zby_sdk_rtcPlayerIds.split(',').map(function (item) {
      return +item;
    });
    defaultApi$1.writeLog("RTC sdk action : recoverSdk --> PlayDestroy --> rtcPlayerIds: ".concat(rtcPlayerIds));

    if (rtcPlayerIds.length > 0) {
      for (var i = 0, len = rtcPlayerIds.length; i < len; i++) {
        await callMethod$3('PlayDestroy', {
          id: rtcPlayerIds[i]
        });
      }
    }
  }

  localStorage.removeItem('zby_sdk_rtcPlayerIds');
  isInRoom = true;
  window.current_sdk_type = 'rtc';
  defaultApi$1.writeLog('rtc recoverSdk finished current_sdk_type : rtc');
};
var stopCheckDevice = function stopCheckDevice() {
  deviceCheckerCaptureInit = false;
  removerListener();
  defaultApi$1.writeLog('rtc stopCheckDevice and removerListener and captureDestroy');
  return captureDestroy();
}; //设置拉流质量监控周期

var setStatisticsInterval = function setStatisticsInterval(interval) {
  return callMethod$3('SetStatisticsInterval', {
    interval: interval
  });
};
/**
 * @function 设置默认的硬件设备,包括摄像头、麦克风以及扬声器
 * @return Promise | void
 */


var setDefaultDevice = async function setDefaultDevice(devices, operationType) {
  // 设置默认的摄像头
  if (devices && devices.camera) {
    await setCameraDevice({
      deviceId: devices.camera,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var cameraData = await getCameraDevice();

    if (cameraData.length) {
      var hasSetCamera = false;
      var _iteratorNormalCompletion4 = true;
      var _didIteratorError4 = false;
      var _iteratorError4 = undefined;

      try {
        for (var _iterator4 = cameraData[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
          var item = _step4.value;

          if (item.isDefault) {
            await setCameraDevice({
              deviceId: item.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetCamera = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError4 = true;
        _iteratorError4 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
            _iterator4.return();
          }
        } finally {
          if (_didIteratorError4) {
            throw _iteratorError4;
          }
        }
      }

      if (!hasSetCamera) {
        await setCameraDevice({
          deviceId: cameraData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  } // 设置默认的麦克风


  if (devices && devices.microphone) {
    await setMicrophoneDevice({
      deviceId: devices.microphone,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var microPhoneData = await getMicrophoneDevice();

    if (microPhoneData.length) {
      var hasSetMicrophone = false;
      var _iteratorNormalCompletion5 = true;
      var _didIteratorError5 = false;
      var _iteratorError5 = undefined;

      try {
        for (var _iterator5 = microPhoneData[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
          var _item = _step5.value;

          if (_item.isDefault) {
            await setMicrophoneDevice({
              deviceId: _item.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetMicrophone = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError5 = true;
        _iteratorError5 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
            _iterator5.return();
          }
        } finally {
          if (_didIteratorError5) {
            throw _iteratorError5;
          }
        }
      }

      if (!hasSetMicrophone) {
        await setMicrophoneDevice({
          deviceId: microPhoneData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  } // 设置默认的扬声器


  if (devices && devices.speaker) {
    await setSpeakerDevice({
      speakId: devices.speaker,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var speakerData = await getSpeakerDevice();

    if (speakerData.length) {
      var hasSetSpeaker = false;
      var _iteratorNormalCompletion6 = true;
      var _didIteratorError6 = false;
      var _iteratorError6 = undefined;

      try {
        for (var _iterator6 = speakerData[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
          var _item2 = _step6.value;

          if (_item2.isDefault) {
            await setSpeakerDevice({
              speakId: _item2.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetSpeaker = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError6 = true;
        _iteratorError6 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion6 && _iterator6.return != null) {
            _iterator6.return();
          }
        } finally {
          if (_didIteratorError6) {
            throw _iteratorError6;
          }
        }
      }

      if (!hasSetSpeaker) {
        await setSpeakerDevice({
          speakId: speakerData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  }
};
/**
 * @function 设置是否只推音频流
 * @param audioOnly:Boolean 必选
 * @return Promise | void
 */

var controlPushAudioOnly = function controlPushAudioOnly(audioOnly) {
  return callMethod$3('ControlPushAudioOnly', {
    audioOnly: audioOnly
  });
};
/**
 * @function 设置用户角色,新小班独有逻辑
 * @param {number} userRole 必选 用户角色 1=老师
 * @return Promise | void
 */

var setUserRole = function setUserRole(userRole) {
  return callMethod$3('SetUserRole', {
    userRole: userRole
  });
};
/**
 * @function 开启或者关闭摄像头
 * @param operation:Boolean 操作类型,false -> 关闭,true -> 打开,必选
 * @return Promise | void
 */

var openOrCloseCamera = async function openOrCloseCamera(operation) {
  // await controlPushAudioOnly(!operation);
  // await muteStreamVideo(!operation);
  isNoticeCarVolumeRtc = operation;
  await muteLocalVideo(!operation);

  if (operation) {
    if (window.zbyAVSDK_init_params && window.zbyAVSDK_init_params.rtc) {
      var rtc = window.zbyAVSDK_init_params.rtc;
      await setRtcCaptureParams(rtc, 'deviceCheckerInit');
    } // 打开原本正在使用的摄像头


    if (rtcNowUseCamera) {
      await setCameraDevice({
        deviceId: rtcNowUseCamera
      });
    } else {
      await setCameraDevice({});
    } // await startPreview();

  } // else {
  //   await setCameraDevice({deviceId: '', close: true});
  //   // await stopPreview();
  // }

};
/**
 * @function 开启或者关闭摄像头以及麦克风
 * @param operation:Boolean 操作类型,false -> 关闭,true -> 打开,必选
 * @return Promise | void
 */

var openOrCloseCameraAndMicrophone = async function openOrCloseCameraAndMicrophone(operation) {
  if (operation) {
    await startPreview();
  } else {
    await stopPreview();
  }
};
/**
 * @function 控制本地视频预览的声音,即播放自己麦克风录到的声音
 * @param mute:Boolean 操作类型,false -> 不 mute,true -> mute,必选
 * @return Promise | void
 */

var setPreviewMute = function setPreviewMute(mute) {
  return callMethod$3('SetPreviewMute', {
    mute: mute
  });
};
/**
 * @function 设置麦克风静音
 * @param mute:Boolean false -> 不静音,true -> 静音,必选
 * @return Promise | void
 */

var setRealTimeAudioMute = async function setRealTimeAudioMute(mute) {
  isNoticeMicVolumeRtc = !mute; // await muteStreamAudio(mute);

  await muteLocalAudio(mute); // return callMethod('SetRealTimeAudioMute', {
  //   mute
  // });
};
/**
 * @function 初始化拉流
 * @param streamId:String 被拉取的流的 id,必选
 * @param domId:String <video> 标签的 id,可选
 * 如果传了就把视频绑定到对应的 <video> 标签上
 * @return src:String 视频预览地址
 */

var initPullFlow = async function initPullFlow(streamId, domId, mute, renderId, notAutoPlay, audioOnly, needScale, scaleParams) {
  defaultApi$1.writeLog("RTC:: initPullFlow_start ,streamId :".concat(streamId));
  var rtcPlayerId;

  var _renderId = renderId || streamId;

  resetStreamIdRtcPlayerInfo1(streamId);
  resetStreamIdRtcPlayerInfo(streamId);

  try {
    if (!isFirstHeartBeatReport) {
      isFirstHeartBeatReport = true;
      heartBeatDataReport('start');
    }
  } catch (error) {}

  if (streamIdToRtcPlayerId[streamId] && !renderId) {
    defaultApi$1.writeLog('RTC::  The streamId queue contains this streamId');
    rtcPlayerId = streamIdToRtcPlayerId[streamId];
    await stop(streamId);
    resetStreamIdRtcPlayerInfo(streamId);
    console.log('streamIdIsExitedRtc', rtcPlayerId, streamIdToRtcPlayerId[streamId]);
  } else {
    defaultApi$1.writeLog('RTC::  The streamId queue does not contain this streamId');

    if (stopedRtcPlayers.length > 0) {
      rtcPlayerId = stopedRtcPlayers.pop();
      console.log('streamIdIsNoExitedRtc', rtcPlayerId, streamIdToRtcPlayerId[streamId]);
    } else {
      rtcPlayerId = JSON.parse((await createRtcPlayer({
        x: 500,
        y: 500,
        width: 500,
        height: 500
      }, _renderId)).msg).id;
    }

    streamIdToRtcPlayerId[streamId] = rtcPlayerId;
  }

  if (rtcPlayerIds.indexOf(rtcPlayerId) < 0) {
    rtcPlayerIds.push(rtcPlayerId);
    localStorage.setItem('zby_sdk_rtcPlayerIds', rtcPlayerIds.join(','));
  } // 判断是否创建或者获取窗口ID成功,不成功就删掉重试


  if (!rtcPlayerId) {
    delete streamIdToRtcPlayerId[streamId]; // delete streamIdToBlobUrl[streamId];

    return initPullFlow(streamId, domId, mute, renderId);
  }

  if (needScale) {
    setRtcXBScale(rtcPlayerId, scaleParams);
  }

  rtcPlayerIdToStreamId[rtcPlayerId] = streamId; // 静音拉流

  await pullAudioFlow(rtcPlayerId, !!mute); // 只拉音频

  await controlPullAudioOnly(streamId, !!audioOnly);
  await setPlayRenderID(rtcPlayerId, _renderId);
  await setPlayerStreamId(rtcPlayerId, streamId);

  if (!notAutoPlay) {
    await play(streamId);
  }

  var videoSrc = await startLocalOrRemotePreview(false, _renderId, domId, rtcPlayerId);
  return {
    videoSrc: videoSrc,
    playerId: rtcPlayerId
  };
};
/**
 * @function 切换播放流
 * @param streamId:String 需要被替换的流的 id,必选
 * @param toStreamId:String 被拉取的流的 id,必选
 * @param toDomId:String <video> 标签的 id,可选
 * 如果传了就把视频绑定到对应的 <video> 标签上
 * @return src:String 视频预览地址
 */

var changePullFlow = async function changePullFlow(streamId, toStreamId, toDomId) {
  await stop(streamId, true);
  return initPullFlow(toStreamId, toDomId);
};
/**
 * @function 是否需要缩放
 * @param { nunber } id 窗口id,必选
 * @param { object } scaleParams
 * @param { number } scaleParams.is_need_xb_scale 是否开启缩放
 * @param { number } scaleParams.height 高
 * @param { number } scaleParams.width 宽
 * @return Promise | void
 */

var setRtcXBScale = async function setRtcXBScale(id, scaleParams) {
  defaultApi$1.writeLog("RTC::SetRtcXBScale id: ".concat(id, " scaleParams: ").concat(JSON.stringify(scaleParams)));
  await callMethod$3('SetRtcXBScale', _objectSpread({}, scaleParams, {
    id: id
  }));
};
/**
 * @function 恢复拉指定的流
 * @param streamId:String 被拉取的流的 id,必选
 * @return Promise | void
 */


var play = async function play(streamId) {
  var id = streamIdToRtcPlayerId[streamId];
  defaultApi$1.writeLog("RTC::Play streamId: ".concat(streamId, " id: ").concat(id));
  await callMethod$3('Play', {
    streamId: streamId,
    id: id
  });
};
/**
 * @function 停止拉指定的流
 * @param streamId:String 被拉取的流的 id,必选
 * @param recovery:Boolean 是否回收播放器, 可选
 * @return Promise | void
 */

var stop = async function stop(streamId, recovery) {
  currStreamIdRtcPlayerInfo && (currStreamIdRtcPlayerInfo.video_ifg = 0);
  currStreamIdRtcPlayerInfo && (currStreamIdRtcPlayerInfo.audio_ifg = 0);
  var id = streamIdToRtcPlayerId[streamId];
  delete streamIdRtcPlayerInfo[streamId];

  if (recovery && id && !stopedRtcPlayers.includes(id)) {
    stopedRtcPlayers.push(id);
    delete streamIdToRtcPlayerId[streamId]; // delete streamIdToBlobUrl[streamId];
  }

  return callMethod$3('Stop', {
    id: id
  });
};
/**
 * @function 停止并回收所有拉流
 * @return Promise | void
 */

var stopAllPullFlow = function stopAllPullFlow() {
  var toRecoveryArr = [];

  for (var streamId in streamIdToRtcPlayerId) {
    if (streamIdToRtcPlayerId.hasOwnProperty(streamId)) {
      var _id = streamIdToRtcPlayerId[streamId];

      if (_id && !stopedRtcPlayers.includes(_id)) {
        stopedRtcPlayers.push(_id);
        toRecoveryArr.push(callMethod$3('Stop', {
          id: _id
        }));
      }
    }
  }

  streamIdToRtcPlayerId = {};
  return Promise.all(toRecoveryArr);
};
/**
 * @function 停止拉指定的流并销毁播放器
 * @param streamId:String 被拉取的流的 id,必选
 * @return Promise
 */

var stopPullFlow = async function stopPullFlow(streamId) {
  await stop(streamId);
  await playDestroy(streamId);
};
/**
 * @function 发送转推命令
 * @param args: Object
 * {
 * @param cmd:String 必选,'start' | 'stop' | 'pause' | 'resume'
 * @param liveId:String 房间 id,可选,可从 window 的初始化参数中获取
 * @param rtmpAddr:String 字符串(转推地址使用分号隔开),可选,sdk 可以内部拼接
 * @param bSaveMp4:Boolean 是否保存为 mp4 文件,可选,默认为 false
 * @param bPushRtmp:Boolean 是否推 rtmp 流,可选,默认为 true
 * @param bPushAllRtmp:Boolean 是否全部推 rtmp 流,可选,默认为 false
 * @param confId:String 分组id,可选,默认为 sdk初始化分组id
 * }
 * @return Promise | void
 */

var sendRecordingMsg = function sendRecordingMsg(args) {
  var cmd = args.cmd,
      liveId = args.liveId,
      rtmpAddr = args.rtmpAddr,
      bSaveMp4 = args.bSaveMp4,
      bPushRtmp = args.bPushRtmp,
      bPushAllRtmp = args.bPushAllRtmp,
      confId = args.confId;
  var rtc = window.zbyAVSDK_init_params.rtc;

  if (typeof liveId === 'undefined') {
    liveId = rtc.streamId;
  }

  if (typeof rtmpAddr === 'undefined') {
    // 转推的流 id,从全局的初始化参数中获取
    var sid = rtc.sid; // 拼接转推地址

    rtmpAddr = rtc.recordUrl + '/' + sid;
  }

  if (typeof bSaveMp4 === 'undefined') {
    bSaveMp4 = false;
  }

  if (typeof bPushRtmp === 'undefined') {
    bPushRtmp = true;
  }

  if (typeof bPushAllRtmp === 'undefined') {
    bPushAllRtmp = true;
  }

  var params = {
    cmd: cmd,
    liveId: liveId,
    rtmpAddr: rtmpAddr,
    bSaveMp4: bSaveMp4,
    bPushRtmp: bPushRtmp,
    bPushAllRtmp: bPushAllRtmp,
    confId: confId
  };
  defaultApi$1.writeLog("SendRecordingMsg ".concat(JSON.stringify(params)));
  return callMethod$3('SendRecordingMsg', params);
};
/**
 * @function 退出房间
 * @return Promise
 */

var leaveRoom = async function leaveRoom() {
  await stopPush();
  await captureDestroy();

  for (var i = 0, len = rtcPlayerIds.length; i < len; i++) {
    await callMethod$3('PlayDestroy', {
      id: rtcPlayerIds[i]
    });
  }

  removerListener();
  heartBeatDataReport('stop');
  isFirstHeartBeatReport = false;
  rtcPlayerIds = [];
  streamIdToRtcPlayerId = {};
  rtcPlayerIdToStreamId = {};
  streamIdRtcPlayerInfo = {};
  streamIdRtcPlayerInfo1 = {}; // heartBeatDataReportObj = {};

  stopedRtcPlayers = [];
  isInRoom = false;
};
var hasStream = function hasStream(streamId) {
  return Object.keys(streamIdToRtcPlayerId).includes(streamId);
};

function _getConfId(streamId) {
  // 如果没有传streamId,取公共confId
  if (!streamId) {
    return _confId;
  }

  var institutionId = util.getDataFromStreamUrl('orgId', streamId);
  var roomId = util.getDataFromStreamUrl('roomId', streamId); // 传入streamId,通过roomId_机构id拼接得到confId,用于跨组拉流

  return util.getConfId(institutionId, roomId);
}
/**
 * @function 开始本地视频录制
 * @param enableRecord 开始/结束
 * @param pathFile 录制路径
 * @return Promise | void
 */


var localRecordVideo = async function localRecordVideo(enableRecord, pathFile) {
  defaultApi$1.writeLog("avsdk RTC::localRecordVideo enableRecord: ".concat(enableRecord, ", storagePath: ").concat(pathFile));

  if (enableRecord) {
    await callMethod$3('SetRecordType', {
      type: 'type.mp4',
      bAudioOnly: false
    });
    await callMethod$3('SetRecordPathFile', {
      pathFile: pathFile
    });
    return callMethod$3('StartRecord', {});
  } else {
    return callMethod$3('StopRecord', {});
  }
};
/**
 * @function 本地音频录制
 * @param enableRecord 开始/结束
 * @param storagePath 录制路径
 * @return Promise | void
 */

var localRecordAudio = async function localRecordAudio(enableRecord, storagePath) {
  defaultApi$1.writeLog("avsdk RTC::localRecordAudio enableRecord: ".concat(enableRecord, ", storagePath: ").concat(storagePath));
  return callMethod$3('EnableSelectedAudioRecord', {
    enable: true,
    sampleRate: 16000,
    channels: 1,
    mode: 0,
    samplesPerCall: 320,
    enableRecord: enableRecord,
    storagePath: storagePath
  });
}; //推不推视频(是否推画面)

var muteStreamVideo = function muteStreamVideo() {
  var mute = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  return callMethod$3('MuteStreamVideo', {
    mute: mute
  });
}; //推不推视频(是否采集,这个方法直接不采集画面)

var muteLocalVideo = function muteLocalVideo() {
  var mute = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  return callMethod$3('MuteLocalVideo', {
    mute: mute
  });
}; //推不推声音 (是否推声音)

var muteStreamAudio = function muteStreamAudio() {
  var mute = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  // try {
  //   dataReport.deviceChange({
  //     device: 2,
  //     device_state: mute ? 0 :1
  //   });
  // } catch (e){};
  return callMethod$3('MuteStreamAudio', {
    mute: mute
  });
}; //推不推声音 (是否采集,这个方法直接不采集声音)

var muteLocalAudio = function muteLocalAudio() {
  var mute = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  return callMethod$3('MuteLocalAudio', {
    mute: mute
  });
};
/**
 * @function 开始连麦
 * @param mode:number 采集器默认, 默认0=站立 1=坐立
 * @return Promise | void
 */

var teacherStartLinkMic = async function teacherStartLinkMic() {
  var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;

  if (mode === 0) {
    await muteStreamVideo(true);
    await setMicrophoneDevice({}); // await muteStreamAudio(false);

    await muteLocalAudio(false);
  } else {
    // await muteLocalVideo(false);
    await muteLocalAudio(false);
  }
};
/**
 * @function 结束连麦
 * @param mode:number 采集器默认, 默认0=站立 1=坐立
 * @return Promise | void
 */

var teacherStopLinkMic = async function teacherStopLinkMic() {
  var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;

  if (mode === 0) {
    await muteStreamVideo(false);
    await setMicrophoneDevice({
      deviceId: ''
    });
  } // else {
  //   await muteLocalVideo(true);
  // }

};
/**
* @function 设置采集扬声器声音(rtc)
* @param { string }  deviceId 设备id
* @param {boolean} speaker 采集扬声器声音=true/不采集=false
* @return: Promise
*/

var setAudioSpeakerCapture = async function setAudioSpeakerCapture(deviceId, speaker) {
  return callMethod$3('SetAudioSpeakerCapture', {
    deviceID: deviceId,
    bMixSpeaker: speaker
  });
};
/**
  * @function 设置混流和背景色
  * @param { number }  type  0=不拼接/1=截屏窗+背景图/2=截屏窗+背景图+头像
  * @param { number } id 需要混合的采集器id
  * @param { object } rgb
  * @param { number } rgb.r
  * @param { number } rgb.g
  * @param { number } rgb.b
  * @return: Promise
  */

var setMixStream = async function setMixStream(type, id, rgb) {
  await callMethod$3('SetIsNeedCombineCap', {
    isNeedCombine: type,
    id: id
  });

  if (rgb) {
    await callMethod$3('SetCombinePadRGB', rgb);
  }

  if (!type) {
    try {
      dataReport$2.splitState({
        camera_split_start_resolution: captureAfter,
        camera_split_start_encode_resolution: captureEncodeAfter,
        //摄像头拼接前编码分辨率
        camera_split_end_resolution: captureBefore,
        camera_split_end_encode_resolution: captureEncodeBefore,
        //摄像头拼接后编码分辨率
        screen_split_start_encode_resolution: screenEncodeAfter,
        //截屏窗拼接前编码分辨率
        screen_split_start_resolution: screenEncodeAfter,
        //截屏窗拼接前采集分辨率
        screen_split_end_encode_resolution: screenEncodeBefore,
        //截屏窗拼接后编码分辨率
        screen_split_end_resolution: screenEncodeBefore,
        //截屏窗拼接后采集分辨率
        split: '结束拼接' //拼接状态  不拼接

      });
    } catch (e) {}

    ;
  }
};
/**
  * @function 采集器截图
  * @param { string } fileName 文件名,需要后缀名。例如:333.jpg
  * @return: Promise
  */

var captureSnapShot = function captureSnapShot(file_name) {
  return callMethod$3('SnapShot', {
    quality: 70,
    file_name: file_name
  });
};
/**
  * @function 播放器截图
  * @param { string } fileName 文件名,需要后缀名。例如:333.jpg
  * @return: Promise
  */

var playerSnapShot = function playerSnapShot(id, file_name) {
  return callMethod$3('PlayerSnapShot', {
    id: id,
    quality: 70,
    file_name: file_name
  });
};
/**
  * @function 设置镜像状态(预览)
  * @param { boolean } isMirror true=开启 false=关闭
  * @return: Promise
  */

var setMirrorStatus = function setMirrorStatus(isMirror) {
  return callMethod$3('SetRTCPreViewMirror', {
    isMirror: isMirror
  });
};
/**
  * @function 设置推流镜像状态
  * @param { boolean } id 采集器Id
  * @param { boolean } mode 1=开启 0=关闭
  * @return: Promise
  */

var setMirrorMode = function setMirrorMode(mode) {
  var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  var realId = mode == 0 ? 0 : 2;
  defaultApi$1.writeLog("RTC: setMirrorMode, mode: ".concat(mode, ", id:").concat(id, ", realId:").concat(realId));
  return callMethod$3('SetMirrorMode', {
    id: id,
    mode: realId
  });
};
/**
  * @function 设置拉流镜像状态
  * @param { boolean } isMirror true=开启 false=关闭
  * @return: Promise
  */

var setRTCPlayViewMirror = function setRTCPlayViewMirror(isMirror, id) {
  return callMethod$3('SetRTCPlayViewMirror', {
    isMirror: isMirror,
    id: id
  });
}; //美颜相关

/**
  * @function 开启美颜
  * @return: Promise
*/

var startSenseMe = async function startSenseMe() {
  return callMethod$3('StartSenseMe', {});
};
/**
  * @function 设置美颜参数
  * * @param { number } type  //美颜类型,1、红润强度,3、磨皮强度,4、美白强度,5、大眼,6、瘦脸,7、小脸,8、对比度强度,9、饱和度强度
  * * @param { number } value //美颜数值,有效值范围0~100
  * @return: Promise
*/

var setBeautifyParam = async function setBeautifyParam(type, value) {
  return callMethod$3('SetBeautifyParam', {
    type: type,
    value: value
  });
};
/**
  * @function 关闭美颜
  * @return: Promise
*/

var endSenseMe = async function endSenseMe() {
  return callMethod$3('EndSenseMe', {});
};
/**
  * @function 发送SEI
  * @return: Promise
*/

var sendMediaSideInfo = async function sendMediaSideInfo(text) {
  return callMethod$3('SendMediaSideInfo', {
    id: id,
    text: text
  });
}; // 获取TalMedia.dll版本号

var getSDKVersion = async function getSDKVersion() {
  return callMethod$3('GetSDKVersion', {});
};
var heartBeatRealKeys = ['video_fps', 'video_bitrate', 'audio_fps', 'audio_bitrate'];

var _heartBeatDataReport = function _heartBeatDataReport() {
  // let cpuRate = 0;
  // let memRate = 0;
  var rateCount = 0; // let appCpuRate = 0;
  // let appMemUsed = 0;

  var rateTimer = setInterval(async function () {
    rateCount++; // let {cpu_rate, mem_rate, gpus, app_cpu_rate, app_mem_used} = (await toolApi.getCurCpuMemInfo()).msg;
    // cpu_rate = cpu_rate < 0 ? 0 : cpu_rate;
    // cpuRate += parseFloat(cpu_rate);
    // memRate += parseFloat(mem_rate);
    // if (window.zbyAVSDK_init_params.rtc.role === 'student') {
    //   appCpuRate += parseFloat(app_cpu_rate);
    //   appMemUsed += parseFloat(app_mem_used);
    // }

    if (rateCount >= 3) {
      // heartBeatRealKeys.forEach(realKey => {
      //   if (heartBeatDataReportObj.hasOwnProperty(realKey) && heartBeatDataReportObj.count > 0) {
      //     heartBeatDataReportObj[realKey] = util.toFixed(heartBeatDataReportObj[realKey]/heartBeatDataReportObj.count);
      //   }
      // });
      // heartBeatDataReportObj.volume = heartBeatDataReportObj.volume.join(',');
      var pullInfo = [];
      Object.keys(streamIdRtcPlayerInfo).forEach(function (streamid) {
        heartBeatRealKeys.forEach(function (realKey) {
          if (!streamIdRtcPlayerInfo[streamid].hasOwnProperty(realKey)) {
            streamIdRtcPlayerInfo[streamid][realKey] = [];
          } // if (streamIdRtcPlayerInfo[streamid].count > 0) {
          //   streamIdRtcPlayerInfo[streamid][realKey] = util.toFixed(streamIdRtcPlayerInfo[streamid][realKey]/streamIdRtcPlayerInfo[streamid].count);
          // }

        }); //获取拉流类型,后期可写为函数提出去

        if (streamIdRtcPlayerInfo1[streamid].audio_type && streamIdRtcPlayerInfo1[streamid].video_type) {
          streamIdRtcPlayerInfo1[streamid].stream_type = 'both';
        } else if (!streamIdRtcPlayerInfo1[streamid].audio_type && streamIdRtcPlayerInfo1[streamid].video_type) {
          streamIdRtcPlayerInfo1[streamid].stream_type = 'video';
        } else if (streamIdRtcPlayerInfo1[streamid].audio_type && !streamIdRtcPlayerInfo1[streamid].video_type) {
          streamIdRtcPlayerInfo1[streamid].stream_type = 'audio';
        } else {
          streamIdRtcPlayerInfo1[streamid].stream_type = 'none';
        } // console.log('hsghsghsg_type_type', streamIdRtcPlayerInfo1[streamid].stream_type);
        // streamIdRtcPlayerInfo[streamid].volume = streamIdRtcPlayerInfo[streamid].volume.join(',');
        // delete streamIdRtcPlayerInfo[streamid].count;


        pullInfo.push(_objectSpread({
          streamid: streamid
        }, streamIdRtcPlayerInfo[streamid], {
          pull_type: streamIdRtcPlayerInfo1[streamid].stream_type,
          volume: streamIdRtcPlayerInfo[streamid].volume.slice(0, streamIdRtcPlayerInfo[streamid].volume.length - 1)
        }));
        resetStreamIdRtcPlayerInfo(streamid);
      }); // delete heartBeatDataReportObj.count;

      if (isFirstHeartBeatReport && rateCount > 0) {
        try {
          //静音推流时过滤掉音频帧率和码率,上报为0;
          // if (!isNoticeMicVolumeRtc) {
          //   heartBeatDataReportObj['audio_fps'] = [];
          //   heartBeatDataReportObj['audio_bitrate'] = [];
          // };
          //获取推流类型,后期可写为函数提出去
          if (zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
            zbysdk$1.deviceStatus.stream_type = 'both';
          } else if (!zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
            zbysdk$1.deviceStatus.stream_type = 'audio';
          } else if (zbysdk$1.deviceStatus.camera && !zbysdk$1.deviceStatus.microphone) {
            zbysdk$1.deviceStatus.stream_type = 'video';
          } else {
            zbysdk$1.deviceStatus.stream_type = 'none';
          }

          ;
          defaultApi$1.writeLog("push_type_rtc zbysdk.deviceStatus.camera: ".concat(zbysdk$1.deviceStatus.camera, ",zbysdk.deviceStatus.microphone: ").concat(zbysdk$1.deviceStatus.microphone, ", type: ").concat(zbysdk$1.deviceStatus.stream_type));
          defaultApi$1.writeLog("push_type_rtc carema: ".concat(isNoticeCarVolumeRtc, ",mic: ").concat(isNoticeMicVolumeRtc, ", a_fps: ").concat(dataRtcCapture.audioInputframes, ", a_bit: ").concat(dataRtcCapture.audioencoderate, ", v_fps: ").concat(dataRtcCapture.videoInputframes, ", v_bit: ").concat(dataRtcCapture.videoencoderate)); // if (window.zbyAVSDK_init_params.rtc.role === 'teacher') {

          dataReport$2.heartbeat(_objectSpread({}, _objectSpread({}, heartBeatDataReportObj, {
            push_type: zbysdk$1.deviceStatus.stream_type,
            volume: heartBeatDataReportObj.volume.slice(0, heartBeatDataReportObj.volume.length - 1)
          }), {
            // pull_info: JSON.stringify(pullInfo),
            pull_info: pullInfo // cpu_rate: util.toFixed(cpuRate/rateCount),
            // mem_rate: util.toFixed(memRate/rateCount),

          })); // } else {
          // dataReport.heartbeat({
          //   ...heartBeatDataReportObj,
          //   pull_info: JSON.stringify(pullInfo),
          // cpu_rate: util.toFixed(cpuRate/rateCount),
          // mem_rate: util.toFixed(memRate/rateCount),
          // app_cpu: util.toFixed(appCpuRate/rateCount),
          // app_mem: util.toFixed(appMemUsed/rateCount),
          // video_mem: gpus
          // });
          // }
        } catch (e) {
          console.error('hsghsg_error', e);
        }
      }

      resetHeartBeatDataReportObj();
      rateCount = 0; // cpuRate = 0;
      // memRate = 0;
      // appCpuRate = 0;
      // appMemUsed = 0;

      clearInterval(rateTimer);
    }
  }, 10 * 1000);
};

var heartBeatDataReport = function heartBeatDataReport(type) {
  try {
    if (type === 'start' && !heartBeatDataReportTimer) {
      resetHeartBeatDataReportObj();

      _heartBeatDataReport();

      heartBeatDataReportTimer = setInterval(function () {
        _heartBeatDataReport();
      }, 30 * 1000);
    }

    if (type === 'stop') {
      clearInterval(heartBeatDataReportTimer);
      heartBeatDataReportTimer = null;
    }
  } catch (error) {
    console.error(error);
  }
};

var heartBeatDataReportCalc = function heartBeatDataReportCalc(name, _d) {
  // 拉流
  var pullKeys = ['videoRenderFrameRate', 'videoCodeRate', 'audioRenderFrameRate', 'audioCodeRate'];

  if (name === 'rtcPlayCycleDataReport') {
    // console.log('hsg_tdddd',_d);
    if (streamIdRtcPlayerInfo && streamIdRtcPlayerInfo.hasOwnProperty(_d.streamid)) {
      var isReport = true; // streamIdRtcPlayerInfo[_d.streamid].count++;

      heartBeatRealKeys.forEach(function (realKey, index) {
        if (_d.hasOwnProperty(pullKeys[index])) {
          if (streamIdRtcPlayerInfo[_d.streamid][realKey] === undefined) {
            streamIdRtcPlayerInfo[_d.streamid][realKey] = [];
            isReport = false;
          } // streamIdRtcPlayerInfo[_d.streamid][realKey].push(parseFloat(parseInt(_d[pullKeys[index]])));

        }
      });

      if (isReport) {
        var audio_fps_rtc_pull = 0;
        var audio_bitrate_rtc_pull = 0;
        var video_fps_rtc_pull = 0;
        var video_bitrate_rtc_pull = 0;

        if (streamIdRtcPlayerInfo1[_d.streamid].audio_type && streamIdRtcPlayerInfo1[_d.streamid].video_type) {
          audio_fps_rtc_pull = parseFloat(parseInt(_d.audioRenderFrameRate));
          audio_bitrate_rtc_pull = parseFloat(parseInt(_d.audioCodeRate));
          video_fps_rtc_pull = parseFloat(parseInt(_d.videoRenderFrameRate));
          video_bitrate_rtc_pull = parseFloat(parseInt(_d.videoCodeRate));
        } else if (!streamIdRtcPlayerInfo1[_d.streamid].audio_type && streamIdRtcPlayerInfo1[_d.streamid].video_type) {
          video_fps_rtc_pull = parseFloat(parseInt(_d.videoRenderFrameRate));
          video_bitrate_rtc_pull = parseFloat(parseInt(_d.videoCodeRate));
        } else if (streamIdRtcPlayerInfo1[_d.streamid].audio_type && !streamIdRtcPlayerInfo1[_d.streamid].video_type) {
          audio_fps_rtc_pull = parseFloat(parseInt(_d.audioRenderFrameRate));
          audio_bitrate_rtc_pull = parseFloat(parseInt(_d.audioCodeRate));
        }

        streamIdRtcPlayerInfo[_d.streamid].audio_fps.push(audio_fps_rtc_pull);

        streamIdRtcPlayerInfo[_d.streamid].audio_bitrate.push(audio_bitrate_rtc_pull);

        streamIdRtcPlayerInfo[_d.streamid].video_fps.push(video_fps_rtc_pull);

        streamIdRtcPlayerInfo[_d.streamid].video_bitrate.push(video_bitrate_rtc_pull);

        streamIdRtcPlayerInfo[_d.streamid].pull_loss.push(_d.lostrate);

        streamIdRtcPlayerInfo[_d.streamid].pull_delay.push(_d.delay);

        streamIdRtcPlayerInfo[_d.streamid].ctime.push(Math.round((new Date().getTime() + dataReport$2.timestamp) / 1000)); // console.log('hsg_tpull_keys',JSON.parse(JSON.stringify(streamIdRtcPlayerInfo[_d.streamid])));

      } // streamIdRtcPlayerInfo[_d.streamid].ctime.push(Math.round((new Date().getTime()+util.diffTime)/1000).toString());
      // console.log('hsg_tpull_keys',JSON.parse(JSON.stringify(streamIdRtcPlayerInfo[_d.streamid])));

    }
  } // 推流


  var pushKeys = ['videoInputframes', 'videoencoderate', 'audioInputframes', 'audioencoderate'];

  if (name === 'rtcCaptureCycleDataReport') {
    var audio_fps_rtc_push = 0;
    var audio_bitrate_rtc_push = 0;
    var video_fps_rtc_push = 0;
    var video_bitrate_rtc_push = 0;
    dataRtcCapture = _d; // console.log('hsg_d5555',_d,isNoticeMicVolumeRtc,isNoticeCarVolumeRtc);
    // heartBeatDataReportObj.count++;
    // heartBeatRealKeys.forEach((realKey, index) => {
    // if (!heartBeatDataReportObj.hasOwnProperty(realKey) && !_d.hasOwnProperty(pushKeys[index])) {
    // heartBeatDataReportObj[realKey] += parseFloat(_d[pushKeys[index]]);

    if (isNoticeMicVolumeRtc && isNoticeCarVolumeRtc) {
      audio_fps_rtc_push = parseFloat(parseInt(_d.audioInputframes));
      audio_bitrate_rtc_push = parseFloat(parseInt(_d.audioencoderate));
      video_fps_rtc_push = parseFloat(parseInt(_d.videoInputframes));
      video_bitrate_rtc_push = parseFloat(parseInt(_d.videoencoderate)); // heartBeatDataReportObj[realKey].push(parseFloat(parseInt(_d[pushKeys[index]])));
    } else if (!isNoticeMicVolumeRtc && isNoticeCarVolumeRtc) {
      video_fps_rtc_push = parseFloat(parseInt(_d.videoInputframes));
      video_bitrate_rtc_push = parseFloat(parseInt(_d.videoencoderate)); // heartBeatDataReportObj.audio_fps.push(0);
      // heartBeatDataReportObj.audio_bitrate.push(0);
      // heartBeatDataReportObj.video_fps.push(parseFloat(parseInt(_d.videoInputframes)));
      // heartBeatDataReportObj.video_bitrate.push(parseFloat(parseInt(_d.videoencoderate)));
    } else if (!isNoticeCarVolumeRtc && isNoticeMicVolumeRtc) {
      audio_fps_rtc_push = parseFloat(parseInt(_d.audioInputframes));
      audio_bitrate_rtc_push = parseFloat(parseInt(_d.audioencoderate)); // heartBeatDataReportObj.audio_fps.push(parseFloat(parseInt(_d.videoInputframes)));
      // heartBeatDataReportObj.audio_bitrate.push(parseFloat(parseInt(_d.videoInputframes)));
      // heartBeatDataReportObj.video_fps.push(0);
      // heartBeatDataReportObj.video_bitrate.push(0);
    }

    heartBeatDataReportObj.audio_fps.push(audio_fps_rtc_push);
    heartBeatDataReportObj.audio_bitrate.push(audio_bitrate_rtc_push);
    heartBeatDataReportObj.video_fps.push(video_fps_rtc_push);
    heartBeatDataReportObj.video_bitrate.push(video_bitrate_rtc_push);
    heartBeatDataReportObj.push_loss.push(_d.lostrate);
    heartBeatDataReportObj.push_delay.push(_d.delay); // }
    // });
    //

    heartBeatDataReportObj.ctime.push(Math.round((new Date().getTime() + dataReport$2.timestamp) / 1000)); // console.log('hsg_d6',JSON.parse(JSON.stringify(heartBeatDataReportObj)));
    // console.log('hsg_push_keys',JSON.parse(JSON.stringify(heartBeatDataReportObj)));
  }
}; //推流字段


var resetHeartBeatDataReportObj = function resetHeartBeatDataReportObj() {
  // console.log('hsg_d55556重置');
  heartBeatDataReportObj = {
    ctime: [],
    // push_type: zbysdk ? zbysdk.deviceStatus.stream_type : 'none',
    push_type: 'none',
    // video_fps: 0,
    // video_bitrate: 0,
    // audio_fps: 0,
    // audio_bitrate: 0,
    video_fps: [],
    video_bitrate: [],
    audio_fps: [],
    audio_bitrate: [],
    push_loss: [],
    push_delay: [],
    // count: 0,
    volume: ''
  };
}; //记录拉流类型,用作数据上报


var resetStreamIdRtcPlayerInfo1 = function resetStreamIdRtcPlayerInfo1(streamId) {
  streamIdRtcPlayerInfo1[streamId] = {
    audio_type: false,
    video_type: false,
    stream_type: 'none'
  }; // console.log('hsgshgs_heartbeat',streamIdRtcPlayerInfo1);
};

resetHeartBeatDataReportObj(); //拉流字段

var resetStreamIdRtcPlayerInfo = function resetStreamIdRtcPlayerInfo(streamId) {
  streamIdRtcPlayerInfo[streamId] = {
    pull_uid: util.getUidByStreamId(streamId),
    streamid: streamId,
    ctime: [],
    pull_type: streamIdRtcPlayerInfo1[streamId].stream_type,
    volume: '',
    // 平均值
    // count: 0,
    // video_fps: 0,
    // video_bitrate: 0,
    // audio_fps: 0,
    // audio_bitrate: 0,
    video_fps: [],
    video_bitrate: [],
    audio_fps: [],
    audio_bitrate: [],
    pull_loss: [],
    pull_delay: [],
    // 累加
    audio_ifg: 0,
    video_ifg: 0
  };
};

var rtcsdk = {
  loadRtc: loadRtc,
  unloadRtc: unloadRtc,
  setAppId: setAppId,
  setUserName: setUserName,
  setUserId: setUserId,
  setConfId: setConfId,
  createRtcCapture: createRtcCapture,
  getCameraDeviceCount: getCameraDeviceCount,
  getCameraDevice: getCameraDevice,
  setCameraDevice: setCameraDevice,
  getCameraSupportedRes: getCameraSupportedRes,
  setCameraParam: setCameraParam,
  setEventReportSvr: setEventReportSvr,
  getSpeakerDeviceCount: getSpeakerDeviceCount,
  getSpeakerDevice: getSpeakerDevice,
  setSpeakerDevice: setSpeakerDevice,
  setSpeakerVolume: setSpeakerVolume,
  setSpeakerMute: setSpeakerMute,
  getSpeakerVolume: getSpeakerVolume,
  setMute: setMute,
  pullAudioFlow: pullAudioFlow,
  getMicrophoneDeviceCount: getMicrophoneDeviceCount,
  getMicrophoneDevice: getMicrophoneDevice,
  setMicrophoneDevice: setMicrophoneDevice,
  getMicrophoneVolume: getMicrophoneVolume,
  setMicrophoneVolume: setMicrophoneVolume,
  setRealTimeAudioMute: setRealTimeAudioMute,
  getCurrentAppSessionVolume: getCurrentAppSessionVolume,
  setCurrentAppSessionVolume: setCurrentAppSessionVolume,
  setApplicationMute: setApplicationMute,
  setPreviewPos: setPreviewPos,
  startPreview: startPreview,
  setEncodeParam: setEncodeParam,
  setBitRate: setBitRate,
  setCaptureStreamId: setCaptureStreamId,
  setCaptureRenderID: setCaptureRenderID,
  startPush: startPush,
  stopPush: stopPush,
  stopPreview: stopPreview,
  captureDestroy: captureDestroy,
  createRtcPlayer: createRtcPlayer,
  setPlayerStreamId: setPlayerStreamId,
  setPlayRenderID: setPlayRenderID,
  play: play,
  stop: stop,
  playDestroy: playDestroy,
  startLocalOrRemotePreview: startLocalOrRemotePreview,
  init: init,
  setDefaultDevice: setDefaultDevice,
  openOrCloseCamera: openOrCloseCamera,
  setPreviewMute: setPreviewMute,
  openOrCloseCameraAndMicrophone: openOrCloseCameraAndMicrophone,
  initPullFlow: initPullFlow,
  stopPullFlow: stopPullFlow,
  stopAllPullFlow: stopAllPullFlow,
  changePullFlow: changePullFlow,
  leaveRoom: leaveRoom,
  sendRecordingMsg: sendRecordingMsg,
  controlPullAudioOnly: controlPullAudioOnly,
  openMicVolumeCb: openMicVolumeCb,
  startRoomMixRecord: startRoomMixRecord,
  stopRoomMixRecord: stopRoomMixRecord,
  startSingleRecord: startSingleRecord,
  stopSingleRecord: stopSingleRecord,
  hasStream: hasStream,
  localRecordAudio: localRecordAudio,
  localRecordVideo: localRecordVideo,
  teacherStartLinkMic: teacherStartLinkMic,
  teacherStopLinkMic: teacherStopLinkMic,
  setAudioSpeakerCapture: setAudioSpeakerCapture,
  setMixStream: setMixStream,
  recoverSdk: recoverSdk,
  captureSnapShot: captureSnapShot,
  playerSnapShot: playerSnapShot,
  setMirrorStatus: setMirrorStatus,
  stopCheckDevice: stopCheckDevice,
  startSenseMe: startSenseMe,
  setBeautifyParam: setBeautifyParam,
  endSenseMe: endSenseMe,
  setRTCPlayViewMirror: setRTCPlayViewMirror,
  muteStreamVideo: muteStreamVideo,
  muteLocalVideo: muteLocalVideo,
  muteStreamAudio: muteStreamAudio,
  muteLocalAudio: muteLocalAudio,
  getSDKVersion: getSDKVersion,
  setMirrorMode: setMirrorMode,
  destroyEngine: destroyEngine,
  rtcLoadCollectionEntry2: rtcLoadCollectionEntry2,
  sendMediaSideInfo: sendMediaSideInfo
};

/**
 * @File: SessionStorage 的操作方法
 * @Author: xuyuanrui
 * @Email: raywhbxyr@163.com
 * @Date: 2018-08-31 18:40:44
 **/
var getS = function getS(name) {
  return sessionStorage.getItem(name);
};
var setS = function setS(name, value) {
  sessionStorage.setItem(name, value);
};
var compareS = function compareS(name, nowValue) {
  if (sessionStorage.getItem(name) === nowValue) {
    return true;
  } else {
    sessionStorage.setItem(name, nowValue);
    return false;
  }
};
var sessionStorage$1 = {
  getS: getS,
  setS: setS,
  compareS: compareS
};

var DataStore =
/*#__PURE__*/
function (_Map) {
  _inherits(DataStore, _Map);

  /**
   * 
   * @param {number} dataValidityPeriod 数据有效期,毫秒,默认1000ms
   */
  function DataStore() {
    var _this;

    var dataValidityPeriod = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1000;

    _classCallCheck(this, DataStore);

    _this = _possibleConstructorReturn(this, _getPrototypeOf(DataStore).call(this));
    _this.dataValidityPeriod = dataValidityPeriod;
    defaultApi$1.writeLog("DataStore dataValidityPeriod: ".concat(dataValidityPeriod));
    return _this;
  }

  _createClass(DataStore, [{
    key: "setData",
    value: function setData(key, data) {
      var obj = this.get(key);

      if (!obj) {
        obj = {};
        this.set(key, obj);
      }

      obj.timestamp = Date.now();
      obj.data = data;
    }
  }, {
    key: "getData",
    value: function getData(key) {
      var obj = this.get(key);

      if (!obj) {
        return null;
      } // obj设置时的时间戳与当前时间戳的差值


      var timeCost = Date.now() - obj.timestamp; // 没有data或者data已经超过有效期,返回空

      if (timeCost > this.dataValidityPeriod) {
        defaultApi$1.writeLog("DataStore getData key: ".concat(key, ", cost: ").concat(timeCost, ", dataValidityPeriod: ").concat(this.dataValidityPeriod, ", data: ").concat(obj.data));
        this.delete(key);
        return null;
      } else {
        return obj.data;
      }
    }
    /**
     * 检查数据是否过期
     * @param {*} data 
     * @returns 
     */

  }, {
    key: "checkData",
    value: function checkData(data) {
      if (!data || !data.timestamp) {
        throw new Error('DataStore checkData data is null or data.timestamp is null');
      }

      var timeCost = Date.now() - data.timestamp;

      if (timeCost > this.dataValidityPeriod) {
        return false;
      } else {
        return true;
      }
    }
  }, {
    key: "restore",
    value: function restore() {
      this.clear();
    }
    /**
     * 更新数据有效期
     * @param {number} value 
     */

  }, {
    key: "updateValidityPeriod",
    value: function updateValidityPeriod(value) {
      defaultApi$1.writeLog("DataStore updateValidityPeriod value: ".concat(value));

      if (typeof value !== 'number') {
        return;
      }

      this.dataValidityPeriod = value;
    }
  }]);

  return DataStore;
}(_wrapNativeSuper(Map));
var userAndDeviceStatusInfo = {
  microPhone: undefined,
  camera: undefined,
  isPushingFlow: undefined
}; // https://yach-doc-shimo.zhiyinlou.com/docs/loqeW4ME41ie1Anz/ 《学习报告在线时长优化》

var background = 0; // 0:否(默认值),1:转到后台

/**
 * 设置前后台状态
 * @param {boolean} isBackground 
 */

var setBackgroundStatus = function setBackgroundStatus(isBackground) {
  background = isBackground ? 1 : 0;
};
/**
 * 获取前后台状态
 * @returns {number} 0:否(默认值),1:转到后台
 */

var getBackgroundStatus = function getBackgroundStatus() {
  return background;
};

var extensionId$2 = 'zego_ext'; // 端提供的 API 入口

var EM$6 = window.EM; // 维护的一份当前正在使用的音频设备的 deviceId 的列表

var usingAudioDeviceId = {
  speaker: '',
  microphone: ''
}; // 维护的一份拉流的 streamId 与本地预览通道的映射表

var streamIdToPreviewId$1 = {};
var previewIdToStreamId = {}; // const streamIdToBlobUrl = {};
// 拉流的播放通道初始化从 0 开始依次递增至44(共45路流),-1 为推流的本地视频预览
// const uiChnIndexs = new Array(50).fill(0).map((a, b) => b + 1).reverse();

var chnTotal = 48;
var uiChnIndexs = new Array(chnTotal).fill(2).map(function (a, b) {
  return a + b;
}).reverse(); // 初始化是否完成的标志,0 为未完成,1 为完成

var isInitFinished = 0; // 设备检测初始化是否完成的标志,0 为未完成,1 为完成

var isDeviceCheckInitFinished = 0; // 进入房间是否成功

var hasLoginChannel = 0; // 是否已经推流

var hasPushFlow = 0; // 是否logoutChannel成功

var isAVEngineStopped = 0; // 上层透传的回调函数缓存
// let zegoCallback = null;
// 是否执行过 Zego 的 AddListener 的标志

var hasAddListener$2 = false; // 是否处于网络错误状态中的标志

var hasNetWrong$1 = false; // rtc小班课=0;rtc大班课=1

var classType$3 = 0; // 监听id

var EMListenerId$1 = 0;
var teacherId = null; //静音推流时,音量值是否上抛上层标志 false=没有声音不往上层通知/true=有声音有上层通知

var isNoticeMicVolumeZego = false; // 本地录制错误信息

var recordCodeMsg = {
  0: '录制成功',
  1: '路径太长',
  2: '初始化avcontext失败',
  3: '打开文件失败',
  4: '写文件头失败',
  5: '开始录制',
  6: '停止录制',
  7: '剩余空间不够',
  8: '文件句柄异常',
  9: 'IO异常'
}; // 心跳

var heartBeatDataReportObj$1 = {};
var heartBeatDataReportTimer$1 = null;
var isFirstHeartBeatReport$1 = false;
var streamIdRtcPlayerInfo$1 = {};
var streamIdRtcPlayerInfo1$1 = {};
var currStreamIdRtcPlayerInfo$1;
var lecturerStreamId = null;
var lecturerUid = null;
var heartBeatItemCount = 15;
var statsStore = new DataStore(5500);
var PullResult = {
  PULL_STREAM_CODE_OK: 0,
  // 成功
  PULL_STREAM_CODE_STOP: 1,
  // 停止
  PULL_STREAM_CODE_FAIL: 12101000,
  // 调用拉流Api时发生异常 - 是个笼统的错误码
  PULL_STREAM_CODE_TIMEOUT: 12102003,
  // 拉流超时
  PULL_STREAM_CODE_RTC_SIGNAL_FAIL: 12200001,
  // 加入房间失败
  PULL_STREAM_CODE_RTC_MEDIA_FAIL: 12301011,
  // 媒体链路建立失败
  PULL_STREAM_CODE_NON_EXIST: 32001004 // 流不存在

};
var pullingStore = new DataStore(
/*一小时过期时间*/
60 * 60 * 1000);
var pullingStreamInterval = -1; //记录底层推流回调的值

var dataZegoCapture = {}; //记录当前角色

var currentRole = ''; //记录当前课态类型:小组课=0/小班课=1

var currentClassMode = null; //记录当前rtmp推流sdk类型

var currentGroupSdkType = ''; //主流ID

var localStreamId = ''; //屏幕流ID

var screenStreamId = '';
/**
 * @function 调用端提供的回调方法
 * @param name:String 回调方法名
 * @param args 回调参数
 * @return Promise | void
 */

var callMethod$4 = function callMethod(name, args) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$6) {
    return new Promise(function (resolve, reject) {
      var noneCamera = name === 'SetVideoDevice' && !args.pszDeviceID;
      var noneMicrophone = name === 'SetAudioDevice' && args.deviceType === 0 && !args.pszDeviceID;
      var noneSpeaker = name === 'SetAudioDevice' && args.deviceType === 1 && !args.pszDeviceID;

      if (noneCamera || noneMicrophone || noneSpeaker) {
        return resolve();
      }

      defaultApi$1.writeLog("".concat(name, " Params: ").concat(JSON.stringify(args)));
      EM$6.CallMethod(extensionId$2, name, JSON.stringify(_objectSpread({}, args, {
        classType: classType$3
      })), function (code, msg) {
        defaultApi$1.writeLog("".concat(name, " Code: ").concat(code, " Message: ").concat(msg));
        resolve({
          code: code,
          msg: msg
        });
      });
    });
  }
};
/** 带 10s 超时的单次调用,超时即结束返回,不重试 */


var CALL_TIMEOUT_MS = 10000;

var callMethodWithTimeout = async function callMethodWithTimeout(name, args) {
  var timeoutMs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : CALL_TIMEOUT_MS;
  var timeoutId;

  try {
    var timeoutPromise = new Promise(function (_, reject) {
      timeoutId = setTimeout(function () {
        return reject(new Error("".concat(name, " timeout ").concat(timeoutMs, "ms")));
      }, timeoutMs);
    });
    return await Promise.race([callMethod$4(name, args), timeoutPromise]);
  } finally {
    if (timeoutId) clearTimeout(timeoutId);
  }
}; // 按云控/初始化的分辨率构造边界,避免业务传入的水印超出画面


var getWaterMarkBounds = function getWaterMarkBounds() {
  var config = window.zbyAVSDK_init_params && window.zbyAVSDK_init_params.zego ? window.zbyAVSDK_init_params.zego : {};

  var toNumber = function toNumber(val) {
    var num = Number(val);
    return Number.isFinite(num) ? num : 0;
  }; // 使用云控/初始化设置的编码与预览分辨率作为水印裁剪上限


  defaultApi$1.writeLog("avsdk ZEGO::getWaterMarkBounds config params ,\n    encodedResolutionWidth:".concat(toNumber(config.encodedResolutionWidth), ", encodedResolutionHeight:").concat(toNumber(config.encodedResolutionHeight), ", \n    previewResolutionWidth:").concat(toNumber(config.previewResolutionWidth), ", previewResolutionHeight:").concat(toNumber(config.previewResolutionHeight)));
  return {
    publish: {
      width: toNumber(config.encodedResolutionWidth),
      height: toNumber(config.encodedResolutionHeight)
    },
    preview: {
      width: toNumber(config.previewResolutionWidth),
      height: toNumber(config.previewResolutionHeight)
    }
  };
}; // 构造水印矩形:起点取非负,宽高已在上层校验为正,同时做边界裁剪


var buildWaterMarkRect = function buildWaterMarkRect(x, y, w, h, bounds) {
  var left = Math.max(0, x);
  var top = Math.max(0, y);
  var width = Math.max(0, w);
  var height = Math.max(0, h);
  var clamped = false; // 超出画面时压缩到边界,保证不越界

  if (bounds && bounds.width > 0 && left > bounds.width) {
    left = bounds.width;
    clamped = true;
  }

  if (bounds && bounds.height > 0 && top > bounds.height) {
    top = bounds.height;
    clamped = true;
  }

  var right = width > 0 ? left + width : left;
  var bottom = height > 0 ? top + height : top;

  if (bounds && bounds.width > 0 && right > bounds.width) {
    right = bounds.width;
    clamped = true;
  }

  if (bounds && bounds.height > 0 && bottom > bounds.height) {
    bottom = bounds.height;
    clamped = true;
  }

  return {
    left: left,
    top: top,
    right: right,
    bottom: bottom,
    clamped: clamped
  };
};
/**
 * 设置主通道(发布+预览)的水印图像及矩形区域
 * @param {string} filePath path of watermark image
 * @param {number} x 左
 * @param {number} y 上
 * @param {number} w 宽度,0/负数视为非法
 * @param {number} h 高度,0/负数视为非法
 * @param {string} streamId 主流标识(用于日志),Zego仍使用主通道
 * @returns {Promise<boolean>} true if all zego calls succeed
 */


var setWaterMark = async function setWaterMark(filePath, x, y, w, h) {
  var streamId = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : '';
  var idx = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;

  var toInt = function toInt(val) {
    var num = Number(val);
    return Number.isFinite(num) ? Math.floor(num) : NaN;
  };

  if (!filePath || typeof filePath !== 'string') {
    defaultApi$1.writeLog("avsdk ZEGO::setWaterMark invalid filePath ".concat(filePath));
    return false;
  } //再做一次整数化/校验能隔离不可信输入,避免传到原生接口时出现越界或类型错误。


  var left = toInt(x);
  var top = toInt(y);
  var width = toInt(w);
  var height = toInt(h);

  if ([left, top, width, height].some(function (item) {
    return Number.isNaN(item);
  }) || left < 0 || top < 0 || width <= 0 || height <= 0) {
    defaultApi$1.writeLog("avsdk ZEGO::setWaterMark invalid rect params x:".concat(x, ", y:").concat(y, ", w:").concat(w, ", h:").concat(h));
    return false;
  }

  var bounds = getWaterMarkBounds();
  var publishRect = buildWaterMarkRect(left, top, width, height, bounds.publish);
  var canScale = bounds && bounds.publish && bounds.preview && bounds.publish.width > 0 && bounds.publish.height > 0 && bounds.preview.width > 0 && bounds.preview.height > 0;
  var widthRate = canScale ? bounds.preview.width / bounds.publish.width : 1;
  var heightRate = canScale ? bounds.preview.height / bounds.publish.height : 1;
  var previewLeft = Math.max(0, Math.round(left * widthRate));
  var previewTop = Math.max(0, Math.round(top * heightRate));
  var previewWidth = Math.max(1, Math.round(width * widthRate));
  var previewHeight = Math.max(1, Math.round(height * heightRate));
  var previewRect = buildWaterMarkRect(previewLeft, previewTop, previewWidth, previewHeight, bounds.preview);
  defaultApi$1.writeLog("avsdk ZEGO::setWaterMark path:".concat(filePath, ", publishRect:").concat(JSON.stringify(publishRect), ", previewRect:").concat(JSON.stringify(previewRect), ", idx:").concat(idx, ", streamId:").concat(streamId)); // 三步依次调用,任一步失败即视为配置失败

  var steps = [{
    name: 'SetWaterMarkImagePath',
    args: {
      filePath: filePath,
      idx: idx
    }
  }, {
    name: 'SetPublishWaterMarkRect',
    args: {
      left: publishRect.left,
      top: publishRect.top,
      right: publishRect.right,
      bottom: publishRect.bottom,
      idx: idx
    }
  }, {
    name: 'SetPreviewWaterMarkRect',
    args: {
      left: previewRect.left,
      top: previewRect.top,
      right: previewRect.right,
      bottom: previewRect.bottom,
      idx: idx
    }
  }];

  for (var _i = 0; _i < steps.length; _i++) {
    var step = steps[_i];
    var res = await callMethod$4(step.name, step.args);
    var ok = res && res.code === 0;

    if (!ok) {
      defaultApi$1.writeLog("avsdk ZEGO::".concat(step.name, " failed, code:").concat(res && res.code, ", msg:").concat(res && res.msg));
      return false;
    }
  }

  return true;
};
/**
 * @function 加载 Zego 扩展
 * @param extensionVersion:String 扩展版本号,必选
 * @return Promise | void
 */

var loadZego = function loadZego(extensionVersion) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$6) {
    return new Promise(function (resolve, reject) {
      if (getS('zegoVersion')) {
        if (compareS('zegoVersion', extensionVersion)) {
          return resolve();
        }
      }

      EM$6.Load(extensionId$2, extensionVersion, false, function (code, msg) {
        defaultApi$1.writeLog("loadZego Code: ".concat(code, "\nMessage: ").concat(msg));

        if (code === 0) {
          setS('zegoVersion', extensionVersion);
        }

        resolve();
      });
    });
  }
};
/**
 * @function 卸载 Zego 扩展
 * @return Promise | void
 */

var unloadZego = function unloadZego() {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$6) {
    return new Promise(function (resolve, reject) {
      EM$6.UnLoad(extensionId$2, function (code, msg) {
        defaultApi$1.writeLog("unloadZego Code: ".concat(code, "\nMessage: ").concat(msg));
        resolve();
      });
    });
  }
};
/**
 * @function 添加扩展监听机制
 * @param userId:Number 用户 id,必选
 * @param userName:String 用户名,必选
 * @param roomId:String 频道(房间) id,必选
 * @param nNetType:Number 网络类型,可选,默认为 1
 * @return void
 */

var addListener$2 = function addListener(userId, userName, confId, nNetType, devices, role) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$6 && !hasAddListener$2) {
    hasAddListener$2 = true;
    EM$6.AddListener(extensionId$2, function (event, data) {
      if (data && data.indexOf(extensionId$2) > -1) {
        try {
          EMListenerId$1 = JSON.parse(data)[extensionId$2];
          defaultApi$1.writeLog("ZEGO::addListener-- EMListenerId: ".concat(EMListenerId$1));
        } catch (error) {}
      }

      if (!event || !data) {
        return;
      }

      var _data = JSON.parse(data); // if (_data && _data.classType === 1) {
      //   return false;
      // }


      switch (event) {
        case 'OnInitSDK':
          // 只有 OnInitSDK 事件成功返回后才可以执行后续操作,比如 loginChannel
          var status = JSON.parse(data).nError;
          var nclassType = JSON.parse(data).nClassType;
          defaultApi$1.writeLog("ZEGO::addListener-- OnInitSDK: ".concat(status, "--").concat(nclassType));

          if (status === 0 && nclassType == 0) {
            if (userId === 'deviceCheckerInit') {
              deviceCheckerInitSDK();
            } else {
              afterInitSDK(userId, userName, confId, nNetType, devices, role);
            }
          }

          break;

        case 'OnLoginChannel':
          var status = JSON.parse(data).uiErrorCode;
          defaultApi$1.writeLog("ZEGO::addListener-- OnLoginChannel: ".concat(status));

          if (status === 0) {
            hasLoginChannel = 1;
          }

          break;

        case 'OnPublishStateUpdate':
          var res = JSON.parse(data);
          var keys = Object.keys(res);

          if (!window.zbyAVSDK_init_params || !window.zbyAVSDK_init_params.zego) {
            return;
          }

          if (keys.indexOf('eState') > -1) {
            switch (res.eState) {
              case 0:
                hasPushFlow = 1;
                window.zegoHasPushFlow = 1;

                try {
                  var ReportArgs = {};

                  if (_data.pszStreamID.split('_').length == 5) {
                    ReportArgs.publish_rtc_streamid = _data.pszStreamID;
                  }

                  dataReport$2.publishResult(_objectSpread({
                    code: '0'
                  }, ReportArgs));
                  NOTICE.pushFlowSuccess({
                    code: 0,
                    publish_streamid: _data.pszStreamID
                  });
                } catch (e) {}

                ;

                if (window.zbyAVSDK_init_params.zego.isTurnPush) {
                  singleRecord('start');
                }

                break;

              case 1:
                hasPushFlow = 0;
                window.zegoHasPushFlow = 0;
                break;
              // 推流重试

              case 6:
              case 7:
              case 105:
                // pushFlowExceptionHandler();
                try {
                  dataReport$2.publishResult({
                    code: res.eState // publish_streamid: window.zbyAVSDK_init_params.zego.streamId,

                  });
                } catch (e) {}

                ;
                break;

              case 10:
                if (!hasNetWrong$1) {
                  hasNetWrong$1 = true;
                  defaultApi$1.writeLog('error', 'Network error');
                  NOTICE.networkError({
                    message: 'Network error'
                  });
                }

                try {
                  dataReport$2.publishResult({
                    code: res.eState // publish_streamid: window.zbyAVSDK_init_params.zego.streamId,

                  });
                } catch (e) {}

                ; // pushFlowExceptionHandler();

                break;

              default:
                try {
                  dataReport$2.publishResult({
                    code: res.eState // publish_streamid: window.zbyAVSDK_init_params.zego.streamId,

                  });
                } catch (e) {}

                ;
                break;
            }
          }

          break;

        case 'OnPublishQualityUpdate':
          if (_data.hasOwnProperty('pq') && _data.pszStreamID.split('_').length != 5) {
            // 主辅两路质量回调,丢包延时只上抛一次,过滤掉辅路数据
            _data.opt = 'quality';
            _data.type = 'mediaupqos';

            if (typeof _data.pq.kbps === 'number' && typeof _data.pq.fps === 'number') {
              NOTICE.pushQuality({
                video: {
                  streamId: _data.pszStreamID,
                  userId: util.getUidByStreamId(_data.pszStreamID),
                  bitrate: Math.round(_data.pq.kbps),
                  fps: Math.round(_data.pq.fps)
                }
              });
            } // console.log('推流延迟丢包zego',_data);


            NOTICE.pushLossAndDelay({
              userId: util.getUidByStreamId(_data.pszStreamID),
              delay: _data.pq.rtt,
              lostrate: _data.pq.pktLostRate
            }); // heartBeatDataReportCalc(event, _data.pq, _data.pszStreamID);

            statsStore.setData(_data.pszStreamID, _data.pq);
          }

          break;

        case 'OnCaptureSoundLevelUpdate':
          if (isNoticeMicVolumeZego) {
            NOTICE.captureMicVolumeChanged({
              volume: Math.round(_data.pCaptureSoundLevel[0].soundLevel)
            });
          } // heartBeatDataReportObj.volume.push(Math.round(_data.pCaptureSoundLevel[0].soundLevel));


          heartBeatDataReportObj$1.volume = heartBeatDataReportObj$1.volume + Math.round(_data.pCaptureSoundLevel[0].soundLevel) + ',';
          break;

        case 'OnSoundLevelUpdate':
          _data.pSoundLevelList.forEach(function (item) {
            var cbData = {
              streamid: item.szStreamID,
              userId: util.getUidByStreamId(item.szStreamID),
              volume: Math.round(item.soundLevel)
            };
            NOTICE.playerVolumeChanged(cbData);
            NOTICE.volumeChange(cbData); // currStreamIdRtcPlayerInfo && currStreamIdRtcPlayerInfo.volume.push(Math.round(item.soundLevel));
            // streamIdRtcPlayerInfo[item.szStreamID] && streamIdRtcPlayerInfo[item.szStreamID].volume.push(Math.round(item.soundLevel));

            if (streamIdRtcPlayerInfo$1[item.szStreamID]) {
              streamIdRtcPlayerInfo$1[item.szStreamID].volume = streamIdRtcPlayerInfo$1[item.szStreamID].volume + Math.round(item.soundLevel) + ',';
            }
          });

          break;

        case 'OnPlayStateUpdate':
          if (_data.hasOwnProperty('eState')) {
            if (!window.zbyAVSDK_init_params || !window.zbyAVSDK_init_params.zego) {
              return;
            }

            var code = _data.eState;

            if (code === 3) {
              defaultApi$1.writeLog('error', "ZEGO::  OnPlayStateUpdate  eState: ".concat(code));
            }

            var normalCode = [0, 1, 3, 1011];

            if (code === 10 && !hasNetWrong$1) {
              hasNetWrong$1 = true;
              defaultApi$1.writeLog('error', 'Network error');
              NOTICE.networkError({
                message: 'Network error'
              });
              dabanDataReport({
                action: 'zby_live_sdk_player_network_error',
                uid: window.zbyAVSDK_init_params.zego.userId,
                streamid: _data.pszStreamID,
                teacherId: window.zbyAVSDK_init_params.zego.teacherId,
                errorcode: code,
                sdktype: 'zego'
              });
            } // 拉流重试


            if (normalCode.indexOf(code) === -1) {
              setTimeout(function () {
                // pullFlowExceptionHandler(_data.pszStreamID);
                NOTICE.playError({
                  userId: util.getUidByStreamId(_data.pszStreamID),
                  message: 'play error'
                });
                dabanDataReport({
                  action: 'zby_live_sdk_player_play_error',
                  uid: window.zbyAVSDK_init_params.zego.userId,
                  streamid: _data.pszStreamID,
                  teacherId: window.zbyAVSDK_init_params.zego.teacherId,
                  errorcode: code,
                  sdktype: 'zego'
                });
              }, 1000);
            }

            ;

            try {
              if (_data.pszStreamID.indexOf('ai') < 0) {
                dataReport$2.pullResult({
                  code: code,
                  // pull_uid: _data.pszStreamID.split('_').length == 5 ? _data.pszStreamID : util.getUidByStreamId(_data.pszStreamID),
                  pull_uid: util.getUidByStreamId(_data.pszStreamID),
                  pull_streamid: _data.pszStreamID
                });
                pullingStore.delete(_data.pszStreamID);
                NOTICE.pullFlowResult({
                  code: code,
                  pull_streamid: _data.pszStreamID
                });
              } // dataReport.pullResult({
              //   code: code,
              //   pull_uid: util.getUidByStreamId(_data.pszStreamID),
              //   pull_streamid: _data.pszStreamID
              // });

            } catch (e) {}

            ;
          }

          break;

        case 'OnPlayQulityUpdate':
          // 拉流
          if (_data.hasOwnProperty('pq')) {
            // console.log('拉流回调',`${new Date().getMinutes()}:${new Date().getSeconds()}`,_data);
            _data.opt = 'quality';
            _data.type = 'mediadownqos';
            NOTICE.pullQuality({
              video: {
                streamId: _data.pszStreamID,
                userId: util.getUidByStreamId(_data.pszStreamID),
                bitrate: _data.pq.kbps,
                fps: _data.pq.fps
              }
            }); // console.log('拉流延迟丢包zego',_data);

            NOTICE.playLossAndDelay({
              userId: util.getUidByStreamId(_data.pszStreamID),
              delay: _data.pq.rtt,
              lostrate: _data.pq.pktLostRate
            });
            currStreamIdRtcPlayerInfo$1 = streamIdRtcPlayerInfo$1[_data.pszStreamID]; // heartBeatDataReportCalc(event, _data.pq, _data.pszStreamID);

            statsStore.setData(_data.pszStreamID, _data.pq);
          }

          break;

        case 'OnVideoDeviceStateChanged':
          // 视频设备状态变更
          // _data.state 0=添加设备 1=移除设备
          // console.log('hsghsghsg摄像头热插拔',_data);
          setVideoDevice({
            deviceId: _data.state == 1 ? '' : _data.deviceInfo.szDeviceId,
            idx: 0,
            operationType: 'hotPlug',
            deviceState: _data.state,
            changedDeviceId: _data.deviceInfo.szDeviceId
          }); // try {
          //   dataReport.deviceTest({
          //     device: '1',
          //     fore_state: _data.state == 0 ? 1 : 2 ,
          //     camera_name: _data.deviceInfo && _data.deviceInfo.szDeviceName,
          //   });
          // } catch (e){};

          break;

        case 'OnAudioDeviceStateChanged':
          // 音频设备状态变更
          // console.log('hsghsghsg扬声器热插拔1',_data);
          if (_data.deviceType === 0) {
            // _data.state 0=添加设备 1=移除设备
            setMicrophoneDevice$1({
              deviceId: _data.state == 1 ? '' : _data.deviceInfo.szDeviceId,
              operationType: 'hotPlug',
              deviceState: _data.state,
              changedDeviceId: _data.deviceInfo.szDeviceId
            });
          }

          if (_data.deviceType === 1) {
            // console.log('hsghsghsg扬声器热插拔',_data);
            setSpeakerDevice$1({
              deviceId: _data.state == 1 ? '' : _data.deviceInfo.szDeviceId,
              operationType: 'hotPlug',
              deviceState: _data.state,
              changedDeviceId: _data.deviceInfo.szDeviceId
            });
          } // try {
          //   dataReport.deviceTest({
          //     device: _data.deviceType === 0 ? '2' : '3',
          //     fore_state: _data.state == 0 ? 1 : 2 ,
          //     microphone_name: _data.deviceInfo && _data.deviceInfo.szDeviceName,
          //     speaker_name: _data.deviceInfo && _data.deviceInfo.szDeviceName
          //   });
          // } catch (e){};


          break;

        case 'OnAudioDefaultDeviceStateChanged':
          // 音频默认设备状态变更
          if (_data.deviceType === 0) {
            NOTICE.defaultMicChanged({
              deviceId: _data.deviceId
            });
          } else if (_data.deviceType === 1) {
            NOTICE.defaultSpeakerChanged({
              deviceId: _data.deviceId
            });
          }

          break;

        case 'OnDeviceError':
          //errorCode 无效设备ID (-2), 没有权限	(-3), 采集帧率为0	(-4), 设备被占用 (-5), 设备未插入	(-6), 需要重启系统 (-7), 媒体服务无法恢复	(-8), 设备被SIRI占用 (-9)
          var codemsg = {
            '-2': '无效设备ID',
            '-3': '没有权限',
            '-4': '采集帧率为0',
            '-5': '设备被占用',
            '-6': '设备未插入',
            '-7': '需要重启系统',
            '-8': '媒体服务无法恢复',
            '-9': '设备被SIRI占用'
          };
          defaultApi$1.writeLog("avsdk ZEGO:: OnDeviceError ".concat(_data.deviceName, " ").concat(_data.errorCode));
          dataReport$2.deviceError({
            deviceName: _data.deviceName,
            errorCode: _data.errorCode,
            code: _data.errorCode
          });
          NOTICE.deviceError({
            code: _data.errorCode,
            msg: codemsg[_data.errorCode],
            deviceId: _data.deviceId,
            deviceName: _data.deviceName
          }); // _data.deviceName === 'camera' ? setVideoDevice({deviceId: '', idx: 0, operationType: 'deviceError', deviceState: '', code: codemsg[_data.errorCode]}) : setMicrophoneDevice({deviceId: '', operationType: 'deviceError', deviceState: '', code: codemsg[_data.errorCode]});

          break;

        case 'OnAVKitEvent':
          // defaultApi.writeLog('avsdk ZEGO:: OnAVKitEvent');
          if (_data.event === 4 && hasNetWrong$1) {
            hasNetWrong$1 = false;
            NOTICE.networkRecovery({
              message: 'Network recovery'
            });
          }

          break;

        case 'OnAVEngineStop':
          isAVEngineStopped = 1;
          defaultApi$1.writeLog('avsdk ZEGO:: listened AVEngineStop');
          break;

        case 'OnMixStream':
          defaultApi$1.writeLog('avsdk ZEGO:: listened mix_stream_response');
          break;

        case 'OnVideoSizeChanged':
          if (_data.nWidth > 0 && _data.nHeight > 0) {
            try {
              NOTICE.firstVideoSize({
                streamId: _data.pStreamID,
                // userId: _data.pszStreamID.split('_').length == 5 ? _data.pszStreamID : util.getUidByStreamId(_data.pszStreamID)
                userId: util.getUidByStreamId(_data.pStreamID)
              });
              dataReport$2.firstVideoSize({
                pull_streamid: _data.pStreamID,
                pull_uid: util.getUidByStreamIdDr(_data.pStreamID),
                code: '0'
              });
            } catch (e) {}

            ;
          } else {
            defaultApi$1.writeLog('avsdk ZEGO:: OnVideoSizeChanged - nWidth and nHeight is 0');
          }

          break;

        case 'OnRenderRemoteVideoFirstFrame':
          if (!window.zbyAVSDK_init_params || !window.zbyAVSDK_init_params.zego) {
            return;
          } // 大班数据上报


          if (window.zbyAVSDK_init_params.zego.role === 'student') {
            dabanDataReport({
              action: 'interact_play',
              teammate_streamid: _data.pszStreamID,
              uid: window.zbyAVSDK_init_params.zego.userId
            });
          }

          try {
            NOTICE.firstVideoSize({
              streamId: _data.pszStreamID,
              // userId: _data.pszStreamID.split('_').length == 5 ? _data.pszStreamID : util.getUidByStreamId(_data.pszStreamID)
              userId: util.getUidByStreamId(_data.pszStreamID)
            });
            dataReport$2.firstVideoSize({
              pull_streamid: _data.pszStreamID,
              pull_uid: util.getUidByStreamIdDr(_data.pszStreamID),
              code: '0'
            });
          } catch (e) {}

          ;
          defaultApi$1.writeLog("ZEGO: pullStream success & haveFirstVideoSize  streamId: ".concat(_data.pszStreamID)); // try {
          //   dataReport.pullResult({
          //     status: 0,
          //     pull_uid: util.getUidByStreamId(_data.pszStreamID),
          //     pull_streamid: _data.pszStreamID
          //   });
          // } catch (e) {};

          break;

        case 'OnRecvRemoteAudioFirstFrame':
          try {
            NOTICE.firstAudioSize({
              streamId: _data.pszStreamID,
              userId: util.getUidByStreamId(_data.pszStreamID)
            });
            dataReport$2.firstAudioSize({
              pull_streamid: _data.pszStreamID,
              pull_uid: util.getUidByStreamIdDr(_data.pszStreamID),
              code: '0'
            });
          } catch (e) {}

          ;
          break;
        // 转推回调 0=转推停止 1=正在转推 2=正在重试

        case 'onRecvMediaSideInfo':
          defaultApi$1.writeLog("avsdk ZEGO:: onRecvMediaSideInfo, ".concat(JSON.stringify(_data)));
          NOTICE.seiReceived({
            data: _data
          });
          break;

        case 'zego_recovery_start':
          defaultApi$1.writeLog("avsdk ZEGO:: zego_recovery_start ".concat(JSON.stringify(_data)));
          NOTICE.zegoRecoveryStart();
          break;

        case 'OnRelayCDNStateUpdate':
          if (_data.statesInfo && _data.statesInfo[0] && _data.statesInfo[0].state === 1) {
            NOTICE.recordResponse({
              streamId: _data.streamID,
              userId: util.getUidByStreamId(_data.streamID)
            });
          } //   try {
          //     dataReport.turnPushResult({
          //       errorcode:_data.statesInfo[0].state,
          //       case: 'turn push',
          //       streamid: _data.streamID
          //     })
          // } catch (e) {};


          break;

        case 'OnCaptureVideoFirstFrame':
          if (!window.zbyAVSDK_init_params || !window.zbyAVSDK_init_params.zego) {
            return;
          } // 大班数据上报


          dabanDataReport({
            action: 'open_camera',
            camera_status: 1,
            uid: window.zbyAVSDK_init_params.zego.userId
          });
          break;

        case 'OnKaDunEvent':
          if (_data.event === 8) {
            currStreamIdRtcPlayerInfo$1 && (currStreamIdRtcPlayerInfo$1.video_ifg += _data.kaDunTime);
          }

          if (_data.event === 10) {
            currStreamIdRtcPlayerInfo$1 && (currStreamIdRtcPlayerInfo$1.audio_ifg += _data.kaDunTime);
          }

          break;

        case 'OnMediaRecord':
          NOTICE.recordStateUpdate(_data);

          if (_data.errorCode === 0) {
            NOTICE.recordFinished({
              path: _data.storagePath,
              idx: _data.channelIndex
            });
          } else if (_data.errorCode === 5) {
            NOTICE.recordBegin({
              idx: _data.channelIndex
            });
          } else if (_data.errorCode === 6) {
            NOTICE.recordEnd({
              idx: _data.channelIndex
            });
          } else {
            NOTICE.recordError({
              code: _data.errorCode,
              idx: _data.channelIndex,
              msg: recordCodeMsg[_data.errorCode]
            });
          }

          break;

        case 'onBeautifyEvent':
          if (_data.code === 0) {
            defaultApi$1.writeLog("avsdk ZEGO:: onBeautifyEvent success ".concat(JSON.stringify(_data)));
          } else {
            var message = ['', 'License错误', '渲染错误', '参数错误'];
            NOTICE.beautifyError({
              code: _data.code,
              message: message[_data.code]
            });
          }

          break;

        case 'onJoinchannelError':
          defaultApi$1.writeLog("ZEGO: event:: onJoinchannelError: ".concat(data));
          dataReport$2.joinRtcChannel(_data);
          break;
        // rtc麦克风数据回调业务,每s回调一次

        case 'OnMicCaptureData':
          {
            var base64Data = _data && _data.data;

            if (base64Data) {
              NOTICE.micCaptureData({
                data: base64Data,
                sampleRate: _data.sampleRate,
                channels: _data.channels
              });
            }

            break;
          }
      }

      ;

      if (zbysdk$1.openListenerLog) {
        defaultApi$1.writeLog("Zego::Listener:: event: ".concat(event, ", data: ").concat(JSON.stringify(data)));
      }
    });
  }
};

var startPullingStreamObserver = function startPullingStreamObserver() {
  pullingStore.restore();

  if (pullingStreamInterval !== -1) {
    clearInterval(pullingStreamInterval);
  }

  pullingStreamInterval = setInterval(function () {
    pullingStore.forEach(function (value, key) {
      try {
        if (!pullingStore.checkData(value)) {
          pullingStore.delete(key);
          dataReport$2.pullResult({
            code: PullResult.PULL_STREAM_CODE_TIMEOUT,
            media_type: value.info,
            pull_uid: util.getUidByStreamIdDr(key),
            pull_streamid: key
          });
        }
      } catch (e) {
        defaultApi$1.writeLog("pullingStreamInterval error ".concat(e), undefined, 'error');
      }
    });
  }, 500);
};
/**
 * @function 添加扩展监听机制
 * @return void
 */


var removerListener$1 = function removerListener() {
  hasAddListener$2 = false;
  defaultApi$1.writeLog("ZEGO::action--removerListener EMListenerId:".concat(EMListenerId$1));
  EM$6.RemoverListener(extensionId$2, EMListenerId$1, function (ec, content) {});
  EMListenerId$1 = 0;
};
/**
 * @function 推流异常恢复
 */


var pushFlowExceptionHandler$1 = async function pushFlowExceptionHandler() {
  await new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve();
    }, 1000);
  });
  defaultApi$1.writeLog('断网重推');
  defaultApi$1.writeLog('avsdk ZEGO::try to pushFlow again');
  await stopPublish();
  await startPublish2();
};
/**
 * @function 拉流异常恢复
 */

var pullFlowExceptionHandler$1 = async function pullFlowExceptionHandler(streamId) {
  await new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve();
    }, 1000);
  });
  defaultApi$1.writeLog('断网重拉');
  defaultApi$1.writeLog("avsdk ZEGO::try to pullFlow again \uFF0CstreamId : ".concat(streamId));
  await stopPlayStream(streamId);
  await playStream(streamId);
};
/**
 * @function 初始化 Engine
 * @param appId:String Zego 秘钥,必选
 * @param appSignature:String 签名,必选
 * @param businessType:Number 业务类型,可选,默认为 0
 * @param videoRenderType:Number zego视频渲染类型,默认为2(只外部渲染),zego小组课需要设置为5(同时支持内部+外部渲染)
 * @return Promise | void
 */

var startEngine = function startEngine(appId, appSignature, businessType) {
  var videoRenderType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 2;

  if (typeof businessType === 'undefined') {
    businessType = 0;
  }

  defaultApi$1.writeLog('avsdk ZEGO::StartEngine');
  return callMethod$4('StartEngine', {
    appId: appId,
    appSignature: appSignature,
    businessType: businessType,
    videoRenderType: videoRenderType
  });
}; //开启消除回声

var setEnableAEC = function setEnableAEC(bEnable) {
  return callMethod$4('EnableAEC', {
    bEnable: bEnable
  });
}; //设置回声消除模式 mode :激进模式 =0/中等模式 =1/轻度模式 =2

var setAECMode = function setAECMode(mode) {
  return callMethod$4('SetAECMode', {
    mode: mode
  });
}; //开启噪音消除

var setEnableNoiseSuppress = function setEnableNoiseSuppress(bEnable) {
  return callMethod$4('EnableNoiseSuppress', {
    bEnable: bEnable
  });
}; //设置噪音消除模式 mode :0:低  1:中   2高

var setNoiseSuppressMode = function setNoiseSuppressMode(level) {
  return callMethod$4('SetNoiseSuppressMode', {
    level: level
  });
}; //新增瞬时降噪接口 瞬时降噪 可以处理掉 敲键盘、敲桌子、敲门等瞬态噪声。非瞬态噪声,此接口无法处理,比如划桌子等摩擦噪音。

var enableTransientNoiseSuppress = function enableTransientNoiseSuppress(enable) {
  return callMethod$4('EnableTransientNoiseSuppress', {
    enable: enable
  });
};
/**
   * @function 加载采集插件的输入数据  //调用后,zego 可以向采集插件传送摄像头数据,用于拼接
   * @return: Promise
   */

var loadCollectionInputEntry = function loadCollectionInputEntry() {
  return callMethod$4('LoadCollectionInputEntry', {});
};
/**
 * @function 加载采集插件的输出数据  //调用后,zego 可以向采集插件传送学生流数据(加载截屏插件,获取截屏插件设置拉流头像回调函数)
 * @param stream_ids array 设置需要拼接的学生头像流id,按数组顺序拼接
 * @return: Promise
 */

var loadCollectionInputEntry2 = function loadCollectionInputEntry2(stream_ids) {
  return callMethod$4('LoadCollectionInputEntry2', {
    stream_ids: stream_ids
  });
};
/**
 * @function 加载采集插件的输出数据  //调用后,zego 可以从采集插件获取拼接数据
 * @return: Promise
 */

var loadCollectionOutputEntry = function loadCollectionOutputEntry() {
  return callMethod$4('LoadCollectionOutputEntry', {});
};
/**
 * @function 设置直推url  //调用后,zego 可以从采集插件获取拼接数据
 * @param pRtmpUrl:String 直推地址
 * @param idx:Number 使用外部采集的通道idx,与StartEngine中channel_idx保持一致
 * @return: Promise
 */

var setCDNPublishTarget = function setCDNPublishTarget(pRtmpUrl, idx) {
  return callMethod$4('SetCDNPublishTarget', {
    pRtmpUrl: pRtmpUrl,
    idx: idx
  });
};
/**
 * @function 销毁引擎
 * @return Promise | void
 */

var destroyEngine$1 = function destroyEngine() {
  return callMethodWithTimeout('DestroyEngine', {}, CALL_TIMEOUT_MS);
};
/**
 * @function 加入频道
 * @param userId:Number 用户 id,必选
 * @param userName:String 用户名,必选
 * @param channelId:String 频道 id,必选
 * @param nNetType:Number 网络类型,可选,默认为 1
 * @return Promise | void
 */

var loginChannel = function loginChannel(userId, userName, channelId, nNetType) {
  if (typeof nNetType === 'undefined') {
    nNetType = 1;
  }

  return callMethod$4('LoginChannel', {
    pszUserID: userId + '',
    pszUserName: userName,
    pszChannelID: channelId,
    nNetType: nNetType
  });
};
/**
 * @function 退出直播频道
 * @return Promise | void
 */

var logoutChannel = function logoutChannel() {
  defaultApi$1.writeLog('avsdk ZEGO:: CallMethod : LogoutChannel');
  return callMethod$4('LogoutChannel', {});
};
/**
 * @function 云控时退出房间
 * @return Promise
 */

var leaveRoomWithChangeSDK = async function leaveRoomWithChangeSDK() {
  defaultApi$1.writeLog("leaveRoomWithChangeSDK--currentClassMode--currentGroupSdkType ".concat(currentClassMode, ", ").concat(currentGroupSdkType));
  var needDestroyZegoEngine = true; //云控从zego切到其他sdk时,默认释放zego引擎。但是如果zego在推拉RTMP流,则不能释放

  if (currentGroupSdkType == 'zego' || window.zby_isM1Type) {
    switch (currentClassMode) {
      case 0: // 小组

      case 2:
        // 组合小班
        needDestroyZegoEngine = false;
        break;

      case 1:
        // 小班
        if (window.zby_sdk_init_params.role === 'teacher' || window.zby_sdk_init_params.role === 'assistant') {
          needDestroyZegoEngine = false;
        }

        break;
    }
  }

  await stopSoundLevelMonitor();

  for (var key in streamIdToPreviewId$1) {
    await stopPlayStream(key, true);
  }

  if (isZegoGroupClass() && (currentRole === 'teacher' || currentRole === 'assistant') || isZegoCombinationClass() && currentRole === 'assistant') {
    // zego小组课,切RTC流云控后,授课端不能停止预览
    console.log('zego小组课不可停止预览,会影响rtmp');
  } else {
    await stopPreview$1();
  }

  await stopPublish();
  removerListener$1();

  if (needDestroyZegoEngine === true) {
    await destroyEngine$1();
  }

  if (window.zby_sdk_init_params.role === 'teacher' && window.zby_sdk_init_params.mode === 1) {
    //坐立模式关闭外部采集器,站立关闭外部采集器
    await setVideoCaptureFactory(false);
  }

  heartBeatDataReport$1('stop');
  isFirstHeartBeatReport$1 = false;
  streamIdToPreviewId$1 = {};
  previewIdToStreamId = {};
  streamIdRtcPlayerInfo$1 = {};
  streamIdRtcPlayerInfo1$1 = {}; // heartBeatDataReportObj = {};

  hasLoginChannel = 0;
  hasPushFlow = 0;
  isAVEngineStopped = 0;
  window.zegoHasPushFlow = 0;
};
/**
 * @function 退出房间
 * @return Promise
 */

var leaveRoom$1 = async function leaveRoom(type) {
  await stopSoundLevelMonitor();

  for (var key in streamIdToPreviewId$1) {
    await stopPlayStream(key, true);
  }

  await stopPublish();
  removerListener$1(); // await logoutChannel();
  // await new Promise((resolve, reject) => {
  //   let timer = setInterval(() => {
  //     if (isAVEngineStopped) {
  //       clearInterval(timer);
  //       resolve();
  //     }
  //   }, 300);
  // });

  if (type == 'reload') {
    defaultApi$1.writeLog('leaveroom -- reload --小组课刷新不可销毁zego引擎');
  } else {
    await stopPreview$1();
    await destroyEngine$1();
  }

  if (window.zby_sdk_init_params.role === 'teacher' && window.zby_sdk_init_params.mode === 1) {
    //坐立模式关闭外部采集器,站立关闭外部采集器
    await setVideoCaptureFactory(false);
  }

  heartBeatDataReport$1('stop');
  isFirstHeartBeatReport$1 = false;
  streamIdToPreviewId$1 = {};
  previewIdToStreamId = {};
  streamIdRtcPlayerInfo$1 = {};
  streamIdRtcPlayerInfo1$1 = {}; // heartBeatDataReportObj = {};

  hasLoginChannel = 0;
  hasPushFlow = 0;
  isAVEngineStopped = 0;
  window.zegoHasPushFlow = 0;
};
var stopCheckDevice$1 = async function stopCheckDevice() {
  removerListener$1();
  await stopSoundLevelMonitor();
  await stopPreview$1();
  defaultApi$1.writeLog('rtc stopCheckDevice and removerListener and captureDestroy');

  try {
    return await callMethodWithTimeout('DestroyEngine', {}, CALL_TIMEOUT_MS);
  } catch (e) {
    var msg = String(e);

    if (e && e.message) {
      msg = e.message;
    }

    defaultApi$1.writeLog("stopCheckDevice DestroyEngine failed: ".concat(msg), undefined, 'error');
    return {
      code: -1,
      msg: msg
    };
  }
};
/**
 * @function 获取系统默认的音频设备
 * @param deviceType:Number 音频设备类型,0 -> 麦克风,1 -> 扬声器,必选
 * @return Promise | void
 */

var getDefaultAudioDeviceId = function getDefaultAudioDeviceId(deviceType) {
  return callMethod$4('GetDefaultAudioDeviceId', {
    deviceType: deviceType,
    // 以下两个参数仅仅是为了向下向后兼容,使用 hardcore 即可
    deviceId: '',
    deviceIdLength: 0
  });
};
/**
 * @function 获取系统默认的麦克风设备 id
 * @return Promise
 */

var getDefaultMicrophone = function getDefaultMicrophone() {
  return getDefaultAudioDeviceId(0);
};
/**
 * @function 获取系统默认的扬声器设备 id
 * @return Promise
 */

var getDefaultSpeaker = function getDefaultSpeaker() {
  return getDefaultAudioDeviceId(1);
};
/**
 * @function 获取摄像头列表
 * @return Promise | void
 */

var getVideoDeviceList = async function getVideoDeviceList() {
  var videoListArr = JSON.parse((await callMethod$4('GetVideoDeviceList', {
    // 这个参数是 C++ 要使用的引用参数,随便传个整型就行
    device_count: 1
  })).msg).ret;
  var videoList = [];

  for (var i = 0, len = videoListArr.length; i < len; i++) {
    videoList.push({
      deviceId: videoListArr[i].szDeviceId,
      deviceName: videoListArr[i].szDeviceName,
      isDefault: i === 0
    });
    deviceListReport.cameraList[videoListArr[i].szDeviceId] = videoListArr[i].szDeviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.camera) {
    window.zbyAVSDK_device_checker_init.camera = {};
  }

  window.zbyAVSDK_device_checker_init.camera.hasTest = true;
  window.zbyAVSDK_device_checker_init.camera.list = videoList;
  return videoList;
};
/**
 * @function 指定使用的摄像头
 * @param deviceId:String 摄像头 id,必选
 * @param idx:Number 推流通道,可选,默认为 0
 * @param operationType:String 操作类型,可选
 * 'device_error' -> 设备出错处理,'plug_and_unplug' -> 热插拔处理,
 * 不传即是普通的设置摄像头设备的行为
 * @return Promise | void
 */

var setVideoDevice = async function setVideoDevice(args) {
  defaultApi$1.writeLog("".concat(JSON.stringify(args), "----setVideoDevice-zego----"));
  var deviceId = args.deviceId,
      idx = args.idx,
      operationType = args.operationType,
      deviceState = args.deviceState,
      code = args.code,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var cameraData = await getVideoDeviceList();

  if (cameraData.length) {
    var defaultDevice;
    var _iteratorNormalCompletion = true;
    var _didIteratorError = false;
    var _iteratorError = undefined;

    try {
      for (var _iterator = cameraData[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
        var item = _step.value;

        if (deviceId && item.deviceId === deviceId) {
          deviceName = item.deviceName;
          break;
        }

        if (item.isDefault) {
          defaultDevice = item;
        }
      }
    } catch (err) {
      _didIteratorError = true;
      _iteratorError = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion && _iterator.return != null) {
          _iterator.return();
        }
      } finally {
        if (_didIteratorError) {
          throw _iteratorError;
        }
      }
    }

    if (!defaultDevice) {
      defaultDevice = cameraData[0];
    }

    if (!deviceId || !deviceName) {
      NOTICE.deviceError({
        code: -2,
        msg: '设备ID无效',
        deviceId: deviceId,
        deviceName: deviceName
      });
      deviceId = defaultDevice.deviceId;
      deviceName = defaultDevice.deviceName;
    }
  } else {
    deviceId = '';
  }

  if (deviceId === '') {
    NOTICE.noDevice({
      deviceType: 'camera'
    });
  }

  window.zbyAVSDK_device_checker_init.camera.use = deviceId;
  window.zbyAVSDK_device_checker_init.camera.name = deviceListReport.cameraList[deviceId];

  if (typeof idx === 'undefined') {
    idx = 0;
  }

  try {
    dataReport$2.setDevice({
      device_type: 1,
      device_id: deviceId,
      device_name: deviceListReport.cameraList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? deviceState + 1 : '-'
    });
  } catch (e) {}

  ;
  await callMethod$4('SetVideoDevice', {
    pszDeviceID: deviceId,
    idx: idx
  });

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!cameraData) {
      cameraData = await getVideoDeviceList();
      deviceName = deviceListReport.cameraList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'camera',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: cameraData,
      messge: code,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }

  try {
    NOTICE.useredCamera({
      deviceId: deviceId,
      deviceName: deviceName
    });
  } catch (e) {}

  ;
};
/**
 * @function 开/关摄像头
 * @param enable:Boolean false -> 关闭,true -> 打开,必选
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var enableCamera = function enableCamera(enable) {
  var idx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  // try {
  //   dataReport.deviceChange({
  //     device: 1,
  //     device_state: enable? 1 : 0
  //   });
  // } catch (e){};
  return callMethod$4('EnableCamera', {
    bEnable: enable,
    idx: idx
  });
};
/**
 * @function 开/关麦克风
 * @param bEnable:Boolean false -> 关闭,true -> 打开,必选
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var enableMic = async function enableMic(bEnable, idx) {
  defaultApi$1.writeLog('enableMic --start');
  isNoticeMicVolumeZego = bEnable; // if (bEnable) {
  //   await setMicDeviceMute(false);
  //   defaultApi.writeLog('openMic and muteFalse');
  // }

  if (typeof idx === 'undefined') {
    idx = 0;
  } // try {
  //   dataReport.deviceChange({
  //     device: 2,
  //     device_state: bEnable ? 1 : 0
  //   });
  // } catch (e){};


  return callMethod$4('EnableMic', {
    bEnable: bEnable,
    idx: idx
  });
};
/**
 * @function 是否推声音
 * @param mute:Boolean true/不推声音,false/推声音,必选
 * @return Promise | void
 */

var setMuteStreamAudio = function setMuteStreamAudio(mute) {
  return callMethod$4('MuteStreamAudio', {
    mute: mute
  });
};
/**
 * @function 是否推画面
 * @param mute:Boolean true/不推画面,false/推画面,必选
 * @return Promise | void
 */

var setMuteStreamVideo = function setMuteStreamVideo(mute) {
  return callMethod$4('MuteStreamVideo', {
    mute: mute
  });
};
/**
 * @function 获取音频设备
 * @param deviceType:Number 音频设备类型,0 -> 麦克风,1 -> 扬声器,必选
 * @return Promise | void
 */

var getAudioDeviceList = function getAudioDeviceList(deviceType) {
  return callMethod$4('GetAudioDeviceList', {
    deviceType: deviceType,
    // 这个参数是 C++ 要使用的引用参数,随便传个整型就行
    device_count: 0
  });
};
/**
 * @function 指定音频设备
 * @param deviceType:Number 音频设备类型,0 -> 麦克风,1 -> 扬声器,必选
 * @param deviceId:String 音频设备 id,必选
 * @return Promise | void
 */

var setAudioDevice = function setAudioDevice(deviceType, deviceId) {
  if (deviceType == 0) {
    window.zbyAVSDK_device_checker_init.microphone.use = deviceId;
  } else {
    window.zbyAVSDK_device_checker_init.speaker.use = deviceId;
  }

  return callMethod$4('SetAudioDevice', {
    deviceType: deviceType,
    pszDeviceID: deviceId
  }).then(function (result) {
    if (deviceType == 1 && result.code === 0) {
      NOTICE.speakerChanged({
        deviceId: deviceId
      });
    }

    return result;
  });
};
/**
 * 获取当前扬声器设备id
 * @return {String} 当前扬声器设备id
 */

var getCurrentSpeakerDevice = function getCurrentSpeakerDevice() {
  defaultApi$1.writeLog("avsdk ZEGO::getSpeakerDevice ".concat(usingAudioDeviceId.speaker));
  return usingAudioDeviceId.speaker;
};
/**
 * @function 获取扬声器列表
 * @return Promise | void
 */


var getSpeakerDeviceList = async function getSpeakerDeviceList() {
  var defaultSpeakerId = JSON.parse((await getDefaultSpeaker()).msg).ret.deviceId;
  var speakerListArr = JSON.parse((await getAudioDeviceList(1)).msg).ret;
  var speakerList = [];

  for (var i = 0, len = speakerListArr.length; i < len; i++) {
    speakerList.push({
      deviceId: speakerListArr[i].szDeviceId,
      deviceName: speakerListArr[i].szDeviceName,
      isDefault: defaultSpeakerId === speakerListArr[i].szDeviceId
    });
    deviceListReport.speakerList[speakerListArr[i].szDeviceId] = speakerListArr[i].szDeviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.speaker) {
    window.zbyAVSDK_device_checker_init.speaker = {};
  }

  window.zbyAVSDK_device_checker_init.speaker.hasTest = true;
  window.zbyAVSDK_device_checker_init.speaker.list = speakerList;
  return speakerList;
};
/**
 * @function 指定扬声器
 * @param deviceId:String 扬声器 id,必选
 * @param operationType:String 操作类型,可选
 * 'device_error' -> 设备出错处理,'plug_and_unplug' -> 热插拔处理,
 * 不传即是普通的设置扬声器设备的行为
 * @return Promise | void
 */

var setSpeakerDevice$1 = async function setSpeakerDevice(args) {
  defaultApi$1.writeLog("".concat(JSON.stringify(args), "----setSpeakerDevice-zego----")); // console.log('hsghsghsg999',args);

  var deviceId = args.deviceId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      code = args.code,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var speakerData;

  if (!deviceId) {
    speakerData = await getSpeakerDeviceList(); // console.log('hsghsghsg0',speakerData.length);

    if (speakerData.length) {
      var hasGetSpeaker = false; // console.log('hsghsghsg1',hasGetSpeaker);

      var _iteratorNormalCompletion2 = true;
      var _didIteratorError2 = false;
      var _iteratorError2 = undefined;

      try {
        for (var _iterator2 = speakerData[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
          var item = _step2.value;

          if (item.isDefault) {
            deviceId = item.deviceId;
            deviceName = item.deviceName;
            hasGetSpeaker = true;
            break;
          }
        } // console.log('hsghsghsg2',hasGetSpeaker);

      } catch (err) {
        _didIteratorError2 = true;
        _iteratorError2 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
            _iterator2.return();
          }
        } finally {
          if (_didIteratorError2) {
            throw _iteratorError2;
          }
        }
      }

      if (!hasGetSpeaker) {
        deviceId = speakerData[0].deviceId;
        deviceName = speakerData[0].deviceName; // console.log('hsghsghsg91',deviceId);
      }
    } else {
      deviceId = '';
    }

    if (deviceId === '') {
      NOTICE.noDevice({
        deviceType: 'speaker'
      });
    }
  } // console.log('hsghsghsg999',deviceId);


  try {
    dataReport$2.setDevice({
      device_type: 3,
      device_id: deviceId,
      device_name: deviceListReport.speakerList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? deviceState + 1 : '-'
    });
    window.zbyAVSDK_device_checker_init.speaker.name = deviceListReport.speakerList[deviceId];
  } catch (e) {}

  ;
  usingAudioDeviceId.speaker = deviceId;
  await setAudioDevice(1, deviceId);

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!speakerData) {
      speakerData = await getSpeakerDeviceList();
      deviceName = deviceListReport.speakerList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'speaker',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: speakerData,
      message: code,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }
};
/**
 * @function 获取扬声器音量
 * @return Promise | void
 */

var getSpeakerDeviceVolume = function getSpeakerDeviceVolume() {
  return callMethod$4('GetSpeakerDeviceVolume', {
    deviceId: usingAudioDeviceId.speaker
  });
};
/**
 * @function 设置扬声器音量
 * @param volume:Number 扬声器音量,必选
 * @return Promise | void
 */

var setSpeakerDeviceVolume = function setSpeakerDeviceVolume(volume) {
  return callMethod$4('SetSpeakerDeviceVolume', {
    deviceId: usingAudioDeviceId.speaker,
    volume: volume
  });
};
/**
 * @function 设置扬声器静音
 * @param mute:Boolean 必选
 * @return Promise | void
 */

var setSpeakerDeviceMute = function setSpeakerDeviceMute(mute) {
  // try {
  //   dataReport.deviceChange({
  //     device: 3,
  //     device_state: mute ? 0 :1
  //   });
  // } catch (e){};
  return callMethod$4('SetSpeakerDeviceMute', {
    deviceId: usingAudioDeviceId.speaker,
    mute: mute
  });
};
/**
 * @function 获取麦克风列表
 * @return Promise | void
 */

var getMicrophoneDeviceList = async function getMicrophoneDeviceList() {
  var defaultMicrophoneId = JSON.parse((await getDefaultMicrophone()).msg).ret.deviceId;
  var microphoneListArr = JSON.parse((await getAudioDeviceList(0)).msg).ret;
  var microphoneList = [];

  for (var i = 0, len = microphoneListArr.length; i < len; i++) {
    microphoneList.push({
      deviceId: microphoneListArr[i].szDeviceId,
      deviceName: microphoneListArr[i].szDeviceName,
      isDefault: defaultMicrophoneId === microphoneListArr[i].szDeviceId
    });
    deviceListReport.micList[microphoneListArr[i].szDeviceId] = microphoneListArr[i].szDeviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.microphone) {
    window.zbyAVSDK_device_checker_init.microphone = {};
  }

  window.zbyAVSDK_device_checker_init.microphone.hasTest = true;
  window.zbyAVSDK_device_checker_init.microphone.list = microphoneList;
  return microphoneList;
};
/**
 * @function 指定麦克风
 * @param deviceId:String 麦克风 id,必选
 * @param operationType:String 操作类型,可选
 * 'device_error' -> 设备出错处理,'plug_and_unplug' -> 热插拔处理,
 * 不传即是普通的设置麦克风设备的行为
 * @return Promise | void
 */

var setMicrophoneDevice$1 = async function setMicrophoneDevice(args) {
  defaultApi$1.writeLog("".concat(JSON.stringify(args), "----setMicrophoneDevice-zego----"));
  var deviceId = args.deviceId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      code = args.code,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var microPhoneData;

  if (!deviceId) {
    microPhoneData = await getMicrophoneDeviceList();

    if (microPhoneData.length) {
      var hasGetMicrophone = false;
      var _iteratorNormalCompletion3 = true;
      var _didIteratorError3 = false;
      var _iteratorError3 = undefined;

      try {
        for (var _iterator3 = microPhoneData[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
          var item = _step3.value;

          if (item.isDefault) {
            deviceId = item.deviceId;
            deviceName = item.deviceName;
            hasGetMicrophone = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError3 = true;
        _iteratorError3 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
            _iterator3.return();
          }
        } finally {
          if (_didIteratorError3) {
            throw _iteratorError3;
          }
        }
      }

      if (!hasGetMicrophone) {
        deviceId = microPhoneData[0].deviceId;
        deviceName = microPhoneData[0].deviceName;
      }
    } else {
      deviceId = '';
    }

    if (deviceId === '') {
      NOTICE.noDevice({
        deviceType: 'microphone'
      });
    }
  }

  try {
    dataReport$2.setDevice({
      device_type: 2,
      device_id: deviceId,
      device_name: deviceListReport.micList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? deviceState + 1 : '-'
    });
    window.zbyAVSDK_device_checker_init.microphone.name = deviceListReport.micList[deviceId];
  } catch (e) {}

  ;
  usingAudioDeviceId.microphone = deviceId;
  await setAudioDevice(0, deviceId);
  await setAudioVolumeNotify(0, deviceId);

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!microPhoneData) {
      microPhoneData = await getMicrophoneDeviceList();
      deviceName = deviceListReport.micList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'microphone',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: microPhoneData,
      message: code,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }
};
/**
 * @function 获取麦克风音量
 * @return Promise | void
 */

var getMicDeviceVolume = function getMicDeviceVolume() {
  return callMethod$4('GetMicDeviceVolume', {
    deviceId: usingAudioDeviceId.microphone
  });
};
/**
 * @function 设置麦克风音量
 * @param volume:Number 麦克风音量,必选
 * @return Promise | void
 */

var setMicDeviceVolume = function setMicDeviceVolume(volume) {
  return callMethod$4('SetMicDeviceVolume', {
    deviceId: usingAudioDeviceId.microphone,
    volume: volume
  });
};
/**
 * @function 设置麦克风静音
 * @param mute:Boolean 必选
 * @return Promise | void
 */

var setMicDeviceMute = function setMicDeviceMute(mute) {
  return callMethod$4('SetMicDeviceMute', {
    deviceId: usingAudioDeviceId.microphone,
    mute: mute
  });
}; //设置采集扬声器声音

var setAudioSpeakerCapture$1 = async function setAudioSpeakerCapture(bEnable) {
  return callMethod$4('EnableMixSystemPlayout', {
    bEnable: bEnable
  });
}; // //采集扬声器
// export const setAudioSpeakerCapture2 = async (bEnable) => {
//   return callMethod('MixEnginePlayout', {
//     bEnable,
//   });
// };

/**
 * @function 获取当前应用程序音量
 * @return Promise | void
 */

var getSpeakerSimpleVolume = function getSpeakerSimpleVolume() {
  return callMethod$4('GetSpeakerSimpleVolume', {
    deviceId: usingAudioDeviceId.speaker
  });
};
/**
 * @function 设置视频预览载体 view
 * @param idx:Number 直播通道,可选,默认为 0
 * @return Promise | void
 */

var setPreviewView = function setPreviewView(idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$4('SetPreviewView', {
    idx: idx
  });
};
/**
 * @function 设置本地预览视频视图的模式
 * @param mode:Number 模式,必选,0 | 1 | 2
 * 0:等比缩放,可能有黑边
 * 1:等比缩放填充整View,可能有部分被裁减
 * 2:填充整个View
 * @param idx:Number 直播通道,可选,默认为 0
 * @return Promise | void
 */

var setPreviewViewMode = function setPreviewViewMode(mode, idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$4('SetPreviewViewMode', {
    mode: mode,
    idx: idx
  });
};
/**
 * @function 开启预览
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var startPreview$1 = function startPreview(idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$4('StartPreview', {
    idx: idx
  });
};
/**
 * @function 停止预览
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var stopPreview$1 = function stopPreview(idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$4('StopPreview', {
    idx: idx
  });
};
/**
 * @function 设置当前应用程序音量
 * @param volume:Number 应用程序音量,必选
 * @return Promise | void
 */

var setSpeakerSimpleVolume = function setSpeakerSimpleVolume(volume) {
  return callMethod$4('SetSpeakerSimpleVolume', {
    deviceId: usingAudioDeviceId.speaker,
    volume: volume
  });
};
/**
 * @function 设置当前应用程序静音
 * @param mute:Boolean 是否静音,必选
 * @return Promise | void
 */

var setSpeakerSimpleMute = function setSpeakerSimpleMute(mute) {
  return callMethod$4('SetSpeakerSimpleMute', {
    deviceId: usingAudioDeviceId.speaker,
    mute: mute
  });
};
/**
 * @function 开启本地或者远程的视频视图
 * @param isLocal:Boolean 是否是本地的视频预览,必选
 * @param streamId:String 要拉取的视频流的 id,可选,只有拉取远程的视频流的时候才是必选的
 * @param domId:String <video> 标签的 id,可选
 * 如果传了 domId,就把视频绑定到对应的 <video> 标签上
 * @return Promise 可从 Promise 中获取 src,Promise.then((src) => {})
 */

var startLocalOrRemotePreview$1 = async function startLocalOrRemotePreview(isLocal, streamId, domId, isTeacherNewWindowPreview) {
  defaultApi$1.writeLog("".concat(streamId, "----streamId-zego----"));
  var playChannel = null;
  var isUpdateChromeVersion = await util.getChromeVersion(); // zego 的本地视频预览必须使用 -1 通道,为了与远程的视频预览兼容使用,此处需要判断是否是本地预览

  if (isLocal) {
    playChannel = -1;
  } else {
    playChannel = streamIdToPreviewId$1[streamId];
  }

  var externalConstraints = {
    audio: false,
    video: {
      mandatory: {
        chromeMediaSource: 'external',
        chromeMediaSourceId: "ems://zego/".concat(isLocal || isTeacherNewWindowPreview ? -1 : streamId),
        maxWidth: 3840,
        maxHeight: 2160,
        minWidth: 240,
        minHeight: 180
      }
    }
  };
  defaultApi$1.writeLog("avsdk ZEGO::startLocalOrRemotePreview streamId: ".concat(streamId, " uiChnIndex: ").concat(playChannel));
  return new Promise(function (resolve, reject) {
    var handleExternalSuccess = function handleExternalSuccess(stream) {
      defaultApi$1.writeLog("".concat(stream, "----stream-zego----"));

      stream.oninactive = function () {
        defaultApi$1.writeLog('Stream inactive');
      };

      var src = isUpdateChromeVersion ? stream : window.URL.createObjectURL(stream);

      if (domId && document.querySelector(domId)) {
        if (isUpdateChromeVersion) {
          document.querySelector(domId).srcObject = src;
        } else {
          document.querySelector(domId).src = src;
        }
      }

      defaultApi$1.writeLog("setVidoeSrc, streamId:".concat(streamId, ", domId: ").concat(domId, ", src: ").concat(src));
      resolve(src);
    };

    var handleExternalError = function handleExternalError(error) {
      if (error.name === 'ConstraintNotSatisfiedError') {
        console.error('ConstraintNotSatisfiedError');
      } else if (error.name === 'PermissionDeniedError') {
        console.error('Permissions have not been granted to use your camera and ' + 'microphone, you need to allow the page access to your devices in ' + 'order for the demo to work.');
      }

      console.error("getUserMedia error: ".concat(error.name), error);

      if (domId) {
        document.querySelector(domId).src = '';
      }

      reject('');
    };

    if (navigator.webkitGetUserMedia) {
      navigator.webkitGetUserMedia(externalConstraints, handleExternalSuccess, handleExternalError);
    }
  });
};
/**
 * @function 设置本地预览以及推流的视频帧率
 * @param nFps:Number 帧率,必选
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var setVideoFPS = function setVideoFPS(nFps, idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$4('SetVideoFPS', {
    nFps: nFps,
    idx: idx
  });
};
/**
 * @function 设置本地预览以及推流的视频码率
 * @param nBitrate:Number 码率,必选
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var setVideoBitrate = function setVideoBitrate(nBitrate, idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$4('SetVideoBitrate', {
    nBitrate: nBitrate,
    idx: idx
  });
};
/**
 * @function 设置本地预览以及推流的音频码率
 * @param bitrate:Number 码率,必选
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var setAudioBitrate = function setAudioBitrate(bitrate, idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$4('SetAudioBitrate', {
    bitrate: bitrate,
    idx: idx
  });
};
/**
 * @function 设置本地预览的视频分辨率
 * @param nWidth:Number 分辨率宽,必选
 * @param nHeight:Numnber 分辨率高,必选
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var setCameraParam$1 = async function setCameraParam(nWidth, nHeight, idx) {
  defaultApi$1.writeLog("avsdk ZEGO::setCameraParam ".concat(nWidth, "--").concat(nHeight));
  await enableCamera(false);
  await setVideoCaptureResolution(nWidth, nHeight, idx);
  return enableCamera(true);
};
/**
 * @function 设置本地预览的视频分辨率
 * @param nWidth:Number 分辨率宽,必选
 * @param nHeight:Numnber 分辨率高,必选
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var setVideoCaptureResolution = async function setVideoCaptureResolution(nWidth, nHeight, idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  await setCapturePipelineScaleMode();
  return callMethod$4('SetVideoCaptureResolution', {
    nWidth: nWidth,
    nHeight: nHeight,
    idx: idx
  });
};
var setCapturePipelineScaleMode = function setCapturePipelineScaleMode() {
  return callMethod$4('SetCapturePipelineScaleMode', {
    scaleMode: 1
  });
};
/**
 * @function 设置推流的视频分辨率
 * @param nWidth:Number 分辨率宽,必选
 * @param nHeight:Numnber 分辨率高,必选
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var setVideoEncodeResolution = function setVideoEncodeResolution(nWidth, nHeight, idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$4('SetVideoEncodeResolution', {
    nWidth: nWidth,
    nHeight: nHeight,
    idx: idx
  });
};
/**
 * @function 初始化
 * @param args:Object
 * {
 *   extensionVersion,    // String,扩展版本号,必选
 *   appId,               // String,Zego 秘钥,必选
 *   appSignature,        // String,签名,必选
 *   businessType,        // Number,业务类型,必选
 *   userId,              // Number,用户 id,必选
 *   userName,            // String,用户名,必选
 *   roomId,              // String,频道(房间) id,必选
 *   nNetType             // Number,网络类型,可选,默认为 1
 * }
 * classMode  0:小组课及其他   1:小班课  2:组合小班课
 * @return Promise
 */

var init$1 = async function init(args) {
  defaultApi$1.writeLog("avsdk ZEGO::init ".concat(JSON.stringify(args)));
  currentRole = args.role;
  currentClassMode = args.classMode;
  currentGroupSdkType = args.sdkTypeGroup;
  localStreamId = args.streamId;
  teacherId = args.teacherId;
  lecturerStreamId = typeof args.lecturerStreamId === 'string' ? args.lecturerStreamId.toUpperCase() : null;
  lecturerUid = typeof lecturerStreamId === 'string' ? lecturerStreamId.split('_')[2] : null;
  dataReport$2.setRealSDKType('zego');
  await loadZego(args.extensionVersion);

  if (args.role === 'teacher' && args.mode === 1) {
    //坐立模式开启外部采集器,站立关闭外部采集器,只有小组课坐立模式才会调用,通过这个把rtmp数据给到zego或者rtc(头像),开启了外部采集,zego不会再本地采集数据
    await setVideoCaptureFactory(true);
  } // if (args.classMode === 1 || args.classMode === 2){
  //   //如果是小班课保证关闭外部采集器,小组课上一步打开
  //   await setVideoCaptureFactory(false);
  // };
  // 注册回调


  addListener$2(args.userId, args.userName, args.confId, args.nNetType, args.devices, args.role); //rtc同屏以及高光时刻,都开启音频外部采集,默认传1

  if (args.role === 'teacher') {
    defaultApi$1.writeLog('avsdk ZEGO::init_ open setAudioAuxSource');

    if (args.classMode === 1 || args.classMode === 2) {
      await setAudioAuxSource(1);
    }

    teacherId = null;
  }

  if (args.mode === 1 && (isZegoGroupClass() && (args.role === 'teacher' || args.role === 'assistant') || isZegoCombinationClass() && args.role === 'assistant')) {
    //zego推拉RTMP小组课,授课端坐立模式、辅导端坐立模式 或 zego推拉RTMP组合小班辅导端坐立模式,需要将摄像头渲染模式设置为 内部渲染+外部渲染
    await startEngine(args.appId, args.appSignature, args.businessType, 5); //5为摄像头内部渲染+外部渲染
  } else {
    await startEngine(args.appId, args.appSignature, args.businessType); //默认为摄像头外部渲染
  } //小班课 需要加载采集插件的输入数据,为了拼接zego头像


  if ((args.classMode === 1 || args.classMode === 2) && args.role === 'teacher') {
    screenStreamId = "".concat(window.zby_sdk_init_params.institutionId, "_").concat(args.roomId, "_").concat(args.userId, "_").concat(args.live_id, "_1");
    loadCollectionInputEntry();
  }

  ;

  if (args.noiseSuppressMode == -2) {
    defaultApi$1.writeLog("noiseSuppressMode \u5173\u95ED\u566A\u58F0\u6D88\u9664 ".concat(args.noiseSuppressMod));
    await setEnableNoiseSuppress(false);
  } else if (args.noiseSuppressMode == -1) {
    defaultApi$1.writeLog("noiseSuppressMode \u7531\u5E95\u5C42\u8FDB\u884C\u914D\u7F6E\uFF0Cjs\u5C42\u4E0D\u8FDB\u884C\u914D\u7F6E ".concat(args.noiseSuppressMode));
  } else {
    defaultApi$1.writeLog("noiseSuppressMode \u542F\u52A8\u566A\u97F3\u6D88\u9664,\u6A21\u5F0F\u4E3A\uFF1A ".concat(args.noiseSuppressMode));
    await setEnableNoiseSuppress(true);
    await setNoiseSuppressMode(+args.noiseSuppressMode);
    await enableTransientNoiseSuppress(true);
  }

  ; //aecMode为-1是关闭回音消除,云控下传

  if (args.aecMode == -2) {
    defaultApi$1.writeLog("aecMode \u5173\u95ED\u56DE\u97F3\u6D88\u9664 ".concat(args.aecMode));
    await setEnableAEC(false);
  } else if (args.aecMode == -1) {
    defaultApi$1.writeLog("aecMode \u7531\u5E95\u5C42\u8FDB\u884C\u914D\u7F6E\uFF0Cjs\u5C42\u4E0D\u8FDB\u884C\u914D\u7F6E ".concat(args.aecMode));
  } else {
    defaultApi$1.writeLog("aecMode \u542F\u52A8\u56DE\u97F3\u6D88\u9664,\u6A21\u5F0F\u4E3A\uFF1A ".concat(args.aecMode));
    await setEnableAEC(true);
    await setAECMode(+args.aecMode);
  }

  ;
  await setVideoBitrate(args.encodeCaptureBitrate); // await setAudioBitrate(args.encodeCaptureBitrate);

  await setVideoFPS(args.encodeCaptureFps);
  await setVideoCaptureResolution(args.previewResolutionWidth, args.previewResolutionHeight);
  await setVideoEncodeResolution(args.encodedResolutionWidth, args.encodedResolutionHeight);

  if (isZegoGroupClass() && (args.role === 'teacher' || args.role === 'assistant') || isZegoCombinationClass() && args.role === 'assistant') {
    defaultApi$1.writeLog('zego小组课或辅导端组合小班课,用第二路推RTMP流,在pyzx初始化采集参数');
  } else {
    await setVideoBitrate(args.screenSameBitrate, 1);
    await setVideoFPS(args.screenSameFps, 1);
    await setVideoCaptureResolution(args.screenSameResolutionWidth, args.screenSameResolutionHeight, 1);
    await setVideoEncodeResolution(args.screenSameResolutionWidth, args.screenSameResolutionHeight, 1);
  } // await setVideoBitrate(500000);
  // await setAudioBitrate(500000);
  // await setVideoFPS(15);
  // await setVideoCaptureResolution(1280, 720);
  // await setVideoEncodeResolution(1280, 720);


  await setSoundLevelMonitorCycle(500);
  startPullingStreamObserver();

  if (isInitFinished) {
    defaultApi$1.writeLog("avsdk ZEGO::init_isInitFinished ".concat(isInitFinished)); // await afterInitSDK(args.userId, args.userName, args.roomId, args.nNetType, JSON.parse(JSON.stringify(args.devices)));

    isInitFinished = 0;
    window.current_sdk_type = 'zego';
    defaultApi$1.writeLog('zego init finished current_sdk_type : zego');
  } else {
    await new Promise(function (resolve, reject) {
      var timer = null;
      timer = setInterval(function () {
        if (isInitFinished) {
          isInitFinished = 0;
          clearInterval(timer);
          resolve();
        }
      }, 30);
    });
    window.current_sdk_type = 'zego';
    defaultApi$1.writeLog('zego init finished current_sdk_type : zego');
  }
};
/**
 * @function 在OnInitSDK事件之后调用的初始化方法
 * @param userId:Number 用户 id,必选
 * @param userName:String 用户名,必选
 * @param roomId:String 频道(房间) id,必选
 * @param nNetType:Number 网络类型,可选,默认为 1
 * @return Promise
 */

var afterInitSDK = async function afterInitSDK(userId, userName, confId, nNetType, devices, role, classMode) {
  // 指定默认设备
  var usedDevices = window.zbyAVSDK_device_checker_init;
  var _devices = {
    camera: devices && devices.camera || usedDevices && usedDevices.camera && usedDevices.camera.use || '',
    microphone: devices && devices.microphone || usedDevices && usedDevices.microphone && usedDevices.microphone.use || '',
    speaker: devices && devices.speaker || usedDevices && usedDevices.speaker && usedDevices.speaker.use || ''
  };
  defaultApi$1.writeLog('avsdk ZEGO::afterInitSDK');
  await setDefaultDevice$1(_devices, 'default');
  await loginChannel(userId, userName, confId, nNetType); //设置拉流质量监控周期

  await setPlayQualityMoniterCycle(5000);
  await setPublishQualityMoniterCycle(5000);
  await setMediaSideFlags();
  defaultApi$1.writeLog("test: isZegoGroupClass, ".concat(isZegoGroupClass()));

  if (isZegoGroupClass() && (role === 'teacher' || role === 'assistant') || isZegoCombinationClass() && role === 'assistant') {
    defaultApi$1.writeLog("avsdk ZEGO::afterInitSDK zegoRtmp, classMode: ".concat(classMode, " role: ").concat(role));
  } else {
    // 初始化的时候不打开摄像头
    await enableCamera(false); // 只有调用了这个方法之后才开启关闭摄像头才有效

    await startPreview$1();
  } // 置为 1 表示初始化完成


  isInitFinished = 1;
};

var deviceCheckerInitSDK = async function deviceCheckerInitSDK() {
  defaultApi$1.writeLog('avsdk ZEGO::deviceCheckerInitSDK');
  await enableCamera(false);
  await startPreview$1();
  isDeviceCheckInitFinished = 1;
};

var getDeviceCheckInitStatus = function getDeviceCheckInitStatus() {
  return isDeviceCheckInitFinished;
};

var setDeviceCheckInitStatus = function setDeviceCheckInitStatus() {
  isDeviceCheckInitFinished = 0;
}; //设置是否发送sei


var setMediaSideFlags = function setMediaSideFlags() {
  var bStart = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
  var bOnlyAudioPublish = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  var mediaInfoType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
  var seiSendType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
  var idx = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
  return callMethod$4('SetMediaSideFlags', {
    bStart: bStart,
    bOnlyAudioPublish: bOnlyAudioPublish,
    mediaInfoType: mediaInfoType,
    seiSendType: seiSendType,
    idx: idx
  });
}; //设置拉流质量监控周期


var setPlayQualityMoniterCycle = function setPlayQualityMoniterCycle(timeInMS) {
  return callMethod$4('SetPlayQualityMoniterCycle', {
    timeInMS: timeInMS
  });
}; //设置推流质量监控周期


var setPublishQualityMoniterCycle = function setPublishQualityMoniterCycle(timeInMS) {
  return callMethod$4('SetPublishQualityMoniterCycle', {
    timeInMS: timeInMS
  });
};
/**
 * @function 设置默认的硬件设备,包括摄像头、麦克风以及扬声器
 * @return Promise
 */


var setDefaultDevice$1 = async function setDefaultDevice(devices, operationType) {
  // 设置默认的摄像头
  if (devices && devices.camera) {
    if (zbyAVSDK_device_checker_init.camera.list.length == 0) {
      await getVideoDeviceList();
    }

    await setVideoDevice({
      deviceId: devices.camera,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var cameraData = await getVideoDeviceList();

    if (cameraData.length) {
      var hasSetCamera = false;
      var _iteratorNormalCompletion4 = true;
      var _didIteratorError4 = false;
      var _iteratorError4 = undefined;

      try {
        for (var _iterator4 = cameraData[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
          var item = _step4.value;

          if (item.isDefault) {
            await setVideoDevice({
              deviceId: item.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetCamera = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError4 = true;
        _iteratorError4 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
            _iterator4.return();
          }
        } finally {
          if (_didIteratorError4) {
            throw _iteratorError4;
          }
        }
      }

      if (!hasSetCamera) {
        await setVideoDevice({
          deviceId: cameraData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  } // 设置默认的麦克风


  if (devices && devices.microphone) {
    if (zbyAVSDK_device_checker_init.microphone.list.length == 0) {
      await getMicrophoneDeviceList();
    }

    await setMicrophoneDevice$1({
      deviceId: devices.microphone,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var microPhoneData = await getMicrophoneDeviceList();

    if (microPhoneData.length) {
      var hasSetMicrophone = false;
      var _iteratorNormalCompletion5 = true;
      var _didIteratorError5 = false;
      var _iteratorError5 = undefined;

      try {
        for (var _iterator5 = microPhoneData[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
          var _item = _step5.value;

          if (_item.isDefault) {
            await setMicrophoneDevice$1({
              deviceId: _item.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetMicrophone = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError5 = true;
        _iteratorError5 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
            _iterator5.return();
          }
        } finally {
          if (_didIteratorError5) {
            throw _iteratorError5;
          }
        }
      }

      if (!hasSetMicrophone) {
        await setMicrophoneDevice$1({
          deviceId: microPhoneData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  } // 设置默认的扬声器


  if (devices && devices.speaker) {
    await setSpeakerDevice$1({
      deviceId: devices.speaker,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var speakerData = await getSpeakerDeviceList();

    if (speakerData.length) {
      var hasSetSpeaker = false;
      var _iteratorNormalCompletion6 = true;
      var _didIteratorError6 = false;
      var _iteratorError6 = undefined;

      try {
        for (var _iterator6 = speakerData[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
          var _item2 = _step6.value;

          if (_item2.isDefault) {
            await setSpeakerDevice$1({
              deviceId: _item2.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetSpeaker = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError6 = true;
        _iteratorError6 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion6 && _iterator6.return != null) {
            _iterator6.return();
          }
        } finally {
          if (_didIteratorError6) {
            throw _iteratorError6;
          }
        }
      }

      if (!hasSetSpeaker) {
        await setSpeakerDevice$1({
          deviceId: speakerData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  }
};
/**
 * 
 * @param {number} type 0:接管模式,输出头像视频;1:非接管模式,输出播放器视频 
 * @returns 
 */

var setVideoCallback = function setVideoCallback(type) {
  defaultApi$1.writeLog("avsdk ZEGO::setVideoCallback type: ".concat(type));
  return callMethod$4('SetVideoCallback', {
    type: type
  });
};
/**
 * @function 开始推流
 * @param title:String 直播的名称,可选,默认为 ''
 * @param flag:Number 直播属性,可选,默认为 0
 * @param seq:Number 请求序号,可选,默认为 0
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */


var startPublish2 = async function startPublish2(streamid, idx, title, flag, seq) {
  var streamId = streamid || window.zbyAVSDK_init_params.zego.streamId;

  if (typeof title === 'undefined') {
    title = 'none';
  }

  if (typeof flag === 'undefined') {
    flag = 0;
  }

  if (typeof seq === 'undefined') {
    seq = 0;
  }

  if (typeof idx === 'undefined') {
    idx = 0;
  }

  await new Promise(function (resolve, reject) {
    var timer = setInterval(function () {
      if (hasLoginChannel) {
        clearInterval(timer);
        resolve();
      }
    }, 30);
  });
  var res = await callMethod$4('StartPublish2', {
    pszStreamID: streamId,
    pszTitle: title,
    seq: seq,
    idx: idx,
    flag: flag
  });
  await startSoundLevelMonitor();
  await new Promise(function (resolve, reject) {
    var timer = setInterval(function () {
      if (hasPushFlow) {
        clearInterval(timer);
        resolve();
      }
    }, 300);
  }); // 心跳开始

  if (!isFirstHeartBeatReport$1) {
    isFirstHeartBeatReport$1 = true;
    heartBeatDataReport$1('start');
  }

  return res;
};
/**
 * @function 结束推流
 * @param msg:String 自定义信息,server 对接流结束回调包含此字段内容,可选,默认为 'none'
 * @param flag:Number 直播属性,可选,默认为 0
 * @param idx:Number 推流通道,可选,默认为 0
 * @return Promise | void
 */

var stopPublish = function stopPublish(idx, msg, flag) {
  if (typeof msg === 'undefined') {
    msg = 'none';
  }

  if (typeof flag === 'undefined') {
    flag = 0;
  }

  if (typeof idx === 'undefined') {
    idx = 0;
  } // try {
  //   dataReport.stopPublish({publish_streamid:window.zbyAVSDK_init_params.zego.streamId});
  // } catch (error) {}


  return callMethod$4('StopPublish', {
    pszMsg: msg,
    flag: flag,
    idx: idx
  });
};
/**
 * @function 初始化拉流
 * @param streamId:String 从传来的信道消息中获取,必选
 * @param domId:String <video> 标签的 id,可选
 * 如果传了就把视频绑定到对应的 <video> 标签上
 * @param pInfo:String 多媒体流附加信息,可选,默认为 'none'
 * @return src:String 视频预览地址
 */

var initPullFlow$1 = async function initPullFlow(streamId, domId, mute, pInfo, notAutoPlay, audioOnly) {
  defaultApi$1.writeLog("ZEGO:: initPullFlow_start ,streamId :".concat(streamId));
  var playChannel;
  resetStreamIdRtcPlayerInfo1$1(streamId);
  resetStreamIdRtcPlayerInfo$1(streamId);

  try {
    if (!isFirstHeartBeatReport$1) {
      isFirstHeartBeatReport$1 = true;
      heartBeatDataReport$1('start');
    }
  } catch (error) {}

  if (streamIdToPreviewId$1[streamId] == undefined) {
    defaultApi$1.writeLog("ZEGO::  The streamId queue does not contain this streamId ".concat(uiChnIndexs));
    var arr = streamId.split('_');

    var _arr = _slicedToArray(arr, 3),
        userId = _arr[2];

    if (String(userId).toUpperCase() === String(lecturerUid)) {
      playChannel = arr.length === 4 ? 0 : 1; // 主流使用0,辅流使用1
    } else {
      if (uiChnIndexs.length === 0) {
        defaultApi$1.writeLog('error', "ZEGO:: all uiChnIndexs are used ".concat(uiChnIndexs));
        delete streamIdRtcPlayerInfo$1[streamId];
        NOTICE.overMaxConnect({
          streamId: streamId,
          message: 'reach max connect'
        });
        return {
          videoSrc: '',
          playerId: -2
        };
      }

      playChannel = uiChnIndexs.pop();
    }

    streamIdToPreviewId$1[streamId] = playChannel;
    defaultApi$1.writeLog("streamIdIsNoExited ".concat(playChannel, " ").concat(uiChnIndexs));
  } else {
    playChannel = streamIdToPreviewId$1[streamId];
    defaultApi$1.writeLog("ZEGO::  The streamId queue contains this streamId ".concat(playChannel, " ").concat(uiChnIndexs));
    await stopPlayStream(streamId);
    resetStreamIdRtcPlayerInfo$1(streamId);
  } // 判断是否创建或者获取播放通道成功,不成功就删掉重试


  if (playChannel == undefined) {
    delete streamIdToPreviewId$1[streamId];
    defaultApi$1.writeLog('error', 'ZEGO::  uiChnIndex is not exist'); // delete streamIdToBlobUrl[streamId];

    return initPullFlow(streamId, domId, mute, pInfo, notAutoPlay, audioOnly);
  }

  previewIdToStreamId[playChannel] = streamId; //是否拉取声音

  activateAudioPlayStream(streamId, !!!mute); //是否拉取画面

  activateVideoPlayStream(streamId, !!!audioOnly);

  if (!notAutoPlay) {
    await playStream(streamId, playChannel, pInfo);
  }

  var videoSrc = await startLocalOrRemotePreview$1(false, streamId, domId);
  return {
    videoSrc: videoSrc,
    playerId: playChannel
  };
};
/**
 * @function 恢复拉指定的流
 * @param streamId:String 被拉取的流的 id,必选
 * @param uiChnIndex:Number 播放通道,可选
 * @param pInfo:String 多媒体流附加信息,可选,默认为 'none'
 * @return Promise | void
 */

var playStream = function playStream(streamId, uiChnIndex, pInfo) {
  if (typeof uiChnIndex === 'undefined') {
    uiChnIndex = streamIdToPreviewId$1[streamId];
  }

  if (typeof pInfo === 'undefined') {
    pInfo = 'none';
  }

  defaultApi$1.writeLog("avsdk ZEGO::PlayStream streamId: ".concat(streamId, " uiChnIndex: ").concat(uiChnIndex));
  pullingStore.setData(streamId, {
    info: pInfo
  });
  return callMethod$4('PlayStream', {
    pszStreamID: streamId,
    uiChnIndex: uiChnIndex,
    pInfo: pInfo
  });
};
/**
 * 判断是否回收通道
 * @param {number} id 
 */

var isCollectChannel = function isCollectChannel(id) {
  return typeof id === 'number' && !uiChnIndexs.includes(id) && id !== 0 && // 主讲主流不回收
  id !== 1; // 主讲辅流不回收
};
/**
 * @function 停止拉指定的流
 * @param streamId:String 被拉取的流的 id,必选
 * @param recovery:Boolean 是否回收播放器, 可选
 * @return Promise | void
 */


var stopPlayStream = async function stopPlayStream(streamId, recovery) {
  var id = streamIdToPreviewId$1[streamId];
  delete streamIdRtcPlayerInfo$1[streamId];

  if (recovery && isCollectChannel(id)) {
    uiChnIndexs.push(id);
    defaultApi$1.writeLog("avsdk ZEGO::stopPlayStream streamId: ".concat(streamId, " id: ").concat(id, " uiChnIndexs: ").concat(uiChnIndexs));
    delete streamIdToPreviewId$1[streamId]; // delete streamIdToBlobUrl[streamId];
  }

  pullingStore.delete(streamId);
  return callMethod$4('StopPlayStream', {
    pszStreamID: streamId
  });
};
/**
 * @function 停止并回收所有拉流
 * @return Promise | void
 */

var stopAllPlayStream = function stopAllPlayStream() {
  var toRecoveryArr = [];

  for (var streamId in streamIdToPreviewId$1) {
    if (streamIdToPreviewId$1.hasOwnProperty(streamId)) {
      var id = streamIdToPreviewId$1[streamId];

      if (isCollectChannel(id)) {
        uiChnIndexs.push(id);
      }

      pullingStore.delete(streamId);
      toRecoveryArr.push(callMethod$4('StopPlayStream', {
        pszStreamID: streamId
      }));
    }
  }

  defaultApi$1.writeLog("avsdk ZEGO::stopAllPlayStream uiChnIndexs: ".concat(uiChnIndexs));
  streamIdToPreviewId$1 = {};
  return Promise.all(toRecoveryArr);
};
/**
 * @function 切换播放流
 * @param streamId:String 需要停止流的 id,必选
 * @param toStreamId:String 被拉取的流的 id,必选
 * @param toDomId:String <video> 标签的 id,可选
 * @return Promise | void
 */

var changePullFlow$1 = async function changePullFlow(streamId, toStreamId, toDomId) {
  await stopPlayStream(streamId, true);
  return initPullFlow$1(toStreamId, toDomId);
};
/**
 * @function 转推,录课
 * @param type:String 必选,'start' | 'stop'
 * @param seq:Number 可选,默认为 1
 * @return Promise | void
 */

var mixStream = function mixStream(type, args, seq) {
  if (!args) {
    var zego = window.zbyAVSDK_init_params.zego;
    var streamId = zego.streamId;
    var sid = zego.sid;
    var pInputStreamList;
    var nInputStreamCount;

    if (type === 'start') {
      pInputStreamList = [{
        szStreamID: streamId,
        layout: {
          top: 0,
          right: zego.previewResolutionWidth,
          bottom: zego.previewResolutionHeight,
          left: 0
        },
        uSoundLevelID: 0,
        nContentControl: 0
      }];
      nInputStreamCount = 1;
    }

    if (type === 'stop') {
      pInputStreamList = [];
      nInputStreamCount = 0;
    }

    if (typeof seq === 'undefined') {
      seq = 1;
    }

    return callMethod$4('MixStream', {
      config: {
        szOutputStream: zego.recordUrl + '/' + sid,
        bOutputIsUrl: true,
        nOutputFps: zego.previewCaptureFps,
        nOutputBitrate: zego.previewCaptureBitrate,
        nOutputAudioBitrate: zego.previewCaptureBitrate,
        nOutputWidth: zego.previewResolutionWidth,
        nOutputHeight: zego.previewResolutionHeight,
        nOutputAudioConfig: 1,
        pInputStreamList: pInputStreamList,
        nInputStreamCount: nInputStreamCount,
        pUserData: '',
        nLenOfUserData: 0,
        nChannels: 0,
        nOutputBackgroundColor: 0,
        pOutputBackgroundImage: '',
        bWithSoundLevel: false
      },
      seq: seq
    });
  } else {
    return callMethod$4('MixStream', args);
  }
};
/**
 * @function 是否拉取音频流--通过流id控制
 * @param streamId:String 被拉取的流的 id,必选
 * @param bActive:Boolean true -> 拉取,false -> 不拉取,必选
 * @return Promise | void
 */

var activateAudioPlayStream = function activateAudioPlayStream(streamId, bActive) {
  streamIdRtcPlayerInfo1$1[streamId].audio_type = bActive;
  return callMethod$4('ActivateAudioPlayStream', {
    nChannelIdx: streamIdToPreviewId$1[streamId],
    bActive: bActive
  });
};
/**
 * @function 是否拉取音频流--通过播放器id控制
 * @param operation:Boolean,必选,true -> 拉取,false -> 不拉取,必选
 * @param playerId:Number,必选,播放器id
 * @return Promise | void
 */

var pullAudioFlow$1 = function pullAudioFlow(playerId, operation, streamid) {
  defaultApi$1.writeLog("pullAudioFlow -- playerId ".concat(playerId, " operation ").concat(operation, " streamId ").concat(streamid));

  if (streamid) {
    if (streamIdToPreviewId$1[streamid] == undefined) {
      NOTICE.pullAudioFlowError({
        streamid: streamid
      });
      return;
    } else {
      playerId = streamIdToPreviewId$1[streamid];
      defaultApi$1.writeLog("pullAudioFlow-playerId ".concat(playerId));
    }
  }

  var streamId = previewIdToStreamId[playerId];

  try {
    streamIdRtcPlayerInfo1$1[streamId].audio_type = operation;
    defaultApi$1.writeLog("pullAudioFlow ".concat(streamId));
  } catch (e) {
    defaultApi$1.writeLog("pullAudioFlow ".concat(streamId, " --error ").concat(JSON.stringify(e)), null, 'error');
  }

  try {
    dataReport$2.setPullVoice({
      code: +operation,
      pull_uid: util.getUidByStreamId(streamId),
      pull_streamid: streamId,
      playerId: playerId // operator:'client'

    });
  } catch (e) {}

  ;
  return callMethod$4('ActivateAudioPlayStream', {
    bActive: operation,
    nChannelIdx: playerId
  });
};
/**
 * @function 是否拉取画面流
 * @param streamId:String 被拉取的流的 id,必选
 * @param bActive:Boolean true -> 拉取,false -> 不拉取,必选
 * @return Promise | void
 */

var activateVideoPlayStream = function activateVideoPlayStream(streamId, bActive) {
  try {
    streamIdRtcPlayerInfo1$1[streamId].video_type = bActive;
    defaultApi$1.writeLog("activateVideoPlayStream ".concat(streamId));
  } catch (e) {
    defaultApi$1.writeLog("activateVideoPlayStream ".concat(streamId, " --error ").concat(JSON.stringify(e)), null, 'error');
  }

  return callMethod$4('ActivateVideoPlayStream', {
    nChannelIdx: streamIdToPreviewId$1[streamId],
    bActive: bActive
  });
};
/**
 * @function 开启/关闭麦克风音量回调
 * @param open:Boolean true -> 开启,false -> 关闭,必选
 * @return void
 */

var openMicVolumeCb$1 = function openMicVolumeCb(open) {// if (open) {
  //   runMicVolumeCb = true;
  // } else {
  //   runMicVolumeCb = false;
  // }
};
/**
 * @function 监听设备的音量变化
 * @param deviceType:Number 音频设备类型,0 -> 麦克风,1 -> 扬声器,必选
 * @param deviceId:String 音频设备 id,必选
 * @return Promise | void
 */

var setAudioVolumeNotify = function setAudioVolumeNotify(deviceType, deviceId) {
  return callMethod$4('SetAudioVolumeNotify', {
    deviceType: deviceType,
    deviceId: deviceId
  });
};
/**
 * @function 关闭监听设备的音量变化
 * @param deviceType:Number 音频设备类型,0 -> 麦克风,1 -> 扬声器,必选
 * @param deviceId:String 音频设备 id,必选
 * @return Promise | void
 */

var stopAudioVolumeNotify = function stopAudioVolumeNotify(deviceType, deviceId) {
  return callMethod$4('StopAudioVolumeNotify', {
    deviceType: deviceType,
    deviceId: deviceId
  });
};
/**
 * @function 启动 soundLevel 监听
 * StartSoundLevelMonitor 后一定要 StopSoundLevelMonitor
 * @return Promise | void
 */

var startSoundLevelMonitor = function startSoundLevelMonitor() {
  return callMethod$4('StartSoundLevelMonitor', {});
};
/**
 * @function 停止 soundLevel 监听
 * @return Promise | void
 */

var stopSoundLevelMonitor = function stopSoundLevelMonitor() {
  return callMethod$4('StopSoundLevelMonitor', {});
};
/**
 * @function 设置 soundLevel 的监控周期
 * @param timeInMS:Number 时间周期,单位为毫秒,取值范围 [100, 3000],必选
 * @return Promise | void
 */

var setSoundLevelMonitorCycle = function setSoundLevelMonitorCycle(timeInMS) {
  return callMethod$4('SetSoundLevelMonitorCycle', {
    timeInMS: timeInMS
  });
};
/**
 * @function 单路录制
 * @param type:String start/stop,必选
 * @param szOutputStream:转推地址(支持rtmp/avertp),必选
 * @param szStreamID:推流ID,必选
 * @return Promise | void
 */

/*export const singleRecord = async (type, szOutputStream, szStreamID, seq = 1) => {
  defaultApi.writeLog(`avsdk ZEGO::singleRecord szStreamID: ${szStreamID} szOutputStream: ${szOutputStream} type: ${type}`);
  const zego = window.zbyAVSDK_init_params.zego;
  let pInputStreamList = [];
  let nInputStreamCount = 0;
  if (type === 'start') {
    pInputStreamList = [{
      szStreamID,
      layout: {
        top: 0,
        right: zego.previewResolutionWidth,
        bottom: zego.previewResolutionHeight,
        left: 0
      },
      uSoundLevelID: 0,
      nContentControl: 0
    }];
    nInputStreamCount = 1;
  }
  return callMethod('MixStream', {
    config: {
      szOutputStream,
      bOutputIsUrl: true,
      nOutputFps: zego.previewCaptureFps,
      nOutputBitrate: zego.previewCaptureBitrate,
      nOutputAudioBitrate: zego.previewCaptureBitrate,
      nOutputWidth: zego.previewResolutionWidth,
      nOutputHeight: zego.previewResolutionHeight,
      nOutputAudioConfig: 1,
      pInputStreamList,
      nInputStreamCount,
      pUserData: '',
      nLenOfUserData: 0,
      nChannels: 0,
      nOutputBackgroundColor: 0,
      pOutputBackgroundImage: '',
      bWithSoundLevel: false
    },
    seq
  });
};
*/

var hasStream$1 = function hasStream(streamId) {
  return Object.keys(streamIdToPreviewId$1).includes(streamId);
};
/**
 * @function 获取当前视频流的通道
 * @param  streamId 流 id
 * @return channelIndex
 */

var getChannelIndex = function getChannelIndex(streamId) {
  defaultApi$1.writeLog("ZEGO : getChannelIndex  streamId: ".concat(streamId, " ").concat(JSON.stringify(streamIdToPreviewId$1)));
  return streamIdToPreviewId$1[streamId];
};
/**
 * @function 获取当前视频流所有的通道
 * @param  streamId 流 id
 * @return channelIndex
 */

var getAllChannelIndex = function getAllChannelIndex() {
  defaultApi$1.writeLog("ZEGO : getAllChannelIndex ".concat(JSON.stringify(streamIdToPreviewId$1)));
  return streamIdToPreviewId$1;
};
/**
 * @function 录制转推对外接口
 * @param type:String start/stop,必选
 * @param szOutputStream:转推地址(支持rtmp/avertp),必选
 * @param szStreamID:推流ID,必选
 * @return Promise | void
 */

var singleRecord = async function singleRecord(type, szOutputStream, szStreamID) {
  defaultApi$1.writeLog("avsdk ZEGO::recordPublishTarget szStreamID: ".concat(szStreamID, " szOutputStream: ").concat(szOutputStream, " type: ").concat(type));
  var zego = window.zbyAVSDK_init_params.zego;

  if (!szOutputStream) {
    var sid = zego.sid; // 拼接转推地址

    szOutputStream = zego.recordUrl + '/' + sid;
  }

  if (!szStreamID) {
    szStreamID = window.zbyAVSDK_init_params.zego.streamId;
  }

  if (type === 'start') {
    return addPublishTarget(szOutputStream, szStreamID);
  }

  if (type === 'stop') {
    return deletePublishTarget(szOutputStream, szStreamID);
  }
};
/**
 * @function 开始转推
 * @param szTarget:转推地址(支持rtmp/avertp),必选
 * @param szStreamID:推流ID,必选
 * @return Promise | void
 */

var addPublishTarget = async function addPublishTarget(szTarget, szStreamID) {
  defaultApi$1.writeLog("avsdk ZEGO::addPublishTarget szStreamID: ".concat(szStreamID, " szTarget: ").concat(szTarget));
  var res = await callMethod$4('AddPublishTarget', {
    strTarget: szTarget,
    pszStreamID: szStreamID
  });

  try {
    dataReport$2.turnPushResult({
      errorcode: res == 0 ? 0 : 1,
      case: 'turn push',
      streamid: szStreamID
    });
  } catch (e) {}

  ;
  return res;
};
/**
 * @function 结束转推
 * @param szTarget:转推地址(支持rtmp/avertp),必选
 * @param szStreamID:推流ID,必选
 * @param seqNum
 * @return Promise | void
 */

var deletePublishTarget = async function deletePublishTarget(szTarget, szStreamID) {
  defaultApi$1.writeLog("avsdk ZEGO::deletePublishTarget szStreamID: ".concat(szStreamID, " szTarget: ").concat(szTarget));
  return callMethod$4('DeletePublishTarget', {
    strTarget: szTarget,
    pszStreamID: szStreamID
  });
};
/**
 * @function 开始本地视频录制
 * @param enableRecord 开始/结束
 * @param storagePath 录制路径
 * @return Promise | void
 */

var localRecordVideo$1 = async function localRecordVideo(enableRecord, storagePath) {
  defaultApi$1.writeLog("avsdk ZEGO::localRecordVideo enableRecord: ".concat(enableRecord, ", storagePath: ").concat(storagePath));

  if (enableRecord) {
    return callMethod$4('StartRecord', {
      channelIndex: 0,
      recordType: 3,
      enableStatusCallback: true,
      interval: 3000,
      recordFormat: 2,
      isFragment: false,
      storagePath: storagePath
    });
  } else {
    return callMethod$4('StopRecord', {
      channelIndex: 0
    });
  }
};
/**
 * @function 本地音频录制
 * @param enableRecord 开始/结束
 * @param storagePath 录制路径
 * @return Promise | void
 */

var localRecordAudio$1 = async function localRecordAudio(enableRecord, storagePath) {
  defaultApi$1.writeLog("avsdk ZEGO::localRecordAudio enableRecord: ".concat(enableRecord, ", storagePath: ").concat(storagePath));
  return callMethod$4('EnableSelectedAudioRecord', {
    uMask: 1,
    nSampleRate: 16000,
    nChannels: 1,
    enableRecord: enableRecord,
    storagePath: storagePath
  });
};
var setRecordPath = async function setRecordPath() {
  var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  var path = arguments.length > 1 ? arguments[1] : undefined;
  defaultApi$1.writeLog("avsdk ZEGO::setRecordPath idx: ".concat(idx, ", path: ").concat(path));
  return callMethod$4('SetRecordPath', {
    idx: idx,
    path: path
  });
};
var getRecordPath = async function getRecordPath() {
  var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  defaultApi$1.writeLog("avsdk ZEGO::getRecordPath idx: ".concat(idx));
  return callMethod$4('GetRecordPath', {
    idx: idx
  });
};
var getDesktopPath = function getDesktopPath() {
  defaultApi$1.writeLog('avsdk ZEGO::getDesktopPath');
  return callMethod$4('GetDesktopPath', {});
};
/**
 * @function 本地录制
 * @param {string | undefined} fileName 
 * @param {number} fileType 1:flv 2:mp4
 * @param {number} idx 0:主流 1:辅流 2:RTMP流
 * @returns {Promise<any>}
 */

var startCaptureRecord = async function startCaptureRecord(fileName, fileType, idx, path) {
  defaultApi$1.writeLog("avsdk ZEGO::startCaptureRecord fileName: ".concat(fileName, ", fileType: ").concat(fileType, ", idx: ").concat(idx, ", path: ").concat(path));
  await setRecordPath(idx, path);
  await startRecord(fileName, fileType, idx);
  await startCapture(idx);
};
var stopCaptureRecord = async function stopCaptureRecord(idx) {
  defaultApi$1.writeLog("avsdk ZEGO::stopCaptureRecord idx: ".concat(idx));
  await stopCapture(idx);
  await stopRecord(idx);
};
/**
 * @function 本地录制
 * @param {string | undefined} fileName 
 * @param {number} fileType 1:flv 2:mp4
 * @param {number} idx 0:主流 1:辅流 2:RTMP流
 * @returns {Promise<any>}
 */

var startRecord = async function startRecord(fileName, fileType, idx) {
  defaultApi$1.writeLog("avsdk ZEGO::startRecord fileName: ".concat(fileName, ", fileType: ").concat(fileType, ", idx: ").concat(idx));

  if (idx === 1 && !screenStreamId) {
    defaultApi$1.writeLog('avsdk ZEGO::startRecord screenStreamId is null', null, 'error');
    return;
  }

  if (!fileName) {
    var fileNameMap = [localStreamId, screenStreamId, 'rtmp'];
    var base = fileNameMap[idx] || "record-".concat(idx);
    fileName = "".concat(base, "-").concat(util.currentTimeString().replace(/:/g, '-'));
  }

  dataReport$2.startRecord({
    fileName: fileName,
    fileType: fileType,
    idx: idx
  });
  return callMethod$4('StartRecord2', {
    idx: idx,
    recordType: 3,
    // 1:音频 2:视频 3:音视频
    fileName: fileName,
    recordFormat: fileType
  });
};
/**
 * 结束音视频录制 channelIndex(number) 录制通道  0主推流通道/ 1辅助推流通道/ 2辅助推流通道
 * @param {number} idx 0 | 1 | 2
 * @returns 
 */


var stopRecord = async function stopRecord(idx) {
  defaultApi$1.writeLog("avsdk ZEGO::stopRecord idx: ".concat(idx));
  dataReport$2.stopRecord({
    idx: idx
  });
  return callMethod$4('StopRecord', {
    idx: idx
  });
};
/**
 * 开启外部音频采集(通知sdk)推流前,调用此接口,publish_channel,number类型,传2代表第三路流
 * @param {number} idx 0 | 1 | 2
 * @returns 
 */


var startCapture = async function startCapture(idx) {
  defaultApi$1.writeLog("avsdk ZEGO::startCapture idx: ".concat(idx));
  return callMethod$4('StartCapture', {
    publish_channel: idx
  });
};
/**
 * 结束外部音频采集(通知sdk)
 * @param {number} idx 0 | 1 | 2
 * @returns 
 */


var stopCapture = async function stopCapture(idx) {
  defaultApi$1.writeLog("avsdk ZEGO::stopCapture idx: ".concat(idx));
  return callMethod$4('StopCapture', {
    publish_channel: idx
  });
};
/**
 * @function 设置外部采集设备模块
 * @param  bUseVideoCapture  是否开启外部采集设备模块
 * @attention  必须在  InitSDK  前调用,置空必须在UninitSDK之后
 * @return Promise | void
 */


var setVideoCaptureFactory = function setVideoCaptureFactory() {
  var bUseVideoCapture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  var streamChannel = arguments.length > 1 ? arguments[1] : undefined;
  defaultApi$1.writeLog('info', 'avsdk ZEGO::setVideoCaptureFactory');
  return callMethod$4('SetVideoCaptureFactory', {
    bUseVideoCapture: bUseVideoCapture,
    streamChannel: streamChannel
  });
}; //设置音频数据来源


var setAudioAuxSource = function setAudioAuxSource(source) {
  defaultApi$1.writeLog('info', 'avsdk ZEGO::setAudioAuxSource');
  return callMethod$4('SetAudioAuxSource', {
    source: source
  });
};

var setVideoSource = function setVideoSource(idx, srcType) {
  return callMethod$4('SetVideoSource', {
    idx: idx,
    srcType: srcType
  });
}; //RTC同屏 辅助通道音频类型  0:静音 / 1:麦克风  / 2:拉流的声音  / 3:1+2 / 4:麦克风+扬声器 / 5:扬声器(不含拉流)


var setAUXAudioType = function setAUXAudioType(type) {
  defaultApi$1.writeLog('info', 'avsdk ZEGO::SetAUXAudioType');
  return callMethod$4('SetAUXAudioType', {
    type: type
  });
}; //录制通道音频类型  0:静音 / 1:麦克风  / 2:拉流的声音  / 4:1+2 / 8:麦克风+扬声器(不含拉流)


var setThirdAudioType = function setThirdAudioType(type) {
  defaultApi$1.writeLog('info', 'avsdk ZEGO::SetThirdAudioType');
  return callMethod$4('SetThirdAudioType', {
    type: type
  });
}; //开启音频外部采集 参数:channel   参数类型:int 通道(传1使用辅通道)


var startAudioExCapture = function startAudioExCapture(channel) {
  defaultApi$1.writeLog('info', 'avsdk ZEGO::startAudioExCapture');
  return callMethod$4('StartAudioExCapture', {
    channel: channel
  });
}; // 开关麦克风录制数据回调
// enable: 是否开启回调
// sampleRate: 采样率,默认 48000
// channels: 声道数,默认 1


var enableMicRecordDataCallback = function enableMicRecordDataCallback() {
  var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  var sampleRate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 48000;
  var channels = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;

  if (typeof enable !== 'boolean') {
    defaultApi$1.writeLog('avsdk ZEGO::enableMicRecordDataCallback enable type error', null, 'error');
    return Promise.reject(new Error('enable should be boolean'));
  }

  if (!Number.isInteger(sampleRate) || sampleRate <= 0) {
    defaultApi$1.writeLog('avsdk ZEGO::enableMicRecordDataCallback sampleRate type error', null, 'error');
    return Promise.reject(new Error('sampleRate should be positive integer'));
  }

  if (!Number.isInteger(channels) || channels <= 0) {
    defaultApi$1.writeLog('avsdk ZEGO::enableMicRecordDataCallback channels type error', null, 'error');
    return Promise.reject(new Error('channels should be positive integer'));
  }

  defaultApi$1.writeLog('info', 'avsdk ZEGO::enableMicRecordDataCallback');
  return callMethod$4('EnableMicRecordDataCallback', {
    enable: enable,
    sampleRate: sampleRate,
    channels: channels
  });
};
/**
 * 第四路流类型设置
 * @param {number} type 6: 视频:主流 音频:麦克风+扬声器 7: 外部音频源,外部视频源,数据来源player
 * @returns 
 */


var setFourthStreamType = function setFourthStreamType(type) {
  return callMethod$4('SetFourthStreamType', {
    type: type
  });
}; //加载截屏插件


var LoadCollectionOutputEntry2 = function LoadCollectionOutputEntry2() {
  defaultApi$1.writeLog('info', 'avsdk ZEGO::LoadCollectionOutputEntry2');
  return callMethod$4('LoadCollectionOutputEntry2', {});
}; //开启同屏


var startMultiScreen = async function startMultiScreen() {
  defaultApi$1.writeLog('info', 'avsdk ZEGO::startMultiScreen'); // await setVideoCaptureFactory(true,1);

  await LoadCollectionOutputEntry2();
};
/**
 * @function 设置推流时是否发送视频数据
 * @param  mute  true不发送(仅预览),false  发送
 * @param  idx  推流通道索引  0表示主推流通道,默认;1表示第二路流推流通道,无法推出声音
 * @return Promise | void (0代表设置成功,否则设置失败)
 */


var muteVideoPublish = function muteVideoPublish() {
  var mute = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
  var idx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  return callMethod$4('MuteVideoPublish', {
    mute: mute,
    idx: idx
  });
};
/**
 * @function 开始连麦
 * @param mode:number 采集器默认, 默认0=站立 1=坐立
 * @return Promise | void
 */


var teacherStartLinkMic$1 = async function teacherStartLinkMic() {
  var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;

  if (mode === 0) {
    await muteVideoPublish(true, 0);
    await setMicrophoneDevice$1({});
    await enableMic(true);
  } else {
    //开始连麦后,需要打开摄像头(开启外部采集器后,不会争抢摄像头),否则学生拉到的小班流会没有画面
    await enableCamera(true);
    await enableMic(true);
  }
};
/**
 * @function 结束连麦
 * @param mode:number 采集器默认, 默认0=站立 1=坐立
 * @return Promise | void
 */

var teacherStopLinkMic$1 = async function teacherStopLinkMic() {// if (mode === 0) {
  //   await muteVideoPublish(false,0);
  // } else {
  //   await setVideoCaptureFactory(false);
  // }

  var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
};
/**
  * @function 设置镜像状态(预览)
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
  */

var setMirrorStatus$1 = function setMirrorStatus(isMirror) {
  // return callMethod('SetPreViewMirror', { isMirror });
  return setVideoMirrorMode(isMirror >> 0);
};
/**
  * @function 设置拉流镜像状态
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
  */

var setPlayViewMirror = function setPlayViewMirror(isMirror) {
  return callMethod$4('SetPlayViewMirror', {
    isMirror: isMirror
  });
};
/**
  * @function 设置推流镜像状态
  * @param { boolean } id 采集器Id
  * @param { 0 | 1 | 2 | 3 } mode 0: 预览启用镜像,推流不启用镜像; 1: 预览启用镜像,推流启用镜像; 2: 预览不启用镜像,推流不启用镜像; 3: 预览不启用镜像,推流启用镜像
  * @return: Promise
  */

var setVideoMirrorMode = function setVideoMirrorMode(mode) {
  var idx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  var realId = mode == 0 ? 2 : 1;
  defaultApi$1.writeLog("ZEGO: setVideoMirrorMode, mode: ".concat(mode, ", idx:").concat(idx, ", realId:").concat(realId));
  return callMethod$4('SetVideoMirrorMode', {
    idx: idx,
    mode: realId
  });
}; //美颜相关

/**
 * @deprecated
  * @function 开启美颜
  * @return: Promise
*/

var startSenseMe$1 = async function startSenseMe() {
  return callMethod$4('StartSenseMe', {});
};
/**
 * @deprecated
  * @function 设置美颜参数
  * * @param { number } type  //美颜类型,1、红润强度,3、磨皮强度,4、美白强度,5、大眼,6、瘦脸,7、小脸,8、对比度强度,9、饱和度强度
  * * @param { number } value //美颜数值,有效值范围0~100
  * @return: Promise
*/

var setBeautifyParam$1 = async function setBeautifyParam(type, value) {
  return callMethod$4('SetBeautifyParam', {
    type: type,
    value: value
  });
};
/**
 * @deprecated
  * @function 关闭美颜
  * @return: Promise
*/

var endSenseMe$1 = async function endSenseMe() {
  return callMethod$4('EndSenseMe', {});
};
var enableBeautify = function enableBeautify(enable) {
  var streamId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : localStreamId;
  var idx = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  defaultApi$1.writeLog("avsdk ZEGO::enableBeautify enable: ".concat(enable, " idx: ").concat(idx));
  return callMethod$4('EnableBeautify', {
    enable: enable,
    streamId: streamId,
    idx: idx
  });
};
/**
 * 
 * @param {number} mode 美颜类型 101:美白、103:磨皮、201:瘦脸、605:背景虚化、901:自定义背景、202:大眼、603:锐化
 * @param {number} subMode  美白模式【0,2,3】,当前选项:0,
                            磨皮:【1,2】,当前选项:1
                            瘦脸:【0】,
                            背景虚化:【0,1】、当前选项:1
                            自定义背景:【0】、
                            大眼:【0】
                            锐化:【0】
 * @param {number} value  美白: 默认30 ,0表示不美白;
                          磨皮:默认 74, 0表示不磨皮;
                          瘦脸:默认 11, 0表示不瘦脸
                          背景虚化:默认值 0, 0表示不虚化
                          自定义背景:默认值0;非0表示设置背景(当前设计不支持用户自定义背景,)
                          大眼:默认值13,0表示不做大眼
                          锐化:默认值0,0表示不锐化
 * @param {string} streamId  流id
 * @param {string | undefined} image  自定义背景图片地址
 * @returns 
 */

var setBeautifyParam2 = function setBeautifyParam2(mode, subMode, value) {
  var streamId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : localStreamId;
  var idx = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
  var image = arguments.length > 5 ? arguments[5] : undefined;
  defaultApi$1.writeLog("avsdk ZEGO::setBeautifyParam param: ".concat(JSON.stringify({
    mode: mode,
    subMode: subMode,
    value: value,
    streamId: streamId,
    idx: idx,
    image: image
  })));
  return callMethod$4('SetBeautifyParam', {
    mode: mode,
    subMode: subMode,
    value: value,
    streamId: streamId,
    idx: idx,
    image: image
  });
};
/**
 * 
 * @param {'UseLoopbackDefault' | 'UseDefaultDevice'} key 
 * @param {'enable'} value 
 * @returns 
 */

var setEngineConfig = function setEngineConfig(key, value) {
  defaultApi$1.writeLog("avsdk ZEGO::setEngineConfig key: ".concat(key, ", value: ").concat(value));
  return callMethod$4('SetEngineConfig', {
    key: key,
    value: value
  });
};
/**
  * @function zego40路拉流混音接口
  * * @param { number } mixMode //混流模式  0=关闭混流  1=开启混流
  * * @param { array } streamIdArr //表示要突出声音的channel
  * * @param { number } mixNum //表示要突出channel的个数, 需要与参数'channels'的数组大小相同
  * @return: Promise
*/

var setAudioMixMode = async function setAudioMixMode(mixMode, streamIdArr) {
  var channelsArr = [];

  if (streamIdArr.length > 0) {
    streamIdArr.forEach(function (item) {
      channelsArr.push(getChannelIndex(item));
    });
  }

  return callMethod$4('SetAudioMixMode', {
    mixMode: mixMode,
    channels: channelsArr,
    num: channelsArr.length
  });
}; // 获取TalMedia.dll版本号

var getSDKVersion$1 = async function getSDKVersion() {
  return callMethod$4('GetSDKVersion', {}).then(function (e) {
    return JSON.parse(e.msg).ret;
  });
};
/**
 * @function 获取摄像头所支持的分辨率
 * @param deviceId:String 设备id
 * @return Promise | void
 */

var getCameraSupportedRes$1 = function getCameraSupportedRes(deviceId) {
  return callMethod$4('GetCameraSupportedResolution', {
    deviceId: deviceId
  });
};
/**
 * @function 发送SEI
 * @param inData: String  需要传输的音视频次要信息数据,外部输入。
 * @param dataLen: Number     数据长度,不能超过 4096 bytes
 * @param bPacket: Bool   是否采用外部打包好的包头,填写 false。
 * @param idx:Number 推流通道 index
 * 调用频率不能超过帧率,假设推流采用默认帧率15 fps,即调用频率不能超过 1000/15=66.7 ms/次。
 */

var sendMediaSideInfo$1 = function sendMediaSideInfo(info) {
  return callMethod$4('SendMediaSideInfo', {
    inData: info,
    dataLen: info.length,
    bPacket: false,
    idx: 0
  });
}; //判断当前课型是否为zego推拉RTMP小组课

var isZegoGroupClass = function isZegoGroupClass() {
  defaultApi$1.writeLog("test: isZegoGroupClass--currentClassMode--currentGroupSdkType', ".concat(currentClassMode, ", ").concat(currentGroupSdkType));
  return currentClassMode == 0 && currentGroupSdkType == 'zego'
  /*rtmp流为zego*/
  ;
}; //判断当前课型是否为zego推拉RTMP组合小班课

var isZegoCombinationClass = function isZegoCombinationClass() {
  console.log('test: isZegoCombinationClass--currentClassMode--currentGroupSdkType', currentClassMode, currentGroupSdkType);
  return currentClassMode == 2 && currentGroupSdkType == 'zego'
  /*rtmp流为zego*/
  ;
}; //判断推流类型是否为音频流

var isStreamAudioMuted = function isStreamAudioMuted() {
  return callMethod$4('IsStreamAudioMuted', {});
}; //判断推流类型是否为视频流

var isStreamVideoMuted = function isStreamVideoMuted() {
  return callMethod$4('IsStreamVideoMuted', {});
};
/**
 * 获取麦克风响度
 * @returns {Promise<number>}
 */

var getMicrophoneLoudness = function getMicrophoneLoudness() {
  return callMethod$4('GetMicrophonLoudness', {});
};
/**
 * 获取默认扬声器id
 * @returns {Promise<string | null>}
 */

var getCurrentSpeakerId = function getCurrentSpeakerId() {
  return callMethod$4('GetCurrentSpeakerId', {}).then(function (e) {
    if (e.code === 0) {
      return JSON.parse(e.msg).speakerCurId;
    } else {
      return null;
    }
  });
};
/**
 * 获取默认麦克风id
 * @returns {Promise<string | null>}
 */

var getCurrentMicrophoneId = function getCurrentMicrophoneId() {
  return callMethod$4('GetCurrentMicrophoneId', {}).then(function (e) {
    if (e.code === 0) {
      return JSON.parse(e.msg).microphoneCurId;
    } else {
      return null;
    }
  });
};
/**
 * 获取默认摄像头id
 * @returns {Promise<string | null>}
 */

var getCurrentCameraId = function getCurrentCameraId() {
  return callMethod$4('GetCurrentCameraId', {}).then(function (e) {
    if (e.code === 0) {
      return JSON.parse(e.msg).cameraCurId;
    } else {
      return null;
    }
  });
};
var takeLocalSnapShot = function takeLocalSnapShot() {
  var streamId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : localStreamId;
  var idx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  return callMethod$4('takeLocalSnapShot', {
    streamId: streamId,
    idx: idx
  });
};
var takeRemoteSnapShot = function takeRemoteSnapShot(streamId) {
  return callMethod$4('takeRemoteSnapShot', {
    streamId: streamId
  });
};
var getStreamType = async function getStreamType() {
  try {
    var pushAudio = JSON.parse((await isStreamAudioMuted()).msg).ret;
    var pushVideo = JSON.parse((await isStreamVideoMuted()).msg).ret;
    var stream_type = 'both';

    if (pushAudio && !pushVideo) {
      stream_type = 'video';
    }

    if (!pushAudio && pushVideo) {
      stream_type = 'audio';
    }

    if (pushAudio && pushVideo) {
      stream_type = 'none';
    }

    return stream_type;
  } catch (e) {
    var _stream_type = 'none';
    return _stream_type;
  }
};
var heartBeatRealKeys$1 = ['video_fps', 'video_bitrate', 'audio_fps', 'audio_bitrate'];

var _heartBeatDataReport$1 = function _heartBeatDataReport() {
  var pullInfo = [];
  Object.keys(streamIdRtcPlayerInfo$1).forEach(function (streamid) {
    heartBeatRealKeys$1.forEach(function (realKey) {
      if (!streamIdRtcPlayerInfo$1[streamid].hasOwnProperty(realKey)) {
        streamIdRtcPlayerInfo$1[streamid][realKey] = [];
      }
    }); //获取拉流类型,后期可写为函数提出去

    if (streamIdRtcPlayerInfo1$1[streamid].audio_type && streamIdRtcPlayerInfo1$1[streamid].video_type) {
      streamIdRtcPlayerInfo1$1[streamid].stream_type = 'both';
    } else if (!streamIdRtcPlayerInfo1$1[streamid].audio_type && streamIdRtcPlayerInfo1$1[streamid].video_type) {
      streamIdRtcPlayerInfo1$1[streamid].stream_type = 'video';
    } else if (streamIdRtcPlayerInfo1$1[streamid].audio_type && !streamIdRtcPlayerInfo1$1[streamid].video_type) {
      streamIdRtcPlayerInfo1$1[streamid].stream_type = 'audio';
    } else {
      streamIdRtcPlayerInfo1$1[streamid].stream_type = 'none';
    }

    pullInfo.push(_objectSpread({
      streamid: streamid
    }, streamIdRtcPlayerInfo$1[streamid], {
      pull_type: streamIdRtcPlayerInfo1$1[streamid].stream_type,
      volume: streamIdRtcPlayerInfo$1[streamid].volume.slice(0, streamIdRtcPlayerInfo$1[streamid].volume.length - 1)
    }));
    resetStreamIdRtcPlayerInfo$1(streamid);
  });

  if (isFirstHeartBeatReport$1) {
    try {
      //获取推流类型,后期可写为函数提出去
      if (zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
        zbysdk$1.deviceStatus.stream_type = 'both';
      } else if (!zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
        zbysdk$1.deviceStatus.stream_type = 'audio';
      } else if (zbysdk$1.deviceStatus.camera && !zbysdk$1.deviceStatus.microphone) {
        zbysdk$1.deviceStatus.stream_type = 'video';
      } else {
        zbysdk$1.deviceStatus.stream_type = 'none';
      }

      ;
      defaultApi$1.writeLog("push_type_zego,camera: ".concat(zbysdk$1.deviceStatus.camera, ",microphone: ").concat(zbysdk$1.deviceStatus.microphone, ",type: ").concat(zbysdk$1.deviceStatus.stream_type, ",a_fps: ").concat(dataZegoCapture.afps, ", a_bit: ").concat(dataZegoCapture.akbps, ", v_fps: ").concat(dataZegoCapture.fps, ", v_bit: ").concat(dataZegoCapture.kbps));
      dataReport$2.heartbeat(_objectSpread({}, _objectSpread({}, heartBeatDataReportObj$1, {
        push_type: zbysdk$1.deviceStatus.stream_type,
        volume: heartBeatDataReportObj$1.volume.slice(0, heartBeatDataReportObj$1.volume.length - 1)
      }), {
        pull_info: pullInfo
      }));
    } catch (e) {
      console.log(e);
    }
  }

  resetHeartBeatDataReportObj$1();
};

var pointer = 0;

var runHeartBeatCalc = function runHeartBeatCalc() {
  Object.keys(streamIdToPreviewId$1).forEach(function (streamId) {
    var data = statsStore.getData(streamId) || {};
    heartBeatDataReportCalc$1('OnPlayQulityUpdate', data, streamId);
  });
  var data = statsStore.getData(localStreamId) || {};
  heartBeatDataReportCalc$1('OnPublishQualityUpdate', data, localStreamId);
  ++pointer;

  if (pointer === heartBeatItemCount) {
    pointer = 0;

    _heartBeatDataReport$1();
  }
};

var heartBeatDataReport$1 = function heartBeatDataReport(type) {
  try {
    if (type === 'start' && !heartBeatDataReportTimer$1) {
      runHeartBeatCalc();
      heartBeatDataReportTimer$1 = setInterval(function () {
        runHeartBeatCalc();
      }, 2 * 1000);
    }

    if (type === 'stop') {
      statsStore.clear();
      clearInterval(heartBeatDataReportTimer$1);
      heartBeatDataReportTimer$1 = null;
    }
  } catch (error) {
    console.error(error);
  }
};

var heartBeatDataReportCalc$1 = function heartBeatDataReportCalc(name, _d, streamid) {
  var ctime = Math.round((new Date().getTime() + dataReport$2.timestamp) / 1000); // 拉流

  var pullKeys = ['fps', 'kbps', 'afps', 'akbps'];

  if (name === 'OnPlayQulityUpdate') {
    if (streamIdRtcPlayerInfo$1 && streamIdRtcPlayerInfo$1.hasOwnProperty(streamid)) {
      var isReport = true; // streamIdRtcPlayerInfo[streamid].count++;

      heartBeatRealKeys$1.forEach(function (realKey, index) {
        if (_d.hasOwnProperty(pullKeys[index])) {
          if (streamIdRtcPlayerInfo$1[streamid][realKey] === undefined) {
            streamIdRtcPlayerInfo$1[streamid][realKey] = [];
            isReport = false;
          } // streamIdRtcPlayerInfo[streamid][realKey].push(parseFloat(parseInt(_d[pullKeys[index]])));

        }
      });

      if (isReport) {
        var audio_fps_zego_pull = 0;
        var audio_bitrate_zego_pull = 0;
        var video_fps_zego_pull = 0;
        var video_bitrate_zego_pull = 0;
        var pull_type = 'none';

        if (streamIdRtcPlayerInfo1$1[streamid].audio_type && streamIdRtcPlayerInfo1$1[streamid].video_type) {
          audio_fps_zego_pull = parseFloat(parseInt(_d.afps || 0));
          audio_bitrate_zego_pull = parseFloat(parseInt(_d.akbps || 0));
          video_fps_zego_pull = parseFloat(parseInt(_d.fps || 0));
          video_bitrate_zego_pull = parseFloat(parseInt(_d.kbps || 0));
          pull_type = 'both';
        } else if (!streamIdRtcPlayerInfo1$1[streamid].audio_type && streamIdRtcPlayerInfo1$1[streamid].video_type) {
          video_fps_zego_pull = parseFloat(parseInt(_d.fps || 0));
          video_bitrate_zego_pull = parseFloat(parseInt(_d.kbps || 0));
          pull_type = 'video';
        } else if (streamIdRtcPlayerInfo1$1[streamid].audio_type && !streamIdRtcPlayerInfo1$1[streamid].video_type) {
          audio_fps_zego_pull = parseFloat(parseInt(_d.afps || 0));
          audio_bitrate_zego_pull = parseFloat(parseInt(_d.akbps || 0));
          pull_type = 'audio';
        }

        streamIdRtcPlayerInfo$1[streamid].audio_fps[pointer] = audio_fps_zego_pull;
        streamIdRtcPlayerInfo$1[streamid].audio_bitrate[pointer] = audio_bitrate_zego_pull;
        streamIdRtcPlayerInfo$1[streamid].video_fps[pointer] = video_fps_zego_pull;
        streamIdRtcPlayerInfo$1[streamid].video_bitrate[pointer] = video_bitrate_zego_pull;
        streamIdRtcPlayerInfo$1[streamid].ctime[pointer] = ctime;
        streamIdRtcPlayerInfo$1[streamid].avtimestampdiff[pointer] = _d.avTimestampDiff || 0;
        streamIdRtcPlayerInfo$1[streamid].pull_loss[pointer] = _d.pktLostRate || 0;
        streamIdRtcPlayerInfo$1[streamid].pull_delay[pointer] = _d.rtt || 0;
        streamIdRtcPlayerInfo$1[streamid].pull_type_ex[pointer] = pull_type;
      }
    }
  } // 推流


  var pushKeys = ['fps', 'kbps', 'afps', 'akbps'];

  if (name === 'OnPublishQualityUpdate') {
    // heartBeatDataReportObj.count++;
    // heartBeatRealKeys.forEach((realKey, index) => {
    //   if (heartBeatDataReportObj.hasOwnProperty(realKey) && _d.hasOwnProperty(pushKeys[index])) {
    //     heartBeatDataReportObj[realKey].push(parseFloat(parseInt(_d[pushKeys[index]])));
    //   }
    // });
    var audio_fps_zego_push = 0;
    var audio_bitrate_zego_push = 0;
    var video_fps_zego_push = 0;
    var video_bitrate_zego_push = 0;
    var push_type = 'none';
    dataZegoCapture = _d;

    if (userAndDeviceStatusInfo.isPushingFlow) {
      if (zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
        audio_fps_zego_push = parseFloat(parseInt(_d.afps || 0));
        audio_bitrate_zego_push = parseFloat(parseInt(_d.akbps || 0));
        video_fps_zego_push = parseFloat(parseInt(_d.fps || 0));
        video_bitrate_zego_push = parseFloat(parseInt(_d.kbps || 0));
        push_type = 'both';
      } else if (!zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
        audio_fps_zego_push = parseFloat(parseInt(_d.afps || 0));
        audio_bitrate_zego_push = parseFloat(parseInt(_d.akbps || 0));
        push_type = 'audio';
      } else if (zbysdk$1.deviceStatus.camera && !zbysdk$1.deviceStatus.microphone) {
        video_fps_zego_push = parseFloat(parseInt(_d.fps || 0));
        video_bitrate_zego_push = parseFloat(parseInt(_d.kbps || 0));
        push_type = 'video';
      }
    }

    heartBeatDataReportObj$1.audio_fps[pointer] = audio_fps_zego_push;
    heartBeatDataReportObj$1.audio_bitrate[pointer] = audio_bitrate_zego_push;
    heartBeatDataReportObj$1.video_fps[pointer] = video_fps_zego_push;
    heartBeatDataReportObj$1.video_bitrate[pointer] = video_bitrate_zego_push;
    heartBeatDataReportObj$1.push_loss[pointer] = _d.pktLostRate || 0;
    heartBeatDataReportObj$1.push_delay[pointer] = _d.rtt || 0;
    heartBeatDataReportObj$1.push_type_ex[pointer] = push_type;
    heartBeatDataReportObj$1.type_backend[pointer] = getBackgroundStatus();
    heartBeatDataReportObj$1.ctime[pointer] = ctime;
  }
}; //推流字段


var resetHeartBeatDataReportObj$1 = function resetHeartBeatDataReportObj() {
  heartBeatDataReportObj$1 = {
    ctime: new Array(heartBeatItemCount).fill(0),
    push_type: 'none',
    video_fps: new Array(heartBeatItemCount).fill(0),
    video_bitrate: new Array(heartBeatItemCount).fill(0),
    audio_fps: new Array(heartBeatItemCount).fill(0),
    audio_bitrate: new Array(heartBeatItemCount).fill(0),
    push_loss: new Array(heartBeatItemCount).fill(0),
    push_delay: new Array(heartBeatItemCount).fill(0),
    push_type_ex: new Array(heartBeatItemCount).fill('none'),
    type_backend: new Array(heartBeatItemCount).fill(0),
    volume: ''
  };
}; //记录拉流类型,用作数据上报


var resetStreamIdRtcPlayerInfo1$1 = function resetStreamIdRtcPlayerInfo1(streamId) {
  streamIdRtcPlayerInfo1$1[streamId] = {
    audio_type: false,
    video_type: false,
    stream_type: 'none'
  };
};

resetHeartBeatDataReportObj$1(); //拉流字段

var resetStreamIdRtcPlayerInfo$1 = function resetStreamIdRtcPlayerInfo(streamId) {
  streamIdRtcPlayerInfo$1[streamId] = {
    pull_uid: util.getUidByStreamId(streamId),
    streamid: streamId,
    ctime: new Array(heartBeatItemCount).fill(0),
    pull_type: streamIdRtcPlayerInfo1$1[streamId].stream_type,
    volume: '',
    video_fps: new Array(heartBeatItemCount).fill(0),
    video_bitrate: new Array(heartBeatItemCount).fill(0),
    audio_fps: new Array(heartBeatItemCount).fill(0),
    audio_bitrate: new Array(heartBeatItemCount).fill(0),
    pull_loss: new Array(heartBeatItemCount).fill(0),
    pull_delay: new Array(heartBeatItemCount).fill(0),
    pull_type_ex: new Array(heartBeatItemCount).fill('none'),
    //音画不同步字段
    avtimestampdiff: new Array(heartBeatItemCount).fill(0),
    // 累加
    audio_ifg: 0,
    video_ifg: 0
  };
}; // AIGC 相关函数


var startAigc = function startAigc(config) {
  // ZEGO SDK 暂不支持 AIGC 功能,返回错误
  return Promise.reject(new Error('ZEGO SDK does not support AIGC functionality'));
};

var stopAigc = function stopAigc() {
  // ZEGO SDK 暂不支持 AIGC 功能,返回错误
  return Promise.reject(new Error('ZEGO SDK does not support AIGC functionality'));
};

var sendAigcMessage = function sendAigcMessage(messageInfo) {
  // ZEGO SDK 暂不支持 AIGC 功能,返回错误
  return Promise.reject(new Error('ZEGO SDK does not support AIGC functionality'));
};

var zegosdk = {
  loadZego: loadZego,
  unloadZego: unloadZego,
  startEngine: startEngine,
  destroyEngine: destroyEngine$1,
  loginChannel: loginChannel,
  logoutChannel: logoutChannel,
  setDefaultDevice: setDefaultDevice$1,
  getVideoDeviceList: getVideoDeviceList,
  setVideoDevice: setVideoDevice,
  enableCamera: enableCamera,
  enableMic: enableMic,
  setAudioSpeakerCapture: setAudioSpeakerCapture$1,
  getAudioDeviceList: getAudioDeviceList,
  setAudioDevice: setAudioDevice,
  getSpeakerDeviceList: getSpeakerDeviceList,
  setSpeakerDevice: setSpeakerDevice$1,
  getCurrentSpeakerDevice: getCurrentSpeakerDevice,
  getSpeakerDeviceVolume: getSpeakerDeviceVolume,
  setSpeakerDeviceVolume: setSpeakerDeviceVolume,
  setSpeakerDeviceMute: setSpeakerDeviceMute,
  getMicrophoneDeviceList: getMicrophoneDeviceList,
  setMicrophoneDevice: setMicrophoneDevice$1,
  getMicDeviceVolume: getMicDeviceVolume,
  setMicDeviceVolume: setMicDeviceVolume,
  setMicDeviceMute: setMicDeviceMute,
  getSpeakerSimpleVolume: getSpeakerSimpleVolume,
  setSpeakerSimpleVolume: setSpeakerSimpleVolume,
  setSpeakerSimpleMute: setSpeakerSimpleMute,
  setPreviewView: setPreviewView,
  startPreview: startPreview$1,
  startLocalOrRemotePreview: startLocalOrRemotePreview$1,
  setVideoFPS: setVideoFPS,
  setVideoBitrate: setVideoBitrate,
  setAudioBitrate: setAudioBitrate,
  setVideoCaptureResolution: setVideoCaptureResolution,
  setCameraParam: setCameraParam$1,
  setVideoEncodeResolution: setVideoEncodeResolution,
  init: init$1,
  setVideoCallback: setVideoCallback,
  startPublish2: startPublish2,
  stopPublish: stopPublish,
  initPullFlow: initPullFlow$1,
  playStream: playStream,
  stopPlayStream: stopPlayStream,
  stopAllPlayStream: stopAllPlayStream,
  changePullFlow: changePullFlow$1,
  mixStream: mixStream,
  leaveRoomWithChangeSDK: leaveRoomWithChangeSDK,
  leaveRoom: leaveRoom$1,
  isZegoGroupClass: isZegoGroupClass,
  isZegoCombinationClass: isZegoCombinationClass,
  activateAudioPlayStream: activateAudioPlayStream,
  pullAudioFlow: pullAudioFlow$1,
  activateVideoPlayStream: activateVideoPlayStream,
  setAudioVolumeNotify: setAudioVolumeNotify,
  stopAudioVolumeNotify: stopAudioVolumeNotify,
  openMicVolumeCb: openMicVolumeCb$1,
  startSoundLevelMonitor: startSoundLevelMonitor,
  stopSoundLevelMonitor: stopSoundLevelMonitor,
  setSoundLevelMonitorCycle: setSoundLevelMonitorCycle,
  singleRecord: singleRecord,
  hasStream: hasStream$1,
  getChannelIndex: getChannelIndex,
  addPublishTarget: addPublishTarget,
  deletePublishTarget: deletePublishTarget,
  localRecordVideo: localRecordVideo$1,
  localRecordAudio: localRecordAudio$1,
  startCaptureRecord: startCaptureRecord,
  stopCaptureRecord: stopCaptureRecord,
  setMirrorStatus: setMirrorStatus$1,
  getStreamType: getStreamType,
  startSenseMe: startSenseMe$1,
  setBeautifyParam: setBeautifyParam$1,
  endSenseMe: endSenseMe$1,
  enableBeautify: enableBeautify,
  setBeautifyParam2: setBeautifyParam2,
  setEngineConfig: setEngineConfig,
  setWaterMark: setWaterMark,
  setPlayViewMirror: setPlayViewMirror,
  setMuteStreamAudio: setMuteStreamAudio,
  setMuteStreamVideo: setMuteStreamVideo,
  teacherStartLinkMic: teacherStartLinkMic$1,
  teacherStopLinkMic: teacherStopLinkMic$1,
  getSDKVersion: getSDKVersion$1,
  getCameraSupportedRes: getCameraSupportedRes$1,
  setAudioMixMode: setAudioMixMode,
  setVideoMirrorMode: setVideoMirrorMode,
  startMultiScreen: startMultiScreen,
  getAllChannelIndex: getAllChannelIndex,
  startAudioExCapture: startAudioExCapture,
  setFourthStreamType: setFourthStreamType,
  sendMediaSideInfo: sendMediaSideInfo$1,
  setVideoSource: setVideoSource,
  setAUXAudioType: setAUXAudioType,
  setThirdAudioType: setThirdAudioType,
  loadCollectionInputEntry2: loadCollectionInputEntry2,
  stopCheckDevice: stopCheckDevice$1,
  addListener: addListener$2,
  getDeviceCheckInitStatus: getDeviceCheckInitStatus,
  setDeviceCheckInitStatus: setDeviceCheckInitStatus,
  setRecordPath: setRecordPath,
  getRecordPath: getRecordPath,
  getDesktopPath: getDesktopPath,
  getMicrophoneLoudness: getMicrophoneLoudness,
  getCurrentSpeakerId: getCurrentSpeakerId,
  getCurrentMicrophoneId: getCurrentMicrophoneId,
  getCurrentCameraId: getCurrentCameraId,
  takeLocalSnapShot: takeLocalSnapShot,
  takeRemoteSnapShot: takeRemoteSnapShot,
  startAigc: startAigc,
  stopAigc: stopAigc,
  sendAigcMessage: sendAigcMessage,
  enableMicRecordDataCallback: enableMicRecordDataCallback
};

var extensionId$3 = 'talrtc_ext'; // 端提供的 API 入口

var EM$7 = window.EM; // 是否执行过 TALRTC 的 AddListener 的标志

var hasAddListener$3 = false; // 监听id

var EMListenerId$2 = 0; // rtc小班课=0;rtc大班课=1

var classType$4 = 0; // 0: 小组课  1: 小班课  2: 新小班课

var classMode = 0; // 心跳

var heartBeatDataReportObj$2 = {};
var isFirstHeartBeatReport$2 = false; // 维护的一份拉流的 streamId 与本地预览通道的映射表

var streamIdToPreviewId$2 = {};
var previewIdToStreamId$1 = {};
var heartBeatDataReportTimer$2 = null;
var streamIdRtcPlayerInfo$2 = {};
var streamIdRtcPlayerInfo1$2 = {}; // 拉流的播放通道初始化从 0 开始依次递增至44(共45路流),-1 为推流的本地视频预览

var chnTotal$1 = 50;
var uiChnIndexs$1 = new Array(chnTotal$1).fill(0).map(function (a, b) {
  return b;
}).reverse(); // 维护的一份当前正在使用的音频设备的 deviceId 的列表

var usingAudioDeviceId$1 = {
  speaker: '',
  microphone: ''
};
var localStreamId$1 = null;
var screenStreamId$1 = null;
var fourthStreamId = null;
var fourthStreamUsingCamera = true;
var isScreenSharing = false;
var isSpeakerCapturing = false;
var isMicphoneClosed = true;
var sdkVersion = null;
var sdkCoreVersion = null;
var streamMuteStatus = {};
var localStreamMuteStatus = {
  video: false,
  audio: false
}; //记录底层推流回调的值

var dataTalrtcCapture = {};
var qualityLocalArr = [];
var qualityRemoteArr = [];
var appId = null;
var localRoomId = null;
var userId = null;
var aigcRobotUid = null;
var isNoticeMicVolume = false;
var enableLocalCapture = true; // 本地摄像头采集,默认允许

var teacherId$1 = null;
var qualityLocal = 0;
var qualityRemote = 0;
var lecturerStreamId$1 = null;
var lecturerUid$1 = null;
var heartBeatItemCount$1 = 15;
var statsStore$1 = new DataStore(1500);
var PullResult$1 = {
  PULL_STREAM_CODE_OK: 0,
  // 成功
  PULL_STREAM_CODE_STOP: 1,
  // 停止
  PULL_STREAM_CODE_FAIL: 12101000,
  // 调用拉流Api时发生异常 - 是个笼统的错误码
  PULL_STREAM_CODE_TIMEOUT: 12102003,
  // 拉流超时
  PULL_STREAM_CODE_RTC_SIGNAL_FAIL: 12200001,
  // 加入房间失败
  PULL_STREAM_CODE_RTC_MEDIA_FAIL: 12301011,
  // 媒体链路建立失败
  PULL_STREAM_CODE_NON_EXIST: 32001004 // 流不存在

};
var audioPullingStore = new DataStore(
/*一小时过期时间*/
60 * 60 * 1000);
var videoPullingStore = new DataStore(
/*一小时过期时间*/
60 * 60 * 1000);
var pullingStreamInterval$1 = -1;
var BUSI_USER_ROLE = {
  student: 0,
  teacher: 1,
  assistant: 2
};
var ENGINE_TYPE = {
  talrtc: 7,
  volcrtc: 8,
  nertc: 9,
  'zego-express': 10
};
var ENGINE_TYPE_NAME = {
  7: 'talrtc',
  8: 'volcrtc',
  9: 'nertc',
  10: 'zego-express'
};
/**
 * @typedef {{
 *  audio: boolean,
 *  video: boolean,
 * }} NoticedStream
 * 
 * @description 已经通知过remote_video_ready的流
 * @type {Map<string, NoticedStream>}
 */

var userRTCStatus = new Map();
var localStreamIdMap = [];

var getStreamMuteStatus = function getStreamMuteStatus(streamId, type) {
  var streamStatus = streamMuteStatus[streamId] || {};
  return streamStatus[type] || false;
};

var setStreamMuteStatus = function setStreamMuteStatus(streamId, type, status) {
  if (!streamMuteStatus[streamId]) {
    streamMuteStatus[streamId] = {
      audio: false,
      video: false
    };
  }

  streamMuteStatus[streamId][type] = status; // 是否上报心跳标记,只有在有流的情况下才上报心跳

  if (!streamIdRtcPlayerInfo1$2[streamId]) {
    resetStreamIdRtcPlayerInfo1$2(streamId);
  }

  streamIdRtcPlayerInfo1$2[streamId]["".concat(type, "_type")] = !status;
};
/**
 * 判断主流还是辅流
 * @param {string} streamId 
 * @returns {boolean} true: 主流 false: 辅流
 */


var isMainStream = function isMainStream(streamId) {
  return streamId.split('_').length === 4;
};

var callMethod$5 = function callMethod(name, args) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$7) {
    return new Promise(function (resolve, reject) {
      // let noneCamera = (name === 'SetCameraDevice' && !args.pszDeviceID);
      // let noneMicrophone = (name === 'SetAudioDevice' && args.deviceType === 0 && !args.pszDeviceID);
      // let noneSpeaker = (name === 'SetAudioDevice' && args.deviceType === 1 && !args.pszDeviceID);
      // if (noneCamera || noneMicrophone || noneSpeaker) {
      //   return resolve();
      // }
      defaultApi$1.writeLog("".concat(name, " Params: ").concat(JSON.stringify(args)));
      EM$7.CallMethod(extensionId$3, name, JSON.stringify(_objectSpread({}, args, {
        classType: classType$4
      })), function (code, msg) {
        defaultApi$1.writeLog("".concat(name, " Code: ").concat(code, " Message: ").concat(msg));
        resolve({
          code: code,
          msg: msg
        });
      });
    });
  }
};

var loadTalrtc = function loadTalrtc(extensionVersion) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$7) {
    return new Promise(function (resolve, reject) {
      removerListener$2();
      defaultApi$1.writeLog("-> load tal rtc sdk  ".concat(extensionId$3, ", ").concat(extensionVersion));
      EM$7.Load(extensionId$3, extensionVersion, false, function (code, msg) {
        defaultApi$1.writeLog("loadTalrtc Code: ".concat(code, "\nMessage: ").concat(msg));
        addListener$3();
        resolve();
      });
    });
  }
}; //卸载监听


var removerListener$2 = function removerListener() {
  hasAddListener$3 = false;
  defaultApi$1.writeLog("TALRTC::action--removerListener EMListenerId:".concat(EMListenerId$2));
  EM$7.RemoverListener(extensionId$3, EMListenerId$2, function (ec, content) {});
  EMListenerId$2 = 0;
}; //加载监听

/**
 * @function 添加扩展监听机制
 * @param userId:Number 用户 id,必选
 * @param userName:String 用户名,必选
 * @param roomId:String 频道(房间) id,必选
 * @param nNetType:Number 网络类型,可选,默认为 1
 * @return void
 */


var addListener$3 = function addListener() {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$7 && !hasAddListener$3) {
    hasAddListener$3 = true;
    EM$7.AddListener(extensionId$3, function (event, data) {
      if (zbysdk$1.openListenerLog) {
        defaultApi$1.writeLog("TALRTC::Listener:: event: ".concat(event, ", data: ").concat(JSON.stringify(data)));
      }

      if (data && data.indexOf(extensionId$3) > -1) {
        try {
          EMListenerId$2 = JSON.parse(data)[extensionId$3];
          defaultApi$1.writeLog("TALRTC::addListener-- EMListenerId: ".concat(EMListenerId$2));
        } catch (error) {}
      }

      if (!event || !data) {
        return;
      }

      var _data = JSON.parse(data); // defaultApi.writeLog(`TALRTC: event:: ${event} : ${data}`);


      switch (event) {
        // 推流器出现错误
        case 'onLocalError':
          defaultApi$1.writeLog("TALRTC::addListener-- onLocalError: ".concat(data));
          NOTICE.pushStreamError({
            errorStreamType: _data.streamType,
            code: _data.code,
            errorMsg: _data
          });
          dataReport$2.pushStreamError({
            errorStreamType: _data.streamType,
            code: _data.code
          }); // defaultApi.writeLog(`TALRTC: event:: onLocalError: ${_data}`);

          break;
        // 直播推流器警告通知

        case 'onLocalWarning':
          defaultApi$1.writeLog("TALRTC::addListener-- onLocalWarning: ".concat(data));
          NOTICE.pushStreamWarning({
            warnStreamType: _data.streamType,
            code: _data.code
          });
          dataReport$2.pushStreamWarning({
            warnStreamType: _data.streamType,
            code: _data.code
          });
          break;
        // 首帧音频推送完成的回调通知

        case 'onSendLocalFirstAudioFrame':
          defaultApi$1.writeLog("TALRTC: event:: onSendLocalFirstAudioFrame: ".concat(data));
          break;
        // 采集首帧事件

        case 'OnCaptureVideoFirstFrame':
          defaultApi$1.writeLog("TALRTC: event:: OnCaptureVideoFirstFrame: ".concat(data)); // NOTICE.pushFlowSuccess({code:0,publish_streamid: _data.pszStreamID});

          break;
        // 本地音量

        case 'onLocalMicrophoneVolumeUpdate':
          // defaultApi.writeLog(`TALRTC: event:: onLocalMicrophoneVolumeUpdate: ${data}`);
          if (isNoticeMicVolume) {
            NOTICE.captureMicVolumeChanged({
              volume: Math.round(_data.volume)
            });
          }

          heartBeatDataReportObj$2.volume = heartBeatDataReportObj$2.volume + Math.round(_data.volume) + ',';
          break;
        // 推流器连接状态回调通知。推流器连接状态 1与服务器断开连接/2 正在连接服务器/3 连接服务器成功/4 重连服务器中  5

        case 'onLocalConnectStatusUpdate':
          defaultApi$1.writeLog("TALRTC: event:: onLocalConnectStatusUpdate: ".concat(data));
          dataReport$2.localConnectStatus({
            connectStatuStreamType: _data.streamType,
            state: _data.state
          });

          if (_data.state === 2 || _data.state === 1) {
            NOTICE.networkError();
          } else if (_data.state === 3) {
            NOTICE.networkRecovery();
          }

          break;
        // 网络质量的实时统计回调

        case 'onLocalNetworkQuality':
          // defaultApi.writeLog(`TALRTC: event:: onLocalNetworkQuality: ${data}`);
          if (_data.quality == 4 || _data.quality == 5 || _data.quality == 6) {
            NOTICE.localNetworkQuality({
              code: _data.quality
            }); // dataReport.localNetworkQuality({
            //   code:  _data.quality,
            // });
          }

          qualityLocal = _data.quality; // qualityLocalArr.push(_data.quality);

          break;
        // 远端流错误通知,拉流出现错误时,会回调该通知

        case 'onRemoteError':
          defaultApi$1.writeLog("TALRTC: event:: onRemoteError: ".concat(data));
          NOTICE.pullStreamError({
            strErrorStreamId: _data.streamId,
            code: _data.code
          });
          break;
        // 远端流警告通知,拉流出现警告时,会回调该通知

        case 'onRemoteWarning':
          defaultApi$1.writeLog("TALRTC: event:: onRemoteWarning: ".concat(data));
          NOTICE.pullStreamWarning({
            strWarnStreamId: _data.streamId,
            code: _data.code
          });
          break;
        // 卡顿事件,用于事件上报

        case 'stuckevent':
          defaultApi$1.writeLog("TALRTC: event:: stuckevent: ".concat(data));
          break;

        case 'onRecvMediaSideInfo':
          defaultApi$1.writeLog("TALRTC: event:: onRecvMediaSideInfo: ".concat(data));
          NOTICE.onRecvMediaSideInfo({
            streamId: _data.streamId,
            userId: util.getUidByStreamId(_data.streamId),
            data: _data.pBuf,
            dataLen: _data.dataLen,
            uuid: _data.uuid
          });
          break;
        // 远端音频首帧

        case 'onRecvRemoteAudioFirstFrame':
          try {
            NOTICE.firstAudioSize({
              streamId: _data.streamId,
              userId: util.getUidByStreamId(_data.streamId)
            });
            dataReport$2.firstAudioSize({
              pull_streamid: _data.streamId,
              pull_uid: util.getUidByStreamIdDr(_data.streamId),
              code: '0'
            });
          } catch (e) {}

          ;
          defaultApi$1.writeLog("TALRTC: event:: OnRecvRemoteAudioFirstFrame: ".concat(data));
          break;
        // 远端流音量大小

        case 'onRemoteAudioVolume':
          // defaultApi.writeLog(`TALRTC: event:: onRemoteAudioVolume: ${data}}`);
          var cbData = {
            streamid: _data.streamId,
            streamId: _data.streamId,
            userId: util.getUidByStreamId(_data.streamId),
            volume: _data.volume
          };
          NOTICE.playerVolumeChanged(cbData);
          NOTICE.volumeChange(cbData);

          if (streamIdRtcPlayerInfo$2[_data.streamId]) {
            streamIdRtcPlayerInfo$2[_data.streamId].volume = streamIdRtcPlayerInfo$2[_data.streamId].volume + Math.round(_data.volume) + ',';
          }

          break;
        // case 'onUserEnableAudio':
        // try {
        //   if (
        //     teacherId &&
        //     _data.streamId.match(teacherId) &&
        //     isMainStream(_data.streamId) &&
        //     _data.inuse
        //   ) {
        //     setChiefAudioStream(_data.streamId, util.getUidByStreamIdDr(_data.streamId));
        //   }
        // } catch (e) {
        //   defaultApi.writeLog(`TALRTC: event:: onUserEnableAudio: ${e}`);
        // }
        // defaultApi.writeLog(`TALRTC: event:: onUserEnableAudio: ${data}`);
        // break; // 由于后续还有处理逻辑,所以不能直接 break
        // 远端视频首帧

        case 'onRenderRemoteVideoFirstFrame':
          try {
            // Test Code: 临时增加
            setTimeout(function () {
              NOTICE.pullFlowResult({
                code: 0,
                pull_streamid: _data.streamId
              });
              NOTICE.firstVideoSize({
                streamId: _data.streamId,
                userId: util.getUidByStreamId(_data.streamId)
              });
              dataReport$2.firstVideoSize({
                pull_streamid: _data.streamId,
                pull_uid: util.getUidByStreamIdDr(_data.streamId),
                code: '0'
              });
            }, 100);
          } catch (e) {}

          ;
          defaultApi$1.writeLog("TALRTC: event:: OnRenderRemoteVideoFirstFrame: ".concat(data));
          break;
        // SEI消息

        case 'onRecvSEIMsg':
          defaultApi$1.writeLog("TALRTC: event:: onRecvSEIMsg: ".concat(data));
          break;
        // 网络质量的实时统计回调

        case 'onRemoteNetworkQuality':
          // defaultApi.writeLog(`TALRTC: event:: onRemoteNetworkQuality: ${data}`);
          if (_data.quality == 4 || _data.quality == 5 || _data.quality == 6) {
            NOTICE.remoteNetworkQuality({
              code: _data.quality
            }); // dataReport.remoteNetworkQuality({
            //   code:  _data.quality,
            // });
          }

          qualityRemote = _data.quality; // qualityRemoteArr.push(_data.quality);

          break;
        // 转推 CDN 上发布音视频流的事件回调

        case 'onRtmpStreamingStateChanged':
          defaultApi$1.writeLog("TALRTC: event:: onRtmpStreamingStateChanged: ".concat(data));
          break;
        // 设备异常

        case 'onDeviceError':
          defaultApi$1.writeLog("TALRTC: event:: OnDeviceError: ".concat(data));
          var codemsg = {
            '-2': '无效设备ID',
            '-3': '没有权限',
            '-4': '采集帧率为0',
            '-5': '设备被占用',
            '-6': '设备未插入',
            '-7': '需要重启系统',
            '-8': '媒体服务无法恢复',
            '-9': '设备被SIRI占用',
            '100': '设备恢复'
          }; // 如果errorCode为0,则过滤掉并返回100

          if (_data.errorCode === 0) {
            _data.errorCode = 100;
          }

          dataReport$2.deviceError({
            deviceName: _data.deviceName,
            errorCode: _data.errorCode,
            code: _data.errorCode
          });
          NOTICE.deviceError({
            code: _data.errorCode,
            msg: codemsg[_data.errorCode],
            deviceId: _data.deviceId,
            deviceName: _data.deviceName
          });
          break;
        // 拉流的结果通知

        case 'onPlayStateUpdate':
          defaultApi$1.writeLog("TALRTC: event:: onPlayStateUpdate: ".concat(data));
          break;
        // 推流的结果通知

        case 'onPushStateUpdate':
          defaultApi$1.writeLog("TALRTC: event:: onPushStateUpdate: ".concat(data));

          if (_data.state === 3) {
            NOTICE.pushFlowSuccess({
              code: 0,
              publish_streamid: _data.streamId
            });
          }

          dataReport$2.publishResult({
            code: '0',
            publish_rtc_streamid: _data.streamId.split('_').length === 5 ? _data.streamId : undefined
          });
          break;

        case 'onAudioSubscribeStateChange':
          defaultApi$1.writeLog("TALRTC: event:: onAudioSubscribeStateChange: ".concat(data, " ").concat(audioPullingStore.has(_data.streamId)));

          if (!audioPullingStore.has(_data.streamId)) {
            break;
          }

          dataReport$2.pullResult({
            code: _data.code,
            media_type: 'audio',
            pull_uid: _data.userId,
            pull_streamid: _data.streamId
          });
          audioPullingStore.delete(_data.streamId);
          break;

        case 'onVideoSubscribeStateChange':
          defaultApi$1.writeLog("TALRTC: event:: onVideoSubscribeStateChange: ".concat(data, " ").concat(videoPullingStore.has(_data.streamId)));

          if (!videoPullingStore.has(_data.streamId)) {
            break;
          }

          dataReport$2.pullResult({
            code: _data.code,
            media_type: 'video',
            pull_uid: _data.userId,
            pull_streamid: _data.streamId
          });
          videoPullingStore.delete(_data.streamId);
          break;
        // 推、拉流的统计数据。

        case 'onLocalStatistics':
          try {
            if (!localStreamId$1) {
              return;
            }

            var _d = JSON.parse(_data.stats);

            NOTICE.pushQuality({
              video: {
                streamId: localStreamId$1,
                userId: userId,
                bitrate: _d.videoBitrate,
                fps: _d.fps
              }
            });
            NOTICE.playLossAndDelay({
              userId: userId,
              delay: _d.rtt,
              lostrate: _d.packetLoss
            });
          } catch (e) {} // heartBeatDataReportCalc('onLocalStatistics', _data);


          statsStore$1.setData(localStreamId$1, _data); // defaultApi.writeLog(`TALRTC: event:: onStatisticsUpdate: ${_data}`);

          break;
        // 本地摄像头设备的通断状态发生变化

        case 'onRemoteStatistics':
          try {
            var _d2 = JSON.parse(_data.stats);

            NOTICE.pullQuality({
              video: {
                streamId: _d2.streamId,
                userId: util.getUidByStreamId(_d2.streamId),
                bitrate: _d2.videoBitrate,
                fps: _d2.fps
              }
            });
            NOTICE.playLossAndDelay({
              userId: util.getUidByStreamId(_d2.streamId),
              delay: _d2.rtt,
              lostrate: _d2.packetLoss
            });
            statsStore$1.setData(_d2.streamId, _data);
          } catch (e) {} // heartBeatDataReportCalc('onRemoteStatistics', _data);
          // defaultApi.writeLog(`TALRTC: event:: onStatisticsUpdate: ${_data}`);


          break;
        // 本地摄像头设备的通断状态发生变化

        case 'onVideoDeviceChanged':
          defaultApi$1.writeLog("TALRTC: event:: onVideoDeviceChanged: ".concat(data));
          setCameraDevice$1({
            deviceId: _data.state == 1 ? _data.deviceId : '',
            operationType: 'hotPlug',
            deviceState: _data.state == 1 ? 0 : 1,
            changedDeviceId: _data.deviceId
          });
          break;

        /* 本地麦克风设备的通断状态发生变化
           *  state:1:使用中   2:被禁用  4:一开始就没有?(我也不懂)  8:设备移除
           *  deviceType:-1:未知   0:播放器   1:麦克风  2:视频显示设备  3:摄像头
           */

        case 'onAudioDeviceChanged':
          defaultApi$1.writeLog("TALRTC: event:: onAudioDeviceChanged: ".concat(data));

          if (_data.deviceType === 0) {
            setSpeakerDevice$2({
              deviceId: _data.state == 1 ? _data.deviceId : '',
              operationType: 'hotPlug',
              deviceState: _data.state == 1 ? 0 : 1,
              changedDeviceId: _data.deviceId
            });
          }

          if (_data.deviceType === 1) {
            setMicrophoneDevice$2({
              deviceId: _data.state == 1 ? _data.deviceId : '',
              operationType: 'hotPlug',
              deviceState: _data.state == 1 ? 0 : 1,
              changedDeviceId: _data.deviceId
            });
          }

          break;
        // mute 视频状态,true:远端开始推流,并拉流收到首帧;false:远端停止推流。

        case 'onRemoteVideoStatus':
          defaultApi$1.writeLog("TALRTC: event:: onRemoteVideoStatus: ".concat(data));
          break;
        // mute 音频状态,true:远端开始推流,并拉流收到首帧;false:远端停止推流。

        case 'onRemoteAudioStatus':
          defaultApi$1.writeLog("TALRTC: event:: onRemoteAudioStatus: ".concat(data));
          break;
        // 首帧视频推送完成的回调通知

        case 'onSendLocalFirstVideoFrame':
          defaultApi$1.writeLog("TALRTC: event:: onSendLocalFirstVideoFrame: ".concat(data));
          break;

        case 'updateRet':
          defaultApi$1.writeLog("TALRTC: event:: updateRet: ".concat(data));
          break;

        case 'onBeautifyEvent':
          if (_data.code === 0) {
            defaultApi$1.writeLog("TALRTC: event:: onBeautifyEvent success ".concat(JSON.stringify(_data)));
          } else {
            var message = ['', 'License错误', '渲染错误', '参数错误'];
            NOTICE.beautifyError({
              code: _data.code,
              message: message[_data.code]
            });
          }

          break;

        case 'onEngineType':
          defaultApi$1.writeLog("TALRTC: event:: onEngineType: ".concat(data));
          dataReport$2.setRealSDKType(_data.engineType);

          if (_data.engineType === 'volcrtc') {
            statsStore$1.updateValidityPeriod(2500);
          } else if (_data.engineType === 'talrtc') {
            statsStore$1.updateValidityPeriod(1500);
          }

          break;

        case 'onJoinchannelError':
          defaultApi$1.writeLog("TALRTC: event:: onJoinchannelError: ".concat(data));
          dataReport$2.joinRtcChannel(_data);
          break;

        case 'onUserOnline':
          if (globalConfig.usePomelo) {
            break;
          }

          defaultApi$1.writeLog("TALRTC: event:: onUserOnline: ".concat(data));
          userRTCStatus.set(_data.userId, {
            audio: false,
            video: false
          });
          NOTICE.userJoin({
            userId: _data.userId,
            userName: _data.userName,
            role: _data.role
          });
          NOTICE.updateStreamDeviceStatus({
            userId: _data.userId,
            userName: _data.userName,
            role: _data.role,
            deviceType: 'audio',
            deviceStatus: 'closed'
          });
          NOTICE.updateStreamDeviceStatus({
            userId: _data.userId,
            userName: _data.userName,
            role: _data.role,
            deviceType: 'video',
            deviceStatus: 'closed'
          });
          break;

        case 'onUserMuteAudio':
          {
            if (globalConfig.usePomelo) {
              break;
            }

            defaultApi$1.writeLog("TALRTC: event:: ".concat(event, ": ").concat(data));

            if (_data.streamId.split('_').length === 5) {
              break;
            }

            var streamInfo = userRTCStatus.get(_data.userId);

            if (!streamInfo) {
              // 如果没有通知过,说明是第一次收到mute通知
              streamInfo = {
                audio: false,
                video: false
              };
              userRTCStatus.set(_data.userId, streamInfo);
            }

            if (streamInfo.audio === !_data.mute) {
              // 无变更
              defaultApi$1.writeLog("TALRTC: event:: ".concat(event, ": no change for userId: ").concat(_data.userId, ", streamId: ").concat(_data.streamId, ", mute: ").concat(_data.mute));
              break;
            }

            streamInfo.audio = !_data.mute;

            if (streamInfo.audio && !streamInfo.video) {
              // 如果音频开启了,视频没有开启,说明是首次上行,通知add
              NOTICE.addStream({
                userId: _data.userId,
                userName: _data.userName,
                role: _data.role,
                streamId: _data.streamId
              });
              break;
            }

            if (!streamInfo.video) {
              // 如果音视频都没有,通知remove
              userRTCStatus.delete(_data.userId);
              NOTICE.removeStream({
                userId: _data.userId,
                userName: _data.userName,
                role: _data.role,
                streamId: _data.streamId
              });
            }

            break;
          }

        case 'onUserMuteVideo':
          {
            if (globalConfig.usePomelo) {
              break;
            }

            defaultApi$1.writeLog("TALRTC: event:: ".concat(event, ": ").concat(data));

            if (_data.streamId.split('_').length === 5) {
              break;
            }

            var _streamInfo = userRTCStatus.get(_data.userId);

            if (!_streamInfo) {
              // 如果没有通知过,说明是第一次收到mute通知
              _streamInfo = {
                audio: false,
                video: false
              };
              userRTCStatus.set(_data.userId, _streamInfo);
            }

            if (_streamInfo.video === !_data.mute) {
              // 无变更
              defaultApi$1.writeLog("TALRTC: event:: ".concat(event, ": no change for userId: ").concat(_data.userId, ", streamId: ").concat(_data.streamId, ", mute: ").concat(_data.mute));
              break;
            }

            _streamInfo.video = !_data.mute;

            if (_streamInfo.video && !_streamInfo.audio) {
              // 如果视频开启了,音频没有开启,说明是首次上行,通知add
              NOTICE.addStream({
                userId: _data.userId,
                userName: _data.userName,
                role: _data.role,
                streamId: _data.streamId
              });
              break;
            }

            if (!_streamInfo.audio) {
              // 如果音视频都没有,通知remove
              userRTCStatus.delete(_data.userId);
              NOTICE.removeStream({
                userId: _data.userId,
                userName: _data.userName,
                role: _data.role,
                streamId: _data.streamId
              });
            }

            break;
          }

        case 'onUserEnableAudio':
          try {
            if (teacherId$1 && _data.streamId.match(teacherId$1) && isMainStream(_data.streamId) && _data.inuse) {
              setChiefAudioStream(_data.streamId, util.getUidByStreamIdDr(_data.streamId));
            }
          } catch (e) {
            defaultApi$1.writeLog("TALRTC: event:: onUserEnableAudio error: ".concat(e));
          }

          if (_data && _data.inuse && aigcRobotUid != null && String(_data.userId) === String(aigcRobotUid)) {
            aigcRobotUid = null;
            NOTICE.addStream({
              userId: _data.userId,
              streamId: _data.streamId
            });
          }

          if (globalConfig.usePomelo) {
            break;
          }

          defaultApi$1.writeLog("TALRTC: event:: onUserEnableAudio: ".concat(data));

          if (_data.streamId.split('_').length === 5) {
            break;
          }

          NOTICE.updateStreamDeviceStatus({
            userId: _data.userId,
            userName: _data.userName,
            role: _data.role,
            deviceType: 'audio',
            deviceStatus: _data.deviceStatus
          });
          break;

        case 'onUserEnableVideo':
          if (globalConfig.usePomelo) {
            break;
          }

          defaultApi$1.writeLog("TALRTC: event:: onUserEnableVideo: ".concat(data));

          if (_data.streamId.split('_').length === 5) {
            break;
          }

          NOTICE.updateStreamDeviceStatus({
            userId: _data.userId,
            userName: _data.userName,
            role: _data.role,
            deviceType: 'video',
            deviceStatus: _data.deviceStatus
          });
          break;

        case 'onUserOffline':
          if (globalConfig.usePomelo) {
            break;
          }

          userRTCStatus.delete(_data.userId);
          defaultApi$1.writeLog("TALRTC: event:: onUserOffline: ".concat(data));
          NOTICE.leave({
            userId: _data.userId,
            userName: _data.userName,
            role: _data.role
          });
          break;

        case 'onEngineChangeNotify':
          defaultApi$1.writeLog("TALRTC: event:: onEngineChangeNotify: ".concat(data));
          zbysdk$1.changeSDK();
          break;

        case 'onAiStatus':
          defaultApi$1.writeLog("TALRTC: event:: onAiStatus: ".concat(data));
          NOTICE.onAiStatus({
            uid: _data.uid,
            code: _data.code,
            errMsg: _data.errMsg
          });
          break;

        case 'onAiMessage':
          defaultApi$1.writeLog("TALRTC: event:: onAiMessage: ".concat(data));

          if (!_data || !_data.txt) {
            break;
          }

          NOTICE.onAiMessage({
            uid: _data.uid,
            status: _data.status,
            text: _data.txt
          });
          break;

        case 'onAiTTSMessage':
          defaultApi$1.writeLog("TALRTC: event:: onAiTTSMessage: ".concat(data));
          NOTICE.onAiTTSMessage({
            uid: _data.uid,
            status: _data.status,
            text: _data.txt
          });
          break;

        case 'OnMicCaptureData':
          {
            var base64Data = _data && _data.data;

            if (base64Data) {
              NOTICE.micCaptureData({
                data: base64Data,
                sampleRate: _data.sampleRate,
                channels: _data.channels
              });
            }

            break;
          }

        default:
          console.warn('warning: uncaught listener:', event);
      }
    });
  }
};

var checkUpdate = async function checkUpdate(institutionId, userid, role) {
  defaultApi$1.writeLog("avsdk TALRTC::checkUpdate ".concat(institutionId, ", ").concat(userid, ", ").concat(role));
  await loadTalrtc(talrtcExt.version);
  var appid = getAppIdByInstitutionId(String(institutionId));
  defaultApi$1.writeLog("avsdk TALRTC::checkUpdate appid ".concat(appid));
  userId += '';

  if (!appid) {
    return;
  }

  var data = {
    appid: appid,
    userid: userid,
    role: BUSI_USER_ROLE[role] || 0
  };
  return callMethod$5('CheckUpdate', _objectSpread({}, data, {
    extraInfo: JSON.stringify(data)
  }));
};

var startPullingStreamObserver$1 = function startPullingStreamObserver() {
  audioPullingStore.restore();
  videoPullingStore.restore();

  if (pullingStreamInterval$1 !== -1) {
    clearInterval(pullingStreamInterval$1);
  }

  pullingStreamInterval$1 = setInterval(function () {
    audioPullingStore.forEach(function (value, key) {
      try {
        if (!audioPullingStore.checkData(value)) {
          audioPullingStore.delete(key);
          dataReport$2.pullResult({
            code: PullResult$1.PULL_STREAM_CODE_TIMEOUT,
            media_type: 'audio',
            pull_uid: util.getUidByStreamIdDr(key),
            pull_streamid: key
          });
        }
      } catch (e) {
        defaultApi$1.writeLog("pullingStreamInterval error ".concat(e), undefined, 'error');
      }
    });
    videoPullingStore.forEach(function (value, key) {
      try {
        if (!videoPullingStore.checkData(value)) {
          videoPullingStore.delete(key);
          dataReport$2.pullResult({
            code: PullResult$1.PULL_STREAM_CODE_TIMEOUT,
            media_type: 'video',
            pull_uid: util.getUidByStreamIdDr(key),
            pull_streamid: key
          });
        }
      } catch (e) {
        defaultApi$1.writeLog("pullingStreamInterval error ".concat(e), undefined, 'error');
      }
    });
  }, 500);
};
/**
 * 
 * @param {string | number} userId 
 * @returns {string}
 */


var formatUserId = function formatUserId(userId) {
  userId = String(userId);
  var userNumber = userId.match(/\d+/);
  var baseNumber = 1e9;

  if (!userNumber || !userNumber.length) {
    return baseNumber;
  }

  var pureNumber = parseInt(userNumber[0]) || 0;

  if (pureNumber === Number(userId)) {
    return String(pureNumber);
  } else {
    return String(pureNumber + baseNumber);
  }
};
/**
 * 处理token
 * @param {string} token 
 */


var processToken = function processToken(token) {
  var tokenArr = token.split('.');

  if (tokenArr.length === 3) {
    var payloadStr = window.atob(tokenArr[1]);
    var payload = JSON.parse(payloadStr);
    globalConfig.usePomelo = payload.signal >> 0 === 0;
    defaultApi$1.writeLog("avsdk TALRTC::usePomelo ".concat(globalConfig.usePomelo));
    dataReport$2.setRealSDKType(ENGINE_TYPE_NAME[payload.type] || payload.type);
    return payload;
  } else {
    defaultApi$1.writeLog('avsdk TALRTC::processToken error ' + token, undefined, 'error');
    return token;
  }
}; // 初始化相关


var init$2 = async function init(args) {
  defaultApi$1.writeLog("avsdk TALRTC::init ".concat(JSON.stringify(args)));
  var usedDevices = window.zbyAVSDK_device_checker_init;
  var devices = args.devices;
  var sdkType = window.zbyAVSDK_init_sdk_type || 'talrtc';
  appId = args.appId;
  localRoomId = args.roomId;
  userId = args.userId;
  localStreamId$1 = args.streamId;
  localStreamIdMap[0] = localStreamId$1;
  teacherId$1 = args.teacherId;
  lecturerStreamId$1 = typeof args.lecturerStreamId === 'string' ? args.lecturerStreamId.toUpperCase() : null;
  lecturerUid$1 = typeof lecturerStreamId$1 === 'string' ? lecturerStreamId$1.split('_')[2] : null;
  var _devices = {
    camera: devices && devices.camera || usedDevices && usedDevices.camera && usedDevices.camera.use || '',
    microphone: devices && devices.microphone || usedDevices && usedDevices.microphone && usedDevices.microphone.use || '',
    speaker: devices && devices.speaker || usedDevices && usedDevices.speaker && usedDevices.speaker.use || ''
  };
  var rtcTokenRetryCount = 0;

  var _ref = await Promise.all([loadTalrtc(args.extensionVersion), getRTCToken({
    // 构建token请求参数
    appid: args.appId,
    planid: parseInt(args.live_id),
    user: formatUserId(args.userId),
    room: args.roomId,
    ignoreVolc: 1
  }, {
    // 配置选项对象,控制重试行为
    enableBackup: true,
    // 启用备用域名重试
    enableFallback: true,
    // 启用回退到自研引擎
    logPrefix: 'TALRTC::getRTCToken',
    // 日志前缀,用于区分不同模块的日志
    onRetry: function onRetry() {
      return rtcTokenRetryCount += 1;
    }
  })]),
      _ref2 = _slicedToArray(_ref, 2),
      token = _ref2[1];

  defaultApi$1.writeLog(token ? '-> get token success ' + token : '-> get token failed');
  dataReport$2.getRtcToken({
    result: token ? 1 : -1,
    error_count: rtcTokenRetryCount
  });
  processToken(token);
  args.usersign = token;
  await startEngine$1(args.appId, localRoomId, args.userId, args.usersign || '67890', ENGINE_TYPE[sdkType] || 7, args.live_id, BUSI_USER_ROLE[args.role] || 0);
  defaultApi$1.writeLog('-> start talrtc sdk success');

  if (args.env != 'online') {
    setEngineEnv(args.env);
  }

  userRTCStatus.clear();
  classMode = args.classMode >> 0; // 0: 小组课  1: 小班课  2: 新小班课

  if (classMode === 1 || classMode === 2) {
    if (args.role === 'teacher') {
      //小班课 需要加载采集插件的输入数据,为了拼接talrtc头像
      await loadCollectionInputEntry$1(); //屏幕流通道

      screenStreamId$1 = "".concat(window.zby_sdk_init_params.institutionId, "_").concat(localRoomId, "_").concat(userId, "_").concat(args.live_id, "_1");
      localStreamIdMap[1] = screenStreamId$1;
      await enableExternalVideoSource(true, screenStreamId$1);
      await setCameraEncodeFps(args.screenSameFps, screenStreamId$1);
      await setCameraCaptureResolution(args.screenSameResolutionWidth, args.screenSameResolutionHeight, screenStreamId$1);
      await setCameraEncodeResolution(args.screenSameResolutionWidth, args.screenSameResolutionHeight, screenStreamId$1);
      await setCameraEncodeBitrate(args.screenSameBitrate, screenStreamId$1); //rtc同屏以及高光时刻,都开启音频外部采集,默认传1

      await setAudioAuxSource$1(1);
      teacherId$1 = null;
    }

    if (args.noiseSuppressMode == -2) {
      defaultApi$1.writeLog("noiseSuppressMode \u5173\u95ED\u566A\u58F0\u6D88\u9664 ".concat(args.noiseSuppressMode));
      await setEnableNoiseSuppress$1(false);
    } else if (args.noiseSuppressMode == -1) {
      defaultApi$1.writeLog("noiseSuppressMode \u7531\u5E95\u5C42\u8FDB\u884C\u914D\u7F6E\uFF0Cjs\u5C42\u4E0D\u8FDB\u884C\u914D\u7F6E ".concat(args.noiseSuppressMode));
    } else {
      defaultApi$1.writeLog("noiseSuppressMode \u542F\u52A8\u566A\u97F3\u6D88\u9664,\u6A21\u5F0F\u4E3A\uFF1A".concat(args.noiseSuppressMode));
      await setEnableNoiseSuppress$1(true);
      await setNoiseSuppressMode$1(args.noiseSuppressMode >> 0);
      await enableTransientNoiseSuppress$1(true);
    }

    ; //aecMode为-1是关闭回音消除,云控下传

    if (args.aecMode == -2) {
      defaultApi$1.writeLog("aecMode \u5173\u95ED\u56DE\u97F3\u6D88\u9664 ".concat(args.aecMode));
      await setEnableAEC$1(false);
    } else if (args.aecMode == -1) {
      defaultApi$1.writeLog("aecMode \u7531\u5E95\u5C42\u8FDB\u884C\u914D\u7F6E\uFF0Cjs\u5C42\u4E0D\u8FDB\u884C\u914D\u7F6E ".concat(args.aecMode));
    } else {
      defaultApi$1.writeLog("aecMode \u542F\u52A8\u56DE\u97F3\u6D88\u9664,\u6A21\u5F0F\u4E3A\uFF1A".concat(args.aecMode));
      await setEnableAEC$1(true);
      await setAECMode$1(args.aecMode >> 0);
    }

    ;
  }

  ;

  if ((args.role === 'teacher' || args.role === 'assistant') && classMode === 0) {
    //坐立模式开启外部采集器,站立关闭外部采集器,只有小组课坐立模式才会调用,通过这个把rtmp数据给到talrtc(头像),开启了外部采集,talrtc不会再本地采集数据
    // V2 不区分坐立站立,老师和辅导老师都启动外部视频源
    await enableExternalVideoSource(true, localStreamId$1);
    enableLocalCapture = false; // 禁用本地摄像头采集,防止与其他进程抢占摄像头
  } else {
    await setDefaultDevice$2(_devices, 'default');
  } // 主通道


  await setCameraEncodeFps(args.encodeCaptureFps, localStreamId$1);
  await setCameraCaptureResolution(args.previewResolutionWidth, args.previewResolutionHeight, localStreamId$1);
  await setCameraEncodeResolution(args.encodedResolutionWidth, args.encodedResolutionHeight, localStreamId$1);
  await setCameraEncodeBitrate(args.encodeCaptureBitrate, localStreamId$1);
  await setMicphoneVolumInterval(500);
  await setMediaSideFlags$1();
  startPullingStreamObserver$1();
  window.current_sdk_type = sdkType;
  defaultApi$1.writeLog('avsdk TALRTC::init finished current_sdk_type: ' + sdkType);
};
/**
 * @function 初始化引擎
 * @param {string} appid TalRTC 秘钥,必选
 * @param {string} userid
 * @param {string} usersign
 * @param {1 | 7} type 直播中台SDK底层引擎类型 7: 自研引擎
 * @param {string} liveID
 * @param {0 | 1 | 2} businessRole 0: student 1: teacher 2: tutor
 * @return Promise | void
 */


var startEngine$1 = function startEngine(appid, roomId, userid, usersign, type, liveID, businessRole) {
  defaultApi$1.writeLog("avsdk TALRTC::StartEngine appid: ".concat(appid, " roomId:").concat(roomId, " userid: ").concat(userid, " usersign: ").concat(usersign, ", liveID: ").concat(liveID, ", businessRole: ").concat(businessRole));
  return callMethod$5('StartEngine', {
    appid: appid,
    roomId: roomId,
    userid: userid,
    usersign: usersign,
    type: type,
    liveID: '' + liveID,
    businessRole: businessRole,
    institutionId: '' + window.zby_sdk_init_params.institutionId,
    streamId: localStreamId$1,
    lecturerStreamId: lecturerStreamId$1
  });
}; //开启消除回声


var setEnableAEC$1 = function setEnableAEC(enable) {
  return callMethod$5('EnableAEC', {
    enable: enable
  });
}; //设置回声消除模式 mode :激进模式 =0/中等模式 =1/轻度模式 =2

var setAECMode$1 = function setAECMode(mode) {
  return callMethod$5('SetAECMode', {
    mode: mode
  });
}; //开启噪音消除

var setEnableNoiseSuppress$1 = function setEnableNoiseSuppress(enable) {
  return callMethod$5('EnableNoiseSuppress', {
    enable: enable
  });
}; //设置噪音消除模式 mode :0:低  1:中   2高

var setNoiseSuppressMode$1 = function setNoiseSuppressMode(mode) {
  return callMethod$5('SetNoiseSuppressMode', {
    mode: mode
  });
}; //新增瞬时降噪接口 瞬时降噪 可以处理掉 敲键盘、敲桌子、敲门等瞬态噪声。非瞬态噪声,此接口无法处理,比如划桌子等摩擦噪音。

var enableTransientNoiseSuppress$1 = function enableTransientNoiseSuppress(enable) {
  return callMethod$5('EnableTransientNoiseSuppress', {
    enable: enable
  });
};
/**
   * 加载采集插件的输入数据  //调用后,talrtc 可以向采集插件传送摄像头数据,用于拼接
   * @return {Promise}
   */

var loadCollectionInputEntry$1 = function loadCollectionInputEntry() {
  return callMethod$5('LoadCollectionInputEntry', {});
};
/**
 * 1、设置需要拼接的学生头像流id,按数组顺序拼接
 * 2、加载截屏插件,获取截屏插件设置拉流头像回调函数
 * @param {Array} stream_ids  拉流id数组,最大有效数量7个
 * @returns {Promise}
 */

var loadCollectionInputEntry2$1 = function loadCollectionInputEntry2(stream_ids) {
  return callMethod$5('LoadCollectionInputEntry2', {
    stream_ids: stream_ids
  });
}; //设置是否发送sei

var setMediaSideFlags$1 = function setMediaSideFlags() {
  var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
  var onlyAudioPublish = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  var mediaInfoType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
  var seiSendType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
  var idx = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
  return callMethod$5('SetMediaSideFlags', {
    start: start,
    onlyAudioPublish: onlyAudioPublish,
    mediaInfoType: mediaInfoType,
    seiSendType: seiSendType,
    idx: idx
  });
};
/**
 * @function 销毁引擎
 * @return Promise | void
 */


var destroyEngine$2 = function destroyEngine() {
  return callMethod$5('DestroyEngine', {});
}; // 设置采集分辨率


var setCameraCaptureResolution = function setCameraCaptureResolution(width, height) {
  var streamId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : localStreamId$1;
  return callMethod$5('SetCameraCaptureResolution', {
    width: width,
    height: height,
    streamId: streamId
  });
}; // 设置编码分辨率


var setCameraEncodeResolution = function setCameraEncodeResolution(width, height) {
  var streamId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : localStreamId$1;
  return callMethod$5('SetCameraEncodeResolution', {
    width: width,
    height: height,
    streamId: streamId
  });
}; // 设置编码帧率


var setCameraEncodeFps = function setCameraEncodeFps(fps) {
  var streamId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : localStreamId$1;
  return callMethod$5('SetCameraEncodeFps', {
    fps: fps,
    streamId: streamId
  });
}; // 设置编码码率


var setCameraEncodeBitrate = function setCameraEncodeBitrate(bitrate) {
  var streamId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : localStreamId$1;
  return callMethod$5('SetCameraEncodeBitrate', {
    bitrate: bitrate,
    streamId: streamId
  });
}; // 获取指定摄像头的支持的分辨率


var getCameraResolution = async function getCameraResolution(deviceId) {
  var resp = await callMethod$5('GetCameraResolution', {
    deviceId: deviceId
  });
  var cameraArr = JSON.parse(resp.msg || '{}').SupportedResolution;
  return {
    code: resp.code,
    msg: JSON.stringify(cameraArr)
  };
}; // 获取 rtc_sdk.dll 版本号


var getSDKVersion$2 = async function getSDKVersion() {
  if (sdkVersion) {
    return sdkVersion;
  }

  return callMethod$5('GetSDKVersion', {}).then(function (e) {
    return sdkVersion = JSON.parse(e.msg).version;
  }).catch(function (e) {
    return '';
  });
}; // 获取 rtc_sdk.dll 内核版本号


var getSDKCoreVersion = async function getSDKCoreVersion() {
  if (sdkCoreVersion) {
    return sdkCoreVersion;
  }

  return callMethod$5('GetSDKCoreVersion', {}).then(function (e) {
    return sdkCoreVersion = JSON.parse(e.msg).version;
  }).catch(function (e) {
    return '';
  });
};
/**
 * @function 设置默认的硬件设备,包括摄像头、麦克风以及扬声器
 * @return Promise
 */


var setDefaultDevice$2 = async function setDefaultDevice(devices, operationType) {
  // 设置默认的摄像头
  if (devices && devices.camera) {
    if (zbyAVSDK_device_checker_init.camera.list.length == 0) {
      await getCameraDeviceList();
    }

    await setCameraDevice$1({
      deviceId: devices.camera,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var cameraData = await getCameraDeviceList();

    if (cameraData.length) {
      var hasSetCamera = false;
      var _iteratorNormalCompletion = true;
      var _didIteratorError = false;
      var _iteratorError = undefined;

      try {
        for (var _iterator = cameraData[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
          var item = _step.value;

          if (item.isDefault) {
            await setCameraDevice$1({
              deviceId: item.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetCamera = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError = true;
        _iteratorError = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion && _iterator.return != null) {
            _iterator.return();
          }
        } finally {
          if (_didIteratorError) {
            throw _iteratorError;
          }
        }
      }

      if (!hasSetCamera) {
        await setCameraDevice$1({
          deviceId: cameraData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  } // 设置默认的麦克风


  if (devices && devices.microphone) {
    if (zbyAVSDK_device_checker_init.microphone.list.length == 0) {
      await getMicrophoneDeviceList$1();
    }

    await setMicrophoneDevice$2({
      deviceId: devices.microphone,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var microPhoneData = await getMicrophoneDeviceList$1();

    try {
      if (microPhoneData.length) {
        var hasSetMicrophone = false;
        var _iteratorNormalCompletion2 = true;
        var _didIteratorError2 = false;
        var _iteratorError2 = undefined;

        try {
          for (var _iterator2 = microPhoneData[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
            var _item = _step2.value;

            if (_item.isDefault) {
              await setMicrophoneDevice$2({
                deviceId: _item.deviceId,
                operationType: "".concat(operationType, "_2")
              });
              hasSetMicrophone = true;
              break;
            }
          }
        } catch (err) {
          _didIteratorError2 = true;
          _iteratorError2 = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
              _iterator2.return();
            }
          } finally {
            if (_didIteratorError2) {
              throw _iteratorError2;
            }
          }
        }

        if (!hasSetMicrophone) {
          await setMicrophoneDevice$2({
            deviceId: microPhoneData[0].deviceId,
            operationType: "".concat(operationType, "_3")
          });
        }
      }
    } catch (e) {
      console.log(e);
    }
  } // 设置默认的扬声器


  if (devices && devices.speaker) {
    await setSpeakerDevice$2({
      deviceId: devices.speaker,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var speakerData = await getSpeakerDeviceListInternal();

    if (speakerData.length) {
      var hasSetSpeaker = false;
      var _iteratorNormalCompletion3 = true;
      var _didIteratorError3 = false;
      var _iteratorError3 = undefined;

      try {
        for (var _iterator3 = speakerData[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
          var _item2 = _step3.value;

          if (_item2.isDefault) {
            await setSpeakerDevice$2({
              deviceId: _item2.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetSpeaker = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError3 = true;
        _iteratorError3 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
            _iterator3.return();
          }
        } finally {
          if (_didIteratorError3) {
            throw _iteratorError3;
          }
        }
      }

      if (!hasSetSpeaker) {
        await setSpeakerDevice$2({
          deviceId: speakerData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  }
}; // 麦克风相关

/**
 * @function 开启麦克风
 * @param intervalMs: Number
 * @return Promise | void
 */

var startMicrophone = async function startMicrophone() {
  var intervalMs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 500;
  isNoticeMicVolume = true;
  isMicphoneClosed = false;
  return callMethod$5('StartMicrophone', {
    intervalMs: intervalMs
  });
};
/**
 * @function 关闭麦克风
 * @return Promise | void
 */


var stopMicrophone = function stopMicrophone() {
  isNoticeMicVolume = false;
  isMicphoneClosed = true;
  return callMethod$5('StopMicrophone', {});
};

var openOrCloseMicrophone = async function openOrCloseMicrophone(operation) {
  if (operation) {
    await startMicrophone();
  } else {
    await stopMicrophone();
  }
};
/**
 * @function 设置麦克风音量大小回调周期
 * @param intervalMs: Number
 * @return Promise | void
 */


var setMicphoneVolumInterval = function setMicphoneVolumInterval(intervalMs) {
  return callMethod$5('SetMicphoneVolumInterval', {
    intervalMs: intervalMs
  });
};
/**
 * @function 获取麦克风设备列表
 * @return Promise | void
 */


var getMicrophoneDeviceListInternal = function getMicrophoneDeviceListInternal() {
  return callMethod$5('GetMicrophoneDeviceList', {});
};
/**
 * @function 获取麦克风列表
 * @return Promise | void
 */


var getMicrophoneDeviceList$1 = async function getMicrophoneDeviceList() {
  var defaultMicrophoneId = JSON.parse((await getDefaultMicrophone$1()).msg).deviceId;
  var resp = await getMicrophoneDeviceListInternal();
  var microphoneListArr = JSON.parse(JSON.parse(resp.msg).DeviceList) || [];
  var microphoneList = [];

  for (var i = 0, len = microphoneListArr.length; i < len; i++) {
    microphoneList.push({
      deviceId: microphoneListArr[i].id,
      deviceName: microphoneListArr[i].name,
      isDefault: defaultMicrophoneId === microphoneListArr[i].id
    });
    deviceListReport.micList[microphoneListArr[i].szDeviceId] = microphoneListArr[i].szDeviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.microphone) {
    window.zbyAVSDK_device_checker_init.microphone = {};
  }

  window.zbyAVSDK_device_checker_init.microphone.hasTest = true;
  window.zbyAVSDK_device_checker_init.microphone.list = microphoneList;
  defaultApi$1.writeLog("getMicrophoneDeviceList ".concat(JSON.stringify(microphoneList)));
  return microphoneList;
};
/**
 * @function 设置指定音频(当前麦克风)设备
 * @param deviceId: String 音频设备 id,必选
 * @return Promise | void
 */


var setCurrentMicrophoneDevice = function setCurrentMicrophoneDevice(deviceId) {
  window.zbyAVSDK_device_checker_init.microphone.use = deviceId;
  return callMethod$5('SetCurrentMicrophoneDevice', {
    deviceId: deviceId
  });
};
/**
 * @function 指定麦克风设备
 * @param deviceId: String 麦克风设备 id,必选
 * @param operationType: String 操作类型,可选
 * @return Promise | void
 */


var setMicrophoneDevice$2 = async function setMicrophoneDevice(args) {
  defaultApi$1.writeLog('-> getMicrophoneDeviceList_microphoneListArr_tal_rtc_i');
  var deviceId = args.deviceId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var microPhoneData;

  if (!deviceId) {
    microPhoneData = await getMicrophoneDeviceList$1();

    if (microPhoneData.length) {
      var hasGetMicrophone = false;
      var _iteratorNormalCompletion4 = true;
      var _didIteratorError4 = false;
      var _iteratorError4 = undefined;

      try {
        for (var _iterator4 = microPhoneData[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
          var item = _step4.value;

          if (item.isDefault) {
            deviceId = item.deviceId;
            deviceName = item.deviceName;
            hasGetMicrophone = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError4 = true;
        _iteratorError4 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
            _iterator4.return();
          }
        } finally {
          if (_didIteratorError4) {
            throw _iteratorError4;
          }
        }
      }

      if (!hasGetMicrophone) {
        deviceId = microPhoneData[0].deviceId;
        deviceName = microPhoneData[0].deviceName;
      }
    } else {
      deviceId = '';
    }

    if (deviceId === '') {
      NOTICE.noDevice({
        deviceType: 'microphone'
      });
    }
  }

  try {
    dataReport$2.setDevice({
      device_type: 2,
      device_id: deviceId,
      device_name: deviceListReport.micList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? +deviceState + 1 : '-'
    });
    window.zbyAVSDK_device_checker_init.microphone.name = deviceListReport.micList[deviceId];
  } catch (e) {}

  ;
  await setCurrentMicrophoneDevice(deviceId);

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!microPhoneData) {
      microPhoneData = await getMicrophoneDeviceList$1();
      deviceName = deviceListReport.micList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'microphone',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: microPhoneData,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }
};
/**
 * @function 获取当前麦克风的音量
 * @return Promise | void
 */


var formatVolumeMsg = function formatVolumeMsg(volume) {
  return JSON.stringify({
    ret: volume
  });
};

var getCurrentMicrophoneVolume = function getCurrentMicrophoneVolume() {
  return callMethod$5('GetCurrentMicrophoneVolume', {}).then(function (ret) {
    var volume = 0;

    try {
      volume = Math.round(JSON.parse(ret.msg).microphoneVolume / 255 * 100);
    } catch (e) {
      console.error("zby-live-sdk: getCurrentMicrophoneVolume ret: ".concat(ret, ". error: ").concat(e));
    }

    return {
      code: ret.code,
      msg: formatVolumeMsg(volume)
    };
  });
};
/**
 * @function 设置当前麦克风的音量
 * @param volume: number 音量值
 * @return Promise | void
 */


var setCurrentMicrophoneVolume = function setCurrentMicrophoneVolume(volume) {
  return callMethod$5('SetCurrentMicrophoneVolume', {
    volume: Math.round(volume / 100 * 255)
  });
}; // 摄像头相关

/**
 * @function 打开摄像头
 * @param width: Number
 * @param height: Number
 * @return Promise | void
 */


var startCamera = function startCamera(width, height) {
  return callMethod$5('StartCamera', {
    width: width,
    height: height,
    streamId: localStreamId$1
  });
};
/**
 * @function 关闭摄像头
 * @return Promise | void
 */


var stopCamera = function stopCamera() {
  return callMethod$5('StopCamera', {
    streamId: localStreamId$1
  });
};

var openOrCloseCamera$1 = async function openOrCloseCamera(operation) {
  if (operation) {
    await startCamera();
  } else {
    await stopCamera();
  }
};
/**
 * @function 获取摄像头列表
 * @return Promise | void
 */


var getCameraDeviceListInternal = function getCameraDeviceListInternal() {
  return callMethod$5('GetCameraDeviceList', {});
};
/**
 * @function 获取摄像头列表
 * @return Promise | void
 */


var getCameraDeviceList = async function getCameraDeviceList() {
  var resp = await getCameraDeviceListInternal();
  var videoListArr = JSON.parse(JSON.parse(resp.msg).DeviceList) || [];
  var videoList = [];

  for (var i = 0, len = videoListArr.length; i < len; i++) {
    var nameForChecking = videoListArr[i].name.toLowerCase();
    var checkIfIsDefaultFromName = nameForChecking.indexOf('built-in') >= 0 || nameForChecking.indexOf('builtin') >= 0 || nameForChecking.indexOf('default') >= 0 || nameForChecking.indexOf('默认') >= 0 || nameForChecking.indexOf('默認') >= 0;
    videoList.push({
      deviceId: videoListArr[i].id,
      deviceName: videoListArr[i].name,
      isDefault: videoListArr[i].default || checkIfIsDefaultFromName
    });
    deviceListReport.cameraList[videoListArr[i].szDeviceId] = videoListArr[i].szDeviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.camera) {
    window.zbyAVSDK_device_checker_init.camera = {};
  }

  window.zbyAVSDK_device_checker_init.camera.hasTest = true;
  window.zbyAVSDK_device_checker_init.camera.list = videoList;
  return videoList;
};
/**
 * @function 设置指定视频(当前摄像头)设备
 * @param deviceId: String 视频设备 id,必选
 * @return Promise | void
 */

var setCurrentCameraDeviceInternal = function setCurrentCameraDeviceInternal(deviceId) {
  var streamId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : localStreamId$1;
  window.zbyAVSDK_device_checker_init.camera.use = deviceId;
  return callMethod$5('SetCurrentCameraDevice', {
    streamId: streamId,
    deviceId: deviceId
  });
};
/**
 * @function 指定使用的摄像头
 * @param deviceId: String 摄像头 id,必选
 * @param operationType: String 操作类型,可选
 * 'device_error' -> 设备出错处理,'plug_and_unplug' -> 热插拔处理,
 * 不传即是普通的设置摄像头设备的行为
 * @return Promise | void
 */


var setCameraDevice$1 = async function setCameraDevice(args) {
  defaultApi$1.writeLog("setCameraDevice ".concat(JSON.stringify(args), " enableLocalCapture: ").concat(enableLocalCapture));
  var deviceId = args.deviceId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      code = args.code,
      changedDeviceId = args.changedDeviceId,
      streamId = args.streamId;

  if (!enableLocalCapture) {
    window.zbyAVSDK_device_checker_init.camera.use = deviceId;
    window.zbyAVSDK_device_checker_init.camera.name = deviceListReport.cameraList[deviceId];
    return;
  }

  var deviceName = '';
  var cameraData = await getCameraDeviceList();

  if (cameraData.length) {
    var defaultDevice;
    var _iteratorNormalCompletion5 = true;
    var _didIteratorError5 = false;
    var _iteratorError5 = undefined;

    try {
      for (var _iterator5 = cameraData[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
        var item = _step5.value;

        if (deviceId && item.deviceId === deviceId) {
          deviceName = item.deviceName;
          break;
        }

        if (item.isDefault) {
          defaultDevice = item;
        }
      }
    } catch (err) {
      _didIteratorError5 = true;
      _iteratorError5 = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
          _iterator5.return();
        }
      } finally {
        if (_didIteratorError5) {
          throw _iteratorError5;
        }
      }
    }

    if (!defaultDevice) {
      defaultDevice = cameraData[0];
    }

    if (!deviceId || !deviceName) {
      NOTICE.deviceError({
        code: -2,
        msg: '设备ID无效',
        deviceId: deviceId,
        deviceName: deviceName
      });
      deviceId = defaultDevice.deviceId;
      deviceName = defaultDevice.deviceName;
    }
  } else {
    deviceId = '';
  }

  if (deviceId === '') {
    NOTICE.noDevice({
      deviceType: 'camera'
    });
  }

  window.zbyAVSDK_device_checker_init.camera.use = deviceId;
  window.zbyAVSDK_device_checker_init.camera.name = deviceListReport.cameraList[deviceId];

  try {
    dataReport$2.setDevice({
      device_type: 1,
      device_id: deviceId,
      device_name: deviceListReport.cameraList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? deviceState + 1 : '-'
    });
  } catch (e) {}

  ;
  await setCurrentCameraDeviceInternal(deviceId, streamId);

  if (fourthStreamUsingCamera && fourthStreamId && !streamId) {
    await setCurrentCameraDeviceInternal(deviceId, fourthStreamId);
  }

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!cameraData) {
      cameraData = await getCameraDeviceList();
      deviceName = deviceListReport.cameraList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'camera',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: cameraData,
      messge: code,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }

  try {
    NOTICE.useredCamera({
      deviceId: deviceId,
      deviceName: deviceName
    });
  } catch (e) {}

  ;
};
/**
 * @function 获取当前摄像头 id
 * @return Promise | void
 */


var GetCurrentCameraId = function GetCurrentCameraId() {
  return callMethod$5('GetCurrentCameraId', {});
}; // 扬声器相关

/**
 * @function 获取扬声器列表
 * @return Promise | void
 */


var getAudioDeviceList$1 = function getAudioDeviceList() {
  return callMethod$5('GetAudioDeviceList', {});
};
/**
 * @function 获取系统默认的音频设备
 * @param deviceType: Number 音频设备类型,0 -> 麦克风,1 -> 扬声器,必选
 * @return Promise | void
 */


var getDefaultAudioDeviceId$1 = function getDefaultAudioDeviceId(deviceType) {
  return callMethod$5('GetDefaultAudioDeviceId', {
    deviceType: deviceType,
    // 以下两个参数仅仅是为了向下向后兼容,使用 hardcore 即可
    deviceId: '',
    deviceIdLength: 0
  });
};
/**
 * @function 获取系统默认的麦克风设备 id
 * @return Promise
 */


var getDefaultMicrophone$1 = function getDefaultMicrophone() {
  return getDefaultAudioDeviceId$1(0);
};
/**
 * @function 获取系统默认的扬声器设备 id
 * @return Promise
 */


var getDefaultSpeaker$1 = function getDefaultSpeaker() {
  return getDefaultAudioDeviceId$1(1);
};
/**
 * @function 获取扬声器设备列表
 * @return Promise | void
 */


var getSpeakerDeviceListInternal = function getSpeakerDeviceListInternal() {
  return callMethod$5('GetSpeakerDeviceList', {});
};
/**
 * @function 获取扬声器列表
 * @return Promise | void
 */


var getSpeakerDeviceList$1 = async function getSpeakerDeviceList() {
  var defaultSpeakerId = JSON.parse((await getDefaultSpeaker$1()).msg).deviceId;
  var resp = await getSpeakerDeviceListInternal();
  var speakerListArr = JSON.parse(JSON.parse(resp.msg).DeviceList) || [];
  var speakerList = [];

  for (var i = 0, len = speakerListArr.length; i < len; i++) {
    speakerList.push({
      deviceId: speakerListArr[i].id,
      deviceName: speakerListArr[i].name,
      isDefault: defaultSpeakerId === speakerListArr[i].id
    });
    deviceListReport.speakerList[speakerListArr[i].szDeviceId] = speakerListArr[i].szDeviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.speaker) {
    window.zbyAVSDK_device_checker_init.speaker = {};
  }

  window.zbyAVSDK_device_checker_init.speaker.hasTest = true;
  window.zbyAVSDK_device_checker_init.speaker.list = speakerList;
  return speakerList;
};
/**
 * @function 设置指定音频(当前扬声器)设备
 * @param deviceId: String 音频设备 id,必选
 * @return Promise | void
 */


var setCurrentSpeakerDevice = function setCurrentSpeakerDevice(deviceId) {
  window.zbyAVSDK_device_checker_init.speaker.use = deviceId;
  return callMethod$5('SetCurrentSpeakerDevice', {
    deviceId: deviceId
  }).then(function (result) {
    if (result.code === 0) {
      NOTICE.speakerChanged({
        deviceId: deviceId
      });
    }

    return result;
  });
};
/**
 * 获取当前扬声器设备id
 * @return {String} 当前扬声器设备id
 */


var getCurrentSpeakerDevice$1 = function getCurrentSpeakerDevice() {
  defaultApi$1.writeLog("avsdk TALSDK::getSpeakerDevice ".concat(usingAudioDeviceId$1.speaker));
  return usingAudioDeviceId$1.speaker;
};
/**
 * @function 指定扬声器
 * @param deviceId: String 扬声器 id,必选
 * @param operationType:String 操作类型,可选
 * 'device_error' -> 设备出错处理,'plug_and_unplug' -> 热插拔处理,
 * 不传即是普通的设置扬声器设备的行为
 * @return Promise | void
 */


var setSpeakerDevice$2 = async function setSpeakerDevice(args) {
  defaultApi$1.writeLog("".concat(JSON.stringify(args), "----setSpeakerDevice-talrtc----"));
  var deviceId = args.deviceId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      code = args.code,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var speakerData;

  if (!deviceId) {
    speakerData = await getSpeakerDeviceList$1();

    if (speakerData.length) {
      var hasGetSpeaker = false;
      var _iteratorNormalCompletion6 = true;
      var _didIteratorError6 = false;
      var _iteratorError6 = undefined;

      try {
        for (var _iterator6 = speakerData[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
          var item = _step6.value;

          if (item.isDefault) {
            deviceId = item.deviceId;
            deviceName = item.deviceName;
            hasGetSpeaker = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError6 = true;
        _iteratorError6 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion6 && _iterator6.return != null) {
            _iterator6.return();
          }
        } finally {
          if (_didIteratorError6) {
            throw _iteratorError6;
          }
        }
      }

      if (!hasGetSpeaker) {
        deviceId = speakerData[0].deviceId;
        deviceName = speakerData[0].deviceName;
      }
    } else {
      deviceId = '';
    }

    if (deviceId === '') {
      NOTICE.noDevice({
        deviceType: 'speaker'
      });
    }
  }

  try {
    dataReport$2.setDevice({
      device_type: 3,
      device_id: deviceId,
      device_name: deviceListReport.speakerList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? deviceState + 1 : '-'
    });
    window.zbyAVSDK_device_checker_init.speaker.name = deviceListReport.speakerList[deviceId];
  } catch (e) {
    console.log(e);
  }

  ;
  usingAudioDeviceId$1.speaker = deviceId;
  await setCurrentSpeakerDevice(deviceId);

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!speakerData) {
      speakerData = await getSpeakerDeviceList$1();
      deviceName = deviceListReport.speakerList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'speaker',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: speakerData,
      message: code,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }
};
/**
 * @function 获取当前扬声器的音量
 * @returns {Promise<number>}
 */


var getCurrentSpeakerVolume = function getCurrentSpeakerVolume() {
  return callMethod$5('GetCurrentSpeakerVolume', {}).then(function (ret) {
    var volume = 0;

    try {
      volume = Math.round(JSON.parse(ret.msg).speakerVolume / 255 * 100);
    } catch (e) {
      console.error("zby-live-sdk: getCurrentSpeakerVolume ret: ".concat(ret, ". error: ").concat(e));
    }

    return volume;
  });
};
/**
 * @function 是否存在媒体流
 * @param streamId
 * @returns {boolean}
 */


var hasStream$2 = function hasStream(streamId) {
  return Object.keys(streamIdToPreviewId$2).includes(streamId);
};
/**
 * @function 获取当前视频流的通道
 * @param  streamId 流 id
 * @return channelIndex
 */

var getChannelIndex$1 = function getChannelIndex(streamId) {
  defaultApi$1.writeLog("avsdk TALSDK::getChannelIndex streamId: ".concat(streamId, " ").concat(JSON.stringify(streamIdToPreviewId$2)));
  return streamIdToPreviewId$2[streamId];
};
/**
 * @function 获取当前视频流所有的通道
 * @param  streamId 流 id
 * @return channelIndex
 */

var getAllChannelIndex$1 = function getAllChannelIndex() {
  defaultApi$1.writeLog("avsdk TALSDK::getAllChannelIndex ".concat(JSON.stringify(streamIdToPreviewId$2)));
  return streamIdToPreviewId$2;
};
/**
 * @function 设置当前扬声器音量
 * @param volume: number 音量值
 * @return Promise | void
 */

var setCurrentSpeakerVolume = function setCurrentSpeakerVolume(volume) {
  return callMethod$5('SetCurrentSpeakerVolume', {
    volume: Math.round(volume / 100 * 255)
  });
};
/**
 * @function 设置扬声器静音
 * @param mute: Boolean 必选
 * @return Promise | void
 */


var setSpeakerDeviceMute$1 = function setSpeakerDeviceMute(mute) {
  return callMethod$5('SetSpeakerDeviceMute', {
    deviceId: usingAudioDeviceId$1.speaker,
    mute: mute
  });
};
/**
 * @function 获取当前应用程序音量
 * @return Promise | void
 */


var getSpeakerSimpleVolume$1 = function getSpeakerSimpleVolume() {
  return callMethod$5('GetSpeakerSimpleVolume', {
    deviceId: usingAudioDeviceId$1.speaker
  }).then(function (ret) {
    var volume = 0;

    try {
      volume = Math.round(JSON.parse(ret.msg).speakerVolume / 255 * 100);
    } catch (e) {
      console.error("zby-live-sdk: getSpeakerSimpleVolume ret: ".concat(ret, ". error: ").concat(e));
    }

    return volume;
  });
};
/**
 * @function 设置当前应用程序音量
 * @param volume: Number 应用程序音量,必选
 * @return Promise | void
 */


var setSpeakerSimpleVolume$1 = function setSpeakerSimpleVolume(volume) {
  return callMethod$5('SetSpeakerSimpleVolume', {
    deviceId: usingAudioDeviceId$1.speaker,
    volume: Math.round(volume / 100 * 255)
  });
};
/**
 * @function 设置当前应用程序静音
 * @param mute: Boolean 是否静音,必选
 * @return Promise | void
 */


var setSpeakerSimpleMute$1 = function setSpeakerSimpleMute(mute) {
  return callMethod$5('SetSpeakerSimpleMute', {
    deviceId: usingAudioDeviceId$1.speaker,
    mute: mute
  });
};

var enableAudioSpeakerCapture = function enableAudioSpeakerCapture(capture) {
  setSystemAudioLoopback(capture);
};
/**
 * @function 打开系统声音采集
 * @enable true|false
 * @return Promise | void
 */


var setSystemAudioLoopback = function setSystemAudioLoopback(enable) {
  isSpeakerCapturing = enable;

  if (enable) {
    return setAudioType(6, localStreamId$1);
  } else {
    return setAudioType(1, localStreamId$1);
  } // return callMethod('SetAudioSpeakerCapture', {
  //   enable,
  // });

};
/**
 * @function 录制转推对外接口
 * @param type: String start/stop 必选
 * @param targetUrl: String 转推地址(支持 RTMP) 必选
 * @return Promise | void
 */


var controlCdnStreaming = async function controlCdnStreaming(type) {
  var targetUrl = 'rtmp://media-push-ali-test.livecloud.eaydu.com/testlive/210926-11?key=75c868672113df0063430e9e47fb2a60&appId=zt10001&bizId=zt10001AI&cdn=1';
  defaultApi$1.writeLog("avsdk TALRTC::controlCdnStreaming targetUrl: ".concat(targetUrl, " type: ").concat(type));

  if (type === 'start') {
    return addPublishRtmpStreamUrl(targetUrl);
  }

  if (type === 'stop') {
    return removePublishStreamUrl(targetUrl);
  }
};
/**
 * @function SEI 消息
 * @param data: String    数据
 * @param dataSize: Number    数据长度
 * @param repeatCount: Number    重试次数
 * @return Promise | void
 */


var sendSEIMsg = function sendSEIMsg(data) {
  return callMethod$5('SendSEIMsg', {
    data: data,
    dataSize: data.length,
    repeatCount: 3
  });
};
/**
 * @function 开始屏幕采集
 * @return Promise | void
 */


var startScreenCapture = function startScreenCapture() {
  return callMethod$5('StartScreenCapture', {});
};
/**
 * @function 停止屏幕采集
 * @return Promise | void
 */


var stopScreenCapture = function stopScreenCapture() {
  return callMethod$5('StopScreenCapture', {});
};

var setPreviewStreamId = function setPreviewStreamId(streamId) {
  return callMethod$5('SetPreviewStreamId', {
    streamId: streamId
  });
}; // 推拉流相关

/**
 * @function 开启本地或者远程的视频视图
 * @param isLocal: Boolean 是否是本地的视频预览,必选
 * @param streamId: String 要拉取的视频流的 id,可选,只有拉取远程的视频流的时候才是必选的
 * @param domId: String <video> 标签的 id,可选
 * 如果传了 domId,就把视频绑定到对应的 <video> 标签上
 * @return Promise 可从 Promise 中获取 src,Promise.then((src) => {})
 */


var startLocalOrRemotePreview$2 = async function startLocalOrRemotePreview(isLocal, streamId, domId, isTeacherNewWindowPreview) {
  defaultApi$1.writeLog("avsdk TALSDK::startLocalOrRemotePreview streamId: ".concat(streamId, ", isLocal: ").concat(isLocal));
  var isUpdateChromeVersion = await util.getChromeVersion();
  var externalConstraints = {
    audio: false,
    video: {
      mandatory: {
        chromeMediaSource: 'external',
        chromeMediaSourceId: "ems://talrtc_ext/".concat(isLocal || isTeacherNewWindowPreview ? -2 : streamId),
        maxWidth: 3840,
        maxHeight: 2160,
        minWidth: 240,
        minHeight: 180
      }
    }
  };
  defaultApi$1.writeLog("externalConstraints ".concat(JSON.stringify(externalConstraints)));

  if (isLocal) {
    await setPreviewStreamId(streamId || localStreamId$1);
  }

  return new Promise(function (resolve, reject) {
    var handleExternalSuccess = function handleExternalSuccess(stream) {
      defaultApi$1.writeLog("".concat(stream, "----stream-talrtc----"));

      stream.oninactive = function () {
        defaultApi$1.writeLog('Stream inactive');
      };

      var src = isUpdateChromeVersion ? stream : window.URL.createObjectURL(stream);

      if (domId && document.querySelector(domId)) {
        if (isUpdateChromeVersion) {
          document.querySelector(domId).srcObject = stream;
          console.log('内核升级1', domId, document.querySelector(domId), document.querySelector(domId).srcObject, src);
        } else {
          console.log('内核升级2');
          document.querySelector(domId).src = window.URL.createObjectURL(stream);
        }
      }

      defaultApi$1.writeLog("-> setVidoeSrc, streamId:".concat(streamId, ", domId: ").concat(domId, ", src: ").concat(src));
      resolve(src);
    };

    var handleExternalError = function handleExternalError(error) {
      if (error.name === 'ConstraintNotSatisfiedError') {
        console.error('ConstraintNotSatisfiedError');
      } else if (error.name === 'PermissionDeniedError') {
        console.error('Permissions have not been granted to use your camera and ' + 'microphone, you need to allow the page access to your devices in ' + 'order for the demo to work.');
      }

      console.error("getUserMedia error: ".concat(error.name), error);

      if (domId) {
        document.querySelector(domId).src = '';
      }

      reject('');
    };

    if (navigator.webkitGetUserMedia) {
      navigator.webkitGetUserMedia(externalConstraints, handleExternalSuccess, handleExternalError);
    }
  });
};
/**
 * 
 * @param {number} type 0:接管模式,输出头像视频;1:非接管模式,输出播放器视频 
 * @returns 
 */


var setVideoCallback$1 = function setVideoCallback(type) {
  defaultApi$1.writeLog("avsdk TALSDK::setVideoCallback type: ".concat(type));
  return callMethod$5('SetVideoCallback', {
    type: type
  });
};
/**
 * @function 开始推流
 * @param streamId: String   流 id
 * @return Promise | void
 */


var startPush$1 = async function startPush() {
  var streamId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : localStreamId$1;
  var idx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  defaultApi$1.writeLog("avsdk TALSDK::startPush streamId: ".concat(streamId, ", idx: ").concat(idx));
  localStreamIdMap[idx] = streamId;

  if (idx === 3 && fourthStreamUsingCamera) {
    setFourthStreamType$1(6, streamId);
  }

  try {
    if (!isFirstHeartBeatReport$2) {
      isFirstHeartBeatReport$2 = true;
      heartBeatDataReport$2('start');
    }
  } catch (error) {}

  var muteAudio = localStreamMuteStatus.audio;
  var muteVideo = localStreamMuteStatus.video;
  return callMethod$5('StartPush', {
    streamId: streamId,
    muteAudio: muteAudio,
    muteVideo: muteVideo,
    muteDefaultAudio: classMode === 1 || classMode === 2,
    muteDefaultVideo: classMode === 1 || classMode === 2
  });
};
/**
 * @function 停止推流
 * @param streamId: String   流 id
 * @return Promise | void
 */


var stopPush$1 = function stopPush(streamId) {
  if (!streamId) {
    streamId = localStreamId$1;
  }

  if (streamId === screenStreamId$1) {
    isScreenSharing = false;
  }

  defaultApi$1.writeLog("avsdk TALSDK::stopPush streamId: ".concat(streamId));
  var idx = localStreamIdMap.indexOf(streamId);

  if (idx > -1) {
    delete localStreamIdMap[idx];
  }

  return callMethod$5('StopPush', {
    streamId: streamId
  });
};
/**
 * @function 不推/推 音频, 自研引擎需要流id
 * @param mute: bool
 * @return Promise | void
 */


var muteLocalAudio$1 = function muteLocalAudio(mute) {
  defaultApi$1.writeLog("avsdk TALSDK::muteLocalAudio mute: ".concat(mute, ", localStreamId: ").concat(localStreamId$1));
  localStreamMuteStatus.audio = mute;
  return callMethod$5('MuteLocalAudio', {
    mute: mute,
    streamId: localStreamId$1
  });
};
/**
 * @function 不推/推 视频
 * @param mute: bool
 * @return Promise | void
 */


var muteLocalVideo$1 = function muteLocalVideo(mute) {
  var streamId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : localStreamId$1;
  defaultApi$1.writeLog("avsdk TALSDK::muteLocalVideo mute: ".concat(mute));
  localStreamMuteStatus.video = mute;
  return callMethod$5('MuteLocalVideo', {
    mute: mute,
    streamId: streamId
  });
};
/**
 * @function 开始转推本地摄像头 TALRTC 流至 RTMP。目前只支持转推 1 路
 * @return Promise | void
 */


var addPublishRtmpStreamUrl = function addPublishRtmpStreamUrl(url) {
  defaultApi$1.writeLog("avsdk TALSDK::addPublishRtmpStreamUrl url: ".concat(url));
  return callMethod$5('AddPublishRtmpStreamUrl', {
    url: url
  });
};
/**
 * @function 停止转推 RTMP
 * @return Promise | void
 */


var removePublishStreamUrl = function removePublishStreamUrl(url) {
  defaultApi$1.writeLog("avsdk TALSDK::removePublishStreamUrl url: ".concat(url));
  return callMethod$5('RemovePublishStreamUrl', {
    url: url
  });
};
/**
 * @function 开始拉流
 * @param {string} streamId   流 id
 * @return {Promise} Promise | void
 */


var startPlay = function startPlay(streamId, muteAudio, muteVideo) {
  if (typeof muteAudio === 'undefined') {
    muteAudio = getStreamMuteStatus(streamId, 'audio');
  }

  if (typeof muteVideo === 'undefined') {
    muteVideo = getStreamMuteStatus(streamId, 'video');
  }

  defaultApi$1.writeLog("avsdk TALSDK::startPlay streamId: ".concat(streamId, ", muteAudio: ").concat(muteAudio, ", muteVideo: ").concat(muteVideo));
  audioPullingStore.setData(streamId, {
    muted: muteAudio
  });
  videoPullingStore.setData(streamId, {
    muted: muteVideo
  });
  return callMethod$5('StartPlay', {
    myStreamId: localStreamId$1,
    streamId: streamId,
    muteAudio: muteAudio,
    muteVideo: muteVideo,
    muteDefaultAudio: classMode === 1 || classMode === 2,
    muteDefaultVideo: classMode === 1 || classMode === 2
  }).then(function () {
    setStreamMuteStatus(streamId, 'audio', muteAudio);
    setStreamMuteStatus(streamId, 'video', muteVideo);

    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    return args;
  });
};
/**
 * @function 初始化拉流
 * @param {string} streamId:String 从传来的信道消息中获取,必选
 * @param {string} domId:String <video> 标签的 id,可选
 * 如果传了就把视频绑定到对应的 <video> 标签上
 * @param pInfo:String 多媒体流附加信息,可选,默认为 'none'
 * @return src:String 视频预览地址
 */


var initPullFlow$2 = async function initPullFlow(streamId, domId, mute, pInfo, notAutoPlay, audioOnly) {
  defaultApi$1.writeLog("TALRTC::initPullFlow_start , streamId :".concat(streamId, ", notAutoPlay: ").concat(notAutoPlay, ", audioOnly: ").concat(audioOnly));
  var playChannel;
  resetStreamIdRtcPlayerInfo1$2(streamId);
  resetStreamIdRtcPlayerInfo$2(streamId);

  try {
    if (!isFirstHeartBeatReport$2) {
      isFirstHeartBeatReport$2 = true;
      heartBeatDataReport$2('start');
    }
  } catch (error) {}

  if (streamIdToPreviewId$2[streamId] == undefined) {
    defaultApi$1.writeLog("TALRTC::  The streamId queue does not contain this streamId ".concat(uiChnIndexs$1));
    var arr = streamId.split('_');

    var _arr = _slicedToArray(arr, 3),
        _userId = _arr[2];

    if (String(_userId).toUpperCase() === String(lecturerUid$1)) {
      playChannel = arr.length === 4 ? chnTotal$1 : chnTotal$1 + 1; // 主流使用50,辅流使用51
    } else {
      if (uiChnIndexs$1.length === 0) {
        defaultApi$1.writeLog('TALRTC::  all channel are used', null, 'error');
        delete streamIdRtcPlayerInfo$2[streamId];
        NOTICE.overMaxConnect({
          streamId: streamId,
          message: 'reach max connect'
        });
        return {
          videoSrc: '',
          playerId: -2
        };
      }

      playChannel = uiChnIndexs$1.pop();
    }

    streamIdToPreviewId$2[streamId] = playChannel;
  } else {
    defaultApi$1.writeLog("TALRTC::The streamId queue contains this streamId: ".concat(streamId));
    playChannel = streamIdToPreviewId$2[streamId]; // console.log('streamIdIsExited',playChannel,streamIdToPreviewId[streamId],uiChnIndexs);

    await stopPlay(streamId);
    resetStreamIdRtcPlayerInfo$2(streamId);
  } // 判断是否创建或者获取播放通道成功,不成功就删掉重试


  if (playChannel == undefined) {
    delete streamIdToPreviewId$2[streamId];
    defaultApi$1.writeLog('TALRTC::  uiChnIndex is not exist', null, 'error');
    return initPullFlow(streamId, domId, mute, pInfo, notAutoPlay, audioOnly);
  }

  previewIdToStreamId$1[playChannel] = streamId;
  /**
   * 将 muteRemote 参数耦合进startPlay,减少异步调用,降低黑屏概率
   */
  // 是否拉取声音
  // await muteRemoteAudio(streamId, !!mute);
  // // 是否拉取画面
  // await muteRemoteVideo(streamId, !!audioOnly);

  var videoSrc = await startLocalOrRemotePreview$2(false, streamId, domId);

  if (!notAutoPlay) {
    await startPlay(streamId, !!mute, !!audioOnly);
  }

  return {
    videoSrc: videoSrc,
    playerId: playChannel
  };
};
/**
 * @function 开始连麦
 * @param mode: number 采集器默认, 默认0=站立 1=坐立
 * @return Promise | void
 */

var teacherStartLinkMic$2 = async function teacherStartLinkMic() {
  var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  await startMicrophone();

  if (mode === 0) {
    await muteLocalVideo$1(true, localStreamId$1);
    await setMicrophoneDevice$2({}); // await muteStreamAudio(false);

    await muteLocalAudio$1(false);
  } else {
    // await muteLocalVideo(false, localStreamId);
    await muteLocalAudio$1(false);
  }
};
/**
 * @function 结束连麦
 * @param mode:number 采集器默认, 默认0=站立 1=坐立
 * @return Promise | void
 */

var teacherStopLinkMic$2 = async function teacherStopLinkMic() {
  var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  await stopMicrophone();

  if (mode === 0) {
    await muteLocalAudio$1(true);
  } else {
    await setSystemAudioLoopback(false);
  }
};
/**
 * @function 停止拉流
 * @param streamId: String 流 id
 * @return Promise | void
 */

var stopPlay = function stopPlay(streamId, recovery) {
  var id = streamIdToPreviewId$2[streamId];
  delete streamIdRtcPlayerInfo$2[streamId];

  if (recovery && (id || id === 0) && !uiChnIndexs$1.includes(id)) {
    defaultApi$1.writeLog("avsdk TALRTC::stopPlayStream streamId: ".concat(streamId, " id: ").concat(id, " uiChnIndexs: ").concat(uiChnIndexs$1));

    if (id === chnTotal$1 || id === chnTotal$1 + 1) {
      defaultApi$1.writeLog("".concat(streamId, " is teacher's main or sub stream, do not push to uiChnIndexs."));
    } else {
      uiChnIndexs$1.push(id);
    }

    delete streamIdToPreviewId$2[streamId];
    delete previewIdToStreamId$1[id];
  }

  audioPullingStore.delete(streamId);
  videoPullingStore.delete(streamId);
  return callMethod$5('StopPlay', {
    streamId: streamId
  });
};
/**
 * @function 停止拉所有的流
 * @return Promise | void
 */


var stopPlayAll = function stopPlayAll() {
  streamIdRtcPlayerInfo$2 = {};
  streamIdToPreviewId$2 = {};
  previewIdToStreamId$1 = {};
  uiChnIndexs$1.length = chnTotal$1;
  uiChnIndexs$1.fill(0).forEach(function (value, index, array) {
    array[index] = array.length - (index + 1);
  });
  audioPullingStore.restore();
  videoPullingStore.restore();
  return callMethod$5('StopPlayAll', {});
};
/**
 * @function 切换播放流
 * @param streamId: String 需要停止流的 id,必选
 * @param toStreamId: String 被拉取的流的 id,必选
 * @param toDomId: String <video> 标签的 id,可选
 * @return Promise | void
 */


var changePullFlow$2 = async function changePullFlow(streamId, toStreamId, toDomId) {
  await stopPlay(streamId);
  return initPullFlow$2(toStreamId, toDomId);
};
/**
 * @function 是否拉取音频流--通过播放器id控制
 * @param mute: Boolean,必选,true -> 不拉取,false -> 拉取,必选
 * @param playerId: Number,必选,播放器 id
 * @return Promise | void
 */


var pullAudioFlow$2 = function pullAudioFlow(playerId, mute, streamid) {
  defaultApi$1.writeLog("pullAudioFlow -- playerId ".concat(playerId, " operation ").concat(mute, " streamId ").concat(streamid));

  if (streamid) {
    if (streamIdToPreviewId$2[streamid] == undefined) {
      NOTICE.pullAudioFlowError({
        streamid: streamid
      });
      return;
    } else {
      playerId = streamIdToPreviewId$2[streamid];
      defaultApi$1.writeLog("pullAudioFlow-playerId ".concat(playerId, ", ").concat(JSON.stringify(streamIdToPreviewId$2)));
    }
  }

  var streamId = previewIdToStreamId$1[playerId];

  try {
    streamIdRtcPlayerInfo1$2[streamId].audio_type = !mute;
    defaultApi$1.writeLog("pullAudioFlow, ".concat(streamId, " ::previewIdToStreamId', ").concat(JSON.stringify(previewIdToStreamId$1), " ::streamIdRtcPlayerInfo1 ").concat(JSON.stringify(streamIdRtcPlayerInfo1$2)));
  } catch (e) {
    defaultApi$1.writeLog("pullAudioFlow ::streamIdRtcPlayerInfo1--error ".concat(JSON.stringify(e)), null, 'error');
  }

  try {
    dataReport$2.setPullVoice({
      code: +!mute,
      pull_uid: util.getUidByStreamId(streamId),
      pull_streamid: streamId,
      playerId: playerId // operator:'client'

    });
  } catch (e) {}

  ;
  return muteRemoteAudio(streamId, mute);
};
/**
  * @function 设置镜像状态(预览)
  * @param { 0 | 1 | 2 | 3 } mode 0: 预览启用镜像,推流不启用镜像; 1: 预览启用镜像,推流启用镜像; 2: 预览不启用镜像,推流不启用镜像; 3: 预览不启用镜像,推流启用镜像
  * @return {Promise}
  */


var setMirrorStatus$2 = function setMirrorStatus(mode) {
  var realId = mode == 0 ? 2 : 1;
  defaultApi$1.writeLog("avsdk TALRTC::setMirrorStatus, mode: ".concat(mode, ", streamId:").concat(localStreamId$1, ", realId:").concat(realId));
  return callMethod$5('SetMirrorStatus', {
    mode: realId,
    streamId: localStreamId$1
  });
};
/**
  * @function 设置拉流镜像状态
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
  */


var setPlayViewMirror$1 = function setPlayViewMirror(isMirror, id) {
  return callMethod$5('SetPlayViewMirror', {
    isMirror: isMirror,
    streamId: id
  });
};
/**
 * @function 开启预览
 * @param idx: Number 推流通道,可选,默认为 0
 * @return Promise | void
 */


var startPreview$2 = function startPreview(idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$5('StartPreview', {
    idx: idx
  });
};
/**
 * @function 停止预览
 * @param idx: Number 推流通道,可选,默认为 0
 * @return Promise | void
 */


var stopPreview$2 = function stopPreview(idx) {
  if (typeof idx === 'undefined') {
    idx = 0;
  }

  return callMethod$5('StopPreview', {
    idx: idx
  });
};
/**
 * @function 不拉/拉 音频
 * @param streamId: string
 * @param mute: bool
 * @return Promise | void
 */


var muteRemoteAudio = function muteRemoteAudio(streamId, mute) {
  return callMethod$5('MuteRemoteAudio', {
    streamId: streamId,
    mute: mute
  }).then(function () {
    var audio = audioPullingStore.getData(streamId);

    if (audio) {
      audio.muted = mute;
    }

    setStreamMuteStatus(streamId, 'audio', mute);

    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
      args[_key2] = arguments[_key2];
    }

    return args;
  });
};
/**
 * @function 不拉/拉 视频
 * @param streamId: string
 * @param mute: bool
 * @return Promise | void
 */


var muteRemoteVideo = function muteRemoteVideo(streamId, mute) {
  return callMethod$5('MuteRemoteVideo', {
    streamId: streamId,
    mute: mute
  }).then(function () {
    var video = videoPullingStore.getData(streamId);

    if (video) {
      video.muted = mute;
    }

    setStreamMuteStatus(streamId, 'video', mute);

    for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
      args[_key3] = arguments[_key3];
    }

    return args;
  });
};
/**
 * @function 设置外部采集设备模块
 * @param {boolean} enable  是否开启外部采集设备模块
 * @param {string} streamId
 * @param {number} video_source  0:屏幕采集 1:player采集
 * @attention
 * @return Promise | void
 */


var enableExternalVideoSource = function enableExternalVideoSource() {
  var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  var streamId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : localStreamId$1;
  var video_source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  defaultApi$1.writeLog('avsdk TALRTC::EnableExternalVideoSource');
  return callMethod$5('EnableExternalVideoSource', {
    enable: enable,
    streamId: streamId,
    video_source: video_source
  });
};
var setFourthStreamType$1 = function setFourthStreamType(type, streamId) {
  defaultApi$1.writeLog("avsdk TALRTC::SetFourthStreamType type:".concat(type, " streamId:").concat(streamId));

  if (!streamId) {
    defaultApi$1.writeLog('avsdk TALRTC::SetFourthStreamType - streamId is null', null, 'error');
    throw new Error('streamId is null');
  }

  fourthStreamId = streamId;

  if (type === 6) {
    fourthStreamUsingCamera = true;
    setAudioType(7, streamId);
    enableExternalVideoSource(false, streamId, 1);
    setCurrentCameraDeviceInternal(window.zbyAVSDK_device_checker_init.camera.use, streamId);
  } else if (type === 7) {
    fourthStreamUsingCamera = false;
    setAudioType(8, streamId);
    enableExternalVideoSource(true, streamId, 1);
  } else {
    defaultApi$1.writeLog('avsdk TALRTC::SetFourthStreamType - type error', null, 'error');
    throw new Error('type error');
  }
}; //设置音频数据来源

var setAudioAuxSource$1 = function setAudioAuxSource(source) {
  defaultApi$1.writeLog('avsdk TALRTC::setAudioAuxSource');
  return callMethod$5('SetAudioAuxSource', {
    source: source
  });
};
/**
 * RTC流音频类型
 * @param {number} type 音频类型  0:静音 / 1:麦克风  / 2:拉流的声音  / 3:1+2 / 4:麦克风+扬声器+2 5: 扬声器 6: 麦克风+扬声器 7:麦克风+2 8: player插件音频
 * @param {string} streamId 流
 * @returns {Promise<void>}
 */


var setAudioType = function setAudioType(type, streamId) {
  defaultApi$1.writeLog('avsdk TALRTC::SetAudioType');

  if (!streamId) {
    streamId = screenStreamId$1;
  }

  return callMethod$5('SetAudioType', {
    streamId: streamId,
    type: type
  });
};
/**
 * 
 * @param {boolean} enable 
 * @param {number} type
 * @returns 
 */


var enableRTCAudioMixMode = function enableRTCAudioMixMode(enable, type) {
  return callMethod$5('EnableRTCAudioMixMode', {
    enable: enable,
    type: type
  });
}; //开启音频外部采集 参数:channel   参数类型:int 通道(传1使用辅通道)

var startAudioExCapture$1 = function startAudioExCapture(channel) {
  defaultApi$1.writeLog('avsdk TALRTC::startAudioExCapture');
  return callMethod$5('StartAudioExCapture', {
    channel: channel
  });
};
/**
 * @function 加载采集插件的输出数据  //采集屏幕并且拼接了连麦学生头像的数据
 * @returns {Promise}
 */


var loadCollectionOutputEntry$1 = function loadCollectionOutputEntry() {
  return callMethod$5('LoadCollectionOutputEntry', {
    streamId: localStreamId$1
  });
};
/**
 * @function 加载采集插件的输出数据  //只采集屏幕数据
 * @returns {Promise}
 */

var LoadCollectionOutputEntry2$1 = function LoadCollectionOutputEntry2() {
  defaultApi$1.writeLog('avsdk TALRTC::LoadCollectionOutputEntry2');
  return callMethod$5('LoadCollectionOutputEntry2', {
    streamId: screenStreamId$1
  });
}; //开启同屏


var startMultiScreen$1 = async function startMultiScreen() {
  defaultApi$1.writeLog('avsdk TALRTC::startMultiScreen'); // await enableExternalVideoSource(true,1);

  await LoadCollectionOutputEntry2$1();
};
/**
 * 音频增强调到最高优先级
 * @param {string} streamId 
 * @param {string} uid 
 * @param {boolean} add 
 * @returns 
 */


var setChiefAudioStream = async function setChiefAudioStream(streamId, uid) {
  var add = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  defaultApi$1.writeLog('avsdk TALRTC::SetChiefAudioStream');
  return callMethod$5('SetChiefAudioStream', {
    streamId: streamId,
    uid: uid,
    add: add
  });
};
/**
 * talrtc40路拉流混音接口
 * @param {number} mixMode //混流模式  0=关闭混流  1=开启混流
 * @param {Array<string>} streamIdArr //表示要突出声音的channel
 * @returns {Promise}
 */


var setAudioMixMode$1 = async function setAudioMixMode(mixMode, streamIdArr) {
  // let channelsArr = [];
  // if(streamIdArr.length > 0){
  //   streamIdArr.forEach( item => {
  //     channelsArr.push(getChannelIndex(item));
  //   });
  // }
  if (!Array.isArray(streamIdArr)) return; // if (!streamIdArr.includes(teacherId)) {
  //   streamIdArr.push(teacherId);
  // }

  return callMethod$5('SetAudioMixMode', {
    mixMode: mixMode,
    streamIdArr: streamIdArr,
    num: streamIdArr.length
  });
};
/**
 * @function 离开教室
 * @return Promise | void
 */

var leaveRoom$2 = async function leaveRoom() {
  for (var key in streamIdToPreviewId$2) {
    stopPlay(key, true); //huishou
  }

  if (screenStreamId$1) {
    screenStreamId$1 = null;
  }

  stopPush$1(localStreamId$1);

  if (isSpeakerCapturing) {
    setSystemAudioLoopback(false);
  }

  if (window.zby_sdk_init_params.role === 'teacher' && window.zby_sdk_init_params.mode === 1) {
    //坐立模式关闭外部采集器,站立关闭外部采集器
    enableExternalVideoSource(false);
  }

  localStreamId$1 = null;
  screenStreamId$1 = null;
  fourthStreamId = null;
  removerListener$2();
  destroyEngine$2();
  heartBeatDataReport$2('stop'); // isFirstHeartBeatReport = false;

  userRTCStatus.clear();
  streamIdToPreviewId$2 = {};
  previewIdToStreamId$1 = {};
  streamIdRtcPlayerInfo$2 = {};
  streamIdRtcPlayerInfo1$2 = {};
  localStreamIdMap.length = 0;
  uiChnIndexs$1.length = chnTotal$1;
  uiChnIndexs$1.fill(0).forEach(function (value, index, array) {
    array[index] = array.length - (index + 1);
  });
  clearInterval(pullingStreamInterval$1);
  pullingStreamInterval$1 = -1;
};
/**
 * @function 卸载 Talrtc 扩展
 * @return Promise | void
 */


var unloadTalrtc = function unloadTalrtc() {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$7) {
    return new Promise(function (resolve, reject) {
      EM$7.UnLoad(extensionId$3, function (code, msg) {
        defaultApi$1.writeLog("unloadTalrtc Code: ".concat(code, "\nMessage: ").concat(msg));
        resolve();
      });
    });
  }
};
/**
 * @function 本地录制
 * @param {string | undefined} fileName 
 * @param {number} fileType 1:flv 2:mp4
 * @param {number} idx 0:主流 1:辅流 2:RTMP流
 * @param {string} path unicode路径
 * @returns {Promise<any>}
 */

var startRecord$1 = async function startRecord(fileName, fileType, idx, path) {
  var streamId = localStreamIdMap[idx];
  defaultApi$1.writeLog("avsdk TALRTC::startRecord fileName: ".concat(fileName, ", fileType: ").concat(fileType, ", idx: ").concat(idx, ", streamId: ").concat(streamId));

  if (!streamId) {
    defaultApi$1.writeLog("avsdk TALRTC::startRecord - Invalid idx ".concat(idx), null, 'error');
    throw new Error("Invalid idx ".concat(idx));
  }

  if (!fileName) {
    fileName = "".concat(streamId, "-").concat(util.currentTimeString().replace(/:/g, '-'));
  }

  if (!path) {
    defaultApi$1.writeLog("avsdk TALRTC::startRecord path is not set, idx:".concat(idx), null, 'error');
    throw new Error('setRecordPath first');
  }

  dataReport$2.startRecord({
    fileName: fileName,
    fileType: fileType,
    idx: idx,
    streamId: streamId
  });
  return callMethod$5('StartRecord', {
    streamId: streamId,
    recordType: 3,
    // 1:音频 2:视频 3:音视频
    fileName: fileName,
    recordFormat: fileType,
    path: path
  });
};
/**
 * 结束音视频录制 channelIndex(number) 录制通道  0主推流通道/ 1辅助推流通道/ 2辅助推流通道
 * @param {number} idx 0 | 1 | 2
 * @returns 
 */

var stopRecord$1 = async function stopRecord(idx) {
  var streamId = localStreamIdMap[idx];
  defaultApi$1.writeLog("avsdk TALRTC::stopRecord idx: ".concat(idx, ", streamId: ").concat(streamId));

  if (!streamId) {
    defaultApi$1.writeLog("avsdk TALRTC::stopRecord - Invalid idx ".concat(idx), null, 'error');
    throw new Error("Invalid idx ".concat(idx));
  }

  dataReport$2.stopRecord({
    idx: idx,
    streamId: streamId
  });
  return callMethod$5('StopRecord', {
    streamId: streamId
  });
};
var enableBeautify$1 = function enableBeautify(enable) {
  var streamId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : localStreamId$1;
  defaultApi$1.writeLog("avsdk TALRTC::enableBeautify enable: ".concat(enable, " streamId: ").concat(streamId));
  return callMethod$5('EnableBeautify', {
    enable: enable,
    streamId: streamId
  });
};
/**
 * 
 * @param {number} mode 美颜类型 101:美白、103:磨皮、201:瘦脸、605:背景虚化、901:自定义背景、202:大眼、603:锐化
 * @param {number} subMode  美白模式【0,2,3】,当前选项:0,
                            磨皮:【1,2】,当前选项:1
                            瘦脸:【0】,
                            背景虚化:【0,1】、当前选项:1
                            自定义背景:【0】、
                            大眼:【0】
                            锐化:【0】
 * @param {number} value  美白: 默认30 ,0表示不美白;
                          磨皮:默认 74, 0表示不磨皮;
                          瘦脸:默认 11, 0表示不瘦脸
                          背景虚化:默认值 0, 0表示不虚化
                          自定义背景:默认值0;非0表示设置背景(当前设计不支持用户自定义背景,)
                          大眼:默认值13,0表示不做大眼
                          锐化:默认值0,0表示不锐化
 * @param {string} streamId  流id
 * @param {string | undefined} image  自定义背景图片地址
 * @returns 
 */

var setBeautifyParam$2 = function setBeautifyParam(mode, subMode, value) {
  var streamId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : localStreamId$1;
  var image = arguments.length > 4 ? arguments[4] : undefined;
  defaultApi$1.writeLog("avsdk TALRTC::setBeautifyParam param: ".concat(JSON.stringify({
    mode: mode,
    subMode: subMode,
    value: value,
    streamId: streamId,
    image: image
  })));
  return callMethod$5('SetBeautifyParam', {
    mode: mode,
    subMode: subMode,
    value: value,
    streamId: streamId,
    image: image
  });
};
/**
 * 
 * @param {'UseLoopbackDefault' | 'UseDefaultDevice'} key 
 * @param {'enable'} value 
 * @returns 
 */

var setEngineConfig$1 = function setEngineConfig(key, value) {
  defaultApi$1.writeLog("avsdk TALRTC::setEngineConfig key: ".concat(key, ", value: ").concat(value));
  return callMethod$5('SetEngineConfig', {
    key: key,
    value: value
  });
};
/**
 * 获取麦克风响度
 * @returns {Promise<number>}
 */

var getMicrophoneLoudness$1 = function getMicrophoneLoudness() {
  return callMethod$5('GetMicrophonLoudness', {});
};
/**
 * 获取默认扬声器id
 * @returns {Promise<string | null>}
 */

var getCurrentSpeakerId$1 = function getCurrentSpeakerId() {
  return callMethod$5('GetCurrentSpeakerId', {}).then(function (e) {
    if (e.code === 0) {
      return JSON.parse(e.msg).speakerCurId;
    } else {
      return null;
    }
  });
};
/**
 * 获取默认麦克风id
 * @returns {Promise<string | null>}
 */

var getCurrentMicrophoneId$1 = function getCurrentMicrophoneId() {
  return callMethod$5('GetCurrentMicrophoneId', {}).then(function (e) {
    if (e.code === 0) {
      return JSON.parse(e.msg).microphoneCurId;
    } else {
      return null;
    }
  });
};
/**
 * 获取默认摄像头id
 * @returns {Promise<string | null>}
 */

var getCurrentCameraId$1 = function getCurrentCameraId() {
  return callMethod$5('GetCurrentCameraId', {}).then(function (e) {
    if (e.code === 0) {
      return JSON.parse(e.msg).cameraCurId;
    } else {
      return null;
    }
  });
};
var takeLocalSnapShot$1 = function takeLocalSnapShot() {
  var streamId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : localStreamId$1;
  var idx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  return callMethod$5('takeLocalSnapShot', {
    streamId: streamId,
    idx: idx
  });
};
var takeRemoteSnapShot$1 = function takeRemoteSnapShot(streamId) {
  return callMethod$5('takeRemoteSnapShot', {
    streamId: streamId
  });
}; // 水印透传:直接调用底层 SetVideoWarterMark

var setWaterMark$1 = async function setWaterMark(filePath, x, y, w, h) {
  var streamId = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : '';
  var idx = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;

  if (!filePath || typeof filePath !== 'string') {
    defaultApi$1.writeLog('avsdk TALRTC::setWaterMark invalid filePath');
    return false;
  }

  var toInt = function toInt(val) {
    var num = Number(val);
    return Number.isFinite(num) ? Math.floor(num) : NaN;
  };

  var left = toInt(x);
  var top = toInt(y);
  var width = toInt(w);
  var height = toInt(h);

  if ([left, top, width, height].some(function (v) {
    return Number.isNaN(v);
  })) {
    defaultApi$1.writeLog('avsdk TALRTC::setWaterMark invalid rect params');
    return false;
  }

  var res = await callMethod$5('SetVideoWarterMark', {
    filePath: filePath,
    x: left,
    y: top,
    w: width,
    h: height,
    streamId: streamId
  });
  return res && res.code === 0;
}; //@param {string}    config.mTaskType  
// "voicechat"   音频通话
// "avatarchat"  数字人
// "visionchat"  视觉理解
// @param {string}    config.mRobotId    当前user对应的机器人id
// @param {string}    config.extenParams  业务额外数据,JSON格式的字符串

var startAigc$1 = function startAigc(config) {
  aigcRobotUid = config && config.mRobotId != null ? config.mRobotId : null;
  return callMethod$5('StartAigc', {
    room: localRoomId,
    taskType: config.mTaskType,
    robotId: config.mRobotId,
    extenParams: config.extenParams
  }).then(function (result) {
    // 业务需要rtc sdk taskid,失败返回空字符串
    if (result && result.code === 0) {
      // 解析msg中的JSON字符串
      var msgData = JSON.parse(result.msg || '{}'); // 返回指定字段,可以根据需要修改字段名

      return msgData.taskid || '';
    } else {
      aigcRobotUid = null;
      var code = result ? result.code : undefined;
      var msg = result ? result.msg : undefined;
      defaultApi$1.writeLog("talrtc-sdk startAigc failed: code=".concat(code, ", msg=").concat(msg), null, 'error');
      return '';
    }
  }).catch(function (error) {
    aigcRobotUid = null;
    defaultApi$1.writeLog("talrtc-sdk startAigc error: ".concat(error), null, 'error');
    return '';
  });
};
var stopAigc$1 = function stopAigc() {
  aigcRobotUid = null;
  return callMethod$5('StopAigc', {});
};
var sendAigcMessage$1 = function sendAigcMessage(messageInfo) {
  return callMethod$5('SendAigcMessage', {
    custom: messageInfo.custom,
    prompt: messageInfo.prompt,
    type: messageInfo.type
  }).then(function (result) {
    // 返回数字状态码,0表示成功
    if (result && result.code === 0) {
      return 0;
    } else {
      var code = result ? result.code : undefined;
      var msg = result ? result.msg : undefined;
      defaultApi$1.writeLog("talrtc-sdk sendAigcMessage failed: code=".concat(code, ", msg=").concat(msg), null, 'error');
      return code !== undefined ? code : -1;
    }
  }).catch(function (error) {
    defaultApi$1.writeLog("talrtc-sdk sendAigcMessage error: ".concat(error), null, 'error');
    return -1;
  });
};
var setEngineEnv = function setEngineEnv(envs) {
  return callMethod$5('SetEngineEnv', {
    env: envs
  });
}; // 开关麦克风录制数据回调
// enable: 是否开启回调
// sampleRate: 采样率,默认 48000
// channels: 声道数,默认 1

var enableMicRecordDataCallback$1 = function enableMicRecordDataCallback() {
  var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  var sampleRate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 48000;
  var channels = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;

  if (typeof enable !== 'boolean') {
    defaultApi$1.writeLog('avsdk TALRTC::enableMicRecordDataCallback enable type error', null, 'error');
    return Promise.reject(new Error('enable should be boolean'));
  }

  if (!Number.isInteger(sampleRate) || sampleRate <= 0) {
    defaultApi$1.writeLog('avsdk TALRTC::enableMicRecordDataCallback sampleRate type error', null, 'error');
    return Promise.reject(new Error('sampleRate should be positive integer'));
  }

  if (!Number.isInteger(channels) || channels <= 0) {
    defaultApi$1.writeLog('avsdk TALRTC::enableMicRecordDataCallback channels type error', null, 'error');
    return Promise.reject(new Error('channels should be positive integer'));
  }

  defaultApi$1.writeLog('avsdk TALRTC::enableMicRecordDataCallback');
  return callMethod$5('EnableMicRecordDataCallback', {
    enable: enable,
    sampleRate: sampleRate,
    channels: channels
  });
};

var heartBeatRealKeys$2 = ['video_fps', 'video_bitrate', 'audio_fps', 'audio_bitrate'];

var _heartBeatDataReport$2 = function _heartBeatDataReport() {
  var pullInfo = [];
  console.log('拉流的类型1', streamIdRtcPlayerInfo$2);
  Object.keys(streamIdRtcPlayerInfo$2).forEach(function (streamid) {
    heartBeatRealKeys$2.forEach(function (realKey) {
      if (!streamIdRtcPlayerInfo$2[streamid].hasOwnProperty(realKey)) {
        streamIdRtcPlayerInfo$2[streamid][realKey] = [];
      }
    }); //获取拉流类型,后期可写为函数提出去

    if (streamIdRtcPlayerInfo1$2[streamid].audio_type && streamIdRtcPlayerInfo1$2[streamid].video_type) {
      streamIdRtcPlayerInfo1$2[streamid].stream_type = 'both';
    } else if (!streamIdRtcPlayerInfo1$2[streamid].audio_type && streamIdRtcPlayerInfo1$2[streamid].video_type) {
      streamIdRtcPlayerInfo1$2[streamid].stream_type = 'video';
    } else if (streamIdRtcPlayerInfo1$2[streamid].audio_type && !streamIdRtcPlayerInfo1$2[streamid].video_type) {
      streamIdRtcPlayerInfo1$2[streamid].stream_type = 'audio';
    } else {
      streamIdRtcPlayerInfo1$2[streamid].stream_type = 'none';
    }

    pullInfo.push(_objectSpread({
      streamid: streamid
    }, streamIdRtcPlayerInfo$2[streamid], {
      pull_type: streamIdRtcPlayerInfo1$2[streamid].stream_type,
      volume: streamIdRtcPlayerInfo$2[streamid].volume.slice(0, streamIdRtcPlayerInfo$2[streamid].volume.length - 1)
    }));
    resetStreamIdRtcPlayerInfo$2(streamid);
  });

  if (isFirstHeartBeatReport$2) {
    try {
      //获取推流类型,后期可写为函数提出去
      if (zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
        zbysdk$1.deviceStatus.stream_type = 'both';
      } else if (!zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
        zbysdk$1.deviceStatus.stream_type = 'audio';
      } else if (zbysdk$1.deviceStatus.camera && !zbysdk$1.deviceStatus.microphone) {
        zbysdk$1.deviceStatus.stream_type = 'video';
      } else {
        zbysdk$1.deviceStatus.stream_type = 'none';
      }

      ;
      defaultApi$1.writeLog("push_type_talrtc,camera: ".concat(zbysdk$1.deviceStatus.camera, ",microphone: ").concat(zbysdk$1.deviceStatus.microphone, ",type: ").concat(zbysdk$1.deviceStatus.stream_type, ",a_fps: ").concat(dataTalrtcCapture.fps, ", a_bit: ").concat(dataTalrtcCapture.audioBitrate, ", v_fps: ").concat(dataTalrtcCapture.fps, ", v_bit: ").concat(dataTalrtcCapture.videoBitrate));
      dataReport$2.heartbeat(_objectSpread({}, _objectSpread({}, heartBeatDataReportObj$2, {
        push_type: zbysdk$1.deviceStatus.stream_type,
        volume: heartBeatDataReportObj$2.volume.slice(0, heartBeatDataReportObj$2.volume.length - 1)
      }), {
        pull_info: pullInfo
      }));
      dataReport$2.localNetworkQuality({
        code: qualityLocal
      });
      dataReport$2.remoteNetworkQuality({
        code: qualityRemote
      });
    } catch (e) {
      console.log(e);
    }
  }

  resetHeartBeatDataReportObj$2();
};

var pointer$1 = 0;

var runHeartBeatCalc$1 = function runHeartBeatCalc() {
  Object.keys(streamIdToPreviewId$2).forEach(function (streamId) {
    var data = statsStore$1.getData(streamId) || {
      stats: JSON.stringify({
        streamId: streamId
      })
    };

    try {
      heartBeatDataReportCalc$2('onRemoteStatistics', data);
    } catch (error) {
      defaultApi$1.writeLog("avsdk TALRTC::runHeartBeatCalc error: ".concat(error));
    }
  });
  var data = statsStore$1.getData(localStreamId$1) || {
    stats: JSON.stringify({})
  };

  try {
    heartBeatDataReportCalc$2('onLocalStatistics', data);
  } catch (error) {
    defaultApi$1.writeLog("avsdk TALRTC::runHeartBeatCalc error: ".concat(error));
  }

  ++pointer$1;

  if (pointer$1 === heartBeatItemCount$1) {
    pointer$1 = 0;

    _heartBeatDataReport$2();
  }
};

var heartBeatDataReport$2 = function heartBeatDataReport(type) {
  try {
    if (type === 'start' && !heartBeatDataReportTimer$2) {
      isFirstHeartBeatReport$2 = true;
      runHeartBeatCalc$1();
      heartBeatDataReportTimer$2 = setInterval(function () {
        runHeartBeatCalc$1();
      }, 2 * 1000);
    }

    if (type === 'stop') {
      isFirstHeartBeatReport$2 = false;
      statsStore$1.clear();
      clearInterval(heartBeatDataReportTimer$2);
      heartBeatDataReportTimer$2 = null;
    }
  } catch (error) {
    console.error(error);
  }
};

var lastStreamReportTimestamps = {};

var heartBeatDataReportCalc$2 = function heartBeatDataReportCalc(name, _data) {
  var _d = JSON.parse(_data.stats); // if (lastStreamReportTimestamps[_d.streamId] && Date.now() - lastStreamReportTimestamps[_d.streamId] < 4999) {
  //   return;
  // } else {
  //   lastStreamReportTimestamps[_d.streamId] = Date.now();
  // }


  var ctime = Math.round((new Date().getTime() + dataReport$2.timestamp) / 1000); // 拉流

  var pullKeys = ['fps', 'videoBitrate', 'afps', 'audioBitrate'];

  if (name === 'onRemoteStatistics') {
    if (streamIdRtcPlayerInfo$2 && streamIdRtcPlayerInfo$2.hasOwnProperty(_d.streamId)) {
      var streamid = _d.streamId;
      var isReport = true; // streamIdRtcPlayerInfo[streamid].count++;

      heartBeatRealKeys$2.forEach(function (realKey, index) {
        if (_d.hasOwnProperty(pullKeys[index])) {
          if (streamIdRtcPlayerInfo$2[streamid][realKey] === undefined) {
            streamIdRtcPlayerInfo$2[streamid][realKey] = [];
            isReport = false;
          } // streamIdRtcPlayerInfo[streamid][realKey].push(parseFloat(parseInt(item[pullKeys[index]])));

        }
      });

      if (isReport) {
        var audio_fps_talrtc_pull = 0;
        var audio_bitrate_talrtc_pull = 0;
        var video_fps_talrtc_pull = 0;
        var video_bitrate_talrtc_pull = 0;
        var pull_type = 'none';

        if (streamIdRtcPlayerInfo1$2[streamid].audio_type && streamIdRtcPlayerInfo1$2[streamid].video_type) {
          audio_fps_talrtc_pull = parseFloat(parseInt(_d.afps || 0));
          audio_bitrate_talrtc_pull = parseFloat(parseInt(_d.audioBitrate || 0));
          video_fps_talrtc_pull = parseFloat(parseInt(_d.fps || 0));
          video_bitrate_talrtc_pull = parseFloat(parseInt(_d.videoBitrate || 0));
          pull_type = 'both';
        } else if (!streamIdRtcPlayerInfo1$2[streamid].audio_type && streamIdRtcPlayerInfo1$2[streamid].video_type) {
          video_fps_talrtc_pull = parseFloat(parseInt(_d.fps || 0));
          video_bitrate_talrtc_pull = parseFloat(parseInt(_d.videoBitrate || 0));
          pull_type = 'video';
        } else if (streamIdRtcPlayerInfo1$2[streamid].audio_type && !streamIdRtcPlayerInfo1$2[streamid].video_type) {
          audio_fps_talrtc_pull = parseFloat(parseInt(_d.afps || 0));
          audio_bitrate_talrtc_pull = parseFloat(parseInt(_d.audioBitrate || 0));
          pull_type = 'audio';
        }

        streamIdRtcPlayerInfo$2[streamid].audio_fps[pointer$1] = audio_fps_talrtc_pull;
        streamIdRtcPlayerInfo$2[streamid].audio_bitrate[pointer$1] = audio_bitrate_talrtc_pull;
        streamIdRtcPlayerInfo$2[streamid].video_fps[pointer$1] = video_fps_talrtc_pull;
        streamIdRtcPlayerInfo$2[streamid].video_bitrate[pointer$1] = video_bitrate_talrtc_pull;
        streamIdRtcPlayerInfo$2[streamid].pull_loss[pointer$1] = _d.packetLoss || 0;
        streamIdRtcPlayerInfo$2[streamid].pull_delay[pointer$1] = _d.rtt || 0;
        streamIdRtcPlayerInfo$2[streamid].pull_type_ex[pointer$1] = pull_type;
        streamIdRtcPlayerInfo$2[streamid].ctime[pointer$1] = ctime;
        streamIdRtcPlayerInfo$2[streamid].video_ifg += _d.videoBlockRate || 0;
        streamIdRtcPlayerInfo$2[streamid].audio_ifg += _d.audioBlockRate || 0; // console.log('hsg_tpull_keys',JSON.parse(JSON.stringify(streamIdRtcPlayerInfo[streamid])),_d.avTimestampDiff);

        if (lecturerStreamId$1 === String(streamid).toUpperCase()) {
          if (audio_fps_talrtc_pull + audio_bitrate_talrtc_pull > 0 && ( // 任意一个有大于0的值
          audio_fps_talrtc_pull === 0 || audio_bitrate_talrtc_pull === 0) // 有一个为0
          ) {
              defaultApi$1.writeLog("avsdk TALRTC::AUDIO_STATS_WARNING ".concat(_data.stats), undefined, 'error');
            }

          if (video_fps_talrtc_pull + video_bitrate_talrtc_pull > 0 && ( // 任意一个有大于0的值
          video_fps_talrtc_pull === 0 || video_bitrate_talrtc_pull === 0) // 有一个为0
          ) {
              defaultApi$1.writeLog("avsdk TALRTC::VIDEO_STATS_WARNING ".concat(_data.stats), undefined, 'error');
            }
        }
      }
    }
  } // 推流


  var pushKeys = ['fps', 'videoBitrate', 'afps', 'audioBitrate'];

  if (name === 'onLocalStatistics') {
    // console.log('hsgmzk',_d);
    // heartBeatDataReportObj.count++;
    // heartBeatRealKeys.forEach((realKey, index) => {
    //   if (heartBeatDataReportObj.hasOwnProperty(realKey) && _d.hasOwnProperty(pushKeys[index])) {
    //     heartBeatDataReportObj[realKey].push(parseFloat(parseInt(_d[pushKeys[index]])));
    //   }
    // });
    var audio_fps_talrtc_push = 0;
    var audio_bitrate_talrtc_push = 0;
    var video_fps_talrtc_push = 0;
    var video_bitrate_talrtc_push = 0;
    dataTalrtcCapture = _d;
    var push_type = 'none';

    if (userAndDeviceStatusInfo.isPushingFlow) {
      if (zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
        audio_fps_talrtc_push = parseFloat(parseInt(_d.afps || 0));
        audio_bitrate_talrtc_push = parseFloat(parseInt(_d.audioBitrate || 0));
        video_fps_talrtc_push = parseFloat(parseInt(_d.fps || 0));
        video_bitrate_talrtc_push = parseFloat(parseInt(_d.videoBitrate || 0));
        push_type = 'both';
      } else if (!zbysdk$1.deviceStatus.camera && zbysdk$1.deviceStatus.microphone) {
        audio_fps_talrtc_push = parseFloat(parseInt(_d.afps || 0));
        audio_bitrate_talrtc_push = parseFloat(parseInt(_d.audioBitrate || 0));
        push_type = 'audio';
      } else if (zbysdk$1.deviceStatus.camera && !zbysdk$1.deviceStatus.microphone) {
        video_fps_talrtc_push = parseFloat(parseInt(_d.fps || 0));
        video_bitrate_talrtc_push = parseFloat(parseInt(_d.videoBitrate || 0));
        push_type = 'video';
      }

      if (zbysdk$1.deviceStatus.microphone && audio_fps_talrtc_push === 0 && audio_bitrate_talrtc_push === 0) {
        defaultApi$1.writeLog("avsdk TALRTC::AUDIO_PUSH_STATS_WARNING ".concat(_data.stats), undefined, 'error');
      }

      if (zbysdk$1.deviceStatus.camera && video_fps_talrtc_push === 0 && video_bitrate_talrtc_push === 0) {
        defaultApi$1.writeLog("avsdk TALRTC::VIDEO_PUSH_STATS_WARNING ".concat(_data.stats), undefined, 'error');
      }
    }

    heartBeatDataReportObj$2.audio_fps[pointer$1] = audio_fps_talrtc_push;
    heartBeatDataReportObj$2.audio_bitrate[pointer$1] = audio_bitrate_talrtc_push;
    heartBeatDataReportObj$2.video_fps[pointer$1] = video_fps_talrtc_push;
    heartBeatDataReportObj$2.video_bitrate[pointer$1] = video_bitrate_talrtc_push;
    heartBeatDataReportObj$2.push_loss[pointer$1] = _d.packetLoss || 0;
    heartBeatDataReportObj$2.push_delay[pointer$1] = _d.rtt || 0;
    heartBeatDataReportObj$2.push_type_ex[pointer$1] = push_type;
    heartBeatDataReportObj$2.type_backend[pointer$1] = getBackgroundStatus();
    heartBeatDataReportObj$2.ctime[pointer$1] = ctime;
  }
}; //推流字段


var resetHeartBeatDataReportObj$2 = function resetHeartBeatDataReportObj() {
  console.log('resetHeartBeatDataReportObj重置');
  heartBeatDataReportObj$2 = {
    ctime: new Array(heartBeatItemCount$1).fill(0),
    push_type: 'none',
    video_fps: new Array(heartBeatItemCount$1).fill(0),
    video_bitrate: new Array(heartBeatItemCount$1).fill(0),
    audio_fps: new Array(heartBeatItemCount$1).fill(0),
    audio_bitrate: new Array(heartBeatItemCount$1).fill(0),
    push_loss: new Array(heartBeatItemCount$1).fill(0),
    push_delay: new Array(heartBeatItemCount$1).fill(0),
    push_type_ex: new Array(heartBeatItemCount$1).fill('none'),
    type_backend: new Array(heartBeatItemCount$1).fill(0),
    volume: ''
  };
};

resetHeartBeatDataReportObj$2(); //记录拉流类型,用作数据上报

var resetStreamIdRtcPlayerInfo1$2 = function resetStreamIdRtcPlayerInfo1(streamId) {
  streamIdRtcPlayerInfo1$2[streamId] = {
    audio_type: false,
    video_type: false,
    stream_type: 'none'
  }; // console.log('hsgshgs_heartbeat',streamIdRtcPlayerInfo1);
}; //拉流字段


var resetStreamIdRtcPlayerInfo$2 = function resetStreamIdRtcPlayerInfo(streamId) {
  console.log('reset stream info ----------', streamId);
  streamIdRtcPlayerInfo$2[streamId] = {
    pull_uid: util.getUidByStreamId(streamId),
    streamid: streamId,
    ctime: new Array(heartBeatItemCount$1).fill(0),
    pull_type: streamIdRtcPlayerInfo1$2[streamId].stream_type,
    volume: '',
    // 平均值
    // count: 0,
    // video_fps: 0,
    // video_bitrate: 0,
    // audio_fps: 0,
    // audio_bitrate: 0,
    video_fps: new Array(heartBeatItemCount$1).fill(0),
    video_bitrate: new Array(heartBeatItemCount$1).fill(0),
    audio_fps: new Array(heartBeatItemCount$1).fill(0),
    audio_bitrate: new Array(heartBeatItemCount$1).fill(0),
    pull_loss: new Array(heartBeatItemCount$1).fill(0),
    pull_delay: new Array(heartBeatItemCount$1).fill(0),
    pull_type_ex: new Array(heartBeatItemCount$1).fill('none'),
    //音画不同步字段
    avtimestampdiff: new Array(heartBeatItemCount$1).fill(0),
    // 累加
    audio_ifg: 0,
    video_ifg: 0
  };
};

var talrtcsdk = {
  checkUpdate: checkUpdate,
  init: init$2,
  enableExternalVideoSource: enableExternalVideoSource,
  setFourthStreamType: setFourthStreamType$1,
  setCameraCaptureResolution: setCameraCaptureResolution,
  setCameraEncodeResolution: setCameraEncodeResolution,
  setCameraEncodeFps: setCameraEncodeFps,
  setCameraEncodeBitrate: setCameraEncodeBitrate,
  getCameraResolution: getCameraResolution,
  getMicrophoneDeviceList: getMicrophoneDeviceList$1,
  setMicrophoneDevice: setMicrophoneDevice$2,
  openOrCloseMicrophone: openOrCloseMicrophone,
  getCurrentMicrophoneVolume: getCurrentMicrophoneVolume,
  setCurrentMicrophoneVolume: setCurrentMicrophoneVolume,
  getCameraDeviceList: getCameraDeviceList,
  setCameraDevice: setCameraDevice$1,
  openOrCloseCamera: openOrCloseCamera$1,
  getSpeakerDeviceList: getSpeakerDeviceList$1,
  setSpeakerDevice: setSpeakerDevice$2,
  getCurrentSpeakerDevice: getCurrentSpeakerDevice$1,
  getCurrentSpeakerVolume: getCurrentSpeakerVolume,
  setCurrentSpeakerVolume: setCurrentSpeakerVolume,
  setSpeakerDeviceMute: setSpeakerDeviceMute$1,
  muteRemoteAudio: muteRemoteAudio,
  muteRemoteVideo: muteRemoteVideo,
  getSpeakerSimpleVolume: getSpeakerSimpleVolume$1,
  setSpeakerSimpleVolume: setSpeakerSimpleVolume$1,
  setSpeakerSimpleMute: setSpeakerSimpleMute$1,
  startLocalOrRemotePreview: startLocalOrRemotePreview$2,
  enableAudioSpeakerCapture: enableAudioSpeakerCapture,
  setVideoCallback: setVideoCallback$1,
  startPush: startPush$1,
  stopPush: stopPush$1,
  startPlay: startPlay,
  stopPlay: stopPlay,
  initPullFlow: initPullFlow$2,
  stopPlayAll: stopPlayAll,
  changePullFlow: changePullFlow$2,
  startPreview: startPreview$2,
  stopPreview: stopPreview$2,
  sendSEIMsg: sendSEIMsg,
  loadCollectionInputEntry2: loadCollectionInputEntry2$1,
  controlCdnStreaming: controlCdnStreaming,
  // addPublishRtmpStreamUrl or removePublishStreamUrl
  leaveRoom: leaveRoom$2,
  destroyEngine: destroyEngine$2,
  unloadTalrtc: unloadTalrtc,
  muteLocalVideo: muteLocalVideo$1,
  muteLocalAudio: muteLocalAudio$1,
  pullAudioFlow: pullAudioFlow$2,
  hasStream: hasStream$2,
  teacherStartLinkMic: teacherStartLinkMic$2,
  teacherStopLinkMic: teacherStopLinkMic$2,
  setMirrorStatus: setMirrorStatus$2,
  setPlayViewMirror: setPlayViewMirror$1,
  setAudioAuxSource: setAudioAuxSource$1,
  setAudioType: setAudioType,
  enableRTCAudioMixMode: enableRTCAudioMixMode,
  startAudioExCapture: startAudioExCapture$1,
  startMultiScreen: startMultiScreen$1,
  setAudioMixMode: setAudioMixMode$1,
  startRecord: startRecord$1,
  stopRecord: stopRecord$1,
  enableBeautify: enableBeautify$1,
  setBeautifyParam: setBeautifyParam$2,
  setEngineConfig: setEngineConfig$1,
  getChannelIndex: getChannelIndex$1,
  getSDKVersion: getSDKVersion$2,
  getSDKCoreVersion: getSDKCoreVersion,
  getMicrophoneLoudness: getMicrophoneLoudness$1,
  getCurrentSpeakerId: getCurrentSpeakerId$1,
  getCurrentMicrophoneId: getCurrentMicrophoneId$1,
  getCurrentCameraId: getCurrentCameraId$1,
  takeLocalSnapShot: takeLocalSnapShot$1,
  takeRemoteSnapShot: takeRemoteSnapShot$1,
  startAigc: startAigc$1,
  stopAigc: stopAigc$1,
  sendAigcMessage: sendAigcMessage$1,
  setWaterMark: setWaterMark$1,
  setEngineEnv: setEngineEnv,
  enableMicRecordDataCallback: enableMicRecordDataCallback$1
};

var extensionId$4 = 'trtc_ext'; // 端提供的 API 入口

var EM$8 = window.EM; // 是否执行过 TRTC 的 AddListener 的标志

var hasAddListener$4 = false; // 监听id

var EMListenerId$3 = 0; //静音推流时,音量值是否上抛上层标志 false=没有声音不往上层通知/true=有声音有上层通知

var isNoticeMicVolumeTRTC = false; // rtc小班课=0;rtc大班课=1

var classType$5 = 0; // 维护的一份拉流的 streamId 与本地预览通道的映射表

var streamIdToPreviewId$3 = {};
var previewIdToStreamId$2 = {}; // 拉流的播放通道初始化从 0 开始依次递增至99(共100路流),-1 为推流的本地视频预览
// const uiChnIndexs = new Array(50).fill(0).map((a, b) => b + 1).reverse();

var uiChnIndexs$2 = new Array(100).fill(0).map(function (a, b) {
  return b;
}).reverse(); // 维护的一份当前正在使用的音频设备的 deviceId 的列表

var usingAudioDeviceId$2 = {
  speaker: '',
  microphone: ''
}; // 心跳

var heartBeatDataReportObj$3 = {};
var heartBeatDataReportTimer$3 = null;
var isFirstHeartBeatReport$3 = false;
var streamIdRtcPlayerInfo$3 = {};
var streamIdRtcPlayerInfo1$3 = {}; //记录底层推流回调的值

var dataTrtcCapture = {};
var qualityLocalArr$1 = [];
var qualityRemoteArr$1 = [];

var callMethod$6 = function callMethod(name, args) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$8) {
    return new Promise(function (resolve, reject) {
      // let noneCamera = (name === 'SetVideoDevice' && !args.pszDeviceID);
      // let noneMicrophone = (name === 'SetAudioDevice' && args.deviceType === 0 && !args.pszDeviceID);
      // let noneSpeaker = (name === 'SetAudioDevice' && args.deviceType === 1 && !args.pszDeviceID);
      // if (noneCamera || noneMicrophone || noneSpeaker) {
      //   return resolve();
      // }
      EM$8.CallMethod(extensionId$4, name, JSON.stringify(_objectSpread({}, args, {
        classType: classType$5
      })), function (code, msg) {
        defaultApi$1.writeLog("".concat(name, " Code: ").concat(code, "\nMessage: ").concat(msg, "\nParams: ").concat(JSON.stringify(_objectSpread({}, args, {
          classType: classType$5
        }))));
        resolve({
          code: code,
          msg: msg
        });
      });
    });
  }
};

var loadTrtc = function loadTrtc(extensionVersion) {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$8) {
    return new Promise(function (resolve, reject) {
      removerListener$3();
      console.log('jjjjjjj3', extensionId$4, extensionVersion);
      EM$8.Load(extensionId$4, extensionVersion, false, function (code, msg) {
        console.log('jjjjjjj4');
        defaultApi$1.writeLog("loadTrtc Code: ".concat(code, "\nMessage: ").concat(msg));
        addListener$4();
        resolve();
      });
    });
  }
}; //卸载监听


var removerListener$3 = function removerListener() {
  hasAddListener$4 = false;
  defaultApi$1.writeLog("TRTC::action--removerListener EMListenerId:".concat(EMListenerId$3));
  EM$8.RemoverListener(extensionId$4, EMListenerId$3, function (ec, content) {});
  EMListenerId$3 = 0;
}; //加载监听

/**
 * @function 添加扩展监听机制
 * @param userId:Number 用户 id,必选
 * @param userName:String 用户名,必选
 * @param roomId:String 频道(房间) id,必选
 * @param nNetType:Number 网络类型,可选,默认为 1
 * @return void
 */


var addListener$4 = function addListener() {
  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM$8 && !hasAddListener$4) {
    hasAddListener$4 = true;
    EM$8.AddListener(extensionId$4, function (event, data) {
      if (data && data.indexOf(extensionId$4) > -1) {
        try {
          EMListenerId$3 = JSON.parse(data)[extensionId$4];
          defaultApi$1.writeLog("TRTC::addListener-- EMListenerId: ".concat(EMListenerId$3));
        } catch (error) {}
      }

      if (!event || !data) {
        return;
      }

      var _data = JSON.parse(data);

      switch (event) {
        //推流相关
        //直播推流器错误通知,推流器出现错误时,会回调该通知
        case 'onLocalError':
          defaultApi$1.writeLog("TRTC::addListener-- onLocalError: ".concat(JSON.stringify(_data)));
          NOTICE.pushStreamError({
            errorStreamType: _data.streamType,
            code: _data.code,
            errorMsg: _data
          });
          dataReport$2.pushStreamError({
            errorStreamType: _data.streamType,
            code: _data.code
          });
          break;
        //直播推流器警告通知

        case 'onLocalWarning':
          defaultApi$1.writeLog("TRTC::addListener-- onLocalWarning: ".concat(JSON.stringify(_data)));
          NOTICE.pushStreamWarning({
            warnStreamType: _data.streamType,
            code: _data.code
          });
          dataReport$2.pushStreamWarning({
            warnStreamType: _data.streamType,
            code: _data.code
          });
          break;
        //首帧音频推送完成的回调通知

        case 'onSendLocalFirstAudioFrame':
          defaultApi$1.writeLog("TRTC::addListener-- onSendLocalFirstAudioFrame: ".concat(JSON.stringify(_data)));
          break;
        //首帧视频推送完成的回调通知

        case 'onSendLocalFirstVideoFrame':
          defaultApi$1.writeLog("TRTC::addListener-- onSendLocalFirstVideoFrame: ".concat(JSON.stringify(_data)));
          NOTICE.pushFlowSuccess({
            code: 0,
            publish_streamid: _data.strStreamId
          });
          dataReport$2.publishResult({
            code: '0' // publish_streamid: window.zbyAVSDK_init_params.trtc.streamId,

          });
          break;
        //麦克风采集音量值回调

        case 'onLocalMicrophoneVolumeUpdate':
          // defaultApi.writeLog(`TRTC::addListener-- onLocalMicrophoneVolumeUpdate: ${JSON.stringify(_data)}`);
          if (isNoticeMicVolumeTRTC) {
            NOTICE.captureMicVolumeChanged({
              volume: Math.round(_data.volume)
            });
          } // heartBeatDataReportObj.volume.push(Math.round(_data.pCaptureSoundLevel[0].soundLevel));


          heartBeatDataReportObj$3.volume = heartBeatDataReportObj$3.volume + Math.round(_data.volume) + ',';
          break;
          break;
        //推流器连接状态回调通知。推流器连接状态 0 与服务器断开连接/1 正在连接服务器/2 连接服务器成功/3 重连服务器中

        case 'onLocalConnectStatusUpdate':
          defaultApi$1.writeLog("TRTC::addListener-- onLocalConnectStatusUpdate: ".concat(JSON.stringify(_data)));
          dataReport$2.localConnectStatus({
            connectStatuStreamType: _data.streamType,
            state: _data.state
          });
          break;
        //网络质量的实时统计回调
        // 统计回调每间隔2秒抛出一次,用于通知 SDK 感知到的当前网络的质量。
        // * SDK 会使用一组内嵌的自研算法对当前网络的延迟高低、带宽大小以及稳定情况进行评估,并计算出一个的评估结果:
        // * 如果评估结果为 1(Excellent) 代表当前的网络情况非常好,如果评估结果为 6(Down)代表当前网络无法支撑 SDK 的正常使用。
        // * @param quality 网络状态。0未检测;1当前网络非常好;2当前网络比较好;3当前网络一般;4当前网络较差;5当前网络很差;6当前网络不满足 TRTC 的最低要求

        case 'onLocalNetworkQuality':
          // defaultApi.writeLog(`TRTC::addListener-- onLocalNetworkQuality: ${_data.quality}`);
          if (_data.quality == 4 || _data.quality == 5 || _data.quality == 6) {
            NOTICE.localNetworkQuality({
              code: _data.quality
            });
            dataReport$2.localNetworkQuality({
              code: _data.quality // publish_streamid: window.zbyAVSDK_init_params.trtc.streamId,

            });
          }

          qualityLocalArr$1.push(_data.quality);
          break;
        //直播推流器统计数据回调 number类型
        //appCpu 当前 App 的 CPU 使用率(%)
        // systemCpu 当前系统的 CPU 使用率(%)
        // width 视频宽度
        // height 视频高度
        // fps 帧率(fps)
        // audioBitrate 视频码率(Kbps)
        // videoBitrate 音频码率(Kbps)
        // case 'onLocalStatisticsUpdate':
        //   defaultApi.writeLog(`TRTC::addListener-- onLocalStatisticsUpdate: ${_data}`);
        //   break;
        //拉流相关
        //远端流错误通知,拉流出现错误时,会回调该通知

        case 'onRemoteError':
          defaultApi$1.writeLog("TRTC::addListener-- onRemoteError: ".concat(JSON.stringify(_data)));
          NOTICE.pullStreamError({
            strErrorStreamId: _data.strStreamId,
            code: _data.code
          }); //是否需要数据上报?@yuqian

          break;
        //远端流警告通知,拉流出现警告时,会回调该通知。

        case 'onRemoteWarning':
          defaultApi$1.writeLog("TRTC::addListener-- onRemoteWarning: ".concat(JSON.stringify(_data)));
          NOTICE.pullStreamWarning({
            strWarnStreamId: _data.strStreamId,
            code: _data.code
          }); //是否需要数据上报?@yuqian

          break;
        //拉到音频首帧

        case 'onRemoteAudioStatus':
          // defaultApi.writeLog(`TRTC::addListener-- onRemoteAudioStatus: ${_data}`);
          console.log('onRemoteAudioStatus', _data);

          try {
            NOTICE.firstAudioSize({
              streamId: _data.strStreamId,
              userId: util.getUidByStreamId(_data.strStreamId)
            });
            dataReport$2.firstAudioSize({
              pull_streamid: _data.strStreamId,
              pull_uid: util.getUidByStreamIdDr(_data.strStreamId),
              code: '0'
            });
          } catch (e) {}

          ;
          break;
        //远端流音量大小

        case 'onRemoteAudioVolume':
          // defaultApi.writeLog(`TRTC::addListener-- onRemoteAudioVolume: ${JSON.stringify(_data)}`);
          var cbData = {
            streamId: _data.strStreamId,
            volume: _data.volume
          };
          NOTICE.playerVolumeChanged(cbData);
          NOTICE.volumeChange(cbData); // currStreamIdRtcPlayerInfo && currStreamIdRtcPlayerInfo.volume.push(Math.round(item.soundLevel));
          // streamIdRtcPlayerInfo[_data.strStreamId] && streamIdRtcPlayerInfo[_data.strStreamId].volume.push(Math.round(item.soundLevel));

          if (streamIdRtcPlayerInfo$3[_data.strStreamId]) {
            streamIdRtcPlayerInfo$3[_data.strStreamId].volume = streamIdRtcPlayerInfo$3[_data.strStreamId].volume + Math.round(_data.volume) + ',';
          }

          break;
        // //远端流收到首帧音频
        // case 'onRemoteAudioStart':
        //   defaultApi.writeLog(`TRTC::addListener-- onRemoteAudioStart: ${_data}`);
        //   break;
        // //远端流停止推送音频
        // case 'onRemoteAudioStop':
        //   defaultApi.writeLog(`TRTC::addListener-- onRemoteAudioStop: ${_data}`);
        //   break;
        //mute 视频状态,true:远端开始推流,并拉流收到首帧;false:远端停止推流。

        case 'onRemoteVideoStatus':
          defaultApi$1.writeLog("TRTC::addListener-- onRemoteVideoStatus: ".concat(JSON.stringify(_data)));
          console.log('onRemoteVideoStatus', _data);

          try {
            NOTICE.pullFlowResult({
              code: 0,
              pull_streamid: _data.strStreamId
            });
            NOTICE.firstVideoSize({
              streamId: _data.strStreamId,
              // userId: _data.strStreamId.split('_').length == 5 ? _data.strStreamId : util.getUidByStreamId(_data.strStreamId)
              userId: util.getUidByStreamId(_data.strStreamId)
            });
            dataReport$2.firstVideoSize({
              pull_streamid: _data.strStreamId,
              pull_uid: util.getUidByStreamIdDr(_data.strStreamId),
              code: '0'
            });
          } catch (e) {}

          ;
          break;
        //sei

        case 'onRecvSEIMsg':
          // defaultApi.writeLog(`TRTC::addListener-- onRecvSEIMsg: ${_data}`);
          break;
        //网络质量的实时统计回调
        // * 该统计回调每间隔2秒抛出一次,用于通知 SDK 感知到的当前网络的质量。
        // * SDK 会使用一组内嵌的自研算法对当前网络的延迟高低、带宽大小以及稳定情况进行评估,并计算出一个的评估结果:
        // * 如果评估结果为 1(Excellent) 代表当前的网络情况非常好,如果评估结果为 6(Down)代表当前网络无法支撑 SDK 的正常使用。
        // *
        // * @param strStreamId 流ID,表示远端用户信息。
        // * @param quality 网络状态。0未检测;1当前网络非常好;2当前网络比较好;3当前网络一般;4当前网络较差;5当前网络很差;6当前网络不满足 TRTC 的最低要求

        case 'onRemoteNetworkQuality':
          // defaultApi.writeLog(`TRTC::addListener-- onRemoteNetworkQuality: ${_data}`);
          if (_data.quality == 4 || _data.quality == 5 || _data.quality == 6) {
            NOTICE.remoteNetworkQuality({
              code: _data.quality
            });
            dataReport$2.remoteNetworkQuality({
              code: _data.quality // publish_streamid: window.zbyAVSDK_init_params.trtc.streamId,

            });
          }

          qualityRemoteArr$1.push(_data.quality);
          break;
        // 转推 CDN 上发布音视频流的事件回调
        // * @param state 0转推成功,1表示失败
        // * @param err 0表示成功,其余值表示失败
        // * @param errMsg 具体错误原因

        case 'onRtmpStreamingStateChanged':
          defaultApi$1.writeLog("TRTC::addListener-- onRtmpStreamingStateChanged: ".concat(JSON.stringify(_data)));
          break;
        //* 本地麦克风设备的通断状态发生变化(仅适用于桌面系统)
        // * @param deviceId 设备 ID
        // * @param state 通断状态,0:设备已添加;1:设备已被移除;2:设备已启用。

        case 'onMicphoneDeviceChanged':
          defaultApi$1.writeLog("TRTC::addListener-- onMicphoneDeviceChanged: ".concat(JSON.stringify(_data)));
          setMicrophoneDevice$3({
            deviceId: _data.state == 1 ? '' : _data.deviceId,
            operationType: 'hotPlug',
            deviceState: _data.state,
            changedDeviceId: _data.deviceId
          });
          break;
        //* 本地摄像头设备的通断状态发生变化(仅适用于桌面系统)
        // * @param deviceId 设备 ID
        // * @param state 通断状态,0:设备已添加;1:设备已被移除;2:设备已启用。

        case 'onVideoDeviceChanged':
          defaultApi$1.writeLog("TRTC::addListener-- onVideoDeviceChanged: ".concat(JSON.stringify(_data)));
          setVideoDevice$1({
            deviceId: _data.state == 1 ? '' : _data.deviceId,
            operationType: 'hotPlug',
            deviceState: _data.state,
            changedDeviceId: _data.deviceId
          });
          break;
        //扬声器热插拔

        case 'onSpeakerDeviceChanged':
          defaultApi$1.writeLog("TRTC::addListener-- onSpeakerDeviceChanged: ".concat(JSON.stringify(_data)));
          setSpeakerDevice$3({
            deviceId: _data.state == 1 ? '' : _data.deviceId,
            operationType: 'hotPlug',
            deviceState: _data.state,
            changedDeviceId: _data.deviceId
          });
          break;
        //推流的统计数据。5秒一个周期

        case 'onLocalStatistics':
          // defaultApi.writeLog(`TRTC::addListener-- onLocalStatistics: ${_data}`);
          console.log('onLocalStatistics', JSON.parse(_data.json));
          NOTICE.pushLossAndDelay({
            // userId: util.getUidByStreamId(_data.strStreamId),
            delay: _data.rtt,
            lostrate: _data.packetLoss
          });
          heartBeatDataReportCalc$3(event, _data);
          break;
        //拉流的统计数据。5秒一个周期

        case 'onRemoteStatistics':
          // defaultApi.writeLog(`TRTC::addListener-- onRemoteStatistics: ${_data}`);
          console.log('onRemoteStatistics', JSON.parse(_data.json));

          try {
            NOTICE.playLossAndDelay({
              userId: util.getUidByStreamId(_data.streamId),
              delay: _data.rtt,
              lostrate: _data.packetLoss
            });
          } catch (e) {}

          heartBeatDataReportCalc$3(event, _data);
          break;

        case 'onStatisticsUpdate':
          // defaultApi.writeLog(`TRTC::addListener-- onStatisticsUpdate: ${JSON.stringify(_data)}`);
          // console.log('onStatisticsUpdate',JSON.parse(_data.json).local);
          // console.log('onStatisticsUpdate',JSON.parse(_data.json));
          // heartBeatDataReportCalc(event, _data);
          break;
      }

      if (zbysdk.openListenerLog) {
        console.log("[zby-live-sdk]--TRTC::Listener:: event: ".concat(event, ", data: ").concat(data));
      }
    });
  }
}; //初始化相关


var init$3 = async function init(args) {
  defaultApi$1.writeLog("avsdk TRTC::init ".concat(JSON.stringify(args)));
  var usedDevices = window.zbyAVSDK_device_checker_init;
  var devices = args.devices;
  var _devices = {
    camera: devices && devices.camera || usedDevices && usedDevices.camera && usedDevices.camera.use || '',
    microphone: devices && devices.microphone || usedDevices && usedDevices.microphone && usedDevices.microphone.use || '',
    speaker: devices && devices.speaker || usedDevices && usedDevices.speaker && usedDevices.speaker.use || ''
  };
  await loadTrtc(args.extensionVersion);
  await startEngine$2(args.appId, args.userId, args.usersign);

  if (args.role === 'teacher' && args.mode === 1) {
    //坐立模式开启外部采集器,站立关闭外部采集器,只有小组课坐立模式才会调用,通过这个把rtmp数据给到zego或者rtc(头像),开启了外部采集,zego不会再本地采集数据
    await setEnableExternVideoCapture(true);
  } //小班课 需要加载采集插件的输入数据,为了拼接zego头像


  if (args.classMode === 1 || args.classMode === 2) {
    defaultApi$1.writeLog('loadCollectionInputEntry');
    loadCollectionInputEntry$2();
  }

  ;
  await setCameraEncodeBiarate(args.encodeCaptureBitrate);
  await setCameraEncodeFps$1(args.encodeCaptureFps);
  await setCameraCaptureResolution$1(args.previewResolutionWidth, args.previewResolutionHeight);
  await setCameraEncodeResolution$1(args.encodedResolutionWidth, args.encodedResolutionHeight); // await setCameraEncodeBiarate(args.screenSameBitrate,1);
  // await setCameraEncodeFps(args.screenSameFps, 1);
  // await setCameraCaptureResolution(args.screenSameResolutionWidth, args.screenSameResolutionHeight, 1);
  // await setCameraEncodeResolution(args.screenSameResolutionWidth, args.screenSameResolutionHeight, 1);
  // await setCameraEncodeBiarate(500000);
  // await setCameraEncodeFps(15);
  // await setCameraCaptureResolution(640, 480);
  // await setCameraEncodeResolution(320, 240);

  await setDefaultDevice$3(_devices, 'default');
  await setMicphoneVolumInterval$1(500);
  window.current_sdk_type = 'trtc';
  defaultApi$1.writeLog('trtc init finished current_sdk_type : trtc');
};
/**
 * @function 初始化引擎
 * @param appid:String TRTC 秘钥,必选
 * @param userid:String 
 * @param usersign:String 
 * @return Promise | void
 */


var startEngine$2 = function startEngine(appid, userid, usersign) {
  defaultApi$1.writeLog("avsdk TRTC::StartEngine appid: ".concat(appid, " userid: ").concat(userid, " usersign: ").concat(usersign));
  return callMethod$6('StartEngine', {
    appid: appid,
    userid: userid + '',
    usersign: usersign
  });
};

var setEnableExternVideoCapture = function setEnableExternVideoCapture(enable) {
  defaultApi$1.writeLog("avsdk TRTC::EnableExternVideoCapture");
  return callMethod$6('EnableExternVideoCapture', {
    enable: enable
  });
};
/**
 * @function 销毁引擎
 * @return Promise | void
 */


var destroyEngine$3 = function destroyEngine() {
  return callMethod$6('DestroyEngine', {});
}; //设置采集分辨率


var setCameraCaptureResolution$1 = function setCameraCaptureResolution(width, height) {
  return callMethod$6('SetCameraCaptureResolution', {
    width: width,
    height: height
  });
}; //设置编码分辨率


var setCameraEncodeResolution$1 = function setCameraEncodeResolution(width, height) {
  return callMethod$6('SetCameraEncodeResolution', {
    width: width,
    height: height
  });
}; //设置编码帧率


var setCameraEncodeFps$1 = function setCameraEncodeFps(fps) {
  return callMethod$6('SetCameraEncodeFps', {
    fps: fps
  });
}; //设置编码码率


var setCameraEncodeBiarate = function setCameraEncodeBiarate(bitrate) {
  return callMethod$6('SetCameraEncodeBiarate', {
    bitrate: bitrate
  });
}; //获取指定摄像头的支持的分辨率


var getCameraResolution$1 = function getCameraResolution(deviceId) {
  return callMethod$6('GetCameraResolution', {
    deviceId: deviceId
  });
};
/**
 * @function 设置默认的硬件设备,包括摄像头、麦克风以及扬声器
 * @return Promise
 */


var setDefaultDevice$3 = async function setDefaultDevice(devices, operationType) {
  // 设置默认的摄像头
  if (devices && devices.camera) {
    if (zbyAVSDK_device_checker_init.camera.list.length == 0) {
      await getCameraDeviceListTrtc();
    }

    await setVideoDevice$1({
      deviceId: devices.camera,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var cameraData = await getCameraDeviceListTrtc();

    if (cameraData.length) {
      var hasSetCamera = false;
      var _iteratorNormalCompletion = true;
      var _didIteratorError = false;
      var _iteratorError = undefined;

      try {
        for (var _iterator = cameraData[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
          var item = _step.value;

          if (item.isDefault) {
            await setVideoDevice$1({
              deviceId: item.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetCamera = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError = true;
        _iteratorError = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion && _iterator.return != null) {
            _iterator.return();
          }
        } finally {
          if (_didIteratorError) {
            throw _iteratorError;
          }
        }
      }

      if (!hasSetCamera) {
        await setVideoDevice$1({
          deviceId: cameraData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  } // 设置默认的麦克风


  if (devices && devices.microphone) {
    if (zbyAVSDK_device_checker_init.microphone.list.length == 0) {
      await getMicrophoneDeviceListTrtc();
    }

    console.log('pp2');
    await setMicrophoneDevice$3({
      deviceId: devices.microphone,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    console.log('pp3');
    var microPhoneData = await getMicrophoneDeviceListTrtc();

    try {
      if (microPhoneData.length) {
        var hasSetMicrophone = false;
        var _iteratorNormalCompletion2 = true;
        var _didIteratorError2 = false;
        var _iteratorError2 = undefined;

        try {
          for (var _iterator2 = microPhoneData[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
            var _item = _step2.value;

            if (_item.isDefault) {
              await setMicrophoneDevice$3({
                deviceId: _item.deviceId,
                operationType: "".concat(operationType, "_2")
              });
              hasSetMicrophone = true;
              break;
            }
          }
        } catch (err) {
          _didIteratorError2 = true;
          _iteratorError2 = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
              _iterator2.return();
            }
          } finally {
            if (_didIteratorError2) {
              throw _iteratorError2;
            }
          }
        }

        if (!hasSetMicrophone) {
          await setMicrophoneDevice$3({
            deviceId: microPhoneData[0].deviceId,
            operationType: "".concat(operationType, "_3")
          });
        }
      }
    } catch (e) {
      console.log(e);
    }
  } // 设置默认的扬声器


  if (devices && devices.speaker) {
    await setSpeakerDevice$3({
      deviceId: devices.speaker,
      operationType: "".concat(operationType, "_1")
    });
  } else {
    var speakerData = await getSpeakerDeviceListTrtc();

    if (speakerData.length) {
      var hasSetSpeaker = false;
      var _iteratorNormalCompletion3 = true;
      var _didIteratorError3 = false;
      var _iteratorError3 = undefined;

      try {
        for (var _iterator3 = speakerData[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
          var _item2 = _step3.value;

          if (_item2.isDefault) {
            await setSpeakerDevice$3({
              deviceId: _item2.deviceId,
              operationType: "".concat(operationType, "_2")
            });
            hasSetSpeaker = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError3 = true;
        _iteratorError3 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
            _iterator3.return();
          }
        } finally {
          if (_didIteratorError3) {
            throw _iteratorError3;
          }
        }
      }

      if (!hasSetSpeaker) {
        await setSpeakerDevice$3({
          deviceId: speakerData[0].deviceId,
          operationType: "".concat(operationType, "_3")
        });
      }
    }
  }
}; //麦克风相关

/**
 * @function 开启麦克风
 * @param intervalMs: Number
 * @return Promise | void
 */

var startMicrophone$1 = function startMicrophone() {
  var intervalMs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 500;
  return callMethod$6('StartMicrophone', {
    intervalMs: intervalMs
  });
};
/**
 * @function 关闭麦克风
 * @return Promise | void
 */


var stopMicrophone$1 = function stopMicrophone() {
  return callMethod$6('StopMicrophone', {});
};

var openOrCloseMicrophone$1 = async function openOrCloseMicrophone(operation) {
  isNoticeMicVolumeTRTC = operation;

  if (operation) {
    await startMicrophone$1();
  } else {
    await stopMicrophone$1();
  }
};
/**
 * @function 设置麦克风音量大小回调周期
 * @param intervalMs: Number
 * @return Promise | void
 */


var setMicphoneVolumInterval$1 = function setMicphoneVolumInterval(intervalMs) {
  return callMethod$6('SetMicphoneVolumInterval', {
    intervalMs: intervalMs
  });
};
/**
 * @function 获取麦克风设备列表
 * @return Promise | void
 */


var getMicrophoneDeviceList$2 = function getMicrophoneDeviceList() {
  return callMethod$6('GetMicrophoneDeviceList', {});
};
/**
 * @function 获取麦克风列表
 * @return Promise | void
 */


var getMicrophoneDeviceListTrtc = async function getMicrophoneDeviceListTrtc() {
  console.log('getMicrophoneDeviceListTrtc_microphoneListArr_trtc_ii');
  var microphoneListArr = JSON.parse(JSON.parse((await getMicrophoneDeviceList$2()).msg).DeviceList);
  console.log('getMicrophoneDeviceListTrtc_microphoneListArr_trtc_iii', microphoneListArr);
  var microphoneList = [];

  for (var i = 0, len = microphoneListArr.length; i < len; i++) {
    microphoneList.push({
      deviceId: microphoneListArr[i].id,
      deviceName: microphoneListArr[i].name,
      isDefault: microphoneListArr[i].default
    });
    deviceListReport.micList[microphoneListArr[i].szDeviceId] = microphoneListArr[i].szDeviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.microphone) {
    window.zbyAVSDK_device_checker_init.microphone = {};
  }

  window.zbyAVSDK_device_checker_init.microphone.hasTest = true;
  window.zbyAVSDK_device_checker_init.microphone.list = microphoneList;
  console.log('getMicrophoneDeviceListTrtc_microphoneListArr_trtc', microphoneList);
  return microphoneList;
};
/**
 * @function 设置指定音频(当前麦克风)设备
 * @param deviceId:String 音频设备 id,必选
 * @return Promise | void
 */


var setCurrentMicrophoneDevice$1 = function setCurrentMicrophoneDevice(deviceId) {
  window.zbyAVSDK_device_checker_init.microphone.use = deviceId;
  return callMethod$6('SetCurrentMicrophoneDevice', {
    deviceId: deviceId
  });
};
/**
 * @function 指定麦克风设备
 * @param deviceId:String 麦克风设备 id,必选
 * @param operationType:String 操作类型,可选
 * @return Promise | void
 */


var setMicrophoneDevice$3 = async function setMicrophoneDevice(args) {
  console.log('getMicrophoneDeviceListTrtc_microphoneListArr_trtc_i');
  var deviceId = args.deviceId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var microPhoneData;

  if (!deviceId) {
    microPhoneData = await getMicrophoneDeviceListTrtc();

    if (microPhoneData.length) {
      var hasGetMicrophone = false;
      var _iteratorNormalCompletion4 = true;
      var _didIteratorError4 = false;
      var _iteratorError4 = undefined;

      try {
        for (var _iterator4 = microPhoneData[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
          var item = _step4.value;

          if (item.isDefault) {
            deviceId = item.deviceId;
            deviceName = item.deviceName;
            hasGetMicrophone = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError4 = true;
        _iteratorError4 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
            _iterator4.return();
          }
        } finally {
          if (_didIteratorError4) {
            throw _iteratorError4;
          }
        }
      }

      if (!hasGetMicrophone) {
        deviceId = microPhoneData[0].deviceId;
        deviceName = microPhoneData[0].deviceName;
      }
    } else {
      deviceId = '';
    }

    if (deviceId === '') {
      NOTICE.noDevice({
        deviceType: 'microphone'
      });
    }
  }

  try {
    dataReport$2.setDevice({
      device_type: 2,
      device_id: deviceId,
      device_name: deviceListReport.micList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? +deviceState + 1 : '-'
    });
    window.zbyAVSDK_device_checker_init.microphone.name = deviceListReport.micList[deviceId];
  } catch (e) {}

  ;
  await setCurrentMicrophoneDevice$1(deviceId);

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!microPhoneData) {
      microPhoneData = await getMicrophoneDeviceListTrtc();
      deviceName = deviceListReport.micList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'microphone',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: microPhoneData,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }
};
/**
 * @function 获取当前麦克风的音量
 * @return Promise | void
 */


var getCurrentMicrophoneVolume$1 = function getCurrentMicrophoneVolume() {
  return callMethod$6('GetCurrentMicrophoneVolume', {}).then(function (ret) {
    var volume = 0;

    try {
      volume = JSON.parse(ret.msg).microphoneVolume;
    } catch (e) {
      console.error("zby-live-sdk: getCurrentMicrophoneVolume ret: ".concat(ret, ". error: ").concat(e));
    }

    return volume;
  });
};
/**
 * @function 设置当前麦克风的音量
 * @param volume : number 音量值
 * @return Promise | void
 */


var setCurrentMicrophoneVolume$1 = function setCurrentMicrophoneVolume(volume) {
  return callMethod$6('SetCurrentMicrophoneVolume', {
    volume: volume
  });
};
/**
 * @function 获取当前麦克风ID
 * @return Promise | void
 */


var getCurrentMicrophoneId$2 = function getCurrentMicrophoneId(volume) {
  return callMethod$6('GetCurrentMicrophoneId', {
    volume: volume
  });
}; //摄像头相关

/**
 * @function 打开摄像头
 * @param width: Number
 * @param height: Number
 * @return Promise | void
 */


var startCamera$1 = function startCamera(width, height) {
  return callMethod$6('StartCamera', {
    width: width,
    height: height
  });
};
/**
 * @function 关闭摄像头
 * @return Promise | void
 */


var stopCamera$1 = function stopCamera() {
  return callMethod$6('StopCamera', {});
};

var openOrCloseCamera$2 = async function openOrCloseCamera(operation) {
  console.log('openCa', operation);

  if (operation) {
    await startCamera$1();
  } else {
    await stopCamera$1();
  }
};
/**
 * @function 获取摄像头列表
 * @return Promise | void
 */


var getCameraDeviceList$1 = function getCameraDeviceList() {
  return callMethod$6('GetCameraDeviceList', {});
};
/**
 * @function 获取摄像头列表
 * @return Promise | void
 */


var getCameraDeviceListTrtc = async function getCameraDeviceListTrtc() {
  var videoListArr = JSON.parse(JSON.parse((await getCameraDeviceList$1()).msg).DeviceList);
  console.log('GetCameraDeviceList_cameraList_trtc_iiii', videoListArr);
  var videoList = [];

  for (var i = 0, len = videoListArr.length; i < len; i++) {
    videoList.push({
      deviceId: videoListArr[i].id,
      deviceName: videoListArr[i].name,
      isDefault: videoListArr[i].default
    });
    deviceListReport.cameraList[videoListArr[i].szDeviceId] = videoListArr[i].szDeviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.camera) {
    window.zbyAVSDK_device_checker_init.camera = {};
  }

  window.zbyAVSDK_device_checker_init.camera.hasTest = true;
  window.zbyAVSDK_device_checker_init.camera.list = videoList;
  console.log('GetCameraDeviceList_cameraList_trtc', videoList);
  return videoList;
};
/**
 * @function 设置指定视频(当前摄像头)设备
 * @param deviceId:String 视频设备 id,必选
 * @return Promise | void
 */

var setCurrentCameraDevice = function setCurrentCameraDevice(deviceId) {
  window.zbyAVSDK_device_checker_init.camera.use = deviceId;
  return callMethod$6('SetCurrentCameraDevice', {
    deviceId: deviceId
  });
};
/**
 * @function 指定使用的摄像头
 * @param deviceId:String 摄像头 id,必选
 * @param operationType:String 操作类型,可选
 * 'device_error' -> 设备出错处理,'plug_and_unplug' -> 热插拔处理,
 * 不传即是普通的设置摄像头设备的行为
 * @return Promise | void
 */


var setVideoDevice$1 = async function setVideoDevice(args) {
  defaultApi$1.writeLog("".concat(JSON.stringify(args), "----setVideoDevice-trtc----"));
  var deviceId = args.deviceId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      code = args.code,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var cameraData;

  if (!deviceId) {
    cameraData = await getCameraDeviceListTrtc(); // console.log('hsghsghsg0',cameraData);

    if (cameraData.length) {
      var hasGetCamare = false; // console.log('hsghsghsg1',hasGetSpeaker);

      var _iteratorNormalCompletion5 = true;
      var _didIteratorError5 = false;
      var _iteratorError5 = undefined;

      try {
        for (var _iterator5 = cameraData[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
          var item = _step5.value;

          if (item.isDefault) {
            deviceId = item.deviceId;
            deviceName = item.deviceName;
            hasGetCamare = true;
            break;
          }
        } // console.log('hsghsghsg2',hasGetSpeaker);

      } catch (err) {
        _didIteratorError5 = true;
        _iteratorError5 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
            _iterator5.return();
          }
        } finally {
          if (_didIteratorError5) {
            throw _iteratorError5;
          }
        }
      }

      if (!hasGetCamare) {
        deviceId = cameraData[0].deviceId;
        deviceName = cameraData[0].deviceName; // console.log('hsghsghsg91',deviceId);
      }
    } else {
      deviceId = '';
    } // console.log('hsghsghsg1',deviceId);


    if (deviceId === '') {
      NOTICE.noDevice({
        deviceType: 'camera'
      });
    }
  }

  window.zbyAVSDK_device_checker_init.camera.use = deviceId;
  window.zbyAVSDK_device_checker_init.camera.name = deviceListReport.cameraList[deviceId];

  try {
    dataReport$2.setDevice({
      device_type: 1,
      device_id: deviceId,
      device_name: deviceListReport.cameraList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? deviceState + 1 : '-'
    });
  } catch (e) {}

  ;
  await setCurrentCameraDevice(deviceId);

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!cameraData) {
      cameraData = await getCameraDeviceListTrtc();
      deviceName = deviceListReport.cameraList[deviceId];
    }

    NOTICE[operationType]({
      deviceType: 'camera',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: cameraData,
      messge: code,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }

  try {
    NOTICE.useredCamera({
      deviceId: deviceId,
      deviceName: deviceName
    });
  } catch (e) {}

  ;
};
/**
 * @function 获取当前摄像头ID
 * @return Promise | void
 */


var GetCurrentCameraId$1 = function GetCurrentCameraId() {
  return callMethod$6('GetCurrentCameraId', {});
}; //扬声器相关

/**
 * @function 获取扬声器列表
 * @return Promise | void
 */


var getSpeakerDeviceList$2 = function getSpeakerDeviceList() {
  return callMethod$6('GetSpeakerDeviceList', {});
};
/**
 * @function 获取扬声器列表
 * @return Promise | void
 */


var getSpeakerDeviceListTrtc = async function getSpeakerDeviceListTrtc() {
  var speakerListArr = JSON.parse(JSON.parse((await getSpeakerDeviceList$2()).msg).DeviceList);
  console.log('getSpeakerDeviceList_speakerListArr_trtc_ii', speakerListArr);
  var speakerList = [];

  for (var i = 0, len = speakerListArr.length; i < len; i++) {
    speakerList.push({
      deviceId: speakerListArr[i].id,
      deviceName: speakerListArr[i].name,
      isDefault: speakerListArr[i].default
    });
    deviceListReport.speakerList[speakerListArr[i].szDeviceId] = speakerListArr[i].szDeviceName;
  }

  if (!window.zbyAVSDK_device_checker_init) {
    window.zbyAVSDK_device_checker_init = {};
  }

  if (!window.zbyAVSDK_device_checker_init.speaker) {
    window.zbyAVSDK_device_checker_init.speaker = {};
  }

  window.zbyAVSDK_device_checker_init.speaker.hasTest = true;
  window.zbyAVSDK_device_checker_init.speaker.list = speakerList;
  console.log('getSpeakerDeviceList_speakerListArr_trtc_iii', speakerList);
  return speakerList;
};
/**
 * @function 设置指定音频(当前扬声器)设备
 * @param deviceId:String 音频设备 id,必选
 * @return Promise | void
 */


var setCurrentSpeakerDevice$1 = function setCurrentSpeakerDevice(deviceId) {
  window.zbyAVSDK_device_checker_init.speaker.use = deviceId;
  return callMethod$6('SetCurrentSpeakerDevice', {
    deviceId: deviceId
  });
};
/**
 * @function 指定扬声器
 * @param deviceId:String 扬声器 id,必选
 * @param operationType:String 操作类型,可选
 * 'device_error' -> 设备出错处理,'plug_and_unplug' -> 热插拔处理,
 * 不传即是普通的设置扬声器设备的行为
 * @return Promise | void
 */


var setSpeakerDevice$3 = async function setSpeakerDevice(args) {
  defaultApi$1.writeLog("".concat(JSON.stringify(args), "----setSpeakerDevice-trtc----"));
  console.log('hsghsghsg999', args);
  var deviceId = args.deviceId,
      operationType = args.operationType,
      deviceState = args.deviceState,
      code = args.code,
      changedDeviceId = args.changedDeviceId;
  var deviceName = '';
  var speakerData;

  if (!deviceId) {
    speakerData = await getSpeakerDeviceListTrtc();
    console.log('hsghsghsg0', speakerData.length);

    if (speakerData.length) {
      var hasGetSpeaker = false;
      console.log('hsghsghsg1', hasGetSpeaker);
      var _iteratorNormalCompletion6 = true;
      var _didIteratorError6 = false;
      var _iteratorError6 = undefined;

      try {
        for (var _iterator6 = speakerData[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
          var item = _step6.value;

          if (item.isDefault) {
            deviceId = item.deviceId;
            deviceName = item.deviceName;
            hasGetSpeaker = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError6 = true;
        _iteratorError6 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion6 && _iterator6.return != null) {
            _iterator6.return();
          }
        } finally {
          if (_didIteratorError6) {
            throw _iteratorError6;
          }
        }
      }

      console.log('hsghsghsg2', hasGetSpeaker);

      if (!hasGetSpeaker) {
        deviceId = speakerData[0].deviceId;
        deviceName = speakerData[0].deviceName;
        console.log('hsghsghsg91', deviceId);
      }
    } else {
      deviceId = '';
    }

    if (deviceId === '') {
      NOTICE.noDevice({
        deviceType: 'speaker'
      });
    }
  }

  console.log('hsghsghsg999', deviceId);

  try {
    dataReport$2.setDevice({
      device_type: 3,
      device_id: deviceId,
      device_name: deviceListReport.speakerList[deviceId],
      operationType: operationType,
      fore_state: operationType == 'hotPlug' ? deviceState + 1 : '-'
    });
    window.zbyAVSDK_device_checker_init.speaker.name = deviceListReport.speakerList[deviceId];
  } catch (e) {
    console.log(e);
  }

  ;
  console.log('hsghsghsg99911', deviceId);
  usingAudioDeviceId$2.speaker = deviceId;
  await setCurrentSpeakerDevice$1(deviceId);

  if (operationType == 'hotPlug' || operationType == 'deviceError') {
    if (!speakerData) {
      speakerData = await getSpeakerDeviceListTrtc();
      deviceName = deviceListReport.speakerList[deviceId];
    }

    console.log('hsghsghsg99911', deviceId);
    NOTICE[operationType]({
      deviceType: 'speaker',
      useDeviceId: deviceId,
      useDeviceName: deviceName,
      deviceList: speakerData,
      message: code,
      deviceState: deviceState,
      changedDeviceId: changedDeviceId
    });
  }

  console.log('hsghsghsg999112', deviceId);
};
/**
 * @function 获取当前扬声器的音量
 * @return Promise | void
 */


var getCurrentSpeakerVolume$1 = function getCurrentSpeakerVolume() {
  return callMethod$6('GetCurrentSpeakerVolume', {});
};
/**
 * @function 获取当前扬声器ID
 * @return Promise | void
 */


var getCurrentSpeakerId$2 = function getCurrentSpeakerId() {
  return callMethod$6('GetCurrentSpeakerId', {});
};
/**
 * @function 设置当前扬声器音量
 * @param volume : number 音量值
 * @return Promise | void
 */


var setCurrentSpeakerVolume$1 = function setCurrentSpeakerVolume(volume) {
  return callMethod$6('SetCurrentSpeakerVolume', {
    volume: volume
  });
};
/**
 * @function 打开系统声音采集
 * @return Promise | void
 */


var startSystemAudioLoopback = function startSystemAudioLoopback() {
  return callMethod$6('StartSystemAudioLoopback', {});
};
/**
 * @function 关闭系统声音采集
 * @return Promise | void
 */


var stopSystemAudioLoopback = function stopSystemAudioLoopback() {
  return callMethod$6('StopSystemAudioLoopback', {});
}; //采集扬声器声音


var setAudioSpeakerCapture$2 = function setAudioSpeakerCapture(speaker) {
  if (speaker) {
    return startSystemAudioLoopback();
  } else {
    return stopSystemAudioLoopback();
  }
}; //sei

/**
 * @function sei消息
 * @param data: String    数据
 * @param dataSize: Number    数据长度
 * @param repeatCount: Number    发送次数
 * @return Promise | void
 */


var sendSEIMsg$1 = function sendSEIMsg(data, dataSize, repeatCount) {
  if (typeof dataSize === 'undefined') {
    dataSize = data.length;
  }

  ;

  if (typeof repeatCount === 'undefined') {
    repeatCount = 1;
  }

  return callMethod$6('SendSEIMsg', {
    data: data,
    dataSize: dataSize,
    repeatCount: repeatCount
  });
}; //采集相关

/**
 * @function 开始屏幕采集
 * @return Promise | void
 */


var startScreenCapture$1 = function startScreenCapture() {
  return callMethod$6('StartScreenCapture', {});
};
/**
 * @function 停止屏幕采集
 * @return Promise | void
 */


var stopScreenCapture$1 = function stopScreenCapture() {
  return callMethod$6('StopScreenCapture', {});
}; //推拉流相关

/**
 * @function 开启本地或者远程的视频视图
 * @param isLocal:Boolean 是否是本地的视频预览,必选
 * @param streamId:String 要拉取的视频流的 id,可选,只有拉取远程的视频流的时候才是必选的
 * @param domId:String <video> 标签的 id,可选
 * 如果传了 domId,就把视频绑定到对应的 <video> 标签上
 * @return Promise 可从 Promise 中获取 src,Promise.then((src) => {})
 */


var startLocalOrRemotePreview$3 = async function startLocalOrRemotePreview(isLocal, streamId, domId, isTeacherNewWindowPreview) {
  defaultApi$1.writeLog("".concat(streamId, "----streamId-trtc---- ").concat(isLocal));
  var isUpdateChromeVersion = await util.getChromeVersion(); // 预览本地视频的话,流 id 从全局配置中获取
  // if (isLocal) {
  //   streamId = isInRoom ? (window.zbyAVSDK_init_params && window.zbyAVSDK_init_params.trtc.streamId)
  //     : 'deviceCheckerInit';
  // }

  var externalConstraints = {
    audio: false,
    video: {
      mandatory: {
        chromeMediaSource: 'external',
        chromeMediaSourceId: "ems://trtc_ext/".concat(isLocal || isTeacherNewWindowPreview ? -3 : streamId)
      }
    }
  };
  console.log('externalConstraints', externalConstraints);
  return new Promise(function (resolve, reject) {
    var handleExternalSuccess = function handleExternalSuccess(stream) {
      defaultApi$1.writeLog("".concat(stream, "----stream-trtc----"));

      stream.oninactive = function () {
        defaultApi$1.writeLog('Stream inactive');
      };

      var src = isUpdateChromeVersion ? stream : window.URL.createObjectURL(stream);
      console.log('内核升级', isUpdateChromeVersion, domId, src);

      if (domId && document.querySelector(domId)) {
        if (isUpdateChromeVersion) {
          document.querySelector(domId).srcObject = src;
          console.log('内核升级1', domId, document.querySelector(domId), document.querySelector(domId).srcObject, src);
        } else {
          console.log('内核升级2');
          document.querySelector(domId).src = src;
        }
      }

      defaultApi$1.writeLog("setVidoeSrc, streamId:".concat(streamId, ", domId: ").concat(domId, ", src: ").concat(src));
      resolve(src);
    };

    var handleExternalError = function handleExternalError(error) {
      if (error.name === 'ConstraintNotSatisfiedError') {
        console.error('ConstraintNotSatisfiedError');
      } else if (error.name === 'PermissionDeniedError') {
        console.error('Permissions have not been granted to use your camera and ' + 'microphone, you need to allow the page access to your devices in ' + 'order for the demo to work.');
      }

      console.error("getUserMedia error: ".concat(error.name), error);

      if (domId) {
        document.querySelector(domId).src = '';
      }

      reject('');
    };

    if (navigator.webkitGetUserMedia) {
      navigator.webkitGetUserMedia(externalConstraints, handleExternalSuccess, handleExternalError);
    }
  });
};
/**
 * @function 开始推流
 * @param streamId: String   流id
 * @return Promise | void
 */


var startPush$2 = function startPush(streamId) {
  var channel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;

  if (!streamId) {
    streamId = zbyAVSDK_init_params.trtc.streamId;
  } // 心跳开始


  if (!isFirstHeartBeatReport$3) {
    isFirstHeartBeatReport$3 = true;
    console.log('ppppppp上报呀');
    heartBeatDataReport$3('start');
  }

  console.log('startPush', streamId, channel);
  return callMethod$6('StartPush', {
    streamId: streamId,
    channel: channel
  });
};
/**
 * @function 停止推流
 * @param streamId: String   流id
 * @return Promise | void
 */


var stopPush$2 = function stopPush(channel) {
  //  if(!streamId){
  //   streamId = zbyAVSDK_init_params.trtc.streamId;
  //  }
  if (!channel) {
    channel = 0;
  }

  return callMethod$6('StopPush', {
    channel: channel
  });
};
/**
 * @function 不推/推 音频
 * @param enable : bool   
 * @return Promise | void
 */


var muteLocalAudio$2 = function muteLocalAudio(enable) {
  return callMethod$6('MuteLocalAudio', {
    enable: enable
  });
};
/**
 * @function 不推/推 视频
 * @param enable: bool  
 * @return Promise | void
 */


var muteLocalVideo$2 = function muteLocalVideo(enable) {
  return callMethod$6('MuteLocalVideo', {
    enable: enable
  });
};
/**
 * @function 开始转推本地摄像头TRTC流至RTMP。目前只支持转推1路
 * @return Promise | void
 */


var addPublishRtmpStreamUrl$1 = function addPublishRtmpStreamUrl() {
  return callMethod$6('AddPublishRtmpStreamUrl', {});
};
/**
 * @function 停止转推RTMP
 * @return Promise | void
 */


var removePublishStreamUrl$1 = function removePublishStreamUrl() {
  return callMethod$6('RemovePublishStreamUrl', {});
};
/**
 * @function 开始拉流
 * @param streamId: String   流id
 * @return Promise | void
 */


var startPlay$1 = function startPlay(streamId) {
  return callMethod$6('StartPlay', {
    streamId: streamId
  });
};
/**
 * @function 初始化拉流
 * @param streamId:String 从传来的信道消息中获取,必选
 * @param domId:String <video> 标签的 id,可选
 * 如果传了就把视频绑定到对应的 <video> 标签上
 * @param pInfo:String 多媒体流附加信息,可选,默认为 'none'
 * @return src:String 视频预览地址
 */


var initPullFlow$3 = async function initPullFlow(streamId, domId, mute, pInfo, notAutoPlay, audioOnly) {
  defaultApi$1.writeLog("TRTC:: initPullFlow_start ,streamId :".concat(streamId));
  var playChannel;
  resetStreamIdRtcPlayerInfo1$3(streamId);
  resetStreamIdRtcPlayerInfo$3(streamId);

  try {
    if (!isFirstHeartBeatReport$3) {
      isFirstHeartBeatReport$3 = true;
      heartBeatDataReport$3('start');
    }
  } catch (error) {}

  if (streamIdToPreviewId$3[streamId] == undefined) {
    // defaultApi.writeLog(`TRTC::  The streamId queue does not contain this streamId ${uiChnIndexs}`);
    playChannel = uiChnIndexs$2.pop();
    streamIdToPreviewId$3[streamId] = playChannel;
    console.log('streamIdIsNoExited', playChannel, streamIdToPreviewId$3[streamId], streamId, uiChnIndexs$2);
  } else {
    defaultApi$1.writeLog('TRTC::  The streamId queue contains this streamId');
    playChannel = streamIdToPreviewId$3[streamId];
    console.log('streamIdIsExited', playChannel, streamIdToPreviewId$3[streamId], streamId, uiChnIndexs$2);
    await stopPlay$1(streamId);
    resetStreamIdRtcPlayerInfo$3(streamId);
  } // 判断是否创建或者获取播放通道成功,不成功就删掉重试
  // if (playChannel == undefined) {
  //   delete streamIdToPreviewId[streamId];
  //   defaultApi.writeLog('error', 'TRTC::  uiChnIndex is not exist');
  //   // delete streamIdToBlobUrl[streamId];
  //   return initPullFlow(streamId, domId, mute, pInfo, notAutoPlay, audioOnly);
  // }


  previewIdToStreamId$2[playChannel] = streamId; //是否拉取声音
  // await muteRemoteAudio(streamId, !!mute);
  // //是否拉取画面
  // await muteRemoteVideo(streamId, !!audioOnly);

  if (!notAutoPlay) {
    await startPlay$1(streamId);
  }

  await muteRemoteAudio$1(streamId, !!mute); //是否拉取画面

  await muteRemoteVideo$1(streamId, !!audioOnly);
  var videoSrc = await startLocalOrRemotePreview$3(false, streamId, domId);
  return {
    videoSrc: videoSrc,
    playerId: playChannel
  };
};
/**
 * @function 停止拉流
 * @param streamId: String   流id
 * @return Promise | void
 */

var stopPlay$1 = function stopPlay(streamId, recovery) {
  var id = streamIdToPreviewId$3[streamId];
  delete streamIdRtcPlayerInfo$3[streamId];

  if (recovery && id && !uiChnIndexs$2.includes(id)) {
    uiChnIndexs$2.push(id);
    defaultApi$1.writeLog("avsdk TRTC::stopPlayStream streamId: ".concat(streamId, " id: ").concat(id, " uiChnIndexs: ").concat(uiChnIndexs$2));
    delete streamIdToPreviewId$3[streamId];
  }

  return callMethod$6('StopPlay', {
    streamId: streamId
  });
};
/**
 * @function 停止拉所有的流
 * @return Promise | void
 */


var stopPlayAll$1 = function stopPlayAll() {
  return callMethod$6('StopPlayAll', {});
};
/**
 * @function 不拉/拉 音频 true是静音/false是拉声音
 * @param streamId :string
 * @param mute : bool   
 * @return Promise | void
 */


var muteRemoteAudio$1 = function muteRemoteAudio(streamId, mute) {
  console.log('audio_type', mute);
  streamIdRtcPlayerInfo1$3[streamId].audio_type = !mute;
  console.log('audio_type1', streamIdRtcPlayerInfo1$3);
  return callMethod$6('MuteRemoteAudio', {
    streamId: streamId,
    mute: mute
  });
};

var pullAudioFlow$3 = async function pullAudioFlow(playerId, operation, streamid) {
  defaultApi$1.writeLog("pullAudioFlow -- playerId ".concat(playerId, " operation ").concat(operation, " streamId ").concat(streamid));

  if (streamid) {
    if (streamIdToPreviewId$3[streamid] == undefined) {
      NOTICE.pullAudioFlowError({
        streamid: streamid
      });
      return;
    } else {
      playerId = streamIdToPreviewId$3[streamid];
      console.log('pullAudioFlow-playerId', playerId, streamIdToPreviewId$3);
    }
  }

  var streamId = previewIdToStreamId$2[playerId];

  try {
    streamIdRtcPlayerInfo1$3[streamId].audio_type = !operation;
    console.log('pullAudioFlow ::previewIdToStreamId', streamId, previewIdToStreamId$2);
    console.log('pullAudioFlow ::streamIdRtcPlayerInfo1', streamId, streamIdRtcPlayerInfo1$3);
  } catch (e) {
    console.log('pullAudioFlow ::streamIdRtcPlayerInfo1--error', e);
  }

  try {
    dataReport$2.setPullVoice({
      code: +!operation,
      pull_uid: util.getUidByStreamId(streamId),
      pull_streamid: streamId,
      playerId: playerId // operator:'client'

    });
  } catch (e) {}

  ;
  return await muteRemoteAudio$1(streamId, operation);
};
/**
 * @function 不拉/拉 视频
 * @param streamId :string
 * @param mute: bool  
 * @return Promise | void
 */


var muteRemoteVideo$1 = function muteRemoteVideo(streamId, mute) {
  try {
    streamIdRtcPlayerInfo1$3[streamId].video_type = !mute;
    console.log('activateVideoPlayStream ::streamIdRtcPlayerInfo1', streamIdRtcPlayerInfo1$3);
  } catch (e) {
    console.log('activateVideoPlayStream ::streamIdRtcPlayerInfo1 --error', e);
  }

  return callMethod$6('MuteRemoteVideo', {
    streamId: streamId,
    mute: mute
  });
};
/**
 * 
 * @function 全员开麦突出声音流
 * @param bFocus :bool
 * @param streamIdarr : array  
 * @return Promise | void
 */


var setFocusStreams = function setFocusStreams(bFocus, streamIdarr) {
  var _callMethod;

  return callMethod$6('SetFocusStreams', (_callMethod = {
    bFocus: bFocus,
    streamId1: streamId1
  }, _defineProperty(_callMethod, "streamId1", streamId1), _defineProperty(_callMethod, "streamId1", streamId1), _defineProperty(_callMethod, "streamId1", streamId1), _callMethod));
}; //加载采集插件的输入数据


var loadCollectionInputEntry$2 = function loadCollectionInputEntry() {
  return callMethod$6('LoadCollectionInputEntry', {});
}; //加载截屏插件

var LoadCollectionOutputEntry2$2 = function LoadCollectionOutputEntry2() {
  defaultApi$1.writeLog('info', 'avsdk TRTC::LoadCollectionOutputEntry2');
  return callMethod$6('LoadCollectionOutputEntry2', {});
}; //开启同屏


var startMultiScreen$2 = async function startMultiScreen() {
  defaultApi$1.writeLog('info', 'avsdk TRTC::startMultiScreen'); // await setVideoCaptureFactory(true,1);

  await LoadCollectionOutputEntry2$2();
}; //高光时刻 enable (bool)/strDomain (string)/strKey (string)


var enableHighlight = async function enableHighlight(enable) {
  var strDomain = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  var strKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
  defaultApi$1.writeLog('info', 'avsdk TRTC::enableHighlight');
  return callMethod$6('EnableHighlight', {
    enable: enable,
    strDomain: strDomain,
    strKey: strKey
  });
};
/**
 * @function 获取当前视频流所有的通道
 * @param  streamId 流 id
 * @return channelIndex
 */


var getAllChannelIndex$2 = function getAllChannelIndex() {
  defaultApi$1.writeLog("TRTC : getAllChannelIndex ".concat(JSON.stringify(streamIdToPreviewId$3)));
  return streamIdToPreviewId$3;
}; //开始连麦

var teacherStartLinkMic$3 = async function teacherStartLinkMic(mode) {
  if (mode === 0) {
    await startMicrophone$1();
  } else {
    //开始连麦后,需要打开麦克风,开启外部采集器后(每次都要开启)
    await startMicrophone$1();
    await setEnableExternVideoCapture(true);
  }
}; //结束连麦


var teacherStopLinkMic$3 = async function teacherStopLinkMic() {
  var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  // if (mode === 0) {
  //   // await muteVideoPublish(false,0);
  // } else {
  await stopMicrophone$1(); // }
};
/**
 * @function 离开教室
 * @return Promise | void
 */


var leaveRoom$3 = async function leaveRoom() {
  for (var key in streamIdToPreviewId$3) {
    await stopPlay$1(key, true); //huishou
  }

  await stopPush$2();
  removerListener$3();
  await destroyEngine$3();
  heartBeatDataReport$3('stop');
  isFirstHeartBeatReport$3 = false;
  streamIdToPreviewId$3 = {};
  previewIdToStreamId$2 = {};
  streamIdRtcPlayerInfo$3 = {};
  streamIdRtcPlayerInfo1$3 = {}; // window.zegoHasPushFlow = 0;
};

var heartBeatRealKeys$3 = ['video_fps', 'video_bitrate', 'audio_fps', 'audio_bitrate'];

var _heartBeatDataReport$3 = function _heartBeatDataReport() {
  console.log('上报吧2'); // let cpuRate = 0;
  // let memRate = 0;
  // let rateCount = 0;
  // let appCpuRate = 0;
  // let appMemUsed = 0;
  // let rateTimer = setInterval(async () => {
  // rateCount++;
  // let {cpu_rate, mem_rate, gpus, app_cpu_rate, app_mem_used} = (await toolApi.getCurCpuMemInfo()).msg;
  // cpu_rate = cpu_rate < 0 ? 0 : cpu_rate;
  // cpuRate += parseFloat(cpu_rate);
  // memRate += parseFloat(mem_rate);
  // if (window.zbyAVSDK_init_params.zego.role === 'student') {
  //   appCpuRate += parseFloat(app_cpu_rate);
  //   appMemUsed += parseFloat(app_mem_used);
  // }
  // if (rateCount >= 3) {
  // heartBeatRealKeys.forEach(realKey => {
  //   if (heartBeatDataReportObj.hasOwnProperty(realKey) && heartBeatDataReportObj.count > 0) {
  //     heartBeatDataReportObj[realKey] = util.toFixed(heartBeatDataReportObj[realKey]/heartBeatDataReportObj.count);
  //   }
  // });

  var pullInfo = [];
  console.log('拉流的类型1', streamIdRtcPlayerInfo$3);
  Object.keys(streamIdRtcPlayerInfo$3).forEach(function (streamid) {
    console.log('拉流的类型1.5');
    heartBeatRealKeys$3.forEach(function (realKey) {
      if (!streamIdRtcPlayerInfo$3[streamid].hasOwnProperty(realKey)) {
        streamIdRtcPlayerInfo$3[streamid][realKey] = [];
      } // if (streamIdRtcPlayerInfo[streamid].count > 0) {
      //   streamIdRtcPlayerInfo[streamid][realKey] = util.toFixed(streamIdRtcPlayerInfo[streamid][realKey]/streamIdRtcPlayerInfo[streamid].count);
      // }

    });
    console.log('拉流的类型2', streamIdRtcPlayerInfo1$3[streamid]); //获取拉流类型,后期可写为函数提出去

    if (streamIdRtcPlayerInfo1$3[streamid].audio_type && streamIdRtcPlayerInfo1$3[streamid].video_type) {
      streamIdRtcPlayerInfo1$3[streamid].stream_type = 'both';
    } else if (!streamIdRtcPlayerInfo1$3[streamid].audio_type && streamIdRtcPlayerInfo1$3[streamid].video_type) {
      streamIdRtcPlayerInfo1$3[streamid].stream_type = 'video';
    } else if (streamIdRtcPlayerInfo1$3[streamid].audio_type && !streamIdRtcPlayerInfo1$3[streamid].video_type) {
      streamIdRtcPlayerInfo1$3[streamid].stream_type = 'audio';
    } else {
      streamIdRtcPlayerInfo1$3[streamid].stream_type = 'none';
    } // console.log('hsghsghsg_type_type', streamIdRtcPlayerInfo1[streamid].stream_type);


    pullInfo.push(_objectSpread({
      streamid: streamid
    }, streamIdRtcPlayerInfo$3[streamid], {
      pull_type: streamIdRtcPlayerInfo1$3[streamid].stream_type,
      volume: streamIdRtcPlayerInfo$3[streamid].volume.slice(0, streamIdRtcPlayerInfo$3[streamid].volume.length - 1)
    }));
    resetStreamIdRtcPlayerInfo$3(streamid);
  });

  if (isFirstHeartBeatReport$3) {
    try {
      //静音推流时过滤掉音频帧率和码率,上报为0;
      // if (!isNoticeMicVolumeZego) {
      //   heartBeatDataReportObj['audio_fps'] = [];
      //   heartBeatDataReportObj['audio_bitrate'] = [];
      // }
      //获取推流类型,后期可写为函数提出去
      if (zbysdk.deviceStatus.camera && zbysdk.deviceStatus.microphone) {
        zbysdk.deviceStatus.stream_type = 'both';
      } else if (!zbysdk.deviceStatus.camera && zbysdk.deviceStatus.microphone) {
        zbysdk.deviceStatus.stream_type = 'audio';
      } else if (zbysdk.deviceStatus.camera && !zbysdk.deviceStatus.microphone) {
        zbysdk.deviceStatus.stream_type = 'video';
      } else {
        zbysdk.deviceStatus.stream_type = 'none';
      }

      ; // console.log('push_type222',zbysdk.deviceStatus,zbysdk.deviceStatus.stream_type);

      defaultApi$1.writeLog("push_type_trtc,camera: ".concat(zbysdk.deviceStatus.camera, ",microphone: ").concat(zbysdk.deviceStatus.microphone, ",type: ").concat(zbysdk.deviceStatus.stream_type, ",a_fps: ").concat(dataTrtcCapture.fps, ", a_bit: ").concat(dataTrtcCapture.audioBitrate, ", v_fps: ").concat(dataTrtcCapture.fps, ", v_bit: ").concat(dataTrtcCapture.videoBitrate)); // if (window.zbyAVSDK_init_params.zego.role === 'teacher') {

      dataReport$2.heartbeat(_objectSpread({}, _objectSpread({}, heartBeatDataReportObj$3, {
        push_type: zbysdk.deviceStatus.stream_type,
        volume: heartBeatDataReportObj$3.volume.slice(0, heartBeatDataReportObj$3.volume.length - 1)
      }), {
        // pull_info: JSON.stringify(pullInfo),
        pull_info: pullInfo // cpu_rate: util.toFixed(cpuRate/rateCount),
        // mem_rate: util.toFixed(memRate/rateCount),

      })); // } else {
      //   dataReport.heartbeat({
      //     ...heartBeatDataReportObj,
      //     pull_info: JSON.stringify(pullInfo),
      //     cpu_rate: util.toFixed(cpuRate/rateCount),
      //     mem_rate: util.toFixed(memRate/rateCount),
      //     app_cpu: util.toFixed(appCpuRate/rateCount),
      //     app_mem: util.toFixed(appMemUsed/rateCount),
      //     video_mem: gpus
      //   });
      // }
    } catch (e) {
      console.log(e);
    }
  }

  resetHeartBeatDataReportObj$3(); // cpuRate = 0;
  // memRate = 0;
  // appCpuRate = 0;
  // appMemUsed = 0;
  // clearInterval(rateTimer);
  // }
  // }, 10 * 1000);
};

var heartBeatDataReport$3 = function heartBeatDataReport(type) {
  try {
    if (type === 'start' && !heartBeatDataReportTimer$3) {
      _heartBeatDataReport$3();

      heartBeatDataReportTimer$3 = setInterval(function () {
        _heartBeatDataReport$3();
      }, 30 * 1000);
    }

    if (type === 'stop') {
      clearInterval(heartBeatDataReportTimer$3);
      heartBeatDataReportTimer$3 = null;
    }
  } catch (error) {
    console.log(error);
  }
};

var heartBeatDataReportCalc$3 = function heartBeatDataReportCalc(name, _data) {
  console.log('hsgmzk111', name, _data);

  var _d = JSON.parse(_data.json);

  console.log('hsgmzk222', name, _d); // 拉流

  var pullKeys = ['fps', 'videoBitrate', 'afps', 'audioBitrate'];

  if (name === 'onRemoteStatistics') {
    console.log('hsgmzk222', streamIdRtcPlayerInfo$3, _d.streamId);

    if (streamIdRtcPlayerInfo$3 && streamIdRtcPlayerInfo$3.hasOwnProperty(_d.streamId)) {
      console.log('hsgmzk22211');
      var streamid = _d.streamId;
      var isReport = true; // streamIdRtcPlayerInfo[streamid].count++;

      heartBeatRealKeys$3.forEach(function (realKey, index) {
        if (_d.hasOwnProperty(pullKeys[index])) {
          if (streamIdRtcPlayerInfo$3[streamid][realKey] === undefined) {
            streamIdRtcPlayerInfo$3[streamid][realKey] = [];
            isReport = false;
          } // streamIdRtcPlayerInfo[streamid][realKey].push(parseFloat(parseInt(item[pullKeys[index]])));

        }
      });
      console.log('hsgmzk333', _d);

      if (isReport) {
        var audio_fps_trtc_pull = 0;
        var audio_bitrate_trtc_pull = 0;
        var video_fps_trtc_pull = 0;
        var video_bitrate_trtc_pull = 0;
        console.log('hsgmzk444', _d);

        if (streamIdRtcPlayerInfo1$3[streamid].audio_type && streamIdRtcPlayerInfo1$3[streamid].video_type) {
          console.log('hsgmzk555', _d);
          audio_fps_trtc_pull = parseFloat(parseInt(_d.afps));
          audio_bitrate_trtc_pull = parseFloat(parseInt(_d.audioBitrate));
          video_fps_trtc_pull = parseFloat(parseInt(_d.fps));
          video_bitrate_trtc_pull = parseFloat(parseInt(_d.videoBitrate));
        } else if (!streamIdRtcPlayerInfo1$3[streamid].audio_type && streamIdRtcPlayerInfo1$3[streamid].video_type) {
          video_fps_trtc_pull = parseFloat(parseInt(_d.fps));
          video_bitrate_trtc_pull = parseFloat(parseInt(_d.videoBitrate));
        } else if (streamIdRtcPlayerInfo1$3[streamid].audio_type && !streamIdRtcPlayerInfo1$3[streamid].video_type) {
          audio_fps_trtc_pull = parseFloat(parseInt(_d.afps));
          audio_bitrate_trtc_pull = parseFloat(parseInt(_d.audioBitrate));
        }

        streamIdRtcPlayerInfo$3[streamid].audio_fps.push(audio_fps_trtc_pull);
        streamIdRtcPlayerInfo$3[streamid].audio_bitrate.push(audio_bitrate_trtc_pull);
        streamIdRtcPlayerInfo$3[streamid].video_fps.push(video_fps_trtc_pull);
        streamIdRtcPlayerInfo$3[streamid].video_bitrate.push(video_bitrate_trtc_pull);
        streamIdRtcPlayerInfo$3[streamid].pull_loss.push(_d.packetLoss);
        streamIdRtcPlayerInfo$3[streamid].pull_delay.push(_d.rtt);
        streamIdRtcPlayerInfo$3[streamid].ctime.push(Math.round((new Date().getTime() + dataReport$2.timestamp) / 1000));
        streamIdRtcPlayerInfo$3[streamid].video_ifg += _d.videoBlockRate;
        streamIdRtcPlayerInfo$3[streamid].audio_ifg += _d.audioBlockRate; // console.log('hsg_tpull_keys',JSON.parse(JSON.stringify(streamIdRtcPlayerInfo[streamid])),_d.avTimestampDiff);
      }
    }
  } // 推流


  var pushKeys = ['fps', 'videoBitrate', 'afps', 'audioBitrate'];

  if (name === 'onLocalStatistics') {
    // console.log('hsgmzk',_d);
    // heartBeatDataReportObj.count++;
    // heartBeatRealKeys.forEach((realKey, index) => {
    //   if (heartBeatDataReportObj.hasOwnProperty(realKey) && _d.hasOwnProperty(pushKeys[index])) {
    //     heartBeatDataReportObj[realKey].push(parseFloat(parseInt(_d[pushKeys[index]])));
    //   }
    // });
    var audio_fps_trtc_push = 0;
    var audio_bitrate_trtc_push = 0;
    var video_fps_trtc_push = 0;
    var video_bitrate_trtc_push = 0;
    dataTrtcCapture = _d;

    if (zbysdk.deviceStatus.camera && zbysdk.deviceStatus.microphone) {
      audio_fps_trtc_push = parseFloat(parseInt(_d.afps));
      audio_bitrate_trtc_push = parseFloat(parseInt(_d.audioBitrate));
      video_fps_trtc_push = parseFloat(parseInt(_d.fps));
      video_bitrate_trtc_push = parseFloat(parseInt(_d.videoBitrate));
    } else if (!zbysdk.deviceStatus.camera && zbysdk.deviceStatus.microphone) {
      audio_fps_trtc_push = parseFloat(parseInt(_d.afps));
      audio_bitrate_trtc_push = parseFloat(parseInt(_d.audioBitrate));
    } else if (zbysdk.deviceStatus.camera && !zbysdk.deviceStatus.microphone) {
      video_fps_trtc_push = parseFloat(parseInt(_d.fps));
      video_bitrate_trtc_push = parseFloat(parseInt(_d.videoBitrate));
    } // console.log('hsg6666666',audio_fps_trtc_push,audio_bitrate_trtc_push,video_fps_trtc_push,video_bitrate_trtc_push);


    heartBeatDataReportObj$3.audio_fps.push(audio_fps_trtc_push);
    heartBeatDataReportObj$3.audio_bitrate.push(audio_bitrate_trtc_push);
    heartBeatDataReportObj$3.video_fps.push(video_fps_trtc_push);
    heartBeatDataReportObj$3.video_bitrate.push(video_bitrate_trtc_push);
    heartBeatDataReportObj$3.push_loss.push(_d.packetLoss);
    heartBeatDataReportObj$3.push_delay.push(_d.rtt);
    heartBeatDataReportObj$3.ctime.push(Math.round((new Date().getTime() + dataReport$2.timestamp) / 1000)); // console.log('hsg_td5',JSON.parse(JSON.stringify(heartBeatDataReportObj)));
  }
}; //推流字段


var resetHeartBeatDataReportObj$3 = function resetHeartBeatDataReportObj() {
  // console.log('hsg_td55556重置');
  heartBeatDataReportObj$3 = {
    ctime: [],
    push_type: 'none',
    video_fps: [],
    video_bitrate: [],
    audio_fps: [],
    audio_bitrate: [],
    push_loss: [],
    push_delay: [],
    volume: ''
  };
}; //记录拉流类型,用作数据上报


var resetStreamIdRtcPlayerInfo1$3 = function resetStreamIdRtcPlayerInfo1(streamId) {
  streamIdRtcPlayerInfo1$3[streamId] = {
    audio_type: false,
    video_type: false,
    stream_type: 'none'
  }; // console.log('hsgshgs_heartbeat',streamIdRtcPlayerInfo1);
};

resetHeartBeatDataReportObj$3(); //拉

var resetStreamIdRtcPlayerInfo$3 = function resetStreamIdRtcPlayerInfo(streamId) {
  streamIdRtcPlayerInfo$3[streamId] = {
    pull_uid: util.getUidByStreamId(streamId),
    streamid: streamId,
    ctime: [],
    pull_type: streamIdRtcPlayerInfo1$3[streamId].stream_type,
    volume: '',
    video_fps: [],
    video_bitrate: [],
    audio_fps: [],
    audio_bitrate: [],
    pull_loss: [],
    pull_delay: [],
    //音画不同步字段
    avtimestampdiff: [],
    // 累加
    audio_ifg: 0,
    video_ifg: 0
  };
};

var trtcsdk = {
  init: init$3,
  setCameraCaptureResolution: setCameraCaptureResolution$1,
  setCameraEncodeResolution: setCameraEncodeResolution$1,
  setCameraEncodeFps: setCameraEncodeFps$1,
  setCameraEncodeBiarate: setCameraEncodeBiarate,
  getCameraResolution: getCameraResolution$1,
  getMicrophoneDeviceListTrtc: getMicrophoneDeviceListTrtc,
  setMicrophoneDevice: setMicrophoneDevice$3,
  openOrCloseMicrophone: openOrCloseMicrophone$1,
  getCurrentMicrophoneVolume: getCurrentMicrophoneVolume$1,
  setCurrentMicrophoneVolume: setCurrentMicrophoneVolume$1,
  setCurrentCameraDevice: setCurrentCameraDevice,
  getCameraDeviceListTrtc: getCameraDeviceListTrtc,
  setVideoDevice: setVideoDevice$1,
  openOrCloseCamera: openOrCloseCamera$2,
  getSpeakerDeviceListTrtc: getSpeakerDeviceListTrtc,
  setSpeakerDevice: setSpeakerDevice$3,
  getCurrentSpeakerVolume: getCurrentSpeakerVolume$1,
  setCurrentSpeakerVolume: setCurrentSpeakerVolume$1,
  setAudioSpeakerCapture: setAudioSpeakerCapture$2,
  startLocalOrRemotePreview: startLocalOrRemotePreview$3,
  startPush: startPush$2,
  stopPush: stopPush$2,
  startPlay: startPlay$1,
  stopPlay: stopPlay$1,
  initPullFlow: initPullFlow$3,
  pullAudioFlow: pullAudioFlow$3,
  muteRemoteVideo: muteRemoteVideo$1,
  muteRemoteAudio: muteRemoteAudio$1,
  stopPlayAll: stopPlayAll$1,
  sendSEIMsg: sendSEIMsg$1,
  startMultiScreen: startMultiScreen$2,
  enableHighlight: enableHighlight,
  getAllChannelIndex: getAllChannelIndex$2,
  leaveRoom: leaveRoom$3,
  teacherStartLinkMic: teacherStartLinkMic$3,
  teacherStopLinkMic: teacherStopLinkMic$3
};

/**
 * @File: 直播云音视频 SDK
 * @Author: xuyuanrui
 * @Email: raywhbxyr@163.com
 * @Date: 2018-08-09 00:03:46
 **/
var RTC = 'rtc';
var ZEGO = 'zego';
var TALRTC = 'talrtc';
var TRTC = 'trtc';
var NERTC = 'nertc';
var VOLCRTC = 'volcrtc'; // rtc 底层流媒体数据上报地址配置

var rtcReportUrl = {
  test: 'test-r.weclassroom.com',
  online: 'r.weclassroom.com'
};
var sdkVale = {
  zego: 8,
  //8代表zego采集麦克风+扬声器
  talrtc: 101,
  //101代表talrtc采集声音
  nertc: 101,
  //101代表talrtc采集声音
  volcrtc: 101,
  //101代表talrtc采集声音
  trtc: 102 //102代表trtc采集声音

};
/**
  * @function 预览和发布设置视频水印
  * @return Promise<boolean>
  */

var setWaterMark$2 = async function setWaterMark(filePath, x, y, w, h, streamId, idx) {
  defaultApi$1.writeLog("zby_av_sdk setWaterMark path:".concat(filePath, ", rect:").concat(JSON.stringify({
    x: x,
    y: y,
    w: w,
    h: h,
    streamId: streamId,
    idx: idx
  })));

  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.setWaterMark(filePath, x, y, w, h, streamId, idx);

    case TALRTC:
    case VOLCRTC:
      return talrtcsdk.setWaterMark(filePath, x, y, w, h, streamId, idx);

    case RTC:
    case NERTC:
    case TRTC:
      defaultApi$1.writeLog("zby_av_sdk setWaterMark not supported, sdk_type:".concat(window.zbyAVSDK_init_sdk_type));
      return false;

    default:
      // 未知或未初始化的 sdk_type 直接返回 false,避免误调用
      return false;
  }
};
/**
 * @function 设备检测初始化(新)
 */

var deviceCheckerInit = async function deviceCheckerInit(extension, env) {
  setDefaultZbySDKDeviceCheckerInit();
  await zegosdk.loadZego(extension.version.zego); //此时课堂外端上无法获取roomid,假数据模拟,待确定userId-万一重复(不推流)

  zegosdk.addListener('deviceCheckerInit');
  await zegosdk.startEngine(2646760764, '/XpDtuxpv4TrBoNTozIs6waxK6LF/mGZK0jVYo003Ws='); //也是需要参数的,还要区分测试环境和线上环境

  await zegosdk.setVideoCaptureResolution(320, 240);
  await zegosdk.setVideoBitrate(100000);
  await zegosdk.setVideoFPS(15);
  await zegosdk.startSoundLevelMonitor();
  await zegosdk.setSoundLevelMonitorCycle(500);
  var isDeviceCheckInitFinished = zegosdk.getDeviceCheckInitStatus();

  if (isDeviceCheckInitFinished) {
    zegosdk.setDeviceCheckInitStatus();
    window.zbyAVSDK_init_sdk_type = 'zego';
    defaultApi$1.writeLog('isDeviceCheckInitFinished1', isDeviceCheckInitFinished);
  } else {
    await new Promise(function (resolve, reject) {
      var timer = null;
      timer = setInterval(function () {
        isDeviceCheckInitFinished = zegosdk.getDeviceCheckInitStatus();
        defaultApi$1.writeLog('isDeviceCheckInitFinished2', isDeviceCheckInitFinished);

        if (isDeviceCheckInitFinished) {
          zegosdk.setDeviceCheckInitStatus();
          clearInterval(timer);
          resolve();
        }

        defaultApi$1.writeLog('isDeviceCheckInitFinished3', isDeviceCheckInitFinished);
      }, 30);
    });
    window.zbyAVSDK_init_sdk_type = 'zego';
  }

  defaultApi$1.writeLog('change zbyAVSDK_init_sdk_type to rtc , from avsdk device check init');
};
/**
 * @function 设置设备检测对象默认值
 */

var setDefaultZbySDKDeviceCheckerInit = async function setDefaultZbySDKDeviceCheckerInit() {
  if (window.zbyAVSDK_device_checker_init) {
    if (!window.zbyAVSDK_device_checker_init.microphone) {
      window.zbyAVSDK_device_checker_init.microphone = {
        hasTest: false,
        list: [],
        use: '',
        name: ''
      };
    }

    ;

    if (!window.zbyAVSDK_device_checker_init.camera) {
      window.zbyAVSDK_device_checker_init.camera = {
        hasTest: false,
        list: [],
        use: '',
        name: ''
      };
    }

    ;

    if (!window.zbyAVSDK_device_checker_init.speaker) {
      window.zbyAVSDK_device_checker_init.speaker = {
        hasTest: false,
        list: [],
        use: '',
        name: ''
      };
    }

    ;
  } else {
    window.zbyAVSDK_device_checker_init = {
      microphone: {
        hasTest: false,
        list: [],
        use: '',
        name: ''
      },
      camera: {
        hasTest: false,
        list: [],
        use: '',
        name: ''
      },
      speaker: {
        hasTest: false,
        list: [],
        use: '',
        name: ''
      }
    };
  } // window.zbyAVSDK_device_checker_init = window.zbyAVSDK_device_checker_init || {
  // window.zbyAVSDK_device_checker_init = {
  // microphone: {
  //   hasTest: false,
  //   list: [],
  //   use: ''
  // },
  //   camera: {
  //     hasTest: false,
  //     list: [],
  //     use: ''
  //   },
  //   speaker: {
  //     hasTest: false,
  //     list: [],
  //     use: ''
  //   }
  // };


  defaultApi$1.writeLog("setDefaultZbySDKDeviceCheckerInit, ".concat(window.zbyAVSDK_device_checker_init));
};
/**
 * @function 结束设备检测
 */

var stopCheckDevice$2 = async function stopCheckDevice() {
  defaultApi$1.writeLog('zby_av_sdk stop checkDevice');
  return zegosdk.stopCheckDevice();
};
/**
 * @function 初始化
 * @param sdk_type:String 'rtc' | 'zego' | 'agora',必选
 * @param args:Object 必选
 * {
 *   rtc: {},
 *   zego: {},
 *   agora: {}
 * }
 * @return Promise | void
 */

var init$4 = function init(sdk_type, args) {
  // 将初始化参数存储到全局
  window.zbyAVSDK_init_sdk_type = sdk_type;
  defaultApi$1.writeLog("change zbyAVSDK_init_sdk_type to ".concat(sdk_type, " , from avsdk init action"));
  window.zbyAVSDK_init_params = args;
  setDefaultZbySDKDeviceCheckerInit(); // if (sdk_type !== 'talrtc') { // TODO: 临时处理,后续需要优化
  //   const config = window.zbyAVSDK_init_params[window.zbyAVSDK_init_sdk_type];
  //   defaultApi.writeLog(`start checkUpdate, from avsdk init action, config: ${JSON.stringify(config)}`);
  //   talrtcsdk.checkUpdate(config.institutionId, config.userId, config.role);
  // }

  return changeSDK(undefined);
};
/**
 * @function 恢复sdk
 */

var recoverSdk$1 = function recoverSdk(args) {
  window.zbyAVSDK_init_params = args;
  var config = window.zbyAVSDK_init_params[window.zbyAVSDK_init_sdk_type];

  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.recoverSdk(config);

    case ZEGO: // return zegosdk.recoverSdk(dealSDKMsg);

    default:
      break;
  }
};
/**
 * @function 切换线路
 * @param args:Object 可选
 * {
 *   sdk_type,  // String,'rtc' | 'zego' | 'agora',可选
 *              // 无传入的话,sdk 线路默认选择 window.zbyAVSDK_init_sdk_type
 *   config     // Object,配置的参数对象,不同的线路参数对象不同,可选
 *              // 无传入的话,sdk 线路默认选择 window.zbyAVSDK_init_params 中相应线路的配置
 * }
 * @return Promise | void
 */

var changeSDK = async function changeSDK(args) {
  if (args) {
    rtcsdk.stopCheckDevice();
    await leaveRoomWithChangeSDK$1().catch(function (err) {
      console.error('leave room fail:', err);
    }); // await unloadExtension();
  }

  if (args && args.sdk_type) {
    window.zbyAVSDK_init_sdk_type = args.sdk_type;
    defaultApi$1.writeLog("change zbyAVSDK_init_sdk_type to ".concat(args.sdk_type, " , from avsdk changeSDK action"));
  }

  if (args && args.config) {
    window.zbyAVSDK_init_params[window.zbyAVSDK_init_sdk_type] = args.config;
  }

  var sdk_type = window.zbyAVSDK_init_sdk_type;
  var config = window.zbyAVSDK_init_params[window.zbyAVSDK_init_sdk_type]; // 默认使用pomelo

  globalConfig.usePomelo = true; // 切换引擎会走到这里

  if (args && config) {
    delete config.devices;
  }

  switch (sdk_type) {
    case RTC:
      return rtcsdk.init(config);

    case ZEGO:
      return zegosdk.init(config);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.init(config);

    case TRTC:
      return trtcsdk.init(config);

    default:
      break;
  }
};
/**
 * @function 卸载扩展
 * @return Promise | void
 */

var unloadExtension = function unloadExtension() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.unloadRtc();

    case ZEGO:
      return zegosdk.unloadZego();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.unloadTalrtc();

    case TRTC:
      return trtcsdk.unloadTrtc();

    default:
      break;
  }
};
/**
 * @function 获取摄像头列表
 * @return Promise | void
 */

var getCameraDeviceList$2 = async function getCameraDeviceList() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return await rtcsdk.getCameraDevice();

    case ZEGO:
      return await zegosdk.getVideoDeviceList();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.getCameraDeviceList();

    case TRTC:
      return await trtcsdk.getCameraDeviceListTrtc();

    default:
      return await zegosdk.getVideoDeviceList();
      break;
  }
};
/**
 * @function 指定摄像头
 * @param deviceId:String 摄像头 id,必须
 * @return Promise | void
 */

var setCameraDevice$2 = async function setCameraDevice(deviceId, operationType) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return await rtcsdk.setCameraDevice({
        deviceId: deviceId,
        operationType: operationType
      });

    case ZEGO:
      return await zegosdk.setVideoDevice({
        deviceId: deviceId,
        operationType: operationType
      });

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.setCameraDevice({
        deviceId: deviceId
      });

    case TRTC:
      return await trtcsdk.setVideoDevice({
        deviceId: deviceId
      });

    default:
      break;
  }
};
/**
 * @function 开摄像/关摄像
 * @param operation:Boolean 操作类型,false -> 关闭,true -> 打开,必选
 * @return Promise | void
 */

var openOrCloseCamera$3 = function openOrCloseCamera(operation) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.openOrCloseCamera(operation);

    case ZEGO:
      return zegosdk.enableCamera(operation);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.openOrCloseCamera(operation);

    case TRTC:
      return trtcsdk.openOrCloseCamera(operation);

    default:
      break;
  }
}; //是否推画面  false/不推  true/推

var setPushStreamVideo = function setPushStreamVideo(operation) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.muteStreamVideo(!operation);

    case ZEGO:
      return zegosdk.setMuteStreamVideo(!operation);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.muteLocalVideo(!operation);

    case TRTC:
    default:
      break;
  }
};
/**
 * @function 是否推声音  ---暂时没有用到,未抛出去未测
 * @param operation:Boolean 操作类型,false -> 关闭,true -> 打开,必选
 * @return Promise | void
 */

var setPushAudioMute = function setPushAudioMute(operation) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.muteStreamAudio(!operation);

    case ZEGO:
      return zegosdk.setMuteStreamAudio(!operation);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.muteLocalAudio(!operation);

    case TRTC:
    default:
      break;
  }
};
/**
 * @function 开启预览
 * @param operation:Boolean 操作类型,false -> 关闭,true -> 打开,必选
 * @return Promise | void
 */

var startPreview$3 = function startPreview(operation) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.startPreview(operation);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.startPreview(operation);

    case ZEGO:
    case TRTC:
    default:
      break;
  }
};
/**
 * @function 结束预览
 * @param operation:Boolean 操作类型,false -> 关闭,true -> 打开,必选
 * @return Promise | void
 */

var stopPreview$3 = function stopPreview(operation) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.stopPreview(operation);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.stopPreview(operation);

    case ZEGO:
    case TRTC:
    default:
      break;
  }
};
/**
 * @function 开始连麦
 * @param mode:number 采集器默认, 默认0=站立 1=坐立
 * @return Promise | void
 */

var teacherStartLinkMic$4 = function teacherStartLinkMic(mode) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.teacherStartLinkMic(mode);

    case ZEGO:
      return zegosdk.teacherStartLinkMic(mode);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.teacherStartLinkMic(mode);

    case TRTC:
      return trtcsdk.teacherStartLinkMic(mode);

    default:
      break;
  }
};
/**
 * @function 结束连麦
 * @param mode:number 采集器默认, 默认0=站立 1=坐立
 * @return Promise | void
 */

var teacherStopLinkMic$4 = function teacherStopLinkMic(mode) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.teacherStopLinkMic(mode);

    case ZEGO:
      return zegosdk.teacherStopLinkMic(mode);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.teacherStopLinkMic(mode);

    case TRTC:
      return trtcsdk.teacherStopLinkMic(mode);

    default:
      break;
  }
};
/**
 * @function 获取视频 src 或者将视频绑定到某一个 <video> 标签上
 * @param args:Object
 * {
 *   isLocal,   // Boolean,是否是本地的视频预览
 *   streamId,  // String,要拉取的视频流的 id,可选,只有拉取远程的视频流的时候才是必选的,本地不用
 *   domId      // String,<video> 标签的 id,可选,如果传了就把视频绑定到对应的 <video> 标签上
 * }
 * @return Promise | void,可从 Promise 中获取 src,Promise.then((src) => {})
 */

var getOrLocateVideo = function getOrLocateVideo(args) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.startLocalOrRemotePreview(args.isLocal, args.streamId, args.domId);

    case ZEGO:
      return zegosdk.startLocalOrRemotePreview(args.isLocal, args.streamId, args.domId, args.isTeacherNewWindowPreview);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.startLocalOrRemotePreview(args.isLocal, args.streamId, args.domId, args.isTeacherNewWindowPreview);

    case TRTC:
      return trtcsdk.startLocalOrRemotePreview(args.isLocal, args.streamId, args.domId, args.isTeacherNewWindowPreview);

    default:
      return zegosdk.startLocalOrRemotePreview(args.isLocal, args.streamId, args.domId);
      break;
  }
};
var setVideoCallback$2 = function setVideoCallback(type) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setVideoCallback(type);

    case ZEGO:
      return zegosdk.setVideoCallback(type);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setVideoCallback(type);

    case TRTC:
      return trtcsdk.setVideoCallback(type);

    default:
      break;
  }
};
/**
 * @function 开始推流
 * @return Promise | void
 */

var startPushFlow = async function startPushFlow(streamid, idx) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return await rtcsdk.startPush();

    case ZEGO:
      return await zegosdk.startPublish2(streamid, idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.startPush(streamid, idx);
    // 可能为空,函数内部有判断逻辑,为空时,根据规则生成streamId

    case TRTC:
      return await trtcsdk.startPush(streamid, idx);
    //流id需要做兼容处理

    default:
      break;
  }
};
/**
 * @function 暂停推流
 * @return Promise | void
 */

var stopPushFlow = function stopPushFlow(idx, streamId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.stopPush();

    case ZEGO:
      return zegosdk.stopPublish(idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.stopPush(streamId);

    case TRTC:
      return trtcsdk.stopPush(idx);

    default:
      break;
  }
};
/**
 * @function 初始化拉流
 * @param args:Object
 * {
 *   streamId,    // String,被拉取的流的 id,必选
 *   domId        // String,<video> 标签的 id,可选,如果传了就把视频绑定到对应的 <video> 标签上
 * }
 * @return Promise | void,可从 Promise 中获取 src,Promise.then((src) => {})
 */

var initPullFlow$4 = function initPullFlow(args) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      if (window.zby_isM1Type) {
        return;
      }

      return {
        sdk_type: RTC,
        videoSrc: rtcsdk.initPullFlow(args.streamId, args.domId, args.mute, args.renderId, args.notAutoPlay, args.audioOnly, args.needScale, args.scaleParams, args.streamType)
      };

    case ZEGO:
      return {
        sdk_type: ZEGO,
        videoSrc: zegosdk.initPullFlow(args.streamId, args.domId, args.mute, args.renderId, args.notAutoPlay, args.audioOnly)
      };

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return {
        sdk_type: window.zbyAVSDK_init_sdk_type,
        videoSrc: talrtcsdk.initPullFlow(args.streamId, args.domId, args.mute, args.renderId, args.notAutoPlay, args.audioOnly)
      };

    case TRTC:
      return {
        sdk_type: TRTC,
        videoSrc: trtcsdk.initPullFlow(args.streamId, args.domId, args.mute, args.renderId, args.notAutoPlay, args.audioOnly)
      };

    default:
      break;
  }
};
/**
 * @function 恢复拉指定的流
 * @param streamId:String 被拉取的流的 id,必选
 * @return Promise | void
 */

var startPullFlow = function startPullFlow(streamId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.play(streamId);

    case ZEGO:
      return zegosdk.playStream(streamId);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.startPlay(streamId);

    case TRTC:
      return trtcsdk.startPlay(streamId);

    default:
      break;
  }
};
/**
 * @function 暂停拉指定的流
 * @param streamId:String 被拉取的流的 id,必选
 * @param recovery:Boolean 是否回收播放器, 可选
 * @return Promise | void
 */

var stopPullFlow$1 = function stopPullFlow(streamId, recovery) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      if (window.zby_isM1Type) {
        return;
      }

      return rtcsdk.stop(streamId, recovery);

    case ZEGO:
      return zegosdk.stopPlayStream(streamId, recovery);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.stopPlay(streamId, recovery);

    case TRTC:
      return trtcsdk.stopPlay(streamId);

    default:
      break;
  }
};
/**
 * @function 暂停拉所有的流
 * @return Promise | void
 */

var stopAllPullFlow$1 = function stopAllPullFlow(streamId, recovery) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.stopAllPullFlow(streamId, recovery);

    case ZEGO:
      return zegosdk.stopAllPlayStream(streamId, recovery);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.stopPlayAll();

    case TRTC:
      return trtcsdk.stopPlayAll();

    default:
      break;
  }
};
/**
 * @function 销毁拉指定的流
 * @param streamId:String 被拉取的流的 id,必选
 * @return Promise | void
 */

var playDestroy$1 = function playDestroy(streamId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.playDestroy(streamId);

    case ZEGO:
      return zegosdk.stopPlayStream(streamId, true);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.stopPlay(streamId);

    case TRTC:
      return trtcsdk.stopPlay(streamId);

    default:
      break;
  }
};
/**
 * @function 切换播放流
 * @param streamId:String 需要停止流的 id,必选
 * @param toStreamId:String 被拉取的流的 id,必选
 * @param toDomId:String <video> 标签的 id,可选
 * @return Promise | void
 */

var changePullFlow$3 = function changePullFlow(args) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.changePullFlow(args.streamId, args.toStreamId, args.toDomId);

    case ZEGO:
      return zegosdk.changePullFlow(args.streamId, args.toStreamId, args.toDomId);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.changePullFlow(args.streamId, args.toStreamId, args.toDomId);

    case TRTC:
    default:
      break;
  }
};
/**
 * @function 获取本地扬声器列表
 * @return Promise | void
 */

var getSpeakerDeviceList$3 = async function getSpeakerDeviceList() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return await rtcsdk.getSpeakerDevice();

    case ZEGO:
      return await zegosdk.getSpeakerDeviceList();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.getSpeakerDeviceList();

    case TRTC:
      return await trtcsdk.getSpeakerDeviceListTrtc();

    default:
      return await zegosdk.getSpeakerDeviceList();
      break;
  }
};
/**
 * @function 指定扬声器
 * @param deviceId:String 扬声器设备 id,必选
 * @return Promise | void
 */

var setSpeakerDevice$4 = async function setSpeakerDevice(deviceId, operationType) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return await rtcsdk.setSpeakerDevice({
        speakId: deviceId,
        operationType: operationType
      });

    case ZEGO:
      return await zegosdk.setSpeakerDevice({
        deviceId: deviceId,
        operationType: operationType
      });

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.setSpeakerDevice({
        deviceId: deviceId
      });

    case TRTC:
      return await trtcsdk.setSpeakerDevice({
        deviceId: deviceId
      });

    default:
      break;
  }
};
var getSpeakerDevice$1 = async function getSpeakerDevice() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.getCurrentSpeakerDevice();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.getCurrentSpeakerDevice();

    default:
      return null;
  }
};
/**
 * @function 获取扬声器音量
 * @return Promise | void
 */

var getSpeakerVolume$1 = async function getSpeakerVolume() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return JSON.parse((await rtcsdk.getSpeakerVolume()).msg).volume;

    case ZEGO:
      return JSON.parse((await zegosdk.getSpeakerDeviceVolume()).msg).ret;

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.getCurrentSpeakerVolume();

    case TRTC:
      return JSON.parse((await trtcsdk.getCurrentSpeakerVolume()).msg).speakerVolume;

    default:
      break;
  }
};
/**
 * @function 设置扬声器音量
 * @param volume:Number 扬声器音量,必选,范围 [0, 100]
 * @return Promise | void
 */

var setSpeakerVolume$1 = function setSpeakerVolume(volume) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setSpeakerVolume(volume);

    case ZEGO:
      return zegosdk.setSpeakerDeviceVolume(volume);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setCurrentSpeakerVolume(volume);

    case TRTC:
      return trtcsdk.setCurrentSpeakerVolume(volume);

    default:
      break;
  }
};
/**
 * @function 控制扬声器是否静音
 * @param mute:Boolean 是否静音,必选
 * @return Promise | void
 */

var setSpeakerMute$1 = function setSpeakerMute(mute) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setSpeakerMute(mute);

    case ZEGO:
      return zegosdk.setSpeakerDeviceMute(mute);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setSpeakerDeviceMute(mute);

    case TRTC:
    default:
      break;
  }
};
/**
 * @function 获取 App 应用音量
 * @return Promise | void
 */

var getAppVolume = function getAppVolume() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.getCurrentAppSessionVolume();

    case ZEGO:
      return zegosdk.getSpeakerSimpleVolume();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.getSpeakerSimpleVolume();

    case TRTC:
    default:
      break;
  }
};
/**
 * @function 设置 App 应用音量
 * @param volume:Number App 音量,必选,范围 [0, 100]
 * @return Promise | void
 */

var setAppVolume = function setAppVolume(volume) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setCurrentAppSessionVolume(volume);

    case ZEGO:
      return zegosdk.setSpeakerSimpleVolume(volume);
    // 由于 Agora 的 App 音量取值范围是 [0, 255],所以需要做比例兼容
    // volume = Math.floor((volume / 100) * 255);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setSpeakerSimpleVolume(volume);

    case TRTC:
    default:
      break;
  }
};
/**
 * @function 设置 App 静音
 * @param mute:Boolean 是否静音,必选
 * @return Promise | void
 */

var setAppMute = function setAppMute(mute) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setApplicationMute(mute);

    case ZEGO:
      return zegosdk.setSpeakerSimpleMute(mute);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setSpeakerSimpleMute(mute);

    case TRTC:
    default:
      break;
  }
};
/**
 * @function 获取麦克风列表
 * @return Promise | void
 */

var getMicrophoneDeviceList$3 = async function getMicrophoneDeviceList() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return await rtcsdk.getMicrophoneDevice();

    case ZEGO:
      return await zegosdk.getMicrophoneDeviceList();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.getMicrophoneDeviceList();

    case TRTC:
      return await trtcsdk.getMicrophoneDeviceListTrtc();

    default:
      return await zegosdk.getMicrophoneDeviceList();
      break;
  }
};
/**
 * @function 指定麦克风
 * @param deviceId:String 麦克风 id,必须
 * @return Promise | void
 */

var setMicrophoneDevice$4 = async function setMicrophoneDevice(deviceId, operationType) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return await rtcsdk.setMicrophoneDevice({
        deviceId: deviceId,
        operationType: operationType
      });

    case ZEGO:
      return await zegosdk.setMicrophoneDevice({
        deviceId: deviceId,
        operationType: operationType
      });

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.setMicrophoneDevice({
        deviceId: deviceId,
        operationType: operationType
      });

    case TRTC:
      return await trtcsdk.setMicrophoneDevice({
        deviceId: deviceId
      });

    default:
      break;
  }
};
/**
 * @function 开麦/禁麦
 * @param operation:Boolean 操作类型,false -> 关闭,true -> 打开,必选
 * @return Promise | void
 */

var openOrCloseMicrophone$2 = async function openOrCloseMicrophone(operation) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return await rtcsdk.setRealTimeAudioMute(!operation);

    case ZEGO:
      return await zegosdk.enableMic(operation);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.openOrCloseMicrophone(operation);

    case TRTC:
      return await trtcsdk.openOrCloseMicrophone(operation);

    default:
      break;
  }
};
/**
 * @function 获取麦克风音量
 * @return Promise | void
 */

var getMicrophoneVolume$1 = function getMicrophoneVolume() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.getMicrophoneVolume();

    case ZEGO:
      return zegosdk.getMicDeviceVolume();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.getCurrentMicrophoneVolume();

    case TRTC:
      return trtcsdk.getCurrentMicrophoneVolume();

    default:
      break;
  }
};
/**
 * @function 设置麦克风音量
 * @param volume:Number App 音量,必选,范围 [0, 100]
 * @param mute:Boolean 是否静音
 * @return Promise | void
 */

var setMicrophoneVolume$1 = function setMicrophoneVolume(volume, mute) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setMicrophoneVolume(volume, mute);

    case ZEGO:
      return zegosdk.setMicDeviceVolume(volume);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setCurrentMicrophoneVolume(volume);

    case TRTC:
      return trtcsdk.setCurrentMicrophoneVolume(volume);

    default:
      break;
  }
};
/**
 * @function 控制麦克风是否静音
 * @param mute:Boolean 是否静音,必选
 * @return Promise | void
 */

var setMicrophoneMute = function setMicrophoneMute(mute) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setRealTimeAudioMute(mute);

    case ZEGO:
      return zegosdk.setMicDeviceMute(mute);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.muteLocalAudio(mute);

    case TRTC:
    default:
      break;
  }
};
/**
 * @function 切换云控时退出房间、退出频道
 * @return Promise | void
 */

var leaveRoomWithChangeSDK$1 = function leaveRoomWithChangeSDK() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.leaveRoom();

    case ZEGO:
      return zegosdk.leaveRoomWithChangeSDK();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.leaveRoom();

    case TRTC:
      return trtcsdk.leaveRoom();

    default:
      break;
  }
};
/**
 * @function 退出房间、退出频道
 * @return Promise | void
 */

var leaveRoom$4 = function leaveRoom(type) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.leaveRoom();

    case ZEGO:
      return zegosdk.leaveRoom(type);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.leaveRoom();

    case TRTC:
      return trtcsdk.leaveRoom();

    default:
      break;
  }
};
/**
 * @function 反初始化
 * @return Promise | void
 */

var deinit = function deinit() {
  window.zbyAVSDK_init_sdk_type = localStorage.getItem('zbyAVSDK_init_sdk_type');

  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.destroyEngine();

    case ZEGO:
      return zegosdk.destroyEngine();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.destroyEngine();

    default:
      console.error('unknown zbyAVSDK_init_sdk_type:', zbyAVSDK_init_sdk_type);
      break;
  }
}; //开启拉流音量监听

var startSoundLevelMonitor$1 = function startSoundLevelMonitor() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.startSoundLevelMonitor();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // TODO StartMicrophone 里面有调用 enableAudioVolumeIndication 但目前是注释掉的状态
      break;

    default:
      break;
  }
};
/**
 * @function 转推,录课
 * @param type:String 动作类型,必选,'start' | 'stop' | 'pause' | 'resume'
 * @return Promise | void
 */

var turnPush = function turnPush(type) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.sendRecordingMsg({
        cmd: type
      });

    case ZEGO:
      return zegosdk.singleRecord(type);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.controlCdnStreaming(type);

    case TRTC:
    default:
      break;
  }
};
/**
 * @function 听不听指定的用户的声音
 * @param streamId:String 被拉取的流的 id,必选
 * @param mute:Boolean 是否静音,必选,true -> 静音,false -> 不静音
 * @return Promise | void
 */

var setAudioMute = function setAudioMute(streamId, mute) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setMute(streamId, mute);

    case ZEGO:
      return zegosdk.activateAudioPlayStream(streamId, !mute);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.muteRemoteAudio(streamId, mute);

    case TRTC:
      return trtcsdk.muteRemoteAudio(streamId, mute);

    default:
      break;
  }
};
/**
 * @function 是否拉取音频流-是否关闭音频流--通过播放器id控制
 * @param operation:Boolean,必选,true关闭 | false不关闭
 * @param playerId:Number,必选, 播放器id
 * @return Promise | void
 */

var pullAudioFlow$4 = function pullAudioFlow(playerId, operation, streamId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.pullAudioFlow(playerId, operation, 'client', streamId);

    case ZEGO:
      return zegosdk.pullAudioFlow(playerId, !operation, streamId);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.pullAudioFlow(playerId, operation, streamId);

    case TRTC:
      return trtcsdk.pullAudioFlow(playerId, operation, streamId);

    default:
      break;
  }
};
/**
  * @function 获取设备状态
  * * @param { string  } devicename //(设备名称,可为空)
  * * @param { number } devicetype //(设备类型,1摄像头,2麦克风),3扬声器(mac端没有)
  * @return: Promise
*/
// export const getDeviceState = (devicename, devicetype) => {
//   switch (window.zbyAVSDK_init_sdk_type) {
//   case RTC:
//     return rtcsdk.getDeviceState(devicename, devicetype);
//   case ZEGO:
//     return zegosdk.getDeviceState(devicename, devicetype);
//   default:
//     break;
//   }
// };

/**
 * @function 看不看指定的用户的画面
 * @param streamId:String 被拉取的流的 id,必选
 * @param mute:Boolean 是否关闭画面,必选,true -> 关闭画面,false -> 不关闭画面
 * @return Promise | void
 */

var setVideoMute = function setVideoMute(streamId, mute) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.controlPullAudioOnly(streamId, mute);

    case ZEGO:
      return zegosdk.activateVideoPlayStream(streamId, !mute);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.muteRemoteVideo(streamId, mute);

    case TRTC:
      return trtcsdk.muteRemoteVideo(streamId, mute);

    default:
      break;
  }
};
/**
 * @function 开启/关闭麦克风音量回调
 * @param open:Boolean true -> 开启,false -> 关闭,必选
 * @return void
 */

var openMicVolumeCb$2 = function openMicVolumeCb(open) {
  rtcsdk.openMicVolumeCb(open);
  zegosdk.openMicVolumeCb(open);
};
var startMixtStream = function startMixtStream(args) {
  var params = {};

  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      var config = args.config;
      params = {
        sequence: args.sequence,
        outputStream: {
          pushType: args.pushType,
          rtmpUrls: config.szOutputStream,
          videoFps: config.nOutputFps,
          videoRate: config.nOutputBitrate,
          audioRate: config.nOutputAudioBitrate,
          videoWidth: config.nOutputWidth,
          videoHeight: config.nOutputHeight,
          audioFormat: config.nOutputAudioConfig,
          audioChannels: config.nChannels,
          backgroundColor: config.nOutputBackgroundColor
        },
        inputStreams: []
      };
      config.pInputStreamList.forEach(function (item) {
        params.inputStreams.push({
          confId: item.confId,
          streamId: item.szStreamID,
          top: item.layout.top,
          right: item.layout.right,
          bottom: item.layout.bottom,
          left: item.layout.left,
          mediaControl: item.nContentControl
        });
      });
      console.log(params);
      rtcsdk.startRoomMixRecord(params);
      break;

    case ZEGO:
      params = Object.assign(args, {});
      delete params.pushType;
      delete params.sequence;
      params.config.pInputStreamList = params.config.pInputStreamList.map(function (item) {
        var tempObj = Object.assign(item, {});
        delete tempObj.confId;
        return tempObj;
      });
      zegosdk.mixStream('start', params);
      break;

    default:
      break;
  }
};
var stopMixtStream = function stopMixtStream(args) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      rtcsdk.stopRoomMixRecord({
        sequence: args.sequence
      });
      break;

    case ZEGO:
      var params = Object.assign(args, {});
      delete params.sequence;
      zegosdk.mixStream('stop', params);
      break;

    default:
      break;
  }
};
/**
 * @function 单路录制
 * @param args:Object 必选
 * {
 *   type:String 开始/结束, 对应取值start/stop,必选
 *   groupId: String 分组id,可选,默认为 sdk初始化分组id
 *   streamId: String 流id,必选
 *   seqNum: String
 * }
 * @return void
 */

var singleRecord$1 = async function singleRecord(args) {
  var type = args.type,
      groupId = args.groupId,
      streamId = args.streamId,
      userId = args.userId,
      seqNum = args.seqNum;
  var sid = "xrs51_".concat(groupId, "_").concat(userId);

  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      var institutionId = window.zby_sdk_init_params.institutionId;
      var rtc = window.zbyAVSDK_init_params.rtc;
      var rtmpAddr = "".concat(rtc.recordUrl, "/").concat(sid);

      if (seqNum) {
        rtmpAddr += "?seqNum=".concat(seqNum);
      }

      var rtcParams = {
        cmd: type,
        confId: util.getConfId(institutionId, groupId),
        liveId: streamId,
        rtmpAddr: rtmpAddr
      };
      return rtcsdk.sendRecordingMsg(rtcParams);

    case ZEGO:
      var zego = window.zbyAVSDK_init_params.zego;
      var strTarget = "".concat(zego.recordUrl, "/").concat(sid);

      if (seqNum) {
        strTarget += "?seqNum=".concat(seqNum);
      }

      return zegosdk.singleRecord(type, strTarget, streamId);
      break;

    default:
      break;
  }
};
/**
 * @function 单路录制
 * @param args:Object 必选
 * {
 *   type:String 开始/结束, 对应取值start/stop,必选
 *   groupId: String 分组id,可选,默认为 sdk初始化分组id
 *   streamId: String 流id,必选
 * }
 * @return void
 */

var recordPublishTarget = function recordPublishTarget(args) {
  var type = args.type,
      groupId = args.groupId,
      streamId = args.streamId,
      userId = args.userId;
  var sid = "xrs51_".concat(groupId, "_").concat(userId);

  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      var institutionId = window.zby_sdk_init_params.institutionId;
      var rtc = window.zbyAVSDK_init_params.rtc;
      var rtcParams = {
        cmd: type,
        confId: util.getConfId(institutionId, groupId),
        liveId: streamId,
        rtmpAddr: "rtmp://globalpush.aliyun.zhiboyun.eaydu.com/live_haibian/".concat(streamId)
      };
      return rtcsdk.sendRecordingMsg(rtcParams);

    case ZEGO:
      var zego = window.zbyAVSDK_init_params.zego;
      var strTarget = "rtmp://globalpush.aliyun.zhiboyun.eaydu.com/live_haibian/".concat(streamId);
      zegosdk.singleRecord(type, strTarget, streamId);
      break;

    default:
      break;
  }
};
var getSnapshootId = function getSnapshootId(streamId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      if (rtcsdk.hasStream(streamId)) {
        return streamId;
      } else {
        defaultApi$1.writeLog("zbyavsdk getSnapshootId , no streamId: ".concat(streamId, " in rtc room"));
      }

      break;

    case ZEGO:
      if (zegosdk.hasStream(streamId)) {
        return zegosdk.getChannelIndex(streamId);
      } else {
        defaultApi$1.writeLog("zbyavsdk getSnapshootId , no streamId: ".concat(streamId, " in zego room"));
      }

      break;

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      if (talrtcsdk.hasStream(streamId)) {
        return talrtcsdk.getChannelIndex(streamId);
      } else {
        defaultApi$1.writeLog("talrtcsdk getSnapshootId , no streamId: ".concat(streamId, " in talrtc room"));
      }

    default:
      break;
  }
};
var getAllChannelIndex$3 = function getAllChannelIndex() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.getAllChannelIndex();

    case TRTC:
      return trtcsdk.getAllChannelIndex();

    default:
      break;
  }
};
/**
 * @function 设置摄像头参数(采集分辨率)
 * @param width:Number 分辨率宽,必选,推荐 1280
 * @param height:Number 分辨率高,必选,推荐 720
 * @param frameRate:Number 帧率,必选,推荐 15
 * @return Promise | void
 */

var setCameraParams = function setCameraParams(args, idx, streamId) {
  var width = args.width,
      height = args.height,
      frameRate = args.frameRate;

  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setCameraParam(width, height, frameRate);

    case ZEGO:
      return zegosdk.setCameraParam(width, height, idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setCameraCaptureResolution(width, height, streamId);

    case TRTC:
      return trtcsdk.setCameraCaptureResolution(width, height);

    default:
      break;
  }
};
/**
 * @function 设置编码分辨率
 * @param width:Number 分辨率宽,必选,推荐 1280
 * @param height:Number 分辨率高,必选,推荐 720
 * @param frameRate:Number 帧率,必选,推荐 15
 * @return Promise | void
 */

var setEncodeParams = function setEncodeParams(args, idx, streamId) {
  var width = args.width,
      height = args.height,
      frameRate = args.frameRate;

  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setEncodeParam(width, height, frameRate);

    case ZEGO:
      return zegosdk.setVideoEncodeResolution(width, height, idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setCameraEncodeFps(frameRate, streamId) && talrtcsdk.setCameraEncodeResolution(width, height, streamId);

    case TRTC:
      return zegosdk.setVideoEncodeResolution(width, height);

    default:
      break;
  }
};
/**
 * @function 设置码率
 * @param bitrate:Number 码率,必选,推荐 15
 * @return Promise | void
 */

var setBitRate$1 = function setBitRate(bitrate, idx, streamId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setBitRate(bitrate);

    case ZEGO:
      return zegosdk.setVideoBitrate(bitrate, idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setCameraEncodeBitrate(bitrate, streamId);

    case TRTC:
      return trtcsdk.setCameraEncodeBiarate(bitrate);

    default:
      break;
  }
};
/**
 * @function 本地视频录制
 * @param type 开始/结束
 * @param path 录制路径
 * @return Promise | void
 */

var localRecordVideo$2 = function localRecordVideo(type, path) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      rtcsdk.localRecordVideo(type, path);
      break;

    case ZEGO:
      zegosdk.localRecordVideo(type, path);
      break;

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      talrtcsdk.localRecordVideo(type, path);
      break;

    default:
      break;
  }
};
/**
 * @function 本地音频录制
 * @param type 开始/结束
 * @param path 录制路径
 * @return Promise | void
 */

var localRecordAudio$2 = function localRecordAudio(type, path) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      rtcsdk.localRecordAudio(type, path);
      break;

    case ZEGO:
      zegosdk.localRecordAudio(type, path);
      break;

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
var getDesktopPath$1 = function getDesktopPath() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.getDesktopPath();

    case TALRTC:
    case NERTC:
    case VOLCRTC: // return talrtcsdk.getDesktopPath();

    default:
      return zegosdk.getDesktopPath();
  }
};
/**
 * @function 本地录制
 * @param {string | undefined} fileName 
 * @param {number} fileType 1:flv 2:mp4
 * @param {number} idx 0:主流 1:辅流 2:RTMP流
 * @returns {Promise<any>}
 */

var startCaptureRecord$1 = function startCaptureRecord(fileName, fileType, idx, path) {
  if (idx === 2) {
    defaultApi$1.writeLog("zbyAVSDK startCaptureRecord idx: ".concat(idx, ", use zego sdk"));
    return zegosdk.startCaptureRecord(fileName, fileType, idx, path);
  }

  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.startCaptureRecord(fileName, fileType, idx, path);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.startRecord(fileName, fileType, idx, path);

    default:
      break;
  }
};
/**
 * 结束外部音频采集(通知sdk)
 * @param {number} idx 0 | 1 | 2
 * @returns 
 */

var stopCaptureRecord$1 = function stopCaptureRecord(idx) {
  if (idx === 2) {
    defaultApi$1.writeLog("zbyAVSDK stopCaptureRecord idx: ".concat(idx, ", use zego sdk"));
    return zegosdk.stopCaptureRecord(idx);
  }

  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.stopCaptureRecord(idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.stopRecord(idx);

    default:
      break;
  }
};
/**
 * @function 设置采集扬声器声音
 * @param { string }  deviceId 设备id
 * @param {boolean} speaker 采集扬声器声音=true/不采集=false
 * @return void
 */

var setSpeakerCapture = function setSpeakerCapture(deviceId, speaker) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setAudioSpeakerCapture(deviceId, speaker);

    case ZEGO:
      return zegosdk.setAudioSpeakerCapture(speaker);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.enableAudioSpeakerCapture(speaker);

    case TRTC:
      return trtcsdk.setAudioSpeakerCapture(speaker);

    default:
      break;
  }
};
/**
  * @function 设置混流和背景色
  * @param { boolean }  type  true=开启/false=关闭
  * @param { number } id 需要混合的采集器id
  * @param { object } rgb
  * @param { number } rgb.r
  * @param { number } rgb.g
  * @param { number } rgb.b
  * @return: Promise
  */

var setMixStream$1 = function setMixStream(type, id, rgb) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setMixStream(type, id, rgb);

    case ZEGO:
      break;

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }

  ;
};
/**
  * @function 采集器截图
  * @param { string } fileName 文件名,需要后缀名。例如:333.jpg
  * @return: Promise
  */

var captureSnapShot$1 = function captureSnapShot(fileName) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.captureSnapShot(fileName);

    case ZEGO:
      break;

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
/**
  * @function 播放器截图
  * @param { string } fileName 文件名,需要后缀名。例如:333.jpg
  * @return: Promise
  */

var playerSnapShot$1 = function playerSnapShot(id, fileName) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.playerSnapShot(id, fileName);

    case ZEGO:
      break;

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
/**
  * @function 设置打开/关闭摄像头
  * @param { boolean }  type  true=开启/false=关闭
  * @return: Promise
  */

var openOrCloseCameraAndMicrophone$1 = function openOrCloseCameraAndMicrophone(type) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.openOrCloseCameraAndMicrophone(type);

    case ZEGO:
      break;

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
/**
   * @function 加载采集插件的输入数据  //调用后,zego 可以向采集插件传送摄像头数据,用于拼接
   * @return: Promise
   */

var loadCollectionInputEntry$3 = function loadCollectionInputEntry() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.loadCollectionInputEntry();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
/**
 * @function 加载采集插件的输出数据  //调用后,采集插件向zego传送数据
 * @return: Promise
 */

var loadCollectionOutputEntry$2 = function loadCollectionOutputEntry() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.loadCollectionOutputEntry();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
var mixedstuVideo = function mixedstuVideo(stuArray) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.rtcLoadCollectionEntry2(stuArray);

    case ZEGO:
      return zegosdk.loadCollectionInputEntry2(stuArray);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.loadCollectionInputEntry2(stuArray);

    default:
      break;
  }
};
/**
 * @function 加载采集插件的输出数据  //调用后,zego 可以向采集插件传送摄像头数据,用于拼接
 * @return: Promise
 */

var setCDNPublishTarget$1 = function setCDNPublishTarget(pRtmpUrl, idx) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return rtcsdk.setCDNPublishTarget(pRtmpUrl, idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.addPublishRtmpStreamUrl(pRtmpUrl);

    default:
      break;
  }
};
/**
  * @function 设置预览镜像状态
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
  */

var setMirrorStatus$3 = function setMirrorStatus(type) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setMirrorStatus(type);

    case ZEGO:
      return zegosdk.setMirrorStatus(type);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setMirrorStatus(type);

    default:
      break;
  }
};
/**
  * @function 设置拉流镜像状态
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
  */

var setPlayViewMirror$2 = function setPlayViewMirror(type, id) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setRTCPlayViewMirror(type, id);

    case ZEGO:
      return zegosdk.setPlayViewMirror(type);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setPlayViewMirror(type, id);

    default:
      break;
  }
};
/**
  * @function 设置推流镜像状态
  * * @param { boolean } id 采集器Id
  * @param { boolean } mode 1=开启 0=关闭
  * @return: Promise
  */

var setPushViewMirror = function setPushViewMirror(mode) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setMirrorMode(mode);

    case ZEGO:
      return zegosdk.setVideoMirrorMode(mode);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setMirrorStatus(mode);

    default:
      break;
  }
};
/**
  * @function 开启美颜
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
  */

var startSenseMe$2 = function startSenseMe() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.startSenseMe();

    case ZEGO:
      return zegosdk.startSenseMe();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
/**
  * @function 设置美颜参数
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
  */

var setBeautifyParam$3 = function setBeautifyParam(type, value) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.setBeautifyParam(type, value);

    case ZEGO:
      return zegosdk.setBeautifyParam(type, value);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
/**
  * @function 关闭美颜
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
*/

var endSenseMe$2 = function endSenseMe() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.endSenseMe();

    case ZEGO:
      return zegosdk.endSenseMe();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
/**
  * @function 40路混音
  * @param { number } mixMode //混流模式 0=关闭混流  1=开启混流
  * @param { array } streamIdArr //表示要突出声音的channel
  * @return: Promise
*/

var setAudioMixMode$2 = function setAudioMixMode(mixMode, streamIdArr) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.setAudioMixMode(mixMode, streamIdArr);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setAudioMixMode(mixMode, streamIdArr);

    default:
      break;
  }
}; //获取第三方底层流媒体版本号

var getSDKVersion$3 = async function getSDKVersion() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.getSDKVersion();

    case ZEGO:
      return zegosdk.getSDKVersion();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.getSDKVersion();

    default:
      break;
  }
}; //获取第三方底层流媒体内核版本号

var getSDKCoreVersion$1 = async function getSDKCoreVersion() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return rtcsdk.getSDKVersion();

    case ZEGO:
      return zegosdk.getSDKVersion();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.getSDKCoreVersion();

    default:
      break;
  }
}; //获取摄像头所支持的分辨率

var getCameraSupportedResolution = async function getCameraSupportedResolution(deviceId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return await rtcsdk.getCameraSupportedRes(deviceId);

    case ZEGO:
      return await zegosdk.getCameraSupportedRes(deviceId);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return await talrtcsdk.getCameraResolution(deviceId);

    case TRTC:
      return await trtcsdk.getCameraResolution(deviceId);

    default:
      break;
  }
};
/**
  * @function 发送SEI
  * @return: Promise
*/

var sendMediaSideInfo$2 = function sendMediaSideInfo(info) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.sendMediaSideInfo(info);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.sendSEIMsg(info);

    case TRTC:
      return trtcsdk.sendSEIMsg(info);

    default:
      break;
  }
};
/**
  * @function 开启rtc同屏
  * @return: Promise
*/

var startMultiScreen$3 = function startMultiScreen() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.startMultiScreen();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.startMultiScreen();

    case TRTC:
      return trtcsdk.startMultiScreen();

    default:
      break;
  }
};
/**
  * @function 开启rtc同屏
  * @return: Promise
*/

var enableHighlight$1 = function enableHighlight(enable) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      break;

    case TRTC:
      return trtcsdk.enableHighlight(enable);

    default:
      break;
  }
};
/**
  * @function 开启音频外部采集
  * @return: Promise
  */

var startAudioExCapture$2 = function startAudioExCapture() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.startAudioExCapture(1);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      // FIXME METHOD_NOT_IMPLEMENT;
      break;

    default:
      break;
  }
};
/**
 * 第四路流类型设置
 * @param {number} type 6: 视频:主流 音频:麦克风+扬声器 7: 外部音频源,外部视频源,数据来源player
 * @returns 
 */

var setFourthStreamType$2 = function setFourthStreamType(type, idx, streamId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.setFourthStreamType(type, idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setFourthStreamType(type, streamId);

    default:
      break;
  }
};
var setVideoSource$1 = function setVideoSource(idx, type) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.setVideoSource(idx, type);

    case TALRTC:
    case NERTC:
    case VOLCRTC: // return talrtcsdk.setVideoSource(idx, type);

    default:
      break;
  }
};
/**
  * @function 设置辅路通道音频采集模式
  * @return: Promise
  */

var setAUXAudioType$1 = function setAUXAudioType(type) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.setAUXAudioType(type);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setAudioType(type);

    default:
      break;
  }
};
/**
  * @function 设置录制通道音频采集模式
  * @return: Promise
  */

var setThirdAudioType$1 = function setThirdAudioType(type, streamId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.setThirdAudioType(type);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setAudioType(type, streamId);

    default:
      break;
  }
};
/**
  * @function 设置录制通道音频采集模式
  * @return: Promise
  */

var setThirdAudioType2 = async function setThirdAudioType2(type) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.setThirdAudioType(type);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.enableRTCAudioMixMode(type === 32, type);

    default:
      break;
  }
};
/**
  * @function 判断推流类型
  * @return: Promise
  */

var getStreamType_zego = function getStreamType_zego() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      break;

    case ZEGO:
      return zegosdk.getStreamType();

    default:
      break;
  }
};
var enableBeautify$2 = function enableBeautify(enable, streamId, idx) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return;

    case ZEGO:
      return zegosdk.enableBeautify(enable, streamId, idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.enableBeautify(enable, streamId, idx);

    default:
      return zegosdk.enableBeautify(enable, streamId, idx);
  }
};
var setBeautifyParam2$1 = function setBeautifyParam2(mode, submode, value, streamId, idx, image) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case RTC:
      return;

    case ZEGO:
      return zegosdk.setBeautifyParam2(mode, submode, value, streamId, idx, image);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setBeautifyParam(mode, submode, value, streamId, image);

    default:
      return zegosdk.setBeautifyParam2(mode, submode, value, streamId, idx, image);
  }
};
var setEngineConfig$2 = function setEngineConfig(key, value) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.setEngineConfig(key, value);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.setEngineConfig(key, value);

    default:
      return zegosdk.setEngineConfig(key, value);
  }
};
var getMicrophoneLoudness$2 = function getMicrophoneLoudness() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.getMicrophoneLoudness();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.getMicrophoneLoudness();

    default:
      return zegosdk.getMicrophoneLoudness();
  }
};
var getCurrentSpeakerId$3 = function getCurrentSpeakerId() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.getCurrentSpeakerId();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.getCurrentSpeakerId();

    default:
      return zegosdk.getCurrentSpeakerId();
  }
};
var getCurrentMicrophoneId$3 = function getCurrentMicrophoneId() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.getCurrentMicrophoneId();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.getCurrentMicrophoneId();

    default:
      return zegosdk.getCurrentMicrophoneId();
  }
};
var getCurrentCameraId$2 = function getCurrentCameraId() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.getCurrentCameraId();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.getCurrentCameraId();

    default:
      return zegosdk.getCurrentCameraId();
  }
};
var takeLocalSnapShot$2 = function takeLocalSnapShot(streamId, idx) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.takeLocalSnapShot(streamId, idx);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.takeLocalSnapShot(streamId, idx);

    default:
      return zegosdk.takeLocalSnapShot(streamId, idx);
  }
};
var takeRemoteSnapShot$2 = function takeRemoteSnapShot(streamId) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.takeRemoteSnapShot(streamId);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.takeRemoteSnapShot(streamId);

    default:
      return zegosdk.takeRemoteSnapShot(streamId);
  }
};
var startAigc$2 = function startAigc(config) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.startAigc(config);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.startAigc(config);

    default:
      return zegosdk.startAigc(config);
  }
};
var stopAigc$2 = function stopAigc() {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.stopAigc();

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.stopAigc();

    default:
      return zegosdk.stopAigc();
  }
};
var sendAigcMessage$2 = function sendAigcMessage(messageInfo) {
  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.sendAigcMessage(messageInfo);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.sendAigcMessage(messageInfo);

    default:
      return zegosdk.sendAigcMessage(messageInfo);
  }
};
/**
 * @function 开关麦克风录制数据回调
 * @param {boolean} enable 是否开启回调,默认false
 * @param {number} sampleRate 采样率,默认 48000
 * 目前可以是: 8000, 16000, 32000, 44100, or 48000.
 * @param {number} channels 声道数,默认 1
 */

var enableMicRecordDataCallback$2 = function enableMicRecordDataCallback() {
  var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  var sampleRate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 48000;
  var channels = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;

  switch (window.zbyAVSDK_init_sdk_type) {
    case ZEGO:
      return zegosdk.enableMicRecordDataCallback(enable, sampleRate, channels);

    case TALRTC:
    case NERTC:
    case VOLCRTC:
      return talrtcsdk.enableMicRecordDataCallback(enable, sampleRate, channels);

    case RTC:
    case TRTC:
    default:
      defaultApi$1.writeLog('avsdk enableMicRecordDataCallback not supported for current sdk');
      return Promise.resolve();
  }
};

var setThirdAudioCallbackType = function setThirdAudioCallbackType(sdkType) {
  var type = sdkVale[sdkType];
  return zegosdk.setThirdAudioType(type);
};

var zbyAVSDK = {
  init: init$4,
  recoverSdk: recoverSdk$1,
  deviceCheckerInit: deviceCheckerInit,
  stopCheckDevice: stopCheckDevice$2,
  changeSDK: changeSDK,
  unloadExtension: unloadExtension,
  setVideoCallback: setVideoCallback$2,
  startPushFlow: startPushFlow,
  stopPushFlow: stopPushFlow,
  initPullFlow: initPullFlow$4,
  startPullFlow: startPullFlow,
  stopPullFlow: stopPullFlow$1,
  stopAllPullFlow: stopAllPullFlow$1,
  playDestroy: playDestroy$1,
  changePullFlow: changePullFlow$3,
  getCameraDeviceList: getCameraDeviceList$2,
  setCameraDevice: setCameraDevice$2,
  openOrCloseCamera: openOrCloseCamera$3,
  startPreview: startPreview$3,
  stopPreview: stopPreview$3,
  getOrLocateVideo: getOrLocateVideo,
  getSpeakerDeviceList: getSpeakerDeviceList$3,
  setSpeakerDevice: setSpeakerDevice$4,
  getSpeakerDevice: getSpeakerDevice$1,
  getSpeakerVolume: getSpeakerVolume$1,
  setSpeakerVolume: setSpeakerVolume$1,
  setSpeakerMute: setSpeakerMute$1,
  getAppVolume: getAppVolume,
  setAppVolume: setAppVolume,
  setAppMute: setAppMute,
  getMicrophoneDeviceList: getMicrophoneDeviceList$3,
  setMicrophoneDevice: setMicrophoneDevice$4,
  openOrCloseMicrophone: openOrCloseMicrophone$2,
  getMicrophoneVolume: getMicrophoneVolume$1,
  setMicrophoneVolume: setMicrophoneVolume$1,
  setMicrophoneMute: setMicrophoneMute,
  leaveRoomWithChangeSDK: leaveRoomWithChangeSDK$1,
  leaveRoom: leaveRoom$4,
  turnPush: turnPush,
  setAudioMute: setAudioMute,
  pullAudioFlow: pullAudioFlow$4,
  setVideoMute: setVideoMute,
  openMicVolumeCb: openMicVolumeCb$2,
  startMixtStream: startMixtStream,
  stopMixtStream: stopMixtStream,
  singleRecord: singleRecord$1,
  getSnapshootId: getSnapshootId,
  setCameraParams: setCameraParams,
  setEncodeParams: setEncodeParams,
  setBitRate: setBitRate$1,
  recordPublishTarget: recordPublishTarget,
  localRecordVideo: localRecordVideo$2,
  localRecordAudio: localRecordAudio$2,
  getDesktopPath: getDesktopPath$1,
  startCaptureRecord: startCaptureRecord$1,
  stopCaptureRecord: stopCaptureRecord$1,
  teacherStartLinkMic: teacherStartLinkMic$4,
  teacherStopLinkMic: teacherStopLinkMic$4,
  setSpeakerCapture: setSpeakerCapture,
  setMixStream: setMixStream$1,
  captureSnapShot: captureSnapShot$1,
  playerSnapShot: playerSnapShot$1,
  openOrCloseCameraAndMicrophone: openOrCloseCameraAndMicrophone$1,
  setMirrorStatus: setMirrorStatus$3,
  getStreamType_zego: getStreamType_zego,
  startSenseMe: startSenseMe$2,
  setBeautifyParam: setBeautifyParam$3,
  endSenseMe: endSenseMe$2,
  setPlayViewMirror: setPlayViewMirror$2,
  setPushStreamVideo: setPushStreamVideo,
  getSDKVersion: getSDKVersion$3,
  getSDKCoreVersion: getSDKCoreVersion$1,
  getCameraSupportedResolution: getCameraSupportedResolution,
  setAudioMixMode: setAudioMixMode$2,
  setPushViewMirror: setPushViewMirror,
  deinit: deinit,
  startMultiScreen: startMultiScreen$3,
  getAllChannelIndex: getAllChannelIndex$3,
  startAudioExCapture: startAudioExCapture$2,
  setFourthStreamType: setFourthStreamType$2,
  startSoundLevelMonitor: startSoundLevelMonitor$1,
  sendMediaSideInfo: sendMediaSideInfo$2,
  enableHighlight: enableHighlight$1,
  setVideoSource: setVideoSource$1,
  setAUXAudioType: setAUXAudioType$1,
  setThirdAudioType: setThirdAudioType$1,
  setThirdAudioType2: setThirdAudioType2,
  mixedstuVideo: mixedstuVideo,
  setThirdAudioCallbackType: setThirdAudioCallbackType,
  enableBeautify: enableBeautify$2,
  setBeautifyParam2: setBeautifyParam2$1,
  setEngineConfig: setEngineConfig$2,
  setWaterMark: setWaterMark$2,
  getMicrophoneLoudness: getMicrophoneLoudness$2,
  getCurrentSpeakerId: getCurrentSpeakerId$3,
  getCurrentMicrophoneId: getCurrentMicrophoneId$3,
  getCurrentCameraId: getCurrentCameraId$2,
  takeLocalSnapShot: takeLocalSnapShot$2,
  takeRemoteSnapShot: takeRemoteSnapShot$2,
  startAigc: startAigc$2,
  stopAigc: stopAigc$2,
  sendAigcMessage: sendAigcMessage$2,
  enableMicRecordDataCallback: enableMicRecordDataCallback$2,
  setPushAudioMute: setPushAudioMute // getDeviceState

};

var devicesMap = new Map([[1, 'video'], [2, 'audio'], [3, 'video_and_audio'], [4, 'screen'], [5, 'ScreenAndVideo'], [6, 'ScreenAndAudio'], [8, 'loudSpeaker'], [99, 'max']]); // status      : Number 设备状态 1开启 2关闭 3未找到

var devicesStatusMap = new Map([[0, 'none'], [1, 'open'], [2, 'closed'], [3, 'unfound'], //未找到设备
[4, 'error'], //异常
[5, 'unauthorized'], //未授权
[6, 'background'], //iOS 设备进入后台,设备摄像头被关闭,麦克风正常
[7, 'max'] //超出0-max范围的状态值都属于异常
]);
var logMap = {
  debug: 0,
  info: 1,
  warnning: 2,
  error: 3,
  critical: 4
};
var roleMap = new Map([[1, 'teacher'], [2, 'student'], [3, 'assistant'], [4, 'parent']]);
var getDeviceTypeKey = function getDeviceTypeKey(value) {
  return util.getMapKeyByValue(devicesMap, value);
};
var getDeviceStatusKey = function getDeviceStatusKey(value) {
  return util.getMapKeyByValue(devicesStatusMap, value);
};
var dict = {
  getDeviceStatusKey: getDeviceStatusKey,
  getDeviceTypeKey: getDeviceTypeKey,
  logMap: logMap,
  devicesMap: devicesMap,
  devicesStatusMap: devicesStatusMap,
  roleMap: roleMap
};

var currentTimeString = function currentTimeString() {
  var timeString = '[' + ('' + new Date().getHours()).padStart(2, '0') + ':' + ('' + new Date().getMinutes()).padStart(2, '0') + ':' + ('' + new Date().getSeconds()).padStart(2, '0') + ':' + ('' + new Date().getMilliseconds()).padStart(3, '0') + ']';
  return timeString;
};

var callMethod$7 = function callMethod(name, args) {
  var extensionId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default_ext';

  // EM 是寄宿于端的,浏览器中并不存在,为防止报错需要先进行能力检测
  if (EM) {
    return new Promise(function (resolve, reject) {
      EM.CallMethod(extensionId, name, JSON.stringify(args), function (code, content) {
        //控制台weblog高优先级
        if (typeof window.zby_live_sdk_weblog !== 'undefined') {
          if (window.zby_live_sdk_weblog === true) {
            if (name === 'WriteLog' && code == 0) {
              console.log(currentTimeString() + "".concat(args.msg));
            } else {
              console.log("".concat(name, " :\n                    Time: ").concat(currentTimeString(), "\n                    Param: ").concat(args.msg, "\n                    Code: ").concat(code, "\n                    Message: ").concat(content));
            }
          }
        } else {
          //sdk默认输出weblog日志,除非明确禁用;初始化之前默认输出日志,初始化后根据参数规则
          // if (!window.zby_sdk_init_params || typeof window.zby_sdk_init_params.weblog === 'undefined' || (typeof window.zby_sdk_init_params.weblog !== 'undefined' && window.zby_sdk_init_params.weblog === true)) {
          if (config.weblog === true) {
            if (name === 'WriteLog' && code == 0) {
              console.log(currentTimeString() + "".concat(args.msg));
            } else {
              console.log("".concat(name, " :\n                      Time: ").concat(currentTimeString(), "\n                      Param: ").concat(args.msg, "\n                      Code: ").concat(code, "\n                      Message: ").concat(content));
            }
          }
        }

        resolve({
          code: code,
          content: content
        });
      });
    });
  }
};

var writeLog$1 = function writeLog() {
  var msgtype = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'info';
  var msgbody = arguments.length > 1 ? arguments[1] : undefined;
  var productName = arguments.length > 2 ? arguments[2] : undefined;
  msgbody = typeof msgbody === 'string' ? msgbody : JSON.stringify(msgbody);
  var args = {
    //日志级别,0:debug,1:info,2:warnning,3:error,4:critical
    'type': dict.logMap[msgtype],
    'msg': "--".concat(productName ? '[' + productName + ']--' : '', " ").concat(msgbody)
  };
  callMethod$7('WriteLog', args);
};

if (window.EM) {
  EM.Load('default_ext', extensionInfo.version.default_ext, true, function (ec, content) {
    writeLog$1('info', 'Load EC:' + ec + '\nContent:' + content);
  });
}

var bridge = {
  writeLog: writeLog$1
};

/* eslint-disable */
var ENTRY = {
  configInfoObj: null,
  //配置信息
  roomInfoObj: '',
  //房间信息
  enterMaxCount: 1,
  //尝试连接并进入房间的次数
  msgindex: 0,
  userid: '',
  role: '',
  logmode: 1,
  channeltype: 1,
  //0=有所有通道;1=仅有control通道;2=仅有chat通道
  istestFromhtml: 0,
  //是否是测试页
  //public 第一步 设置配置信息,含用户信息等
  setConfigInfo: function setConfigInfo(configstr) {
    // configstr = {"address":"http://fwef",
    // "user":{"userid":"123","username":"san","token":"fwe","role":"teacher","avatar":"http:\\fwe","code":"1234"},
    // "language":0,"logmode":0,"channeltype":0}
    try {
      this.recordLogToFile('info', 'channnel init params : ' + configstr);
      this.configInfoObj = JSON.parse(configstr);
      this.configInfoObj.encodetype = 'base64';

      if (this.configInfoObj) {
        this.configInfoObj.user.role = this.translateRole(this.configInfoObj.user.role);
        this.userid = this.configInfoObj.user.userid;
        this.role = this.configInfoObj.user.role;
        this.logmode = this.configInfoObj.logmode;
        var addresslenth = this.configInfoObj.address.length;

        if (addresslenth > 0) {
          if (this.configInfoObj.address[addresslenth - 1] != '\\' && this.configInfoObj.address[addresslenth - 1] != '/') {
            this.configInfoObj.address = this.configInfoObj.address + '/';
          }
        } else {
          this.recordLogToFile('error', 'server addrres is null');
        }

        if (this.configInfoObj.hasOwnProperty('channeltype')) {
          this.channeltype = this.configInfoObj.channeltype;
        }
      }
    } catch (e) {
      console.log(e);
    }
  },
  //public 第二步 进入教室
  enterRoom: function enterRoom(roominfo, dealChannelMsg) {
    // roominfo = {"roomid":"16","classmode":1,"playmode":1,"institutionid":545}
    //此处传入的是客户端定义的课程类型
    //0=无效模式;1=1对1模式;2=小组课模式;3=大班课模式;4=小班课模式,同小组课模式,只不过人数更多,最多20个;5=互动大班课
    //6=口令互动大班课;1000=励模式的互动大班课(TODO: 太特化了,后面看是否能一般化)
    try {
      this.initpara();
      this.msgindex = 0;
      ENTRY.recordLogToFile('info', "enter room info" + roominfo);
      this.roomInfoObj = JSON.parse(roominfo);

      if (this.channeltype == 2) {// w.CHAT.enterRoom();
      } else {
        CONTROL.enterRoom(dealChannelMsg);
      }
    } catch (e) {
      console.log(e);
    }
  },
  leaveRoom: function leaveRoom() {
    if (this.channeltype == 2) {
      if (w.CHAT) {
        w.CHAT.leaveRoom();
      }
    } else {
      CONTROL.leaveRoom();
    }
  },
  //public 获取配置信息
  getConfigInfo: function getConfigInfo() {
    return this.configInfoObj;
  },
  //public 获取房间信息
  getRoomInfo: function getRoomInfo() {
    return this.roomInfoObj;
  },
  //转换一下用户角色的定义 用户角色 "1=teacher"/"2=student"/"3=assistant"/"4=parent"
  translateRole: function translateRole(rolefore) {
    var role = this.configInfoObj.user.role;

    if (typeof rolefore == "string") {
      if (rolefore == 'teacher') {
        role = '1';
      } else if (rolefore == 'student') {
        role = '2';
      } else if (rolefore == 'assistant') {
        role = '3';
      } else if (rolefore == 'parent') {
        role = '4';
      }
    }

    return role;
  },
  //转换一下用户角色的定义 用户角色 "1=teacher"/"2=student"/"3=assistant"/"4=parent"
  translateRoleBack: function translateRoleBack(rolelocal) {
    if (typeof rolelocal == "string") {
      if (rolelocal == '1') {
        return 'teacher';
      } else if (rolelocal == '2') {
        return 'student';
      } else if (rolelocal == '3') {
        return 'assistant';
      } else if (rolelocal == '4') {
        return 'parent';
      }
    }

    return '';
  },
  //判断是否是我自己的消息
  isMyMsg: function isMyMsg(userid) {
    if (this.configInfoObj && this.configInfoObj.user.userid == userid) {
      return true;
    }

    return false;
  },
  //判断是否是大班课
  isLargeClass: function isLargeClass() {
    if (this.roomInfoObj) {
      if (this.roomInfoObj.classmode == 3 || this.roomInfoObj.classmode == 5 || this.roomInfoObj.classmode == 6 || this.roomInfoObj.classmode == 1000) {
        return true;
      }
    }

    return false;
  },
  //获取课程类型,即将客户端传入的课程类型转换成数据库中定义的课程类型,传给信道
  getClassTypeInDb: function getClassTypeInDb() {
    //客户端定义的课程类型
    //0=无效模式;1=1对1模式;2=小组课模式;3=大班课模式;4=小班课模式,同小组课模式,只不过人数更多,最多20个;5=互动大班课
    //6=口令互动大班课;1000=励模式的互动大班课
    //数据库定义课程类型
    //0=一对一';'3'=小组课';'1'=大班课(口令访问)';'2':'大班课(密码访问)';'6':'互动大班课(口令访问)';'5':'互动大班课(密码访问)'
    var classtype = 1;

    if (this.roomInfoObj) {
      classtype = this.roomInfoObj.classmode;

      if (this.roomInfoObj.classmode == 1) {
        classtype = 0;
      } else if (this.roomInfoObj.classmode == 2) {
        classtype = 3;
      } else if (this.roomInfoObj.classmode == 3) {
        classtype = 1; //客户端把口令和密码方式的大班课都统一为了大班课
      } else if (this.roomInfoObj.classmode == 4) {
        classtype = 7; //客户端给的4是小班课
      } // 找出互动大班课
      else if (this.roomInfoObj.classmode == 5 || this.roomInfoObj.classmode == 6) {
          classtype = 5; //为了增加信道给麦加的判断
        }
    }

    return classtype; //默认互动大班课吧
  },
  //判断是否是我自己的消息
  getMsgIndex: function getMsgIndex() {
    this.msgindex++;
    return this.msgindex;
  },
  //进入房间,初始化参数
  initpara: function initpara() {},
  parseIntMySimple: function parseIntMySimple(strvar) {
    var ret = 0;

    for (var i = 0; i < strvar.length; ++i) {
      ret *= 10;
      var num1 = Number(strvar[i]);
      ret += num1;
    }

    return ret;
  },
  getMsgKey: function getMsgKey(index) {
    var time = new Date();
    var key = this.userid + '_' + this.role + '_' + index + '_' + time.getTime();
    return key;
  },
  //日志记录 msgtype:0:debug,1:info,2:warnning,3:error,4:critical
  recordLogToFile: function recordLogToFile(msgtype, msgbody, productName) {
    try {
      if (msgtype == 'f' && this.logmode == 0) {
        return;
      }

      if (this.channeltype == 0 || this.channeltype == 1) {
        //日志级别,0:debug,1:info,2:warnning,3:error,4:critical
        bridge.writeLog(msgtype, JSON.stringify(msgbody), productName);
      }

      if (this.channeltype == 2) {
        if (w.chatobj && w.chatobj.onRecordJsLog) {
          w.chatobj.onRecordJsLog(msgtype, msgbody);
        }
      }
    } catch (e) {}
  },
  //上报提示信息
  reportHintInfo: function reportHintInfo(content) {
    if (w.controlObj && w.controlObj.onSelfHealthReport) {
      w.controlObj.onSelfHealthReport('report', content);
    }
  },
  //记录try catch异常
  recordException: function recordException(e) {
    try {
      var logmsg = e.stack + '_' + e.message;
      bridge.writeLog('e', logmsg);
    } catch (e) {}
  },
  //获取bridge
  setupWebViewJavascriptBridge: function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) {
      return callback(WebViewJavascriptBridge);
    }

    if (window.WVJBCallbacks) {
      return window.WVJBCallbacks.push(callback);
    }

    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function () {
      document.documentElement.removeChild(WVJBIframe);
    }, 0);
  } // //html模拟客户端调用
  // htmlEnterRoom: function () {
  //   var roomid = document.getElementById("roomid").value;
  //   var userid = document.getElementById("username").value;
  //   var channel = document.getElementById("channeltype").value;
  //   var usercodeinput = document.getElementById("usercode").value;
  //   var serverurl = document.getElementById("serverurl").value;
  //   var tokeninput = document.getElementById("token").value;
  //   var instidinput = document.getElementById("instid").value;
  //   var username = userid;
  //   var config = {};
  //   //config.address = 'http://123.56.176.151:14081/';//开发
  //   //config.address = 'http://dev-im.weclassroom.com:14080/';//开发
  //   //config.address = 'https://test-im.weclassroom.com';//开发
  //   //config.address = 'http://123.56.176.151:14082/';//开发
  //   config.address = serverurl; //开发
  //   //config.address = 'http://123.56.193.134:10080/';
  //   config.language = 0;
  //   config.logmode = 2;
  //   config.user = {};
  //   config.user.userid = userid;
  //   config.user.username = username;
  //   if (usercodeinput != 0) {
  //     config.user.code = usercodeinput;
  //     config.user.token = '';
  //   } else {
  //     config.user.token = tokeninput;
  //     //config.user.token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiMiIsInN1YiI6MTAwMDg0LCJpc3MiOiJodHRwczpcL1wvdGVzdC1hcGkud2VjbGFzc3Jvb20uY29tXC91c2VyXC9sb2dpbiIsImlhdCI6MTQ4NzIxNzk0NCwiZXhwIjoxNDg5ODA5OTQ0LCJuYmYiOjE0ODcyMTc5NDQsImp0aSI6IjlmZDcwYzVmOGRkNjM2YTc0MzA2MjI4OGUxYmVlYmQ5In0.RgpquwjhqcYUKf1l3XjbGggbc8Y1jEY_45xZpfgnOIg';
  //   }
  //   if (username.indexOf("teacher") == 0) {
  //     config.user.role = 'teacher';
  //   } else if (username.indexOf('assistant') == 0) {
  //     config.user.role = 'assistant';
  //   } else {
  //     config.user.role = 'student';
  //   }
  //   config.channeltype = channel;
  //   config.user.avatar = 'http://www.qq1234.org/uploads/allimg/150709/8_150709170804_8.jpg';
  //   this.setConfigInfo(JSON.stringify(config));
  //   var roominfo = {};
  //   roominfo.roomid = roomid;
  //   roominfo.classmode = 5; //1=1对1模式;2=1对多模式;3=大班课模式;5=互动大班课密码;6=互动大班课口令
  //   roominfo.playmode = 1;
  //   roominfo.institutionid = instidinput;
  //   this.enterRoom(JSON.stringify(roominfo));
  //   this.istestFromhtml = 1;
  //   if (w.CHATEST) {
  //     w.CHATEST.checkorder = 1;
  //   }
  // },
  // htmlLeaveRoom: function () {
  //   CONTROL.leaveRoom();
  // }

};
 // })();

/*
 * @Author: your name
 * @Date: 2021-01-05 20:41:36
 * @LastEditTime: 2021-03-25 21:57:42
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \1223\xbase_extension_zby_live_sdk\src\channel\sdk-cb.js
 */
var sdkCb = {
  join: function join(data) {
    NOTICE.join({
      userId: data.userid || data.actorId,
      userName: data.actorName,
      role: data.actorType || data.role
    });
  },
  joinAck: function joinAck(data) {
    NOTICE.joinAck({
      userId: data.userid || data.actorId,
      userName: data.actorName,
      role: data.actorType || data.role
    });
  },
  addStream: function addStream(data) {
    NOTICE.addStream({
      userId: data.userid || data.actorId,
      userName: data.actorName,
      role: data.actorType || data.role,
      streamId: data.streamUrl,
      videoSrc: ''
    });
  },
  removeStream: function removeStream(data) {
    NOTICE.removeStream({
      userId: data.userid || data.actorId || data.streamUrl.split('_')[2],
      userName: data.actorName,
      role: data.actorType || data.role,
      streamId: data.streamUrl
    });
  },
  updateStreamDeviceStatus: function updateStreamDeviceStatus(data) {
    NOTICE.updateStreamDeviceStatus({
      userId: data.userid || data.actorId,
      userName: data.actorName,
      role: data.actorType || data.role,
      //获取设备类型和状态对应的文案,返回给业务层
      deviceType: dict.devicesMap.get(parseInt(data.streamType)),
      deviceStatus: dict.devicesStatusMap.get(parseInt(data.status))
    });
  },
  leave: function leave(data) {
    NOTICE.leave({
      userId: data.userid || data.actorId,
      userName: data.actorName,
      role: data.actorType || data.role
    });
  },
  channelDisconnect: function channelDisconnect() {
    NOTICE.channelDisconnect();
  },
  userDisconnect: function userDisconnect(data) {
    NOTICE.userDisconnect({
      userId: data.userid || data.actorId,
      userName: data.username,
      role: data.role
    });
  }
};

function dealReceiveStreamMsg (data, baseInfo) {
  try {
    dataReport$2.pomeloRecvMsg({
      data: data
    });
  } catch (e) {
    console.error('pomeloRecvMsg_error', e);
  }

  switch (data.api) {
    case 'join':
      //通知业务层信息:有人进入房间
      sdkCb.join(data);
      defaultApi$1.writeLog("sdk notice user_join role: ".concat(data.actorType, " userId : ").concat(data.actorId, " userName: ").concat(data.actorName)); //如果本地是学生,就定向回应joinAck和addStream,让对方可以展示自己的视频
      //定向回应joinAck和addStream,让对方可以展示自己的视频
      //线路切换:本地学生和老师SDK类型不一致

      if (window.target_sdk_type) {
        //存在target_sdk_type ,表示正在切换中,等待切换
        defaultApi$1.writeLog("changing sdk to ".concat(window.target_sdk_type, ",ignore remote userId ").concat(data.actorId, " join msg"));
        break;
      } else {
        channelClient.sendJoinAck(baseInfo);
        channelClient.sendAddStream(baseInfo);
        channelClient.sendUpdateStreamDeviceStatus(Object.assign({}, baseInfo, {
          deviceType: dict.getDeviceTypeKey('video'),
          deviceStatus: dict.getDeviceStatusKey(userAndDeviceStatusInfo && userAndDeviceStatusInfo.camera ? 'open' : 'closed')
        }));
        channelClient.sendUpdateStreamDeviceStatus(Object.assign({}, baseInfo, {
          deviceType: dict.getDeviceTypeKey('audio'),
          deviceStatus: dict.getDeviceStatusKey(userAndDeviceStatusInfo && userAndDeviceStatusInfo.microPhone ? 'open' : 'closed')
        }));
      }

      break;

    case 'joinAck':
      //首先确认对方的消息是针对本人进行回应的(信道处理)定向接收
      //通知业务层信息:有人在房间的回应
      sdkCb.joinAck(data);
      defaultApi$1.writeLog("sdk notice user_response role: ".concat(data.actorType, " userId : ").concat(data.actorId, " userName: ").concat(data.actorName));
      break;

    case 'addStream':
      defaultApi$1.writeLog({
        changing_sdk_type: window.target_sdk_type,
        local_sdk_type: window.current_sdk_type,
        remote_sdk_type: data.sdkName,
        isIgnore: !!window.target_sdk_type || data.sdkName && window.current_sdk_type !== data.sdkName
      });

      if (!!window.target_sdk_type || data.sdkName && window.current_sdk_type !== data.sdkName) {
        defaultApi$1.writeLog("recv different sdk addStream,:target ".concat(window.target_sdk_type, ",ignore remote userId ").concat(data.actorId, " msg"));
        break;
      } //处理接收的群发消息和定向消息(已经由消息服务器处理过)
      //通知展示收到的视频流数据


      sdkCb.addStream(data);
      defaultApi$1.writeLog("sdk notice remote_video_ready : current_sdk_type: ".concat(window.current_sdk_type, ", zbyAVSDK_type: ").concat(window.zbyAVSDK_init_sdk_type, ",  role: ").concat(data.actorType, " userId : ").concat(data.actorId, " userName: ").concat(data.actorName));
      break;

    case 'removeStream':
      if (data.sdkName && window.current_sdk_type !== data.sdkName) {
        break;
      } //处理接收的群发removeStream消息
      //通知移除收到的视频流数据


      sdkCb.removeStream(data);
      defaultApi$1.writeLog("sdk notice remote_video_removed ,streamUrl ".concat(data.streamUrl, ", role: ").concat(data.actorType, " userId : ").concat(data.actorId, " userName: ").concat(data.actorName, " "));
      break;

    case 'updateStreamDeviceStatus':
      /**
         * @data.streamType: 1视频 / 2麦克风
         * @data.status: 1打开 / 2关闭
         * @CONTROL.role: '1' 老师收流 / '2' 学生收流
         * */
      //通知业务层信息
      sdkCb.updateStreamDeviceStatus(data);
      defaultApi$1.writeLog("sdk notice device_status role: ".concat(data.actorType, " userId : ").concat(data.actorId, " userName: ").concat(data.actorName, " deviceType : ").concat(dict.devicesMap.get(parseInt(data.streamType)), " deviceStatus: ").concat(dict.devicesStatusMap.get(parseInt(data.status))));
      break;

    case 'leave':
      //通知业务层信息
      sdkCb.leave(data);
      defaultApi$1.writeLog("sdk notice user_leave role: ".concat(data.actorType, " userId : ").concat(data.actorId, " userName: ").concat(data.actorName));
      break;

    default:
      break;
  }
}

var w$1 = window;
var CONTROL = {
  socket: null,
  //连接保持相关
  enterInit: false,
  //是否发起过登录,leaveRoom后置为false
  enterSuccessed: false,
  //是否进入房间成功过,leaveRoom或主动disconnect后置为false
  isConnect: false,
  //连接服务器成功的标志
  isInRoom: false,
  //当前是否在房间中,掉线后为false
  isReconnect: false,
  //是否是自动重连,控制“进入教室”的显示
  isOffline: false,
  //是否网络断线
  joindelaytimer: null,
  //连接建立后,延迟发起登录请求
  jointimeouttimer: null,
  //登录超时time
  connecttimeouttimer: null,
  connecttimeCount: 0,
  //初次连接时已尝试连接服务器的次数(用于connect超时检查)
  connecttimeout: 20000,
  //连接服务器超时,第一次设置20秒 之后变为30秒
  authorizefailedcount: 0,
  //授权失败的次数
  //设置相关
  address: '',
  //以下为客户端传入的变量
  token: '',
  code: '',
  //口令课时的口令,此时token应为空
  role: '1',
  //'1=teacher'/'2=student'/'3=assistant'/'4=parent'
  username: '',
  //显示用户相关信息时使用username
  userid: '',
  //消息后台识别用户使用userid
  avatar: '',
  conn_origin: '',
  language: 0,
  //0=中文,1=英文
  classmode: 1,
  ////1=1对1模式;2=1对多模式;3=大班课模式;5=互动大班课
  playmode: 1,
  ////1=正常上课;2=回放
  roomid: '',
  institutionid: '',
  //确保消息发送成功相关的
  streamIndex: 0,
  normalMsgIndex: 0,
  //不需要保序的消息的id
  checkInterval: 3000,
  //检查“消息发送超时”的时间间隔(超时时间在检查函数中)
  maxAckDelay: 8000,
  //消息回复的最大时间延迟,超过最大延迟还没收到回复,认为没发送成功
  checkSendSucessTimer: null,
  sendCheckList: null,
  //发送确认队列
  sendCacheList: null,
  //发送缓存队列
  recvmsgKeys: null,
  //接收消息的缓存队列
  recvmsgTimes: null,
  //接收消息的缓存队列每条消息对应的时间
  cacheReqSend: false,
  //请求服务器端缓存的命令是否发送了
  recvCacheList: null,
  //断线重连后,请求缓存队列后,保存缓存的消息
  recvTmpList: null,
  //断线重连后,在获取服务器到服务器端的缓存队列前,先缓存收到的消息,不上抛
  timedeviation: 0,
  //本地时间与服务器时间的差值,毫秒:服务器时间-本地时间
  orderCheck: null,
  //保序验证
  lastRecvMsgId: null,
  //保序验证 //测试添加
  testrecvcount: null,
  //保序验证,统计接收消息数 //测试添加
  delaycheckList: null,
  //保序、丢消息、延迟验证 //测试添加
  delayList: null,
  //延迟列表
  lastcheckindex: 0,
  //上一个收到的echo回复的
  dealChannelMsg: null,
  // 业务层传入的消息处理器,作为回调使用
  pingPongArr: [],
  //public 进入教室
  enterRoom: function enterRoom(dealChannelMsg) {
    CONTROL.dealChannelMsg = dealChannelMsg;

    if (!this.enterInInitparas()) {
      return;
    }

    ENTRY.recordLogToFile('info', 'enter room info'); //通知宿主,页面开始连接了

    if (w$1.controlObj && w$1.controlObj.onStartConnect) {
      w$1.controlObj.onStartConnect();
    }

    this.startEnter();
  },
  //public 退出,断开连接
  leaveRoom: function leaveRoom() {
    CONTROL.otherChannelleaveRoom();
    ENTRY.recordLogToFile('info', 'control: leaveRoom');

    if (!this.enterInit) {
      return;
    }

    CONTROL.enterInit = false;
    this.sendleaveRoomMsg();

    if (this.socket) {
      this.socket.disconnect();
    }

    this.leaveRoomReset();
  },
  //其它通道离开房间
  otherChannelleaveRoom: function otherChannelleaveRoom() {
    try {
      //其他通道
      if (ENTRY.channeltype == 0) {
        if (w$1.CHAT) {
          w$1.CHAT.leaveRoom();
        }
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //开始登录过程 连接-验证身份-进入教室
  startEnter: function startEnter() {
    CONTROL.enterInit = true;
    ENTRY.recordLogToFile('info', 'enter channel room start');
    var logmsg = 'control:connect ';
    logmsg += this.address;
    CONTROL.displayLogMsg(logmsg);
    ENTRY.recordLogToFile('info', logmsg); //连接

    this.socketConnect(); //超时检查

    this.startCheckConnectTimer();
  },
  //socket 开始连接
  socketConnect: function socketConnect() {
    //开始连接时,如果存在已有socket,先断开连接
    if (CONTROL.socket) {
      CONTROL.socket.disconnect();
    }

    var opt = new Object();
    opt.transports = ['websocket'];
    ENTRY.recordLogToFile('info', 'channel start connect ' + this.address);
    CONTROL.socket = io.connect(this.address, opt);
    this.setEventListeners();
  },
  //注册监听事件
  setEventListeners: function setEventListeners() {
    console.log('websocket: 设置监听'); //监听连接成功 01步

    this.socket.on('connect', function (o) {
      ENTRY.recordLogToFile('info', 'channel connect success');
      CONTROL.dealConnectSuccess();

      try {
        dataReport$2.joinRoomResult({
          code: '0',
          // cloud_api_response: JSON.stringify(window.zby_sdk_cloud_data),
          cloud_api_response: window.zby_sdk_cloud_data,
          cloud_api_url: "".concat(getApiCloudBaseUrl(), "/rtccloud/class/init"),
          chat_url: window.zby_sdk_cloud_data.chatUrl
        });
      } catch (e) {}

      ;
    }); //授权成功 02步

    this.socket.on('authenticated', function () {
      console.log('websocket: 授权成功');
      CONTROL.displayLogMsg('control:authenticated!');
      ENTRY.recordLogToFile('info', 'control:authenticated succeessful');
      CONTROL.stopCheckConnectTimer();
      CONTROL.joindelaytimer = window.setTimeout(CONTROL.sendJoinInMsg, 100); //延迟100毫秒登录
    }); //授权不成功

    this.socket.on('unauthenticated', function () {
      ENTRY.recordLogToFile('info', 'control:authenticated failed');
      CONTROL.dealAuthorizeFailed();

      try {
        dataReport$2.joinRoomResult({
          code: '4',
          cloud_api_response: window.zby_sdk_cloud_data,
          cloud_api_url: "".concat(getApiCloudBaseUrl(), "/rtccloud/class/init"),
          chat_url: window.zby_sdk_cloud_data.chatUrl
        });
      } catch (e) {}

      ;
    }); //监听连接断开,禁用网卡/主动disconnect,会回调这个

    this.socket.on('disconnect', function () {
      CONTROL.isOffline = true;
      CONTROL.dealDisconnect();
    });
    this.socket.on('pong', function (data) {
      // console.log(data + ' - pong');
      CONTROL.pingPongArr.push(data);
    });
    this.OnUserDefineMsg();
  },
  //发送验证权限消息
  sendAuthenMsg: function sendAuthenMsg() {
    try {
      if (CONTROL.token != '') {
        CONTROL.socket.emit('authenticate', {
          token: CONTROL.token,
          room: CONTROL.roomid,
          instid: CONTROL.institutionid,
          userid: CONTROL.userid
        });
      } else if (CONTROL.code != '') {
        CONTROL.socket.emit('authenticate', {
          code: CONTROL.code,
          room: CONTROL.roomid,
          instid: CONTROL.institutionid,
          userid: CONTROL.userid
        });
        var logmsg = 'control sendAuthenMsg:with code:' + CONTROL.code;
        ENTRY.recordLogToFile('info', logmsg);
      } else {
        ENTRY.recordLogToFile('error', 'control auth para wrong');
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //连接授权成功后发送:进入房间消息发送
  sendJoinInMsg: function sendJoinInMsg() {
    // 销毁延迟登录timer
    CONTROL.stopDelayJoinTimer();

    try {
      var obj = {};
      obj.username = CONTROL.username;
      obj.room = CONTROL.roomid;
      obj.avatar = CONTROL.avatar;
      obj.userid = CONTROL.userid;
      obj.role = CONTROL.role;
      obj.playmode = CONTROL.playmode;
      obj.device = 1; //0 - 默认;1 - PC客户端;2 - PC web;3 - 移动 web;4 - 移动 APP;

      obj.instid = CONTROL.institutionid;
      obj.conn_origin = CONTROL.conn_origin;
      obj.classmode = ENTRY.getClassTypeInDb();
      ENTRY.recordLogToFile('info', 'control:emit join_room');
      CONTROL.socket.emit('join_room', obj, function (param) {
        CONTROL.dealJoinMsgAck(param);
        var logmsg = 'control:join_room ack' + JSON.stringify(param);
        ENTRY.recordLogToFile('info', logmsg);
      });
      CONTROL.isOffline = false;
    } catch (e) {
      ENTRY.recordException(e);
    } // 超时后检查进入房间是否成功


    CONTROL.startCheckJoinInTimer();
  },
  //退出登录消息发送
  sendleaveRoomMsg: function sendleaveRoomMsg() {
    if (CONTROL.socket == null) {
      return;
    }

    try {
      ENTRY.recordLogToFile('info', 'control:emit leave room');
      CONTROL.socket.emit('leave_room', {}, function (param) {});
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //进入房间是否成功的检查,在进入房间尚未成功时,重新启动进入过程
  checkAndReEnter: function checkAndReEnter() {
    CONTROL.stopAllTimeoutTimer(); // 离开教室 / 进入房间成功后,不用再检查了
    // 掉线重连,不走这儿,这儿是尚未连接成功过,或主动disconnect后的重连;掉线后,socket.io库会自动重连,并回调connect

    if (!CONTROL.enterInit || CONTROL.enterSuccessed) {
      var logmsg = 'control:checkAndReEnter not needed:' + CONTROL.enterInit + ',' + CONTROL.enterSuccessed;
      ENTRY.recordLogToFile('info', logmsg);
      return;
    }

    ENTRY.recordLogToFile('info', 'control:checkAndReEnter');

    if (CONTROL.connecttimeCount < ENTRY.enterMaxCount) {
      CONTROL.reEnterRoom();
    } else {
      //上报客户端
      if (w$1.controlObj && w$1.controlObj.loginFailed) {
        w$1.controlObj.loginFailed();
      } // channel_join	信道连接 进入房间失败


      ENTRY.recordLogToFile('info', 'channel reenter failed');
    }
  },
  //重新连接并进入房间
  reEnterRoom: function reEnterRoom() {
    CONTROL.reenterReset();

    if (CONTROL.enterSuccessed) {
      CONTROL.isReconnect = true;
    }

    CONTROL.connecttimeCount++;
    CONTROL.startEnter();
  },
  //连接超时检查
  checkConnectTimeout: function checkConnectTimeout() {
    CONTROL.stopCheckConnectTimer();

    if (!CONTROL.isConnect) {
      ENTRY.recordLogToFile('info', 'control:check connect failed,reenter');
      CONTROL.checkAndReEnter();
    }
  },
  //处理连接成功的事件
  dealConnectSuccess: function dealConnectSuccess() {
    ENTRY.recordLogToFile('info', 'control:connect success'); //没有执行过登录操作

    if (!this.enterInit) {
      ENTRY.recordLogToFile('error', 'control:recve connect,not init yet!');
      return;
    }

    this.isConnect = true; //发送验证

    this.sendAuthenMsg(); //回调 authenticated
    //上报客户端

    if (w$1.controlObj && controlObj.connectSuccess) {
      controlObj.connectSuccess();
    }
  },
  //处理断开连接事件
  dealDisconnect: function dealDisconnect() {
    ENTRY.recordLogToFile('info', 'control:channel disconnect');

    if (!CONTROL.enterInit) {
      ENTRY.recordLogToFile('info', 'control:recve disconnect,already logout');
      return;
    }

    try {
      CONTROL.displayLogMsg('control: disconnect');
      CONTROL.isConnect = false;
      CONTROL.isInRoom = false;

      if (CONTROL.enterSuccessed) {
        //自己掉线通知
        if (w$1.controlObj && controlObj.disconnect) {
          controlObj.disconnect();
        }

        CONTROL.dealChannelMsg({
          type: 'channel_disconnect',
          data: {
            message: 'Channel disconnect'
          }
        });
      }
    } catch (e) {}
  },
  //处理授权失败
  dealAuthorizeFailed: function dealAuthorizeFailed() {
    try {
      if (CONTROL.enterSuccessed) {
        //进入房间成功过,但掉线重连时,验证授权失败了
        ENTRY.recordLogToFile('info', 'control:authenticated failed when reconect');

        if (CONTROL.authorizefailedcount < 8) {
          ENTRY.recordLogToFile('error', 'control:authenticated failed socketConnect');
          CONTROL.socketConnect();
        }
      } else {
        //尚未进入房间成功,且授权失败了
        ENTRY.recordLogToFile('error', 'control:authenticated failed when connect first time');
        CONTROL.checkAndReEnter();
      }

      ++CONTROL.authorizefailedcount;
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //处理登录消息
  dealJoinMsgAck: function dealJoinMsgAck(msgobj) {
    //{'code':0,'message':'join ok'}
    if (!msgobj) {
      return;
    }

    if (msgobj.code == 0) {
      if (!this.enterSuccessed) {
        CONTROL.otherChannelEnter(); //其它通道进入房间,免身份验证
      }

      this.stopCheckJoinInTimer();

      if (!this.isInRoom) {
        if (this.enterSuccessed) {
          CONTROL.dealReconnectSuccess();
          this.displayLogMsg('control: reenter room success'); //重新登录成功

          ENTRY.recordLogToFile('info', 'reenter room success');
          CONTROL.dealChannelMsg({
            type: 'channel_reconnect',
            data: {
              message: 'Channel reconnect'
            }
          }); //如果之前登入过,且现在没在房间内,代表当次连接为断线重连,重连成功须重新发送音视频 join 消息

          channelClient.reJoin();
        } else {
          //请求历史消息
          this.getHistoryList();
          this.displayLogMsg('control: enter room success'); //已进入房间的话就不要提示了

          ENTRY.recordLogToFile('info', 'control: enter room success');
        }
      }

      this.isInRoom = true;
      this.enterSuccessed = true; //设置进房间已经成功过了

      if (w$1.controlObj && w$1.controlObj.loginResponse) {
        w$1.controlObj.loginResponse();
      } //测试添加
      //this.getOnlineList();
      //在线人数


      this.notifyMembernumChanged(msgobj.data);
      CONTROL.timedeviation = msgobj.data.unixtime - new Date().getTime();
    } else {
      this.checkAndReEnter();
    }
  },
  //其它通道进行连接
  otherChannelEnter: function otherChannelEnter() {
    try {
      if (ENTRY.channeltype == 0) {
        if (w$1.CHAT) {
          w$1.CHAT.enterRoom();
        }
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //登录前,初始化参数
  enterInInitparas: function enterInInitparas() {
    try {
      var config = ENTRY.getConfigInfo();
      var roominfo = ENTRY.getRoomInfo();

      if (!config || !roominfo) {
        ENTRY.recordLogToFile('info', 'enter room:room info is empty or user info is empty');
        return false;
      }

      this.address = config.address + 'control'; //兼容一下老的客户端,老的客户端使用的是url编码
      // if(config.hasOwnProperty('encodetype') && config.encodetype=='base64'){
      //     var b64decoder = new w.Base64();
      //     this.username = b64decoder.decode(config.user.username);
      //     this.avatar = b64decoder.decode(config.user.avatar);
      //     ENTRY.recordLogToFile('i','control enterInInitparas:use base64 decode:'+this.username);
      // }
      // else{

      this.username = decodeURIComponent(config.user.username);
      this.avatar = decodeURIComponent(config.user.avatar);
      ENTRY.recordLogToFile('info', 'control enterInInitparas:use url decode:' + this.username); // }

      this.userid = config.user.userid;

      if (config.user.hasOwnProperty('token')) {
        this.token = config.user.token;
      }

      if (config.user.hasOwnProperty('code')) {
        this.code = config.user.code;
      }

      this.role = config.user.role;
      this.language = config.language;
      this.roomid = roominfo.roomid;
      this.classmode = roominfo.classmode;
      this.playmode = roominfo.playmode;
      this.institutionid = roominfo.institutionid;
      this.conn_origin = roominfo.conn_origin;

      if (this.roomid == '' || this.userid == '') {
        ENTRY.recordLogToFile('error', 'enter room:roomid is empty or userid is empty');
        return false;
      }

      this.isReconnect = false; //重连标志,重连一次就算重连了

      this.connecttimeCount = 0;
      this.initCacheList();
    } catch (e) {
      ENTRY.recordException(e);
      return false;
    }

    return true;
  },
  //重启进入教室过程前,对某些变量进行重置
  reenterReset: function reenterReset() {
    this.isInRoom = false;
    this.isConnect = false;

    if (this.userstate == null) {
      this.userstate = new Array();
    } else {
      this.userstate.length = 0;
    }

    if (this.socket) {
      this.socket.disconnect();
    }

    this.stopAllTimeoutTimer();
  },
  leaveRoomReset: function leaveRoomReset() {
    this.reenterReset(); //停一下timer

    this.stopAllTimeoutTimer();
    this.unInitCacheList();
    this.connecttimeCount = 0;
    this.enterInit = false;
    this.enterSuccessed = false;
    this.socket = null;
  },
  //启动 连接超时检查
  startCheckConnectTimer: function startCheckConnectTimer() {
    this.connecttimeouttimer = window.setTimeout(CONTROL.checkConnectTimeout, CONTROL.connecttimeout);
    CONTROL.connecttimeout = 30000;
  },
  //关闭 连接超时检查
  stopCheckConnectTimer: function stopCheckConnectTimer() {
    if (this.connecttimeouttimer) {
      w$1.clearTimeout(this.connecttimeouttimer);
      this.connecttimeouttimer = null;
    }
  },
  //关闭 延迟join的timer
  stopDelayJoinTimer: function stopDelayJoinTimer() {
    if (CONTROL.joindelaytimer != null) {
      window.clearTimeout(CONTROL.joindelaytimer);
      CONTROL.joindelaytimer = null;
    }
  },
  //启动 进入房间超时的检查
  startCheckJoinInTimer: function startCheckJoinInTimer() {
    this.jointimeouttimer = window.setTimeout(CONTROL.checkAndReEnter, CONTROL.connecttimeout);
  },
  //关闭 进入房间超时的检查
  stopCheckJoinInTimer: function stopCheckJoinInTimer() {
    if (this.jointimeouttimer) {
      w$1.clearTimeout(this.jointimeouttimer);
      this.jointimeouttimer = null;
    }
  },
  //停止所有计时器
  stopAllTimeoutTimer: function stopAllTimeoutTimer() {
    this.stopCheckConnectTimer();
    this.stopCheckJoinInTimer();
    this.stopDelayJoinTimer();
  },
  displayLogMsg: function displayLogMsg(msg) {
    if (w$1.CHATDIS) {
      w$1.CHATDIS.displayLogMsg(msg);
    }
  },
  //////////////////////以上为进入房间/离开房间 过程的通用处理/////////////////////////////////////
  //发送流控制消息 string string string string
  sendStreamMsg: function sendStreamMsg(subtype, content, targetid, save) {
    //subtype : stream / class(save)
    var obj = {};
    obj.index = this.streamIndex++; //int

    obj.uuid = ENTRY.getMsgKey(obj.index); //string

    obj.mtype = subtype; //消息子类型

    obj.targetid = targetid;
    obj.trace_id = "sdk_1.0_".concat(new Date().getTime().toString().padStart(16, '123456'));
    obj.message = content;
    obj.save = save;

    if (this.isInRoom) {
      this.sendStreamMsgInner(obj);
    } else {
      this.cachedSendMsg(obj);
    }
  },
  //发送可以丢失的消息
  sendUnimportantStreamMsg: function sendUnimportantStreamMsg(subtype, content, targetid, save) {
    //subtype : stream / class(save)
    if (!this.isInRoom || !this.socket) {
      return;
    }

    var obj = {};
    obj.index = this.normalMsgIndex++; //int 不关心

    obj.uuid = ENTRY.getMsgKey(obj.index); //string

    obj.mtype = 'lowquality'; //消息子类型

    obj.targetid = targetid;
    obj.message = content;
    obj.save = save;
    this.socket.emit('stream', obj, function (status) {});
  },
  sendStreamMsgInner: function sendStreamMsgInner(obj) {
    try {
      var logmsg = 'send:' + obj.index;
      logmsg += ',msg:';
      logmsg += obj.message;
      logmsg += ',uuid:';
      logmsg += obj.uuid;
      ENTRY.recordLogToFile('info', logmsg);
      this.addToCheckList(obj);
      this.socket.emit('stream', obj, function (status) {
        if (status.code == 0) {
          CONTROL.setSendSuccess(obj); //提示开始上课/结束上课

          var curtime = new Date();
          var timeseconds = curtime.getTime() + CONTROL.timedeviation;
          var timestr = '';
          timestr += timeseconds;
          obj.unixtime = timestr;
          CONTROL.displayClassOperate(obj);
        }

        var logmsg = 'control:send ack:' + obj.index;
        ENTRY.recordLogToFile('info', logmsg);
      });
    } catch (e) {
      ENTRY.recordException(e);
    } //CONTROL.displayLogMsg(logmsg1);//删掉

  },
  //发送普通控制消息 string string string 暂时没有使用此事件
  sendCommonMsg: function sendCommonMsg(subtype, content, targetid) {
    //subtype:netstate
    var obj = {};
    obj.index = ENTRY.getMsgIndex(); //int

    obj.mtype = subtype; //消息子类型

    obj.targetid = targetid;
    obj.message = content; //obj.save = save;//暂时没有save字段

    this.socket.emit('common', obj, function (status) {});
  },
  //发送可以丢失的消息
  sendLowQualityMsg: function sendLowQualityMsg(subtype, content, targetid) {
    //subtype : stream / class(save)
    if (!this.isInRoom || !this.socket) {
      return;
    }

    var obj = {};
    obj.index = this.normalMsgIndex++; //int 不关心

    obj.uuid = ENTRY.getMsgKey(obj.index); //string

    obj.mtype = subtype; //消息子类型

    obj.targetid = targetid;
    obj.message = content;
    this.socket.emit('netstate', obj, function (status) {});
  },
  //获取当前在线列表 老师身份的才有效
  getOnlineList: function getOnlineList() {
    try {
      this.socket.emit('listeners', {}, function (status) {
        if (status.code != 0) {
          //if(w.onlinemeber && w.onlinemeber.onRecvMemberDataFinished){
          //    w.onlinemeber.onRecvMemberDataFinished();
          //}
          ENTRY.recordLogToFile('error', 'get online list failed!');
        }
      });
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //请求stream历史消息
  getHistoryList: function getHistoryList() {
    try {
      ENTRY.recordLogToFile('info', 'emit history_message!');
      this.socket.emit('history_message', {}, function (para) {
        ENTRY.recordLogToFile('info', 'history_message ret!');

        if (para.code == 0) {
          try {
            //只处理开始上课、结束上课消息
            var length = para.data.history_list.length;

            for (var i = 0; i < length; ++i) {
              var msgobj = para.data.history_list[i];
              CONTROL.displayClassOperate(msgobj);
            } //end of for
            //通知学生端 最后一条课程状态消息


            if (length > 0 && CONTROL.role == '2' && w$1.controlObj && w$1.controlObj.onReciveStream) {
              for (var j = length - 1; j >= 0; j--) {
                var msgobjclass = para.data.history_list[j];

                if (msgobjclass.mtype == 'class') {
                  w$1.controlObj.onReciveStream(msgobjclass.mtype, msgobjclass.message);
                  break;
                }
              }
            } //通知老师端,开始上课和结束上课有没有


            var startclassExist = 'false';
            var endclassExist = 'false';

            if (w$1.controlObj && w$1.controlObj.onKeyMessageSent) {
              for (var i = 0; i < length; i++) {
                var msgobjclass = para.data.history_list[i];

                if (msgobjclass.mtype == 'class') {
                  var cmdobj = JSON.parse(msgobjclass.message);

                  if (cmdobj && cmdobj.cmdtype == 'start') {
                    startclassExist = 'true';
                  }

                  if (cmdobj && cmdobj.cmdtype == 'end') {
                    endclassExist = 'true';
                  }
                }
              }

              w$1.controlObj.onKeyMessageSent('startClass', startclassExist);
              w$1.controlObj.onKeyMessageSent('endClass', endclassExist);
            } //end of if

          } catch (e) {
            ENTRY.recordException(e);
          }
        } //end of if

      });
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //监听消息
  OnUserDefineMsg: function OnUserDefineMsg(msg) {
    //进入教室成功
    this.socket.on('join_room', function (obj) {
      CONTROL.dealJoinMsg(obj);
    }); //离开教室

    this.socket.on('leave_room', function (obj) {
      CONTROL.dealleaveRoomMsg(obj);
    }); //监测网络状态

    this.socket.on('pong', function (time) {
      if (w$1.controlObj && controlObj.onPong) {
        controlObj.onPong('' + time);
      }
    }); //接收流控制消息

    this.socket.on('stream', function (obj) {
      CONTROL.dealStreamMsg(obj, false);
    });
    this.socket.on('netstate', function (obj) {
      CONTROL.dealNetStateMsg(obj);
    });
    this.socket.on('award', function (obj) {
      CONTROL.dealAwardMsg(obj); //奖励通知
    });
    this.socket.on('streamservicetype', function (obj) {
      CONTROL.dealStreamServiceTypeMsg(obj); //切换SDK通知
    });
    this.socket.on('force_exit', function (obj) {
      //被踢通知
      CONTROL.displayLogMsg('force_exit'); //删掉

      CONTROL.dealForceExit(obj);
    });
    this.socket.on('room_expired', function (obj) {
      //房间过期
      CONTROL.dealRoomExpired(obj);
    }); //接收监课状态消息

    this.socket.on('supervisor', function (obj) {
      CONTROL.dealSupervisorMsg(obj);
    }); //收到在线列表消息

    this.socket.on('listeners', function (obj) {
      if (w$1.onlinemeber && w$1.onlinemeber.onRecvOnlinMemberData) {
        var objstr = JSON.stringify(obj);
        w$1.onlinemeber.onRecvOnlinMemberData(objstr);
      }
    }); //掉线通知

    this.socket.on('offline', function (obj) {
      CONTROL.dealOfflineMsg(obj);
      CONTROL.isOffline = true; //channel_disconnect	信道离线,退出房间

      CONTROL.dealChannelMsg({
        type: 'user_disconnect',
        data: {
          userId: +obj.userid,
          userName: obj.username,
          role: obj.role
        }
      });
      ENTRY.recordLogToFile('info', "sdk notice user_disconnect role: ".concat(obj.role, " userId : ").concat(obj.userid, " userName: ").concat(obj.username));
      ENTRY.recordLogToFile('info', "offline ".concat(JSON.stringify(obj)));
    }); //收到异常状态消息

    this.socket.on('unusual', function (obj) {
      if (obj && w$1.controlObj && w$1.controlObj.onRecvUnusualNOtify) {
        w$1.controlObj.onRecvUnusualNOtify(JSON.stringify(obj));
      }
    }); //供参考,实测并不完全符合:客户端socket发起连接时的顺序。当第一次连接时,事件触发顺序为:connecting->connect;
    // 当失去连接时,事件触发顺序为:disconnect->reconnecting(可能进行多次)->connecting->reconnect->connect。

    this.socket.on('reconnecting', function () {
      CONTROL.displayLogMsg('control: reconnecting!');
    }); //并不会回调这个

    this.socket.on('connecting', function () {
      CONTROL.displayLogMsg('control: connecting!');
    }); //监听连接失败

    this.socket.on('connect_failed', function (o) {
      CONTROL.displayLogMsg('control:connectfailed');

      try {
        dataReport$2.joinRoomResult({
          code: '3',
          cloud_api_response: window.zby_sdk_cloud_data,
          cloud_api_url: "".concat(getApiCloudBaseUrl(), "/rtccloud/class/init"),
          chat_url: window.zby_sdk_cloud_data.chatUrl
        });
      } catch (e) {}

      ;
    }); //目前没发现,什么情况下会回调这个

    this.socket.on('error', function () {
      CONTROL.displayLogMsg('control:soceket错误!');
    }); //并不会回调这个:自动重连成功后,会调用connect

    this.socket.on('reconnect', function () {
      CONTROL.displayLogMsg('control:reconnect!');
    }); //并不会回调这个

    this.socket.on('reconnect_failed', function () {
      CONTROL.displayLogMsg('control:reconnect_failed!');
    });
  },
  //处理登录消息
  dealJoinMsg: function dealJoinMsg(msgobj) {
    if (w$1.onlinemeber && w$1.onlinemeber.onRecvMemberStateChange) {
      try {
        var objuser = {};
        objuser.online = 'login';
        objuser.username = msgobj.username;
        objuser.userid = msgobj.userid;
        objuser.role = ENTRY.translateRoleBack(msgobj.role);

        if (msgobj.hasOwnProperty('avatar')) {
          objuser.avatar = msgobj.avatar;
        }

        if (msgobj.hasOwnProperty('device')) {
          objuser.device = msgobj.device;
        }

        var jsonstr = JSON.stringify(objuser);
        w$1.onlinemeber.onRecvMemberStateChange(jsonstr);
      } catch (e) {
        ENTRY.recordException(e);
      }
    }

    var logmsg = 'control:收到join_room:' + msgobj.userid;
    ENTRY.recordLogToFile('info', logmsg);
    this.displayLogMsg(logmsg);
    CONTROL.notifyMembernumChanged(msgobj);
  },
  //处理退出登录消息
  dealleaveRoomMsg: function dealleaveRoomMsg(msgobj) {
    try {
      //{'unixtime':'32435435','userid':'username','username':'Falcon','role':'1'}
      var logmsg = 'control:收到leaveRoom_message:';
      logmsg += JSON.stringify(msgobj);
      CONTROL.displayLogMsg(logmsg);
      ENTRY.recordLogToFile('info', logmsg);
      var isme = ENTRY.isMyMsg(msgobj);

      if (isme) {
        //这个应该不会发生
        ENTRY.recordLogToFile('error', 'receive self leaveroom ack');
      } else {
        if (w$1.onlinemeber && w$1.onlinemeber.onRecvMemberStateChange) {
          var objuser = {};
          objuser.online = 'logout';
          objuser.userid = msgobj.userid;
          objuser.role = ENTRY.translateRoleBack(msgobj.role);
          var jsonstr = JSON.stringify(objuser);
          w$1.onlinemeber.onRecvMemberStateChange(jsonstr);
        }
      }
    } catch (e) {
      ENTRY.recordException(e);
    }

    CONTROL.notifyMembernumChanged(msgobj);
  },
  notifyMembernumChanged: function notifyMembernumChanged(obj) {
    try {
      //非一对一模式下,需要通知应用层成员数量
      if (obj.hasOwnProperty('onlinecounts')) {
        if (w$1.controlObj && controlObj.onMemberChanged && ENTRY.isLargeClass()) {
          controlObj.onMemberChanged(obj.onlinecounts);
        }

        var logmsg = 'control:online count:';
        logmsg += obj.onlinecounts;
        this.displayLogMsg(logmsg);
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //处理断开连接消息
  dealOfflineMsg: function dealOfflineMsg(msgobj) {
    try {
      var logmsg = 'control:收到disconnect_message';
      logmsg += JSON.stringify(msgobj);
      CONTROL.displayLogMsg(logmsg);
      ENTRY.recordLogToFile('info', logmsg);
      var isme = ENTRY.isMyMsg(msgobj);

      if (!isme) {
        if (w$1.onlinemeber && w$1.onlinemeber.onRecvMemberStateChange) {
          var objuser = {};
          objuser.online = 'offline';
          objuser.userid = msgobj.userid;
          objuser.role = ENTRY.translateRoleBack(msgobj.role);
          var jsonstr = JSON.stringify(objuser);
          w$1.onlinemeber.onRecvMemberStateChange(jsonstr);
        }

        CONTROL.notifyMembernumChanged(msgobj);
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //处理流控制消息
  dealStreamMsg: function dealStreamMsg(obj, history) {
    if (!obj) {
      return;
    }

    if (CONTROL.judgeAlreadyRecv(obj, history)) {
      var logmsg = 'recv repeat msg:' + JSON.stringify(obj);
      ENTRY.recordLogToFile('info', logmsg);
      CONTROL.displayLogMsg(logmsg); //删除

      return;
    } //如果现在正在请求缓存队列,先缓存收到的正常消息


    if (this.cacheReqSend) {
      obj.history = history;

      if (obj.hasOwnProperty('cache') && obj.cache == 1) {
        this.recvCacheList.push(obj);
        var logmsg1 = 'recv:cache msg' + JSON.stringify(obj);
        ENTRY.recordLogToFile('info', logmsg1);
        CONTROL.displayLogMsg(logmsg1); //删除
      } else {
        this.recvTmpList.push(obj);
        var logmsg2 = 'recv:cache normal msg' + JSON.stringify(obj);
        ENTRY.recordLogToFile('info', logmsg2);
        CONTROL.displayLogMsg(logmsg2); //删除
      }

      return;
    }

    CONTROL.dealStreamMsgInner(obj, history);
    this.checkToIntException(obj);
  },
  //消息去重处理
  judgeAlreadyRecv: function judgeAlreadyRecv(obj, history) {
    //缓存队列
    if (!history && obj.hasOwnProperty('uuid') && obj.uuid != '') {
      if (this.recvmsgKeys.indexOf(obj.uuid) != -1) {
        return true;
      } else {
        this.recvmsgKeys.push(obj.uuid);
        var timenow = new Date();
        this.recvmsgTimes.push(timenow); //var logmsg = 'recv msg,time now:'+timenow.getTime();
        //CONTROL.displayLogMsg(logmsg);
      }

      CONTROL.reduceRecvMsgList();
    }

    return false;
  },
  //缩减接收消息列表的长度,防止超长
  reduceRecvMsgList: function reduceRecvMsgList() {
    try {
      if (this.recvmsgTimes.length < 1000) {
        return;
      }

      var timenow = new Date();
      var timeex = 3 * 60 * 1000;
      var index = 0;

      for (index = 0; index < this.recvmsgTimes.length; ++index) {
        if (timenow.getTime() - this.recvmsgTimes[index].getTime() < timeex) {
          break;
        }
      }

      if (index >= 1) {
        this.recvmsgTimes.splice(0, index);
        this.recvmsgKeys.splice(0, index); //var logmsg = 'reduce key list: index';
        //logmsg += index;
        //logmsg += ',left:';
        //logmsg += this.recvmsgKeys.length;
        //CONTROL.displayLogMsg(logmsg);//删除
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //处理流控制消息
  dealStreamMsgInner: function dealStreamMsgInner(obj, history) {
    try {
      ////测试丢消息、保序和时延
      //if(!history){
      //    this.checkechobacktest(obj);
      //}
      //var logmsg1 = 'deal stream:'+obj.index + ' '+obj.userid;
      if (obj.mtype != 'lowquality') {
        var logmsg1 = 'recv:' + obj.index;
        logmsg1 += ',msg:';
        logmsg1 += obj.message;
        logmsg1 += ',uuid:';
        logmsg1 += obj.uuid;
        logmsg1 += ',utime:';
        logmsg1 += obj.unixtime;
        ENTRY.recordLogToFile('info', logmsg1);
      }
      /*******专用处理信道中流信息相关功能 start ********/


      if (!history) {
        var data = JSON.parse(obj.message); // window.zby_sdk_init_params为用户初始化sdk传递的基础参数

        var baseInfo = {
          roomId: window.zby_sdk_init_params.roomId,
          userId: CONTROL.userid,
          userName: CONTROL.username,
          institutionId: window.zby_sdk_init_params.institutionId,
          targetId: data.actorId,
          role: CONTROL.role === '1' ? 'teacher' : 'student'
        };
        dealReceiveStreamMsg(data, baseInfo);
      }
      /*******专用处理信道中流信息相关功能  end ********/


      if (!history && w$1.controlObj && controlObj.onReciveStream) {
        controlObj.onReciveStream(obj.mtype, obj.message);
      } //提示上下课


      CONTROL.displayClassOperate(obj);

      if (w$1.CHATEST && w$1.CHATEST.checkorder == 1) {
        CONTROL.checkOrder(obj);
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //处理监课消息
  dealSupervisorMsg: function dealSupervisorMsg(obj) {
    if (!obj) {
      return;
    }

    try {
      if (obj.mtype == 'help_state') {
        //var message = obj.message;
        var helpobj = obj.message;

        if (this.roomid != helpobj.lessonid || this.userid != helpobj.userid) {
          return;
        } //求助,机构后台处理后,推送此消息,收到后上报客户端


        if (w$1.controlObj && w$1.controlObj.onSupervisorState) {
          var objformat = {};
          objformat.mtype = 'help_state';
          objformat.status = helpobj.supervisorStatus;
          objformat.resolve = helpobj.supervisorResolve;
          w$1.controlObj.onSupervisorState(JSON.stringify(objformat));
        }
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //处理网络状态消息
  dealNetStateMsg: function dealNetStateMsg(obj) {
    if (obj && w$1.controlObj && w$1.controlObj.onReciveLowQualityMsg) {
      w$1.controlObj.onReciveLowQualityMsg(obj.mtype, obj.message);
    }
  },
  //处理奖励消息
  dealAwardMsg: function dealAwardMsg(obj) {
    if (obj && w$1.controlObj && w$1.controlObj.onServerPushMessage) {
      w$1.controlObj.onServerPushMessage('award', JSON.stringify(obj.message));
    }
  },
  //处理切换SDK消息
  dealStreamServiceTypeMsg: function dealStreamServiceTypeMsg(obj) {
    console.log('%c接收到信道广播的切换SDK消息,切换到:' + obj.message.data, 'color:blue');
    ENTRY.recordLogToFile('info', 'channel msg: streamservicetype, change sdk to ' + obj.message.data);
    var data = obj.message;

    if (window.current_sdk_type !== data.data) {
      zbysdk$1.changeSDK();
    } else {
      console.log('%c接收到信道广播目标SDK和本地一致,不切换:' + obj.message.data, 'color:blue');
      ENTRY.recordLogToFile('info', 'channel target sdk type is the same as the local sdk ,will not change sdk to :' + obj.message.data);
    }
  },
  //处理被踢消息
  dealForceExit: function dealForceExit(obj) {
    if (ENTRY.istestFromhtml == 1) {
      CONTROL.displayLogMsg('您已被踢');
      ENTRY.recordLogToFile('info', 'deal with force exit');
      CONTROL.leaveRoom();

      if (w$1.CHAT && ENTRY.channeltype == 0) {
        w$1.CHAT.leaveRoom();
      }
    }

    if (w$1.controlObj && w$1.controlObj.onServerPushMessage) {
      w$1.controlObj.onServerPushMessage('force_exit', '');
    }
  },
  //处理房间过期消息
  dealRoomExpired: function dealRoomExpired(obj) {
    if (w$1.controlObj && w$1.controlObj.onServerPushMessage) {
      w$1.controlObj.onServerPushMessage('room_expired', '');
    }
  },
  //处理断线后重连
  dealReconnectSuccess: function dealReconnectSuccess() {
    ENTRY.recordLogToFile('info', 'deal reconnect success');
    CONTROL.displayLogMsg('deal reconnect success'); //删掉

    CONTROL.resendMessages();
    CONTROL.requestCachedMsg();
  },
  //断线重连后,请求缓存队列
  requestCachedMsg: function requestCachedMsg() {
    var uuid = '';

    if (this.recvmsgKeys.length > 0) {
      uuid = this.recvmsgKeys[this.recvmsgKeys.length - 1];
    }

    this.cacheReqSend = true;
    var obj = {};
    obj.uuid = uuid;
    var logmsg = 'requestCachedMsg:' + obj.uuid;
    CONTROL.displayLogMsg(logmsg); //删除

    ENTRY.recordLogToFile('info', logmsg);
    this.socket.emit('cache_message', obj, function (para) {
      logmsg = 'requestCachedMsg: ack ' + para.code;
      CONTROL.displayLogMsg(logmsg); //删除

      ENTRY.recordLogToFile('info', logmsg);
      CONTROL.cacheReqSend = false;

      if (para.code == 0) {
        CONTROL.dealRecvCache();
      } else {
        ENTRY.recordLogToFile('error', 'request cache msg ret failed!');
      }
    });
  },
  //处理缓存的收到但未处理的消息
  dealRecvCache: function dealRecvCache() {
    var reportobj = {};
    reportobj.count = this.recvCacheList.length;

    for (var i = 0; i < this.recvCacheList.length; ++i) {
      CONTROL.dealStreamMsgInner(this.recvCacheList[i], this.recvCacheList[i].history);
    }

    ENTRY.recordLogToFile('info', 'dealRecvCache:server cached num:' + this.recvCacheList.length);
    this.recvCacheList.length = 0;

    for (var j = 0; j < this.recvTmpList.length; ++j) {
      CONTROL.dealStreamMsgInner(this.recvTmpList[j], false);
    }

    ENTRY.recordLogToFile('info', 'dealRecvCache:local cached num:' + this.recvTmpList.length);
    this.recvTmpList.length = 0; //上报积压消息情况

    if (w$1.controlObj && w$1.controlObj.onSelfHealthReport) {
      w$1.controlObj.onSelfHealthReport('servercachedcount', JSON.stringify(reportobj));
    }
  },
  //保序验证
  checkOrder: function checkOrder(obj) {
    //CONTROL.displayLogMsg('recv:'+obj.index);
    if (CONTROL.lastRecvMsgId == null) {
      CONTROL.lastRecvMsgId = new Array();
    }

    ++CONTROL.testrecvcount;
    var curtime = new Date();
    CONTROL.displayLogMsg('recv:' + curtime.toTimeString() + ',' + CONTROL.testrecvcount);
    var userFind = false;

    for (var i = 0; i < CONTROL.lastRecvMsgId.length; ++i) {
      if (CONTROL.lastRecvMsgId[i].userid == obj.userid) {
        userFind = true;

        if (CONTROL.lastRecvMsgId[i].index > obj.index) {
          CONTROL.displayLogMsg('control msg disorder,userid:' + obj.userid + ',' + obj.index);

          if (w$1.CHATEST) {
            w$1.CHATEST.setOrderCheckResult('message disorder');
          }
        }

        if (CONTROL.lastRecvMsgId[i].index + 1 != obj.index) {
          CONTROL.displayLogMsg('control msg lost,userid:' + obj.userid + ',' + CONTROL.lastRecvMsgId[i].index + ' to ' + obj.index);

          if (w$1.CHATEST) {
            w$1.CHATEST.setOrderCheckResult('message lost');
          }
        }

        if (obj.index % 30 == 0) {
          CONTROL.displayLogMsg('recv,useri:' + obj.userid + ',' + obj.index);
        }

        CONTROL.lastRecvMsgId[i].index = obj.index;
        break;
      }
    }

    if (!userFind) {
      var tmpobj = {};
      tmpobj.index = obj.index;
      tmpobj.userid = obj.userid;
      CONTROL.lastRecvMsgId.push(tmpobj);
    }
  },
  //初始化缓存队列相关
  initCacheList: function initCacheList() {
    try {
      this.streamIndex = 0;
      this.normalMsgIndex = 0;

      if (!this.sendCheckList) {
        this.sendCheckList = new Array();
      } else {
        this.sendCheckList.length = 0;
      }

      if (!this.sendCacheList) {
        this.sendCacheList = new Array();
      } else {
        this.sendCacheList.length = 0;
      }

      this.cacheReqSend = false;

      if (!this.recvCacheList) {
        this.recvCacheList = new Array();
      } else {
        this.recvCacheList.length = 0;
      }

      if (!this.recvTmpList) {
        this.recvTmpList = new Array();
      } else {
        this.recvTmpList.length = 0;
      }

      if (!this.recvmsgKeys) {
        this.recvmsgKeys = new Array();
      } else {
        this.recvmsgKeys.length = 0;
      }

      if (!this.recvmsgTimes) {
        this.recvmsgTimes = new Array();
      } else {
        this.recvmsgTimes.length = 0;
      }

      if (!this.orderCheck) {
        this.orderCheck = new Array();
      } else {
        this.orderCheck.length = 0;
      }

      if (!this.delaycheckList) {
        this.delaycheckList = new Array();
      } else {
        this.delaycheckList.length = 0;
      }

      if (!this.delayList) {
        this.delayList = new Array();
      } else {
        this.delayList.length = 0;
      }

      this.checkSendSucessTimer = w$1.setInterval(this.checkStreamMsgSendSuccess, this.checkInterval);
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //反初始化缓存队列相关
  unInitCacheList: function unInitCacheList() {
    this.streamIndex = 0;
    this.normalMsgIndex = 0;
    this.sendCacheList = null;
    this.cacheReqSend = false;
    this.recvCacheList = null;
    this.recvTmpList = null;
    this.recvmsgKeys = null;
    this.recvmsgTimes = null;
    this.orderCheck = null;
    this.delaycheckList = null;
    this.delayList = null;

    if (this.checkSendSucessTimer) {
      w$1.clearInterval(this.checkSendSucessTimer);
      this.checkSendSucessTimer = null;
    }

    this.sendCheckList = null;
  },
  //缓存要发送的消息
  cachedSendMsg: function cachedSendMsg(obj) {
    try {
      this.sendCacheList.push(obj);
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //添加到确认队列
  addToCheckList: function addToCheckList(obj) {
    try {
      var checkobj = {};
      checkobj.data = obj;
      checkobj.time = new Date();
      checkobj.success = false;
      this.sendCheckList.push(checkobj);
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //收到确认
  setSendSuccess: function setSendSuccess(obj) {
    try {
      for (var i = 0; i < CONTROL.sendCheckList.length; ++i) {
        if (CONTROL.sendCheckList[i].data.index == obj.index) {
          CONTROL.sendCheckList[i].success = true;
          break;
        }
      } //缓存队列:清理


      var length = CONTROL.sendCheckList.length;

      while (length > 0 && CONTROL.sendCheckList[0].success) {
        CONTROL.sendCheckList.splice(0, 1);
        length = CONTROL.sendCheckList.length;
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //检查消息是否发送成功
  checkStreamMsgSendSuccess: function checkStreamMsgSendSuccess() {
    try {
      var length = CONTROL.sendCheckList.length;

      if (length > 0 && this.isInRoom) {
        var curtime = new Date();

        if (curtime.getTime() - CONTROL.sendCheckList[length - 1].time.getTime() > CONTROL.maxAckDelay) {
          CONTROL.resendMessages(); ////todo 缓存队列过长的话,断开重新连接

          if (length > 200) {
            var logmsg01 = 'check message to much:' + length;
            ENTRY.recordLogToFile('error', logmsg01);
          }

          var logmsg = 'resend messages withou ack:' + length;
          ENTRY.recordLogToFile('info', logmsg);
          CONTROL.displayLogMsg(logmsg); //删掉

          ENTRY.reportHintInfo(logmsg);
        }
      }
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //重新发送缓存的消息
  resendMessages: function resendMessages() {
    try {
      var reportobj = {};
      var length = CONTROL.sendCheckList.length;
      reportobj.unconfirmcount = length;

      if (length > 0) {
        var sendlist = CONTROL.sendCheckList.slice(0);
        CONTROL.sendCheckList.length = 0;

        for (var i = 0; i < sendlist.length; ++i) {
          this.sendStreamMsgInner(sendlist[i].data);
        }
      }

      var cachedlenth = this.sendCacheList.length;
      reportobj.count = length + this.sendCacheList.length;

      for (var i = 0; i < this.sendCacheList.length; ++i) {
        this.sendStreamMsgInner(this.sendCacheList[i]);
      }

      this.sendCacheList.length = 0; //上报积压消息情况

      if (w$1.controlObj && w$1.controlObj.onSelfHealthReport) {
        w$1.controlObj.onSelfHealthReport('resendcount', JSON.stringify(reportobj));
      }

      var logmsg = 'resent message,checklist:';
      logmsg += length;
      logmsg += ',cached:';
      logmsg += cachedlenth;
      ENTRY.recordLogToFile('info', logmsg);
      CONTROL.displayLogMsg(logmsg); //删掉
    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //显示开始上课/结束上课消息
  displayClassOperate: function displayClassOperate(msgobj) {
    try {
      if (msgobj.mtype == 'class') {
        var classobj = JSON.parse(msgobj.message);

        if (!msgobj.hasOwnProperty('unixtime')) {
          return;
        } //只用control通道的话,需要通知chat通道去显示,否则直接在聊天页面显示


        if (ENTRY.channeltype == 1) {
          if (w$1.controlObj && w$1.controlObj.onDisplayClassOperate) {
            w$1.controlObj.onDisplayClassOperate(classobj.cmdtype, msgobj.unixtime);
          }
        } else {
          if (w$1.CHATDIS) {
            w$1.CHATDIS.disClassStatusHint(classobj.cmdtype, msgobj.unixtime);
          }
        }
      } //end of if

    } catch (e) {
      ENTRY.recordException(e);
    }
  },
  //检查异常
  checkToIntException: function checkToIntException(obj) {
    try {
      var uttime = obj.unixtime.substr(0, obj.unixtime.length - 3);
      var timeint = parseInt(uttime); //todo 检查到底怎么回事

      var timeint = ENTRY.parseIntMySimple(uttime);

      if (!(timeint.toString() == uttime)) {
        ENTRY.recordLogToFile('error', 'parseint error');
        CONTROL.displayLogMsg('parseint error'); //删掉
      }
    } catch (e) {}
  },
  //发送流控制消息 string string string string
  sendStreamMsgTest: function sendStreamMsgTest(subtype, content, targetid, save) {
    //subtype : stream / class(save)
    var curtime = new Date();
    var obj = {};
    obj.index = this.streamIndex++; //int

    obj.uuid = ENTRY.getMsgKey(obj.index); //string

    obj.mtype = subtype; //消息子类型

    obj.targetid = targetid;
    obj.message = content;
    obj.save = save;
    obj.echotest = 1;
    obj.sendtime = curtime.getTime();
    obj.checkindex = obj.index;
    var objtest = {};
    objtest.checkindex = obj.index;
    objtest.sendtime = obj.sendtime;
    this.delaycheckList.push(objtest);

    if (this.isInRoom) {
      this.sendStreamMsgInner(obj);
    } else {
      this.cachedSendMsg(obj);
    }
  },
  checkechobacktest: function checkechobacktest(obj) {
    //subtype : stream / class(save)
    var curtime = new Date();
    var index = 0;

    if (!obj.hasOwnProperty('echotest')) {
      return;
    }

    for (index = 0; index < this.delaycheckList.length; ++index) {
      if (obj.checkindex > this.delaycheckList[index].checkindex) {
        break;
      }

      if (obj.checkindex == this.delaycheckList[index].checkindex) {
        ;
      }
    }
  },
  getPingPongArr: function getPingPongArr() {
    setTimeout(function () {
      CONTROL.pingPongArr = [];
    }, 1);
    return CONTROL.pingPongArr;
  }
};
 // })();

var interactWithChannel = {
  control: CONTROL,
  entry: ENTRY
};

function sendChannelMsgInner(data) {
  var target = data.target;

  if (target) {
    delete data.target;
    interactWithChannel.control.sendStreamMsg('stream', JSON.stringify(data), target);
  } else {
    interactWithChannel.control.sendStreamMsg('stream', JSON.stringify(data));
  }
}

var zbyChannelObj = {
  joinRoom: function joinRoom(args, cb) {
    try {
      //设置信道基础参数
      interactWithChannel.entry.setConfigInfo(JSON.stringify({
        'address': args.chatUrl,
        'user': {
          'userid': args.userId,
          'username': args.userName || '',
          'token': args.channelToken,
          'role': args.role,
          'avatar': '',
          'code': '1234'
        },
        'language': 0,
        'logmode': 0,
        'channeltype': 1
      }));
    } catch (error) {
      window.zby_sdk_init_status_for_data_report = false;

      try {
        dataReport.joinRoomResult({
          code: '2',
          // cloud_api_response: JSON.stringify(window.zby_sdk_cloud_data),
          cloud_api_response: window.zby_sdk_cloud_data,
          cloud_api_url: "".concat(getApiCloudBaseUrl$1(), "/rtccloud/class/init"),
          chat_url: args.chatUrl
        });
      } catch (e) {}

      ;
    }

    interactWithChannel.entry.enterRoom(JSON.stringify({
      //向老客户端兼容,拼接institutionId,信道进房间使用拼接后的roomid
      'roomid': util.getConfId(args.institutionId, args.roomId),
      'classmode': 4,
      'playmode': 1,
      //1=正常上课;2=回放
      'institutionid': args.institutionId,
      //51连接信道所需,区分连接来源
      'conn_origin': '51plan'
    }), cb);
    channelClient.sendJoin(args);
  },
  leaveRoom: function leaveRoom() {
    interactWithChannel.entry.leaveRoom();
  },
  sendChannelMsg: function sendChannelMsg(data, target) {
    util.waitFlagToRun(function () {
      return interactWithChannel.control.isInRoom;
    }, sendChannelMsgInner, _objectSpread({}, data, {
      target: target
    }));
  }
};

function DoubleLinkList() {
  function DNode(data) {
    this.data = data;
    this.next = null;
    this.prev = null;
  }

  this.head = null;
  this.tail = null;
  this.length = 0;

  this.insert_head = function (data) {
    var temp_node = new DNode(data);

    if (this.head == null) {
      this.head = temp_node;
      this.tail = temp_node;
    } else {
      temp_node.next = this.head;
      this.head.prev = temp_node;
      this.head = temp_node;
    }

    this.length += 1;
    return temp_node;
  };

  this.insert_tail = function (data) {
    var node = new DNode(data);

    if (this.tail == null) {
      this.head = node;
      this.tail = node;
    } else {
      node.prev = this.tail;
      this.tail.next = node;
      this.tail = node;
    }

    this.length += 1;
    return node;
  };

  this.delete = function (node) {
    if (node.prev != null && node.next != null) {
      node.prev.next = node.next;
      node.next.prev = node.prev;
    } else if (node.prev != null) {
      this.tail = node.prev;
      this.tail.next = null;
    } else if (node.next != null) {
      this.head = node.next;
      this.head.prev = null;
    } else {
      this.head = null;
      this.tail = null;
    }

    this.length -= 1;
  };

  this.touch = function (node) {
    if (node.prev != null && node.next != null) {
      node.prev.next = node.next;
      node.next.prev = node.prev;
    } else if (node.prev != null) {
      this.tail = node.prev;
      this.tail.next = null;
    } else if (node.next != null) {
      this.head = node.next;
      this.head.prev = null;
    } else {
      this.head = null;
      this.tail = null;
    }

    node.prev = null;
    node.next = null;

    if (this.tail == null) {
      this.head = node;
      this.tail = node;
    } else {
      node.prev = this.tail;
      this.tail.next = node;
      this.tail = node;
    }
  };

  this.getLength = function () {
    return this.length;
  };

  this.getHead = function () {
    return this.head;
  };

  this.getTail = function () {
    return this.tail;
  };
}

function LatestQueue() {
  this.latestDList = new DoubleLinkList();
  this.latestDict = {};

  function LatestNode(msgId, timestamp) {
    this.msgId = msgId;
    this.timestamp = timestamp;
  }

  this.insert = function (msgId, timestamp) {
    if (this.latestDict[msgId]) {
      return;
    }

    var latestNode = new LatestNode(msgId, timestamp);
    this.latestDList.insert_tail(latestNode);
    this.latestDict[msgId] = latestNode;
  };

  this.isRepeat = function (msgId) {
    return !!this.latestDict[msgId];
  };

  this.delete = function (latestInterval, maxDeleteNum) {
    var tempDNode = this.latestDList.getHead();
    var currentDeleteNum = 0;
    var currentTimeStamp = Date.now();

    while (tempDNode != null) {
      if (currentTimeStamp - tempDNode.data.timestamp >= latestInterval) {
        delete this.latestDict[tempDNode.data.msgId];
        this.latestDList.delete(tempDNode);
        currentDeleteNum += 1;
      }

      if (currentDeleteNum >= maxDeleteNum) {
        break;
      }

      tempDNode = tempDNode.next;
    }

    return currentDeleteNum;
  };

  this.getLength = function () {
    return this.latestDList.getLength();
  };
}

var polemoUtil = {
  translateRole: function translateRole(role, roleNum) {
    var roleArr = ['student', 'assist', 'teacher'];
    var roleNumArr = ['1', '2', '4'];

    if (roleArr.includes(role)) {
      return roleNumArr[roleArr.indexOf(role)];
    }

    if (roleNumArr.includes(roleNum)) {
      return roleArr[roleNumArr.indexOf(roleNum)];
    }
  },

  /**
   * 压缩 / 解压 json
   */
  zip: function zip(data) {
    if (data) {
      var str = JSON.stringify(data);
      var binaryString = pako.gzip(encodeURIComponent(str), {
        to: 'string'
      });
      return btoa(binaryString);
    }
  },
  unzip: function unzip(b64Data) {
    var strData = atob(b64Data); // Convert binary string to character-number array

    var charData = strData.split('').map(function (x) {
      return x.charCodeAt(0);
    }); // Turn number array into byte-array

    var binData = new Uint8Array(charData); // // unzip
    //   const data = pako.inflate(binData)

    var data = pako.inflate(binData, {
      to: 'string'
    }); // Convert gunzipped byteArray back to ascii string:
    //   strData = arrayBufferToString(data)

    return decodeURIComponent(data);
  },
  arrayBufferToString: function arrayBufferToString(buffer) {
    var bufView = new Uint16Array(buffer);
    var length = bufView.length;
    var result = '';
    var addition = Math.pow(2, 16) - 1;

    for (var i = 0; i < length; i += addition) {
      if (i + addition > length) {
        addition = length - i;
      }

      result += String.fromCharCode.apply(null, bufView.subarray(i, i + addition));
    }

    return result;
  }
};

var _protocol = Protocol;
var _protobuf = Protobuf;
var _package = Protocol.Package;
var _message = Protocol.Message;
var _JS_WS_CLIENT_TYPE = 'js-websocket';
var _JS_WS_CLIENT_VERSION = '1.0.0'; // 重连间隔时间

var reconnectInterval = 10 * 1000;
var WEB_SOCKET_CLOSE = 'websocket_close';
var WEB_SOCKET_ERROR = 'websocket_error';
var WEB_SOCKET_TIMEOUT = 'websocket_timeout';

var PomeloClient =
/*#__PURE__*/
function () {
  function PomeloClient() {
    var _this2 = this;

    _classCallCheck(this, PomeloClient);

    this.handshakeBuffer = {
      sys: {
        type: _JS_WS_CLIENT_TYPE,
        version: _JS_WS_CLIENT_VERSION
      },
      user: {}
    };
    this.pomeloData = {};
    this.heartbeatInterval = 5000;
    this.heartbeatTimeout = this.heartbeatInterval * 2;
    this.nextHeartbeatTimeout = 0;
    this.heartbeatId = null;
    this.heartbeatTimeoutId = null;
    this.handshakeCallback = null;
    this.socket = null;
    this.reqId = 0;
    this.callBacks = {};
    this.handlers = {};
    this.routeMap = {};
    this.initCallback = null; //自定义

    this.pomeloConfig = {}; // 初始化参数

    this.indexChannelInfo = {}; // 最后一条接收消息的uuid,用于消息恢复

    this.lastReceiveMsgUuid = ''; // 是否正在获取缓存消息列表

    this.isGettingCacheMsgList = false; // 重连定时器

    this.reconnectTimer = null; // 是否在重连

    this.isReconnectting = false; // 是否连接成功

    this.isConnected = false; //是否在教室

    this.isInRoom = false; // 是否链接成功过

    this.hasConnected = false; // 当前域名重连次数

    this.reconnectTimes = 0; // 乐乐ai语音功能,互t场景,为了不在重连

    this.destoryed = false;
    this.latestQueueObj = new LatestQueue();
    this.deleteQueueTimer = setInterval(function () {
      _this2.latestQueueObj.delete.call(_this2.latestQueueObj, 5000 * 4, 1000);
    }, 1000);
    this.failTimes = 0;
    this.retryTimesWhenHeartBeatFailed = 100;
    this.EventType = {
      SOCKET_IO_ERROR: 'SOCKET_IO_ERROR'
    };
  } //初始化pomelo


  _createClass(PomeloClient, [{
    key: "initPomelo",
    value: function initPomelo(pomeloConfig, callBack) {
      this.pomeloConfig = pomeloConfig;
      var port = pomeloConfig.port ? ":".concat(pomeloConfig.port) : '';
      var url = "wss://".concat(pomeloConfig.host).concat(port);
      this.handshakeBuffer.user = pomeloConfig.user; // this.initCallback = callBack;
      // this.handshakeCallback = pomeloConfig.handshakeCallback;

      defaultApi$1.writeLog("channel_log : ".concat(url, " ").concat(JSON.stringify(pomeloConfig), " initPomelo ......")); //开始连接websocket

      return this.initWebSocket(url, pomeloConfig.serverType);
    }
  }, {
    key: "joinRoom",
    value: async function joinRoom(pomeloConfig, callBack) {
      var _this3 = this;

      this.callback = callBack;
      this.isInRoom = true;
      pomeloConfig.port = '443';
      this.indexChannelInfo = pomeloConfig;
      defaultApi$1.writeLog("channel_log :".concat(JSON.stringify(pomeloConfig), " the first step to join pomelo ......"));

      try {
        dataReport$2.pomeloJoinRoom({
          pomeloConfig: pomeloConfig
        });
      } catch (e) {
        defaultApi$1.writeLog("pomeloJoinRoom_error ".concat(JSON.stringify(e)));
      }

      var result = await this.connectGateServer(pomeloConfig).catch(function (err) {
        // 连接失败,重新加入房间
        defaultApi$1.writeLog("channel_log : reconnect joinRoom ......".concat(String(err)));
        return _this3.reconnect();
      });
      return result;
    }
  }, {
    key: "bindWsListener",
    value: function bindWsListener() {
      var _this4 = this;

      // 连接成功后,处理监听事件
      if (!this.socket) {
        defaultApi$1.writeLog('channel_log : socket is null, cannot bind listeners......');
        return;
      }

      this.socket.onopen = function (evt) {
        defaultApi$1.writeLog("channel_log : ".concat(JSON.stringify(evt), " socket is onopen......"));

        _this4.onSocketOpen(evt);
      };

      this.socket.onmessage = function (evt) {
        _this4.onSocketMessage(evt);
      };

      this.socket.onerror = function (evt) {
        defaultApi$1.writeLog("channel_log : ".concat(JSON.stringify(evt), " socket is onerror......"));
        _this4.socket.onerror = null;
        _this4.socket.onclose = null;

        _this4.onSocketError(evt);

        _this4.reconnect();
      };

      this.socket.onclose = function (evt) {
        defaultApi$1.writeLog("channel_log : ".concat(JSON.stringify(evt), " socket is onclose......"));

        _this4.onSocketClose(evt);

        if (_this4.pomeloConfig.serverType == 'chat') {
          _this4.reconnect();
        } else {
          defaultApi$1.writeLog('channel_log : gate socket closed, do not reconnect......');
        }
      };

      defaultApi$1.writeLog('channel_log : bindWsListener completed......');
    }
  }, {
    key: "initWebSocket",
    value: function initWebSocket(url, serverType) {
      var _this5 = this;

      var _this = this;

      defaultApi$1.writeLog("channel_log : ".concat(url, " ").concat(serverType, " socket init......"));
      return new Promise(function (resolve, reject) {
        try {
          if (_this5.socket) {
            defaultApi$1.writeLog('channel_log : socket is closed......');

            _this5.socket.close();
          }
        } catch (e) {
          defaultApi$1.writeLog('pomelo socket close error');
        } //initSocket


        _this5.socket = new WebSocket(url);
        var wsTimeout = setTimeout(function () {
          defaultApi$1.writeLog('channel_log : socket is timeout...... ' + url);
          reject(WEB_SOCKET_TIMEOUT);
        }, 5e3);

        try {
          dataReport$2.pomeloInitWebSocket({
            url: url
          });
        } catch (e) {
          defaultApi$1.writeLog("pomeloInitWebSocket_error ".concat(JSON.stringify(e)));
        }

        defaultApi$1.writeLog('channel_log : new WebSocket......');
        _this5.socket.binaryType = 'arraybuffer';

        _this5.socket.onopen = function (evt) {
          clearTimeout(wsTimeout);

          _this.onSocketOpen(evt);

          defaultApi$1.writeLog("channel_log : ".concat(JSON.stringify(evt), " socket is onopen......"));
        };

        _this5.socket.onmessage = function (evt) {
          var result = _this.onSocketMessage(evt);

          if (result === 'handshake_ok') {
            // 握手完成后再绑定消息接收事件
            if (_this5.pomeloConfig.serverType === 'chat') {
              _this5.bindWsListener();
            }

            resolve(true);
          }
        };

        _this5.socket.onerror = function (evt) {
          clearTimeout(wsTimeout); // new update start

          _this5.socket.onerror = null;
          _this5.socket.onclose = null; // new update end

          _this.onSocketError(evt);

          defaultApi$1.writeLog("channel_log : ".concat(JSON.stringify(evt), " ,serverType : ").concat(serverType, " ,socket is onerror......"));
          reject(WEB_SOCKET_ERROR);
        };

        _this5.socket.onclose = function (evt) {
          clearTimeout(wsTimeout); // new update start

          _this5.socket.onerror = null;
          _this5.socket.onclose = null; // new update end

          defaultApi$1.writeLog("channel_log : ".concat(JSON.stringify(evt), ", serverType : ").concat(serverType, " socket is onclose......"));
          reject(WEB_SOCKET_CLOSE);
        };

        defaultApi$1.writeLog("===start-init-websocket".concat(url, "==="));
      });
    } //onSocketOpen

  }, {
    key: "onSocketOpen",
    value: function onSocketOpen(evt) {
      if (this.socket.readyState == 1) {
        var obj = _package.encode(_package.TYPE_HANDSHAKE, _protocol.strencode(JSON.stringify(this.handshakeBuffer)));

        this.send(obj);
      }
    } //request

  }, {
    key: "request",
    value: function request(route, msg, cb) {
      msg = msg || {};
      route = route || msg.route;

      if (!route) {
        defaultApi$1.writeLog('fail to send request without route.');
        return;
      }

      this.reqId++;
      this.sendMessage(this.reqId, route, msg);
      this.callBacks[this.reqId] = cb;
      this.routeMap[this.reqId] = route;
    }
  }, {
    key: "notify",
    value: function notify(route, msg) {
      msg = msg || {};
      this.sendMessage(0, route, msg);
    } //sendMessage

  }, {
    key: "sendMessage",
    value: function sendMessage(reqId, route, msg) {
      var type = reqId ? _message.TYPE_REQUEST : _message.TYPE_NOTIFY; //compress message by protobuf

      var protos = this.pomeloData.protos ? this.pomeloData.protos.client : {};

      if (protos[route]) {
        msg = _protobuf.encode(route, msg);
      } else {
        msg = _protocol.strencode(JSON.stringify(msg));
      }

      var compressRoute = 0;
      msg = _message.encode(reqId, type, compressRoute, route, msg);

      var packet = _package.encode(_package.TYPE_DATA, msg);

      this.send(packet);
    } //onSocketMessage

  }, {
    key: "onSocketMessage",
    value: function onSocketMessage(evt) {
      var msgData = _package.decode(evt.data);

      switch (msgData.type) {
        case _package.TYPE_HANDSHAKE:
          return this.handshake(msgData.body);

        case _package.TYPE_HEARTBEAT:
          this.heartbeat(msgData.body);
          break;

        case _package.TYPE_DATA:
          // defaultApi.writeLog(`channel_log : ${JSON.stringify(msgData)} _package TYPE_DATA ......`);
          var msg = _message.decode(msgData.body);

          if (msg.id > 0) {
            msg.route = this.routeMap[msg.id];
            delete this.routeMap[msg.id];

            if (!msg.route) {
              return;
            }
          }

          msg.body = this.deCompose(msg);
          this.processMessage(msg);
          break;

        case _package.TYPE_KICK:
          defaultApi$1.writeLog('channel_log : _package TYPE_KICK ......'); // 乐乐aigc表达练,互t场景添加使用

          this.destory();
          NOTICE.mutualKick({}); // this.emit(SocketEventType.POMELO_MESSAGE_KICK);

          break;
      }

      if (this.heartbeatTimeout) {
        this.nextHeartbeatTimeout = Date.now() + this.heartbeatTimeout;
      }
    } //onSocketError

  }, {
    key: "onSocketError",
    value: function onSocketError(evt) {
      // this.emit(SocketEventType.SOCKET_IO_ERROR, evt);
      defaultApi$1.writeLog("[webSocket-state]:onError---ErrorInfo: ".concat(JSON.stringify(evt)));
    } //onSocketClose

  }, {
    key: "onSocketClose",
    value: function onSocketClose(evt) {
      // this.emit(SocketEventType.SOCKET_CLOSE, evt);
      defaultApi$1.writeLog("[webSocket-state]:onClose---ErrorInfo: ".concat(JSON.stringify(evt)));
    } //handshake

  }, {
    key: "handshake",
    value: function handshake(data) {
      var _this = this;

      data = JSON.parse(_protocol.strdecode(data));
      defaultApi$1.writeLog("[websocket-handshake-code:".concat(data.code, "]")); // heartBeatConfig

      if (data.sys && data.sys.heartbeat) {
        this.heartbeatInterval = data.sys.heartbeat * 1000; // heartbeat interval

        this.heartbeatTimeout = this.heartbeatInterval * 2; // max heartbeat timeout
      } else {
        this.heartbeatInterval = 0;
        this.heartbeatTimeout = 0;
      }

      if (data.sys && data.sys['minHeartbeatInterval']) {
        this.minHeartbeatInterval = data.sys['minHeartbeatInterval'] * 1000; // heartbeat interval
      } else {
        this.minHeartbeatInterval = 3000;
      }

      if (data.sys && data.sys['retryTimesWhenHeartBeatFailed']) {
        this.retryTimesWhenHeartBeatFailed = data.sys['retryTimesWhenHeartBeatFailed'];
      }

      this.initPomeloData(data); // handshake-complete

      this.send(_package.encode(_package.TYPE_HANDSHAKE_ACK));
      return 'handshake_ok';
    } //heartbeat

  }, {
    key: "heartbeat",
    value: async function heartbeat(data) {
      var _this6 = this;

      var _this = this;

      defaultApi$1.writeLog('[websocket-heartbeat-state]:receive heartbeat...');

      var obj = _package.encode(_package.TYPE_HEARTBEAT);

      if (this.failTimes) {
        this.failTimes = 0;
        console.warn('重新连上了');
        defaultApi$1.writeLog('重新连上了');
      }

      if (this.heartbeatTimeoutId) {
        clearTimeout(this.heartbeatTimeoutId);
        this.heartbeatTimeoutId = null;
      }

      if (this.heartbeatId) {
        // already in a heartbeat interval
        return;
      }

      this.heartbeatId = setTimeout(function () {
        _this6.heartbeatId = null;

        _this6.send(obj);

        defaultApi$1.writeLog('[pomeloclient.heartbeat]:send heartbeat...');
        _this6.nextHeartbeatTimeout = Date.now() + _this6.heartbeatTimeout;
        _this6.heartbeatTimeoutId = setTimeout(function () {
          _this6.heartbeatTimeoutCb(_this6);
        }, _this6.minHeartbeatInterval);
      }, this.heartbeatInterval);
    } //heartbeatTimeoutCb

  }, {
    key: "heartbeatTimeoutCb",
    value: function heartbeatTimeoutCb(that) {
      var self = this;
      defaultApi$1.writeLog('heartbeatTimeoutCb log !!!');

      if (this.failTimes < this.retryTimesWhenHeartBeatFailed) {
        var obj = _package.encode(_package.TYPE_HEARTBEAT);

        self.send(obj);
        this.failTimes += 1;
        console.warn("\u5FC3\u8DF3\u91CD\u8BD5\u7B2C".concat(this.failTimes, "\u6B21"));
        defaultApi$1.writeLog("\u5FC3\u8DF3\u91CD\u8BD5\u7B2C".concat(this.failTimes, "\u6B21"));
        self.heartbeatTimeoutId = setTimeout(this.heartbeatTimeoutCb.bind(self), this.minHeartbeatInterval);
      } else {
        // update start
        // 超时前先断开监听事件
        self.socket.onmessage = null;
        self.socket.onerror = null;
        self.socket.onclose = null; // update end

        console.error('server heartbeat timeout');
        defaultApi$1.writeLog('server heartbeat timeout'); // 重连

        this.reconnect(); // update start
        // this.disconnect(true);
        // update end
      }
    } //processMessage

  }, {
    key: "processMessage",
    value: function processMessage(msg) {
      var _this = this; // eslint-disable-next-line no-extra-boolean-cast


      if (!!msg.body.msgId) {
        var replyRoute = 'connector.' + msg.route + '.ack';
        var replyMsg = {
          msgId: msg.body.msgId,
          ack: 1
        };
        this.notify(replyRoute, replyMsg);
      }

      if (!msg || !msg.id) {
        switch (msg.route) {
          case 'onChat':
            break;

          case 'onServer':
            try {
              var onServerMsg = JSON.parse(msg.body.msg);
              this.dealOnServerMsg(onServerMsg, msg.body.from);
            } catch (error) {}

            break;

          case 'onAdd':
            break;

          case 'onLeave':
            break;

          case 'onNotice':
            break;

          case 'onKick':
            this.disconnect(true);
            break;

          default:
        }

        return;
      }

      var cb = this.callBacks[msg.id];
      delete this.callBacks[msg.id];

      if (typeof cb !== 'function') {
        return;
      }

      cb(msg.body);
      return;
    } //deCompose

  }, {
    key: "deCompose",
    value: function deCompose(msg) {
      var protos = this.pomeloData.protos ? this.pomeloData.protos.server : {};
      var abbrs = this.pomeloData.abbrs;
      var route = msg.route;

      try {
        //Decompose route from dict
        if (msg.compressRoute) {
          if (!abbrs[route]) {
            console.error('illegal msg!');
            defaultApi$1.writeLog('illegal msg!');
            return {};
          }

          route = msg.route = abbrs[route];
        }

        if (protos[route]) {
          return _protobuf.decode(route, msg.body);
        }

        return JSON.parse(_protocol.strdecode(msg.body));
      } catch (ex) {
        console.error('route, body = ' + route + ', ' + msg.body);
      }

      return msg;
    } //handshakeInit

  }, {
    key: "initPomeloData",
    value: function initPomeloData(data) {
      if (!data || !data.sys) {
        return;
      }

      this.pomeloData = this.pomeloData || {};
      var dict = data.sys.dict;
      var protos = data.sys.protos; //Init compress dict

      if (dict) {
        this.pomeloData.dict = dict;
        this.pomeloData.abbrs = {};

        for (var route in dict) {
          this.pomeloData.abbrs[dict[route]] = route;
        }
      } //Init protobuf protos


      if (protos) {
        this.pomeloData.protos = {
          server: protos.server || {},
          client: protos.client || {}
        };

        if (_protobuf) {
          _protobuf.init({
            encoderProtos: protos.client,
            decoderProtos: protos.server
          });
        }
      }
    } //disconnect

  }, {
    key: "disconnect",
    value: function disconnect(isSelf) {
      if (this.socket) {
        this.socket.onmessage = null;
        this.socket.onerror = null;
        this.socket.onclose = null;
        this.isGettingCacheMsgList = false;
        this.isConnected = false;

        if (!isSelf) {
          this.hasConnected = false;
          this.isInRoom = false;

          if (this.reconnectTimer) {
            clearTimeout(this.reconnectTimer);
            this.reconnectTimer = null;
          }
        }

        if (this.socket.disconnect) {
          this.socket.disconnect();
        }

        if (this.socket.close) {
          this.socket.close();
        }

        defaultApi$1.writeLog('[webSocket-disconnect]');
      }

      if (this.heartbeatId) {
        clearTimeout(this.heartbeatId);
        this.heartbeatId = null;
      }

      if (this.heartbeatTimeoutId) {
        clearTimeout(this.heartbeatTimeoutId);
        this.heartbeatTimeoutId = null;
      }

      if (this.deleteQueueTimer) {
        clearInterval(this.deleteQueueTimer);
        this.deleteQueueTimer = null;
      }
    } //乐乐表达练触发互t,被t端断开连接

  }, {
    key: "destory",
    value: function destory(isSelf) {
      this.disconnect(false);
      this.destoryed = true;
    } //send

  }, {
    key: "send",
    value: function send(packet) {
      if (this.socket) {
        if (this.socket.readyState == 2 || this.socket.readyState == 3) {
          this.disconnect(true);
          return;
        }

        this.socket.send(packet.buffer || packet, {
          binary: true,
          mask: true
        });
      }
    } //发送消息

  }, {
    key: "sendChannelMessage",
    value: function sendChannelMessage(msgData) {
      var _this7 = this;

      var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*';
      return new Promise(function (resolve, reject) {
        _this7.request('chat.chatHandler.send', {
          // rid: this.indexChannelInfo.channelID,
          content: JSON.stringify(msgData),
          from: _this7.indexChannelInfo.userID,
          target: target || '*',
          route: 'onServer'
        }, function (data) {
          if (data.error) {
            reject({
              code: -1
            });
          }

          resolve({
            code: 200
          });
        });
      });
    }
  }, {
    key: "getNextGateDomain",
    value: function getNextGateDomain(currentChannelInfo) {
      if (pomeloBackupDomains.length) {
        pomeloBackupDomains.push({
          host: currentChannelInfo.host,
          port: currentChannelInfo.port
        });
        var domain = pomeloBackupDomains.shift();
        currentChannelInfo.host = domain.host;
        currentChannelInfo.port = domain.port;
      }

      return currentChannelInfo;
    } //连接gate服务器,获取chat连接地址

  }, {
    key: "connectGateServer",
    value: async function connectGateServer(channelInfo) {
      var _this8 = this;

      if (this.isReconnectting && pomeloBackupDomains.length) {
        channelInfo = this.getNextGateDomain(channelInfo);
      }

      await this.initPomelo({
        serverType: 'gate',
        host: channelInfo.host,
        port: channelInfo.port,
        log: true
      });
      defaultApi$1.writeLog('channel_log : connectGateServer,the second step to join pomelo ......' + channelInfo.host);
      var queryData = {
        uid: channelInfo.userId,
        rtype: 4,
        utype: 2,
        retrytime: new Date().getTime(),
        protocolVersion: '1.0' // uniqId: channelInfo.guid

      };
      console.log('gate', queryData, channelInfo);

      var _channelInfo = Object.assign({}, channelInfo);

      await new Promise(function (resolve, reject) {
        _this8.request('gate.gateHandler.queryEntry', queryData, function (data) {
          try {
            _this8.socket.close();

            defaultApi$1.writeLog('channel_log :gate socket close......');
          } catch (error) {//
          }

          _this8.socket = null;

          if (data.code === 500) {
            defaultApi$1.writeLog("channel_log : ".concat(data.code, " request-gateServerFailed......"));
            reject('gateServerFailed');
          }

          _channelInfo.host = data.host;
          _channelInfo.port = data.port;
          defaultApi$1.writeLog("channel_log : ".concat(data.code, " request-gateServerSuccess ......"));

          try {
            dataReport$2.pomeloInitGate({
              gateRes: data
            });
          } catch (e) {
            console.log('pomeloInitGate_error', e);
          }

          resolve('gateServerSuccess');
        });
      });
      return this.connectChatServer(_channelInfo);
    } // 重连chat服务器

  }, {
    key: "reconnectChatServer",
    value: function reconnectChatServer(enterData) {
      var _this9 = this;

      this.request('connector.entryHandler.enter', enterData, function (data) {
        if (data.code === 500) {
          _this9.reconnectChatServer(enterData);

          return;
        }

        resolve(data);
      });
    } // 连接chat服务器

  }, {
    key: "connectChatServer",
    value: async function connectChatServer(channelInfo) {
      var _this10 = this;

      defaultApi$1.writeLog('channel_log : connectChatServer,the third step to join pomelo ......');
      await this.initPomelo({
        serverType: 'chat',
        host: channelInfo.host,
        port: channelInfo.port,
        log: true
      });
      var enterData = {
        uid: channelInfo.userId,
        rid: channelInfo.roomId,
        rtype: 4,
        username: channelInfo.userId,
        uname: channelInfo.userName,
        // ulevel: userInfo.level, //用户等级x
        role: channelInfo.role,
        classid: channelInfo.roomId,
        protocolVersion: '1.0',
        uniqId: channelInfo.guid
      };
      return new Promise(function (resolve, reject) {
        _this10.request('connector.entryHandler.enter', enterData, function (data) {
          if (data.code === 500) {
            reject(data);
            defaultApi$1.writeLog("channel_log : ".concat(data.code, " request-chatServerFailed......"));
            return;
          }

          _this10.dealConnectSuccess();

          try {
            dataReport$2.pomeloInitChat({
              chatRes: data
            });
          } catch (e) {
            defaultApi$1.writeLog("pomeloInitChat_error ".concat(JSON.stringify(e)), null, 'error');
          }

          resolve(data);
          defaultApi$1.writeLog("channel_log : ".concat(JSON.stringify(data), " request-chatServerSuccess......"));
        });
      });
    } // 处理连接成功

  }, {
    key: "dealConnectSuccess",
    value: async function dealConnectSuccess() {
      var _this11 = this;

      // 获取历史列表
      if (this.lastReceiveMsgUuid) {
        try {
          this.isGettingCacheMsgList = true;
          defaultApi$1.writeLog('msgRecoverStream--start');
          var res = JSON.parse(polemoUtil.unzip((await this.msgRecoverStream())));
          defaultApi$1.writeLog("msgRecoverStream--end ".concat(JSON.stringify(res)));

          if (res.code === 200) {
            var recoverMsgList = res.result.cacheList;
            recoverMsgList.forEach(function (msg) {
              var _msg = JSON.parse(msg);

              _this11.dealOnServerMsg(_msg, _msg.from);
            });
            this.isGettingCacheMsgList = false;
          }
        } catch (error) {}
      }

      if (this.hasConnected) {
        // 处理公共重进逻辑
        channelClient.reJoin();
      }

      if (this.isReconnectting) {
        dataReport$2.pomeloState({
          state: 3
        });
      } else {
        dataReport$2.pomeloState({
          state: 1
        });
      }

      this.hasConnected = true;
      clearTimeout(this.reconnectTimer);
      this.reconnectTimer = null;
      this.isReconnectting = false;
      this.isConnected = true;
      this.reconnectTimes = 0;
    } // 消息恢复

  }, {
    key: "msgRecoverStream",
    value: function msgRecoverStream() {
      var _this12 = this;

      return new Promise(function (resolve, reject) {
        var _this12$indexChannelI = _this12.indexChannelInfo,
            userId = _this12$indexChannelI.userId,
            roomId = _this12$indexChannelI.roomId;

        _this12.request('recover.recoverHandler.msgRecoverStream', {
          stuId: userId,
          rid: roomId,
          uuid: _this12.lastReceiveMsgUuid
        }, function (data) {
          if (data.code === 500) {
            reject(data);
            return;
          }

          resolve(data);
        });
      });
    } // 重连

  }, {
    key: "reconnect",
    value: function reconnect() {
      var _this13 = this;

      defaultApi$1.writeLog('pomelo reconnect...');

      if (this.isReconnectting) {
        return;
      }

      if (this.socket) {
        // 创建实例前断开
        this.disconnect(true);
        this.socket = null;
      }

      this.isReconnectting = true;

      if (!this.isConnected && this.isInRoom) {
        return this.connectGateServer(this.indexChannelInfo).catch(function (err) {
          dataReport$2.pomeloState({
            state: 4,
            desc: String(err)
          });
          _this13.reconnectTimer = setTimeout(function () {
            _this13.reconnectTimes += 1;
          }, reconnectInterval);
          _this13.isReconnectting = false;
          return _this13.reconnect();
        });
      }
    } // 处理onserver消息

  }, {
    key: "dealOnServerMsg",
    value: function dealOnServerMsg(onServerMsg, from) {
      if (from === 'sdkset') {
        this.callback(onServerMsg);
      } else if (from !== this.indexChannelInfo.userId) {
        if (this.latestQueueObj.isRepeat(onServerMsg.uuid)) {
          return;
        }

        this.latestQueueObj.insert(onServerMsg.uuid, Date.now());

        if (!this.isGettingCacheMsgList) {
          this.lastReceiveMsgUuid = onServerMsg.uuid;
        }

        this.callback(onServerMsg);
      }
    }
  }]);

  return PomeloClient;
}();

var pomeloClient = new PomeloClient();

var sendMsgCheckIntervalTimer = null;
var sendMsgCheckIntervalTime = 3000;
var pomeloObj = {
  isInRoom: false,
  sendMsgCacheList: {},
  sendMsgCheckList: {},
  sendMsgIndex: 0,
  initParams: null,
  joinRoom: async function joinRoom(args, cb) {
    if (!args) {
      return;
    }

    this.log('channel_log : start joining pomelo ......'); // aigcKickIsReconnect 为了乐乐ai表达练所添加字段,默认为false

    var userId = args.userId,
        roomId = args.roomId,
        userName = args.userName,
        role = args.role,
        institutionId = args.institutionId,
        guid = args.guid,
        aigcKickIsReconnect = args.aigcKickIsReconnect; // 外部调用传 chatUrl,内部重连(sendChannelMsgInner)传 host,两种 key 都兼容

    var chatUrl = args.chatUrl || args.host;
    var _args = {
      userId: userId,
      roomId: roomId,
      host: chatUrl,
      userName: userName,
      institutionId: institutionId,
      guid: guid,
      aigcKickIsReconnect: aigcKickIsReconnect,
      role: polemoUtil.translateRole(role)
    };
    this.log("joinRoom: args: ".concat(JSON.stringify(_args)));
    defaultApi$1.writeLog("joinRoom: args: ".concat(JSON.stringify(_args)));
    this.initParams = _args; // 定时检查发送消息列表
    // this.checkSendMsgList();

    var res = await pomeloClient.joinRoom(_objectSpread({}, _args, {
      roomId: util.getConfId(institutionId, roomId)
    }), dealCb); // 加入房间成功

    if (res.code === 200) {
      this.log('joinRoom success');
      this.isInRoom = true;
      await this.checkFailedAndCacheMSg();
      this.checkSendMsgList();
    } else {
      this.log('joinRoom failed');
      dataReport$2.pomeloState({
        state: 2,
        desc: 'joinRoom failed'
      });
    }

    try {
      defaultApi$1.writeLog('channel_log joinRoomResult');
      dataReport$2.joinRoomResult({
        code: res.code === 200 ? '0' : '3',
        // cloud_api_response: JSON.stringify(window.zby_sdk_cloud_data),
        cloud_api_response: window.zby_sdk_cloud_data,
        cloud_api_url: "".concat(getApiCloudBaseUrl$1(), "/rtccloud/class/init"),
        chat_url: chatUrl
      });
    } catch (e) {}

    ;
  },
  // 离开房间重置所有变量
  leaveRoom: function leaveRoom() {
    this.log('leaveRoom');
    this.isInRoom = false;
    this.sendMsgCacheList = {};
    sendMsgCheckIntervalTimer = null;
    pomeloClient.disconnect();
  },
  sendChannelMsg: async function sendChannelMsg(data) {
    var currTime = new Date().getTime(); // 记录缓存列表

    this.sendMsgIndex++;
    var _this$initParams = this.initParams,
        role = _this$initParams.role,
        userId = _this$initParams.userId;
    var params = {
      type: 'streamMessage',
      online_trace_id: "pc".concat(util.firstUpperCase(role)).concat(util.uuid()),
      body: JSON.stringify({
        message: JSON.stringify(data),
        trace_id: "sdk_1.0_".concat(currTime.toString().padStart(16, '123456')),
        index: this.sendMsgIndex,
        save: '0',
        targetid: data.targetId,
        mtype: 'stream',
        uuid: "".concat(userId, "_2_").concat(this.sendMsgIndex, "_").concat(currTime)
      })
    };

    if (this.isInRoom) {
      // 加入房间成功直接发送消息
      var res = await this.sendChannelMsgInner(params, data.target || '*');

      if (res.code !== 200) {
        this.sendMsgCheckList[params.online_trace_id] = params;
      }
    } else {
      // 为加入房间成功先缓存消息队列
      this.cacheSendChannelMsg(params, data.target);
    }
  },
  // 缓存消息队列
  cacheSendChannelMsg: function cacheSendChannelMsg(data, target) {
    var len = Object.keys(this.sendMsgCacheList).length; // 大于100条不再缓存

    if (len > 100) {
      return;
    }

    this.sendMsgCacheList[data.online_trace_id] = {
      data: data,
      target: target
    };
  },
  // 发送消息
  sendChannelMsgInner: async function sendChannelMsgInner(data) {
    var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*';
    this.log("sendChannelMsgInner: data: ".concat(JSON.stringify(data), ", target: ").concat(target));

    try {
      dataReport$2.pomeloSendMsg({
        api: data.body.api,
        data: _objectSpread({}, data, {
          body: JSON.parse(data.body)
        }),
        target: target
      });
    } catch (e) {
      defaultApi$1.writeLog("pomeloSendMsg_error ".concat(JSON.stringify(e)), null, 'error');
    }

    if (this.isInRoom && !this.checkSocketConnected()) {
      // 乐乐aigc表达练,互t场景添加使用
      if (this.initParams && this.initParams.aigcKickIsReconnect) {
        this.log('sendChannelMsgInner: aigcKickIsReconnect enabled, skip reconnect');
        return {
          code: 500,
          message: 'AIGC kick skip reconnect'
        };
      }

      this.joinRoom(this.initParams);
      return {
        code: 500,
        message: 'Socket not connected'
      };
    }

    return pomeloClient.sendChannelMessage(data, target);
  },
  checkSocketConnected: function checkSocketConnected() {
    if (pomeloClient && pomeloClient.destoryed === false && pomeloClient.socket && pomeloClient.socket.readyState === pomeloClient.socket.OPEN) {
      return true;
    } else {
      return false;
    }
  },
  // 遍历失败和缓存消息
  checkFailedAndCacheMSg: async function checkFailedAndCacheMSg() {
    // 遍历失败消息
    var len = Object.keys(this.sendMsgCheckList).length;

    if (len > 0) {
      this.log("checkSendMsgList-sendMsgCheckList :".concat(JSON.stringify(this.sendMsgCheckList)));

      for (var index in this.sendMsgCheckList) {
        var msg = this.sendMsgCheckList[index];
        var res = await this.sendChannelMsgInner(msg.data, msg.target);

        if (res.code === 200) {
          delete this.sendMsgCheckList[index];
        }
      }
    } // 遍历缓存消息


    var len1 = Object.keys(this.sendMsgCacheList).length;

    if (len1 > 0) {
      this.log("checkSendMsgList-sendMsgCacheList :".concat(JSON.stringify(this.sendMsgCacheList)));

      for (var _index in this.sendMsgCacheList) {
        var _msg = this.sendMsgCacheList[_index];

        var _res = await this.sendChannelMsgInner(_msg.data, _msg.target);

        if (_res.code === 200) {
          delete this.sendMsgCacheList[_index];
        }
      }
    }
  },
  // 定时检查缓存队列
  checkSendMsgList: async function checkSendMsgList() {
    var _this = this;

    sendMsgCheckIntervalTimer = setInterval(async function () {
      if (!_this.isInRoom) {
        return false;
      }

      _this.checkFailedAndCacheMSg();
    }, sendMsgCheckIntervalTime);
  },
  log: function log(msg) {
    defaultApi$1.writeLog(msg, 'channel-pomelo');
  }
};

function dealCb(msg) {
  try {
    var body = JSON.parse(msg.body); // 收发消息

    if (msg.type === 'streamMessage') {
      var _pomeloObj$initParams = pomeloObj.initParams,
          roomId = _pomeloObj$initParams.roomId,
          userId = _pomeloObj$initParams.userId,
          userName = _pomeloObj$initParams.userName,
          institutionId = _pomeloObj$initParams.institutionId,
          role = _pomeloObj$initParams.role;
      var baseInfo = {
        roomId: roomId,
        userId: userId,
        userName: userName,
        institutionId: institutionId,
        role: polemoUtil.translateRole('', role),
        target: msg.from
      };

      var message = _objectSpread({}, JSON.parse(body.message), body);

      dealReceiveStreamMsg(message, baseInfo);
    } // 切换sdk


    if (msg.type === 'streamsdk') {
      defaultApi$1.writeLog("change sdk signal received: ".concat(body.data, ", current: ").concat(window.current_sdk_type));

      if (body.data === 'talrtc' || window.current_sdk_type !== body.data) {
        zbysdk$1.changeSDK();
      } else {
        defaultApi$1.writeLog("change sdk signal received: ".concat(body.data, ", same with current sdk, ignore."));
      }
    }
  } catch (error) {
    var _msg2 = error instanceof Error ? error.message : JSON.stringify(error);

    defaultApi$1.writeLog("dealCb error: ".concat(_msg2), null, 'error');
  }
}

function getParams(baseInfo) {
  var userId = baseInfo.userId,
      target = baseInfo.target,
      userName = baseInfo.userName,
      role = baseInfo.role,
      roomId = baseInfo.roomId,
      institutionId = baseInfo.institutionId;
  return {
    appId: institutionId,
    actorId: userId,
    actorName: userName,
    actorType: role,
    roomId: roomId,
    streamUrl: util.getStreamId(baseInfo),
    streamService: window.zbyAVSDK_init_sdk_type,
    version: 1,
    target: target
  };
}

;
var getSendMsgParams = {
  sendJoinAck: function sendJoinAck(baseInfo) {
    var data = _objectSpread({
      'api': 'joinAck'
    }, getParams(baseInfo)); //无target代表广播消息,target代表有定向发送消息


    return data;
  },
  sendAddStream: function sendAddStream(baseInfo) {
    var data = _objectSpread({
      'api': 'addStream',
      'playMode': '2'
    }, getParams(baseInfo));

    return data;
  },
  sendUpdateStreamDeviceStatus: function sendUpdateStreamDeviceStatus(baseInfo) {
    var deviceType = baseInfo.deviceType,
        deviceStatus = baseInfo.deviceStatus;

    var data = _objectSpread({
      'api': 'updateStreamDeviceStatus',
      'streamType': deviceType,
      // string 流设备对应类型:1:视频 2:音频 3:音视频 4:截屏 5:截屏+视频 6:截屏+音频
      'status': deviceStatus
    }, getParams(baseInfo));

    return data;
  },
  sendRemoveStream: function sendRemoveStream(baseInfo) {
    var data = _objectSpread({
      'api': 'removeStream'
    }, getParams(baseInfo));

    return data;
  },
  sendJoin: function sendJoin(baseInfo) {
    var data = _objectSpread({
      'api': 'join'
    }, getParams(baseInfo));

    return data;
  },
  sendLeave: function sendLeave(baseInfo) {
    var data = _objectSpread({
      'api': 'leave'
    }, getParams(baseInfo));

    return data;
  }
};

var channelObjs = {
  1: zbyChannelObj,
  2: pomeloObj
};
var channelObj = null;

var ChannelClient =
/*#__PURE__*/
function () {
  function ChannelClient() {
    _classCallCheck(this, ChannelClient);

    this.initParams = null;
  } // 加入房间

  /**
   *
   * @param {object} params
   * @param {string} params.userId 用户id
   * @param {string} params.roomId 房间id
   * @param {string} params.host 信道链接地址
   * @param {string} params.userName 用户名
   * @param {string} params.role 角色 teacher/student/assitant
   * @param {string} params.institutionId 机构
   * @param {function} cb 回调函数
   * @param {number} channelType 信道类型 1=直播云信道 2=pomelo
   */


  _createClass(ChannelClient, [{
    key: "joinRoom",
    value: async function joinRoom(params, cb) {
      var channelType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;

      if (channelObj) {
        defaultApi$1.writeLog('channel has init');
        return;
      } // 设置初始化参数


      this.initParams = params; // 设置当前信道对象,使用直播云还是pomelo

      channelObj = channelObjs[channelType];
      defaultApi$1.writeLog('channel_log : choose channel and start joining ......'); // 加入房间

      channelObj.joinRoom(params, cb);
      this.sendJoin(params);
    } // 离开房间

  }, {
    key: "leaveRoom",
    value: async function leaveRoom() {
      if (!channelObj) {
        defaultApi$1.writeLog('channel has not init');
        return;
      } // 离开房间


      channelObj.leaveRoom();
      channelObj = null;
    } // 发送信道消息

  }, {
    key: "sendChannelMsg",
    value: function sendChannelMsg(msg) {
      if (!globalConfig.usePomelo) {
        return;
      }

      if (!channelObj) {
        defaultApi$1.writeLog('channel has not init');
        return;
      }

      channelObj.sendChannelMsg(msg);
    } // 发送进房消息,是自己加入房间群发的消息

  }, {
    key: "sendJoin",
    value: function sendJoin(args) {
      if (!globalConfig.usePomelo) {
        return;
      }

      this.sendChannelMsg(getSendMsgParams.sendJoin(args));
    } // 发送离开房间消息,是收到别人进入房间然后定向发的消息

  }, {
    key: "sendLeave",
    value: function sendLeave(args) {
      if (!globalConfig.usePomelo) {
        return;
      }

      this.sendChannelMsg(getSendMsgParams.sendLeave(args));
    } // 发送进房ack消息

  }, {
    key: "sendJoinAck",
    value: function sendJoinAck(args) {
      if (!globalConfig.usePomelo) {
        return;
      }

      this.sendChannelMsg(getSendMsgParams.sendJoinAck(args));
    } // 发送推流消息,addstream自己推流成功会发,如果有个人进来你会单独给他发,没有ack

  }, {
    key: "sendAddStream",
    value: function sendAddStream(args) {
      if (!globalConfig.usePomelo) {
        return;
      }

      this.sendChannelMsg(getSendMsgParams.sendAddStream(args));
    } // 发送设备状态更新消息

  }, {
    key: "sendUpdateStreamDeviceStatus",
    value: function sendUpdateStreamDeviceStatus(args) {
      if (!globalConfig.usePomelo) {
        return;
      }

      this.sendChannelMsg(getSendMsgParams.sendUpdateStreamDeviceStatus(args));
    } // 发送停止推流消息

  }, {
    key: "sendRemoveStream",
    value: function sendRemoveStream(args) {
      if (!globalConfig.usePomelo) {
        return;
      }

      this.sendChannelMsg(getSendMsgParams.sendRemoveStream(args));
    } //断线重连时,加入小组

  }, {
    key: "reJoin",
    value: async function reJoin() {
      if (!globalConfig.usePomelo) {
        return;
      }

      dataReport$2.pomeloState({
        state: 3
      }); //获取当前小组sdk类型

      var cloudResponse = await getCloudData(window.zby_sdk_req_get_cloud_params);
      var new_target_sdk_type = cloudResponse.data.sdkName;

      if (window.target_sdk_type) {
        //正在切换中,等待切换
        defaultApi$1.writeLog('reJoin changing -- wait_changed');
        return;
      } else if (!window.target_sdk_type && window.current_sdk_type !== new_target_sdk_type) {
        //未在切换中,且当前SDK类型和小组不一致:进行切换SDK
        defaultApi$1.writeLog("reJoin : \u65AD\u7EBF\u91CD\u8FDE\uFF0C\u51C6\u5907\u6267\u884C\u5207\u6362 SDK to ".concat(new_target_sdk_type));
        zbysdk$1.changeSDK(1);
      } else {
        var _this$initParams = this.initParams,
            roomId = _this$initParams.roomId,
            userId = _this$initParams.userId,
            userName = _this$initParams.userName,
            institutionId = _this$initParams.institutionId,
            role = _this$initParams.role; //一致:重进

        defaultApi$1.writeLog('reJoin : SDK一致, 重进');
        var baseInfo = {
          roomId: roomId,
          userId: userId,
          userName: userName,
          institutionId: institutionId,
          role: role
        };
        this.sendJoin(baseInfo);
        this.sendAddStream(baseInfo);
        this.sendUpdateStreamDeviceStatus(Object.assign({}, baseInfo, {
          deviceType: dict.getDeviceTypeKey('video'),
          deviceStatus: dict.getDeviceStatusKey(userAndDeviceStatusInfo && userAndDeviceStatusInfo.camera ? 'open' : 'closed')
        }));
        this.sendUpdateStreamDeviceStatus(Object.assign({}, baseInfo, {
          deviceType: dict.getDeviceTypeKey('audio'),
          deviceStatus: dict.getDeviceStatusKey(userAndDeviceStatusInfo && userAndDeviceStatusInfo.microPhone ? 'open' : 'closed')
        }));
      }
    }
  }]);

  return ChannelClient;
}();

var channelClient = new ChannelClient();

/*
 * @Author: why
 * @Date: 2019-08-08 19:33:44
 * @LastEditors: why
 * @LastEditTime: 2019-09-10 17:06:12
 * @Description: 
 */
var callMethod$8 = cb$1(liveExt.name);

/*
 * @Author: why
 * @Date: 2019-08-08 19:33:44
 * @LastEditors: why
 * @LastEditTime: 2019-09-11 15:35:34
 * @Description: 
 */
var sdkVale$1 = {
  zego: 0,
  talrtc: 1,
  trtc: 2,
  rtc: 3
};
var liveBaseApi = {
  getLiveSdkVersion: async function getLiveSdkVersion() {
    return callMethod$8('GetLiveSdkVersion', {});
  },
  isStreamAudioMuted: async function isStreamAudioMuted() {
    return callMethod$8('IsStreamAudioMuted', {});
  },
  isStreamVideoMuted: async function isStreamVideoMuted() {
    return callMethod$8('IsStreamVideoMuted', {});
  },
  //设置相应的sdk声音回调给到tm,解决回放关麦依旧有声音问题
  setAudioCallbackType: async function setAudioCallbackType(sdkType) {
    var audio_source = sdkVale$1[sdkType];
    console.log('setAudioCallbackType audio_source:', audio_source);
    return callMethod$8('SetExternalAudioSource', {
      audio_source: audio_source
    });
  },
  // 初始化
  init: function init() {
    var _arguments = arguments;

    // 加载扩展
    if (EM) {
      return new Promise(function (resolve) {
        console.log('load live sdk');
        EM.Load(liveExt.name, liveExt.version, false, function () {
          console.log('load live sdk success', _arguments);
          resolve();
        });
      });
    }
  }
};

defaultApi$1.writeLog("sdk action: zby-live-sdk loaded, version: ".concat(version));
var useScreenExtendKeys = false;
var isWinX64Flag = false;
var sdkConfig = config;
var sdk_status = -1;
var sdkRetryCount = 0;
var deviceCheckerInitStatus = -1;
var windowObjArr = [['zby_sdk_req_get_cloud_params', 'zbyAVSDK_init_params', 'zbyAVSDK_device_checker_init', 'zby_sdk_cloud_data'], ['zbyAVSDK_init_sdk_type', 'current_sdk_type']];
var confId;
var sdkTypeGroup = ''; // 'tm' / 'zego'

var recordPathMap = {};
var mirrorStatus = null; // 重试初始化

function retryInit(error) {
  var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'init';
  var args = arguments.length > 2 ? arguments[2] : undefined;
  var dealSDKMsg = arguments.length > 3 ? arguments[3] : undefined;
  //通知业务层,初始化失败,重试
  sdkRetryCount++;
  sdk_status = -1;

  if (sdkRetryCount > 3) {
    sdkRetryCount = 0;
    NOTICE.sdkStatus({
      status: 'retry_stop'
    });

    try {
      // console.log('获取云控失败上报加入教室code1',window.zby_sdk_init_params);
      dataReport$2.joinRoomResult({
        code: '1',
        // cloud_api_response: JSON.stringify(window.zby_sdk_cloud_data),
        // cloud_api_response: window.zby_sdk_cloud_data,
        cloud_api_url: "".concat(getApiCloudBaseUrl$1(), "/rtccloud/class/init")
      });
    } catch (e) {
      defaultApi$1.writeLog('获取云控接口失败');
    }
  } else {
    NOTICE.sdkStatus({
      status: "retry_".concat(name),
      count: sdkRetryCount
    });
    defaultApi$1.writeLog("sdk action: retry_".concat(name, ", count: it's the \u3010").concat(sdkRetryCount, "\u3011 retry\uFF0C ").concat(error, " error"));

    if (name === 'init') {
      return zbysdk$1.init(args, dealSDKMsg);
    }

    return zbysdk$1.changeSDK(1);
  }
}
/**
 *  设备状态通知
 * @param {String} deviceType 'audio', 'video'
 * @param {Bollean} operation
 */


function sendDeviceStatus(deviceType, operation) {
  if (window.zbyAVSDK_init_params) {
    var initParams = window.zby_sdk_init_params;
    NOTICE.deviceStatus({
      userId: initParams.userId,
      userName: initParams.userName,
      role: initParams.role,
      //获取设备类型和状态对应的文案,返回给业务层
      deviceType: deviceType,
      deviceStatus: operation ? 'open' : 'closed'
    }); //更新设备状态,摄像头,麦克风 开启/关闭

    channelClient.sendUpdateStreamDeviceStatus(Object.assign({}, initParams, {
      deviceType: dict.getDeviceTypeKey(deviceType),
      deviceStatus: dict.getDeviceStatusKey(operation ? 'open' : 'closed')
    }));
  } else {
    console.log('尚未初始化,无须设备状态同步');
  }
}
/**
 *
 * @param {String} userId
 * @param {String} status 流状态
 */


function noticeStreamStatus(userId, status) {
  NOTICE.streamStatus({
    userId: userId,
    status: status
  });
  defaultApi$1.writeLog("sdk stream status userId: ".concat(JSON.stringify(userId), " ").concat(status));
}

function generateStreamId(userId, groupId) {
  if (!window.zby_sdk_init_params) {
    console.log('缺少初始化参数,无法生成streamId');
  }

  var initParams = window.zby_sdk_init_params;

  if (!initParams) {
    return '';
  }

  return util.getStreamId(_objectSpread({}, initParams, {
    userId: userId,
    groupId: groupId
  }));
}

function caculateDeatailArgs(baseArgs, cloudData, sdkTypeGroup) {
  try {
    var commonArgs = {
      userId: baseArgs.userId + '',
      streamId: util.getStreamId(baseArgs),
      userName: baseArgs.userName || '',
      sid: baseArgs.sid,
      role: baseArgs.role,
      roomId: baseArgs.roomId + '',
      confId: confId,
      userAvatar: baseArgs.userAvatar || '',
      userToken: baseArgs.userToken || '',
      devices: baseArgs.devices,
      env: baseArgs.env,
      businessLinesType: baseArgs.businessLinesType,
      institutionId: baseArgs.institutionId,
      //站立模式:0  / 坐立模式:1
      mode: baseArgs.mode,
      live_id: baseArgs.liveId,
      // 课堂模式,0=小组课/1=新小班
      classMode: +baseArgs.classMode,
      //数据上报班课类型
      liveType: +baseArgs.liveType,
      //是否开启转推功能
      isTurnPush: baseArgs.isTurnPush || false,
      // isSetAEC: baseArgs.isSetAEC || false,
      lecturerStreamId: baseArgs.lecturerStreamId
    };
    var screenSameResolutionKey = useScreenExtendKeys ? 'screenSameResolutionExtend' : 'screenSameResolution';
    var screenSameFpsKey = useScreenExtendKeys ? 'screenSameFpsExtend' : 'screenSameFps';
    var screenSameBitrateKey = useScreenExtendKeys ? 'screenSameBitrateExtend' : 'screenSameBitrate'; //从云控返回值中获取直播相关配置

    var liveConfig = {
      //大画面视频采集码率(取值范围:40kb~2000kb)
      // captureBitrate: +cloudData.captureBitrate,
      //大画面视频采集帧率(取值范围:5~30)
      // captureFps: +cloudData.captureFps,
      //大画面视频编码分辨率
      encodedResolutionWidth: +cloudData.encodedResolution.split('*')[0],
      encodedResolutionHeight: +cloudData.encodedResolution.split('*')[1],
      // 预览画面视频采集码率(取值范围:40kb~300kb)
      encodeCaptureBitrate: +cloudData.encodedBitrate,
      encodeCaptureFps: +cloudData.encodedFps,
      // 预览画面视频采集帧率(取值范围:5~15)
      previewCaptureFps: +cloudData.previewFps,
      // 预览视频编码分辨率
      previewResolutionWidth: +cloudData.previewResolution.split('*')[0],
      previewResolutionHeight: +cloudData.previewResolution.split('*')[1],
      //rtc同屏分辨率
      screenSameResolutionWidth: cloudData[screenSameResolutionKey] ? +cloudData[screenSameResolutionKey].split('*')[0] : 1280,
      screenSameResolutionHeight: cloudData[screenSameResolutionKey] ? +cloudData[screenSameResolutionKey].split('*')[1] : 720,
      //rtc同屏帧率 码率
      screenSameFps: cloudData[screenSameFpsKey] ? +cloudData[screenSameFpsKey] : 15,
      screenSameBitrate: cloudData[screenSameBitrateKey] ? +cloudData[screenSameBitrateKey] : 512000,
      // 转推Rtmp地址
      recordUrl: cloudData.recordUrl,
      aecMode: cloudData.aecMode != null ? cloudData.aecMode : -1,
      noiseSuppressMode: cloudData.noiseSuppressMode != null ? cloudData.noiseSuppressMode : -1
    };
    var detailArgs = {
      rtc: Object.assign({}, commonArgs, liveConfig, {
        extensionVersion: baseArgs.extension.version.rtc,
        appId: cloudData.appId,
        sdkTypeGroup: sdkTypeGroup
      }),
      talrtc: Object.assign({}, commonArgs, liveConfig, {
        extensionVersion: baseArgs.extension.version.talrtc || '1.0.0.0',
        appId: cloudData.appId,
        usersign: 'testsign',
        teacherId: baseArgs.teacherId,
        sdkTypeGroup: sdkTypeGroup
      }),
      nertc: Object.assign({}, commonArgs, liveConfig, {
        extensionVersion: baseArgs.extension.version.talrtc || '1.0.0.0',
        appId: cloudData.appId,
        usersign: 'testsign',
        teacherId: baseArgs.teacherId,
        sdkTypeGroup: sdkTypeGroup
      }),
      volcrtc: Object.assign({}, commonArgs, liveConfig, {
        extensionVersion: baseArgs.extension.version.talrtc || '1.0.0.0',
        appId: cloudData.appId,
        usersign: 'testsign',
        teacherId: baseArgs.teacherId,
        sdkTypeGroup: sdkTypeGroup
      }),
      trtc: Object.assign({}, commonArgs, liveConfig, {
        extensionVersion: baseArgs.extension.version.trtc || '1.0.0.0',
        appId: cloudData.appId,
        usersign: cloudData.txRtcKey,
        sdkTypeGroup: sdkTypeGroup
      }),
      zego: Object.assign({}, commonArgs, liveConfig, {
        extensionVersion: baseArgs.extension.version.zego,
        appId: parseInt(cloudData.appId) || 2251703116,
        appSignature: cloudData.appKey || 'uYsmfJ4F8ERzRNC4ug6lWB/vfU6ffg+/ETRF14vjzs4=',
        businessType: 0,
        nNetType: 1,
        sdkTypeGroup: sdkTypeGroup
      })
    };
    return detailArgs;
  } catch (error) {
    console.error(error);
  }
}
/**
 * SDK 方法 - 对外暴露的接口
 */


var zbysdk$1 = {
  version: version,
  notice: null,
  // 打开监听log
  openListenerLog: false,
  //端上初始化时传的false
  autoChangeSdk: true,
  log_id: null,

  /**
   * 配置设置
   * @param {Object} options 
   * @param {'test' | 'online'} options.env 环境
   * @param {boolean} options.weblog 是否开启日志
   * @param {'saas' | 'xes'} options.businessLinesType 业务线类型 saas:乐读  xes:素养
   */
  setConfig: function setConfig(options) {
    Object.assign(sdkConfig, options);
    Object.assign(this, options);
  },

  /**
   * 设置备用域名
   * @param {{ host: string, port: number }[]} domains 
   */
  setBackupDomains: function setBackupDomains(domains) {
    defaultApi$1.writeLog("sdk action: setBackupDomains ".concat(JSON.stringify(domains)));
    pomeloBackupDomains.length = 0;

    if (Array.isArray(domains)) {
      domains.forEach(function (_ref) {
        var host = _ref.host,
            _ref$port = _ref.port,
            port = _ref$port === void 0 ? 443 : _ref$port;
        pomeloBackupDomains.push({
          host: host,
          port: port
        });
      });
    }
  },
  deviceStatus: {},
  enableLog: function enableLog() {
    var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
    defaultApi$1.writeLog("sdk action: enableLog ".concat(JSON.stringify(enable)));
    config.weblog = !!enable;
  },

  /**
   * 打开美颜,默认不用调用,sdk内部会自动打开
   */
  enableBeauty: function enableBeauty(streamId, idx) {
    defaultApi$1.writeLog("sdk action: enableBeauty, streamId: ".concat(streamId, ", idx: ").concat(idx));
    return zbyAVSDK.enableBeautify(true, streamId, idx);
  },

  /**
   * 关闭美颜
   */
  disableBeauty: function disableBeauty(streamId, idx) {
    defaultApi$1.writeLog("sdk action: disableBeauty, streamId: ".concat(streamId, ", idx: ").concat(idx));
    return zbyAVSDK.enableBeautify(false, streamId, idx);
  },

  /**
   * 设置美颜参数
   * @param {Object} options 
   * @param {number} options.whiten 美白 0-1
   * @param {number} options.dermabrasion 磨皮0-1
   * @param {number} options.lift 窄脸0-1
   * @param {number} options.shave 削脸0-1
   * @param {number} options.eye 大眼0-1
   * @param {number} options.chin 下巴0-1
   * @param {number} options.darkCircle 黑眼圈0-1
   * @param {number} options.nasolabialFolds 法令纹0-1
   * @param {number} options.cheekbone 颧骨0-1
   * @param {number} options.head 小头0-1
   * @param {number} options.eyeBrightness 亮眼0-1
   * @param {number} options.lip 嘴唇 -1 - 1
   * @param {number} options.forehead 发际线 0-1
   * @param {number} options.nose 鼻子 -1 - 1
   * @param {number} options.usm 清晰 0-1
   * @param {string?} streamId 流id
   * @param {number?} idx 流索引
   */
  setBeautify: function setBeautify(options, streamId, idx) {
    defaultApi$1.writeLog("sdk action: setBeautify ".concat(JSON.stringify(options), ", streamId: ").concat(streamId, ", idx: ").concat(idx));
    var result = [];

    for (var key in options) {
      if (typeof options[key] !== 'number' || options[key] < 0 || options[key] > 1) {
        defaultApi$1.writeLog("sdk action: setBeautify options.".concat(key, " value should be between 0 and 1"));
        continue;
      }

      var mode = void 0,
          subMode = 0,
          value = Math.round(options[key] * 100);

      switch (key) {
        case 'whiten':
          mode = 101;
          break;

        case 'dermabrasion':
          mode = 103;
          subMode = 1;
          break;

        case 'lift':
          mode = 201;
          break;

        case 'eye':
          mode = 202;
          break;

        case 'usm':
          mode = 603;
          break;

        default:
          defaultApi$1.writeLog("sdk action: setBeautify options.".concat(key, " not support yet"));
          break;
      }

      if (!mode) {
        continue;
      }

      result.push(zbyAVSDK.setBeautifyParam2(mode, subMode, value, streamId, idx));
    }

    return Promise.all(result);
  },

  /**
   * 设置背景
   * @param {Object} options 
   * @param {'image' | 'blur' | 'transparent'} options.type 背景类型
   * @param {string?} options.path 图片地址
   * @param {string?} streamId 流id
   * @param {number?} idx 流索引
   */
  setBackground: function setBackground(options, streamId, idx) {
    defaultApi$1.writeLog("sdk action: setBackground ".concat(JSON.stringify(options), ", streamId: ").concat(streamId, ", idx: ").concat(idx));

    if (!options || !options.type) {
      var res1 = zbyAVSDK.setBeautifyParam2(605, 1, 0, streamId, idx); // 关闭背景虚化

      var res2 = zbyAVSDK.setBeautifyParam2(901, 0, 0, streamId, idx); // 关闭自定义背景

      return Promise.all([res1, res2]);
    }

    if (options.type === 'blur') {
      return zbyAVSDK.setBeautifyParam2(605, 1, 100, streamId, idx, options.path);
    }

    if (options.type === 'image') {
      return zbyAVSDK.setBeautifyParam2(901, 0, 100, streamId, idx, options.path);
    }

    return Promise.resolve();
  },
  deviceCheckerInit: async function deviceCheckerInit(cb, extension) {
    var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'test';

    if (!extension) {
      defaultApi$1.writeLog('sdk deviceCheckerInit extension param is required');
    }

    if (deviceCheckerInitStatus > -1) {
      return 'please stop check device first';
    }

    deviceCheckerInitStatus = 0;
    defaultApi$1.writeLog("sdk action: deviceCheckerInit ".concat(JSON.stringify({
      cb: cb,
      extension: extension,
      env: env,
      sdk_version: version
    })));

    if (typeof cb === 'function') {
      zbysdk$1.notice = cb;
    }

    await zbyAVSDK.deviceCheckerInit(extension, env);
    deviceCheckerInitStatus = 1;
    defaultApi$1.writeLog('sdk devices checked');
  },
  // 结束设备检测
  stopCheckDevice: function stopCheckDevice() {
    if (deviceCheckerInitStatus === -1) {
      defaultApi$1.writeLog('please start check device first');
      return 'please start check device first';
    }

    deviceCheckerInitStatus = -1;
    defaultApi$1.writeLog('sdk stop check device');
    return zbyAVSDK.stopCheckDevice();
  },

  /**
   * 
   * @param {Object} args 
   * @param {string} args.institutionId 机构id
   * @param {string} args.roomId 房间id
   * @param {string} args.userId 用户id
   * @param {string} args.role 用户角色
   * @param {string} args.teacherId 辅导流id
   * @param {Object} args.cloudData 云控数据
   * @param {string} args.liveId
   * @param {string} args.sid streamId
   * @param {string} args.userName
   * @param {string} args.userAvatar
   * @param {string} args.userToken
   * @param {Object} args.devices 设备信息
   * @param {'test' | 'online'} args.env 环境
   * @param {'saas' | 'xes'} args.businessLinesType 业务线类型
   * @param {number} args.mode 站立模式:0  / 坐立模式:1
   * @param {number} args.classMode 课堂模式,0=小组课/1=新小班
   * @param {string} args.liveType 数据上报班课类型
   * @param {string} args.isTurnPush 是否开启转推功能
   * @param {string} args.lecturerStreamId 主讲流id,学生端专用字段
   * @param {Function} dealSDKMsg 
   * @returns 
   */
  init: async function init(args, dealSDKMsg) {
    if (sdk_status !== -1) {
      console.log('not allow init');
      dealSDKMsg({
        type: 'error',
        data: {
          message: 'should not start init before init finished'
        }
      });
      return;
    }

    defaultApi$1.writeLog("sdk action: init zby_live_sdk_version : ".concat(version));
    isWinX64Flag = await isWinX64();
    useScreenExtendKeys = !!args.useScreenExtendKeys;
    defaultApi$1.writeLog("sdk action: init args : ".concat(JSON.stringify(args), ", ").concat(isWinX64Flag ? 'winx64' : ''));

    try {
      var argsCopy = JSON.parse(JSON.stringify(args));
      delete argsCopy.cloudData;
      defaultApi$1.writeLog("sdk action: init_argsCopy_args : ".concat(JSON.stringify(argsCopy)));
    } catch (e) {}

    ;
    this.log_id = 0;
    sdk_status = 0; // 初始化参数存入共享

    window.zby_sdk_init_params = args; // 设置confId

    confId = util.getConfId(args.institutionId, args.roomId);

    try {
      toolBaseApi.init();
    } catch (e) {
      defaultApi$1.writeLog("toolBaseApi_Init error: ".concat(e), null, 'error');
    } // try {
    //   await util.getNetworkTimeStamp();
    // } catch(e) {
    //   console.log('getTimeError',e);
    // };
    //使用初始化传入的 env, isHttps 参数


    Object.assign(sdkConfig, args);
    zbysdk$1.notice = dealSDKMsg;

    try {
      var useZego = args.role === 'assistant' || isWinX64Flag; // TODO 辅导端RTMP流不支持云控,默认用zego

      sdkTypeGroup = useZego ? 'zego' : await getAndSetInitParams({
        institutionId: args.institutionId,
        userId: args.userId,
        liveId: args.liveId,
        role: args.role
      });
      defaultApi$1.writeLog("\u4E91\u63A7\u8FD4\u56DE\u7684\u5F53\u524D\u5927\u73ED\u7684sdk\u7C7B\u578B, ".concat(sdkTypeGroup));
    } catch (error) {
      defaultApi$1.writeLog("\u83B7\u53D6\u5927\u73ED\u4E91\u63A7\u521D\u59CB\u5316\u53C2\u6570\u91CC\u9762\u7684sdk\u7C7B\u578B\u5931\u8D25".concat(error));
    }

    var reqParam = {
      clientType: 'pc',
      roomType: 7,
      institutionId: args.institutionId + '',
      roomId: args.roomId + '',
      userType: args.role === 'assistant' ? 'student' : args.role,
      userId: args.userId + '',
      teacherId: args.teacherId + ''
    };
    window.zby_sdk_req_get_cloud_params = reqParam;
    var cloudData;

    if (args.cloudData && args.cloudData.sdkName && args.cloudData.encodedResolution && args.cloudData.previewResolution) {
      cloudData = args.cloudData;
    } else {
      defaultApi$1.writeLog("sdk_init: getCloudData reqParam : ".concat(JSON.stringify(reqParam)));
      var cloudResponse;

      try {
        cloudResponse = await getCloudData(reqParam);
      } catch (error) {
        return retryInit('getCloudData', 'init', args, dealSDKMsg);
      }

      defaultApi$1.writeLog("sdk_init: cloudResponse : ".concat(JSON.stringify(cloudResponse)));

      if (cloudResponse.code === 0 && cloudResponse.data) {
        cloudData = cloudResponse.data;
      } else {
        defaultApi$1.writeLog("sdk_init: get cloudResponse error: ".concat(JSON.stringify(cloudResponse)));
        return false;
      }
    }

    defaultApi$1.writeLog("sdk_init: cloudData : ".concat(JSON.stringify(cloudData)));
    window.zby_sdk_cloud_data = cloudData;
    var detailArgs = caculateDeatailArgs(args, cloudData, sdkTypeGroup);
    var sdk_type = cloudData.sdkName; // let sdk_type = 'zego';

    Object.assign(window.zby_sdk_init_params, cloudData); //通知业务层,初始化完成

    NOTICE.sdkStatus({
      sdk_type: sdk_type,
      status: 'before_init'
    });
    defaultApi$1.writeLog("sdk status : before_init , sdk_type : ".concat(sdk_type));
    await zbyAVSDK.init(sdk_type, detailArgs).catch(function (error) {
      defaultApi$1.writeLog("sdk init AVSDK init_failed ".concat(error));
      return;
    });

    if (args.role === 'assistant' || args.role === 'teacher') {
      defaultApi$1.writeLog('sdk action : init load live sdk - start');
      await liveBaseApi.init();
      defaultApi$1.writeLog('sdk action : init load live sdk - end');

      try {
        // 设置rtmp流的音频采集方式
        if (sdkTypeGroup == 'tm') {
          // tm推RTMP流
          await liveBaseApi.setAudioCallbackType(sdk_type);
        } else {
          if (sdkConfig.classMode === 0) {
            defaultApi$1.writeLog('zego小组课不需要在zby_live_sdk设置声音采集模式');
          } else if (args.role === 'assistant') {
            defaultApi$1.writeLog('辅导端zego推RTMP流, 不需要在zby_live_sdk设置声音采集模式');
          } else {
            // zego推rtmp流
            await zbyAVSDK.setThirdAudioCallbackType(sdk_type);
          }
        }
      } catch (e) {
        defaultApi$1.writeLog("sdk status : setAudioCallbackType , error : ".concat(e));
      }

      ;
    }

    try {
      // dataReport.joinRoom({initParams: JSON.stringify(args)});
      dataReport$2.joinRoom({
        initParams: args
      });
    } catch (e) {}

    ;
    defaultApi$1.writeLog("sdk status : init_finished  , sdk_type : ".concat(sdk_type)); //通知业务层,初始化完成

    NOTICE.sdkStatus({
      sdk_type: sdk_type,
      status: 'init_finished'
    });

    try {
      window.zby_isM1Type = (await isAppleM1()).data.is_Apple_Silicon;
    } catch (error) {
      defaultApi$1.writeLog("sdk action : isAppleM1 error ".concat(JSON.stringify(error)));
    }

    try {
      dataReport$2.initFinished({
        code: 0
      });
    } catch (e) {}

    sdk_status = 1;
    sdkRetryCount = 0; // 缓存初始化信息

    windowObjArr[0].forEach(function (item) {
      if (window[item] !== undefined) {
        localStorage.setItem(item, JSON.stringify(window[item]));
      }
    });
    windowObjArr[1].forEach(function (item) {
      if (window[item] !== undefined) {
        localStorage.setItem(item, window[item]);
      }
    }); //进入信道房间
    // enterChannelRoom({...args, chatUrl: cloudData.chatUrl}, dealSDKMsg);
    // sendInitChannelMsg(args);

    channelClient.joinRoom(_objectSpread({}, args, {
      chatUrl: cloudData.chatUrl,
      guid: window.zby_sdk_init_params.guid
    }), dealSDKMsg, cloudData.chatType);
  },
  // 设置新窗口配置
  setNewWindowConfig: function setNewWindowConfig(args) {
    defaultApi$1.writeLog("sdk action : setNewWindowConfig , args : ".concat(JSON.stringify(args)));
    window.zbyAVSDK_init_sdk_type = args.sdkType;
  },
  // 恢复sdk
  recoverSdk: async function recoverSdk(args, dealSDKMsg) {
    defaultApi$1.writeLog("sdk action : recoverSdk , args : ".concat(JSON.stringify(args))); // 恢复全局变量

    windowObjArr[0].forEach(function (item) {
      var obj = localStorage.getItem(item);

      if (obj && obj.indexOf('{') > -1) {
        try {
          window[item] = JSON.parse(obj);
        } catch (error) {}
      }
    });
    var cloudData;

    if (args.cloudData) {
      cloudData = args.cloudData;
    } else {
      try {
        cloudData = JSON.parse(localStorage.getItem('zby_sdk_cloud_data'));
      } catch (error) {}
    }

    windowObjArr[1].forEach(function (item) {
      window[item] = localStorage.getItem(item);
    });
    window.zby_sdk_init_params = args;
    defaultApi$1.writeLog('sdk action : recoverSdk , set window params finished'); // try {
    //   await getLogAddress();
    //   await getAndSetInitParams({institutionId: args.institutionId, userId: args.userId});
    // } catch (error) {
    //   return retryInit('getAndSetInitParams', 'init', args, dealSDKMsg);
    // }
    //使用初始化传入的 env, isHttps 参数

    Object.assign(sdkConfig, args);
    zbysdk$1.notice = dealSDKMsg;
    var detailArgs = caculateDeatailArgs(args, cloudData, sdkTypeGroup);
    await zbyAVSDK.recoverSdk(detailArgs);
    sdk_status = 1; //通知业务层,初始化完成

    NOTICE.sdkStatus({
      sdk_type: window.zbyAVSDK_init_sdk_type,
      status: 'init_finished'
    });
    defaultApi$1.writeLog('sdk action : recoverSdk finished'); //进入信道房间
    // enterChannelRoom({...args, chatUrl: cloudData.chatUrl}, dealSDKMsg);
    // sendInitChannelMsg(args);

    channelClient.joinRoom(_objectSpread({}, args, {
      chatUrl: cloudData.chatUrl
    }), dealSDKMsg, cloudData.chatType);
  },
  // 接收到信道消息,进行切换SDK操作
  // from 0:云控 1:重试 2: 上层调用
  changeSDK: async function changeSDK() {
    var from = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;

    if (!window.zby_sdk_init_params || !window.zby_sdk_req_get_cloud_params) {
      console.log('缺少初始化参数,无法切换SDK');
      return;
    } //重试(2)不走下一步,否则会陷入死循环,如果是reJoin(1)来的,自动走切sdk逻辑,不触发start_sdk_change回调直接切


    if (from < 1) {
      // 通知业务层,切换之前(授课业务逻辑需要,比如老师主动调切sdk,云控走的切sdk全部由老师主动切,修复连麦崩溃)
      NOTICE.sdkStatus({
        sdk_type: window.zbyAVSDK_init_sdk_type,
        status: 'start_sdk_change'
      });
    }

    defaultApi$1.writeLog('sdk status : start_sdk_change');

    if (from === 0 && !this.autoChangeSdk) {
      return;
    }

    var initParams = window.zby_sdk_init_params;
    var nowSdk = window.zbyAVSDK_init_sdk_type;
    var cloudData; //请求云控获取更新后的SDK配置相关信息

    var cloudResponse;

    try {
      cloudResponse = await getCloudData(window.zby_sdk_req_get_cloud_params);
    } catch (error) {
      defaultApi$1.writeLog("changeSDK: getCloudData error ".concat(JSON.stringify(error)));
      return retryInit('getCloudData', 'changeSDK');
    }

    ;
    cloudData = cloudResponse.data;

    if (!cloudData) {
      defaultApi$1.writeLog('changeSDK: getCloudData error, cloudData is null');
      return;
    }

    var changeSDKParam = caculateDeatailArgs(initParams, cloudData, sdkTypeGroup);
    var sdk_type = cloudData.sdkName;
    window.zbyAVSDK_init_params = changeSDKParam;

    if (window.zbyAVSDK_init_sdk_type === sdk_type && sdk_type !== 'talrtc') {
      console.log('%cchangeSDK :和本地SDK一致,不切换:' + sdk_type, 'color:blue');
      defaultApi$1.writeLog("sdk: change sdk action , target is the same as local , will not change sdk to ".concat(sdk_type));
      window.target_sdk_type = null;
      return;
    } else {
      window.target_sdk_type = sdk_type;
      defaultApi$1.writeLog("sdk action: changeSDK to  sdk_type : ".concat(sdk_type, ", sdk status : start_change "));
    } // 通知业务层,切换之前


    NOTICE.sdkStatus({
      sdk_type: window.zbyAVSDK_init_sdk_type,
      target_sdk_type: sdk_type,
      status: 'before_sdk_change'
    });
    defaultApi$1.writeLog("sdk status : before_sdk_change  to sdk_type : ".concat(sdk_type)); // try {
    //   dataReport.sdkChange({
    //     from: window.zbyAVSDK_init_sdk_type,
    //     to: sdk_type
    //   });
    // } catch (e){};
    // //切换SDK之前,先停止转推

    if (window.zbyAVSDK_init_params[sdk_type].isTurnPush) {
      zbyAVSDK.turnPush('stop');
    }

    ;
    sdk_status = 0;
    console.log('%c执行SDK切换' + sdk_type, 'color:blue');

    try {
      channelClient.sendRemoveStream(window.zby_sdk_init_params);
      channelClient.sendLeave(window.zby_sdk_init_params);
      await zbyAVSDK.changeSDK({
        sdk_type: sdk_type
      });
    } catch (error) {
      defaultApi$1.writeLog("changeSDK error : ".concat(JSON.stringify(error)));
      window.target_sdk_type = null;
    }

    if (mirrorStatus !== null) {
      // 如果之前有镜像,切sdk之后,重新设置镜像
      await zbyAVSDK.setMirrorStatus(mirrorStatus);
    }

    if (window.zby_sdk_init_params.role === 'assistant' || window.zby_sdk_init_params.role === 'teacher') {
      try {
        console.log('开始设置rtmp声音回调', sdk_type); // 设置rtmp流的音频采集方式

        if (sdkTypeGroup == 'tm') {
          // tm推RTMP流
          await liveBaseApi.setAudioCallbackType(sdk_type);
        } else {
          if (sdkConfig.classMode === 0) {
            defaultApi$1.writeLog('zego小组课不需要在zby_live_sdk设置声音采集模式');
          } else if (initParams.role === 'assistant') {
            defaultApi$1.writeLog('辅导端zego推RTMP流, 不需要在zby_live_sdk设置声音采集模式');
          } else {
            // zego推rtmp流
            await zbyAVSDK.setThirdAudioCallbackType(sdk_type);
          }
        }
      } catch (error) {
        defaultApi$1.writeLog("setAudioCallbackType error : ".concat(JSON.stringify(error)));
      }
    }

    try {
      dataReport$2.sdkChange({
        from: nowSdk,
        to: sdk_type
      });
    } catch (e) {}

    ;
    console.log('%cSDK切换完毕' + sdk_type, 'color:blue');
    sdkRetryCount = 0;
    sdk_status = 1;
    window.target_sdk_type = null; // 通知业务层,切换完成

    NOTICE.sdkStatus({
      sdk_type: sdk_type,
      status: 'sdk_changed'
    });
    defaultApi$1.writeLog("sdk status : sdk_changed  , sdk_type : ".concat(sdk_type));

    if (globalConfig.usePomelo) {
      // 如果切换SDK之后,usePomelo为true,重新进入信道
      channelClient.joinRoom(_objectSpread({}, initParams, {
        chatUrl: cloudData.chatUrl
      }), zbysdk$1.notice, cloudData.chatType);
    } else {
      channelClient.leaveRoom();
    } //切换SDK 完成后,先发送 join消息


    channelClient.sendJoin(initParams); // 打开本地摄像头, 并开始推流后, 老师视频和麦克风状态变为'开启', 即true
    //切换完成之后,学生重新推流
    // if (window.zby_sdk_init_params.role === 'student') {

    console.log('%c执行打开摄像头和推流:' + sdk_type, 'color:blue');

    if (sdkTypeGroup == 'zego' && (initParams.role == 'assistant' || sdkConfig.classMode === 0 && initParams.role == 'teacher')) {
      defaultApi$1.writeLog('zego小组课云控切rtc流sdk,不重新设置摄像头麦克风打开状态(设备状态在pyzx设置的,zby拿不到状态)');
    } else {
      if (typeof userAndDeviceStatusInfo.camera === 'boolean') {
        await zbysdk$1.openOrCloseCamera(userAndDeviceStatusInfo.camera);
      }

      if (typeof userAndDeviceStatusInfo.microPhone === 'boolean') {
        await zbysdk$1.openOrCloseMicrophone(userAndDeviceStatusInfo.microPhone);
      }
    }

    if (userAndDeviceStatusInfo.isPushingFlow) {
      await zbysdk$1.startPushFlow();
    }

    var videoSrc = await zbysdk$1.getOrLocateVideo({
      isLocal: true
    });
    NOTICE.updateLocalPreview({
      videoSrc: videoSrc
    });
    defaultApi$1.writeLog("sdk update_local_preview  , videoSrc : ".concat(videoSrc, " "));
  },
  changeGroup: function changeGroup(groupId, channelToken) {
    return this.changeRoom(groupId, channelToken);
  },
  //alias changeGroup
  changeRoom: async function changeRoom(roomId, channelToken) {
    if (!channelToken) {
      console.warn('changeRoom param: channelToken is required !');
      defaultApi$1.writeLog('changeRoom param: channelToken is required !');
      return;
    }

    defaultApi$1.writeLog("sdk action : changeRoom to  roomId : ".concat(roomId)); //业务层停止所有拉流

    window.zby_sdk_init_params.roomId = roomId;
    var initParams = window.zby_sdk_init_params; // 通知业务层,room 切换之前

    zbysdk$1.notice({
      type: 'sdk_status',
      data: {
        sdk_type: window.zbyAVSDK_init_sdk_type,
        target_room_id: roomId,
        status: 'before_room_change'
      }
    });
    defaultApi$1.writeLog("sdk status : before_room_change to roomId ".concat(roomId)); //广播 leave 消息

    channelClient.sendLeave(initParams); //断开信道

    channelClient.leaveRoom(initParams);
    defaultApi$1.writeLog('channle status : leave channel room invoked'); //退出当前流媒体房间

    await zbyAVSDK.leaveRoom(); //获取新小组的云控数据

    var reqParam = {
      clientType: 'pc',
      roomType: 7,
      institutionId: initParams.institutionId + '',
      roomId: initParams.roomId + '',
      userType: initParams.role,
      userId: initParams.userId + '',
      teacherId: initParams.teacherId + ''
    };
    reqParam.sign = util.getVerifySign(reqParam);
    reqParam.main = 2; //暂存请求云控所需参数,为切换SDK作预备

    window.zby_sdk_req_get_cloud_params = reqParam;
    var cloudResponse = await getCloudData(window.zby_sdk_req_get_cloud_params);
    var cloudData = cloudResponse.data;
    var sdk_type = cloudData.sdkName; //SDK重新初始化

    var detailArgs = caculateDeatailArgs(initParams, cloudData);
    await zbyAVSDK.init(sdk_type, detailArgs); //重新进入信道

    initParams.channelToken = channelToken; // enterChannelRoom({...initParams, chatUrl: cloudData.chatUrl});

    defaultApi$1.writeLog('channle status : enter channel room invoked'); // sendInitChannelMsg(initParams);

    channelClient.joinRoom(_objectSpread({}, args, {
      chatUrl: cloudData.chatUrl
    }), dealSDKMsg, cloudData.chatType); // 通知业务层,room 切换之前

    zbysdk$1.notice({
      type: 'sdk_status',
      data: {
        sdk_type: window.zbyAVSDK_init_sdk_type,
        room_id: roomId,
        status: 'room_changed'
      }
    });
    defaultApi$1.writeLog("sdk status : room_changed ,roomId ".concat(roomId));
  },
  setCameraDevice: async function setCameraDevice(deviceId) {
    defaultApi$1.writeLog("sdk action : setCameraDevice --start,deviceId ".concat(deviceId));
    await zbyAVSDK.setCameraDevice(deviceId, 'client');
    defaultApi$1.writeLog("sdk action : setCameraDevice --end,deviceId ".concat(deviceId));
  },
  getCameraDeviceList: async function getCameraDeviceList() {
    defaultApi$1.writeLog('sdk action : getCameraDeviceList ');
    return await zbyAVSDK.getCameraDeviceList();
  },
  openOrCloseCamera: async function openOrCloseCamera(operation) {
    defaultApi$1.writeLog("sdk action : openOrCloseCamera ".concat(operation, " --start"));
    userAndDeviceStatusInfo.camera = operation; // 标记业务操作,不做为设备状态参考

    await zbyAVSDK.openOrCloseCamera(operation);

    try {
      dataReport$2.deviceChange({
        device_type: 1,
        code: operation ? 1 : 0,
        device_name: window.zbyAVSDK_device_checker_init.camera.name,
        device_id: window.zbyAVSDK_device_checker_init.camera.use
      });
    } catch (e) {}

    ; //记录摄像头状态,用作推流类型上报,是否推视频

    this.deviceStatus.camera = operation;
    sdk_status === 1 && sendDeviceStatus('video', operation);
    defaultApi$1.writeLog("sdk action : openOrCloseCamera ".concat(operation, " --end"));
  },
  //推不推画面
  setPushStreamVideo: async function setPushStreamVideo(operation) {
    await zbyAVSDK.setPushStreamVideo(operation);
    defaultApi$1.writeLog("sdk action : setPushStreamVideo  ".concat(operation, " "));
  },
  //看或不看指定用户的视频
  setVideoMute: async function setVideoMute(userId, operation, groupId, streamid) {
    var streamId = streamid || generateStreamId(userId, groupId);
    defaultApi$1.writeLog("sdk action : setVideoMute userId ".concat(userId, ", groupId ").concat(groupId, ", operation ").concat(operation, ", streamId ").concat(streamId));
    await zbyAVSDK.setVideoMute(streamId, operation);
  },
  getOrLocateVideo: async function getOrLocateVideo(args) {
    defaultApi$1.writeLog("sdk action : getOrLocateVideo --start args : ".concat(JSON.stringify(args)));
    var videoSrc = await zbyAVSDK.getOrLocateVideo({
      domId: args.domId,
      isLocal: args.isLocal,
      streamId: args.streamId || args.userId && generateStreamId(args.userId, args.groupId),
      isTeacherNewWindowPreview: args.isTeacherNewWindowPreview
    });
    defaultApi$1.writeLog("sdk getOrLocateVideo successfully, videoSrc : ".concat(videoSrc, " "));
    return videoSrc;
  },
  linkMicReport: async function linkMicReport(args) {
    defaultApi$1.writeLog("sdk action : linkMicReport  args : ".concat(JSON.stringify(args)));
    var name = args.name,
        pull_uid = args.pull_uid,
        trace_id = args.trace_id;
    var pull_uid1 = [];
    pull_uid.forEach(function (item) {
      pull_uid1.push(item + '');
    });

    if (dataReport$2.hasOwnProperty(name)) {
      dataReport$2[name]({
        pull_uid: pull_uid1,
        trace_id: trace_id
      });
    }

    ;
  },

  /**
   * 设置视频采集模式
   * @param {number} type 0:接管模式,输出头像视频;1:非接管模式,输出播放器视频 
   * @returns 
   */
  setVideoCallback: async function setVideoCallback(type) {
    defaultApi$1.writeLog("sdk action : setVideoCallback type:".concat(type));
    return zbyAVSDK.setVideoCallback(type);
  },
  setWaterMark: async function setWaterMark(filePath, x, y, w, h, streamId, idx) {
    var toInt = function toInt(val) {
      var num = Number(val);
      return Number.isFinite(num) ? Math.floor(num) : NaN;
    }; // 参数与初始化前置校验,避免无效调用继续下钻


    if (!filePath || typeof filePath !== 'string') {
      defaultApi$1.writeLog("sdk action : SetWaterMark invalid filePath ".concat(filePath));
      return false;
    }

    var left = toInt(x);
    var top = toInt(y);
    var width = toInt(w);
    var height = toInt(h);

    if ([left, top, width, height].some(function (item) {
      return Number.isNaN(item);
    }) || left < 0 || top < 0 || width <= 0 || height <= 0) {
      defaultApi$1.writeLog("sdk action : SetWaterMark invalid rect params x:".concat(x, ", y:").concat(y, ", w:").concat(w, ", h:").concat(h));
      return false;
    } // 兼容两种初始化路径:
    // 1) 正常入房 init/recoverSdk:会写入 window.zbyAVSDK_init_params
    // 2) 设备检测 deviceCheckerInit:可能不会写入 init_params,但会设置 window.zbyAVSDK_init_sdk_type 并启动引擎
    // 避免在引擎/扩展没启动时就下发水印指令,导致原生侧返回失败、甚至某些情况下触发异常调用链。


    if (!window.zbyAVSDK_init_sdk_type) {
      defaultApi$1.writeLog("sdk action : SetWaterMark failed, sdk not initialized (sdk_status:".concat(sdk_status, ", deviceCheckerInitStatus:").concat(deviceCheckerInitStatus, ")"));
      return false;
    }

    defaultApi$1.writeLog("sdk action : SetWaterMark path:".concat(filePath, ", rect:").concat(JSON.stringify({
      left: left,
      top: top,
      width: width,
      height: height
    }), ", streamId:").concat(streamId, ", idx:").concat(idx));
    return zbyAVSDK.setWaterMark(filePath, left, top, width, height, streamId, idx);
  },
  SetWaterMark: function SetWaterMark(filePath, x, y, w, h, streamId, idx) {
    return this.setWaterMark(filePath, x, y, w, h, streamId, idx);
  },
  startPushFlow: async function startPushFlow(streamid, idx) {
    defaultApi$1.writeLog("sdk action : startPushFlow streamId:".concat(streamid, " idx: ").concat(idx));

    try {
      // dataReport.startPublish({publish_streamid:window.zbyAVSDK_init_params.rtc.streamId});
      streamid && idx ? dataReport$2.startPublish({
        publish_rtc_streamid: streamid
      }) : dataReport$2.startPublish();
    } catch (e) {}

    ;

    if (!idx) {
      userAndDeviceStatusInfo.isPushingFlow = true; // 仅标记业务调用行为,不作为推流成功参考
    }

    await zbyAVSDK.startPushFlow(streamid, idx); // 不重新推流此情况不适用,推流状态跟着设备开关情况改变,以下仅用作数据上报
    // console.log('push_type000',this.deviceStatus.camera,this.deviceStatus.microphone);

    if (this.deviceStatus.camera && this.deviceStatus.microphone) {
      this.deviceStatus.stream_type = 'both';
    } else if (!this.deviceStatus.camera && this.deviceStatus.microphone) {
      this.deviceStatus.stream_type = 'audio';
    } else if (this.deviceStatus.camera && !this.deviceStatus.microphone) {
      this.deviceStatus.stream_type = 'video';
    } else {
      this.deviceStatus.stream_type = 'none';
    } // console.log('push_type111',this.deviceStatus,this.deviceStatus.stream_type);


    var initParams = window.zby_sdk_init_params; // initParams.role === 'teacher' && zbyAVSDK.turnPush('start');

    if (window.zbyAVSDK_init_sdk_type === 'zego' && initParams.role === 'student') {
      //仅当学生为zego类型时,才确保推流成功之后再发join消息
      return new Promise(function (resolve, reject) {
        var timer = setInterval(function () {
          if (window.zegoHasPushFlow) {
            // window.zegoHasPushFlow = 0
            clearInterval(timer);
            resolve();
          }
        }, 300);
      }).then(function () {
        //需要确保处于推流状态才能发送AddStream
        channelClient.sendAddStream(initParams);
      }, function (err) {
        reject(err);
      }).catch(function (err) {
        console.log(err);
      });
    } else {
      //rtc同屏流不走信道 !1
      if (!idx) {
        channelClient.sendAddStream(initParams);
      }
    }
  },
  stopPushFlow: async function stopPushFlow(idx, streamid) {
    defaultApi$1.writeLog("sdk action : stopPushFlow streamid:".concat(streamid, " idx:").concat(idx));

    if (!idx) {
      userAndDeviceStatusInfo.isPushingFlow = false; // 仅标记业务调用行为,不作为推流成功参考
    }

    await zbyAVSDK.stopPushFlow(idx, streamid);

    try {
      streamid && idx ? dataReport$2.stopPublish({
        stop_rtc_streamid: streamid
      }) : dataReport$2.stopPublish(); // dataReport.stopPublish({});
    } catch (error) {}

    ;

    if (window.zby_sdk_init_params.isTurnPush) {
      zbyAVSDK.turnPush('stop');
    }

    ;

    if (!idx) {
      channelClient.sendRemoveStream(window.zby_sdk_init_params);
    }
  },
  initPullFlow: async function initPullFlow(args) {
    defaultApi$1.writeLog("sdk action : initPullFlow ,".concat(JSON.stringify(args)));
    var streamId = args.streamId || generateStreamId(args.userId, args.groupId);
    var mute = args.mute,
        audioOnly = args.audioOnly;
    var streamType = 'none';

    if (mute && audioOnly) {
      streamType = 'none';
    } else if (mute && !audioOnly) {
      streamType = 'video';
    } else if (!mute && audioOnly) {
      streamType = 'audio';
    } else {
      streamType = 'both';
    }

    ;
    var result = zbyAVSDK.initPullFlow(_objectSpread({}, args, {
      streamId: streamId
    })); // defaultApi.writeLog(`sdk action : initPullFlow——result ,${JSON.stringify(result)}`);

    try {
      dataReport$2.startPull({
        pull_uid: args.userId || util.getUidByStreamId(streamId),
        pull_streamid: streamId,
        stream_type: streamType
      });
    } catch (e) {}

    ;

    var _ref2 = await result.videoSrc,
        videoSrc = _ref2.videoSrc,
        playerId = _ref2.playerId;

    defaultApi$1.writeLog("sdk initPullFlow ".concat(JSON.stringify(args), ", streamId : ").concat(streamId, ", result :").concat(result.sdk_type, ": ").concat(videoSrc, " type:").concat(streamType, " playerId:").concat(playerId));

    if (args.needPlayerId) {
      return _objectSpread({
        videoSrc: videoSrc,
        playerId: playerId,
        streamId: streamId
      }, args);
    }

    return videoSrc;
  },
  startPullFlow: async function startPullFlow(userId, groupId) {
    if (typeof userId !== 'number' && typeof userId !== 'string') {
      defaultApi$1.writeLog("sdk action : startPullFlow ,userId : ".concat(JSON.stringify(userId), ", param error"));
      return;
    } else {
      defaultApi$1.writeLog("sdk action : startPullFlow ,userId : ".concat(JSON.stringify(userId), ", begin"));
    }

    var streamId = generateStreamId(userId, groupId);
    await zbyAVSDK.startPullFlow(streamId); // userAndDeviceStatusInfo.ignoreList.delete(userId)

    noticeStreamStatus(userId, 'stream_recover');
    defaultApi$1.writeLog("sdk action : startPullFlow \uFF0CuserId ".concat(userId, ", notice: stream_recover"));
  },
  stopPullFlow: async function stopPullFlow(userId, groupId, recovery, streamid) {
    // const {userId, groupId, recovery, streamid} = args;
    if (typeof userId !== 'number' && typeof userId !== 'string') {
      defaultApi$1.writeLog("sdk action : stopPullFlow ,userId : ".concat(userId, ", groupId: ").concat(groupId, ", param error"));
      return;
    } else {
      defaultApi$1.writeLog("sdk action : stopPullFlow ,userId : ".concat(userId, ", groupId: ").concat(groupId, ", begin"));
    }

    var streamId = streamid || generateStreamId(userId, groupId);
    await zbyAVSDK.stopPullFlow(streamId, recovery);

    try {
      dataReport$2.stopPull({
        pull_uid: userId,
        pull_streamid: streamId
      });
    } catch (e) {}

    ;
    noticeStreamStatus(userId, 'stream_stopped');
    defaultApi$1.writeLog("sdk action : stopPullFlow ,userId : ".concat(userId, ", groupId: ").concat(groupId, ", notice: stream_stopped"));
  },

  /**
   * @function 暂停拉所有的流
   * @return Promise | void
   */
  stopAllPullFlow: async function stopAllPullFlow() {
    defaultApi$1.writeLog('sdk action : stopAllPullFlow begin');
    await zbyAVSDK.stopAllPullFlow();
    defaultApi$1.writeLog('sdk action : stopAllPullFlow end');
  },
  playDestroy: async function playDestroy(userId, groupId) {
    if (typeof userId !== 'number' && typeof userId !== 'string') {
      defaultApi$1.writeLog("sdk action : playDestroy ,userId : ".concat(userId, ", groupId: ").concat(groupId, ", param error"));
      return;
    } else {
      defaultApi$1.writeLog("sdk action : playDestroy ,userId : ".concat(userId, ", groupId: ").concat(groupId, ", begin"));
    }

    var streamId = generateStreamId(userId, groupId);
    await zbyAVSDK.playDestroy(streamId);
    noticeStreamStatus(userId, 'stream_destroy');
    defaultApi$1.writeLog("sdk action : playDestroy ,userId : ".concat(userId, ", groupId: ").concat(groupId, ", notice: stream_destroy"));
  },
  changePullFlow: async function changePullFlow(args) {
    defaultApi$1.writeLog("sdk action : changePullFlow ,".concat(JSON.stringify(args)));
    var streamId = generateStreamId(args.userId, args.groupId);
    var toStreamId = generateStreamId(args.toUserId, args.toGroupId);
    var result = zbyAVSDK.changePullFlow({
      toDomId: args.toDomId,
      streamId: streamId,
      toStreamId: toStreamId
    });

    var _ref3 = await result,
        videoSrc = _ref3.videoSrc,
        playerId = _ref3.playerId;

    defaultApi$1.writeLog("sdk changePullFlow ".concat(JSON.stringify(args), ", streamId : ").concat(streamId, ", toStreamId : ").concat(toStreamId, ", result :").concat(result.sdk_type, ": ").concat(videoSrc));

    if (args.needPlayerId) {
      return {
        videoSrc: videoSrc,
        playerId: playerId
      };
    }

    return videoSrc;
  },
  getSpeakerDeviceList: async function getSpeakerDeviceList() {
    defaultApi$1.writeLog('sdk action : getSpeakerDeviceList');
    return await zbyAVSDK.getSpeakerDeviceList();
  },
  setSpeakerDevice: async function setSpeakerDevice(deviceId) {
    defaultApi$1.writeLog("sdk action : setSpeakerDevice deviceId:".concat(deviceId));
    await zbyAVSDK.setSpeakerDevice(deviceId, 'client');
  },
  getSpeakerDevice: async function getSpeakerDevice() {
    defaultApi$1.writeLog('sdk action : getSpeakerDevice');
    return zbyAVSDK.getSpeakerDevice();
  },
  getSpeakerVolume: async function getSpeakerVolume() {
    defaultApi$1.writeLog('sdk action : getSpeakerVolume ');
    return zbyAVSDK.getSpeakerVolume();
  },
  setSpeakerVolume: async function setSpeakerVolume(volume) {
    await zbyAVSDK.setSpeakerVolume(volume);
    defaultApi$1.writeLog("sdk action : setSpeakerVolume ".concat(volume));
  },
  setSpeakerMute: async function setSpeakerMute(mute) {
    await zbyAVSDK.setSpeakerMute(mute);

    try {
      dataReport$2.deviceChange({
        device_type: 3,
        code: mute ? 0 : 1,
        device_name: window.zbyAVSDK_device_checker_init.speaker.name,
        device_id: window.zbyAVSDK_device_checker_init.speaker.use
      });
    } catch (e) {}

    ;
    defaultApi$1.writeLog("sdk action : setSpeakerMute ".concat(mute));
  },
  openOrCloseCameraAndMicrophone: async function openOrCloseCameraAndMicrophone(type) {
    await zbyAVSDK.openOrCloseCameraAndMicrophone(type);
    defaultApi$1.writeLog("sdk action : openOrCloseCameraAndMicrophone ".concat(type));
  },
  getAppVolume: async function getAppVolume() {
    var volume = await zbyAVSDK.getAppVolume();
    defaultApi$1.writeLog("sdk action : getAppVolume ".concat(volume));
    return volume;
  },
  setAppVolume: async function setAppVolume(volume) {
    await zbyAVSDK.setAppVolume(volume);
    defaultApi$1.writeLog("sdk action : setAppVolume ".concat(volume));
  },
  setAppMute: async function setAppMute(mute) {
    await zbyAVSDK.setAppMute(mute);
    defaultApi$1.writeLog("sdk action : setAppMute ".concat(mute));
  },
  getMicrophoneDeviceList: async function getMicrophoneDeviceList() {
    var microPhoneList = await zbyAVSDK.getMicrophoneDeviceList();
    defaultApi$1.writeLog("sdk action : getMicrophoneDeviceList ".concat(JSON.stringify(microPhoneList)));
    return microPhoneList;
  },
  setMicrophoneDevice: async function setMicrophoneDevice(deviceId) {
    await zbyAVSDK.setMicrophoneDevice(deviceId, 'client');
    defaultApi$1.writeLog("sdk action : setMicrophoneDevice ".concat(deviceId));
  },
  openOrCloseMicrophone: async function openOrCloseMicrophone(operation) {
    defaultApi$1.writeLog("sdk action : openOrCloseMicrophone ".concat(operation, " --start"));
    userAndDeviceStatusInfo.microPhone = operation; // 标记业务操作,不做为设备状态参考

    await zbyAVSDK.openOrCloseMicrophone(operation);

    try {
      dataReport$2.deviceChange({
        device_type: 2,
        code: operation ? 1 : 0,
        device_name: window.zbyAVSDK_device_checker_init.microphone.name,
        device_id: window.zbyAVSDK_device_checker_init.microphone.use
      });
    } catch (e) {}

    ; //记录麦克风状态,用作推流类型上报,是否推声音

    this.deviceStatus.microphone = operation;
    sdk_status === 1 && sendDeviceStatus('audio', operation);
    defaultApi$1.writeLog("sdk action : openOrCloseMicrophone ".concat(operation, " --end"));
  },
  //听或不听指定用户的声音
  setAudioMute: async function setAudioMute(userId, operation, groupId, streamid) {
    var streamId = streamid || generateStreamId(userId, groupId);
    defaultApi$1.writeLog("sdk action : setAudioMute userId ".concat(userId, ", operation ").concat(operation, ", groupId ").concat(groupId, ", streamid ").concat(streamid));
    await zbyAVSDK.setAudioMute(streamId, operation);
  },

  /**
   * @function 是否拉取音频流--通过播放器id控制
   * @param operation:Boolean,必选,true | false
   * @param playerId:Number,必选,播放器id
   * @return Promise | void
   */
  pullAudioFlow: async function pullAudioFlow(playerId, operation, streamid) {
    defaultApi$1.writeLog("sdk action : pullAudioFlow --start playerId ".concat(playerId, ", ").concat(operation, ", streamid ").concat(streamid));
    var streamId = streamid ? streamid : undefined;
    await zbyAVSDK.pullAudioFlow(playerId, operation, streamId);
    defaultApi$1.writeLog("sdk action : pullAudioFlow playerId ".concat(playerId, ", ").concat(operation));
  },
  getMicrophoneVolume: async function getMicrophoneVolume() {
    defaultApi$1.writeLog('sdk action : getMicrophoneVolume');
    return await zbyAVSDK.getMicrophoneVolume();
  },
  setMicrophoneVolume: async function setMicrophoneVolume(volume, mute) {
    await zbyAVSDK.setMicrophoneVolume(volume, mute);
    defaultApi$1.writeLog("sdk action : setMicrophoneVolume ".concat(volume, " ").concat(mute));
  },
  setMicrophoneMute: async function setMicrophoneMute(mute) {
    await zbyAVSDK.setMicrophoneMute(mute);
    defaultApi$1.writeLog("sdk action : setMicrophoneMute ".concat(mute));
  },
  leaveRoom: async function leaveRoom(type) {
    //未初始化完成,无须卸载
    // if (sdk_status === -1) {
    //   zbysdk.notice({
    //     type: 'error',
    //     data: {
    //       message: 'should not leaveRoom before init finished'
    //     }
    //   });
    //   return;
    // }
    defaultApi$1.writeLog('sdk action : leaveRoom'); // if (window.zby_sdk_init_params.role === 'student') {

    channelClient.sendRemoveStream(window.zby_sdk_init_params); // }

    channelClient.sendLeave(window.zby_sdk_init_params);
    channelClient.leaveRoom(); // 重置设备检测初始化状态

    deviceCheckerInitStatus = -1;
    await zbyAVSDK.leaveRoom(type);
    windowObjArr[0].concat(windowObjArr[1]).forEach(function (item) {
      localStorage.removeItem(item);
    });
    sdk_status = -1;

    try {
      dataReport$2.leaveRoom();
    } catch (e) {}

    ;
    defaultApi$1.writeLog('sdk leaveRoom end ,sdk status : uninstall_finished'); //通知业务层,卸载完成

    NOTICE.sdkStatus({
      sdk_type: window.zbyAVSDK_init_sdk_type,
      status: 'uninstall_finished'
    });
    window.zbyAVSDK_device_checker_init = null;
  },
  //崩溃后的销毁引擎,反初始化
  deinit: async function deinit() {
    defaultApi$1.writeLog('sdk action : deinit');
    await zbyAVSDK.deinit();
  },

  /**
   * @function 转推,录课
   * @param type:String 动作类型,必选,'start' | 'stop' | 'pause' | 'resume'
   * @return Promise | void
   */
  turnPush: async function turnPush(cmd) {
    await zbyAVSDK.turnPush(cmd);
    defaultApi$1.writeLog("sdk action : turnPush  ".concat(cmd));
  },
  openMicVolumeCb: function openMicVolumeCb(open) {
    zbyAVSDK.openMicVolumeCb(open);
    defaultApi$1.writeLog("sdk action : openMicVolumeCb  ".concat(open));
  },
  // 开始混流--已废弃
  startMixtStream: function startMixtStream(args) {
    zbyAVSDK.startMixtStream(args);
    defaultApi$1.writeLog("sdk action : startMixtStream, args:  ".concat(JSON.stringify(args)));
  },
  // 结束混流--已废弃
  stopMixtStream: function stopMixtStream(args) {
    zbyAVSDK.stopMixtStream(args);
    defaultApi$1.writeLog("sdk action : stopMixtStream, args:  ".concat(JSON.stringify(args)));
  },
  mixedstuVideo: function mixedstuVideo(stuArray) {
    zbyAVSDK.mixedstuVideo(stuArray);
    defaultApi$1.writeLog("sdk action : mixedstuVideo, stuArray:  ".concat(stuArray));
  },

  /**
   * @function 单路流录制
   * @param  args:Object
   * {
   *  type: String,必选,'start' | 'stop'
   *  groupId: String, 可选,分组id
   *  userId: String, 可选,用户id
   * }
   */
  singleRecord: function singleRecord(args) {
    args.streamId = this.getStreamInfo(args.userId, args.groupId).streamId;
    zbyAVSDK.singleRecord(args);
    defaultApi$1.writeLog("sdk action : singleRecord, args:  ".concat(JSON.stringify(args)));
  },
  //开启拉流音量监听
  startSoundLevelMonitor: function startSoundLevelMonitor() {
    defaultApi$1.writeLog('sdk action : startSoundLevelMonitor --start');
    zbyAVSDK.startSoundLevelMonitor();
    defaultApi$1.writeLog('sdk action : startSoundLevelMonitor --end');
  },

  /**
   * @function 多路转推
   * @param  args:Object
   * {
   *  type: String,必选,'start' | 'stop'
   *  groupId: String, 可选,分组id
   *  userId: String, 可选,用户id
   * }
   */
  recordPublish: async function recordPublish(args) {
    args.streamId = this.getStreamInfo(args.userId, args.groupId).streamId;
    zbyAVSDK.recordPublishTarget(args);
    defaultApi$1.writeLog("sdk action : recordPublish, args:  ".concat(JSON.stringify(args)));
  },

  /**
   * @function 获取视频快照截图所需的 id 数据
   * @param  userId:String 用户 ID
   * @param  roomId:String 房间 ID
   */
  getStreamInfo: function getStreamInfo(userId, roomId) {
    var streamId = generateStreamId(userId, roomId);
    defaultApi$1.writeLog("sdk action :getStreamInfo --start, userId : ".concat(userId, ", roomId: ").concat(roomId));

    if (!userId || userId == window.zby_sdk_init_params.userId) {
      switch (window.current_sdk_type) {
        case 'rtc':
          try {
            dataReport$2.takeSnapShot({
              snapshootId: streamId
            });
          } catch (e) {}

          return {
            streamId: streamId,
            snapshootId: streamId
          };
          break;

        case 'zego':
          try {
            dataReport$2.takeSnapShot({
              getStreamInfoZego: streamId,
              snapshootId: -1
            });
          } catch (e) {}

          return {
            streamId: streamId,
            snapshootId: -1
          };
          break;

        case 'nertc':
        case 'volcrtc':
        case 'talrtc':
          try {
            dataReport$2.takeSnapShot({
              snapshootId: streamId
            });
          } catch (e) {}

          return {
            streamId: streamId,
            snapshootId: -2
          };

        case 'trtc':
          try {
            dataReport$2.takeSnapShot({
              snapshootId: streamId
            });
          } catch (e) {}

          return {
            streamId: streamId,
            snapshootId: -3
          };

        default:
          break;
      }
    }

    var snapshootId = zbyAVSDK.getSnapshootId(streamId);
    defaultApi$1.writeLog("sdk action :getStreamInfo, userId : ".concat(userId, ", snapshootId: ").concat(snapshootId));
    return {
      streamId: streamId,
      snapshootId: snapshootId
    };
  },
  getAllChannelIndex: function getAllChannelIndex() {
    var channelMap = zbyAVSDK.getAllChannelIndex();
    return channelMap;
  },

  /**
   * @function 记录日志
   * @param productName:String 产品名称,必选
   * @param type:String 日志类型,可选,default : 'info',  'debug' | 'info' | 'warnning' | 'error' | 'critical',
   * @param content:String | Object 日志记录主要内容
   */
  log: function log(productName, content) {
    var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'info';

    if (!productName) {
      defaultApi$1.writeLog('sdk action :log methods invoked error, no productName');
      return;
    }

    defaultApi$1.writeLog(content, productName, type);
  },

  /**
   * @function 设置摄像头参数
   * @param {object} args
   * @param {number} args.width:Number 分辨率宽,必选,推荐 1280
   * @param {number} args.height:Number 分辨率高,必选,推荐 720
   * @param {number} args.frameRate:Number 帧率,必选,推荐 15
   * @param {number} idx 采集器索引,必选,主流0,辅流1
   * @param {string} streamId 流id,必选
   * @return Promise | void
   */
  setCameraParams: function setCameraParams(args, idx, streamId) {
    defaultApi$1.writeLog("sdk action: setCameraParam, args: ".concat(JSON.stringify(args)));
    return zbyAVSDK.setCameraParams(args, idx, streamId);
  },
  setEncodeParams: function setEncodeParams(args, idx, streamId) {
    defaultApi$1.writeLog("sdk action: setEncodeParams, args: ".concat(JSON.stringify(args), ", ").concat(idx));
    return zbyAVSDK.setEncodeParams(args, idx, streamId);
  },
  setBitRate: function setBitRate(bitrate, idx, streamId) {
    defaultApi$1.writeLog("sdk action: setBitRate, bitrate: ".concat(bitrate, " ").concat(idx));
    return zbyAVSDK.setBitRate(bitrate, idx, streamId);
  },

  /**
  * @function 本地视频录制
  * @param type 开始/结束
  * @param path 录制路径
  * @return Promise | void
  */
  localRecordVideo: function localRecordVideo(type, path) {
    defaultApi$1.writeLog("sdk action: localRecordVideo, type: ".concat(type, ", path ").concat(path));
    return zbyAVSDK.localRecordVideo(type, path);
  },

  /**
  * @function 本地音频录制
  * @param type 开始/结束
  * @param path 录制路径
  * @return Promise | void
  */
  localRecordAudio: function localRecordAudio(type, path) {
    defaultApi$1.writeLog("sdk action: localRecordAudio, type: ".concat(type, ", path ").concat(path));
    return zbyAVSDK.localRecordAudio(type, path);
  },

  /**
   * @function 开始连麦
   * @param mode:number 采集器默认, 默认0=站立 1=坐立
   * @return Promise | void
   */
  teacherStartLinkMic: async function teacherStartLinkMic(mode) {
    defaultApi$1.writeLog("sdk action: teacherStartLinkMic, mode: ".concat(mode));

    try {
      dataReport$2.avConnect({
        sdk_type: window.zbyAVSDK_init_sdk_type,
        type: 1,
        mode: mode
      });
    } catch (e) {}

    ;
    await zbyAVSDK.teacherStartLinkMic(mode);

    if (mode === 0) {
      await zbyAVSDK.startPreview();
    }

    return this.startPushFlow();
  },

  /**
   * @function 结束连麦
   * @param mode:number 采集器默认, 默认0=站立 1=坐立
   * @return Promise | void
   */
  teacherStopLinkMic: async function teacherStopLinkMic(mode) {
    defaultApi$1.writeLog("sdk action: teacherStopLinkMic, mode: ".concat(mode));

    try {
      dataReport$2.avConnect({
        sdk_type: window.zbyAVSDK_init_sdk_type,
        type: 0,
        mode: mode
      });
    } catch (e) {}

    ;
    await zbyAVSDK.teacherStopLinkMic(mode);

    if (mode === 0) {
      await zbyAVSDK.stopPreview();
    }

    return this.stopPushFlow();
  },
  getSdkStatus: function getSdkStatus() {
    return sdk_status;
  },
  // 获取截屏窗位置
  //设置采集扬声器声音
  setSpeakerCapture: function setSpeakerCapture(deviceId, speaker) {
    defaultApi$1.writeLog("sdk action: setSpeakerCapture, deviceId: ".concat(deviceId, ", speaker: ").concat(speaker));
    return zbyAVSDK.setSpeakerCapture(deviceId, speaker);
  },

  /**
    * @function 设置混流和背景色
    * @param { number }  type  0=不拼接/1=截屏窗+背景图/2=截屏窗+背景图+头像
    * @param { number } id 需要混合的采集器id
    * @param { object } rgb
    * @param { number } rgb.r
    * @param { number } rgb.g
    * @param { number } rgb.b
    * @return: Promise
    */
  setMixStream: function setMixStream(type, id, rgb) {
    defaultApi$1.writeLog("sdk action: setMixStream, type: ".concat(type, ", id: ").concat(id, ", rgb: ").concat(JSON.stringify(rgb)));
    return zbyAVSDK.setMixStream(type, id, rgb);
  },

  /**
    * @function 采集器截图
    * @param { string } fileName 文件名,需要后缀名。例如:333.jpg
    * @return: Promise
    */
  captureSnapShot: function captureSnapShot(fileName) {
    defaultApi$1.writeLog("sdk action: captureSnapShot, fileName: ".concat(fileName));
    return zbyAVSDK.captureSnapShot(fileName);
  },

  /**
    * @function 播放器截图
    * @param { number } id 播放器id
    * @param { string } fileName 文件名,需要后缀名。例如:333.jpg
    * @return: Promise
    */
  playerSnapShot: function playerSnapShot(id, fileName) {
    defaultApi$1.writeLog("sdk action: playerSnapShot, id: ".concat(id, " fileName: ").concat(fileName));
    return zbyAVSDK.playerSnapShot(id, fileName);
  },

  /**
  * @function 保存图片至桌面
  * @param { string } buf //base64编码图片数据
  * @param { string } fileName //图片文件名(带格式后缀)
  * @return: Promise
  */
  saveImgToDesktop: function saveImgToDesktop(buf, fileName) {
    defaultApi$1.writeLog("sdk action: saveImgToDesktop, buf: ".concat(buf, " fileName: ").concat(fileName));
    return toolBaseApi.saveImgToDesktop(buf, fileName);
  },
  //获取设备状态
  getDevicePermissions: async function getDevicePermissions(devicename, devicetype) {
    defaultApi$1.writeLog("sdk action : getDevicePermissions devicename: ".concat(devicename, " devicetype: ").concat(devicetype));

    try {
      var res = await getDevicePermissionsFun(devicename, devicetype);
      return res;
    } catch (error) {}

    ;
    return 'error';
  },
  //打开摄像头&麦克风权限(需要关端重启)
  setMediaPermission: async function setMediaPermission(caremaPermission, microPhonePermission) {
    defaultApi$1.writeLog("sdk action : setMediaPermission caremaPermission: ".concat(caremaPermission, " microPhonePermission: ").concat(microPhonePermission));
    return setMediaPermissionFun(caremaPermission, microPhonePermission);
  },

  /**
  * @function 设置预览镜像状态
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
  */
  setMirrorStatus: function setMirrorStatus(type) {
    defaultApi$1.writeLog("sdk action: setMirrorStatus, type: ".concat(type));

    if (type !== undefined && type !== null) {
      mirrorStatus = type;
    }

    return zbyAVSDK.setMirrorStatus(type);
  },

  /**
  * @function 设置拉流镜像状态
  * @param { boolean } type true=开启 false=关闭
  * @return: Promise
  */
  setPlayViewMirror: function setPlayViewMirror(type, id) {
    defaultApi$1.writeLog("sdk action: setPlayViewMirror, type: ".concat(type, ", id: ").concat(id));
    return zbyAVSDK.setPlayViewMirror(type, id);
  },

  /**
  * @function 设置推流镜像状态
  * @param { boolean } id 采集器Id
  * @param { boolean } mode 1=开启 0=关闭
  * @return: Promise
  */
  setPushViewMirror: function setPushViewMirror(mode) {
    defaultApi$1.writeLog("sdk action: setPushViewMirror, mode: ".concat(mode));

    if (mode !== undefined && mode !== null) {
      mirrorStatus = mode;
    }

    return zbyAVSDK.setPushViewMirror(mode);
  },

  /**
  * @function 开启美颜
  * @return: Promise
  */
  startSenseMe: function startSenseMe() {
    defaultApi$1.writeLog('sdk action: startSenseMe');
    return zbyAVSDK.startSenseMe();
  },

  /**
    * @function 设置美颜参数
    * * @param { number } type  //美颜类型,1、红润强度,3、磨皮强度,4、美白强度,5、大眼,6、瘦脸,7、小脸,8、对比度强度,9、饱和度强度
    * * @param { number } value //美颜数值,有效值范围0~100
    * @return: Promise
  */
  setBeautifyParam: function setBeautifyParam(type, value) {
    defaultApi$1.writeLog("sdk action: setBeautifyParam, type: ".concat(type, ",value: ").concat(value));
    return zbyAVSDK.setBeautifyParam(type, value);
  },

  /**
   * 
   * @param {'UseLoopbackDefault' | 'UseDefaultDevice'} key 
   * @param {'enable'} value 
   * @returns {Promise<void> | undefined}
   */
  setEngineConfig: function setEngineConfig(key, value) {
    defaultApi$1.writeLog("sdk action: setEngineConfig, key: ".concat(key, ",value: ").concat(value));
    return zbyAVSDK.setEngineConfig(key, value);
  },

  /**
    * @function 关闭美颜
    * @return: Promise
  */
  endSenseMe: function endSenseMe() {
    defaultApi$1.writeLog('sdk action: endSenseMe');
    return zbyAVSDK.endSenseMe();
  },

  /**
  * @function zego40路拉流混音接口
  * @param { number } mixMode //混流模式  0=关闭混流  1=开启混流
  * @param { array } userIdArr //要突出声音的userId的数组集合
  * @return: Promise
  */
  setAudioMixMode: function setAudioMixMode(mixMode, userIdArr) {
    var streamIdArr = [];

    if (userIdArr.length > 0) {
      userIdArr.forEach(function (item) {
        streamIdArr.push(generateStreamId(item));
      });
    }

    defaultApi$1.writeLog("sdk action: setAudioMixMode mixMode:".concat(mixMode, " userIdArr:").concat(userIdArr, " streamIdArr:").concat(streamIdArr));
    return zbyAVSDK.setAudioMixMode(mixMode, streamIdArr);
  },
  //获取TalMedia.dll版本号&&获取zegoAvkit.dll版本号
  getSDKVersion: function getSDKVersion() {
    defaultApi$1.writeLog('sdk action: getSDKVersion');
    return zbyAVSDK.getSDKVersion();
  },
  //获取TalMedia内核版本号,zego同getSDKVersion
  getSDKCoreVersion: function getSDKCoreVersion() {
    defaultApi$1.writeLog('sdk action: getSDKVersion');
    return zbyAVSDK.getSDKCoreVersion();
  },
  //获取摄像头所支持的分辨率
  getCameraSupportedResolution: function getCameraSupportedResolution(deviceId) {
    defaultApi$1.writeLog("sdk action: getCameraSupportedResolution deviceId: ".concat(deviceId));
    return zbyAVSDK.getCameraSupportedResolution(deviceId);
  },
  //开启rtc同屏
  startMultiScreen: function startMultiScreen() {
    defaultApi$1.writeLog('sdk action: startMultiScreen');
    return zbyAVSDK.startMultiScreen();
  },
  //开启高光时刻
  startHighlight: function startHighlight(enable) {
    defaultApi$1.writeLog("sdk action: startHighlight enable:".concat(enable));
    return zbyAVSDK.enableHighlight(enable);
  },
  //开启外部音频采集
  startAudioExCapture: function startAudioExCapture() {
    defaultApi$1.writeLog('sdk action: startAudioExCapture');
    return zbyAVSDK.startAudioExCapture();
  },

  /**
   * 第四路流类型设置
   * @param {number} type 6: 视频:主流 音频:麦克风+扬声器 7: 外部音频源,外部视频源,数据来源player
   * @param {number} idx
   * @returns 
   */
  setFourthStreamType: function setFourthStreamType(type, idx, streamId) {
    defaultApi$1.writeLog("sdk action: setFourthStreamType type:".concat(type, " idx:").concat(idx, ", streamId: ").concat(streamId));
    return zbyAVSDK.setFourthStreamType(type, idx, streamId);
  },
  //RTC同屏 辅助通道音频类型
  setAUXAudioType: function setAUXAudioType(type) {
    defaultApi$1.writeLog('sdk action: setAUXAudioType');
    return zbyAVSDK.setAUXAudioType(type);
  },

  /**
   * RTC同屏 录制通道音频类型
   * @param {number} type 
   * @param {string} streamId 
   * @returns 
   */
  setThirdAudioType: function setThirdAudioType(type, streamId) {
    defaultApi$1.writeLog('sdk action: setThirdAudioType');
    return zbyAVSDK.setThirdAudioType(type, streamId);
  },
  //超级体验课录制通道音频类型

  /**
   * @param {number} type default 32
   * @returns 
   */
  setThirdAudioType2: function setThirdAudioType2() {
    var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 32;
    defaultApi$1.writeLog('sdk action: setThirdAudioType2');
    return zbyAVSDK.setThirdAudioType2(type);
  },
  setVideoSource: function setVideoSource(idx, type) {
    defaultApi$1.writeLog("sdk action: setVideoSource idx:".concat(idx, " type:").concat(type));
    return zbyAVSDK.setVideoSource(idx, type);
  },
  //发送sei
  sendMediaSideInfo: function sendMediaSideInfo(info) {
    defaultApi$1.writeLog('sdk action: sendMediaSideInfo');
    return zbyAVSDK.sendMediaSideInfo(info);
  },

  /**
   * 设置录制路径
   * @param {number} idx 
   * @param {string} path 需要unicode转码
   * @returns 
   */
  setRecordPath: async function setRecordPath(idx, path) {
    defaultApi$1.writeLog("sdk action: setRecordPath idx:".concat(idx, " path:").concat(path));
    recordPathMap[idx] = path;
  },

  /**
   * 获取录制路径
   * @param {number} idx 
   * @returns {Promise<{record_path: string}>}
   */
  getRecordPath: async function getRecordPath(idx) {
    defaultApi$1.writeLog("sdk action: getRecordPath idx:".concat(idx));
    return recordPathMap[idx];
  },

  /**
   * 获取桌面路径
   * @returns {Promise<{desktop_path: string}>}
   */
  getDesktopPath: async function getDesktopPath() {
    defaultApi$1.writeLog('sdk action: getDesktopPath');
    return zbyAVSDK.getDesktopPath();
  },

  /**
   * @function 开始录制
   * @param {1 | 2} 录制文件类型 可选。1:flv  2:mp4 默认mp4 
   * @param {string} 录制文件名称 可选
   * @param {number} 0:主流(摄像头、麦克风) 1:辅流(屏幕流) 2:rtmp 默认录制通道
   * @returns {Promise<void>}
   */
  startCaptureRecord: async function startCaptureRecord() {
    var fileType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2;
    var fileName = arguments.length > 1 ? arguments[1] : undefined;
    var idx = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
    defaultApi$1.writeLog("sdk action: startCaptureRecord fileType:".concat(fileType, " fileName:").concat(fileName, " idx:").concat(idx)); // 格式化fileType

    fileType = Number(fileType);

    if (fileType !== 1 && fileType !== 2) {
      fileType = 2;
    } // 格式化idx


    if (typeof idx !== 'number') {
      defaultApi$1.writeLog("sdk action: startCaptureRecord idx:".concat(idx, " error"), null, 'error');
      throw new Error('idx must be a number');
    }

    return zbyAVSDK.startCaptureRecord(fileName, fileType, idx, recordPathMap[idx]);
  },

  /**
   * @function 结束录制
   * @param {number} 录制推流通道 idx 必选
   * @returns {Promise<void>}
   */
  stopCaptureRecord: async function stopCaptureRecord() {
    var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2;
    defaultApi$1.writeLog("sdk action: stopCaptureRecord idx:".concat(idx));
    return zbyAVSDK.stopCaptureRecord(idx);
  },

  /**
  * 获取麦克风响度 返回值范围[-28.0, -18.0]
  * @returns {Promise<number>}
  */
  getMicrophoneLoudness: function getMicrophoneLoudness() {
    defaultApi$1.writeLog('sdk action: getMicrophoneLoudness');
    return zbyAVSDK.getMicrophoneLoudness();
  },

  /**
   * @function 获取当前扬声器id
   * @returns {Promise<string | null>}
   */
  getCurrentSpeakerId: function getCurrentSpeakerId() {
    defaultApi$1.writeLog('sdk action: getCurrentSpeakerId');
    return zbyAVSDK.getCurrentSpeakerId();
  },

  /**
   * @function 获取当前麦克风id
   * @returns {Promise<string | null>}
   */
  getCurrentMicrophoneId: function getCurrentMicrophoneId() {
    defaultApi$1.writeLog('sdk action: getCurrentMicrophoneId');
    return zbyAVSDK.getCurrentMicrophoneId();
  },

  /**
   * @function 获取当前摄像头id
   * @returns {Promise<string | null>}
   */
  getCurrentCameraId: function getCurrentCameraId() {
    defaultApi$1.writeLog('sdk action: getCurrentCameraId');
    return zbyAVSDK.getCurrentCameraId();
  },

  /**
   * 开启 AI 功能
   *
   * @param {Object} config AI 功能配置参数对象
   * @param {string} config.mTaskType 任务类型 - ASR:语音识别, VOICE_CHAT:AI音频通话, AVATAR_CHAT: 数字人通话, VISION_CHAT: 视觉理解
   * @param {string} config.mRobotId 当前user 对应的机器人id,string类型的整数
   * @param {string} config.extenParams 业务额外数据,JSON格式的字符串
   * @return {Promise<string>} taskid 非""代表调用成功,""代表调用失败
   */
  startAigc: function startAigc(config) {
    defaultApi$1.writeLog("sdk action: startAigc config:".concat(JSON.stringify(config))); //这里是由于xbase判断是int,所以需要转

    config.mRobotId = Number(config.mRobotId);
    return zbyAVSDK.startAigc(config);
  },

  /**
   * 
   * @returns {Promise<void>}
   */
  stopAigc: function stopAigc() {
    defaultApi$1.writeLog('sdk action: stopAigc');
    return zbyAVSDK.stopAigc();
  },

  /**
   * 发送 AI 消息
   *
   * @param {Object} messageInfo AI 消息信息对象
   * @param {string} messageInfo.custom 透传业务参数
   * @param {string} messageInfo.prompt 调用大模型的用户提示词
   * @param {string} messageInfo.type type: 1 update_system_prompt; 3 play_content; 4 prompt_model
   * @return {Promise<number>} 0 代表调用成功,其他代表调用失败
   */
  sendAigcMessage: function sendAigcMessage(messageInfo) {
    defaultApi$1.writeLog("sdk action: sendAigcMessage messageInfo:".concat(JSON.stringify(messageInfo)));

    if (messageInfo && typeof messageInfo.type === 'string') {
      var typeKey = messageInfo.type.trim();
      var typeMap = {
        update_system_prompt: 1,
        interrupt_speaking: 2,
        play_content: 3,
        prompt_model: 4,
        submit_audio: 5,
        // 提交语音
        passthrough_signal: 6 // 业务信令透传

      };
      var normalized = typeKey.toLowerCase();

      if (typeMap[normalized] !== undefined) {
        messageInfo.type = typeMap[normalized];
      }
    }

    return zbyAVSDK.sendAigcMessage(messageInfo);
  },
  // 开关麦克风录制数据回调
  enableMicRecordDataCallback: function enableMicRecordDataCallback() {
    var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
    var sampleRate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 48000;
    var channels = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
    defaultApi$1.writeLog("sdk action: enableMicRecordDataCallback enable:".concat(enable, " sampleRate:").concat(sampleRate, " channels:").concat(channels));
    return zbyAVSDK.enableMicRecordDataCallback(enable, sampleRate, channels);
  },

  /**
   * @function 是否推声音,为了处理音频采集录制时,收到关麦导致的无法收音 
   * @param operation:Boolean 操作类型,false -> 关闭,true -> 打开,必选
   * @return Promise | void
   */
  setPushAudioMute: function setPushAudioMute(operation) {
    defaultApi$1.writeLog("sdk action: setPushAudioMute operation:".concat(operation));
    return zbyAVSDK.setPushAudioMute(operation);
  },

  /**
    * @function 切换sdk类型
    * @return: Promise
  */
  // async changeSdkType(institutionId, sdkName, roomId) {
  //   defaultApi.writeLog(`sdk action: changeSdkType, institutionId: ${institutionId}, sdkName: ${sdkName}, roomId: ${roomId}`);
  //   let code;
  //   let param = {
  //     institutionId,
  //     sdkName,
  //     roomId,
  //     workCode:0
  //   };
  //   let res = await changeSdkInRoom(param);
  //   defaultApi.writeLog(`sdk action: changeSdkType, sdk切换${res.code == 0 ? '成功' : '失败'}, ${JSON.stringify(res)}`);
  //   code = res.code == 0 ? 0 : 1; //0切换成功 ,1切换失败
  //   return code ;
  // },
  changeSdkType: async function changeSdkType(institutionId, sdkName, teacherId, liveId) {
    defaultApi$1.writeLog("sdk action: changeSdkType, institutionId: ".concat(institutionId, ", sdkName: ").concat(sdkName, ", teacherId: ").concat(teacherId, ", liveId: ").concat(liveId));
    var code;
    var param = {
      institutionId: institutionId,
      sdkName: sdkName,
      lectureStreamId: "lecturer_".concat(teacherId, "_").concat(liveId),
      workCode: 0
    };
    var res = await changeSdkInRoom(param);
    defaultApi$1.writeLog("sdk action: changeSdkType, sdk\u5207\u6362".concat(res.code == 0 ? '成功' : '失败', ", ").concat(JSON.stringify(res)));
    code = res.code == 0 ? 0 : 1; //0切换成功 ,1切换失败

    return code;
  },

  /**
   * 获取主流编码分辨率、帧率、码率
   * @returns {{width: number | undefined, height: number | undefined, fps: number | undefined, bitrate: number | undefined}}
   */
  getMainStreamResolution: function getMainStreamResolution() {
    defaultApi$1.writeLog('sdk action: getMainStreamResolution');

    if (!window.zbyAVSDK_init_params || !window.zbyAVSDK_init_sdk_type) {
      return {};
    }

    var config = window.zbyAVSDK_init_params[window.zbyAVSDK_init_sdk_type];

    if (!config) {
      return {};
    }

    return {
      width: config.encodedResolutionWidth,
      height: config.encodedResolutionHeight,
      fps: config.encodeCaptureFps,
      bitrate: config.encodeBitrate
    };
  },

  /**
   * @function 本地截图
   * @param {object} params 截图保存路径
   * @param {string} params.uiChnIndex 流index
   * @param {string} params.pszStreamID 流ID
   */
  takeLocalSnapShot: function takeLocalSnapShot() {
    var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
    defaultApi$1.writeLog("sdk action: takeLocalSnapShot, params: ".concat(JSON.stringify(params)));
    var streamId = params.pszStreamID,
        idx = params.uiChnIndex >> 0;
    return zbyAVSDK.takeLocalSnapShot(streamId, idx).then(function (_ref4) {
      var code = _ref4.code,
          msg = _ref4.msg;
      var data = {
        data: msg,
        result: 1,
        // 截图成功
        channel_index: idx,
        streamId: streamId
      };

      if (!msg || code !== 0) {
        data.data = null;
        data.result = 2; // 截图失败
      }

      defaultApi$1.writeLog("sdk action: takeLocalSnapShot, result: ".concat(data.result));
      return data;
    });
  },

  /**
   * @function 远端截图
   * @param {object} params 截图参数
   * @param {string} params.pszStreamID 流ID
   */
  takeRemoteSnapShot: function takeRemoteSnapShot() {
    var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
    defaultApi$1.writeLog("sdk action: takeRemoteSnapShot, params: ".concat(JSON.stringify(params)));
    var streamId = params.pszStreamID;
    return zbyAVSDK.takeRemoteSnapShot(streamId).then(function (_ref5) {
      var code = _ref5.code,
          msg = _ref5.msg;
      var data = {
        data: msg,
        result: 1,
        // 截图成功
        streamId: streamId
      };

      if (!msg || code !== 0) {
        data.data = null;
        data.result = 2; // 截图失败
      }

      defaultApi$1.writeLog("sdk action: takeRemoteSnapShot, result: ".concat(data.result));
      return data;
    });
  },

  /**
   * 设置前后台状态
   * @param {boolean} isBackground 是否处于后台
   */
  setBackgroundStatus: function setBackgroundStatus$1(isBackground) {
    defaultApi$1.writeLog("sdk action: setBackgroundStatus, isBackground: ".concat(isBackground));
    return setBackgroundStatus(isBackground);
  }
};
window.zbysdk = zbysdk$1;

module.exports = zbysdk$1;