zby-live-sdk
Version:
This is a live SDK for weclassroom.
44,735 lines • 1.39 MB
JavaScript
/*!
* zby-live-sdk.js v1.0.49-beta-20260807
* 2026-8-7 why
* Released By TAL Weclassroom.
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = global || self, global.zbysdk = factory());
}(this, (function () { 'use strict';
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: ''
});
}
};
var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function commonjsRequire () {
throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
}
function unwrapExports (x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}
function createCommonjsModule(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var crypt = createCommonjsModule(function (module) {
(function() {
var base64map
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
crypt = {
// Bit-wise rotation left
rotl: function(n, b) {
return (n << b) | (n >>> (32 - b));
},
// Bit-wise rotation right
rotr: function(n, b) {
return (n << (32 - b)) | (n >>> b);
},
// Swap big-endian to little-endian and vice versa
endian: function(n) {
// If number given, swap endian
if (n.constructor == Number) {
return crypt.rotl(n, 8) & 0x00FF00FF | crypt.rotl(n, 24) & 0xFF00FF00;
}
// Else, assume array and swap all items
for (var i = 0; i < n.length; i++)
n[i] = crypt.endian(n[i]);
return n;
},
// Generate an array of any length of random bytes
randomBytes: function(n) {
for (var bytes = []; n > 0; n--)
bytes.push(Math.floor(Math.random() * 256));
return bytes;
},
// Convert a byte array to big-endian 32-bit words
bytesToWords: function(bytes) {
for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
words[b >>> 5] |= bytes[i] << (24 - b % 32);
return words;
},
// Convert big-endian 32-bit words to a byte array
wordsToBytes: function(words) {
for (var bytes = [], b = 0; b < words.length * 32; b += 8)
bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
return bytes;
},
// Convert a byte array to a hex string
bytesToHex: function(bytes) {
for (var hex = [], i = 0; i < bytes.length; i++) {
hex.push((bytes[i] >>> 4).toString(16));
hex.push((bytes[i] & 0xF).toString(16));
}
return hex.join('');
},
// Convert a hex string to a byte array
hexToBytes: function(hex) {
for (var bytes = [], c = 0; c < hex.length; c += 2)
bytes.push(parseInt(hex.substr(c, 2), 16));
return bytes;
},
// Convert a byte array to a base-64 string
bytesToBase64: function(bytes) {
for (var base64 = [], i = 0; i < bytes.length; i += 3) {
var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
for (var j = 0; j < 4; j++)
if (i * 8 + j * 6 <= bytes.length * 8)
base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));
else
base64.push('=');
}
return base64.join('');
},
// Convert a base-64 string to a byte array
base64ToBytes: function(base64) {
// Remove non-base-64 characters
base64 = base64.replace(/[^A-Z0-9+\/]/ig, '');
for (var bytes = [], i = 0, imod4 = 0; i < base64.length;
imod4 = ++i % 4) {
if (imod4 == 0) continue;
bytes.push(((base64map.indexOf(base64.charAt(i - 1))
& (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2))
| (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));
}
return bytes;
}
};
module.exports = crypt;
})();
});
var charenc = {
// UTF-8 encoding
utf8: {
// Convert a string to a byte array
stringToBytes: function(str) {
return charenc.bin.stringToBytes(unescape(encodeURIComponent(str)));
},
// Convert a byte array to a string
bytesToString: function(bytes) {
return decodeURIComponent(escape(charenc.bin.bytesToString(bytes)));
}
},
// Binary encoding
bin: {
// Convert a string to a byte array
stringToBytes: function(str) {
for (var bytes = [], i = 0; i < str.length; i++)
bytes.push(str.charCodeAt(i) & 0xFF);
return bytes;
},
// Convert a byte array to a string
bytesToString: function(bytes) {
for (var str = [], i = 0; i < bytes.length; i++)
str.push(String.fromCharCode(bytes[i]));
return str.join('');
}
}
};
var charenc_1 = charenc;
/*!
* Determine if an object is a Buffer
*
* @author Feross Aboukhadijeh <https://feross.org>
* @license MIT
*/
// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
var isBuffer_1 = function (obj) {
return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
};
function isBuffer (obj) {
return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}
// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}
var md5 = createCommonjsModule(function (module) {
(function(){
var crypt$1 = crypt,
utf8 = charenc_1.utf8,
isBuffer = isBuffer_1,
bin = charenc_1.bin,
// The core
md5 = function (message, options) {
// Convert to byte array
if (message.constructor == String)
if (options && options.encoding === 'binary')
message = bin.stringToBytes(message);
else
message = utf8.stringToBytes(message);
else if (isBuffer(message))
message = Array.prototype.slice.call(message, 0);
else if (!Array.isArray(message))
message = message.toString();
// else, assume byte array already
var m = crypt$1.bytesToWords(message),
l = message.length * 8,
a = 1732584193,
b = -271733879,
c = -1732584194,
d = 271733878;
// Swap endian
for (var i = 0; i < m.length; i++) {
m[i] = ((m[i] << 8) | (m[i] >>> 24)) & 0x00FF00FF |
((m[i] << 24) | (m[i] >>> 8)) & 0xFF00FF00;
}
// Padding
m[l >>> 5] |= 0x80 << (l % 32);
m[(((l + 64) >>> 9) << 4) + 14] = l;
// Method shortcuts
var FF = md5._ff,
GG = md5._gg,
HH = md5._hh,
II = md5._ii;
for (var i = 0; i < m.length; i += 16) {
var aa = a,
bb = b,
cc = c,
dd = d;
a = FF(a, b, c, d, m[i+ 0], 7, -680876936);
d = FF(d, a, b, c, m[i+ 1], 12, -389564586);
c = FF(c, d, a, b, m[i+ 2], 17, 606105819);
b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);
a = FF(a, b, c, d, m[i+ 4], 7, -176418897);
d = FF(d, a, b, c, m[i+ 5], 12, 1200080426);
c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);
b = FF(b, c, d, a, m[i+ 7], 22, -45705983);
a = FF(a, b, c, d, m[i+ 8], 7, 1770035416);
d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);
c = FF(c, d, a, b, m[i+10], 17, -42063);
b = FF(b, c, d, a, m[i+11], 22, -1990404162);
a = FF(a, b, c, d, m[i+12], 7, 1804603682);
d = FF(d, a, b, c, m[i+13], 12, -40341101);
c = FF(c, d, a, b, m[i+14], 17, -1502002290);
b = FF(b, c, d, a, m[i+15], 22, 1236535329);
a = GG(a, b, c, d, m[i+ 1], 5, -165796510);
d = GG(d, a, b, c, m[i+ 6], 9, -1069501632);
c = GG(c, d, a, b, m[i+11], 14, 643717713);
b = GG(b, c, d, a, m[i+ 0], 20, -373897302);
a = GG(a, b, c, d, m[i+ 5], 5, -701558691);
d = GG(d, a, b, c, m[i+10], 9, 38016083);
c = GG(c, d, a, b, m[i+15], 14, -660478335);
b = GG(b, c, d, a, m[i+ 4], 20, -405537848);
a = GG(a, b, c, d, m[i+ 9], 5, 568446438);
d = GG(d, a, b, c, m[i+14], 9, -1019803690);
c = GG(c, d, a, b, m[i+ 3], 14, -187363961);
b = GG(b, c, d, a, m[i+ 8], 20, 1163531501);
a = GG(a, b, c, d, m[i+13], 5, -1444681467);
d = GG(d, a, b, c, m[i+ 2], 9, -51403784);
c = GG(c, d, a, b, m[i+ 7], 14, 1735328473);
b = GG(b, c, d, a, m[i+12], 20, -1926607734);
a = HH(a, b, c, d, m[i+ 5], 4, -378558);
d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);
c = HH(c, d, a, b, m[i+11], 16, 1839030562);
b = HH(b, c, d, a, m[i+14], 23, -35309556);
a = HH(a, b, c, d, m[i+ 1], 4, -1530992060);
d = HH(d, a, b, c, m[i+ 4], 11, 1272893353);
c = HH(c, d, a, b, m[i+ 7], 16, -155497632);
b = HH(b, c, d, a, m[i+10], 23, -1094730640);
a = HH(a, b, c, d, m[i+13], 4, 681279174);
d = HH(d, a, b, c, m[i+ 0], 11, -358537222);
c = HH(c, d, a, b, m[i+ 3], 16, -722521979);
b = HH(b, c, d, a, m[i+ 6], 23, 76029189);
a = HH(a, b, c, d, m[i+ 9], 4, -640364487);
d = HH(d, a, b, c, m[i+12], 11, -421815835);
c = HH(c, d, a, b, m[i+15], 16, 530742520);
b = HH(b, c, d, a, m[i+ 2], 23, -995338651);
a = II(a, b, c, d, m[i+ 0], 6, -198630844);
d = II(d, a, b, c, m[i+ 7], 10, 1126891415);
c = II(c, d, a, b, m[i+14], 15, -1416354905);
b = II(b, c, d, a, m[i+ 5], 21, -57434055);
a = II(a, b, c, d, m[i+12], 6, 1700485571);
d = II(d, a, b, c, m[i+ 3], 10, -1894986606);
c = II(c, d, a, b, m[i+10], 15, -1051523);
b = II(b, c, d, a, m[i+ 1], 21, -2054922799);
a = II(a, b, c, d, m[i+ 8], 6, 1873313359);
d = II(d, a, b, c, m[i+15], 10, -30611744);
c = II(c, d, a, b, m[i+ 6], 15, -1560198380);
b = II(b, c, d, a, m[i+13], 21, 1309151649);
a = II(a, b, c, d, m[i+ 4], 6, -145523070);
d = II(d, a, b, c, m[i+11], 10, -1120210379);
c = II(c, d, a, b, m[i+ 2], 15, 718787259);
b = II(b, c, d, a, m[i+ 9], 21, -343485551);
a = (a + aa) >>> 0;
b = (b + bb) >>> 0;
c = (c + cc) >>> 0;
d = (d + dd) >>> 0;
}
return crypt$1.endian([a, b, c, d]);
};
// Auxiliary functions
md5._ff = function (a, b, c, d, x, s, t) {
var n = a + (b & c | ~b & d) + (x >>> 0) + t;
return ((n << s) | (n >>> (32 - s))) + b;
};
md5._gg = function (a, b, c, d, x, s, t) {
var n = a + (b & d | c & ~d) + (x >>> 0) + t;
return ((n << s) | (n >>> (32 - s))) + b;
};
md5._hh = function (a, b, c, d, x, s, t) {
var n = a + (b ^ c ^ d) + (x >>> 0) + t;
return ((n << s) | (n >>> (32 - s))) + b;
};
md5._ii = function (a, b, c, d, x, s, t) {
var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
return ((n << s) | (n >>> (32 - s))) + b;
};
// Package private blocksize
md5._blocksize = 16;
md5._digestsize = 16;
module.exports = function (message, options) {
if (message === undefined || message === null)
throw new Error('Illegal argument ' + message);
var digestbytes = crypt$1.wordsToBytes(md5(message, options));
return options && options.asBytes ? digestbytes :
options && options.asString ? bin.bytesToString(digestbytes) :
crypt$1.bytesToHex(digestbytes);
};
})();
});
/*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)
};
'use strict';
var bind = function bind(fn, thisArg) {
return function wrap() {
var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
return fn.apply(thisArg, args);
};
};
'use strict';
/*global toString:true*/
// utils is a library of generic helper functions non-specific to axios
var toString = Object.prototype.toString;
/**
* Determine if a value is an Array
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an Array, otherwise false
*/
function isArray(val) {
return toString.call(val) === '[object Array]';
}
/**
* Determine if a value is an ArrayBuffer
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an ArrayBuffer, otherwise false
*/
function isArrayBuffer(val) {
return toString.call(val) === '[object ArrayBuffer]';
}
/**
* Determine if a value is a FormData
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an FormData, otherwise false
*/
function isFormData(val) {
return (typeof FormData !== 'undefined') && (val instanceof FormData);
}
/**
* Determine if a value is a view on an ArrayBuffer
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
*/
function isArrayBufferView(val) {
var result;
if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
result = ArrayBuffer.isView(val);
} else {
result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);
}
return result;
}
/**
* Determine if a value is a String
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a String, otherwise false
*/
function isString(val) {
return typeof val === 'string';
}
/**
* Determine if a value is a Number
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Number, otherwise false
*/
function isNumber(val) {
return typeof val === 'number';
}
/**
* Determine if a value is undefined
*
* @param {Object} val The value to test
* @returns {boolean} True if the value is undefined, otherwise false
*/
function isUndefined(val) {
return typeof val === 'undefined';
}
/**
* Determine if a value is an Object
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an Object, otherwise false
*/
function isObject(val) {
return val !== null && typeof val === 'object';
}
/**
* Determine if a value is a Date
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Date, otherwise false
*/
function isDate(val) {
return toString.call(val) === '[object Date]';
}
/**
* Determine if a value is a File
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a File, otherwise false
*/
function isFile(val) {
return toString.call(val) === '[object File]';
}
/**
* Determine if a value is a Blob
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Blob, otherwise false
*/
function isBlob(val) {
return toString.call(val) === '[object Blob]';
}
/**
* Determine if a value is a Function
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Function, otherwise false
*/
function isFunction(val) {
return toString.call(val) === '[object Function]';
}
/**
* Determine if a value is a Stream
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Stream, otherwise false
*/
function isStream(val) {
return isObject(val) && isFunction(val.pipe);
}
/**
* Determine if a value is a URLSearchParams object
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a URLSearchParams object, otherwise false
*/
function isURLSearchParams(val) {
return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
}
/**
* Trim excess whitespace off the beginning and end of a string
*
* @param {String} str The String to trim
* @returns {String} The String freed of excess whitespace
*/
function trim(str) {
return str.replace(/^\s*/, '').replace(/\s*$/, '');
}
/**
* Determine if we're running in a standard browser environment
*
* This allows axios to run in a web worker, and react-native.
* Both environments support XMLHttpRequest, but not fully standard globals.
*
* web workers:
* typeof window -> undefined
* typeof document -> undefined
*
* react-native:
* navigator.product -> 'ReactNative'
*/
function isStandardBrowserEnv() {
if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
return false;
}
return (
typeof window !== 'undefined' &&
typeof document !== 'undefined'
);
}
/**
* Iterate over an Array or an Object invoking a function for each item.
*
* If `obj` is an Array callback will be called passing
* the value, index, and complete array for each item.
*
* If 'obj' is an Object callback will be called passing
* the value, key, and complete object for each property.
*
* @param {Object|Array} obj The object to iterate
* @param {Function} fn The callback to invoke for each item
*/
function forEach(obj, fn) {
// Don't bother if no value provided
if (obj === null || typeof obj === 'undefined') {
return;
}
// Force an array if not already something iterable
if (typeof obj !== 'object') {
/*eslint no-param-reassign:0*/
obj = [obj];
}
if (isArray(obj)) {
// Iterate over array values
for (var i = 0, l = obj.length; i < l; i++) {
fn.call(null, obj[i], i, obj);
}
} else {
// Iterate over object keys
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
fn.call(null, obj[key], key, obj);
}
}
}
}
/**
* Accepts varargs expecting each argument to be an object, then
* immutably merges the properties of each object and returns result.
*
* When multiple objects contain the same key the later object in
* the arguments list will take precedence.
*
* Example:
*
* ```js
* var result = merge({foo: 123}, {foo: 456});
* console.log(result.foo); // outputs 456
* ```
*
* @param {Object} obj1 Object to merge
* @returns {Object} Result of all merge properties
*/
function merge(/* obj1, obj2, obj3, ... */) {
var result = {};
function assignValue(val, key) {
if (typeof result[key] === 'object' && typeof val === 'object') {
result[key] = merge(result[key], val);
} else {
result[key] = val;
}
}
for (var i = 0, l = arguments.length; i < l; i++) {
forEach(arguments[i], assignValue);
}
return result;
}
/**
* Extends object a by mutably adding to it the properties of object b.
*
* @param {Object} a The object to be extended
* @param {Object} b The object to copy properties from
* @param {Object} thisArg The object to bind function to
* @return {Object} The resulting value of object a
*/
function extend(a, b, thisArg) {
forEach(b, function assignValue(val, key) {
if (thisArg && typeof val === 'function') {
a[key] = bind(val, thisArg);
} else {
a[key] = val;
}
});
return a;
}
var utils = {
isArray: isArray,
isArrayBuffer: isArrayBuffer,
isBuffer: isBuffer_1,
isFormData: isFormData,
isArrayBufferView: isArrayBufferView,
isString: isString,
isNumber: isNumber,
isObject: isObject,
isUndefined: isUndefined,
isDate: isDate,
isFile: isFile,
isBlob: isBlob,
isFunction: isFunction,
isStream: isStream,
isURLSearchParams: isURLSearchParams,
isStandardBrowserEnv: isStandardBrowserEnv,
forEach: forEach,
merge: merge,
extend: extend,
trim: trim
};
var utils_1 = utils.isArray;
var utils_2 = utils.isArrayBuffer;
var utils_3 = utils.isBuffer;
var utils_4 = utils.isFormData;
var utils_5 = utils.isArrayBufferView;
var utils_6 = utils.isString;
var utils_7 = utils.isNumber;
var utils_8 = utils.isObject;
var utils_9 = utils.isUndefined;
var utils_10 = utils.isDate;
var utils_11 = utils.isFile;
var utils_12 = utils.isBlob;
var utils_13 = utils.isFunction;
var utils_14 = utils.isStream;
var utils_15 = utils.isURLSearchParams;
var utils_16 = utils.isStandardBrowserEnv;
var utils_17 = utils.forEach;
var utils_18 = utils.merge;
var utils_19 = utils.extend;
var utils_20 = utils.trim;
'use strict';
var normalizeHeaderName = function normalizeHeaderName(headers, normalizedName) {
utils.forEach(headers, function processHeader(value, name) {
if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
headers[normalizedName] = value;
delete headers[name];
}
});
};
'use strict';
/**
* Update an Error with the specified config, error code, and response.
*
* @param {Error} error The error to update.
* @param {Object} config The config.
* @param {string} [code] The error code (for example, 'ECONNABORTED').
* @param {Object} [request] The request.
* @param {Object} [response] The response.
* @returns {Error} The error.
*/
var enhanceError = function enhanceError(error, config, code, request, response) {
error.config = config;
if (code) {
error.code = code;
}
error.request = request;
error.response = response;
return error;
};
'use strict';
/**
* Create an Error with the specified message, config, error code, request and response.
*
* @param {string} message The error message.
* @param {Object} config The config.
* @param {string} [code] The error code (for example, 'ECONNABORTED').
* @param {Object} [request] The request.
* @param {Object} [response] The response.
* @returns {Error} The created error.
*/
var createError = function createError(message, config, code, request, response) {
var error = new Error(message);
return enhanceError(error, config, code, request, response);
};
'use strict';
/**
* Resolve or reject a Promise based on response status.
*
* @param {Function} resolve A function that resolves the promise.
* @param {Function} reject A function that rejects the promise.
* @param {object} response The response.
*/
var settle = function settle(resolve, reject, response) {
var validateStatus = response.config.validateStatus;
// Note: status is not exposed by XDomainRequest
if (!response.status || !validateStatus || validateStatus(response.status)) {
resolve(response);
} else {
reject(createError(
'Request failed with status code ' + response.status,
response.config,
null,
response.request,
response
));
}
};
'use strict';
function encode(val) {
return encodeURIComponent(val).
replace(/%40/gi, '@').
replace(/%3A/gi, ':').
replace(/%24/g, '$').
replace(/%2C/gi, ',').
replace(/%20/g, '+').
replace(/%5B/gi, '[').
replace(/%5D/gi, ']');
}
/**
* Build a URL by appending params to the end
*
* @param {string} url The base of the url (e.g., http://www.google.com)
* @param {object} [params] The params to be appended
* @returns {string} The formatted url
*/
var buildURL = function buildURL(url, params, paramsSerializer) {
/*eslint no-param-reassign:0*/
if (!params) {
return url;
}
var serializedParams;
if (paramsSerializer) {
serializedParams = paramsSerializer(params);
} else if (utils.isURLSearchParams(params)) {
serializedParams = params.toString();
} else {
var parts = [];
utils.forEach(params, function serialize(val, key) {
if (val === null || typeof val === 'undefined') {
return;
}
if (utils.isArray(val)) {
key = key + '[]';
} else {
val = [val];
}
utils.forEach(val, function parseValue(v) {
if (utils.isDate(v)) {
v = v.toISOString();
} else if (utils.isObject(v)) {
v = JSON.stringify(v);
}
parts.push(encode(key) + '=' + encode(v));
});
});
serializedParams = parts.join('&');
}
if (serializedParams) {
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
}
return url;
};
'use strict';
// Headers whose duplicates are ignored by node
// c.f. https://nodejs.org/api/http.html#http_message_headers
var ignoreDuplicateOf = [
'age', 'authorization', 'content-length', 'content-type', 'etag',
'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
'last-modified', 'location', 'max-forwards', 'proxy-authorization',
'referer', 'retry-after', 'user-agent'
];
/**
* Parse headers into an object
*
* ```
* Date: Wed, 27 Aug 2014 08:58:49 GMT
* Content-Type: application/json
* Connection: keep-alive
* Transfer-Encoding: chunked
* ```
*
* @param {String} headers Headers needing to be parsed
* @returns {Object} Headers parsed into an object
*/
var parseHeaders = function parseHeaders(headers) {
var parsed = {};
var key;
var val;
var i;
if (!headers) { return parsed; }
utils.forEach(headers.split('\n'), function parser(line) {
i = line.indexOf(':');
key = utils.trim(line.substr(0, i)).toLowerCase();
val = utils.trim(line.substr(i + 1));
if (key) {
if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
return;
}
if (key === 'set-cookie') {
parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
} else {
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
}
}
});
return parsed;
};
'use strict';
var isURLSameOrigin = (
utils.isStandardBrowserEnv() ?
// Standard browser envs have full support of the APIs needed to test
// whether the request URL is of the same origin as current location.
(function standardBrowserEnv() {
var msie = /(msie|trident)/i.test(navigator.userAgent);
var urlParsingNode = document.createElement('a');
var originURL;
/**
* Parse a URL to discover it's components
*
* @param {String} url The URL to be parsed
* @returns {Object}
*/
function resolveURL(url) {
var href = url;
if (msie) {
// IE needs attribute set twice to normalize properties
urlParsingNode.setAttribute('href', href);
href = urlParsingNode.href;
}
urlParsingNode.setAttribute('href', href);
// urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
return {
href: urlParsingNode.href,
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
host: urlParsingNode.host,
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
hostname: urlParsingNode.hostname,
port: urlParsingNode.port,
pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
urlParsingNode.pathname :
'/' + urlParsingNode.pathname
};
}
originURL = resolveURL(window.location.href);
/**
* Determine if a URL shares the same origin as the current location
*
* @param {String} requestURL The URL to test
* @returns {boolean} True if URL shares the same origin, otherwise false
*/
return function isURLSameOrigin(requestURL) {
var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
return (parsed.protocol === originURL.protocol &&
parsed.host === originURL.host);
};
})() :
// Non standard browser envs (web workers, react-native) lack needed support.
(function nonStandardBrowserEnv() {
return function isURLSameOrigin() {
return true;
};
})()
);
'use strict';
// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
function E() {
this.message = 'String contains an invalid character';
}
E.prototype = new Error;
E.prototype.code = 5;
E.prototype.name = 'InvalidCharacterError';
function btoa$1(input) {
var str = String(input);
var output = '';
for (
// initialize result and counter
var block, charCode, idx = 0, map = chars;
// if the next str index does not exist:
// change the mapping table to "="
// check if d has no fractional digits
str.charAt(idx | 0) || (map = '=', idx % 1);
// "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
output += map.charAt(63 & block >> 8 - idx % 1 * 8)
) {
charCode = str.charCodeAt(idx += 3 / 4);
if (charCode > 0xFF) {
throw new E();
}
block = block << 8 | charCode;
}
return output;
}
var btoa_1 = btoa$1;
'use strict';
var cookies = (
utils.isStandardBrowserEnv() ?
// Standard browser envs support document.cookie
(function standardBrowserEnv() {
return {
write: function write(name, value, expires, path, domain, secure) {
var cookie = [];
cookie.push(name + '=' + encodeURIComponent(value));
if (utils.isNumber(expires)) {
cookie.push('expires=' + new Date(expires).toGMTString());
}
if (utils.isString(path)) {
cookie.push('path=' + path);
}
if (utils.isString(domain)) {
cookie.push('domain=' + domain);
}
if (secure === true) {
cookie.push('secure');
}
document.cookie = cookie.join('; ');
},
read: function read(name) {
var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
return (match ? decodeURIComponent(match[3]) : null);
},
remove: function remove(name) {
this.write(name, '', Date.now() - 86400000);
}
};
})() :
// Non standard browser env (web workers, react-native) lack needed support.
(function nonStandardBrowserEnv() {
return {
write: function write() {},
read: function read() { return null; },
remove: function remove() {}
};
})()
);
'use strict';
var btoa$2 = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || btoa_1;
var xhr = function xhrAdapter(config) {
return new Promise(function dispatchXhrRequest(resolve, reject) {
var requestData = config.data;
var requestHeaders = config.headers;
if (utils.isFormData(requestData)) {
delete requestHeaders['Content-Type']; // Let the browser set it
}
var request = new XMLHttpRequest();
var loadEvent = 'onreadystatechange';
var xDomain = false;
// For IE 8/9 CORS support
// Only supports POST and GET calls and doesn't returns the response headers.
// DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.
if (process.env.NODE_ENV !== 'test' &&
typeof window !== 'undefined' &&
window.XDomainRequest && !('withCredentials' in request) &&
!isURLSameOrigin(config.url)) {
request = new window.XDomainRequest();
loadEvent = 'onload';
xDomain = true;
request.onprogress = function handleProgress() {};
request.ontimeout = function handleTimeout() {};
}
// HTTP basic authentication
if (config.auth) {
var username = config.auth.username || '';
var password = config.auth.password || '';
requestHeaders.Authorization = 'Basic ' + btoa$2(username + ':' + password);
}
request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);
// Set the request timeout in MS
request.timeout = config.timeout;
// Listen for ready state
request[loadEvent] = function handleLoad() {
if (!request || (request.readyState !== 4 && !xDomain)) {
return;
}
// The request errored out and we didn't get a response, this will be
// handled by onerror instead
// With one exception: request that using file: protocol, most browsers
// will return status as 0 even though it's a successful request
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
return;
}
// Prepare the response
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
var response = {
data: responseData,
// IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)
status: request.status === 1223 ? 204 : request.status,
statusText: request.status === 1223 ? 'No Content' : request.statusText,
headers: responseHeaders,
config: config,
request: request
};
settle(resolve, reject, response);
// Clean up request
request = null;
};
// Handle low level network errors
request.onerror = function handleError() {
// Real errors are hidden from us by the browser
// onerror should only fire if it's a network error
reject(createError('Network Error', config, null, request));
// Clean up request
request = null;
};
// Handle timeout
request.ontimeout = function handleTimeout() {
reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',
request));
// Clean up request
request = null;
};
// Add xsrf header
// This is only done if running in a standard browser environment.
// Specifically not if we're in a web worker, or react-native.
if (utils.isStandardBrowserEnv()) {
var cookies$1 = cookies;
// Add xsrf header
var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?
cookies$1.read(config.xsrfCookieName) :
undefined;
if (xsrfValue) {
requestHeaders[config.xsrfHeaderName] = xsrfValue;
}
}
// Add headers to the request
if ('setRequestHeader' in request) {
utils.forEach(requestHeaders, function setRequestHeader(val, key) {
if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
// Remove Content-Type if data is undefined
delete requestHeaders[key];
} else {
// Otherwise add header to the request
request.setRequestHeader(key, val);
}
});
}
// Add withCredentials to request if needed
if (config.withCredentials) {
request.withCredentials = true;
}
// Add responseType to request if needed
if (config.responseType) {
try {
request.responseType = config.responseType;
} catch (e) {
// Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
// But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
if (config.responseType !== 'json') {
throw e;
}
}
}
// Handle progress if needed
if (typeof config.onDownloadProgress === 'function') {
request.addEventListener('progress', config.onDownloadProgress);
}
// Not all browsers support upload events
if (typeof config.onUploadProgress === 'function' && request.upload) {
request.upload.addEventListener('progress', config.onUploadProgress);
}
if (config.cancelToken) {
// Handle cancellation
config.cancelToken.promise.then(function onCanceled(cancel) {
if (!request) {
return;
}
request.abort();
reject(cancel);
// Clean up request
request = null;
});
}
if (requestData === undefined) {
requestData = null;
}
// Send the request
request.send(requestData);
});
};
'use strict';
var DEFAULT_CONTENT_TYPE = {
'Content-Type': 'application/x-www-form-urlencoded'
};
function setContentTypeIfUnset(headers, value) {
if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
headers['Content-Type'] = value;
}
}
function getDefaultAdapter() {
var adapter;
if (typeof XMLHttpRequest !== 'undefined') {
// For browsers use XHR adapter
adapter = xhr;
} else if (typeof process !== 'undefined') {
// For node use HTTP adapter
adapter = xhr;
}
return adapter;
}
var defaults = {
adapter: getDefaultAdapter(),
transformRequest: [function transformRequest(data, headers) {
normalizeHeaderName(headers, 'Content-Type');
if (utils.isFormData(data) ||
utils.isArrayBuffer(data) ||
utils.isBuffer(data) ||
utils.isStream(data) ||
utils.isFile(data) ||
utils.isBlob(data)
) {
return data;
}
if (utils.isArrayBufferView(data)) {
return data.buffer;
}
if (utils.isURLSearchParams(data)) {
setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
return data.toString();
}
if (utils.isObject(data)) {
setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
return JSON.stringify(data);
}
return data;
}],
transformResponse: [function transformResponse(data) {
/*eslint no-param-reassign:0*/
if (typeof data === 'string') {
try {
data = JSON.parse(data);
} catch (e) { /* Ignore */ }
}
return data;
}],
/**
* A timeout in milliseconds to abort a request. If set to 0 (default) a
* timeout is not created.
*/
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
validateStatus: function validateStatus(status) {
return status >= 200 && status < 300;
}
};
defaults.headers = {
common: {
'Accept': 'application/json, text/plain, */*'
}
};
utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
defaults.headers[method] = {};
});
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
});
var defaults_1 = defaults;
'use strict';
function InterceptorManager() {
this.handlers = [];
}
/**
* Add a new interceptor to the stack
*
* @param {Function} fulfilled The function to handle `then` for a `Promise`
* @param {Function} rejected The function to handle `reject` for a `Promise`
*
* @return {Number} An ID used to remove interceptor later
*/
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
this.handlers.push({
fulfilled: fulfilled,
rejected: rejected
});
return this.handlers.length - 1;
};
/**
* Remove an interceptor from the stack
*
* @param {Number} id The ID that was returned by `use`
*/
InterceptorManager.prototype.eject = function eject(id) {
if (this.handlers[id]) {
this.handlers[id] = null;
}
};
/**
* Iterate over all the registered interceptors
*
* This method is particularly useful for skipping over any
* interceptors that may have become `null` calling `eject`.
*
* @param {Function} fn The function to call for each interceptor
*/
InterceptorManager.prototype.forEach = function forEach(fn) {
utils.forEach(this.handlers, function forEachHandler(h) {
if (h !== null) {
fn(h);
}
});
};
var InterceptorManager_1 = InterceptorManager;
'use strict';
/**
* Transform the data for a request or a response
*
* @param {Object|String} data The data to be transformed
* @param {Array} headers The headers for the request or response
* @param {Array|Function} fns A single function or Array of functions
* @returns {*} The resulting transformed data
*/
var transformData = function transformData(data, headers, fns) {
/*eslint no-param-reassign:0*/
utils.forEach(fns, function transform(fn) {
data = fn(data, headers);
});
return data;
};
'use strict';
var isCancel = function isCancel(value) {
return !!(value && value.__CANCEL__);
};
'use strict';
/**
* Determines whether the specified URL is absolute
*
* @param {string} url The URL to test
* @returns {boolean} True if the specified URL is absolute, otherwise false
*/
var isAbsoluteURL = function isAbsoluteURL(url) {
// A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
// RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
// by any combination of letters, digits, plus, period, or hyphen.
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
};
'use strict';
/**
* Creates a new URL by combining the specified URLs
*
* @param {string} baseURL The base URL
* @param {string} relativeURL The relative URL
* @returns {string} The combined URL
*/
var combineURLs = function combineURLs(baseURL, relativeURL) {
return relativeURL
? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
: baseURL;
};
'use strict';
/**
* Throws a `Cancel` if cancellation has been requested.
*/
function throwIfCancellationRequested(config) {
if (config.cancelToken) {
config.cancelToken.throwIfRequested();
}
}
/**
* Dispatch a request to the server using the configured adapter.
*
* @param {object} config The config that is to be used for the request
* @returns {Promise} The Promise to be fulfilled
*/
var dispatchRequest = function dispatchRequest(config) {
throwIfCancellationRequested(config);
// Support baseURL config
if (config.baseURL && !isAbsoluteURL(config.url)) {
config.url = combineURLs(config.baseURL, config.url);
}
// Ensure headers exist
config.headers = config.headers || {};
// Transform request data
config.data = transformData(
config.data,
config.headers,
config.transformRequest
);
// Flatten headers
config.headers = utils.merge(
config.headers.common || {},
config.headers[config.method] || {},
config.headers || {}
);
utils.forEach(
['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
function cleanHeaderConfig(method) {
delete config.headers[method];
}
);
var adapter = config.adapter || defaults_1.adapter;
return adapter(config).then(function onAdapterResolution(response) {
throwIfCancellationRequested(config);
// Transform response data
response.data = transformData(
response.data,
response.headers,
config.transformResponse
);
return response;
}, function onAdapterRejection(reason) {
if (!isCancel(reason)) {
throwIfCancellationRequested(config);
// Transform response data
if (reason && reason.response) {
reason.response.data = transformData(
reason.response.data,
reason.response.headers,
config.transformResponse
);
}
}
return Promise.reject(reason);
});
};
'use strict';
/**
* Create a new instance of Axios
*
* @param {Object} instanceConfig The default config for the instance
*/
function Axios(instanceConfig) {
this.defaults = instanceConfig;
this.interceptors = {
request: new InterceptorManager_1(),
response: new InterceptorManager_1()
};
}
/**
* Dispatch a request
*
* @param {Object} config The config specific for this request (merged with this.defaults)
*/
Axios.prototype.request = function request(config) {
/*eslint no-param-reassign:0*/
// Allow for axios('example/url'[, config]) a la fetch API
if (typeof config === 'string') {
config = utils.merge({
url: arguments[0]
}, arguments[1]);
}
config = utils.merge(defaults_1, {method: 'get'}, this.defaults, config);
config.method = config.method.toLowerCase();
// Hook up interceptors middleware
var chain = [dispatchRequest, undefined];
var promise = Promise.resolve(config);
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
chain.unshift(interceptor.fulfilled, interceptor.rejected);
});
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
chain.push(interceptor.fulfilled, interceptor.rejected);
});
while (chain.length) {
promise = promise.then(chain.shift(), chain.shift());
}
return promise;
};
// Provide aliases for supported request methods
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
/*eslint func-names:0*/
Axios.prototype[method] = function(url, config) {
return this.request(utils.merge(config || {}, {
method: method,
url: url
}));
};
});
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
/*eslint func-names:0*/
Axios.prototype[method] = function(url, data, config) {
return this.request(utils.merge(config || {}, {
method: method,
url: url,
data: data
}));
};
});
var Axios_1 = Axios;
'use strict';
/**
* A `Cancel` is an object that is thrown when an operation is canceled.
*
* @class
* @param {string=} message The message.
*/
function Cancel(message) {
this.message = message;
}
Cancel.prototype.toString = function toString() {
return 'Cancel' + (this.message ? ': ' + this.message : '');
};
Cancel.prototype.__CANCEL__ = true;
var Cancel_1 = Cancel;
'use strict';
/**
* A `CancelToken` is an object that can be used to request cancellation of an operation.
*
* @class
* @param {Function} executor The executor function.
*/
function CancelToken(executor) {
if (typeof executor !== 'function') {
throw new TypeError('executor must be a function.');
}
var resolvePromise;
this.promise = new Promise(function promiseExecutor(resolve) {
resolvePromise = resolve;
});
var token = this;
executor(function cancel(message) {
if (token.reason) {
// Cancellation has already been requested
return;
}
token.reason = new Cancel_1(message);
resolvePromise(token.reason);
});
}
/**
* Throws a `Cancel` if cancellation has been requested.
*/
CancelToken.prototype.throwIfRequested = function throwIfRequested() {
if (this.reason) {
throw this.reason;
}
};
/**
* Returns an object that contains a new `CancelToken` and a function that, when called,
* cancels the `CancelToken`.
*/
CancelToken.source = function source() {
var cancel;
var token = new CancelToken(function executor(c) {
cancel = c;
});
return {
token: token,
cancel: cancel
};
};
var CancelToken_1 = CancelToken;
'use strict';
/**
* Syntactic sugar for invoking a function and expanding an array for arguments.
*
* Common use case would be to use `Function.prototype.apply`.
*
* ```js
* function f(x, y, z) {}
* var args = [1, 2, 3];
* f.apply(null, args);
* ```
*
* With `spread` this example can be re-written.
*
* ```js
* spread(function(x, y, z) {})([1, 2, 3]);
* ```
*
* @param {Function} callback
* @returns {Function}
*/
var spread = function spread(callback) {
return function wrap(arr) {
return callback.apply(null, arr);
};
};
'use strict';
/**
* Create an instance of Axios
*
* @param {Object} defaultConfig The default config for the instance
* @return {Axios} A new instance of Axios
*/
function createInstance(defaultConfig) {
var context = new Axios_1(defaultConfig);
var instance = bind(Axios_1.prototype.request, context);
// Copy axios.prototype to instance
utils.extend(instance, Axios_1.prototype, context);
// Copy context to instance
utils.extend(instance, context);
return instance;
}
// Create the default instance to be exported
var axios = createInstance(defaults_1);
// Expose Axios class to allow class inheritance
axios.Axios = Axios_1;
// Factory for creating new instances
axios.create = function create(instanceConfig) {
return createInstance(utils.merge(defaults_1, instanceConfig));
};
// Expose Cancel & CancelToken
axios.Cancel = Cancel_1;
axios.CancelToken = CancelToken_1;
axios.isCancel = isCancel;
// Expose all/spread
axios.all = function all(promises) {
return Promise.all(promises);
};
axios.spread = spread;
var axios_1 = axios;
// Allow use of default import syntax in TypeScript
var default_1 = axios;
axios_1.default = default_1;
var axios$1 = axios_1;
'use strict';
var has = Object.prototype.hasOwnProperty;
var isArray$1 = Array.isArray;
var hexTable = (function () {
var array = [];
for (var i = 0; i < 256; ++i) {
array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
}
return array;
}());
var compactQueue = function compactQueue(queue) {
while (queue.length > 1) {
var item = queue.pop();
var obj = item.obj[item.prop];
if (isArray$1(obj)) {
var compacted = [];
for (var j = 0; j < obj.length; ++j) {
if (typeof obj[j] !== 'undefined') {
compacted.push(obj[j]);
}
}
item.obj[item.prop] = compacted;
}
}
};
var arrayToObject = function arrayToObject(source, options) {
var obj = options && options.plainObjects ? Object.create(null) : {};
for (var i = 0; i < source.length; ++i) {
if (typeof source[i] !== 'undefined') {
obj[i] = source[i];
}
}
return obj;
};
var merge$1 = function merge(target, source, options) {
/* eslint no-param-reassign: 0 */
if (!source) {
return target;
}
if (typeof source !== 'object') {
if (isArray$1(target)) {
target.push(source);
} else if (target && typeof target === 'object') {
if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
target[source] = true;
}
} else {
return [target, source];
}
return target;
}
if (!target || typeof target !== 'object') {
return [target].concat(source);
}
var mergeTarget = target;
if (isArray$1(target) && !isArray$1(source)) {
mergeTarget = arrayToObject(target, options);
}
if (isArray$1(target) && isArray$1(source)) {
source.forEach(function (item, i) {
if (has.call(target, i)) {
var targetItem = target[i];
if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
target[i] = merge(targetItem, item, options);
} else {
target.push(item);
}
} else {
target[i] = item;
}
});
return target;
}
return Object.keys(source).reduce(function (acc, key) {
var value = source[key];
if (has.call(acc, key)) {
acc[key] = merge(acc[key], value, options);
} else {
acc[key] = value;
}
return acc;
}, mergeTarget);
};
var assign = function assignSingleSource(target, source) {
return Object.keys(source).reduce(function (acc, key) {
acc[key] = source[key];
return acc;
}, target);
};
var decode = function (str, decoder, charset) {
var strWithoutPlus = str.replace(/\+/g, ' ');
if (charset === 'iso-8859-1') {
// unescape never throws, no try...catch needed:
return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
}
// utf-8
try {
return decodeURIComponent(strWithoutPlus);
} catch (e) {
return strWithoutPlus;
}
};
var encode$1 = function encode(str, defaultEncoder, charset) {
// This code was originally written by Brian White (mscdex) for the io.js core querystring library.
// It has been adapted here for stricter adherence to RFC 3986
if (str.length === 0) {
return str;
}
var string = str;
if (typeof str === 'symbol') {
string = Symbol.prototype.toString.call(str);
} else if (typeof str !== 'string') {
string = String(str);
}
if (charset === 'iso-8859-1') {
return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
});
}
var out = '';
for (var i = 0; i < string.length; ++i) {
var c = string.charCodeAt(i);
if (
c === 0x2D // -
|| c === 0x2E // .
|| c === 0x5F // _
|| c === 0x7E // ~
|| (c >= 0x30 && c <= 0x39) // 0-9
|| (c >= 0x41 && c <= 0x5A) // a-z
|| (c >= 0x61 && c <= 0x7A) // A-Z
) {
out += string.charAt(i);
continue;
}
if (c < 0x80) {
out = out + hexTable[c];
continue;
}
if (c < 0x800) {
out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
continue;
}
if (c < 0xD800 || c >= 0xE000) {
out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
continue;
}
i += 1;
c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
out += hexTable[0xF0 | (c >> 18)]
+ hexTable[0x80 | ((c >> 12) & 0x3F)]
+ hexTable[0x80 | ((c >> 6) & 0x3F)]
+ hexTable[0x80 | (c & 0x3F)];
}
return out;
};
var compact = function compact(value) {
var queue = [{ obj: { o: value }, prop: 'o' }];
var refs = [];
for (var i = 0; i < queue.length; ++i) {
var item = queue[i];
var obj = item.obj[item.prop];
var keys = Object.keys(obj);
for (var j = 0; j < keys.length; ++j) {
var key = keys[j];
var val = obj[key];
if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
queue.push({ obj: obj, prop: key });
refs.push(val);
}
}
}
compactQueue(queue);
return value;
};
var isRegExp = function isRegExp(obj) {
return Object.prototype.toString.call(obj) === '[object RegExp]';
};
var isBuffer$1 = function isBuffer(obj) {
if (!obj || typeof obj !== 'object') {
return false;
}
return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};
var combine = function combine(a, b) {
return [].concat(a, b);
};
var maybeMap = function maybeMap(val, fn) {
if (isArray$1(val)) {
var mapped = [];
for (var i = 0; i < val.length; i += 1) {
mapped.push(fn(val[i]));
}
return mapped;
}
return fn(val);
};
var utils$1 = {
arrayToObject: arrayToObject,
assign: assign,
combine: combine,
compact: compact,
decode: decode,
encode: encode$1,
isBuffer: isBuffer$1,
isRegExp: isRegExp,
maybeMap: maybeMap,
merge: merge$1
};
var utils_1$1 = utils$1.arrayToObject;
var utils_2$1 = utils$1.assign;
var utils_3$1 = utils$1.combine;
var utils_4$1 = utils$1.compact;
var utils_5$1 = utils$1.decode;
var utils_6$1 = utils$1.encode;
var utils_7$1 = utils$1.isBuffer;
var utils_8$1 = utils$1.isRegExp;
var utils_9$1 = utils$1.maybeMap;
var utils_10$1 = utils$1.merge;
'use strict';
var replace = String.prototype.replace;
var percentTwenties = /%20/g;
var Format = {
RFC1738: 'RFC1738',
RFC3986: 'RFC3986'
};
var formats = utils$1.assign(
{
'default': Format.RFC3986,
formatters: {
RFC1738: function (value) {
return replace.call(value, percentTwenties, '+');
},
RFC3986: function (value) {
return String(value);
}
}
},
Format
);
'use strict';
var has$1 = Object.prototype.hasOwnProperty;
var arrayPrefixGenerators = {
brackets: function brackets(prefix) {
return prefix + '[]';
},
comma: 'comma',
indices: function indices(prefix, key) {
return prefix + '[' + key + ']';
},
repeat: function repeat(prefix) {
return prefix;
}
};
var isArray$2 = Array.isArray;
var push = Array.prototype.push;
var pushToArray = function (arr, valueOrArray) {
push.apply(arr, isArray$2(valueOrArray) ? valueOrArray : [valueOrArray]);
};
var toISO = Date.prototype.toISOString;
var defaultFormat = formats['default'];
var defaults$1 = {
addQueryPrefix: false,
allowDots: false,
charset: 'utf-8',
charsetSentinel: false,
delimiter: '&',
encode: true,
encoder: utils$1.encode,
encodeValuesOnly: false,
format: defaultFormat,
formatter: formats.formatters[defaultFormat],
// deprecated
indices: false,
serializeDate: function serializeDate(date) {
return toISO.call(date);
},
skipNulls: false,
strictNullHandling: false
};
var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
return typeof v === 'string'
|| typeof v === 'number'
|| typeof v === 'boolean'
|| typeof v === 'symbol'
|| typeof v === 'bigint';
};
var stringify = function stringify(
object,
prefix,
generateArrayPrefix,
strictNullHandling,
skipNulls,
encoder,
filter,
sort,
allowDots,
serializeDate,
formatter,
encodeValuesOnly,
charset
) {
var obj = object;
if (typeof filter === 'function') {
obj = filter(prefix, obj);
} else if (obj instanceof Date) {
obj = serializeDate(obj);
} else if (generateArrayPrefix === 'comma' && isArray$2(obj)) {
obj = utils$1.maybeMap(obj, function (value) {
if (value instanceof Date) {
return serializeDate(value);
}
return value;
}).join(',');
}
if (obj === null) {
if (strictNullHandling) {
return encoder && !encodeValuesOnly ? encoder(prefix, defaults$1.encoder, charset, 'key') : prefix;
}
obj = '';
}
if (isNonNullishPrimitive(obj) || utils$1.isBuffer(obj)) {
if (encoder) {
var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults$1.encoder, charset, 'key');
return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults$1.encoder, charset, 'value'))];
}
return [formatter(prefix) + '=' + formatter(String(obj))];
}
var values = [];
if (typeof obj === 'undefined') {
return values;
}
var objKeys;
if (isArray$2(filter)) {
objKeys = filter;
} else {
var keys = Object.keys(obj);
objKeys = sort ? keys.sort(sort) : keys;
}
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
var value = obj[key];
if (skipNulls && value === null) {
continue;
}
var keyPrefix = isArray$2(obj)
? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix
: prefix + (allowDots ? '.' + key : '[' + key + ']');
pushToArray(values, stringify(
value,
keyPrefix,
generateArrayPrefix,
strictNullHandling,
skipNulls,
encoder,
filter,
sort,
allowDots,
serializeDate,
formatter,
encodeValuesOnly,
charset
));
}
return values;
};
var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
if (!opts) {
return defaults$1;
}
if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') {
throw new TypeError('Encoder has to be a function.');
}
var charset = opts.charset || defaults$1.charset;
if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
}
var format = formats['default'];
if (typeof opts.format !== 'undefined') {
if (!has$1.call(formats.formatters, opts.format)) {
throw new TypeError('Unknown format option provided.');
}
format = opts.format;
}
var formatter = formats.formatters[format];
var filter = defaults$1.filter;
if (typeof opts.filter === 'function' || isArray$2(opts.filter)) {
filter = opts.filter;
}
return {
addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults$1.addQueryPrefix,
allowDots: typeof opts.allowDots === 'undefined' ? defaults$1.allowDots : !!opts.allowDots,
charset: charset,
charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults$1.charsetSentinel,
delimiter: typeof opts.delimiter === 'undefined' ? defaults$1.delimiter : opts.delimiter,
encode: typeof opts.encode === 'boolean' ? opts.encode : defaults$1.encode,
encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults$1.encoder,
encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults$1.encodeValuesOnly,
filter: filter,
formatter: formatter,
serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults$1.serializeDate,
skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults$1.skipNulls,
sort: typeof opts.sort === 'function' ? opts.sort : null,
strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults$1.strictNullHandling
};
};
var stringify_1 = function (object, opts) {
var obj = object;
var options = normalizeStringifyOptions(opts);
var objKeys;
var filter;
if (typeof options.filter === 'function') {
filter = options.filter;
obj = filter('', obj);
} else if (isArray$2(options.filter)) {
filter = options.filter;
objKeys = filter;
}
var keys = [];
if (typeof obj !== 'object' || obj === null) {
return '';
}
var arrayFormat;
if (opts && opts.arrayFormat in arrayPrefixGenerators) {
arrayFormat = opts.arrayFormat;
} else if (opts && 'indices' in opts) {
arrayFormat = opts.indices ? 'indices' : 'repeat';
} else {
arrayFormat = 'indices';
}
var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
if (!objKeys) {
objKeys = Object.keys(obj);
}
if (options.sort) {
objKeys.sort(options.sort);
}
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
if (options.skipNulls && obj[key] === null) {
continue;
}
pushToArray(keys, stringify(
obj[key],
key,
generateArrayPrefix,
options.strictNullHandling,
options.skipNulls,
options.encode ? options.encoder : null,
options.filter,
options.sort,
options.allowDots,
options.serializeDate,
options.formatter,
options.encodeValuesOnly,
options.charset
));
}
var joined = keys.join(options.delimiter);
var prefix = options.addQueryPrefix === true ? '?' : '';
if (options.charsetSentinel) {
if (options.charset === 'iso-8859-1') {
// encodeURIComponent('✓'), the "numeric entity" representation of a checkmark
prefix += 'utf8=%26%2310003%3B&';
} else {
// encodeURIComponent('✓')
prefix += 'utf8=%E2%9C%93&';
}
}
return joined.length > 0 ? prefix + joined : '';
};
'use strict';
var has$2 = Object.prototype.hasOwnProperty;
var isArray$3 = Array.isArray;
var defaults$2 = {
allowDots: false,
allowPrototypes: false,
arrayLimit: 20,
charset: 'utf-8',
charsetSentinel: false,
comma: false,
decoder: utils$1.decode,
delimiter: '&',
depth: 5,
ignoreQueryPrefix: false,
interpretNumericEntities: false,
parameterLimit: 1000,
parseArrays: true,
plainObjects: false,
strictNullHandling: false
};
var interpretNumericEntities = function (str) {
return str.replace(/&#(\d+);/g, function ($0, numberStr) {
return String.fromCharCode(parseInt(numberStr, 10));
});
};
var parseArrayValue = function (val, options) {
if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {
return val.split(',');
}
return val;
};
// This is what browsers will submit when the ✓ character occurs in an
// application/x-www-form-urlencoded body and the encoding of the page containing
// the form is iso-8859-1, or when the submitted form has an accept-charset
// attribute of iso-8859-1. Presumably also with other charsets that do not contain
// the ✓ character, such as us-ascii.
var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓')
// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')
var parseValues = function parseQueryStringValues(str, options) {
var obj = {};
var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
var parts = cleanStr.split(options.delimiter, limit);
var skipIndex = -1; // Keep track of where the utf8 sentinel was found
var i;
var charset = options.charset;
if (options.charsetSentinel) {
for (i = 0; i < parts.length; ++i) {
if (parts[i].indexOf('utf8=') === 0) {
if (parts[i] === charsetSentinel) {
charset = 'utf-8';
} else if (parts[i] === isoSentinel) {
charset = 'iso-8859-1';
}
skipIndex = i;
i = parts.length; // The eslint settings do not allow break;
}
}
}
for (i = 0; i < parts.length; ++i) {
if (i === skipIndex) {
continue;
}
var part = parts[i];
var bracketEqualsPos = part.indexOf(']=');
var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;
var key, val;
if (pos === -1) {
key = options.decoder(part, defaults$2.decoder, charset, 'key');
val = options.strictNullHandling ? null : '';
} else {
key = options.decoder(part.slice(0, pos), defaults$2.decoder, charset, 'key');
val = utils$1.maybeMap(
parseArrayValue(part.slice(pos + 1), options),
function (encodedVal) {
return options.decoder(encodedVal, defaults$2.decoder, charset, 'value');
}
);
}
if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
val = interpretNumericEntities(val);
}
if (part.indexOf('[]=') > -1) {
val = isArray$3(val) ? [val] : val;
}
if (has$2.call(obj, key)) {
obj[key] = utils$1.combine(obj[key], val);
} else {
obj[key] = val;
}
}
return obj;
};
var parseObject = function (chain, val, options, valuesParsed) {
var leaf = valuesParsed ? val : parseArrayValue(val, options);
for (var i = chain.length - 1; i >= 0; --i) {
var obj;
var root = chain[i];
if (root === '[]' && options.parseArrays) {
obj = [].concat(leaf);
} else {
obj = options.plainObjects ? Object.create(null) : {};
var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
var index = parseInt(cleanRoot, 10);
if (!options.parseArrays && cleanRoot === '') {
obj = { 0: leaf };
} else if (
!isNaN(index)
&& root !== cleanRoot
&& String(index) === cleanRoot
&& index >= 0
&& (options.parseArrays && index <= options.arrayLimit)
) {
obj = [];
obj[index] = leaf;
} else {
obj[cleanRoot] = leaf;
}
}
leaf = obj; // eslint-disable-line no-param-reassign
}
return leaf;
};
var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
if (!givenKey) {
return;
}
// Transform dot notation to bracket notation
var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;
// The regex chunks
var brackets = /(\[[^[\]]*])/;
var child = /(\[[^[\]]*])/g;
// Get the parent
var segment = options.depth > 0 && brackets.exec(key);
var parent = segment ? key.slice(0, segment.index) : key;
// Stash the parent if it exists
var keys = [];
if (parent) {
// If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
if (!options.plainObjects && has$2.call(Object.prototype, parent)) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(parent);
}
// Loop through children appending to the array until we hit depth
var i = 0;
while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
i += 1;
if (!options.plainObjects && has$2.call(Object.prototype, segment[1].slice(1, -1))) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(segment[1]);
}
// If there's a remainder, just add whatever is left
if (segment) {
keys.push('[' + key.slice(segment.index) + ']');
}
return parseObject(keys, val, options, valuesParsed);
};
var normalizeParseOptions = function normalizeParseOptions(opts) {
if (!opts) {
return defaults$2;
}
if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {
throw new TypeError('Decoder has to be a function.');
}
if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
}
var charset = typeof opts.charset === 'undefined' ? defaults$2.charset : opts.charset;
return {
allowDots: typeof opts.allowDots === 'undefined' ? defaults$2.allowDots : !!opts.allowDots,
allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults$2.allowPrototypes,
arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults$2.arrayLimit,
charset: charset,
charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults$2.charsetSentinel,
comma: typeof opts.comma === 'boolean' ? opts.comma : defaults$2.comma,
decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults$2.decoder,
delimiter: typeof opts.delimiter === 'string' || utils$1.isRegExp(opts.delimiter) ? opts.delimiter : defaults$2.delimiter,
// eslint-disable-next-line no-implicit-coercion, no-extra-parens
depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults$2.depth,
ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults$2.interpretNumericEntities,
parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults$2.parameterLimit,
parseArrays: opts.parseArrays !== false,
plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults$2.plainObjects,
strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults$2.strictNullHandling
};
};
var parse = function (str, opts) {
var options = normalizeParseOptions(opts);
if (str === '' || str === null || typeof str === 'undefined') {
return options.plainObjects ? Object.create(null) : {};
}
var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
var obj = options.plainObjects ? Object.create(null) : {};
// Iterate over the keys and setup the new object
var keys = Object.keys(tempObj);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');
obj = utils$1.merge(obj, newObj, options);
}
return utils$1.compact(obj);
};
'use strict';
var lib = {
formats: formats,
parse: parse,
stringify: stringify_1
};
var lib_1 = lib.formats;
var lib_2 = lib.parse;
var lib_3 = lib.stringify;
/*
* @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$1({
method: 'get',
url: url,
timeout: timeout,
params: params,
headers: headers
});
};
var post = function post(data, url, timeout, headers) {
return axios$1({
method: 'post',
url: url,
timeout: timeout,
data: data,
headers: headers
});
};
var post1 = function post1(data, url, timeout, headers) {
return axios$1({
method: 'post',
url: url,
timeout: timeout,
data: lib.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();
// }
};
// })();
/**
* Parses an URI
*
* @author Steven Levithan <stevenlevithan.com> (MIT license)
* @api private
*/
var re = /^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;
var parts = [
'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'
];
var parseuri = function parseuri(str) {
var src = str,
b = str.indexOf('['),
e = str.indexOf(']');
if (b != -1 && e != -1) {
str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);
}
var m = re.exec(str || ''),
uri = {},
i = 14;
while (i--) {
uri[parts[i]] = m[i] || '';
}
if (b != -1 && e != -1) {
uri.source = src;
uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');
uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');
uri.ipv6uri = true;
}
return uri;
};
/**
* Helpers.
*/
var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;
/**
* Parse or format the given `val`.
*
* Options:
*
* - `long` verbose formatting [false]
*
* @param {String|Number} val
* @param {Object} [options]
* @throws {Error} throw an error if val is not a non-empty string or a number
* @return {String|Number}
* @api public
*/
var ms = function(val, options) {
options = options || {};
var type = typeof val;
if (type === 'string' && val.length > 0) {
return parse$1(val);
} else if (type === 'number' && isNaN(val) === false) {
return options.long ? fmtLong(val) : fmtShort(val);
}
throw new Error(
'val is not a non-empty string or a valid number. val=' +
JSON.stringify(val)
);
};
/**
* Parse the given `str` and return milliseconds.
*
* @param {String} str
* @return {Number}
* @api private
*/
function parse$1(str) {
str = String(str);
if (str.length > 100) {
return;
}
var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
str
);
if (!match) {
return;
}
var n = parseFloat(match[1]);
var type = (match[2] || 'ms').toLowerCase();
switch (type) {
case 'years':
case 'year':
case 'yrs':
case 'yr':
case 'y':
return n * y;
case 'days':
case 'day':
case 'd':
return n * d;
case 'hours':
case 'hour':
case 'hrs':
case 'hr':
case 'h':
return n * h;
case 'minutes':
case 'minute':
case 'mins':
case 'min':
case 'm':
return n * m;
case 'seconds':
case 'second':
case 'secs':
case 'sec':
case 's':
return n * s;
case 'milliseconds':
case 'millisecond':
case 'msecs':
case 'msec':
case 'ms':
return n;
default:
return undefined;
}
}
/**
* Short format for `ms`.
*
* @param {Number} ms
* @return {String}
* @api private
*/
function fmtShort(ms) {
if (ms >= d) {
return Math.round(ms / d) + 'd';
}
if (ms >= h) {
return Math.round(ms / h) + 'h';
}
if (ms >= m) {
return Math.round(ms / m) + 'm';
}
if (ms >= s) {
return Math.round(ms / s) + 's';
}
return ms + 'ms';
}
/**
* Long format for `ms`.
*
* @param {Number} ms
* @return {String}
* @api private
*/
function fmtLong(ms) {
return plural(ms, d, 'day') ||
plural(ms, h, 'hour') ||
plural(ms, m, 'minute') ||
plural(ms, s, 'second') ||
ms + ' ms';
}
/**
* Pluralization helper.
*/
function plural(ms, n, name) {
if (ms < n) {
return;
}
if (ms < n * 1.5) {
return Math.floor(ms / n) + ' ' + name;
}
return Math.ceil(ms / n) + ' ' + name + 's';
}
var debug = createCommonjsModule(function (module, exports) {
/**
* This is the common logic for both the Node.js and web browser
* implementations of `debug()`.
*
* Expose `debug()` as the module.
*/
exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = ms;
/**
* Active `debug` instances.
*/
exports.instances = [];
/**
* The currently active debug mode names, and names to skip.
*/
exports.names = [];
exports.skips = [];
/**
* Map of special "%n" handling functions, for the debug "format" argument.
*
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
*/
exports.formatters = {};
/**
* Select a color.
* @param {String} namespace
* @return {Number}
* @api private
*/
function selectColor(namespace) {
var hash = 0, i;
for (i in namespace) {
hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
hash |= 0; // Convert to 32bit integer
}
return exports.colors[Math.abs(hash) % exports.colors.length];
}
/**
* Create a debugger with the given `namespace`.
*
* @param {String} namespace
* @return {Function}
* @api public
*/
function createDebug(namespace) {
var prevTime;
function debug() {
// disabled?
if (!debug.enabled) return;
var self = debug;
// set `diff` timestamp
var curr = +new Date();
var ms = curr - (prevTime || curr);
self.diff = ms;
self.prev = prevTime;
self.curr = curr;
prevTime = curr;
// turn the `arguments` into a proper Array
var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
args[0] = exports.coerce(args[0]);
if ('string' !== typeof args[0]) {
// anything else let's inspect with %O
args.unshift('%O');
}
// apply any `formatters` transformations
var index = 0;
args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
// if we encounter an escaped % then don't increase the array index
if (match === '%%') return match;
index++;
var formatter = exports.formatters[format];
if ('function' === typeof formatter) {
var val = args[index];
match = formatter.call(self, val);
// now we need to remove `args[index]` since it's inlined in the `format`
args.splice(index, 1);
index--;
}
return match;
});
// apply env-specific formatting (colors, etc.)
exports.formatArgs.call(self, args);
var logFn = debug.log || exports.log || console.log.bind(console);
logFn.apply(self, args);
}
debug.namespace = namespace;
debug.enabled = exports.enabled(namespace);
debug.useColors = exports.useColors();
debug.color = selectColor(namespace);
debug.destroy = destroy;
// env-specific initialization logic for debug instances
if ('function' === typeof exports.init) {
exports.init(debug);
}
exports.instances.push(debug);
return debug;
}
function destroy () {
var index = exports.instances.indexOf(this);
if (index !== -1) {
exports.instances.splice(index, 1);
return true;
} else {
return false;
}
}
/**
* Enables a debug mode by namespaces. This can include modes
* separated by a colon and wildcards.
*
* @param {String} namespaces
* @api public
*/
function enable(namespaces) {
exports.save(namespaces);
exports.names = [];
exports.skips = [];
var i;
var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
var len = split.length;
for (i = 0; i < len; i++) {
if (!split[i]) continue; // ignore empty strings
namespaces = split[i].replace(/\*/g, '.*?');
if (namespaces[0] === '-') {
exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
} else {
exports.names.push(new RegExp('^' + namespaces + '$'));
}
}
for (i = 0; i < exports.instances.length; i++) {
var instance = exports.instances[i];
instance.enabled = exports.enabled(instance.namespace);
}
}
/**
* Disable debug output.
*
* @api public
*/
function disable() {
exports.enable('');
}
/**
* Returns true if the given mode name is enabled, false otherwise.
*
* @param {String} name
* @return {Boolean}
* @api public
*/
function enabled(name) {
if (name[name.length - 1] === '*') {
return true;
}
var i, len;
for (i = 0, len = exports.skips.length; i < len; i++) {
if (exports.skips[i].test(name)) {
return false;
}
}
for (i = 0, len = exports.names.length; i < len; i++) {
if (exports.names[i].test(name)) {
return true;
}
}
return false;
}
/**
* Coerce `val`.
*
* @param {Mixed} val
* @return {Mixed}
* @api private
*/
function coerce(val) {
if (val instanceof Error) return val.stack || val.message;
return val;
}
});
var debug_1 = debug.coerce;
var debug_2 = debug.disable;
var debug_3 = debug.enable;
var debug_4 = debug.enabled;
var debug_5 = debug.humanize;
var debug_6 = debug.instances;
var debug_7 = debug.names;
var debug_8 = debug.skips;
var debug_9 = debug.formatters;
var browser = createCommonjsModule(function (module, exports) {
/**
* This is the web browser implementation of `debug()`.
*
* Expose `debug()` as the module.
*/
exports = module.exports = debug;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
&& 'undefined' != typeof chrome.storage
? chrome.storage.local
: localstorage();
/**
* Colors.
*/
exports.colors = [
'#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',
'#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',
'#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',
'#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',
'#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',
'#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',
'#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',
'#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',
'#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',
'#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',
'#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'
];
/**
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
* and the Firebug extension (any Firefox version) are known
* to support "%c" CSS customizations.
*
* TODO: add a `localStorage` variable to explicitly enable/disable colors
*/
function useColors() {
// NB: In an Electron preload script, document will be defined but not fully
// initialized. Since we know we're in Chrome, we'll just detect this case
// explicitly
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
return true;
}
// Internet Explorer and Edge do not support colors.
if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
return false;
}
// is webkit? http://stackoverflow.com/a/16459606/376773
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
// is firebug? http://stackoverflow.com/a/398120/376773
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
// is firefox >= v31?
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
// double check webkit in userAgent just in case we are in a worker
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}
/**
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
*/
exports.formatters.j = function(v) {
try {
return JSON.stringify(v);
} catch (err) {
return '[UnexpectedJSONParseError]: ' + err.message;
}
};
/**
* Colorize log arguments if enabled.
*
* @api public
*/
function formatArgs(args) {
var useColors = this.useColors;
args[0] = (useColors ? '%c' : '')
+ this.namespace
+ (useColors ? ' %c' : ' ')
+ args[0]
+ (useColors ? '%c ' : ' ')
+ '+' + exports.humanize(this.diff);
if (!useColors) return;
var c = 'color: ' + this.color;
args.splice(1, 0, c, 'color: inherit');
// the final "%c" is somewhat tricky, because there could be other
// arguments passed either before or after the %c, so we need to
// figure out the correct index to insert the CSS into
var index = 0;
var lastC = 0;
args[0].replace(/%[a-zA-Z%]/g, function(match) {
if ('%%' === match) return;
index++;
if ('%c' === match) {
// we only are interested in the *last* %c
// (the user may have provided their own)
lastC = index;
}
});
args.splice(lastC, 0, c);
}
/**
* Invokes `console.log()` when available.
* No-op when `console.log` is not a "function".
*
* @api public
*/
function log() {
// this hackery is required for IE8/9, where
// the `console.log` function doesn't have 'apply'
return 'object' === typeof console
&& console.log
&& Function.prototype.apply.call(console.log, console, arguments);
}
/**
* Save `namespaces`.
*
* @param {String} namespaces
* @api private
*/
function save(namespaces) {
try {
if (null == namespaces) {
exports.storage.removeItem('debug');
} else {
exports.storage.debug = namespaces;
}
} catch(e) {}
}
/**
* Load `namespaces`.
*
* @return {String} returns the previously persisted debug modes
* @api private
*/
function load() {
var r;
try {
r = exports.storage.debug;
} catch(e) {}
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
if (!r && typeof process !== 'undefined' && 'env' in process) {
r = process.env.DEBUG;
}
return r;
}
/**
* Enable namespaces listed in `localStorage.debug` initially.
*/
exports.enable(load());
/**
* Localstorage attempts to return the localstorage.
*
* This is necessary because safari throws
* when a user disables cookies/localstorage
* and you attempt to access it.
*
* @return {LocalStorage}
* @api private
*/
function localstorage() {
try {
return window.localStorage;
} catch (e) {}
}
});
var browser_1 = browser.log;
var browser_2 = browser.formatArgs;
var browser_3 = browser.save;
var browser_4 = browser.load;
var browser_5 = browser.useColors;
var browser_6 = browser.storage;
var browser_7 = browser.colors;
/**
* Module dependencies.
*/
var debug$1 = browser('socket.io-client:url');
/**
* Module exports.
*/
var url_1 = url;
/**
* URL parser.
*
* @param {String} url
* @param {Object} An object meant to mimic window.location.
* Defaults to window.location.
* @api public
*/
function url (uri, loc) {
var obj = uri;
// default to window.location
loc = loc || commonjsGlobal.location;
if (null == uri) uri = loc.protocol + '//' + loc.host;
// relative path support
if ('string' === typeof uri) {
if ('/' === uri.charAt(0)) {
if ('/' === uri.charAt(1)) {
uri = loc.protocol + uri;
} else {
uri = loc.host + uri;
}
}
if (!/^(https?|wss?):\/\//.test(uri)) {
debug$1('protocol-less url %s', uri);
if ('undefined' !== typeof loc) {
uri = loc.protocol + '//' + uri;
} else {
uri = 'https://' + uri;
}
}
// parse
debug$1('parse %s', uri);
obj = parseuri(uri);
}
// make sure we treat `localhost:80` and `localhost` equally
if (!obj.port) {
if (/^(http|ws)$/.test(obj.protocol)) {
obj.port = '80';
} else if (/^(http|ws)s$/.test(obj.protocol)) {
obj.port = '443';
}
}
obj.path = obj.path || '/';
var ipv6 = obj.host.indexOf(':') !== -1;
var host = ipv6 ? '[' + obj.host + ']' : obj.host;
// define unique id
obj.id = obj.protocol + '://' + host + ':' + obj.port;
// define href
obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : (':' + obj.port));
return obj;
}
var debug$2 = createCommonjsModule(function (module, exports) {
/**
* This is the common logic for both the Node.js and web browser
* implementations of `debug()`.
*
* Expose `debug()` as the module.
*/
exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = ms;
/**
* Active `debug` instances.
*/
exports.instances = [];
/**
* The currently active debug mode names, and names to skip.
*/
exports.names = [];
exports.skips = [];
/**
* Map of special "%n" handling functions, for the debug "format" argument.
*
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
*/
exports.formatters = {};
/**
* Select a color.
* @param {String} namespace
* @return {Number}
* @api private
*/
function selectColor(namespace) {
var hash = 0, i;
for (i in namespace) {
hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
hash |= 0; // Convert to 32bit integer
}
return exports.colors[Math.abs(hash) % exports.colors.length];
}
/**
* Create a debugger with the given `namespace`.
*
* @param {String} namespace
* @return {Function}
* @api public
*/
function createDebug(namespace) {
var prevTime;
function debug() {
// disabled?
if (!debug.enabled) return;
var self = debug;
// set `diff` timestamp
var curr = +new Date();
var ms = curr - (prevTime || curr);
self.diff = ms;
self.prev = prevTime;
self.curr = curr;
prevTime = curr;
// turn the `arguments` into a proper Array
var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
args[0] = exports.coerce(args[0]);
if ('string' !== typeof args[0]) {
// anything else let's inspect with %O
args.unshift('%O');
}
// apply any `formatters` transformations
var index = 0;
args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
// if we encounter an escaped % then don't increase the array index
if (match === '%%') return match;
index++;
var formatter = exports.formatters[format];
if ('function' === typeof formatter) {
var val = args[index];
match = formatter.call(self, val);
// now we need to remove `args[index]` since it's inlined in the `format`
args.splice(index, 1);
index--;
}
return match;
});
// apply env-specific formatting (colors, etc.)
exports.formatArgs.call(self, args);
var logFn = debug.log || exports.log || console.log.bind(console);
logFn.apply(self, args);
}
debug.namespace = namespace;
debug.enabled = exports.enabled(namespace);
debug.useColors = exports.useColors();
debug.color = selectColor(namespace);
debug.destroy = destroy;
// env-specific initialization logic for debug instances
if ('function' === typeof exports.init) {
exports.init(debug);
}
exports.instances.push(debug);
return debug;
}
function destroy () {
var index = exports.instances.indexOf(this);
if (index !== -1) {
exports.instances.splice(index, 1);
return true;
} else {
return false;
}
}
/**
* Enables a debug mode by namespaces. This can include modes
* separated by a colon and wildcards.
*
* @param {String} namespaces
* @api public
*/
function enable(namespaces) {
exports.save(namespaces);
exports.names = [];
exports.skips = [];
var i;
var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
var len = split.length;
for (i = 0; i < len; i++) {
if (!split[i]) continue; // ignore empty strings
namespaces = split[i].replace(/\*/g, '.*?');
if (namespaces[0] === '-') {
exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
} else {
exports.names.push(new RegExp('^' + namespaces + '$'));
}
}
for (i = 0; i < exports.instances.length; i++) {
var instance = exports.instances[i];
instance.enabled = exports.enabled(instance.namespace);
}
}
/**
* Disable debug output.
*
* @api public
*/
function disable() {
exports.enable('');
}
/**
* Returns true if the given mode name is enabled, false otherwise.
*
* @param {String} name
* @return {Boolean}
* @api public
*/
function enabled(name) {
if (name[name.length - 1] === '*') {
return true;
}
var i, len;
for (i = 0, len = exports.skips.length; i < len; i++) {
if (exports.skips[i].test(name)) {
return false;
}
}
for (i = 0, len = exports.names.length; i < len; i++) {
if (exports.names[i].test(name)) {
return true;
}
}
return false;
}
/**
* Coerce `val`.
*
* @param {Mixed} val
* @return {Mixed}
* @api private
*/
function coerce(val) {
if (val instanceof Error) return val.stack || val.message;
return val;
}
});
var debug_1$1 = debug$2.coerce;
var debug_2$1 = debug$2.disable;
var debug_3$1 = debug$2.enable;
var debug_4$1 = debug$2.enabled;
var debug_5$1 = debug$2.humanize;
var debug_6$1 = debug$2.instances;
var debug_7$1 = debug$2.names;
var debug_8$1 = debug$2.skips;
var debug_9$1 = debug$2.formatters;
var browser$1 = createCommonjsModule(function (module, exports) {
/**
* This is the web browser implementation of `debug()`.
*
* Expose `debug()` as the module.
*/
exports = module.exports = debug$2;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
&& 'undefined' != typeof chrome.storage
? chrome.storage.local
: localstorage();
/**
* Colors.
*/
exports.colors = [
'#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',
'#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',
'#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',
'#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',
'#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',
'#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',
'#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',
'#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',
'#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',
'#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',
'#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'
];
/**
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
* and the Firebug extension (any Firefox version) are known
* to support "%c" CSS customizations.
*
* TODO: add a `localStorage` variable to explicitly enable/disable colors
*/
function useColors() {
// NB: In an Electron preload script, document will be defined but not fully
// initialized. Since we know we're in Chrome, we'll just detect this case
// explicitly
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
return true;
}
// Internet Explorer and Edge do not support colors.
if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
return false;
}
// is webkit? http://stackoverflow.com/a/16459606/376773
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
// is firebug? http://stackoverflow.com/a/398120/376773
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
// is firefox >= v31?
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
// double check webkit in userAgent just in case we are in a worker
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}
/**
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
*/
exports.formatters.j = function(v) {
try {
return JSON.stringify(v);
} catch (err) {
return '[UnexpectedJSONParseError]: ' + err.message;
}
};
/**
* Colorize log arguments if enabled.
*
* @api public
*/
function formatArgs(args) {
var useColors = this.useColors;
args[0] = (useColors ? '%c' : '')
+ this.namespace
+ (useColors ? ' %c' : ' ')
+ args[0]
+ (useColors ? '%c ' : ' ')
+ '+' + exports.humanize(this.diff);
if (!useColors) return;
var c = 'color: ' + this.color;
args.splice(1, 0, c, 'color: inherit');
// the final "%c" is somewhat tricky, because there could be other
// arguments passed either before or after the %c, so we need to
// figure out the correct index to insert the CSS into
var index = 0;
var lastC = 0;
args[0].replace(/%[a-zA-Z%]/g, function(match) {
if ('%%' === match) return;
index++;
if ('%c' === match) {
// we only are interested in the *last* %c
// (the user may have provided their own)
lastC = index;
}
});
args.splice(lastC, 0, c);
}
/**
* Invokes `console.log()` when available.
* No-op when `console.log` is not a "function".
*
* @api public
*/
function log() {
// this hackery is required for IE8/9, where
// the `console.log` function doesn't have 'apply'
return 'object' === typeof console
&& console.log
&& Function.prototype.apply.call(console.log, console, arguments);
}
/**
* Save `namespaces`.
*
* @param {String} namespaces
* @api private
*/
function save(namespaces) {
try {
if (null == namespaces) {
exports.storage.removeItem('debug');
} else {
exports.storage.debug = namespaces;
}
} catch(e) {}
}
/**
* Load `namespaces`.
*
* @return {String} returns the previously persisted debug modes
* @api private
*/
function load() {
var r;
try {
r = exports.storage.debug;
} catch(e) {}
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
if (!r && typeof process !== 'undefined' && 'env' in process) {
r = process.env.DEBUG;
}
return r;
}
/**
* Enable namespaces listed in `localStorage.debug` initially.
*/
exports.enable(load());
/**
* Localstorage attempts to return the localstorage.
*
* This is necessary because safari throws
* when a user disables cookies/localstorage
* and you attempt to access it.
*
* @return {LocalStorage}
* @api private
*/
function localstorage() {
try {
return window.localStorage;
} catch (e) {}
}
});
var browser_1$1 = browser$1.log;
var browser_2$1 = browser$1.formatArgs;
var browser_3$1 = browser$1.save;
var browser_4$1 = browser$1.load;
var browser_5$1 = browser$1.useColors;
var browser_6$1 = browser$1.storage;
var browser_7$1 = browser$1.colors;
var componentEmitter = createCommonjsModule(function (module) {
/**
* Expose `Emitter`.
*/
if ('object' !== 'undefined') {
module.exports = Emitter;
}
/**
* Initialize a new `Emitter`.
*
* @api public
*/
function Emitter(obj) {
if (obj) return mixin(obj);
};
/**
* Mixin the emitter properties.
*
* @param {Object} obj
* @return {Object}
* @api private
*/
function mixin(obj) {
for (var key in Emitter.prototype) {
obj[key] = Emitter.prototype[key];
}
return obj;
}
/**
* Listen on the given `event` with `fn`.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter.prototype.on =
Emitter.prototype.addEventListener = function(event, fn){
this._callbacks = this._callbacks || {};
(this._callbacks['$' + event] = this._callbacks['$' + event] || [])
.push(fn);
return this;
};
/**
* Adds an `event` listener that will be invoked a single
* time then automatically removed.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter.prototype.once = function(event, fn){
function on() {
this.off(event, on);
fn.apply(this, arguments);
}
on.fn = fn;
this.on(event, on);
return this;
};
/**
* Remove the given callback for `event` or all
* registered callbacks.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter.prototype.off =
Emitter.prototype.removeListener =
Emitter.prototype.removeAllListeners =
Emitter.prototype.removeEventListener = function(event, fn){
this._callbacks = this._callbacks || {};
// all
if (0 == arguments.length) {
this._callbacks = {};
return this;
}
// specific event
var callbacks = this._callbacks['$' + event];
if (!callbacks) return this;
// remove all handlers
if (1 == arguments.length) {
delete this._callbacks['$' + event];
return this;
}
// remove specific handler
var cb;
for (var i = 0; i < callbacks.length; i++) {
cb = callbacks[i];
if (cb === fn || cb.fn === fn) {
callbacks.splice(i, 1);
break;
}
}
return this;
};
/**
* Emit `event` with the given args.
*
* @param {String} event
* @param {Mixed} ...
* @return {Emitter}
*/
Emitter.prototype.emit = function(event){
this._callbacks = this._callbacks || {};
var args = [].slice.call(arguments, 1)
, callbacks = this._callbacks['$' + event];
if (callbacks) {
callbacks = callbacks.slice(0);
for (var i = 0, len = callbacks.length; i < len; ++i) {
callbacks[i].apply(this, args);
}
}
return this;
};
/**
* Return array of callbacks for `event`.
*
* @param {String} event
* @return {Array}
* @api public
*/
Emitter.prototype.listeners = function(event){
this._callbacks = this._callbacks || {};
return this._callbacks['$' + event] || [];
};
/**
* Check if this emitter has `event` handlers.
*
* @param {String} event
* @return {Boolean}
* @api public
*/
Emitter.prototype.hasListeners = function(event){
return !! this.listeners(event).length;
};
});
var toString$1 = {}.toString;
var isarray = Array.isArray || function (arr) {
return toString$1.call(arr) == '[object Array]';
};
var isBuffer$2 = isBuf;
var withNativeBuffer = typeof commonjsGlobal.Buffer === 'function' && typeof commonjsGlobal.Buffer.isBuffer === 'function';
var withNativeArrayBuffer = typeof commonjsGlobal.ArrayBuffer === 'function';
var isView = (function () {
if (withNativeArrayBuffer && typeof commonjsGlobal.ArrayBuffer.isView === 'function') {
return commonjsGlobal.ArrayBuffer.isView;
} else {
return function (obj) { return obj.buffer instanceof commonjsGlobal.ArrayBuffer; };
}
})();
/**
* Returns true if obj is a buffer or an arraybuffer.
*
* @api private
*/
function isBuf(obj) {
return (withNativeBuffer && commonjsGlobal.Buffer.isBuffer(obj)) ||
(withNativeArrayBuffer && (obj instanceof commonjsGlobal.ArrayBuffer || isView(obj)));
}
/*global Blob,File*/
/**
* Module requirements
*/
var toString$2 = Object.prototype.toString;
var withNativeBlob = typeof commonjsGlobal.Blob === 'function' || toString$2.call(commonjsGlobal.Blob) === '[object BlobConstructor]';
var withNativeFile = typeof commonjsGlobal.File === 'function' || toString$2.call(commonjsGlobal.File) === '[object FileConstructor]';
/**
* Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.
* Anything with blobs or files should be fed through removeBlobs before coming
* here.
*
* @param {Object} packet - socket.io event packet
* @return {Object} with deconstructed packet and list of buffers
* @api public
*/
var deconstructPacket = function(packet) {
var buffers = [];
var packetData = packet.data;
var pack = packet;
pack.data = _deconstructPacket(packetData, buffers);
pack.attachments = buffers.length; // number of binary 'attachments'
return {packet: pack, buffers: buffers};
};
function _deconstructPacket(data, buffers) {
if (!data) return data;
if (isBuffer$2(data)) {
var placeholder = { _placeholder: true, num: buffers.length };
buffers.push(data);
return placeholder;
} else if (isarray(data)) {
var newData = new Array(data.length);
for (var i = 0; i < data.length; i++) {
newData[i] = _deconstructPacket(data[i], buffers);
}
return newData;
} else if (typeof data === 'object' && !(data instanceof Date)) {
var newData = {};
for (var key in data) {
newData[key] = _deconstructPacket(data[key], buffers);
}
return newData;
}
return data;
}
/**
* Reconstructs a binary packet from its placeholder packet and buffers
*
* @param {Object} packet - event packet with placeholders
* @param {Array} buffers - binary buffers to put in placeholder positions
* @return {Object} reconstructed packet
* @api public
*/
var reconstructPacket = function(packet, buffers) {
packet.data = _reconstructPacket(packet.data, buffers);
packet.attachments = undefined; // no longer useful
return packet;
};
function _reconstructPacket(data, buffers) {
if (!data) return data;
if (data && data._placeholder) {
return buffers[data.num]; // appropriate buffer (should be natural order anyway)
} else if (isarray(data)) {
for (var i = 0; i < data.length; i++) {
data[i] = _reconstructPacket(data[i], buffers);
}
} else if (typeof data === 'object') {
for (var key in data) {
data[key] = _reconstructPacket(data[key], buffers);
}
}
return data;
}
/**
* Asynchronously removes Blobs or Files from data via
* FileReader's readAsArrayBuffer method. Used before encoding
* data as msgpack. Calls callback with the blobless data.
*
* @param {Object} data
* @param {Function} callback
* @api private
*/
var removeBlobs = function(data, callback) {
function _removeBlobs(obj, curKey, containingObject) {
if (!obj) return obj;
// convert any blob
if ((withNativeBlob && obj instanceof Blob) ||
(withNativeFile && obj instanceof File)) {
pendingBlobs++;
// async filereader
var fileReader = new FileReader();
fileReader.onload = function() { // this.result == arraybuffer
if (containingObject) {
containingObject[curKey] = this.result;
}
else {
bloblessData = this.result;
}
// if nothing pending its callback time
if(! --pendingBlobs) {
callback(bloblessData);
}
};
fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer
} else if (isarray(obj)) { // handle array
for (var i = 0; i < obj.length; i++) {
_removeBlobs(obj[i], i, obj);
}
} else if (typeof obj === 'object' && !isBuffer$2(obj)) { // and object
for (var key in obj) {
_removeBlobs(obj[key], key, obj);
}
}
}
var pendingBlobs = 0;
var bloblessData = data;
_removeBlobs(bloblessData);
if (!pendingBlobs) {
callback(bloblessData);
}
};
var binary = {
deconstructPacket: deconstructPacket,
reconstructPacket: reconstructPacket,
removeBlobs: removeBlobs
};
var socket_ioParser = createCommonjsModule(function (module, exports) {
/**
* Module dependencies.
*/
var debug = browser$1('socket.io-parser');
/**
* Protocol version.
*
* @api public
*/
exports.protocol = 4;
/**
* Packet types.
*
* @api public
*/
exports.types = [
'CONNECT',
'DISCONNECT',
'EVENT',
'ACK',
'ERROR',
'BINARY_EVENT',
'BINARY_ACK'
];
/**
* Packet type `connect`.
*
* @api public
*/
exports.CONNECT = 0;
/**
* Packet type `disconnect`.
*
* @api public
*/
exports.DISCONNECT = 1;
/**
* Packet type `event`.
*
* @api public
*/
exports.EVENT = 2;
/**
* Packet type `ack`.
*
* @api public
*/
exports.ACK = 3;
/**
* Packet type `error`.
*
* @api public
*/
exports.ERROR = 4;
/**
* Packet type 'binary event'
*
* @api public
*/
exports.BINARY_EVENT = 5;
/**
* Packet type `binary ack`. For acks with binary arguments.
*
* @api public
*/
exports.BINARY_ACK = 6;
/**
* Encoder constructor.
*
* @api public
*/
exports.Encoder = Encoder;
/**
* Decoder constructor.
*
* @api public
*/
exports.Decoder = Decoder;
/**
* A socket.io Encoder instance
*
* @api public
*/
function Encoder() {}
var ERROR_PACKET = exports.ERROR + '"encode error"';
/**
* Encode a packet as a single string if non-binary, or as a
* buffer sequence, depending on packet type.
*
* @param {Object} obj - packet object
* @param {Function} callback - function to handle encodings (likely engine.write)
* @return Calls callback with Array of encodings
* @api public
*/
Encoder.prototype.encode = function(obj, callback){
debug('encoding packet %j', obj);
if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {
encodeAsBinary(obj, callback);
} else {
var encoding = encodeAsString(obj);
callback([encoding]);
}
};
/**
* Encode packet as string.
*
* @param {Object} packet
* @return {String} encoded
* @api private
*/
function encodeAsString(obj) {
// first is type
var str = '' + obj.type;
// attachments if we have them
if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {
str += obj.attachments + '-';
}
// if we have a namespace other than `/`
// we append it followed by a comma `,`
if (obj.nsp && '/' !== obj.nsp) {
str += obj.nsp + ',';
}
// immediately followed by the id
if (null != obj.id) {
str += obj.id;
}
// json data
if (null != obj.data) {
var payload = tryStringify(obj.data);
if (payload !== false) {
str += payload;
} else {
return ERROR_PACKET;
}
}
debug('encoded %j as %s', obj, str);
return str;
}
function tryStringify(str) {
try {
return JSON.stringify(str);
} catch(e){
return false;
}
}
/**
* Encode packet as 'buffer sequence' by removing blobs, and
* deconstructing packet into object with placeholders and
* a list of buffers.
*
* @param {Object} packet
* @return {Buffer} encoded
* @api private
*/
function encodeAsBinary(obj, callback) {
function writeEncoding(bloblessData) {
var deconstruction = binary.deconstructPacket(bloblessData);
var pack = encodeAsString(deconstruction.packet);
var buffers = deconstruction.buffers;
buffers.unshift(pack); // add packet info to beginning of data list
callback(buffers); // write all the buffers
}
binary.removeBlobs(obj, writeEncoding);
}
/**
* A socket.io Decoder instance
*
* @return {Object} decoder
* @api public
*/
function Decoder() {
this.reconstructor = null;
}
/**
* Mix in `Emitter` with Decoder.
*/
componentEmitter(Decoder.prototype);
/**
* Decodes an ecoded packet string into packet JSON.
*
* @param {String} obj - encoded packet
* @return {Object} packet
* @api public
*/
Decoder.prototype.add = function(obj) {
var packet;
if (typeof obj === 'string') {
packet = decodeString(obj);
if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json
this.reconstructor = new BinaryReconstructor(packet);
// no attachments, labeled binary but no binary data to follow
if (this.reconstructor.reconPack.attachments === 0) {
this.emit('decoded', packet);
}
} else { // non-binary full packet
this.emit('decoded', packet);
}
}
else if (isBuffer$2(obj) || obj.base64) { // raw binary data
if (!this.reconstructor) {
throw new Error('got binary data when not reconstructing a packet');
} else {
packet = this.reconstructor.takeBinaryData(obj);
if (packet) { // received final buffer
this.reconstructor = null;
this.emit('decoded', packet);
}
}
}
else {
throw new Error('Unknown type: ' + obj);
}
};
/**
* Decode a packet String (JSON data)
*
* @param {String} str
* @return {Object} packet
* @api private
*/
function decodeString(str) {
var i = 0;
// look up type
var p = {
type: Number(str.charAt(0))
};
if (null == exports.types[p.type]) {
return error('unknown packet type ' + p.type);
}
// look up attachments if type binary
if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {
var buf = '';
while (str.charAt(++i) !== '-') {
buf += str.charAt(i);
if (i == str.length) break;
}
if (buf != Number(buf) || str.charAt(i) !== '-') {
throw new Error('Illegal attachments');
}
p.attachments = Number(buf);
}
// look up namespace (if any)
if ('/' === str.charAt(i + 1)) {
p.nsp = '';
while (++i) {
var c = str.charAt(i);
if (',' === c) break;
p.nsp += c;
if (i === str.length) break;
}
} else {
p.nsp = '/';
}
// look up id
var next = str.charAt(i + 1);
if ('' !== next && Number(next) == next) {
p.id = '';
while (++i) {
var c = str.charAt(i);
if (null == c || Number(c) != c) {
--i;
break;
}
p.id += str.charAt(i);
if (i === str.length) break;
}
p.id = Number(p.id);
}
// look up json data
if (str.charAt(++i)) {
var payload = tryParse(str.substr(i));
var isPayloadValid = payload !== false && (p.type === exports.ERROR || isarray(payload));
if (isPayloadValid) {
p.data = payload;
} else {
return error('invalid payload');
}
}
debug('decoded %s as %j', str, p);
return p;
}
function tryParse(str) {
try {
return JSON.parse(str);
} catch(e){
return false;
}
}
/**
* Deallocates a parser's resources
*
* @api public
*/
Decoder.prototype.destroy = function() {
if (this.reconstructor) {
this.reconstructor.finishedReconstruction();
}
};
/**
* A manager of a binary event's 'buffer sequence'. Should
* be constructed whenever a packet of type BINARY_EVENT is
* decoded.
*
* @param {Object} packet
* @return {BinaryReconstructor} initialized reconstructor
* @api private
*/
function BinaryReconstructor(packet) {
this.reconPack = packet;
this.buffers = [];
}
/**
* Method to be called when binary data received from connection
* after a BINARY_EVENT packet.
*
* @param {Buffer | ArrayBuffer} binData - the raw binary data received
* @return {null | Object} returns null if more binary data is expected or
* a reconstructed packet object if all buffers have been received.
* @api private
*/
BinaryReconstructor.prototype.takeBinaryData = function(binData) {
this.buffers.push(binData);
if (this.buffers.length === this.reconPack.attachments) { // done with buffer list
var packet = binary.reconstructPacket(this.reconPack, this.buffers);
this.finishedReconstruction();
return packet;
}
return null;
};
/**
* Cleans up binary packet reconstruction variables.
*
* @api private
*/
BinaryReconstructor.prototype.finishedReconstruction = function() {
this.reconPack = null;
this.buffers = [];
};
function error(msg) {
return {
type: exports.ERROR,
data: 'parser error: ' + msg
};
}
});
var socket_ioParser_1 = socket_ioParser.protocol;
var socket_ioParser_2 = socket_ioParser.types;
var socket_ioParser_3 = socket_ioParser.CONNECT;
var socket_ioParser_4 = socket_ioParser.DISCONNECT;
var socket_ioParser_5 = socket_ioParser.EVENT;
var socket_ioParser_6 = socket_ioParser.ACK;
var socket_ioParser_7 = socket_ioParser.ERROR;
var socket_ioParser_8 = socket_ioParser.BINARY_EVENT;
var socket_ioParser_9 = socket_ioParser.BINARY_ACK;
var socket_ioParser_10 = socket_ioParser.Encoder;
var socket_ioParser_11 = socket_ioParser.Decoder;
var hasCors = createCommonjsModule(function (module) {
/**
* Module exports.
*
* Logic borrowed from Modernizr:
*
* - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js
*/
try {
module.exports = typeof XMLHttpRequest !== 'undefined' &&
'withCredentials' in new XMLHttpRequest();
} catch (err) {
// if XMLHttp support is disabled in IE then it will throw
// when trying to create
module.exports = false;
}
});
// browser shim for xmlhttprequest module
var xmlhttprequest = function (opts) {
var xdomain = opts.xdomain;
// scheme must be same when usign XDomainRequest
// http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
var xscheme = opts.xscheme;
// XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.
// https://github.com/Automattic/engine.io-client/pull/217
var enablesXDR = opts.enablesXDR;
// XMLHttpRequest can be disabled on IE
try {
if ('undefined' !== typeof XMLHttpRequest && (!xdomain || hasCors)) {
return new XMLHttpRequest();
}
} catch (e) { }
// Use XDomainRequest for IE8 if enablesXDR is true
// because loading bar keeps flashing when using jsonp-polling
// https://github.com/yujiosaka/socke.io-ie8-loading-example
try {
if ('undefined' !== typeof XDomainRequest && !xscheme && enablesXDR) {
return new XDomainRequest();
}
} catch (e) { }
if (!xdomain) {
try {
return new commonjsGlobal[['Active'].concat('Object').join('X')]('Microsoft.XMLHTTP');
} catch (e) { }
}
};
/**
* Gets the keys for an object.
*
* @return {Array} keys
* @api private
*/
var keys = Object.keys || function keys (obj){
var arr = [];
var has = Object.prototype.hasOwnProperty;
for (var i in obj) {
if (has.call(obj, i)) {
arr.push(i);
}
}
return arr;
};
/* global Blob File */
/*
* Module requirements.
*/
var toString$3 = Object.prototype.toString;
var withNativeBlob$1 = typeof Blob === 'function' ||
typeof Blob !== 'undefined' && toString$3.call(Blob) === '[object BlobConstructor]';
var withNativeFile$1 = typeof File === 'function' ||
typeof File !== 'undefined' && toString$3.call(File) === '[object FileConstructor]';
/**
* Module exports.
*/
var hasBinary2 = hasBinary;
/**
* Checks for binary data.
*
* Supports Buffer, ArrayBuffer, Blob and File.
*
* @param {Object} anything
* @api public
*/
function hasBinary (obj) {
if (!obj || typeof obj !== 'object') {
return false;
}
if (isarray(obj)) {
for (var i = 0, l = obj.length; i < l; i++) {
if (hasBinary(obj[i])) {
return true;
}
}
return false;
}
if ((typeof Buffer === 'function' && Buffer.isBuffer && Buffer.isBuffer(obj)) ||
(typeof ArrayBuffer === 'function' && obj instanceof ArrayBuffer) ||
(withNativeBlob$1 && obj instanceof Blob) ||
(withNativeFile$1 && obj instanceof File)
) {
return true;
}
// see: https://github.com/Automattic/has-binary/pull/4
if (obj.toJSON && typeof obj.toJSON === 'function' && arguments.length === 1) {
return hasBinary(obj.toJSON(), true);
}
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {
return true;
}
}
return false;
}
/**
* An abstraction for slicing an arraybuffer even when
* ArrayBuffer.prototype.slice is not supported
*
* @api public
*/
var arraybuffer_slice = function(arraybuffer, start, end) {
var bytes = arraybuffer.byteLength;
start = start || 0;
end = end || bytes;
if (arraybuffer.slice) { return arraybuffer.slice(start, end); }
if (start < 0) { start += bytes; }
if (end < 0) { end += bytes; }
if (end > bytes) { end = bytes; }
if (start >= bytes || start >= end || bytes === 0) {
return new ArrayBuffer(0);
}
var abv = new Uint8Array(arraybuffer);
var result = new Uint8Array(end - start);
for (var i = start, ii = 0; i < end; i++, ii++) {
result[ii] = abv[i];
}
return result.buffer;
};
var after_1 = after;
function after(count, callback, err_cb) {
var bail = false;
err_cb = err_cb || noop;
proxy.count = count;
return (count === 0) ? callback() : proxy
function proxy(err, result) {
if (proxy.count <= 0) {
throw new Error('after called too many times')
}
--proxy.count;
// after first error, rest are passed to err_cb
if (err) {
bail = true;
callback(err);
// future error callbacks will go to error handler
callback = err_cb;
} else if (proxy.count === 0 && !bail) {
callback(null, result);
}
}
}
function noop() {}
var utf8 = createCommonjsModule(function (module, exports) {
/*! https://mths.be/utf8js v2.1.2 by @mathias */
;(function(root) {
// Detect free variables `exports`
var freeExports = 'object' == 'object' && exports;
// Detect free variable `module`
var freeModule = 'object' == 'object' && module &&
module.exports == freeExports && module;
// Detect free variable `global`, from Node.js or Browserified code,
// and use it as `root`
var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal;
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
root = freeGlobal;
}
/*--------------------------------------------------------------------------*/
var stringFromCharCode = String.fromCharCode;
// Taken from https://mths.be/punycode
function ucs2decode(string) {
var output = [];
var counter = 0;
var length = string.length;
var value;
var extra;
while (counter < length) {
value = string.charCodeAt(counter++);
if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
// high surrogate, and there is a next character
extra = string.charCodeAt(counter++);
if ((extra & 0xFC00) == 0xDC00) { // low surrogate
output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
} else {
// unmatched surrogate; only append this code unit, in case the next
// code unit is the high surrogate of a surrogate pair
output.push(value);
counter--;
}
} else {
output.push(value);
}
}
return output;
}
// Taken from https://mths.be/punycode
function ucs2encode(array) {
var length = array.length;
var index = -1;
var value;
var output = '';
while (++index < length) {
value = array[index];
if (value > 0xFFFF) {
value -= 0x10000;
output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
value = 0xDC00 | value & 0x3FF;
}
output += stringFromCharCode(value);
}
return output;
}
function checkScalarValue(codePoint, strict) {
if (codePoint >= 0xD800 && codePoint <= 0xDFFF) {
if (strict) {
throw Error(
'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +
' is not a scalar value'
);
}
return false;
}
return true;
}
/*--------------------------------------------------------------------------*/
function createByte(codePoint, shift) {
return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);
}
function encodeCodePoint(codePoint, strict) {
if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence
return stringFromCharCode(codePoint);
}
var symbol = '';
if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence
symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);
}
else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence
if (!checkScalarValue(codePoint, strict)) {
codePoint = 0xFFFD;
}
symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);
symbol += createByte(codePoint, 6);
}
else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence
symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);
symbol += createByte(codePoint, 12);
symbol += createByte(codePoint, 6);
}
symbol += stringFromCharCode((codePoint & 0x3F) | 0x80);
return symbol;
}
function utf8encode(string, opts) {
opts = opts || {};
var strict = false !== opts.strict;
var codePoints = ucs2decode(string);
var length = codePoints.length;
var index = -1;
var codePoint;
var byteString = '';
while (++index < length) {
codePoint = codePoints[index];
byteString += encodeCodePoint(codePoint, strict);
}
return byteString;
}
/*--------------------------------------------------------------------------*/
function readContinuationByte() {
if (byteIndex >= byteCount) {
throw Error('Invalid byte index');
}
var continuationByte = byteArray[byteIndex] & 0xFF;
byteIndex++;
if ((continuationByte & 0xC0) == 0x80) {
return continuationByte & 0x3F;
}
// If we end up here, it’s not a continuation byte
throw Error('Invalid continuation byte');
}
function decodeSymbol(strict) {
var byte1;
var byte2;
var byte3;
var byte4;
var codePoint;
if (byteIndex > byteCount) {
throw Error('Invalid byte index');
}
if (byteIndex == byteCount) {
return false;
}
// Read first byte
byte1 = byteArray[byteIndex] & 0xFF;
byteIndex++;
// 1-byte sequence (no continuation bytes)
if ((byte1 & 0x80) == 0) {
return byte1;
}
// 2-byte sequence
if ((byte1 & 0xE0) == 0xC0) {
byte2 = readContinuationByte();
codePoint = ((byte1 & 0x1F) << 6) | byte2;
if (codePoint >= 0x80) {
return codePoint;
} else {
throw Error('Invalid continuation byte');
}
}
// 3-byte sequence (may include unpaired surrogates)
if ((byte1 & 0xF0) == 0xE0) {
byte2 = readContinuationByte();
byte3 = readContinuationByte();
codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;
if (codePoint >= 0x0800) {
return checkScalarValue(codePoint, strict) ? codePoint : 0xFFFD;
} else {
throw Error('Invalid continuation byte');
}
}
// 4-byte sequence
if ((byte1 & 0xF8) == 0xF0) {
byte2 = readContinuationByte();
byte3 = readContinuationByte();
byte4 = readContinuationByte();
codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |
(byte3 << 0x06) | byte4;
if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {
return codePoint;
}
}
throw Error('Invalid UTF-8 detected');
}
var byteArray;
var byteCount;
var byteIndex;
function utf8decode(byteString, opts) {
opts = opts || {};
var strict = false !== opts.strict;
byteArray = ucs2decode(byteString);
byteCount = byteArray.length;
byteIndex = 0;
var codePoints = [];
var tmp;
while ((tmp = decodeSymbol(strict)) !== false) {
codePoints.push(tmp);
}
return ucs2encode(codePoints);
}
/*--------------------------------------------------------------------------*/
var utf8 = {
'version': '2.1.2',
'encode': utf8encode,
'decode': utf8decode
};
// Some AMD build optimizers, like r.js, check for specific condition patterns
// like the following:
if (
typeof undefined == 'function' &&
typeof undefined.amd == 'object' &&
undefined.amd
) {
undefined(function() {
return utf8;
});
} else if (freeExports && !freeExports.nodeType) {
if (freeModule) { // in Node.js or RingoJS v0.8.0+
freeModule.exports = utf8;
} else { // in Narwhal or RingoJS v0.7.0-
var object = {};
var hasOwnProperty = object.hasOwnProperty;
for (var key in utf8) {
hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);
}
}
} else { // in Rhino or a web browser
root.utf8 = utf8;
}
}(commonjsGlobal));
});
var base64Arraybuffer = createCommonjsModule(function (module, exports) {
/*
* base64-arraybuffer
* https://github.com/niklasvh/base64-arraybuffer
*
* Copyright (c) 2012 Niklas von Hertzen
* Licensed under the MIT license.
*/
(function(){
"use strict";
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// Use a lookup table to find the index.
var lookup = new Uint8Array(256);
for (var i = 0; i < chars.length; i++) {
lookup[chars.charCodeAt(i)] = i;
}
exports.encode = function(arraybuffer) {
var bytes = new Uint8Array(arraybuffer),
i, len = bytes.length, base64 = "";
for (i = 0; i < len; i+=3) {
base64 += chars[bytes[i] >> 2];
base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
base64 += chars[bytes[i + 2] & 63];
}
if ((len % 3) === 2) {
base64 = base64.substring(0, base64.length - 1) + "=";
} else if (len % 3 === 1) {
base64 = base64.substring(0, base64.length - 2) + "==";
}
return base64;
};
exports.decode = function(base64) {
var bufferLength = base64.length * 0.75,
len = base64.length, i, p = 0,
encoded1, encoded2, encoded3, encoded4;
if (base64[base64.length - 1] === "=") {
bufferLength--;
if (base64[base64.length - 2] === "=") {
bufferLength--;
}
}
var arraybuffer = new ArrayBuffer(bufferLength),
bytes = new Uint8Array(arraybuffer);
for (i = 0; i < len; i+=4) {
encoded1 = lookup[base64.charCodeAt(i)];
encoded2 = lookup[base64.charCodeAt(i+1)];
encoded3 = lookup[base64.charCodeAt(i+2)];
encoded4 = lookup[base64.charCodeAt(i+3)];
bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
}
return arraybuffer;
};
})();
});
var base64Arraybuffer_1 = base64Arraybuffer.encode;
var base64Arraybuffer_2 = base64Arraybuffer.decode;
/**
* Create a blob builder even when vendor prefixes exist
*/
var BlobBuilder = commonjsGlobal.BlobBuilder
|| commonjsGlobal.WebKitBlobBuilder
|| commonjsGlobal.MSBlobBuilder
|| commonjsGlobal.MozBlobBuilder;
/**
* Check if Blob constructor is supported
*/
var blobSupported = (function() {
try {
var a = new Blob(['hi']);
return a.size === 2;
} catch(e) {
return false;
}
})();
/**
* Check if Blob constructor supports ArrayBufferViews
* Fails in Safari 6, so we need to map to ArrayBuffers there.
*/
var blobSupportsArrayBufferView = blobSupported && (function() {
try {
var b = new Blob([new Uint8Array([1,2])]);
return b.size === 2;
} catch(e) {
return false;
}
})();
/**
* Check if BlobBuilder is supported
*/
var blobBuilderSupported = BlobBuilder
&& BlobBuilder.prototype.append
&& BlobBuilder.prototype.getBlob;
/**
* Helper function that maps ArrayBufferViews to ArrayBuffers
* Used by BlobBuilder constructor and old browsers that didn't
* support it in the Blob constructor.
*/
function mapArrayBufferViews(ary) {
for (var i = 0; i < ary.length; i++) {
var chunk = ary[i];
if (chunk.buffer instanceof ArrayBuffer) {
var buf = chunk.buffer;
// if this is a subarray, make a copy so we only
// include the subarray region from the underlying buffer
if (chunk.byteLength !== buf.byteLength) {
var copy = new Uint8Array(chunk.byteLength);
copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));
buf = copy.buffer;
}
ary[i] = buf;
}
}
}
function BlobBuilderConstructor(ary, options) {
options = options || {};
var bb = new BlobBuilder();
mapArrayBufferViews(ary);
for (var i = 0; i < ary.length; i++) {
bb.append(ary[i]);
}
return (options.type) ? bb.getBlob(options.type) : bb.getBlob();
};
function BlobConstructor(ary, options) {
mapArrayBufferViews(ary);
return new Blob(ary, options || {});
};
var blob = (function() {
if (blobSupported) {
return blobSupportsArrayBufferView ? commonjsGlobal.Blob : BlobConstructor;
} else if (blobBuilderSupported) {
return BlobBuilderConstructor;
} else {
return undefined;
}
})();
var browser$2 = createCommonjsModule(function (module, exports) {
/**
* Module dependencies.
*/
var base64encoder;
if (commonjsGlobal && commonjsGlobal.ArrayBuffer) {
base64encoder = base64Arraybuffer;
}
/**
* Check if we are running an android browser. That requires us to use
* ArrayBuffer with polling transports...
*
* http://ghinda.net/jpeg-blob-ajax-android/
*/
var isAndroid = typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent);
/**
* Check if we are running in PhantomJS.
* Uploading a Blob with PhantomJS does not work correctly, as reported here:
* https://github.com/ariya/phantomjs/issues/11395
* @type boolean
*/
var isPhantomJS = typeof navigator !== 'undefined' && /PhantomJS/i.test(navigator.userAgent);
/**
* When true, avoids using Blobs to encode payloads.
* @type boolean
*/
var dontSendBlobs = isAndroid || isPhantomJS;
/**
* Current protocol version.
*/
exports.protocol = 3;
/**
* Packet types.
*/
var packets = exports.packets = {
open: 0 // non-ws
, close: 1 // non-ws
, ping: 2
, pong: 3
, message: 4
, upgrade: 5
, noop: 6
};
var packetslist = keys(packets);
/**
* Premade error packet.
*/
var err = { type: 'error', data: 'parser error' };
/**
* Create a blob api even for blob builder when vendor prefixes exist
*/
/**
* Encodes a packet.
*
* <packet type id> [ <data> ]
*
* Example:
*
* 5hello world
* 3
* 4
*
* Binary is encoded in an identical principle
*
* @api private
*/
exports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {
if (typeof supportsBinary === 'function') {
callback = supportsBinary;
supportsBinary = false;
}
if (typeof utf8encode === 'function') {
callback = utf8encode;
utf8encode = null;
}
var data = (packet.data === undefined)
? undefined
: packet.data.buffer || packet.data;
if (commonjsGlobal.ArrayBuffer && data instanceof ArrayBuffer) {
return encodeArrayBuffer(packet, supportsBinary, callback);
} else if (blob && data instanceof commonjsGlobal.Blob) {
return encodeBlob(packet, supportsBinary, callback);
}
// might be an object with { base64: true, data: dataAsBase64String }
if (data && data.base64) {
return encodeBase64Object(packet, callback);
}
// Sending data as a utf-8 string
var encoded = packets[packet.type];
// data fragment is optional
if (undefined !== packet.data) {
encoded += utf8encode ? utf8.encode(String(packet.data), { strict: false }) : String(packet.data);
}
return callback('' + encoded);
};
function encodeBase64Object(packet, callback) {
// packet data is an object { base64: true, data: dataAsBase64String }
var message = 'b' + exports.packets[packet.type] + packet.data.data;
return callback(message);
}
/**
* Encode packet helpers for binary types
*/
function encodeArrayBuffer(packet, supportsBinary, callback) {
if (!supportsBinary) {
return exports.encodeBase64Packet(packet, callback);
}
var data = packet.data;
var contentArray = new Uint8Array(data);
var resultBuffer = new Uint8Array(1 + data.byteLength);
resultBuffer[0] = packets[packet.type];
for (var i = 0; i < contentArray.length; i++) {
resultBuffer[i+1] = contentArray[i];
}
return callback(resultBuffer.buffer);
}
function encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {
if (!supportsBinary) {
return exports.encodeBase64Packet(packet, callback);
}
var fr = new FileReader();
fr.onload = function() {
packet.data = fr.result;
exports.encodePacket(packet, supportsBinary, true, callback);
};
return fr.readAsArrayBuffer(packet.data);
}
function encodeBlob(packet, supportsBinary, callback) {
if (!supportsBinary) {
return exports.encodeBase64Packet(packet, callback);
}
if (dontSendBlobs) {
return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);
}
var length = new Uint8Array(1);
length[0] = packets[packet.type];
var blob$1 = new blob([length.buffer, packet.data]);
return callback(blob$1);
}
/**
* Encodes a packet with binary data in a base64 string
*
* @param {Object} packet, has `type` and `data`
* @return {String} base64 encoded message
*/
exports.encodeBase64Packet = function(packet, callback) {
var message = 'b' + exports.packets[packet.type];
if (blob && packet.data instanceof commonjsGlobal.Blob) {
var fr = new FileReader();
fr.onload = function() {
var b64 = fr.result.split(',')[1];
callback(message + b64);
};
return fr.readAsDataURL(packet.data);
}
var b64data;
try {
b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));
} catch (e) {
// iPhone Safari doesn't let you apply with typed arrays
var typed = new Uint8Array(packet.data);
var basic = new Array(typed.length);
for (var i = 0; i < typed.length; i++) {
basic[i] = typed[i];
}
b64data = String.fromCharCode.apply(null, basic);
}
message += commonjsGlobal.btoa(b64data);
return callback(message);
};
/**
* Decodes a packet. Changes format to Blob if requested.
*
* @return {Object} with `type` and `data` (if any)
* @api private
*/
exports.decodePacket = function (data, binaryType, utf8decode) {
if (data === undefined) {
return err;
}
// String data
if (typeof data === 'string') {
if (data.charAt(0) === 'b') {
return exports.decodeBase64Packet(data.substr(1), binaryType);
}
if (utf8decode) {
data = tryDecode(data);
if (data === false) {
return err;
}
}
var type = data.charAt(0);
if (Number(type) != type || !packetslist[type]) {
return err;
}
if (data.length > 1) {
return { type: packetslist[type], data: data.substring(1) };
} else {
return { type: packetslist[type] };
}
}
var asArray = new Uint8Array(data);
var type = asArray[0];
var rest = arraybuffer_slice(data, 1);
if (blob && binaryType === 'blob') {
rest = new blob([rest]);
}
return { type: packetslist[type], data: rest };
};
function tryDecode(data) {
try {
data = utf8.decode(data, { strict: false });
} catch (e) {
return false;
}
return data;
}
/**
* Decodes a packet encoded in a base64 string
*
* @param {String} base64 encoded message
* @return {Object} with `type` and `data` (if any)
*/
exports.decodeBase64Packet = function(msg, binaryType) {
var type = packetslist[msg.charAt(0)];
if (!base64encoder) {
return { type: type, data: { base64: true, data: msg.substr(1) } };
}
var data = base64encoder.decode(msg.substr(1));
if (binaryType === 'blob' && blob) {
data = new blob([data]);
}
return { type: type, data: data };
};
/**
* Encodes multiple messages (payload).
*
* <length>:data
*
* Example:
*
* 11:hello world2:hi
*
* If any contents are binary, they will be encoded as base64 strings. Base64
* encoded strings are marked with a b before the length specifier
*
* @param {Array} packets
* @api private
*/
exports.encodePayload = function (packets, supportsBinary, callback) {
if (typeof supportsBinary === 'function') {
callback = supportsBinary;
supportsBinary = null;
}
var isBinary = hasBinary2(packets);
if (supportsBinary && isBinary) {
if (blob && !dontSendBlobs) {
return exports.encodePayloadAsBlob(packets, callback);
}
return exports.encodePayloadAsArrayBuffer(packets, callback);
}
if (!packets.length) {
return callback('0:');
}
function setLengthHeader(message) {
return message.length + ':' + message;
}
function encodeOne(packet, doneCallback) {
exports.encodePacket(packet, !isBinary ? false : supportsBinary, false, function(message) {
doneCallback(null, setLengthHeader(message));
});
}
map(packets, encodeOne, function(err, results) {
return callback(results.join(''));
});
};
/**
* Async array map using after
*/
function map(ary, each, done) {
var result = new Array(ary.length);
var next = after_1(ary.length, done);
var eachWithIndex = function(i, el, cb) {
each(el, function(error, msg) {
result[i] = msg;
cb(error, result);
});
};
for (var i = 0; i < ary.length; i++) {
eachWithIndex(i, ary[i], next);
}
}
/*
* Decodes data when a payload is maybe expected. Possible binary contents are
* decoded from their base64 representation
*
* @param {String} data, callback method
* @api public
*/
exports.decodePayload = function (data, binaryType, callback) {
if (typeof data !== 'string') {
return exports.decodePayloadAsBinary(data, binaryType, callback);
}
if (typeof binaryType === 'function') {
callback = binaryType;
binaryType = null;
}
var packet;
if (data === '') {
// parser error - ignoring payload
return callback(err, 0, 1);
}
var length = '', n, msg;
for (var i = 0, l = data.length; i < l; i++) {
var chr = data.charAt(i);
if (chr !== ':') {
length += chr;
continue;
}
if (length === '' || (length != (n = Number(length)))) {
// parser error - ignoring payload
return callback(err, 0, 1);
}
msg = data.substr(i + 1, n);
if (length != msg.length) {
// parser error - ignoring payload
return callback(err, 0, 1);
}
if (msg.length) {
packet = exports.decodePacket(msg, binaryType, false);
if (err.type === packet.type && err.data === packet.data) {
// parser error in individual packet - ignoring payload
return callback(err, 0, 1);
}
var ret = callback(packet, i + n, l);
if (false === ret) return;
}
// advance cursor
i += n;
length = '';
}
if (length !== '') {
// parser error - ignoring payload
return callback(err, 0, 1);
}
};
/**
* Encodes multiple messages (payload) as binary.
*
* <1 = binary, 0 = string><number from 0-9><number from 0-9>[...]<number
* 255><data>
*
* Example:
* 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers
*
* @param {Array} packets
* @return {ArrayBuffer} encoded payload
* @api private
*/
exports.encodePayloadAsArrayBuffer = function(packets, callback) {
if (!packets.length) {
return callback(new ArrayBuffer(0));
}
function encodeOne(packet, doneCallback) {
exports.encodePacket(packet, true, true, function(data) {
return doneCallback(null, data);
});
}
map(packets, encodeOne, function(err, encodedPackets) {
var totalLength = encodedPackets.reduce(function(acc, p) {
var len;
if (typeof p === 'string'){
len = p.length;
} else {
len = p.byteLength;
}
return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2
}, 0);
var resultArray = new Uint8Array(totalLength);
var bufferIndex = 0;
encodedPackets.forEach(function(p) {
var isString = typeof p === 'string';
var ab = p;
if (isString) {
var view = new Uint8Array(p.length);
for (var i = 0; i < p.length; i++) {
view[i] = p.charCodeAt(i);
}
ab = view.buffer;
}
if (isString) { // not true binary
resultArray[bufferIndex++] = 0;
} else { // true binary
resultArray[bufferIndex++] = 1;
}
var lenStr = ab.byteLength.toString();
for (var i = 0; i < lenStr.length; i++) {
resultArray[bufferIndex++] = parseInt(lenStr[i]);
}
resultArray[bufferIndex++] = 255;
var view = new Uint8Array(ab);
for (var i = 0; i < view.length; i++) {
resultArray[bufferIndex++] = view[i];
}
});
return callback(resultArray.buffer);
});
};
/**
* Encode as Blob
*/
exports.encodePayloadAsBlob = function(packets, callback) {
function encodeOne(packet, doneCallback) {
exports.encodePacket(packet, true, true, function(encoded) {
var binaryIdentifier = new Uint8Array(1);
binaryIdentifier[0] = 1;
if (typeof encoded === 'string') {
var view = new Uint8Array(encoded.length);
for (var i = 0; i < encoded.length; i++) {
view[i] = encoded.charCodeAt(i);
}
encoded = view.buffer;
binaryIdentifier[0] = 0;
}
var len = (encoded instanceof ArrayBuffer)
? encoded.byteLength
: encoded.size;
var lenStr = len.toString();
var lengthAry = new Uint8Array(lenStr.length + 1);
for (var i = 0; i < lenStr.length; i++) {
lengthAry[i] = parseInt(lenStr[i]);
}
lengthAry[lenStr.length] = 255;
if (blob) {
var blob$1 = new blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);
doneCallback(null, blob$1);
}
});
}
map(packets, encodeOne, function(err, results) {
return callback(new blob(results));
});
};
/*
* Decodes data when a payload is maybe expected. Strings are decoded by
* interpreting each byte as a key code for entries marked to start with 0. See
* description of encodePayloadAsBinary
*
* @param {ArrayBuffer} data, callback method
* @api public
*/
exports.decodePayloadAsBinary = function (data, binaryType, callback) {
if (typeof binaryType === 'function') {
callback = binaryType;
binaryType = null;
}
var bufferTail = data;
var buffers = [];
while (bufferTail.byteLength > 0) {
var tailArray = new Uint8Array(bufferTail);
var isString = tailArray[0] === 0;
var msgLength = '';
for (var i = 1; ; i++) {
if (tailArray[i] === 255) break;
// 310 = char length of Number.MAX_VALUE
if (msgLength.length > 310) {
return callback(err, 0, 1);
}
msgLength += tailArray[i];
}
bufferTail = arraybuffer_slice(bufferTail, 2 + msgLength.length);
msgLength = parseInt(msgLength);
var msg = arraybuffer_slice(bufferTail, 0, msgLength);
if (isString) {
try {
msg = String.fromCharCode.apply(null, new Uint8Array(msg));
} catch (e) {
// iPhone Safari doesn't let you apply to typed arrays
var typed = new Uint8Array(msg);
msg = '';
for (var i = 0; i < typed.length; i++) {
msg += String.fromCharCode(typed[i]);
}
}
}
buffers.push(msg);
bufferTail = arraybuffer_slice(bufferTail, msgLength);
}
var total = buffers.length;
buffers.forEach(function(buffer, i) {
callback(exports.decodePacket(buffer, binaryType, true), i, total);
});
};
});
var browser_1$2 = browser$2.protocol;
var browser_2$2 = browser$2.packets;
var browser_3$2 = browser$2.encodePacket;
var browser_4$2 = browser$2.encodeBase64Packet;
var browser_5$2 = browser$2.decodePacket;
var browser_6$2 = browser$2.decodeBase64Packet;
var browser_7$2 = browser$2.encodePayload;
var browser_8 = browser$2.decodePayload;
var browser_9 = browser$2.encodePayloadAsArrayBuffer;
var browser_10 = browser$2.encodePayloadAsBlob;
var browser_11 = browser$2.decodePayloadAsBinary;
/**
* Module dependencies.
*/
/**
* Module exports.
*/
var transport = Transport;
/**
* Transport abstract constructor.
*
* @param {Object} options.
* @api private
*/
function Transport (opts) {
this.path = opts.path;
this.hostname = opts.hostname;
this.port = opts.port;
this.secure = opts.secure;
this.query = opts.query;
this.timestampParam = opts.timestampParam;
this.timestampRequests = opts.timestampRequests;
this.readyState = '';
this.agent = opts.agent || false;
this.socket = opts.socket;
this.enablesXDR = opts.enablesXDR;
// SSL options for Node.js client
this.pfx = opts.pfx;
this.key = opts.key;
this.passphrase = opts.passphrase;
this.cert = opts.cert;
this.ca = opts.ca;
this.ciphers = opts.ciphers;
this.rejectUnauthorized = opts.rejectUnauthorized;
this.forceNode = opts.forceNode;
// other options for Node.js client
this.extraHeaders = opts.extraHeaders;
this.localAddress = opts.localAddress;
}
/**
* Mix in `Emitter`.
*/
componentEmitter(Transport.prototype);
/**
* Emits an error.
*
* @param {String} str
* @return {Transport} for chaining
* @api public
*/
Transport.prototype.onError = function (msg, desc) {
var err = new Error(msg);
err.type = 'TransportError';
err.description = desc;
this.emit('error', err);
return this;
};
/**
* Opens the transport.
*
* @api public
*/
Transport.prototype.open = function () {
if ('closed' === this.readyState || '' === this.readyState) {
this.readyState = 'opening';
this.doOpen();
}
return this;
};
/**
* Closes the transport.
*
* @api private
*/
Transport.prototype.close = function () {
if ('opening' === this.readyState || 'open' === this.readyState) {
this.doClose();
this.onClose();
}
return this;
};
/**
* Sends multiple packets.
*
* @param {Array} packets
* @api private
*/
Transport.prototype.send = function (packets) {
if ('open' === this.readyState) {
this.write(packets);
} else {
throw new Error('Transport not open');
}
};
/**
* Called upon open
*
* @api private
*/
Transport.prototype.onOpen = function () {
this.readyState = 'open';
this.writable = true;
this.emit('open');
};
/**
* Called with data.
*
* @param {String} data
* @api private
*/
Transport.prototype.onData = function (data) {
var packet = browser$2.decodePacket(data, this.socket.binaryType);
this.onPacket(packet);
};
/**
* Called with a decoded packet.
*/
Transport.prototype.onPacket = function (packet) {
this.emit('packet', packet);
};
/**
* Called upon close.
*
* @api private
*/
Transport.prototype.onClose = function () {
this.readyState = 'closed';
this.emit('close');
};
/**
* Compiles a querystring
* Returns string representation of the object
*
* @param {Object}
* @api private
*/
var encode$2 = function (obj) {
var str = '';
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
if (str.length) str += '&';
str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);
}
}
return str;
};
/**
* Parses a simple querystring into an object
*
* @param {String} qs
* @api private
*/
var decode$1 = function(qs){
var qry = {};
var pairs = qs.split('&');
for (var i = 0, l = pairs.length; i < l; i++) {
var pair = pairs[i].split('=');
qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
}
return qry;
};
var parseqs = {
encode: encode$2,
decode: decode$1
};
var componentInherit = function(a, b){
var fn = function(){};
fn.prototype = b.prototype;
a.prototype = new fn;
a.prototype.constructor = a;
};
'use strict';
var alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')
, length = 64
, map = {}
, seed = 0
, i = 0
, prev;
/**
* Return a string representing the specified number.
*
* @param {Number} num The number to convert.
* @returns {String} The string representation of the number.
* @api public
*/
function encode$3(num) {
var encoded = '';
do {
encoded = alphabet[num % length] + encoded;
num = Math.floor(num / length);
} while (num > 0);
return encoded;
}
/**
* Return the integer value specified by the given string.
*
* @param {String} str The string to convert.
* @returns {Number} The integer value represented by the string.
* @api public
*/
function decode$2(str) {
var decoded = 0;
for (i = 0; i < str.length; i++) {
decoded = decoded * length + map[str.charAt(i)];
}
return decoded;
}
/**
* Yeast: A tiny growing id generator.
*
* @returns {String} A unique id.
* @api public
*/
function yeast() {
var now = encode$3(+new Date());
if (now !== prev) return seed = 0, prev = now;
return now +'.'+ encode$3(seed++);
}
//
// Map each character to its index.
//
for (; i < length; i++) map[alphabet[i]] = i;
//
// Expose the `yeast`, `encode` and `decode` functions.
//
yeast.encode = encode$3;
yeast.decode = decode$2;
var yeast_1 = yeast;
var debug$3 = createCommonjsModule(function (module, exports) {
/**
* This is the common logic for both the Node.js and web browser
* implementations of `debug()`.
*
* Expose `debug()` as the module.
*/
exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = ms;
/**
* Active `debug` instances.
*/
exports.instances = [];
/**
* The currently active debug mode names, and names to skip.
*/
exports.names = [];
exports.skips = [];
/**
* Map of special "%n" handling functions, for the debug "format" argument.
*
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
*/
exports.formatters = {};
/**
* Select a color.
* @param {String} namespace
* @return {Number}
* @api private
*/
function selectColor(namespace) {
var hash = 0, i;
for (i in namespace) {
hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
hash |= 0; // Convert to 32bit integer
}
return exports.colors[Math.abs(hash) % exports.colors.length];
}
/**
* Create a debugger with the given `namespace`.
*
* @param {String} namespace
* @return {Function}
* @api public
*/
function createDebug(namespace) {
var prevTime;
function debug() {
// disabled?
if (!debug.enabled) return;
var self = debug;
// set `diff` timestamp
var curr = +new Date();
var ms = curr - (prevTime || curr);
self.diff = ms;
self.prev = prevTime;
self.curr = curr;
prevTime = curr;
// turn the `arguments` into a proper Array
var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
args[0] = exports.coerce(args[0]);
if ('string' !== typeof args[0]) {
// anything else let's inspect with %O
args.unshift('%O');
}
// apply any `formatters` transformations
var index = 0;
args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
// if we encounter an escaped % then don't increase the array index
if (match === '%%') return match;
index++;
var formatter = exports.formatters[format];
if ('function' === typeof formatter) {
var val = args[index];
match = formatter.call(self, val);
// now we need to remove `args[index]` since it's inlined in the `format`
args.splice(index, 1);
index--;
}
return match;
});
// apply env-specific formatting (colors, etc.)
exports.formatArgs.call(self, args);
var logFn = debug.log || exports.log || console.log.bind(console);
logFn.apply(self, args);
}
debug.namespace = namespace;
debug.enabled = exports.enabled(namespace);
debug.useColors = exports.useColors();
debug.color = selectColor(namespace);
debug.destroy = destroy;
// env-specific initialization logic for debug instances
if ('function' === typeof exports.init) {
exports.init(debug);
}
exports.instances.push(debug);
return debug;
}
function destroy () {
var index = exports.instances.indexOf(this);
if (index !== -1) {
exports.instances.splice(index, 1);
return true;
} else {
return false;
}
}
/**
* Enables a debug mode by namespaces. This can include modes
* separated by a colon and wildcards.
*
* @param {String} namespaces
* @api public
*/
function enable(namespaces) {
exports.save(namespaces);
exports.names = [];
exports.skips = [];
var i;
var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
var len = split.length;
for (i = 0; i < len; i++) {
if (!split[i]) continue; // ignore empty strings
namespaces = split[i].replace(/\*/g, '.*?');
if (namespaces[0] === '-') {
exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
} else {
exports.names.push(new RegExp('^' + namespaces + '$'));
}
}
for (i = 0; i < exports.instances.length; i++) {
var instance = exports.instances[i];
instance.enabled = exports.enabled(instance.namespace);
}
}
/**
* Disable debug output.
*
* @api public
*/
function disable() {
exports.enable('');
}
/**
* Returns true if the given mode name is enabled, false otherwise.
*
* @param {String} name
* @return {Boolean}
* @api public
*/
function enabled(name) {
if (name[name.length - 1] === '*') {
return true;
}
var i, len;
for (i = 0, len = exports.skips.length; i < len; i++) {
if (exports.skips[i].test(name)) {
return false;
}
}
for (i = 0, len = exports.names.length; i < len; i++) {
if (exports.names[i].test(name)) {
return true;
}
}
return false;
}
/**
* Coerce `val`.
*
* @param {Mixed} val
* @return {Mixed}
* @api private
*/
function coerce(val) {
if (val instanceof Error) return val.stack || val.message;
return val;
}
});
var debug_1$2 = debug$3.coerce;
var debug_2$2 = debug$3.disable;
var debug_3$2 = debug$3.enable;
var debug_4$2 = debug$3.enabled;
var debug_5$2 = debug$3.humanize;
var debug_6$2 = debug$3.instances;
var debug_7$2 = debug$3.names;
var debug_8$2 = debug$3.skips;
var debug_9$2 = debug$3.formatters;
var browser$3 = createCommonjsModule(function (module, exports) {
/**
* This is the web browser implementation of `debug()`.
*
* Expose `debug()` as the module.
*/
exports = module.exports = debug$3;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
&& 'undefined' != typeof chrome.storage
? chrome.storage.local
: localstorage();
/**
* Colors.
*/
exports.colors = [
'#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',
'#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',
'#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',
'#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',
'#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',
'#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',
'#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',
'#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',
'#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',
'#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',
'#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'
];
/**
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
* and the Firebug extension (any Firefox version) are known
* to support "%c" CSS customizations.
*
* TODO: add a `localStorage` variable to explicitly enable/disable colors
*/
function useColors() {
// NB: In an Electron preload script, document will be defined but not fully
// initialized. Since we know we're in Chrome, we'll just detect this case
// explicitly
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
return true;
}
// Internet Explorer and Edge do not support colors.
if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
return false;
}
// is webkit? http://stackoverflow.com/a/16459606/376773
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
// is firebug? http://stackoverflow.com/a/398120/376773
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
// is firefox >= v31?
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
// double check webkit in userAgent just in case we are in a worker
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}
/**
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
*/
exports.formatters.j = function(v) {
try {
return JSON.stringify(v);
} catch (err) {
return '[UnexpectedJSONParseError]: ' + err.message;
}
};
/**
* Colorize log arguments if enabled.
*
* @api public
*/
function formatArgs(args) {
var useColors = this.useColors;
args[0] = (useColors ? '%c' : '')
+ this.namespace
+ (useColors ? ' %c' : ' ')
+ args[0]
+ (useColors ? '%c ' : ' ')
+ '+' + exports.humanize(this.diff);
if (!useColors) return;
var c = 'color: ' + this.color;
args.splice(1, 0, c, 'color: inherit');
// the final "%c" is somewhat tricky, because there could be other
// arguments passed either before or after the %c, so we need to
// figure out the correct index to insert the CSS into
var index = 0;
var lastC = 0;
args[0].replace(/%[a-zA-Z%]/g, function(match) {
if ('%%' === match) return;
index++;
if ('%c' === match) {
// we only are interested in the *last* %c
// (the user may have provided their own)
lastC = index;
}
});
args.splice(lastC, 0, c);
}
/**
* Invokes `console.log()` when available.
* No-op when `console.log` is not a "function".
*
* @api public
*/
function log() {
// this hackery is required for IE8/9, where
// the `console.log` function doesn't have 'apply'
return 'object' === typeof console
&& console.log
&& Function.prototype.apply.call(console.log, console, arguments);
}
/**
* Save `namespaces`.
*
* @param {String} namespaces
* @api private
*/
function save(namespaces) {
try {
if (null == namespaces) {
exports.storage.removeItem('debug');
} else {
exports.storage.debug = namespaces;
}
} catch(e) {}
}
/**
* Load `namespaces`.
*
* @return {String} returns the previously persisted debug modes
* @api private
*/
function load() {
var r;
try {
r = exports.storage.debug;
} catch(e) {}
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
if (!r && typeof process !== 'undefined' && 'env' in process) {
r = process.env.DEBUG;
}
return r;
}
/**
* Enable namespaces listed in `localStorage.debug` initially.
*/
exports.enable(load());
/**
* Localstorage attempts to return the localstorage.
*
* This is necessary because safari throws
* when a user disables cookies/localstorage
* and you attempt to access it.
*
* @return {LocalStorage}
* @api private
*/
function localstorage() {
try {
return window.localStorage;
} catch (e) {}
}
});
var browser_1$3 = browser$3.log;
var browser_2$3 = browser$3.formatArgs;
var browser_3$3 = browser$3.save;
var browser_4$3 = browser$3.load;
var browser_5$3 = browser$3.useColors;
var browser_6$3 = browser$3.storage;
var browser_7$3 = browser$3.colors;
/**
* Module dependencies.
*/
var debug$4 = browser$3('engine.io-client:polling');
/**
* Module exports.
*/
var polling = Polling;
/**
* Is XHR2 supported?
*/
var hasXHR2 = (function () {
var XMLHttpRequest = xmlhttprequest;
var xhr = new XMLHttpRequest({ xdomain: false });
return null != xhr.responseType;
})();
/**
* Polling interface.
*
* @param {Object} opts
* @api private
*/
function Polling (opts) {
var forceBase64 = (opts && opts.forceBase64);
if (!hasXHR2 || forceBase64) {
this.supportsBinary = false;
}
transport.call(this, opts);
}
/**
* Inherits from Transport.
*/
componentInherit(Polling, transport);
/**
* Transport name.
*/
Polling.prototype.name = 'polling';
/**
* Opens the socket (triggers polling). We write a PING message to determine
* when the transport is open.
*
* @api private
*/
Polling.prototype.doOpen = function () {
this.poll();
};
/**
* Pauses polling.
*
* @param {Function} callback upon buffers are flushed and transport is paused
* @api private
*/
Polling.prototype.pause = function (onPause) {
var self = this;
this.readyState = 'pausing';
function pause () {
debug$4('paused');
self.readyState = 'paused';
onPause();
}
if (this.polling || !this.writable) {
var total = 0;
if (this.polling) {
debug$4('we are currently polling - waiting to pause');
total++;
this.once('pollComplete', function () {
debug$4('pre-pause polling complete');
--total || pause();
});
}
if (!this.writable) {
debug$4('we are currently writing - waiting to pause');
total++;
this.once('drain', function () {
debug$4('pre-pause writing complete');
--total || pause();
});
}
} else {
pause();
}
};
/**
* Starts polling cycle.
*
* @api public
*/
Polling.prototype.poll = function () {
debug$4('polling');
this.polling = true;
this.doPoll();
this.emit('poll');
};
/**
* Overloads onData to detect payloads.
*
* @api private
*/
Polling.prototype.onData = function (data) {
var self = this;
debug$4('polling got data %s', data);
var callback = function (packet, index, total) {
// if its the first message we consider the transport open
if ('opening' === self.readyState) {
self.onOpen();
}
// if its a close packet, we close the ongoing requests
if ('close' === packet.type) {
self.onClose();
return false;
}
// otherwise bypass onData and handle the message
self.onPacket(packet);
};
// decode payload
browser$2.decodePayload(data, this.socket.binaryType, callback);
// if an event did not trigger closing
if ('closed' !== this.readyState) {
// if we got data we're not polling
this.polling = false;
this.emit('pollComplete');
if ('open' === this.readyState) {
this.poll();
} else {
debug$4('ignoring poll - transport state "%s"', this.readyState);
}
}
};
/**
* For polling, send a close packet.
*
* @api private
*/
Polling.prototype.doClose = function () {
var self = this;
function close () {
debug$4('writing close packet');
self.write([{ type: 'close' }]);
}
if ('open' === this.readyState) {
debug$4('transport open - closing');
close();
} else {
// in case we're trying to close while
// handshaking is in progress (GH-164)
debug$4('transport not open - deferring close');
this.once('open', close);
}
};
/**
* Writes a packets payload.
*
* @param {Array} data packets
* @param {Function} drain callback
* @api private
*/
Polling.prototype.write = function (packets) {
var self = this;
this.writable = false;
var callbackfn = function () {
self.writable = true;
self.emit('drain');
};
browser$2.encodePayload(packets, this.supportsBinary, function (data) {
self.doWrite(data, callbackfn);
});
};
/**
* Generates uri for connection.
*
* @api private
*/
Polling.prototype.uri = function () {
var query = this.query || {};
var schema = this.secure ? 'https' : 'http';
var port = '';
// cache busting is forced
if (false !== this.timestampRequests) {
query[this.timestampParam] = yeast_1();
}
if (!this.supportsBinary && !query.sid) {
query.b64 = 1;
}
query = parseqs.encode(query);
// avoid port if default for schema
if (this.port && (('https' === schema && Number(this.port) !== 443) ||
('http' === schema && Number(this.port) !== 80))) {
port = ':' + this.port;
}
// prepend ? to query
if (query.length) {
query = '?' + query;
}
var ipv6 = this.hostname.indexOf(':') !== -1;
return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;
};
/**
* Module requirements.
*/
var debug$5 = browser$3('engine.io-client:polling-xhr');
/**
* Module exports.
*/
var pollingXhr = XHR;
var Request_1 = Request;
/**
* Empty function
*/
function empty () {}
/**
* XHR Polling constructor.
*
* @param {Object} opts
* @api public
*/
function XHR (opts) {
polling.call(this, opts);
this.requestTimeout = opts.requestTimeout;
this.extraHeaders = opts.extraHeaders;
if (commonjsGlobal.location) {
var isSSL = 'https:' === location.protocol;
var port = location.port;
// some user agents have empty `location.port`
if (!port) {
port = isSSL ? 443 : 80;
}
this.xd = opts.hostname !== commonjsGlobal.location.hostname ||
port !== opts.port;
this.xs = opts.secure !== isSSL;
}
}
/**
* Inherits from Polling.
*/
componentInherit(XHR, polling);
/**
* XHR supports binary
*/
XHR.prototype.supportsBinary = true;
/**
* Creates a request.
*
* @param {String} method
* @api private
*/
XHR.prototype.request = function (opts) {
opts = opts || {};
opts.uri = this.uri();
opts.xd = this.xd;
opts.xs = this.xs;
opts.agent = this.agent || false;
opts.supportsBinary = this.supportsBinary;
opts.enablesXDR = this.enablesXDR;
// SSL options for Node.js client
opts.pfx = this.pfx;
opts.key = this.key;
opts.passphrase = this.passphrase;
opts.cert = this.cert;
opts.ca = this.ca;
opts.ciphers = this.ciphers;
opts.rejectUnauthorized = this.rejectUnauthorized;
opts.requestTimeout = this.requestTimeout;
// other options for Node.js client
opts.extraHeaders = this.extraHeaders;
return new Request(opts);
};
/**
* Sends data.
*
* @param {String} data to send.
* @param {Function} called upon flush.
* @api private
*/
XHR.prototype.doWrite = function (data, fn) {
var isBinary = typeof data !== 'string' && data !== undefined;
var req = this.request({ method: 'POST', data: data, isBinary: isBinary });
var self = this;
req.on('success', fn);
req.on('error', function (err) {
self.onError('xhr post error', err);
});
this.sendXhr = req;
};
/**
* Starts a poll cycle.
*
* @api private
*/
XHR.prototype.doPoll = function () {
debug$5('xhr poll');
var req = this.request();
var self = this;
req.on('data', function (data) {
self.onData(data);
});
req.on('error', function (err) {
self.onError('xhr poll error', err);
});
this.pollXhr = req;
};
/**
* Request constructor
*
* @param {Object} options
* @api public
*/
function Request (opts) {
this.method = opts.method || 'GET';
this.uri = opts.uri;
this.xd = !!opts.xd;
this.xs = !!opts.xs;
this.async = false !== opts.async;
this.data = undefined !== opts.data ? opts.data : null;
this.agent = opts.agent;
this.isBinary = opts.isBinary;
this.supportsBinary = opts.supportsBinary;
this.enablesXDR = opts.enablesXDR;
this.requestTimeout = opts.requestTimeout;
// SSL options for Node.js client
this.pfx = opts.pfx;
this.key = opts.key;
this.passphrase = opts.passphrase;
this.cert = opts.cert;
this.ca = opts.ca;
this.ciphers = opts.ciphers;
this.rejectUnauthorized = opts.rejectUnauthorized;
// other options for Node.js client
this.extraHeaders = opts.extraHeaders;
this.create();
}
/**
* Mix in `Emitter`.
*/
componentEmitter(Request.prototype);
/**
* Creates the XHR object and sends the request.
*
* @api private
*/
Request.prototype.create = function () {
var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };
// SSL options for Node.js client
opts.pfx = this.pfx;
opts.key = this.key;
opts.passphrase = this.passphrase;
opts.cert = this.cert;
opts.ca = this.ca;
opts.ciphers = this.ciphers;
opts.rejectUnauthorized = this.rejectUnauthorized;
var xhr = this.xhr = new xmlhttprequest(opts);
var self = this;
try {
debug$5('xhr open %s: %s', this.method, this.uri);
xhr.open(this.method, this.uri, this.async);
try {
if (this.extraHeaders) {
xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);
for (var i in this.extraHeaders) {
if (this.extraHeaders.hasOwnProperty(i)) {
xhr.setRequestHeader(i, this.extraHeaders[i]);
}
}
}
} catch (e) {}
if ('POST' === this.method) {
try {
if (this.isBinary) {
xhr.setRequestHeader('Content-type', 'application/octet-stream');
} else {
xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');
}
} catch (e) {}
}
try {
xhr.setRequestHeader('Accept', '*/*');
} catch (e) {}
// ie6 check
if ('withCredentials' in xhr) {
xhr.withCredentials = true;
}
if (this.requestTimeout) {
xhr.timeout = this.requestTimeout;
}
if (this.hasXDR()) {
xhr.onload = function () {
self.onLoad();
};
xhr.onerror = function () {
self.onError(xhr.responseText);
};
} else {
xhr.onreadystatechange = function () {
if (xhr.readyState === 2) {
try {
var contentType = xhr.getResponseHeader('Content-Type');
if (self.supportsBinary && contentType === 'application/octet-stream') {
xhr.responseType = 'arraybuffer';
}
} catch (e) {}
}
if (4 !== xhr.readyState) return;
if (200 === xhr.status || 1223 === xhr.status) {
self.onLoad();
} else {
// make sure the `error` event handler that's user-set
// does not throw in the same tick and gets caught here
setTimeout(function () {
self.onError(xhr.status);
}, 0);
}
};
}
debug$5('xhr data %s', this.data);
xhr.send(this.data);
} catch (e) {
// Need to defer since .create() is called directly fhrom the constructor
// and thus the 'error' event can only be only bound *after* this exception
// occurs. Therefore, also, we cannot throw here at all.
setTimeout(function () {
self.onError(e);
}, 0);
return;
}
if (commonjsGlobal.document) {
this.index = Request.requestsCount++;
Request.requests[this.index] = this;
}
};
/**
* Called upon successful response.
*
* @api private
*/
Request.prototype.onSuccess = function () {
this.emit('success');
this.cleanup();
};
/**
* Called if we have data.
*
* @api private
*/
Request.prototype.onData = function (data) {
this.emit('data', data);
this.onSuccess();
};
/**
* Called upon error.
*
* @api private
*/
Request.prototype.onError = function (err) {
this.emit('error', err);
this.cleanup(true);
};
/**
* Cleans up house.
*
* @api private
*/
Request.prototype.cleanup = function (fromError) {
if ('undefined' === typeof this.xhr || null === this.xhr) {
return;
}
// xmlhttprequest
if (this.hasXDR()) {
this.xhr.onload = this.xhr.onerror = empty;
} else {
this.xhr.onreadystatechange = empty;
}
if (fromError) {
try {
this.xhr.abort();
} catch (e) {}
}
if (commonjsGlobal.document) {
delete Request.requests[this.index];
}
this.xhr = null;
};
/**
* Called upon load.
*
* @api private
*/
Request.prototype.onLoad = function () {
var data;
try {
var contentType;
try {
contentType = this.xhr.getResponseHeader('Content-Type');
} catch (e) {}
if (contentType === 'application/octet-stream') {
data = this.xhr.response || this.xhr.responseText;
} else {
data = this.xhr.responseText;
}
} catch (e) {
this.onError(e);
}
if (null != data) {
this.onData(data);
}
};
/**
* Check if it has XDomainRequest.
*
* @api private
*/
Request.prototype.hasXDR = function () {
return 'undefined' !== typeof commonjsGlobal.XDomainRequest && !this.xs && this.enablesXDR;
};
/**
* Aborts the request.
*
* @api public
*/
Request.prototype.abort = function () {
this.cleanup();
};
/**
* Aborts pending requests when unloading the window. This is needed to prevent
* memory leaks (e.g. when using IE) and to ensure that no spurious error is
* emitted.
*/
Request.requestsCount = 0;
Request.requests = {};
if (commonjsGlobal.document) {
if (commonjsGlobal.attachEvent) {
commonjsGlobal.attachEvent('onunload', unloadHandler);
} else if (commonjsGlobal.addEventListener) {
commonjsGlobal.addEventListener('beforeunload', unloadHandler, false);
}
}
function unloadHandler () {
for (var i in Request.requests) {
if (Request.requests.hasOwnProperty(i)) {
Request.requests[i].abort();
}
}
}
pollingXhr.Request = Request_1;
/**
* Module requirements.
*/
/**
* Module exports.
*/
var pollingJsonp = JSONPPolling;
/**
* Cached regular expressions.
*/
var rNewline = /\n/g;
var rEscapedNewline = /\\n/g;
/**
* Global JSONP callbacks.
*/
var callbacks;
/**
* Noop.
*/
function empty$1 () { }
/**
* JSONP Polling constructor.
*
* @param {Object} opts.
* @api public
*/
function JSONPPolling (opts) {
polling.call(this, opts);
this.query = this.query || {};
// define global callbacks array if not present
// we do this here (lazily) to avoid unneeded global pollution
if (!callbacks) {
// we need to consider multiple engines in the same page
if (!commonjsGlobal.___eio) commonjsGlobal.___eio = [];
callbacks = commonjsGlobal.___eio;
}
// callback identifier
this.index = callbacks.length;
// add callback to jsonp global
var self = this;
callbacks.push(function (msg) {
self.onData(msg);
});
// append to query string
this.query.j = this.index;
// prevent spurious errors from being emitted when the window is unloaded
if (commonjsGlobal.document && commonjsGlobal.addEventListener) {
commonjsGlobal.addEventListener('beforeunload', function () {
if (self.script) self.script.onerror = empty$1;
}, false);
}
}
/**
* Inherits from Polling.
*/
componentInherit(JSONPPolling, polling);
/*
* JSONP only supports binary as base64 encoded strings
*/
JSONPPolling.prototype.supportsBinary = false;
/**
* Closes the socket.
*
* @api private
*/
JSONPPolling.prototype.doClose = function () {
if (this.script) {
this.script.parentNode.removeChild(this.script);
this.script = null;
}
if (this.form) {
this.form.parentNode.removeChild(this.form);
this.form = null;
this.iframe = null;
}
polling.prototype.doClose.call(this);
};
/**
* Starts a poll cycle.
*
* @api private
*/
JSONPPolling.prototype.doPoll = function () {
var self = this;
var script = document.createElement('script');
if (this.script) {
this.script.parentNode.removeChild(this.script);
this.script = null;
}
script.async = true;
script.src = this.uri();
script.onerror = function (e) {
self.onError('jsonp poll error', e);
};
var insertAt = document.getElementsByTagName('script')[0];
if (insertAt) {
insertAt.parentNode.insertBefore(script, insertAt);
} else {
(document.head || document.body).appendChild(script);
}
this.script = script;
var isUAgecko = 'undefined' !== typeof navigator && /gecko/i.test(navigator.userAgent);
if (isUAgecko) {
setTimeout(function () {
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
document.body.removeChild(iframe);
}, 100);
}
};
/**
* Writes with a hidden iframe.
*
* @param {String} data to send
* @param {Function} called upon flush.
* @api private
*/
JSONPPolling.prototype.doWrite = function (data, fn) {
var self = this;
if (!this.form) {
var form = document.createElement('form');
var area = document.createElement('textarea');
var id = this.iframeId = 'eio_iframe_' + this.index;
var iframe;
form.className = 'socketio';
form.style.position = 'absolute';
form.style.top = '-1000px';
form.style.left = '-1000px';
form.target = id;
form.method = 'POST';
form.setAttribute('accept-charset', 'utf-8');
area.name = 'd';
form.appendChild(area);
document.body.appendChild(form);
this.form = form;
this.area = area;
}
this.form.action = this.uri();
function complete () {
initIframe();
fn();
}
function initIframe () {
if (self.iframe) {
try {
self.form.removeChild(self.iframe);
} catch (e) {
self.onError('jsonp polling iframe removal error', e);
}
}
try {
// ie6 dynamic iframes with target="" support (thanks Chris Lambacher)
var html = '<iframe src="javascript:0" name="' + self.iframeId + '">';
iframe = document.createElement(html);
} catch (e) {
iframe = document.createElement('iframe');
iframe.name = self.iframeId;
iframe.src = 'javascript:0';
}
iframe.id = self.iframeId;
self.form.appendChild(iframe);
self.iframe = iframe;
}
initIframe();
// escape \n to prevent it from being converted into \r\n by some UAs
// double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side
data = data.replace(rEscapedNewline, '\\\n');
this.area.value = data.replace(rNewline, '\\n');
try {
this.form.submit();
} catch (e) {}
if (this.iframe.attachEvent) {
this.iframe.onreadystatechange = function () {
if (self.iframe.readyState === 'complete') {
complete();
}
};
} else {
this.iframe.onload = complete;
}
};
var empty$2 = {};
var empty$3 = /*#__PURE__*/Object.freeze({
__proto__: null,
'default': empty$2
});
var require$$1 = ( empty$3 && empty$2 ) || empty$3;
/**
* Module dependencies.
*/
var debug$6 = browser$3('engine.io-client:websocket');
var BrowserWebSocket = commonjsGlobal.WebSocket || commonjsGlobal.MozWebSocket;
var NodeWebSocket;
if (typeof window === 'undefined') {
try {
NodeWebSocket = require$$1;
} catch (e) { }
}
/**
* Get either the `WebSocket` or `MozWebSocket` globals
* in the browser or try to resolve WebSocket-compatible
* interface exposed by `ws` for Node-like environment.
*/
var WebSocket$1 = BrowserWebSocket;
if (!WebSocket$1 && typeof window === 'undefined') {
WebSocket$1 = NodeWebSocket;
}
/**
* Module exports.
*/
var websocket = WS;
/**
* WebSocket transport constructor.
*
* @api {Object} connection options
* @api public
*/
function WS (opts) {
var forceBase64 = (opts && opts.forceBase64);
if (forceBase64) {
this.supportsBinary = false;
}
this.perMessageDeflate = opts.perMessageDeflate;
this.usingBrowserWebSocket = BrowserWebSocket && !opts.forceNode;
this.protocols = opts.protocols;
if (!this.usingBrowserWebSocket) {
WebSocket$1 = NodeWebSocket;
}
transport.call(this, opts);
}
/**
* Inherits from Transport.
*/
componentInherit(WS, transport);
/**
* Transport name.
*
* @api public
*/
WS.prototype.name = 'websocket';
/*
* WebSockets support binary
*/
WS.prototype.supportsBinary = true;
/**
* Opens socket.
*
* @api private
*/
WS.prototype.doOpen = function () {
if (!this.check()) {
// let probe timeout
return;
}
var uri = this.uri();
var protocols = this.protocols;
var opts = {
agent: this.agent,
perMessageDeflate: this.perMessageDeflate
};
// SSL options for Node.js client
opts.pfx = this.pfx;
opts.key = this.key;
opts.passphrase = this.passphrase;
opts.cert = this.cert;
opts.ca = this.ca;
opts.ciphers = this.ciphers;
opts.rejectUnauthorized = this.rejectUnauthorized;
if (this.extraHeaders) {
opts.headers = this.extraHeaders;
}
if (this.localAddress) {
opts.localAddress = this.localAddress;
}
try {
this.ws = this.usingBrowserWebSocket ? (protocols ? new WebSocket$1(uri, protocols) : new WebSocket$1(uri)) : new WebSocket$1(uri, protocols, opts);
} catch (err) {
return this.emit('error', err);
}
if (this.ws.binaryType === undefined) {
this.supportsBinary = false;
}
if (this.ws.supports && this.ws.supports.binary) {
this.supportsBinary = true;
this.ws.binaryType = 'nodebuffer';
} else {
this.ws.binaryType = 'arraybuffer';
}
this.addEventListeners();
};
/**
* Adds event listeners to the socket
*
* @api private
*/
WS.prototype.addEventListeners = function () {
var self = this;
this.ws.onopen = function () {
self.onOpen();
};
this.ws.onclose = function () {
self.onClose();
};
this.ws.onmessage = function (ev) {
self.onData(ev.data);
};
this.ws.onerror = function (e) {
self.onError('websocket error', e);
};
};
/**
* Writes data to socket.
*
* @param {Array} array of packets.
* @api private
*/
WS.prototype.write = function (packets) {
var self = this;
this.writable = false;
// encodePacket efficient as it uses WS framing
// no need for encodePayload
var total = packets.length;
for (var i = 0, l = total; i < l; i++) {
(function (packet) {
browser$2.encodePacket(packet, self.supportsBinary, function (data) {
if (!self.usingBrowserWebSocket) {
// always create a new object (GH-437)
var opts = {};
if (packet.options) {
opts.compress = packet.options.compress;
}
if (self.perMessageDeflate) {
var len = 'string' === typeof data ? commonjsGlobal.Buffer.byteLength(data) : data.length;
if (len < self.perMessageDeflate.threshold) {
opts.compress = false;
}
}
}
// Sometimes the websocket has already been closed but the browser didn't
// have a chance of informing us about it yet, in that case send will
// throw an error
try {
if (self.usingBrowserWebSocket) {
// TypeError is thrown when passing the second argument on Safari
self.ws.send(data);
} else {
self.ws.send(data, opts);
}
} catch (e) {
debug$6('websocket closed before onclose event');
}
--total || done();
});
})(packets[i]);
}
function done () {
self.emit('flush');
// fake drain
// defer to next tick to allow Socket to clear writeBuffer
setTimeout(function () {
self.writable = true;
self.emit('drain');
}, 0);
}
};
/**
* Called upon close
*
* @api private
*/
WS.prototype.onClose = function () {
transport.prototype.onClose.call(this);
};
/**
* Closes socket.
*
* @api private
*/
WS.prototype.doClose = function () {
if (typeof this.ws !== 'undefined') {
this.ws.close();
}
};
/**
* Generates uri for connection.
*
* @api private
*/
WS.prototype.uri = function () {
var query = this.query || {};
var schema = this.secure ? 'wss' : 'ws';
var port = '';
// avoid port if default for schema
if (this.port && (('wss' === schema && Number(this.port) !== 443) ||
('ws' === schema && Number(this.port) !== 80))) {
port = ':' + this.port;
}
// append timestamp to URI
if (this.timestampRequests) {
query[this.timestampParam] = yeast_1();
}
// communicate binary support capabilities
if (!this.supportsBinary) {
query.b64 = 1;
}
query = parseqs.encode(query);
// prepend ? to query
if (query.length) {
query = '?' + query;
}
var ipv6 = this.hostname.indexOf(':') !== -1;
return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;
};
/**
* Feature detection for WebSocket.
*
* @return {Boolean} whether this transport is available.
* @api public
*/
WS.prototype.check = function () {
return !!WebSocket$1 && !('__initialize' in WebSocket$1 && this.name === WS.prototype.name);
};
/**
* Module dependencies
*/
/**
* Export transports.
*/
var polling_1 = polling$1;
var websocket_1 = websocket;
/**
* Polling transport polymorphic constructor.
* Decides on xhr vs jsonp based on feature detection.
*
* @api private
*/
function polling$1 (opts) {
var xhr;
var xd = false;
var xs = false;
var jsonp = false !== opts.jsonp;
if (commonjsGlobal.location) {
var isSSL = 'https:' === location.protocol;
var port = location.port;
// some user agents have empty `location.port`
if (!port) {
port = isSSL ? 443 : 80;
}
xd = opts.hostname !== location.hostname || port !== opts.port;
xs = opts.secure !== isSSL;
}
opts.xdomain = xd;
opts.xscheme = xs;
xhr = new xmlhttprequest(opts);
if ('open' in xhr && !opts.forceJSONP) {
return new pollingXhr(opts);
} else {
if (!jsonp) throw new Error('JSONP disabled');
return new pollingJsonp(opts);
}
}
var transports = {
polling: polling_1,
websocket: websocket_1
};
var indexOf = [].indexOf;
var indexof = function(arr, obj){
if (indexOf) return arr.indexOf(obj);
for (var i = 0; i < arr.length; ++i) {
if (arr[i] === obj) return i;
}
return -1;
};
/**
* Module dependencies.
*/
var debug$7 = browser$3('engine.io-client:socket');
/**
* Module exports.
*/
var socket = Socket;
/**
* Socket constructor.
*
* @param {String|Object} uri or options
* @param {Object} options
* @api public
*/
function Socket (uri, opts) {
if (!(this instanceof Socket)) return new Socket(uri, opts);
opts = opts || {};
if (uri && 'object' === typeof uri) {
opts = uri;
uri = null;
}
if (uri) {
uri = parseuri(uri);
opts.hostname = uri.host;
opts.secure = uri.protocol === 'https' || uri.protocol === 'wss';
opts.port = uri.port;
if (uri.query) opts.query = uri.query;
} else if (opts.host) {
opts.hostname = parseuri(opts.host).host;
}
this.secure = null != opts.secure ? opts.secure
: (commonjsGlobal.location && 'https:' === location.protocol);
if (opts.hostname && !opts.port) {
// if no port is specified manually, use the protocol default
opts.port = this.secure ? '443' : '80';
}
this.agent = opts.agent || false;
this.hostname = opts.hostname ||
(commonjsGlobal.location ? location.hostname : 'localhost');
this.port = opts.port || (commonjsGlobal.location && location.port
? location.port
: (this.secure ? 443 : 80));
this.query = opts.query || {};
if ('string' === typeof this.query) this.query = parseqs.decode(this.query);
this.upgrade = false !== opts.upgrade;
this.path = (opts.path || '/engine.io').replace(/\/$/, '') + '/';
this.forceJSONP = !!opts.forceJSONP;
this.jsonp = false !== opts.jsonp;
this.forceBase64 = !!opts.forceBase64;
this.enablesXDR = !!opts.enablesXDR;
this.timestampParam = opts.timestampParam || 't';
this.timestampRequests = opts.timestampRequests;
this.transports = opts.transports || ['polling', 'websocket'];
this.transportOptions = opts.transportOptions || {};
this.readyState = '';
this.writeBuffer = [];
this.prevBufferLen = 0;
this.policyPort = opts.policyPort || 843;
this.rememberUpgrade = opts.rememberUpgrade || false;
this.binaryType = null;
this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades;
this.perMessageDeflate = false !== opts.perMessageDeflate ? (opts.perMessageDeflate || {}) : false;
if (true === this.perMessageDeflate) this.perMessageDeflate = {};
if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) {
this.perMessageDeflate.threshold = 1024;
}
// SSL options for Node.js client
this.pfx = opts.pfx || null;
this.key = opts.key || null;
this.passphrase = opts.passphrase || null;
this.cert = opts.cert || null;
this.ca = opts.ca || null;
this.ciphers = opts.ciphers || null;
this.rejectUnauthorized = opts.rejectUnauthorized === undefined ? true : opts.rejectUnauthorized;
this.forceNode = !!opts.forceNode;
// other options for Node.js client
var freeGlobal = typeof commonjsGlobal === 'object' && commonjsGlobal;
if (freeGlobal.global === freeGlobal) {
if (opts.extraHeaders && Object.keys(opts.extraHeaders).length > 0) {
this.extraHeaders = opts.extraHeaders;
}
if (opts.localAddress) {
this.localAddress = opts.localAddress;
}
}
// set on handshake
this.id = null;
this.upgrades = null;
this.pingInterval = null;
this.pingTimeout = null;
// set on heartbeat
this.pingIntervalTimer = null;
this.pingTimeoutTimer = null;
this.open();
}
Socket.priorWebsocketSuccess = false;
/**
* Mix in `Emitter`.
*/
componentEmitter(Socket.prototype);
/**
* Protocol version.
*
* @api public
*/
Socket.protocol = browser$2.protocol; // this is an int
/**
* Expose deps for legacy compatibility
* and standalone browser access.
*/
Socket.Socket = Socket;
Socket.Transport = transport;
Socket.transports = transports;
Socket.parser = browser$2;
/**
* Creates transport of the given type.
*
* @param {String} transport name
* @return {Transport}
* @api private
*/
Socket.prototype.createTransport = function (name) {
debug$7('creating transport "%s"', name);
var query = clone(this.query);
// append engine.io protocol identifier
query.EIO = browser$2.protocol;
// transport name
query.transport = name;
// per-transport options
var options = this.transportOptions[name] || {};
// session id if we already have one
if (this.id) query.sid = this.id;
var transport = new transports[name]({
query: query,
socket: this,
agent: options.agent || this.agent,
hostname: options.hostname || this.hostname,
port: options.port || this.port,
secure: options.secure || this.secure,
path: options.path || this.path,
forceJSONP: options.forceJSONP || this.forceJSONP,
jsonp: options.jsonp || this.jsonp,
forceBase64: options.forceBase64 || this.forceBase64,
enablesXDR: options.enablesXDR || this.enablesXDR,
timestampRequests: options.timestampRequests || this.timestampRequests,
timestampParam: options.timestampParam || this.timestampParam,
policyPort: options.policyPort || this.policyPort,
pfx: options.pfx || this.pfx,
key: options.key || this.key,
passphrase: options.passphrase || this.passphrase,
cert: options.cert || this.cert,
ca: options.ca || this.ca,
ciphers: options.ciphers || this.ciphers,
rejectUnauthorized: options.rejectUnauthorized || this.rejectUnauthorized,
perMessageDeflate: options.perMessageDeflate || this.perMessageDeflate,
extraHeaders: options.extraHeaders || this.extraHeaders,
forceNode: options.forceNode || this.forceNode,
localAddress: options.localAddress || this.localAddress,
requestTimeout: options.requestTimeout || this.requestTimeout,
protocols: options.protocols || void (0)
});
return transport;
};
function clone (obj) {
var o = {};
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
o[i] = obj[i];
}
}
return o;
}
/**
* Initializes transport to use and starts probe.
*
* @api private
*/
Socket.prototype.open = function () {
var transport;
if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') !== -1) {
transport = 'websocket';
} else if (0 === this.transports.length) {
// Emit error on next tick so it can be listened to
var self = this;
setTimeout(function () {
self.emit('error', 'No transports available');
}, 0);
return;
} else {
transport = this.transports[0];
}
this.readyState = 'opening';
// Retry with the next transport if the transport is disabled (jsonp: false)
try {
transport = this.createTransport(transport);
} catch (e) {
this.transports.shift();
this.open();
return;
}
transport.open();
this.setTransport(transport);
};
/**
* Sets the current transport. Disables the existing one (if any).
*
* @api private
*/
Socket.prototype.setTransport = function (transport) {
debug$7('setting transport %s', transport.name);
var self = this;
if (this.transport) {
debug$7('clearing existing transport %s', this.transport.name);
this.transport.removeAllListeners();
}
// set up transport
this.transport = transport;
// set up transport listeners
transport
.on('drain', function () {
self.onDrain();
})
.on('packet', function (packet) {
self.onPacket(packet);
})
.on('error', function (e) {
self.onError(e);
})
.on('close', function () {
self.onClose('transport close');
});
};
/**
* Probes a transport.
*
* @param {String} transport name
* @api private
*/
Socket.prototype.probe = function (name) {
debug$7('probing transport "%s"', name);
var transport = this.createTransport(name, { probe: 1 });
var failed = false;
var self = this;
Socket.priorWebsocketSuccess = false;
function onTransportOpen () {
if (self.onlyBinaryUpgrades) {
var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;
failed = failed || upgradeLosesBinary;
}
if (failed) return;
debug$7('probe transport "%s" opened', name);
transport.send([{ type: 'ping', data: 'probe' }]);
transport.once('packet', function (msg) {
if (failed) return;
if ('pong' === msg.type && 'probe' === msg.data) {
debug$7('probe transport "%s" pong', name);
self.upgrading = true;
self.emit('upgrading', transport);
if (!transport) return;
Socket.priorWebsocketSuccess = 'websocket' === transport.name;
debug$7('pausing current transport "%s"', self.transport.name);
self.transport.pause(function () {
if (failed) return;
if ('closed' === self.readyState) return;
debug$7('changing transport and sending upgrade packet');
cleanup();
self.setTransport(transport);
transport.send([{ type: 'upgrade' }]);
self.emit('upgrade', transport);
transport = null;
self.upgrading = false;
self.flush();
});
} else {
debug$7('probe transport "%s" failed', name);
var err = new Error('probe error');
err.transport = transport.name;
self.emit('upgradeError', err);
}
});
}
function freezeTransport () {
if (failed) return;
// Any callback called by transport should be ignored since now
failed = true;
cleanup();
transport.close();
transport = null;
}
// Handle any error that happens while probing
function onerror (err) {
var error = new Error('probe error: ' + err);
error.transport = transport.name;
freezeTransport();
debug$7('probe transport "%s" failed because of error: %s', name, err);
self.emit('upgradeError', error);
}
function onTransportClose () {
onerror('transport closed');
}
// When the socket is closed while we're probing
function onclose () {
onerror('socket closed');
}
// When the socket is upgraded while we're probing
function onupgrade (to) {
if (transport && to.name !== transport.name) {
debug$7('"%s" works - aborting "%s"', to.name, transport.name);
freezeTransport();
}
}
// Remove all listeners on the transport and on self
function cleanup () {
transport.removeListener('open', onTransportOpen);
transport.removeListener('error', onerror);
transport.removeListener('close', onTransportClose);
self.removeListener('close', onclose);
self.removeListener('upgrading', onupgrade);
}
transport.once('open', onTransportOpen);
transport.once('error', onerror);
transport.once('close', onTransportClose);
this.once('close', onclose);
this.once('upgrading', onupgrade);
transport.open();
};
/**
* Called when connection is deemed open.
*
* @api public
*/
Socket.prototype.onOpen = function () {
debug$7('socket open');
this.readyState = 'open';
Socket.priorWebsocketSuccess = 'websocket' === this.transport.name;
this.emit('open');
this.flush();
// we check for `readyState` in case an `open`
// listener already closed the socket
if ('open' === this.readyState && this.upgrade && this.transport.pause) {
debug$7('starting upgrade probes');
for (var i = 0, l = this.upgrades.length; i < l; i++) {
this.probe(this.upgrades[i]);
}
}
};
/**
* Handles a packet.
*
* @api private
*/
Socket.prototype.onPacket = function (packet) {
if ('opening' === this.readyState || 'open' === this.readyState ||
'closing' === this.readyState) {
debug$7('socket receive: type "%s", data "%s"', packet.type, packet.data);
this.emit('packet', packet);
// Socket is live - any packet counts
this.emit('heartbeat');
switch (packet.type) {
case 'open':
this.onHandshake(JSON.parse(packet.data));
break;
case 'pong':
this.setPing();
this.emit('pong');
break;
case 'error':
var err = new Error('server error');
err.code = packet.data;
this.onError(err);
break;
case 'message':
this.emit('data', packet.data);
this.emit('message', packet.data);
break;
}
} else {
debug$7('packet received with socket readyState "%s"', this.readyState);
}
};
/**
* Called upon handshake completion.
*
* @param {Object} handshake obj
* @api private
*/
Socket.prototype.onHandshake = function (data) {
this.emit('handshake', data);
this.id = data.sid;
this.transport.query.sid = data.sid;
this.upgrades = this.filterUpgrades(data.upgrades);
this.pingInterval = data.pingInterval;
this.pingTimeout = data.pingTimeout;
this.onOpen();
// In case open handler closes socket
if ('closed' === this.readyState) return;
this.setPing();
// Prolong liveness of socket on heartbeat
this.removeListener('heartbeat', this.onHeartbeat);
this.on('heartbeat', this.onHeartbeat);
};
/**
* Resets ping timeout.
*
* @api private
*/
Socket.prototype.onHeartbeat = function (timeout) {
clearTimeout(this.pingTimeoutTimer);
var self = this;
self.pingTimeoutTimer = setTimeout(function () {
if ('closed' === self.readyState) return;
self.onClose('ping timeout');
}, timeout || (self.pingInterval + self.pingTimeout));
};
/**
* Pings server every `this.pingInterval` and expects response
* within `this.pingTimeout` or closes connection.
*
* @api private
*/
Socket.prototype.setPing = function () {
var self = this;
clearTimeout(self.pingIntervalTimer);
self.pingIntervalTimer = setTimeout(function () {
debug$7('writing ping packet - expecting pong within %sms', self.pingTimeout);
self.ping();
self.onHeartbeat(self.pingTimeout);
}, self.pingInterval);
};
/**
* Sends a ping packet.
*
* @api private
*/
Socket.prototype.ping = function () {
var self = this;
this.sendPacket('ping', function () {
self.emit('ping');
});
};
/**
* Called on `drain` event
*
* @api private
*/
Socket.prototype.onDrain = function () {
this.writeBuffer.splice(0, this.prevBufferLen);
// setting prevBufferLen = 0 is very important
// for example, when upgrading, upgrade packet is sent over,
// and a nonzero prevBufferLen could cause problems on `drain`
this.prevBufferLen = 0;
if (0 === this.writeBuffer.length) {
this.emit('drain');
} else {
this.flush();
}
};
/**
* Flush write buffers.
*
* @api private
*/
Socket.prototype.flush = function () {
if ('closed' !== this.readyState && this.transport.writable &&
!this.upgrading && this.writeBuffer.length) {
debug$7('flushing %d packets in socket', this.writeBuffer.length);
this.transport.send(this.writeBuffer);
// keep track of current length of writeBuffer
// splice writeBuffer and callbackBuffer on `drain`
this.prevBufferLen = this.writeBuffer.length;
this.emit('flush');
}
};
/**
* Sends a message.
*
* @param {String} message.
* @param {Function} callback function.
* @param {Object} options.
* @return {Socket} for chaining.
* @api public
*/
Socket.prototype.write =
Socket.prototype.send = function (msg, options, fn) {
this.sendPacket('message', msg, options, fn);
return this;
};
/**
* Sends a packet.
*
* @param {String} packet type.
* @param {String} data.
* @param {Object} options.
* @param {Function} callback function.
* @api private
*/
Socket.prototype.sendPacket = function (type, data, options, fn) {
if ('function' === typeof data) {
fn = data;
data = undefined;
}
if ('function' === typeof options) {
fn = options;
options = null;
}
if ('closing' === this.readyState || 'closed' === this.readyState) {
return;
}
options = options || {};
options.compress = false !== options.compress;
var packet = {
type: type,
data: data,
options: options
};
this.emit('packetCreate', packet);
this.writeBuffer.push(packet);
if (fn) this.once('flush', fn);
this.flush();
};
/**
* Closes the connection.
*
* @api private
*/
Socket.prototype.close = function () {
if ('opening' === this.readyState || 'open' === this.readyState) {
this.readyState = 'closing';
var self = this;
if (this.writeBuffer.length) {
this.once('drain', function () {
if (this.upgrading) {
waitForUpgrade();
} else {
close();
}
});
} else if (this.upgrading) {
waitForUpgrade();
} else {
close();
}
}
function close () {
self.onClose('forced close');
debug$7('socket closing - telling transport to close');
self.transport.close();
}
function cleanupAndClose () {
self.removeListener('upgrade', cleanupAndClose);
self.removeListener('upgradeError', cleanupAndClose);
close();
}
function waitForUpgrade () {
// wait for upgrade to finish since we can't send packets while pausing a transport
self.once('upgrade', cleanupAndClose);
self.once('upgradeError', cleanupAndClose);
}
return this;
};
/**
* Called upon transport error
*
* @api private
*/
Socket.prototype.onError = function (err) {
debug$7('socket error %j', err);
Socket.priorWebsocketSuccess = false;
this.emit('error', err);
this.onClose('transport error', err);
};
/**
* Called upon transport close.
*
* @api private
*/
Socket.prototype.onClose = function (reason, desc) {
if ('opening' === this.readyState || 'open' === this.readyState || 'closing' === this.readyState) {
debug$7('socket close with reason: "%s"', reason);
var self = this;
// clear timers
clearTimeout(this.pingIntervalTimer);
clearTimeout(this.pingTimeoutTimer);
// stop event from firing again for transport
this.transport.removeAllListeners('close');
// ensure transport won't stay open
this.transport.close();
// ignore further transport communication
this.transport.removeAllListeners();
// set ready state
this.readyState = 'closed';
// clear session id
this.id = null;
// emit close event
this.emit('close', reason, desc);
// clean buffers after, so users can still
// grab the buffers on `close` event
self.writeBuffer = [];
self.prevBufferLen = 0;
}
};
/**
* Filters upgrades, returning only those matching client transports.
*
* @param {Array} server upgrades
* @api private
*
*/
Socket.prototype.filterUpgrades = function (upgrades) {
var filteredUpgrades = [];
for (var i = 0, j = upgrades.length; i < j; i++) {
if (~indexof(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);
}
return filteredUpgrades;
};
var lib$1 = socket;
/**
* Exports parser
*
* @api public
*
*/
var parser = browser$2;
lib$1.parser = parser;
var toArray_1 = toArray;
function toArray(list, index) {
var array = [];
index = index || 0;
for (var i = index || 0; i < list.length; i++) {
array[i - index] = list[i];
}
return array
}
/**
* Module exports.
*/
var on_1 = on;
/**
* Helper for subscriptions.
*
* @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`
* @param {String} event name
* @param {Function} callback
* @api public
*/
function on (obj, ev, fn) {
obj.on(ev, fn);
return {
destroy: function () {
obj.removeListener(ev, fn);
}
};
}
/**
* Slice reference.
*/
var slice = [].slice;
/**
* Bind `obj` to `fn`.
*
* @param {Object} obj
* @param {Function|String} fn or string
* @return {Function}
* @api public
*/
var componentBind = function(obj, fn){
if ('string' == typeof fn) fn = obj[fn];
if ('function' != typeof fn) throw new Error('bind() requires a function');
var args = slice.call(arguments, 2);
return function(){
return fn.apply(obj, args.concat(slice.call(arguments)));
}
};
var socket$1 = createCommonjsModule(function (module, exports) {
/**
* Module dependencies.
*/
var debug = browser('socket.io-client:socket');
/**
* Module exports.
*/
module.exports = exports = Socket;
/**
* Internal events (blacklisted).
* These events can't be emitted by the user.
*
* @api private
*/
var events = {
connect: 1,
connect_error: 1,
connect_timeout: 1,
connecting: 1,
disconnect: 1,
error: 1,
reconnect: 1,
reconnect_attempt: 1,
reconnect_failed: 1,
reconnect_error: 1,
reconnecting: 1,
ping: 1,
pong: 1
};
/**
* Shortcut to `Emitter#emit`.
*/
var emit = componentEmitter.prototype.emit;
/**
* `Socket` constructor.
*
* @api public
*/
function Socket (io, nsp, opts) {
this.io = io;
this.nsp = nsp;
this.json = this; // compat
this.ids = 0;
this.acks = {};
this.receiveBuffer = [];
this.sendBuffer = [];
this.connected = false;
this.disconnected = true;
this.flags = {};
if (opts && opts.query) {
this.query = opts.query;
}
if (this.io.autoConnect) this.open();
}
/**
* Mix in `Emitter`.
*/
componentEmitter(Socket.prototype);
/**
* Subscribe to open, close and packet events
*
* @api private
*/
Socket.prototype.subEvents = function () {
if (this.subs) return;
var io = this.io;
this.subs = [
on_1(io, 'open', componentBind(this, 'onopen')),
on_1(io, 'packet', componentBind(this, 'onpacket')),
on_1(io, 'close', componentBind(this, 'onclose'))
];
};
/**
* "Opens" the socket.
*
* @api public
*/
Socket.prototype.open =
Socket.prototype.connect = function () {
if (this.connected) return this;
this.subEvents();
this.io.open(); // ensure open
if ('open' === this.io.readyState) this.onopen();
this.emit('connecting');
return this;
};
/**
* Sends a `message` event.
*
* @return {Socket} self
* @api public
*/
Socket.prototype.send = function () {
var args = toArray_1(arguments);
args.unshift('message');
this.emit.apply(this, args);
return this;
};
/**
* Override `emit`.
* If the event is in `events`, it's emitted normally.
*
* @param {String} event name
* @return {Socket} self
* @api public
*/
Socket.prototype.emit = function (ev) {
if (events.hasOwnProperty(ev)) {
emit.apply(this, arguments);
return this;
}
var args = toArray_1(arguments);
var packet = {
type: (this.flags.binary !== undefined ? this.flags.binary : hasBinary2(args)) ? socket_ioParser.BINARY_EVENT : socket_ioParser.EVENT,
data: args
};
packet.options = {};
packet.options.compress = !this.flags || false !== this.flags.compress;
// event ack callback
if ('function' === typeof args[args.length - 1]) {
debug('emitting packet with ack id %d', this.ids);
this.acks[this.ids] = args.pop();
packet.id = this.ids++;
}
if (this.connected) {
this.packet(packet);
} else {
this.sendBuffer.push(packet);
}
this.flags = {};
return this;
};
/**
* Sends a packet.
*
* @param {Object} packet
* @api private
*/
Socket.prototype.packet = function (packet) {
packet.nsp = this.nsp;
this.io.packet(packet);
};
/**
* Called upon engine `open`.
*
* @api private
*/
Socket.prototype.onopen = function () {
debug('transport is open - connecting');
// write connect packet if necessary
if ('/' !== this.nsp) {
if (this.query) {
var query = typeof this.query === 'object' ? parseqs.encode(this.query) : this.query;
debug('sending connect packet with query %s', query);
this.packet({type: socket_ioParser.CONNECT, query: query});
} else {
this.packet({type: socket_ioParser.CONNECT});
}
}
};
/**
* Called upon engine `close`.
*
* @param {String} reason
* @api private
*/
Socket.prototype.onclose = function (reason) {
debug('close (%s)', reason);
this.connected = false;
this.disconnected = true;
delete this.id;
this.emit('disconnect', reason);
};
/**
* Called with socket packet.
*
* @param {Object} packet
* @api private
*/
Socket.prototype.onpacket = function (packet) {
var sameNamespace = packet.nsp === this.nsp;
var rootNamespaceError = packet.type === socket_ioParser.ERROR && packet.nsp === '/';
if (!sameNamespace && !rootNamespaceError) return;
switch (packet.type) {
case socket_ioParser.CONNECT:
this.onconnect();
break;
case socket_ioParser.EVENT:
this.onevent(packet);
break;
case socket_ioParser.BINARY_EVENT:
this.onevent(packet);
break;
case socket_ioParser.ACK:
this.onack(packet);
break;
case socket_ioParser.BINARY_ACK:
this.onack(packet);
break;
case socket_ioParser.DISCONNECT:
this.ondisconnect();
break;
case socket_ioParser.ERROR:
this.emit('error', packet.data);
break;
}
};
/**
* Called upon a server event.
*
* @param {Object} packet
* @api private
*/
Socket.prototype.onevent = function (packet) {
var args = packet.data || [];
debug('emitting event %j', args);
if (null != packet.id) {
debug('attaching ack callback to event');
args.push(this.ack(packet.id));
}
if (this.connected) {
emit.apply(this, args);
} else {
this.receiveBuffer.push(args);
}
};
/**
* Produces an ack callback to emit with an event.
*
* @api private
*/
Socket.prototype.ack = function (id) {
var self = this;
var sent = false;
return function () {
// prevent double callbacks
if (sent) return;
sent = true;
var args = toArray_1(arguments);
debug('sending ack %j', args);
self.packet({
type: hasBinary2(args) ? socket_ioParser.BINARY_ACK : socket_ioParser.ACK,
id: id,
data: args
});
};
};
/**
* Called upon a server acknowlegement.
*
* @param {Object} packet
* @api private
*/
Socket.prototype.onack = function (packet) {
var ack = this.acks[packet.id];
if ('function' === typeof ack) {
debug('calling ack %s with %j', packet.id, packet.data);
ack.apply(this, packet.data);
delete this.acks[packet.id];
} else {
debug('bad ack %s', packet.id);
}
};
/**
* Called upon server connect.
*
* @api private
*/
Socket.prototype.onconnect = function () {
this.connected = true;
this.disconnected = false;
this.emit('connect');
this.emitBuffered();
};
/**
* Emit buffered events (received and emitted).
*
* @api private
*/
Socket.prototype.emitBuffered = function () {
var i;
for (i = 0; i < this.receiveBuffer.length; i++) {
emit.apply(this, this.receiveBuffer[i]);
}
this.receiveBuffer = [];
for (i = 0; i < this.sendBuffer.length; i++) {
this.packet(this.sendBuffer[i]);
}
this.sendBuffer = [];
};
/**
* Called upon server disconnect.
*
* @api private
*/
Socket.prototype.ondisconnect = function () {
debug('server disconnect (%s)', this.nsp);
this.destroy();
this.onclose('io server disconnect');
};
/**
* Called upon forced client/server side disconnections,
* this method ensures the manager stops tracking us and
* that reconnections don't get triggered for this.
*
* @api private.
*/
Socket.prototype.destroy = function () {
if (this.subs) {
// clean subscriptions to avoid reconnections
for (var i = 0; i < this.subs.length; i++) {
this.subs[i].destroy();
}
this.subs = null;
}
this.io.destroy(this);
};
/**
* Disconnects the socket manually.
*
* @return {Socket} self
* @api public
*/
Socket.prototype.close =
Socket.prototype.disconnect = function () {
if (this.connected) {
debug('performing disconnect (%s)', this.nsp);
this.packet({ type: socket_ioParser.DISCONNECT });
}
// remove socket from pool
this.destroy();
if (this.connected) {
// fire events
this.onclose('io client disconnect');
}
return this;
};
/**
* Sets the compress flag.
*
* @param {Boolean} if `true`, compresses the sending data
* @return {Socket} self
* @api public
*/
Socket.prototype.compress = function (compress) {
this.flags.compress = compress;
return this;
};
/**
* Sets the binary flag
*
* @param {Boolean} whether the emitted data contains binary
* @return {Socket} self
* @api public
*/
Socket.prototype.binary = function (binary) {
this.flags.binary = binary;
return this;
};
});
/**
* Expose `Backoff`.
*/
var backo2 = Backoff;
/**
* Initialize backoff timer with `opts`.
*
* - `min` initial timeout in milliseconds [100]
* - `max` max timeout [10000]
* - `jitter` [0]
* - `factor` [2]
*
* @param {Object} opts
* @api public
*/
function Backoff(opts) {
opts = opts || {};
this.ms = opts.min || 100;
this.max = opts.max || 10000;
this.factor = opts.factor || 2;
this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;
this.attempts = 0;
}
/**
* Return the backoff duration.
*
* @return {Number}
* @api public
*/
Backoff.prototype.duration = function(){
var ms = this.ms * Math.pow(this.factor, this.attempts++);
if (this.jitter) {
var rand = Math.random();
var deviation = Math.floor(rand * this.jitter * ms);
ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;
}
return Math.min(ms, this.max) | 0;
};
/**
* Reset the number of attempts.
*
* @api public
*/
Backoff.prototype.reset = function(){
this.attempts = 0;
};
/**
* Set the minimum duration
*
* @api public
*/
Backoff.prototype.setMin = function(min){
this.ms = min;
};
/**
* Set the maximum duration
*
* @api public
*/
Backoff.prototype.setMax = function(max){
this.max = max;
};
/**
* Set the jitter
*
* @api public
*/
Backoff.prototype.setJitter = function(jitter){
this.jitter = jitter;
};
/**
* Module dependencies.
*/
var debug$8 = browser('socket.io-client:manager');
/**
* IE6+ hasOwnProperty
*/
var has$3 = Object.prototype.hasOwnProperty;
/**
* Module exports
*/
var manager = Manager;
/**
* `Manager` constructor.
*
* @param {String} engine instance or engine uri/opts
* @param {Object} options
* @api public
*/
function Manager (uri, opts) {
if (!(this instanceof Manager)) return new Manager(uri, opts);
if (uri && ('object' === typeof uri)) {
opts = uri;
uri = undefined;
}
opts = opts || {};
opts.path = opts.path || '/socket.io';
this.nsps = {};
this.subs = [];
this.opts = opts;
this.reconnection(opts.reconnection !== false);
this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);
this.reconnectionDelay(opts.reconnectionDelay || 1000);
this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);
this.randomizationFactor(opts.randomizationFactor || 0.5);
this.backoff = new backo2({
min: this.reconnectionDelay(),
max: this.reconnectionDelayMax(),
jitter: this.randomizationFactor()
});
this.timeout(null == opts.timeout ? 20000 : opts.timeout);
this.readyState = 'closed';
this.uri = uri;
this.connecting = [];
this.lastPing = null;
this.encoding = false;
this.packetBuffer = [];
var _parser = opts.parser || socket_ioParser;
this.encoder = new _parser.Encoder();
this.decoder = new _parser.Decoder();
this.autoConnect = opts.autoConnect !== false;
if (this.autoConnect) this.open();
}
/**
* Propagate given event to sockets and emit on `this`
*
* @api private
*/
Manager.prototype.emitAll = function () {
this.emit.apply(this, arguments);
for (var nsp in this.nsps) {
if (has$3.call(this.nsps, nsp)) {
this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);
}
}
};
/**
* Update `socket.id` of all sockets
*
* @api private
*/
Manager.prototype.updateSocketIds = function () {
for (var nsp in this.nsps) {
if (has$3.call(this.nsps, nsp)) {
this.nsps[nsp].id = this.generateId(nsp);
}
}
};
/**
* generate `socket.id` for the given `nsp`
*
* @param {String} nsp
* @return {String}
* @api private
*/
Manager.prototype.generateId = function (nsp) {
return (nsp === '/' ? '' : (nsp + '#')) + this.engine.id;
};
/**
* Mix in `Emitter`.
*/
componentEmitter(Manager.prototype);
/**
* Sets the `reconnection` config.
*
* @param {Boolean} true/false if it should automatically reconnect
* @return {Manager} self or value
* @api public
*/
Manager.prototype.reconnection = function (v) {
if (!arguments.length) return this._reconnection;
this._reconnection = !!v;
return this;
};
/**
* Sets the reconnection attempts config.
*
* @param {Number} max reconnection attempts before giving up
* @return {Manager} self or value
* @api public
*/
Manager.prototype.reconnectionAttempts = function (v) {
if (!arguments.length) return this._reconnectionAttempts;
this._reconnectionAttempts = v;
return this;
};
/**
* Sets the delay between reconnections.
*
* @param {Number} delay
* @return {Manager} self or value
* @api public
*/
Manager.prototype.reconnectionDelay = function (v) {
if (!arguments.length) return this._reconnectionDelay;
this._reconnectionDelay = v;
this.backoff && this.backoff.setMin(v);
return this;
};
Manager.prototype.randomizationFactor = function (v) {
if (!arguments.length) return this._randomizationFactor;
this._randomizationFactor = v;
this.backoff && this.backoff.setJitter(v);
return this;
};
/**
* Sets the maximum delay between reconnections.
*
* @param {Number} delay
* @return {Manager} self or value
* @api public
*/
Manager.prototype.reconnectionDelayMax = function (v) {
if (!arguments.length) return this._reconnectionDelayMax;
this._reconnectionDelayMax = v;
this.backoff && this.backoff.setMax(v);
return this;
};
/**
* Sets the connection timeout. `false` to disable
*
* @return {Manager} self or value
* @api public
*/
Manager.prototype.timeout = function (v) {
if (!arguments.length) return this._timeout;
this._timeout = v;
return this;
};
/**
* Starts trying to reconnect if reconnection is enabled and we have not
* started reconnecting yet
*
* @api private
*/
Manager.prototype.maybeReconnectOnOpen = function () {
// Only try to reconnect if it's the first time we're connecting
if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {
// keeps reconnection from firing twice for the same reconnection loop
this.reconnect();
}
};
/**
* Sets the current transport `socket`.
*
* @param {Function} optional, callback
* @return {Manager} self
* @api public
*/
Manager.prototype.open =
Manager.prototype.connect = function (fn, opts) {
debug$8('readyState %s', this.readyState);
if (~this.readyState.indexOf('open')) return this;
debug$8('opening %s', this.uri);
this.engine = lib$1(this.uri, this.opts);
var socket = this.engine;
var self = this;
this.readyState = 'opening';
this.skipReconnect = false;
// emit `open`
var openSub = on_1(socket, 'open', function () {
self.onopen();
fn && fn();
});
// emit `connect_error`
var errorSub = on_1(socket, 'error', function (data) {
debug$8('connect_error');
self.cleanup();
self.readyState = 'closed';
self.emitAll('connect_error', data);
if (fn) {
var err = new Error('Connection error');
err.data = data;
fn(err);
} else {
// Only do this if there is no fn to handle the error
self.maybeReconnectOnOpen();
}
});
// emit `connect_timeout`
if (false !== this._timeout) {
var timeout = this._timeout;
debug$8('connect attempt will timeout after %d', timeout);
// set timer
var timer = setTimeout(function () {
debug$8('connect attempt timed out after %d', timeout);
openSub.destroy();
socket.close();
socket.emit('error', 'timeout');
self.emitAll('connect_timeout', timeout);
}, timeout);
this.subs.push({
destroy: function () {
clearTimeout(timer);
}
});
}
this.subs.push(openSub);
this.subs.push(errorSub);
return this;
};
/**
* Called upon transport open.
*
* @api private
*/
Manager.prototype.onopen = function () {
debug$8('open');
// clear old subs
this.cleanup();
// mark as open
this.readyState = 'open';
this.emit('open');
// add new subs
var socket = this.engine;
this.subs.push(on_1(socket, 'data', componentBind(this, 'ondata')));
this.subs.push(on_1(socket, 'ping', componentBind(this, 'onping')));
this.subs.push(on_1(socket, 'pong', componentBind(this, 'onpong')));
this.subs.push(on_1(socket, 'error', componentBind(this, 'onerror')));
this.subs.push(on_1(socket, 'close', componentBind(this, 'onclose')));
this.subs.push(on_1(this.decoder, 'decoded', componentBind(this, 'ondecoded')));
};
/**
* Called upon a ping.
*
* @api private
*/
Manager.prototype.onping = function () {
this.lastPing = new Date();
this.emitAll('ping');
};
/**
* Called upon a packet.
*
* @api private
*/
Manager.prototype.onpong = function () {
this.emitAll('pong', new Date() - this.lastPing);
};
/**
* Called with data.
*
* @api private
*/
Manager.prototype.ondata = function (data) {
this.decoder.add(data);
};
/**
* Called when parser fully decodes a packet.
*
* @api private
*/
Manager.prototype.ondecoded = function (packet) {
this.emit('packet', packet);
};
/**
* Called upon socket error.
*
* @api private
*/
Manager.prototype.onerror = function (err) {
debug$8('error', err);
this.emitAll('error', err);
};
/**
* Creates a new socket for the given `nsp`.
*
* @return {Socket}
* @api public
*/
Manager.prototype.socket = function (nsp, opts) {
var socket = this.nsps[nsp];
if (!socket) {
socket = new socket$1(this, nsp, opts);
this.nsps[nsp] = socket;
var self = this;
socket.on('connecting', onConnecting);
socket.on('connect', function () {
socket.id = self.generateId(nsp);
});
if (this.autoConnect) {
// manually call here since connecting event is fired before listening
onConnecting();
}
}
function onConnecting () {
if (!~indexof(self.connecting, socket)) {
self.connecting.push(socket);
}
}
return socket;
};
/**
* Called upon a socket close.
*
* @param {Socket} socket
*/
Manager.prototype.destroy = function (socket) {
var index = indexof(this.connecting, socket);
if (~index) this.connecting.splice(index, 1);
if (this.connecting.length) return;
this.close();
};
/**
* Writes a packet.
*
* @param {Object} packet
* @api private
*/
Manager.prototype.packet = function (packet) {
debug$8('writing packet %j', packet);
var self = this;
if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;
if (!self.encoding) {
// encode, then write to engine with result
self.encoding = true;
this.encoder.encode(packet, function (encodedPackets) {
for (var i = 0; i < encodedPackets.length; i++) {
self.engine.write(encodedPackets[i], packet.options);
}
self.encoding = false;
self.processPacketQueue();
});
} else { // add packet to the queue
self.packetBuffer.push(packet);
}
};
/**
* If packet buffer is non-empty, begins encoding the
* next packet in line.
*
* @api private
*/
Manager.prototype.processPacketQueue = function () {
if (this.packetBuffer.length > 0 && !this.encoding) {
var pack = this.packetBuffer.shift();
this.packet(pack);
}
};
/**
* Clean up transport subscriptions and packet buffer.
*
* @api private
*/
Manager.prototype.cleanup = function () {
debug$8('cleanup');
var subsLength = this.subs.length;
for (var i = 0; i < subsLength; i++) {
var sub = this.subs.shift();
sub.destroy();
}
this.packetBuffer = [];
this.encoding = false;
this.lastPing = null;
this.decoder.destroy();
};
/**
* Close the current socket.
*
* @api private
*/
Manager.prototype.close =
Manager.prototype.disconnect = function () {
debug$8('disconnect');
this.skipReconnect = true;
this.reconnecting = false;
if ('opening' === this.readyState) {
// `onclose` will not fire because
// an open event never happened
this.cleanup();
}
this.backoff.reset();
this.readyState = 'closed';
if (this.engine) this.engine.close();
};
/**
* Called upon engine close.
*
* @api private
*/
Manager.prototype.onclose = function (reason) {
debug$8('onclose');
this.cleanup();
this.backoff.reset();
this.readyState = 'closed';
this.emit('close', reason);
if (this._reconnection && !this.skipReconnect) {
this.reconnect();
}
};
/**
* Attempt a reconnection.
*
* @api private
*/
Manager.prototype.reconnect = function () {
if (this.reconnecting || this.skipReconnect) return this;
var self = this;
if (this.backoff.attempts >= this._reconnectionAttempts) {
debug$8('reconnect failed');
this.backoff.reset();
this.emitAll('reconnect_failed');
this.reconnecting = false;
} else {
var delay = this.backoff.duration();
debug$8('will wait %dms before reconnect attempt', delay);
this.reconnecting = true;
var timer = setTimeout(function () {
if (self.skipReconnect) return;
debug$8('attempting reconnect');
self.emitAll('reconnect_attempt', self.backoff.attempts);
self.emitAll('reconnecting', self.backoff.attempts);
// check again for the case socket closed in above events
if (self.skipReconnect) return;
self.open(function (err) {
if (err) {
debug$8('reconnect attempt error');
self.reconnecting = false;
self.reconnect();
self.emitAll('reconnect_error', err.data);
} else {
debug$8('reconnect success');
self.onreconnect();
}
});
}, delay);
this.subs.push({
destroy: function () {
clearTimeout(timer);
}
});
}
};
/**
* Called upon successful reconnect.
*
* @api private
*/
Manager.prototype.onreconnect = function () {
var attempt = this.backoff.attempts;
this.reconnecting = false;
this.backoff.reset();
this.updateSocketIds();
this.emitAll('reconnect', attempt);
};
var lib$2 = createCommonjsModule(function (module, exports) {
/**
* Module dependencies.
*/
var debug = browser('socket.io-client');
/**
* Module exports.
*/
module.exports = exports = lookup;
/**
* Managers cache.
*/
var cache = exports.managers = {};
/**
* Looks up an existing `Manager` for multiplexing.
* If the user summons:
*
* `io('http://localhost/a');`
* `io('http://localhost/b');`
*
* We reuse the existing instance based on same scheme/port/host,
* and we initialize sockets for each namespace.
*
* @api public
*/
function lookup (uri, opts) {
if (typeof uri === 'object') {
opts = uri;
uri = undefined;
}
opts = opts || {};
var parsed = url_1(uri);
var source = parsed.source;
var id = parsed.id;
var path = parsed.path;
var sameNamespace = cache[id] && path in cache[id].nsps;
var newConnection = opts.forceNew || opts['force new connection'] ||
false === opts.multiplex || sameNamespace;
var io;
if (newConnection) {
debug('ignoring socket cache for %s', source);
io = manager(source, opts);
} else {
if (!cache[id]) {
debug('new io instance for %s', source);
cache[id] = manager(source, opts);
}
io = cache[id];
}
if (parsed.query && !opts.query) {
opts.query = parsed.query;
}
return io.socket(parsed.path, opts);
}
/**
* Protocol version.
*
* @api public
*/
exports.protocol = socket_ioParser.protocol;
/**
* `connect`.
*
* @param {String} uri
* @api public
*/
exports.connect = lookup;
/**
* Expose constructors for standalone build.
*
* @api public
*/
exports.Manager = manager;
exports.Socket = socket$1;
});
var lib_1$1 = lib$2.managers;
var lib_2$1 = lib$2.protocol;
var lib_3$1 = lib$2.connect;
var lib_4 = lib$2.Manager;
var lib_5 = lib$2.Socket;
/*
* @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 = lib$2.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
}));
}
};
var protocol = createCommonjsModule(function (module) {
(function (exports, ByteArray, global) {
var Protocol = exports;
var PKG_HEAD_BYTES = 4;
var MSG_FLAG_BYTES = 1;
var MSG_ROUTE_CODE_BYTES = 2;
var MSG_ID_MAX_BYTES = 5;
var MSG_ROUTE_LEN_BYTES = 1;
var MSG_ROUTE_CODE_MAX = 0xffff;
var MSG_COMPRESS_ROUTE_MASK = 0x1;
var MSG_COMPRESS_GZIP_MASK = 0x1;
var MSG_COMPRESS_GZIP_ENCODE_MASK = 1 << 4;
var MSG_TYPE_MASK = 0x7;
var Package = Protocol.Package = {};
var Message = Protocol.Message = {};
Package.TYPE_HANDSHAKE = 1;
Package.TYPE_HANDSHAKE_ACK = 2;
Package.TYPE_HEARTBEAT = 3;
Package.TYPE_DATA = 4;
Package.TYPE_KICK = 5;
Message.TYPE_REQUEST = 0;
Message.TYPE_NOTIFY = 1;
Message.TYPE_RESPONSE = 2;
Message.TYPE_PUSH = 3;
/**
* pomele client encode
* id message id;
* route message route
* msg message body
* socketio current support string
*/
Protocol.strencode = function(str) {
if(typeof Buffer !== "undefined" && ByteArray === Buffer) {
// encoding defaults to 'utf8'
return (new Buffer(str));
} else {
var byteArray = new ByteArray(str.length * 3);
var offset = 0;
for(var i = 0; i < str.length; i++){
var charCode = str.charCodeAt(i);
var codes = null;
if(charCode <= 0x7f){
codes = [charCode];
}else if(charCode <= 0x7ff){
codes = [0xc0|(charCode>>6), 0x80|(charCode & 0x3f)];
}else {
codes = [0xe0|(charCode>>12), 0x80|((charCode & 0xfc0)>>6), 0x80|(charCode & 0x3f)];
}
for(var j = 0; j < codes.length; j++){
byteArray[offset] = codes[j];
++offset;
}
}
var _buffer = new ByteArray(offset);
copyArray(_buffer, 0, byteArray, 0, offset);
return _buffer;
}
};
/**
* client decode
* msg String data
* return Message Object
*/
Protocol.strdecode = function(buffer) {
if(typeof Buffer !== "undefined" && ByteArray === Buffer) {
// encoding defaults to 'utf8'
return buffer.toString();
} else {
var bytes = new ByteArray(buffer);
var array = [];
var offset = 0;
var charCode = 0;
var end = bytes.length;
while(offset < end){
if(bytes[offset] < 128){
charCode = bytes[offset];
offset += 1;
}else if(bytes[offset] < 224){
charCode = ((bytes[offset] & 0x1f)<<6) + (bytes[offset+1] & 0x3f);
offset += 2;
}else {
charCode = ((bytes[offset] & 0x0f)<<12) + ((bytes[offset+1] & 0x3f)<<6) + (bytes[offset+2] & 0x3f);
offset += 3;
}
array.push(charCode);
}
return String.fromCharCode.apply(null, array);
}
};
/**
* Package protocol encode.
*
* Pomelo package format:
* +------+-------------+------------------+
* | type | body length | body |
* +------+-------------+------------------+
*
* Head: 4bytes
* 0: package type,
* 1 - handshake,
* 2 - handshake ack,
* 3 - heartbeat,
* 4 - data
* 5 - kick
* 1 - 3: big-endian body length
* Body: body length bytes
*
* @param {Number} type package type
* @param {ByteArray} body body content in bytes
* @return {ByteArray} new byte array that contains encode result
*/
Package.encode = function(type, body){
var length = body ? body.length : 0;
var buffer = new ByteArray(PKG_HEAD_BYTES + length);
var index = 0;
buffer[index++] = type & 0xff;
buffer[index++] = (length >> 16) & 0xff;
buffer[index++] = (length >> 8) & 0xff;
buffer[index++] = length & 0xff;
if(body) {
copyArray(buffer, index, body, 0, length);
}
return buffer;
};
/**
* Package protocol decode.
* See encode for package format.
*
* @param {ByteArray} buffer byte array containing package content
* @return {Object} {type: package type, buffer: body byte array}
*/
Package.decode = function(buffer){
var offset = 0;
var bytes = new ByteArray(buffer);
var length = 0;
var rs = [];
while(offset < bytes.length) {
var type = bytes[offset++];
length = ((bytes[offset++]) << 16 | (bytes[offset++]) << 8 | bytes[offset++]) >>> 0;
var body = length ? new ByteArray(length) : null;
if(body) {
copyArray(body, 0, bytes, offset, length);
}
offset += length;
rs.push({'type': type, 'body': body});
}
return rs.length === 1 ? rs[0]: rs;
};
/**
* Message protocol encode.
*
* @param {Number} id message id
* @param {Number} type message type
* @param {Number} compressRoute whether compress route
* @param {Number|String} route route code or route string
* @param {Buffer} msg message body bytes
* @return {Buffer} encode result
*/
Message.encode = function(id, type, compressRoute, route, msg, compressGzip){
// caculate message max length
var idBytes = msgHasId(type) ? caculateMsgIdBytes(id) : 0;
var msgLen = MSG_FLAG_BYTES + idBytes;
if(msgHasRoute(type)) {
if(compressRoute) {
if(typeof route !== 'number'){
throw new Error('error flag for number route!');
}
msgLen += MSG_ROUTE_CODE_BYTES;
} else {
msgLen += MSG_ROUTE_LEN_BYTES;
if(route) {
route = Protocol.strencode(route);
if(route.length>255) {
throw new Error('route maxlength is overflow');
}
msgLen += route.length;
}
}
}
if(msg) {
msgLen += msg.length;
}
var buffer = new ByteArray(msgLen);
var offset = 0;
// add flag
offset = encodeMsgFlag(type, compressRoute, buffer, offset, compressGzip);
// add message id
if(msgHasId(type)) {
offset = encodeMsgId(id, buffer, offset);
}
// add route
if(msgHasRoute(type)) {
offset = encodeMsgRoute(compressRoute, route, buffer, offset);
}
// add body
if(msg) {
offset = encodeMsgBody(msg, buffer, offset);
}
return buffer;
};
/**
* Message protocol decode.
*
* @param {Buffer|Uint8Array} buffer message bytes
* @return {Object} message object
*/
Message.decode = function(buffer) {
var bytes = new ByteArray(buffer);
var bytesLen = bytes.length || bytes.byteLength;
var offset = 0;
var id = 0;
var route = null;
// parse flag
var flag = bytes[offset++];
var compressRoute = flag & MSG_COMPRESS_ROUTE_MASK;
var type = (flag >> 1) & MSG_TYPE_MASK;
var compressGzip = (flag >> 4) & MSG_COMPRESS_GZIP_MASK;
// parse id
if(msgHasId(type)) {
var m = 0;
var i = 0;
do{
m = parseInt(bytes[offset]);
id += (m & 0x7f) << (7 * i);
offset++;
i++;
}while(m >= 128);
}
// parse route
if(msgHasRoute(type)) {
if(compressRoute) {
route = (bytes[offset++]) << 8 | bytes[offset++];
} else {
var routeLen = bytes[offset++];
if(routeLen) {
route = new ByteArray(routeLen);
copyArray(route, 0, bytes, offset, routeLen);
route = Protocol.strdecode(route);
} else {
route = '';
}
offset += routeLen;
}
}
// parse body
var bodyLen = bytesLen - offset;
var body = new ByteArray(bodyLen);
copyArray(body, 0, bytes, offset, bodyLen);
return {'id': id, 'type': type, 'compressRoute': compressRoute,
'route': route, 'body': body, 'compressGzip': compressGzip};
};
var copyArray = function(dest, doffset, src, soffset, length) {
if('function' === typeof src.copy) {
// Buffer
src.copy(dest, doffset, soffset, soffset + length);
} else {
// Uint8Array
for(var index=0; index<length; index++){
dest[doffset++] = src[soffset++];
}
}
};
var msgHasId = function(type) {
return type === Message.TYPE_REQUEST || type === Message.TYPE_RESPONSE;
};
var msgHasRoute = function(type) {
return type === Message.TYPE_REQUEST || type === Message.TYPE_NOTIFY ||
type === Message.TYPE_PUSH;
};
var caculateMsgIdBytes = function(id) {
var len = 0;
do {
len += 1;
id >>= 7;
} while(id > 0);
return len;
};
var encodeMsgFlag = function(type, compressRoute, buffer, offset, compressGzip) {
if(type !== Message.TYPE_REQUEST && type !== Message.TYPE_NOTIFY &&
type !== Message.TYPE_RESPONSE && type !== Message.TYPE_PUSH) {
throw new Error('unkonw message type: ' + type);
}
buffer[offset] = (type << 1) | (compressRoute ? 1 : 0);
if(compressGzip) {
buffer[offset] = buffer[offset] | MSG_COMPRESS_GZIP_ENCODE_MASK;
}
return offset + MSG_FLAG_BYTES;
};
var encodeMsgId = function(id, buffer, offset) {
do{
var tmp = id % 128;
var next = Math.floor(id/128);
if(next !== 0){
tmp = tmp + 128;
}
buffer[offset++] = tmp;
id = next;
} while(id !== 0);
return offset;
};
var encodeMsgRoute = function(compressRoute, route, buffer, offset) {
if (compressRoute) {
if(route > MSG_ROUTE_CODE_MAX){
throw new Error('route number is overflow');
}
buffer[offset++] = (route >> 8) & 0xff;
buffer[offset++] = route & 0xff;
} else {
if(route) {
buffer[offset++] = route.length & 0xff;
copyArray(buffer, offset, route, 0, route.length);
offset += route.length;
} else {
buffer[offset++] = 0;
}
}
return offset;
};
var encodeMsgBody = function(msg, buffer, offset) {
copyArray(buffer, offset, msg, 0, msg.length);
return offset + msg.length;
};
module.exports = Protocol;
if(typeof(window) != "undefined") {
window.Protocol = Protocol;
}
})(typeof(window)=="undefined" ? module.exports : (commonjsGlobal.Protocol = {}),typeof(window)=="undefined" ? Buffer : Uint8Array, commonjsGlobal);
});
var pomeloProtocol = protocol;
var codec = createCommonjsModule(function (module) {
var Encoder = module.exports;
/**
* [encode an uInt32, return a array of bytes]
* @param {[integer]} num
* @return {[array]}
*/
Encoder.encodeUInt32 = function(num){
var n = parseInt(num);
if(isNaN(n) || n < 0){
console.log(n);
return null;
}
var result = [];
do{
var tmp = n % 128;
var next = Math.floor(n/128);
if(next !== 0){
tmp = tmp + 128;
}
result.push(tmp);
n = next;
} while(n !== 0);
return result;
};
/**
* [encode a sInt32, return a byte array]
* @param {[sInt32]} num The sInt32 need to encode
* @return {[array]} A byte array represent the integer
*/
Encoder.encodeSInt32 = function(num){
var n = parseInt(num);
if(isNaN(n)){
return null;
}
n = n<0?(Math.abs(n)*2-1):n*2;
return Encoder.encodeUInt32(n);
};
Encoder.decodeUInt32 = function(bytes){
var n = 0;
for(var i = 0; i < bytes.length; i++){
var m = parseInt(bytes[i]);
n = n + ((m & 0x7f) * Math.pow(2,(7*i)));
if(m < 128){
return n;
}
}
return n;
};
Encoder.decodeSInt32 = function(bytes){
var n = this.decodeUInt32(bytes);
var flag = ((n%2) === 1)?-1:1;
n = ((n%2 + n)/2)*flag;
return n;
};
});
var constant = {
TYPES : {
uInt32 : 0,
sInt32 : 0,
int32 : 0,
double : 1,
string : 2,
message : 2,
float : 5
}
};
var constant_1 = constant.TYPES;
var util_1 = createCommonjsModule(function (module) {
var util = module.exports;
util.isSimpleType = function(type){
return ( type === 'uInt32' ||
type === 'sInt32' ||
type === 'int32' ||
type === 'uInt64' ||
type === 'sInt64' ||
type === 'float' ||
type === 'double');
};
util.equal = function(obj0, obj1){
for(var key in obj0){
var m = obj0[key];
var n = obj1[key];
if(typeof(m) === 'object'){
if(!util.equal(m, n)){
return false;
}
}else if(m !== n){
return false;
}
}
return true;
};
});
var encoder = createCommonjsModule(function (module) {
var Encoder = module.exports;
Encoder.init = function(protos){
this.protos = protos || {};
};
Encoder.encode = function(route, msg){
if(!route || !msg){
console.warn('Route or msg can not be null! route : %j, msg %j', route, msg);
return null;
}
//Get protos from protos map use the route as key
var protos = this.protos[route];
//Check msg
if(!checkMsg(msg, protos)){
console.warn('check msg failed! msg : %j, proto : %j', msg, protos);
return null;
}
//Set the length of the buffer 2 times bigger to prevent overflow
var length = Buffer.byteLength(JSON.stringify(msg))*2;
//Init buffer and offset
var buffer = new Buffer(length);
var offset = 0;
if(!!protos){
offset = encodeMsg(buffer, offset, protos, msg);
if(offset > 0){
return buffer.slice(0, offset);
}
}
return null;
};
/**
* Check if the msg follow the defination in the protos
*/
function checkMsg(msg, protos){
if(!protos || !msg){
console.warn('no protos or msg exist! msg : %j, protos : %j', msg, protos);
return false;
}
for(var name in protos){
var proto = protos[name];
//All required element must exist
switch(proto.option){
case 'required' :
if(typeof(msg[name]) === 'undefined'){
console.warn('no property exist for required! name: %j, proto: %j, msg: %j', name, proto, msg);
return false;
}
case 'optional' :
if(typeof(msg[name]) !== 'undefined'){
var message = protos.__messages[proto.type] || Encoder.protos['message ' + proto.type];
if(!!message && !checkMsg(msg[name], message)){
console.warn('inner proto error! name: %j, proto: %j, msg: %j', name, proto, msg);
return false;
}
}
break;
case 'repeated' :
//Check nest message in repeated elements
var message = protos.__messages[proto.type] || Encoder.protos['message ' + proto.type];
if(!!msg[name] && !!message){
for(var i = 0; i < msg[name].length; i++){
if(!checkMsg(msg[name][i], message)){
return false;
}
}
}
break;
}
}
return true;
}
function encodeMsg(buffer, offset, protos, msg){
for(var name in msg){
if(!!protos[name]){
var proto = protos[name];
switch(proto.option){
case 'required' :
case 'optional' :
offset = writeBytes(buffer, offset, encodeTag(proto.type, proto.tag));
offset = encodeProp(msg[name], proto.type, offset, buffer, protos);
break;
case 'repeated' :
if(!!msg[name] && msg[name].length > 0){
offset = encodeArray(msg[name], proto, offset, buffer, protos);
}
break;
}
}
}
return offset;
}
function encodeProp(value, type, offset, buffer, protos){
var length = 0;
switch(type){
case 'uInt32':
offset = writeBytes(buffer, offset, codec.encodeUInt32(value));
break;
case 'int32' :
case 'sInt32':
offset = writeBytes(buffer, offset, codec.encodeSInt32(value));
break;
case 'float':
buffer.writeFloatLE(value, offset);
offset += 4;
break;
case 'double':
buffer.writeDoubleLE(value, offset);
offset += 8;
break;
case 'string':
length = Buffer.byteLength(value);
//Encode length
offset = writeBytes(buffer, offset, codec.encodeUInt32(length));
//write string
buffer.write(value, offset, length);
offset += length;
break;
default :
var message = protos.__messages[type] || Encoder.protos['message ' + type];
if(!!message){
//Use a tmp buffer to build an internal msg
var tmpBuffer = new Buffer(Buffer.byteLength(JSON.stringify(value))*2);
length = 0;
length = encodeMsg(tmpBuffer, length, message, value);
//Encode length
offset = writeBytes(buffer, offset, codec.encodeUInt32(length));
//contact the object
tmpBuffer.copy(buffer, offset, 0, length);
offset += length;
}
break;
}
return offset;
}
/**
* Encode reapeated properties, simple msg and object are decode differented
*/
function encodeArray(array, proto, offset, buffer, protos){
var i = 0;
if(util_1.isSimpleType(proto.type)){
offset = writeBytes(buffer, offset, encodeTag(proto.type, proto.tag));
offset = writeBytes(buffer, offset, codec.encodeUInt32(array.length));
for(i = 0; i < array.length; i++){
offset = encodeProp(array[i], proto.type, offset, buffer);
}
}else {
for(i = 0; i < array.length; i++){
offset = writeBytes(buffer, offset, encodeTag(proto.type, proto.tag));
offset = encodeProp(array[i], proto.type, offset, buffer, protos);
}
}
return offset;
}
function writeBytes(buffer, offset, bytes){
for(var i = 0; i < bytes.length; i++){
buffer.writeUInt8(bytes[i], offset);
offset++;
}
return offset;
}
function encodeTag(type, tag){
var value = constant.TYPES[type];
if(value === undefined) value = 2;
return codec.encodeUInt32((tag<<3)|value);
}
});
var decoder = createCommonjsModule(function (module) {
var Decoder = module.exports;
var buffer;
var offset = 0;
Decoder.init = function(protos){
this.protos = protos || {};
};
Decoder.setProtos = function(protos){
if(!!protos){
this.protos = protos;
}
};
Decoder.decode = function(route, buf){
var protos = this.protos[route];
buffer = buf;
offset = 0;
if(!!protos){
return decodeMsg({}, protos, buffer.length);
}
return null;
};
function decodeMsg(msg, protos, length){
while(offset<length){
var head = getHead();
var type = head.type;
var tag = head.tag;
var name = protos.__tags[tag];
switch(protos[name].option){
case 'optional' :
case 'required' :
msg[name] = decodeProp(protos[name].type, protos);
break;
case 'repeated' :
if(!msg[name]){
msg[name] = [];
}
decodeArray(msg[name], protos[name].type, protos);
break;
}
}
return msg;
}
/**
* Test if the given msg is finished
*/
function isFinish(msg, protos){
return (!protos.__tags[peekHead().tag]);
}
/**
* Get property head from protobuf
*/
function getHead(){
var tag = codec.decodeUInt32(getBytes());
return {
type : tag&0x7,
tag : tag>>3
};
}
/**
* Get tag head without move the offset
*/
function peekHead(){
var tag = codec.decodeUInt32(peekBytes());
return {
type : tag&0x7,
tag : tag>>3
};
}
function decodeProp(type, protos){
switch(type){
case 'uInt32':
return codec.decodeUInt32(getBytes());
case 'int32' :
case 'sInt32' :
return codec.decodeSInt32(getBytes());
case 'float' :
var float = buffer.readFloatLE(offset);
offset += 4;
return float;
case 'double' :
var double = buffer.readDoubleLE(offset);
offset += 8;
return double;
case 'string' :
var length = codec.decodeUInt32(getBytes());
var str = buffer.toString('utf8', offset, offset+length);
offset += length;
return str;
default :
var message = protos && (protos.__messages[type] || Decoder.protos['message ' + type]);
if(message){
var length = codec.decodeUInt32(getBytes());
var msg = {};
decodeMsg(msg, message, offset+length);
return msg;
}
break;
}
}
function decodeArray(array, type, protos){
if(util_1.isSimpleType(type)){
var length = codec.decodeUInt32(getBytes());
for(var i = 0; i < length; i++){
array.push(decodeProp(type));
}
}else {
array.push(decodeProp(type, protos));
}
}
function getBytes(flag){
var bytes = [];
var pos = offset;
flag = flag || false;
var b;
do{
var b = buffer.readUInt8(pos);
bytes.push(b);
pos++;
}while(b >= 128);
if(!flag){
offset = pos;
}
return bytes;
}
function peekBytes(){
return getBytes(true);
}
});
var parser$1 = createCommonjsModule(function (module) {
var Parser = module.exports;
/**
* [parse the original protos, give the paresed result can be used by protobuf encode/decode.]
* @param {[Object]} protos Original protos, in a js map.
* @return {[Object]} The presed result, a js object represent all the meta data of the given protos.
*/
Parser.parse = function(protos){
var maps = {};
for(var key in protos){
maps[key] = parseObject(protos[key]);
}
return maps;
};
/**
* [parse a single protos, return a object represent the result. The method can be invocked recursively.]
* @param {[Object]} obj The origin proto need to parse.
* @return {[Object]} The parsed result, a js object.
*/
function parseObject(obj){
var proto = {};
var nestProtos = {};
var tags = {};
for(var name in obj){
var tag = obj[name];
var params = name.split(' ');
switch(params[0]){
case 'message':
if(params.length !== 2){
continue;
}
nestProtos[params[1]] = parseObject(tag);
continue;
case 'required':
case 'optional':
case 'repeated':{
//params length should be 3 and tag can't be duplicated
if(params.length !== 3 || !!tags[tag]){
continue;
}
proto[params[2]] = {
option : params[0],
type : params[1],
tag : tag
};
tags[tag] = params[2];
}
}
}
proto.__messages = nestProtos;
proto.__tags = tags;
return proto;
}
});
var protobuf = createCommonjsModule(function (module) {
var Protobuf = module.exports;
/**
* [encode the given message, return a Buffer represent the message encoded by protobuf]
* @param {[type]} key The key to identify the message type.
* @param {[type]} msg The message body, a js object.
* @return {[type]} The binary encode result in a Buffer.
*/
Protobuf.encode = function(key, msg){
return encoder.encode(key, msg);
};
Protobuf.encode2Bytes = function(key, msg){
var buffer = this.encode(key, msg);
if(!buffer || !buffer.length){
console.warn('encode msg failed! key : %j, msg : %j', key, msg);
return null;
}
var bytes = new Uint8Array(buffer.length);
for(var offset = 0; offset < buffer.length; offset++){
bytes[offset] = buffer.readUInt8(offset);
}
return bytes;
};
Protobuf.encodeStr = function(key, msg, code){
code = code || 'base64';
var buffer = Protobuf.encode(key, msg);
return !!buffer?buffer.toString(code):buffer;
};
Protobuf.decode = function(key, msg){
return decoder.decode(key, msg);
};
Protobuf.decodeStr = function(key, str, code){
code = code || 'base64';
var buffer = new Buffer(str, code);
return !!buffer?Protobuf.decode(key, buffer):buffer;
};
Protobuf.parse = function(json){
return parser$1.parse(json);
};
Protobuf.setEncoderProtos = function(protos){
encoder.init(protos);
};
Protobuf.setDecoderProtos = function(protos){
decoder.init(protos);
};
Protobuf.init = function(opts){
//On the serverside, use serverProtos to encode messages send to client
encoder.init(opts.encoderProtos);
//On the serverside, user clientProtos to decode messages receive from clients
decoder.init(opts.decoderProtos);
};
});
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 common = createCommonjsModule(function (module, exports) {
'use strict';
var TYPED_OK = (typeof Uint8Array !== 'undefined') &&
(typeof Uint16Array !== 'undefined') &&
(typeof Int32Array !== 'undefined');
function _has(obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key);
}
exports.assign = function (obj /*from1, from2, from3, ...*/) {
var sources = Array.prototype.slice.call(arguments, 1);
while (sources.length) {
var source = sources.shift();
if (!source) { continue; }
if (typeof source !== 'object') {
throw new TypeError(source + 'must be non-object');
}
for (var p in source) {
if (_has(source, p)) {
obj[p] = source[p];
}
}
}
return obj;
};
// reduce buffer size, avoiding mem copy
exports.shrinkBuf = function (buf, size) {
if (buf.length === size) { return buf; }
if (buf.subarray) { return buf.subarray(0, size); }
buf.length = size;
return buf;
};
var fnTyped = {
arraySet: function (dest, src, src_offs, len, dest_offs) {
if (src.subarray && dest.subarray) {
dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
return;
}
// Fallback to ordinary array
for (var i = 0; i < len; i++) {
dest[dest_offs + i] = src[src_offs + i];
}
},
// Join array of chunks to single array.
flattenChunks: function (chunks) {
var i, l, len, pos, chunk, result;
// calculate data length
len = 0;
for (i = 0, l = chunks.length; i < l; i++) {
len += chunks[i].length;
}
// join chunks
result = new Uint8Array(len);
pos = 0;
for (i = 0, l = chunks.length; i < l; i++) {
chunk = chunks[i];
result.set(chunk, pos);
pos += chunk.length;
}
return result;
}
};
var fnUntyped = {
arraySet: function (dest, src, src_offs, len, dest_offs) {
for (var i = 0; i < len; i++) {
dest[dest_offs + i] = src[src_offs + i];
}
},
// Join array of chunks to single array.
flattenChunks: function (chunks) {
return [].concat.apply([], chunks);
}
};
// Enable/Disable typed arrays use, for testing
//
exports.setTyped = function (on) {
if (on) {
exports.Buf8 = Uint8Array;
exports.Buf16 = Uint16Array;
exports.Buf32 = Int32Array;
exports.assign(exports, fnTyped);
} else {
exports.Buf8 = Array;
exports.Buf16 = Array;
exports.Buf32 = Array;
exports.assign(exports, fnUntyped);
}
};
exports.setTyped(TYPED_OK);
});
var common_1 = common.assign;
var common_2 = common.shrinkBuf;
var common_3 = common.setTyped;
var common_4 = common.Buf8;
var common_5 = common.Buf16;
var common_6 = common.Buf32;
'use strict';
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
/* eslint-disable space-unary-ops */
/* Public constants ==========================================================*/
/* ===========================================================================*/
//var Z_FILTERED = 1;
//var Z_HUFFMAN_ONLY = 2;
//var Z_RLE = 3;
var Z_FIXED = 4;
//var Z_DEFAULT_STRATEGY = 0;
/* Possible values of the data_type field (though see inflate()) */
var Z_BINARY = 0;
var Z_TEXT = 1;
//var Z_ASCII = 1; // = Z_TEXT
var Z_UNKNOWN = 2;
/*============================================================================*/
function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
// From zutil.h
var STORED_BLOCK = 0;
var STATIC_TREES = 1;
var DYN_TREES = 2;
/* The three kinds of block type */
var MIN_MATCH = 3;
var MAX_MATCH = 258;
/* The minimum and maximum match lengths */
// From deflate.h
/* ===========================================================================
* Internal compression state.
*/
var LENGTH_CODES = 29;
/* number of length codes, not counting the special END_BLOCK code */
var LITERALS = 256;
/* number of literal bytes 0..255 */
var L_CODES = LITERALS + 1 + LENGTH_CODES;
/* number of Literal or Length codes, including the END_BLOCK code */
var D_CODES = 30;
/* number of distance codes */
var BL_CODES = 19;
/* number of codes used to transfer the bit lengths */
var HEAP_SIZE = 2 * L_CODES + 1;
/* maximum heap size */
var MAX_BITS = 15;
/* All codes must not exceed MAX_BITS bits */
var Buf_size = 16;
/* size of bit buffer in bi_buf */
/* ===========================================================================
* Constants
*/
var MAX_BL_BITS = 7;
/* Bit length codes must not exceed MAX_BL_BITS bits */
var END_BLOCK = 256;
/* end of block literal code */
var REP_3_6 = 16;
/* repeat previous bit length 3-6 times (2 bits of repeat count) */
var REPZ_3_10 = 17;
/* repeat a zero length 3-10 times (3 bits of repeat count) */
var REPZ_11_138 = 18;
/* repeat a zero length 11-138 times (7 bits of repeat count) */
/* eslint-disable comma-spacing,array-bracket-spacing */
var extra_lbits = /* extra bits for each length code */
[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
var extra_dbits = /* extra bits for each distance code */
[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
var extra_blbits = /* extra bits for each bit length code */
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
var bl_order =
[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
/* eslint-enable comma-spacing,array-bracket-spacing */
/* The lengths of the bit length codes are sent in order of decreasing
* probability, to avoid transmitting the lengths for unused bit length codes.
*/
/* ===========================================================================
* Local data. These are initialized only once.
*/
// We pre-fill arrays with 0 to avoid uninitialized gaps
var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1
var static_ltree = new Array((L_CODES + 2) * 2);
zero(static_ltree);
/* The static literal tree. Since the bit lengths are imposed, there is no
* need for the L_CODES extra codes used during heap construction. However
* The codes 286 and 287 are needed to build a canonical tree (see _tr_init
* below).
*/
var static_dtree = new Array(D_CODES * 2);
zero(static_dtree);
/* The static distance tree. (Actually a trivial tree since all codes use
* 5 bits.)
*/
var _dist_code = new Array(DIST_CODE_LEN);
zero(_dist_code);
/* Distance codes. The first 256 values correspond to the distances
* 3 .. 258, the last 256 values correspond to the top 8 bits of
* the 15 bit distances.
*/
var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1);
zero(_length_code);
/* length code for each normalized match length (0 == MIN_MATCH) */
var base_length = new Array(LENGTH_CODES);
zero(base_length);
/* First normalized length for each code (0 = MIN_MATCH) */
var base_dist = new Array(D_CODES);
zero(base_dist);
/* First normalized distance for each code (0 = distance of 1) */
function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {
this.static_tree = static_tree; /* static tree or NULL */
this.extra_bits = extra_bits; /* extra bits for each code or NULL */
this.extra_base = extra_base; /* base index for extra_bits */
this.elems = elems; /* max number of elements in the tree */
this.max_length = max_length; /* max bit length for the codes */
// show if `static_tree` has data or dummy - needed for monomorphic objects
this.has_stree = static_tree && static_tree.length;
}
var static_l_desc;
var static_d_desc;
var static_bl_desc;
function TreeDesc(dyn_tree, stat_desc) {
this.dyn_tree = dyn_tree; /* the dynamic tree */
this.max_code = 0; /* largest code with non zero frequency */
this.stat_desc = stat_desc; /* the corresponding static tree */
}
function d_code(dist) {
return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
}
/* ===========================================================================
* Output a short LSB first on the stream.
* IN assertion: there is enough room in pendingBuf.
*/
function put_short(s, w) {
// put_byte(s, (uch)((w) & 0xff));
// put_byte(s, (uch)((ush)(w) >> 8));
s.pending_buf[s.pending++] = (w) & 0xff;
s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
}
/* ===========================================================================
* Send a value on a given number of bits.
* IN assertion: length <= 16 and value fits in length bits.
*/
function send_bits(s, value, length) {
if (s.bi_valid > (Buf_size - length)) {
s.bi_buf |= (value << s.bi_valid) & 0xffff;
put_short(s, s.bi_buf);
s.bi_buf = value >> (Buf_size - s.bi_valid);
s.bi_valid += length - Buf_size;
} else {
s.bi_buf |= (value << s.bi_valid) & 0xffff;
s.bi_valid += length;
}
}
function send_code(s, c, tree) {
send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
}
/* ===========================================================================
* Reverse the first len bits of a code, using straightforward code (a faster
* method would use a table)
* IN assertion: 1 <= len <= 15
*/
function bi_reverse(code, len) {
var res = 0;
do {
res |= code & 1;
code >>>= 1;
res <<= 1;
} while (--len > 0);
return res >>> 1;
}
/* ===========================================================================
* Flush the bit buffer, keeping at most 7 bits in it.
*/
function bi_flush(s) {
if (s.bi_valid === 16) {
put_short(s, s.bi_buf);
s.bi_buf = 0;
s.bi_valid = 0;
} else if (s.bi_valid >= 8) {
s.pending_buf[s.pending++] = s.bi_buf & 0xff;
s.bi_buf >>= 8;
s.bi_valid -= 8;
}
}
/* ===========================================================================
* Compute the optimal bit lengths for a tree and update the total bit length
* for the current block.
* IN assertion: the fields freq and dad are set, heap[heap_max] and
* above are the tree nodes sorted by increasing frequency.
* OUT assertions: the field len is set to the optimal bit length, the
* array bl_count contains the frequencies for each bit length.
* The length opt_len is updated; static_len is also updated if stree is
* not null.
*/
function gen_bitlen(s, desc)
// deflate_state *s;
// tree_desc *desc; /* the tree descriptor */
{
var tree = desc.dyn_tree;
var max_code = desc.max_code;
var stree = desc.stat_desc.static_tree;
var has_stree = desc.stat_desc.has_stree;
var extra = desc.stat_desc.extra_bits;
var base = desc.stat_desc.extra_base;
var max_length = desc.stat_desc.max_length;
var h; /* heap index */
var n, m; /* iterate over the tree elements */
var bits; /* bit length */
var xbits; /* extra bits */
var f; /* frequency */
var overflow = 0; /* number of elements with bit length too large */
for (bits = 0; bits <= MAX_BITS; bits++) {
s.bl_count[bits] = 0;
}
/* In a first pass, compute the optimal bit lengths (which may
* overflow in the case of the bit length tree).
*/
tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */
for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
n = s.heap[h];
bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
if (bits > max_length) {
bits = max_length;
overflow++;
}
tree[n * 2 + 1]/*.Len*/ = bits;
/* We overwrite tree[n].Dad which is no longer needed */
if (n > max_code) { continue; } /* not a leaf node */
s.bl_count[bits]++;
xbits = 0;
if (n >= base) {
xbits = extra[n - base];
}
f = tree[n * 2]/*.Freq*/;
s.opt_len += f * (bits + xbits);
if (has_stree) {
s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
}
}
if (overflow === 0) { return; }
// Trace((stderr,"\nbit length overflow\n"));
/* This happens for example on obj2 and pic of the Calgary corpus */
/* Find the first bit length which could increase: */
do {
bits = max_length - 1;
while (s.bl_count[bits] === 0) { bits--; }
s.bl_count[bits]--; /* move one leaf down the tree */
s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
s.bl_count[max_length]--;
/* The brother of the overflow item also moves one step up,
* but this does not affect bl_count[max_length]
*/
overflow -= 2;
} while (overflow > 0);
/* Now recompute all bit lengths, scanning in increasing frequency.
* h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
* lengths instead of fixing only the wrong ones. This idea is taken
* from 'ar' written by Haruhiko Okumura.)
*/
for (bits = max_length; bits !== 0; bits--) {
n = s.bl_count[bits];
while (n !== 0) {
m = s.heap[--h];
if (m > max_code) { continue; }
if (tree[m * 2 + 1]/*.Len*/ !== bits) {
// Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
tree[m * 2 + 1]/*.Len*/ = bits;
}
n--;
}
}
}
/* ===========================================================================
* Generate the codes for a given tree and bit counts (which need not be
* optimal).
* IN assertion: the array bl_count contains the bit length statistics for
* the given tree and the field len is set for all tree elements.
* OUT assertion: the field code is set for all tree elements of non
* zero code length.
*/
function gen_codes(tree, max_code, bl_count)
// ct_data *tree; /* the tree to decorate */
// int max_code; /* largest code with non zero frequency */
// ushf *bl_count; /* number of codes at each bit length */
{
var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */
var code = 0; /* running code value */
var bits; /* bit index */
var n; /* code index */
/* The distribution counts are first used to generate the code values
* without bit reversal.
*/
for (bits = 1; bits <= MAX_BITS; bits++) {
next_code[bits] = code = (code + bl_count[bits - 1]) << 1;
}
/* Check that the bit counts in bl_count are consistent. The last code
* must be all ones.
*/
//Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
// "inconsistent bit counts");
//Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
for (n = 0; n <= max_code; n++) {
var len = tree[n * 2 + 1]/*.Len*/;
if (len === 0) { continue; }
/* Now reverse the bits */
tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);
//Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
// n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
}
}
/* ===========================================================================
* Initialize the various 'constant' tables.
*/
function tr_static_init() {
var n; /* iterates over tree elements */
var bits; /* bit counter */
var length; /* length value */
var code; /* code value */
var dist; /* distance index */
var bl_count = new Array(MAX_BITS + 1);
/* number of codes at each bit length for an optimal tree */
// do check in _tr_init()
//if (static_init_done) return;
/* For some embedded targets, global variables are not initialized: */
/*#ifdef NO_INIT_GLOBAL_POINTERS
static_l_desc.static_tree = static_ltree;
static_l_desc.extra_bits = extra_lbits;
static_d_desc.static_tree = static_dtree;
static_d_desc.extra_bits = extra_dbits;
static_bl_desc.extra_bits = extra_blbits;
#endif*/
/* Initialize the mapping length (0..255) -> length code (0..28) */
length = 0;
for (code = 0; code < LENGTH_CODES - 1; code++) {
base_length[code] = length;
for (n = 0; n < (1 << extra_lbits[code]); n++) {
_length_code[length++] = code;
}
}
//Assert (length == 256, "tr_static_init: length != 256");
/* Note that the length 255 (match length 258) can be represented
* in two different ways: code 284 + 5 bits or code 285, so we
* overwrite length_code[255] to use the best encoding:
*/
_length_code[length - 1] = code;
/* Initialize the mapping dist (0..32K) -> dist code (0..29) */
dist = 0;
for (code = 0; code < 16; code++) {
base_dist[code] = dist;
for (n = 0; n < (1 << extra_dbits[code]); n++) {
_dist_code[dist++] = code;
}
}
//Assert (dist == 256, "tr_static_init: dist != 256");
dist >>= 7; /* from now on, all distances are divided by 128 */
for (; code < D_CODES; code++) {
base_dist[code] = dist << 7;
for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
_dist_code[256 + dist++] = code;
}
}
//Assert (dist == 256, "tr_static_init: 256+dist != 512");
/* Construct the codes of the static literal tree */
for (bits = 0; bits <= MAX_BITS; bits++) {
bl_count[bits] = 0;
}
n = 0;
while (n <= 143) {
static_ltree[n * 2 + 1]/*.Len*/ = 8;
n++;
bl_count[8]++;
}
while (n <= 255) {
static_ltree[n * 2 + 1]/*.Len*/ = 9;
n++;
bl_count[9]++;
}
while (n <= 279) {
static_ltree[n * 2 + 1]/*.Len*/ = 7;
n++;
bl_count[7]++;
}
while (n <= 287) {
static_ltree[n * 2 + 1]/*.Len*/ = 8;
n++;
bl_count[8]++;
}
/* Codes 286 and 287 do not exist, but we must include them in the
* tree construction to get a canonical Huffman tree (longest code
* all ones)
*/
gen_codes(static_ltree, L_CODES + 1, bl_count);
/* The static distance tree is trivial: */
for (n = 0; n < D_CODES; n++) {
static_dtree[n * 2 + 1]/*.Len*/ = 5;
static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);
}
// Now data ready and we can init static trees
static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);
static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);
//static_init_done = true;
}
/* ===========================================================================
* Initialize a new block.
*/
function init_block(s) {
var n; /* iterates over tree elements */
/* Initialize the trees. */
for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }
s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;
s.opt_len = s.static_len = 0;
s.last_lit = s.matches = 0;
}
/* ===========================================================================
* Flush the bit buffer and align the output on a byte boundary
*/
function bi_windup(s)
{
if (s.bi_valid > 8) {
put_short(s, s.bi_buf);
} else if (s.bi_valid > 0) {
//put_byte(s, (Byte)s->bi_buf);
s.pending_buf[s.pending++] = s.bi_buf;
}
s.bi_buf = 0;
s.bi_valid = 0;
}
/* ===========================================================================
* Copy a stored block, storing first the length and its
* one's complement if requested.
*/
function copy_block(s, buf, len, header)
//DeflateState *s;
//charf *buf; /* the input data */
//unsigned len; /* its length */
//int header; /* true if block header must be written */
{
bi_windup(s); /* align on byte boundary */
if (header) {
put_short(s, len);
put_short(s, ~len);
}
// while (len--) {
// put_byte(s, *buf++);
// }
common.arraySet(s.pending_buf, s.window, buf, len, s.pending);
s.pending += len;
}
/* ===========================================================================
* Compares to subtrees, using the tree depth as tie breaker when
* the subtrees have equal frequency. This minimizes the worst case length.
*/
function smaller(tree, n, m, depth) {
var _n2 = n * 2;
var _m2 = m * 2;
return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
(tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
}
/* ===========================================================================
* Restore the heap property by moving down the tree starting at node k,
* exchanging a node with the smallest of its two sons if necessary, stopping
* when the heap property is re-established (each father smaller than its
* two sons).
*/
function pqdownheap(s, tree, k)
// deflate_state *s;
// ct_data *tree; /* the tree to restore */
// int k; /* node to move down */
{
var v = s.heap[k];
var j = k << 1; /* left son of k */
while (j <= s.heap_len) {
/* Set j to the smallest of the two sons: */
if (j < s.heap_len &&
smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {
j++;
}
/* Exit if v is smaller than both sons */
if (smaller(tree, v, s.heap[j], s.depth)) { break; }
/* Exchange v with the smallest son */
s.heap[k] = s.heap[j];
k = j;
/* And continue down the tree, setting j to the left son of k */
j <<= 1;
}
s.heap[k] = v;
}
// inlined manually
// var SMALLEST = 1;
/* ===========================================================================
* Send the block data compressed using the given Huffman trees
*/
function compress_block(s, ltree, dtree)
// deflate_state *s;
// const ct_data *ltree; /* literal tree */
// const ct_data *dtree; /* distance tree */
{
var dist; /* distance of matched string */
var lc; /* match length or unmatched char (if dist == 0) */
var lx = 0; /* running index in l_buf */
var code; /* the code to send */
var extra; /* number of extra bits to send */
if (s.last_lit !== 0) {
do {
dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);
lc = s.pending_buf[s.l_buf + lx];
lx++;
if (dist === 0) {
send_code(s, lc, ltree); /* send a literal byte */
//Tracecv(isgraph(lc), (stderr," '%c' ", lc));
} else {
/* Here, lc is the match length - MIN_MATCH */
code = _length_code[lc];
send_code(s, code + LITERALS + 1, ltree); /* send the length code */
extra = extra_lbits[code];
if (extra !== 0) {
lc -= base_length[code];
send_bits(s, lc, extra); /* send the extra length bits */
}
dist--; /* dist is now the match distance - 1 */
code = d_code(dist);
//Assert (code < D_CODES, "bad d_code");
send_code(s, code, dtree); /* send the distance code */
extra = extra_dbits[code];
if (extra !== 0) {
dist -= base_dist[code];
send_bits(s, dist, extra); /* send the extra distance bits */
}
} /* literal or match pair ? */
/* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
//Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
// "pendingBuf overflow");
} while (lx < s.last_lit);
}
send_code(s, END_BLOCK, ltree);
}
/* ===========================================================================
* Construct one Huffman tree and assigns the code bit strings and lengths.
* Update the total bit length for the current block.
* IN assertion: the field freq is set for all tree elements.
* OUT assertions: the fields len and code are set to the optimal bit length
* and corresponding code. The length opt_len is updated; static_len is
* also updated if stree is not null. The field max_code is set.
*/
function build_tree(s, desc)
// deflate_state *s;
// tree_desc *desc; /* the tree descriptor */
{
var tree = desc.dyn_tree;
var stree = desc.stat_desc.static_tree;
var has_stree = desc.stat_desc.has_stree;
var elems = desc.stat_desc.elems;
var n, m; /* iterate over heap elements */
var max_code = -1; /* largest code with non zero frequency */
var node; /* new node being created */
/* Construct the initial heap, with least frequent element in
* heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
* heap[0] is not used.
*/
s.heap_len = 0;
s.heap_max = HEAP_SIZE;
for (n = 0; n < elems; n++) {
if (tree[n * 2]/*.Freq*/ !== 0) {
s.heap[++s.heap_len] = max_code = n;
s.depth[n] = 0;
} else {
tree[n * 2 + 1]/*.Len*/ = 0;
}
}
/* The pkzip format requires that at least one distance code exists,
* and that at least one bit should be sent even if there is only one
* possible code. So to avoid special checks later on we force at least
* two codes of non zero frequency.
*/
while (s.heap_len < 2) {
node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
tree[node * 2]/*.Freq*/ = 1;
s.depth[node] = 0;
s.opt_len--;
if (has_stree) {
s.static_len -= stree[node * 2 + 1]/*.Len*/;
}
/* node is 0 or 1 so it does not have extra bits */
}
desc.max_code = max_code;
/* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
* establish sub-heaps of increasing lengths:
*/
for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
/* Construct the Huffman tree by repeatedly combining the least two
* frequent nodes.
*/
node = elems; /* next internal node of the tree */
do {
//pqremove(s, tree, n); /* n = node of least frequency */
/*** pqremove ***/
n = s.heap[1/*SMALLEST*/];
s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
pqdownheap(s, tree, 1/*SMALLEST*/);
/***/
m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
s.heap[--s.heap_max] = m;
/* Create a new node father of n and m */
tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;
/* and insert the new node in the heap */
s.heap[1/*SMALLEST*/] = node++;
pqdownheap(s, tree, 1/*SMALLEST*/);
} while (s.heap_len >= 2);
s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
/* At this point, the fields freq and dad are set. We can now
* generate the bit lengths.
*/
gen_bitlen(s, desc);
/* The field len is now set, we can generate the bit codes */
gen_codes(tree, max_code, s.bl_count);
}
/* ===========================================================================
* Scan a literal or distance tree to determine the frequencies of the codes
* in the bit length tree.
*/
function scan_tree(s, tree, max_code)
// deflate_state *s;
// ct_data *tree; /* the tree to be scanned */
// int max_code; /* and its largest code of non zero frequency */
{
var n; /* iterates over all tree elements */
var prevlen = -1; /* last emitted length */
var curlen; /* length of current code */
var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
var count = 0; /* repeat count of the current code */
var max_count = 7; /* max repeat count */
var min_count = 4; /* min repeat count */
if (nextlen === 0) {
max_count = 138;
min_count = 3;
}
tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */
for (n = 0; n <= max_code; n++) {
curlen = nextlen;
nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
if (++count < max_count && curlen === nextlen) {
continue;
} else if (count < min_count) {
s.bl_tree[curlen * 2]/*.Freq*/ += count;
} else if (curlen !== 0) {
if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
s.bl_tree[REP_3_6 * 2]/*.Freq*/++;
} else if (count <= 10) {
s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;
} else {
s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;
}
count = 0;
prevlen = curlen;
if (nextlen === 0) {
max_count = 138;
min_count = 3;
} else if (curlen === nextlen) {
max_count = 6;
min_count = 3;
} else {
max_count = 7;
min_count = 4;
}
}
}
/* ===========================================================================
* Send a literal or distance tree in compressed form, using the codes in
* bl_tree.
*/
function send_tree(s, tree, max_code)
// deflate_state *s;
// ct_data *tree; /* the tree to be scanned */
// int max_code; /* and its largest code of non zero frequency */
{
var n; /* iterates over all tree elements */
var prevlen = -1; /* last emitted length */
var curlen; /* length of current code */
var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
var count = 0; /* repeat count of the current code */
var max_count = 7; /* max repeat count */
var min_count = 4; /* min repeat count */
/* tree[max_code+1].Len = -1; */ /* guard already set */
if (nextlen === 0) {
max_count = 138;
min_count = 3;
}
for (n = 0; n <= max_code; n++) {
curlen = nextlen;
nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
if (++count < max_count && curlen === nextlen) {
continue;
} else if (count < min_count) {
do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
} else if (curlen !== 0) {
if (curlen !== prevlen) {
send_code(s, curlen, s.bl_tree);
count--;
}
//Assert(count >= 3 && count <= 6, " 3_6?");
send_code(s, REP_3_6, s.bl_tree);
send_bits(s, count - 3, 2);
} else if (count <= 10) {
send_code(s, REPZ_3_10, s.bl_tree);
send_bits(s, count - 3, 3);
} else {
send_code(s, REPZ_11_138, s.bl_tree);
send_bits(s, count - 11, 7);
}
count = 0;
prevlen = curlen;
if (nextlen === 0) {
max_count = 138;
min_count = 3;
} else if (curlen === nextlen) {
max_count = 6;
min_count = 3;
} else {
max_count = 7;
min_count = 4;
}
}
}
/* ===========================================================================
* Construct the Huffman tree for the bit lengths and return the index in
* bl_order of the last bit length code to send.
*/
function build_bl_tree(s) {
var max_blindex; /* index of last bit length code of non zero freq */
/* Determine the bit length frequencies for literal and distance trees */
scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
/* Build the bit length tree: */
build_tree(s, s.bl_desc);
/* opt_len now includes the length of the tree representations, except
* the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
*/
/* Determine the number of bit length codes to send. The pkzip format
* requires that at least 4 bit length codes be sent. (appnote.txt says
* 3 but the actual value used is 4.)
*/
for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
break;
}
}
/* Update opt_len to include the bit length tree and counts */
s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
//Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
// s->opt_len, s->static_len));
return max_blindex;
}
/* ===========================================================================
* Send the header for a block using dynamic Huffman trees: the counts, the
* lengths of the bit length codes, the literal tree and the distance tree.
* IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
*/
function send_all_trees(s, lcodes, dcodes, blcodes)
// deflate_state *s;
// int lcodes, dcodes, blcodes; /* number of codes for each tree */
{
var rank; /* index in bl_order */
//Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
//Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
// "too many codes");
//Tracev((stderr, "\nbl counts: "));
send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
send_bits(s, dcodes - 1, 5);
send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */
for (rank = 0; rank < blcodes; rank++) {
//Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);
}
//Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */
//Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */
//Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
}
/* ===========================================================================
* Check if the data type is TEXT or BINARY, using the following algorithm:
* - TEXT if the two conditions below are satisfied:
* a) There are no non-portable control characters belonging to the
* "black list" (0..6, 14..25, 28..31).
* b) There is at least one printable character belonging to the
* "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
* - BINARY otherwise.
* - The following partially-portable control characters form a
* "gray list" that is ignored in this detection algorithm:
* (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
* IN assertion: the fields Freq of dyn_ltree are set.
*/
function detect_data_type(s) {
/* black_mask is the bit mask of black-listed bytes
* set bits 0..6, 14..25, and 28..31
* 0xf3ffc07f = binary 11110011111111111100000001111111
*/
var black_mask = 0xf3ffc07f;
var n;
/* Check for non-textual ("black-listed") bytes. */
for (n = 0; n <= 31; n++, black_mask >>>= 1) {
if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
return Z_BINARY;
}
}
/* Check for textual ("white-listed") bytes. */
if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
return Z_TEXT;
}
for (n = 32; n < LITERALS; n++) {
if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
return Z_TEXT;
}
}
/* There are no "black-listed" or "white-listed" bytes:
* this stream either is empty or has tolerated ("gray-listed") bytes only.
*/
return Z_BINARY;
}
var static_init_done = false;
/* ===========================================================================
* Initialize the tree data structures for a new zlib stream.
*/
function _tr_init(s)
{
if (!static_init_done) {
tr_static_init();
static_init_done = true;
}
s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);
s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);
s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
s.bi_buf = 0;
s.bi_valid = 0;
/* Initialize the first block of the first file: */
init_block(s);
}
/* ===========================================================================
* Send a stored block
*/
function _tr_stored_block(s, buf, stored_len, last)
//DeflateState *s;
//charf *buf; /* input block */
//ulg stored_len; /* length of input block */
//int last; /* one if this is the last block for a file */
{
send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */
copy_block(s, buf, stored_len, true); /* with header */
}
/* ===========================================================================
* Send one empty static block to give enough lookahead for inflate.
* This takes 10 bits, of which 7 may remain in the bit buffer.
*/
function _tr_align(s) {
send_bits(s, STATIC_TREES << 1, 3);
send_code(s, END_BLOCK, static_ltree);
bi_flush(s);
}
/* ===========================================================================
* Determine the best encoding for the current block: dynamic trees, static
* trees or store, and output the encoded block to the zip file.
*/
function _tr_flush_block(s, buf, stored_len, last)
//DeflateState *s;
//charf *buf; /* input block, or NULL if too old */
//ulg stored_len; /* length of input block */
//int last; /* one if this is the last block for a file */
{
var opt_lenb, static_lenb; /* opt_len and static_len in bytes */
var max_blindex = 0; /* index of last bit length code of non zero freq */
/* Build the Huffman trees unless a stored block is forced */
if (s.level > 0) {
/* Check if the file is binary or text */
if (s.strm.data_type === Z_UNKNOWN) {
s.strm.data_type = detect_data_type(s);
}
/* Construct the literal and distance trees */
build_tree(s, s.l_desc);
// Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
// s->static_len));
build_tree(s, s.d_desc);
// Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
// s->static_len));
/* At this point, opt_len and static_len are the total bit lengths of
* the compressed block data, excluding the tree representations.
*/
/* Build the bit length tree for the above two trees, and get the index
* in bl_order of the last bit length code to send.
*/
max_blindex = build_bl_tree(s);
/* Determine the best encoding. Compute the block lengths in bytes. */
opt_lenb = (s.opt_len + 3 + 7) >>> 3;
static_lenb = (s.static_len + 3 + 7) >>> 3;
// Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
// opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
// s->last_lit));
if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
} else {
// Assert(buf != (char*)0, "lost buf");
opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
}
if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
/* 4: two words for the lengths */
/* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
* Otherwise we can't have processed more than WSIZE input bytes since
* the last block flush, because compression would have been
* successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
* transform a block into a stored block.
*/
_tr_stored_block(s, buf, stored_len, last);
} else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
compress_block(s, static_ltree, static_dtree);
} else {
send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
compress_block(s, s.dyn_ltree, s.dyn_dtree);
}
// Assert (s->compressed_len == s->bits_sent, "bad compressed size");
/* The above check is made mod 2^32, for files larger than 512 MB
* and uLong implemented on 32 bits.
*/
init_block(s);
if (last) {
bi_windup(s);
}
// Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
// s->compressed_len-7*last));
}
/* ===========================================================================
* Save the match info and tally the frequency counts. Return true if
* the current block must be flushed.
*/
function _tr_tally(s, dist, lc)
// deflate_state *s;
// unsigned dist; /* distance of matched string */
// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
{
//var out_length, in_length, dcode;
s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;
s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
s.last_lit++;
if (dist === 0) {
/* lc is the unmatched char */
s.dyn_ltree[lc * 2]/*.Freq*/++;
} else {
s.matches++;
/* Here, lc is the match length - MIN_MATCH */
dist--; /* dist = match distance - 1 */
//Assert((ush)dist < (ush)MAX_DIST(s) &&
// (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
// (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;
s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
}
// (!) This block is disabled in zlib defaults,
// don't enable it for binary compatibility
//#ifdef TRUNCATE_BLOCK
// /* Try to guess if it is profitable to stop the current block here */
// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
// /* Compute an upper bound for the compressed length */
// out_length = s.last_lit*8;
// in_length = s.strstart - s.block_start;
//
// for (dcode = 0; dcode < D_CODES; dcode++) {
// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
// }
// out_length >>>= 3;
// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
// // s->last_lit, in_length, out_length,
// // 100L - out_length*100L/in_length));
// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
// return true;
// }
// }
//#endif
return (s.last_lit === s.lit_bufsize - 1);
/* We avoid equality with lit_bufsize because of wraparound at 64K
* on 16 bit machines and because stored blocks are restricted to
* 64K-1 bytes.
*/
}
var _tr_init_1 = _tr_init;
var _tr_stored_block_1 = _tr_stored_block;
var _tr_flush_block_1 = _tr_flush_block;
var _tr_tally_1 = _tr_tally;
var _tr_align_1 = _tr_align;
var trees = {
_tr_init: _tr_init_1,
_tr_stored_block: _tr_stored_block_1,
_tr_flush_block: _tr_flush_block_1,
_tr_tally: _tr_tally_1,
_tr_align: _tr_align_1
};
'use strict';
// Note: adler32 takes 12% for level 0 and 2% for level 6.
// It isn't worth it to make additional optimizations as in original.
// Small size is preferable.
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
function adler32(adler, buf, len, pos) {
var s1 = (adler & 0xffff) |0,
s2 = ((adler >>> 16) & 0xffff) |0,
n = 0;
while (len !== 0) {
// Set limit ~ twice less than 5552, to keep
// s2 in 31-bits, because we force signed ints.
// in other case %= will fail.
n = len > 2000 ? 2000 : len;
len -= n;
do {
s1 = (s1 + buf[pos++]) |0;
s2 = (s2 + s1) |0;
} while (--n);
s1 %= 65521;
s2 %= 65521;
}
return (s1 | (s2 << 16)) |0;
}
var adler32_1 = adler32;
'use strict';
// Note: we can't get significant speed boost here.
// So write code to minimize size - no pregenerated tables
// and array tools dependencies.
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
// Use ordinary array, since untyped makes no boost here
function makeTable() {
var c, table = [];
for (var n = 0; n < 256; n++) {
c = n;
for (var k = 0; k < 8; k++) {
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
}
table[n] = c;
}
return table;
}
// Create table on load. Just 255 signed longs. Not a problem.
var crcTable = makeTable();
function crc32(crc, buf, len, pos) {
var t = crcTable,
end = pos + len;
crc ^= -1;
for (var i = pos; i < end; i++) {
crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
}
return (crc ^ (-1)); // >>> 0;
}
var crc32_1 = crc32;
'use strict';
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
var messages = {
2: 'need dictionary', /* Z_NEED_DICT 2 */
1: 'stream end', /* Z_STREAM_END 1 */
0: '', /* Z_OK 0 */
'-1': 'file error', /* Z_ERRNO (-1) */
'-2': 'stream error', /* Z_STREAM_ERROR (-2) */
'-3': 'data error', /* Z_DATA_ERROR (-3) */
'-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */
'-5': 'buffer error', /* Z_BUF_ERROR (-5) */
'-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */
};
'use strict';
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
/* Public constants ==========================================================*/
/* ===========================================================================*/
/* Allowed flush values; see deflate() and inflate() below for details */
var Z_NO_FLUSH = 0;
var Z_PARTIAL_FLUSH = 1;
//var Z_SYNC_FLUSH = 2;
var Z_FULL_FLUSH = 3;
var Z_FINISH = 4;
var Z_BLOCK = 5;
//var Z_TREES = 6;
/* Return codes for the compression/decompression functions. Negative values
* are errors, positive values are used for special but normal events.
*/
var Z_OK = 0;
var Z_STREAM_END = 1;
//var Z_NEED_DICT = 2;
//var Z_ERRNO = -1;
var Z_STREAM_ERROR = -2;
var Z_DATA_ERROR = -3;
//var Z_MEM_ERROR = -4;
var Z_BUF_ERROR = -5;
//var Z_VERSION_ERROR = -6;
/* compression levels */
//var Z_NO_COMPRESSION = 0;
//var Z_BEST_SPEED = 1;
//var Z_BEST_COMPRESSION = 9;
var Z_DEFAULT_COMPRESSION = -1;
var Z_FILTERED = 1;
var Z_HUFFMAN_ONLY = 2;
var Z_RLE = 3;
var Z_FIXED$1 = 4;
var Z_DEFAULT_STRATEGY = 0;
/* Possible values of the data_type field (though see inflate()) */
//var Z_BINARY = 0;
//var Z_TEXT = 1;
//var Z_ASCII = 1; // = Z_TEXT
var Z_UNKNOWN$1 = 2;
/* The deflate compression method */
var Z_DEFLATED = 8;
/*============================================================================*/
var MAX_MEM_LEVEL = 9;
/* Maximum value for memLevel in deflateInit2 */
var MAX_WBITS = 15;
/* 32K LZ77 window */
var DEF_MEM_LEVEL = 8;
var LENGTH_CODES$1 = 29;
/* number of length codes, not counting the special END_BLOCK code */
var LITERALS$1 = 256;
/* number of literal bytes 0..255 */
var L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;
/* number of Literal or Length codes, including the END_BLOCK code */
var D_CODES$1 = 30;
/* number of distance codes */
var BL_CODES$1 = 19;
/* number of codes used to transfer the bit lengths */
var HEAP_SIZE$1 = 2 * L_CODES$1 + 1;
/* maximum heap size */
var MAX_BITS$1 = 15;
/* All codes must not exceed MAX_BITS bits */
var MIN_MATCH$1 = 3;
var MAX_MATCH$1 = 258;
var MIN_LOOKAHEAD = (MAX_MATCH$1 + MIN_MATCH$1 + 1);
var PRESET_DICT = 0x20;
var INIT_STATE = 42;
var EXTRA_STATE = 69;
var NAME_STATE = 73;
var COMMENT_STATE = 91;
var HCRC_STATE = 103;
var BUSY_STATE = 113;
var FINISH_STATE = 666;
var BS_NEED_MORE = 1; /* block not completed, need more input or more output */
var BS_BLOCK_DONE = 2; /* block flush performed */
var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */
var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
function err(strm, errorCode) {
strm.msg = messages[errorCode];
return errorCode;
}
function rank(f) {
return ((f) << 1) - ((f) > 4 ? 9 : 0);
}
function zero$1(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
/* =========================================================================
* Flush as much pending output as possible. All deflate() output goes
* through this function so some applications may wish to modify it
* to avoid allocating a large strm->output buffer and copying into it.
* (See also read_buf()).
*/
function flush_pending(strm) {
var s = strm.state;
//_tr_flush_bits(s);
var len = s.pending;
if (len > strm.avail_out) {
len = strm.avail_out;
}
if (len === 0) { return; }
common.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
strm.next_out += len;
s.pending_out += len;
strm.total_out += len;
strm.avail_out -= len;
s.pending -= len;
if (s.pending === 0) {
s.pending_out = 0;
}
}
function flush_block_only(s, last) {
trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
s.block_start = s.strstart;
flush_pending(s.strm);
}
function put_byte(s, b) {
s.pending_buf[s.pending++] = b;
}
/* =========================================================================
* Put a short in the pending buffer. The 16-bit value is put in MSB order.
* IN assertion: the stream state is correct and there is enough room in
* pending_buf.
*/
function putShortMSB(s, b) {
// put_byte(s, (Byte)(b >> 8));
// put_byte(s, (Byte)(b & 0xff));
s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
s.pending_buf[s.pending++] = b & 0xff;
}
/* ===========================================================================
* Read a new buffer from the current input stream, update the adler32
* and total number of bytes read. All deflate() input goes through
* this function so some applications may wish to modify it to avoid
* allocating a large strm->input buffer and copying from it.
* (See also flush_pending()).
*/
function read_buf(strm, buf, start, size) {
var len = strm.avail_in;
if (len > size) { len = size; }
if (len === 0) { return 0; }
strm.avail_in -= len;
// zmemcpy(buf, strm->next_in, len);
common.arraySet(buf, strm.input, strm.next_in, len, start);
if (strm.state.wrap === 1) {
strm.adler = adler32_1(strm.adler, buf, len, start);
}
else if (strm.state.wrap === 2) {
strm.adler = crc32_1(strm.adler, buf, len, start);
}
strm.next_in += len;
strm.total_in += len;
return len;
}
/* ===========================================================================
* Set match_start to the longest match starting at the given string and
* return its length. Matches shorter or equal to prev_length are discarded,
* in which case the result is equal to prev_length and match_start is
* garbage.
* IN assertions: cur_match is the head of the hash chain for the current
* string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
* OUT assertion: the match length is not greater than s->lookahead.
*/
function longest_match(s, cur_match) {
var chain_length = s.max_chain_length; /* max hash chain length */
var scan = s.strstart; /* current string */
var match; /* matched string */
var len; /* length of current match */
var best_len = s.prev_length; /* best match length so far */
var nice_match = s.nice_match; /* stop if match long enough */
var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
var _win = s.window; // shortcut
var wmask = s.w_mask;
var prev = s.prev;
/* Stop when cur_match becomes <= limit. To simplify the code,
* we prevent matches with the string of window index 0.
*/
var strend = s.strstart + MAX_MATCH$1;
var scan_end1 = _win[scan + best_len - 1];
var scan_end = _win[scan + best_len];
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
* It is easy to get rid of this optimization if necessary.
*/
// Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
/* Do not waste too much time if we already have a good match: */
if (s.prev_length >= s.good_match) {
chain_length >>= 2;
}
/* Do not look for matches beyond the end of the input. This is necessary
* to make deflate deterministic.
*/
if (nice_match > s.lookahead) { nice_match = s.lookahead; }
// Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
do {
// Assert(cur_match < s->strstart, "no future");
match = cur_match;
/* Skip to next match if the match length cannot increase
* or if the match length is less than 2. Note that the checks below
* for insufficient lookahead only occur occasionally for performance
* reasons. Therefore uninitialized memory will be accessed, and
* conditional jumps will be made that depend on those values.
* However the length of the match is limited to the lookahead, so
* the output of deflate is not affected by the uninitialized values.
*/
if (_win[match + best_len] !== scan_end ||
_win[match + best_len - 1] !== scan_end1 ||
_win[match] !== _win[scan] ||
_win[++match] !== _win[scan + 1]) {
continue;
}
/* The check at best_len-1 can be removed because it will be made
* again later. (This heuristic is not always a win.)
* It is not necessary to compare scan[2] and match[2] since they
* are always equal when the other bytes match, given that
* the hash keys are equal and that HASH_BITS >= 8.
*/
scan += 2;
match++;
// Assert(*scan == *match, "match[2]?");
/* We check for insufficient lookahead only every 8th comparison;
* the 256th check will be made at strstart+258.
*/
do {
/*jshint noempty:false*/
} while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
scan < strend);
// Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
len = MAX_MATCH$1 - (strend - scan);
scan = strend - MAX_MATCH$1;
if (len > best_len) {
s.match_start = cur_match;
best_len = len;
if (len >= nice_match) {
break;
}
scan_end1 = _win[scan + best_len - 1];
scan_end = _win[scan + best_len];
}
} while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
if (best_len <= s.lookahead) {
return best_len;
}
return s.lookahead;
}
/* ===========================================================================
* Fill the window when the lookahead becomes insufficient.
* Updates strstart and lookahead.
*
* IN assertion: lookahead < MIN_LOOKAHEAD
* OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
* At least one byte has been read, or avail_in == 0; reads are
* performed for at least two bytes (required for the zip translate_eol
* option -- not supported here).
*/
function fill_window(s) {
var _w_size = s.w_size;
var p, n, m, more, str;
//Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
do {
more = s.window_size - s.lookahead - s.strstart;
// JS ints have 32 bit, block below not needed
/* Deal with !@#$% 64K limit: */
//if (sizeof(int) <= 2) {
// if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
// more = wsize;
//
// } else if (more == (unsigned)(-1)) {
// /* Very unlikely, but possible on 16 bit machine if
// * strstart == 0 && lookahead == 1 (input done a byte at time)
// */
// more--;
// }
//}
/* If the window is almost full and there is insufficient lookahead,
* move the upper half to the lower one to make room in the upper half.
*/
if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
common.arraySet(s.window, s.window, _w_size, _w_size, 0);
s.match_start -= _w_size;
s.strstart -= _w_size;
/* we now have strstart >= MAX_DIST */
s.block_start -= _w_size;
/* Slide the hash table (could be avoided with 32 bit values
at the expense of memory usage). We slide even when level == 0
to keep the hash table consistent if we switch back to level > 0
later. (Using level 0 permanently is not an optimal usage of
zlib, so we don't care about this pathological case.)
*/
n = s.hash_size;
p = n;
do {
m = s.head[--p];
s.head[p] = (m >= _w_size ? m - _w_size : 0);
} while (--n);
n = _w_size;
p = n;
do {
m = s.prev[--p];
s.prev[p] = (m >= _w_size ? m - _w_size : 0);
/* If n is not on any hash chain, prev[n] is garbage but
* its value will never be used.
*/
} while (--n);
more += _w_size;
}
if (s.strm.avail_in === 0) {
break;
}
/* If there was no sliding:
* strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
* more == window_size - lookahead - strstart
* => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
* => more >= window_size - 2*WSIZE + 2
* In the BIG_MEM or MMAP case (not yet supported),
* window_size == input_size + MIN_LOOKAHEAD &&
* strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
* Otherwise, window_size == 2*WSIZE so more >= 2.
* If there was sliding, more >= WSIZE. So in all cases, more >= 2.
*/
//Assert(more >= 2, "more < 2");
n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
s.lookahead += n;
/* Initialize the hash value now that we have some input: */
if (s.lookahead + s.insert >= MIN_MATCH$1) {
str = s.strstart - s.insert;
s.ins_h = s.window[str];
/* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
//#if MIN_MATCH != 3
// Call update_hash() MIN_MATCH-3 more times
//#endif
while (s.insert) {
/* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH$1 - 1]) & s.hash_mask;
s.prev[str & s.w_mask] = s.head[s.ins_h];
s.head[s.ins_h] = str;
str++;
s.insert--;
if (s.lookahead + s.insert < MIN_MATCH$1) {
break;
}
}
}
/* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
* but this is not important since only literal bytes will be emitted.
*/
} while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
/* If the WIN_INIT bytes after the end of the current data have never been
* written, then zero those bytes in order to avoid memory check reports of
* the use of uninitialized (or uninitialised as Julian writes) bytes by
* the longest match routines. Update the high water mark for the next
* time through here. WIN_INIT is set to MAX_MATCH since the longest match
* routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
*/
// if (s.high_water < s.window_size) {
// var curr = s.strstart + s.lookahead;
// var init = 0;
//
// if (s.high_water < curr) {
// /* Previous high water mark below current data -- zero WIN_INIT
// * bytes or up to end of window, whichever is less.
// */
// init = s.window_size - curr;
// if (init > WIN_INIT)
// init = WIN_INIT;
// zmemzero(s->window + curr, (unsigned)init);
// s->high_water = curr + init;
// }
// else if (s->high_water < (ulg)curr + WIN_INIT) {
// /* High water mark at or above current data, but below current data
// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
// * to end of window, whichever is less.
// */
// init = (ulg)curr + WIN_INIT - s->high_water;
// if (init > s->window_size - s->high_water)
// init = s->window_size - s->high_water;
// zmemzero(s->window + s->high_water, (unsigned)init);
// s->high_water += init;
// }
// }
//
// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
// "not enough room for search");
}
/* ===========================================================================
* Copy without compression as much as possible from the input stream, return
* the current block state.
* This function does not insert new strings in the dictionary since
* uncompressible data is probably not useful. This function is used
* only for the level=0 compression option.
* NOTE: this function should be optimized to avoid extra copying from
* window to pending_buf.
*/
function deflate_stored(s, flush) {
/* Stored blocks are limited to 0xffff bytes, pending_buf is limited
* to pending_buf_size, and each stored block has a 5 byte header:
*/
var max_block_size = 0xffff;
if (max_block_size > s.pending_buf_size - 5) {
max_block_size = s.pending_buf_size - 5;
}
/* Copy as much as possible from input to output: */
for (;;) {
/* Fill the window as much as possible: */
if (s.lookahead <= 1) {
//Assert(s->strstart < s->w_size+MAX_DIST(s) ||
// s->block_start >= (long)s->w_size, "slide too late");
// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
// s.block_start >= s.w_size)) {
// throw new Error("slide too late");
// }
fill_window(s);
if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
return BS_NEED_MORE;
}
if (s.lookahead === 0) {
break;
}
/* flush the current block */
}
//Assert(s->block_start >= 0L, "block gone");
// if (s.block_start < 0) throw new Error("block gone");
s.strstart += s.lookahead;
s.lookahead = 0;
/* Emit a stored block if pending_buf will be full: */
var max_start = s.block_start + max_block_size;
if (s.strstart === 0 || s.strstart >= max_start) {
/* strstart == 0 is possible when wraparound on 16-bit machine */
s.lookahead = s.strstart - max_start;
s.strstart = max_start;
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
/* Flush if we may have to slide, otherwise block_start may become
* negative and the data will be gone:
*/
if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
}
s.insert = 0;
if (flush === Z_FINISH) {
/*** FLUSH_BLOCK(s, 1); ***/
flush_block_only(s, true);
if (s.strm.avail_out === 0) {
return BS_FINISH_STARTED;
}
/***/
return BS_FINISH_DONE;
}
if (s.strstart > s.block_start) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
return BS_NEED_MORE;
}
/* ===========================================================================
* Compress as much as possible from the input stream, return the current
* block state.
* This function does not perform lazy evaluation of matches and inserts
* new strings in the dictionary only for unmatched strings or for short
* matches. It is used only for the fast compression options.
*/
function deflate_fast(s, flush) {
var hash_head; /* head of the hash chain */
var bflush; /* set if current block must be flushed */
for (;;) {
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need MAX_MATCH bytes
* for the next match, plus MIN_MATCH bytes to insert the
* string following the next match.
*/
if (s.lookahead < MIN_LOOKAHEAD) {
fill_window(s);
if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
return BS_NEED_MORE;
}
if (s.lookahead === 0) {
break; /* flush the current block */
}
}
/* Insert the string window[strstart .. strstart+2] in the
* dictionary, and set hash_head to the head of the hash chain:
*/
hash_head = 0/*NIL*/;
if (s.lookahead >= MIN_MATCH$1) {
/*** INSERT_STRING(s, s.strstart, hash_head); ***/
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$1 - 1]) & s.hash_mask;
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
s.head[s.ins_h] = s.strstart;
/***/
}
/* Find the longest match, discarding those <= prev_length.
* At this point we have always match_length < MIN_MATCH
*/
if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
/* To simplify the code, we prevent matches with the string
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
s.match_length = longest_match(s, hash_head);
/* longest_match() sets match_start */
}
if (s.match_length >= MIN_MATCH$1) {
// check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
/*** _tr_tally_dist(s, s.strstart - s.match_start,
s.match_length - MIN_MATCH, bflush); ***/
bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH$1);
s.lookahead -= s.match_length;
/* Insert new strings in the hash table only if the match length
* is not too large. This saves time but degrades compression.
*/
if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH$1) {
s.match_length--; /* string at strstart already in table */
do {
s.strstart++;
/*** INSERT_STRING(s, s.strstart, hash_head); ***/
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$1 - 1]) & s.hash_mask;
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
s.head[s.ins_h] = s.strstart;
/***/
/* strstart never exceeds WSIZE-MAX_MATCH, so there are
* always MIN_MATCH bytes ahead.
*/
} while (--s.match_length !== 0);
s.strstart++;
} else
{
s.strstart += s.match_length;
s.match_length = 0;
s.ins_h = s.window[s.strstart];
/* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
//#if MIN_MATCH != 3
// Call UPDATE_HASH() MIN_MATCH-3 more times
//#endif
/* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
* matter since it will be recomputed at next deflate call.
*/
}
} else {
/* No match, output a literal byte */
//Tracevv((stderr,"%c", s.window[s.strstart]));
/*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
s.lookahead--;
s.strstart++;
}
if (bflush) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
}
s.insert = ((s.strstart < (MIN_MATCH$1 - 1)) ? s.strstart : MIN_MATCH$1 - 1);
if (flush === Z_FINISH) {
/*** FLUSH_BLOCK(s, 1); ***/
flush_block_only(s, true);
if (s.strm.avail_out === 0) {
return BS_FINISH_STARTED;
}
/***/
return BS_FINISH_DONE;
}
if (s.last_lit) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
return BS_BLOCK_DONE;
}
/* ===========================================================================
* Same as above, but achieves better compression. We use a lazy
* evaluation for matches: a match is finally adopted only if there is
* no better match at the next window position.
*/
function deflate_slow(s, flush) {
var hash_head; /* head of hash chain */
var bflush; /* set if current block must be flushed */
var max_insert;
/* Process the input block. */
for (;;) {
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need MAX_MATCH bytes
* for the next match, plus MIN_MATCH bytes to insert the
* string following the next match.
*/
if (s.lookahead < MIN_LOOKAHEAD) {
fill_window(s);
if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
return BS_NEED_MORE;
}
if (s.lookahead === 0) { break; } /* flush the current block */
}
/* Insert the string window[strstart .. strstart+2] in the
* dictionary, and set hash_head to the head of the hash chain:
*/
hash_head = 0/*NIL*/;
if (s.lookahead >= MIN_MATCH$1) {
/*** INSERT_STRING(s, s.strstart, hash_head); ***/
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$1 - 1]) & s.hash_mask;
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
s.head[s.ins_h] = s.strstart;
/***/
}
/* Find the longest match, discarding those <= prev_length.
*/
s.prev_length = s.match_length;
s.prev_match = s.match_start;
s.match_length = MIN_MATCH$1 - 1;
if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
/* To simplify the code, we prevent matches with the string
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
s.match_length = longest_match(s, hash_head);
/* longest_match() sets match_start */
if (s.match_length <= 5 &&
(s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH$1 && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
/* If prev_match is also MIN_MATCH, match_start is garbage
* but we will ignore the current match anyway.
*/
s.match_length = MIN_MATCH$1 - 1;
}
}
/* If there was a match at the previous step and the current
* match is not better, output the previous match:
*/
if (s.prev_length >= MIN_MATCH$1 && s.match_length <= s.prev_length) {
max_insert = s.strstart + s.lookahead - MIN_MATCH$1;
/* Do not insert strings in hash table beyond this. */
//check_match(s, s.strstart-1, s.prev_match, s.prev_length);
/***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
s.prev_length - MIN_MATCH, bflush);***/
bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH$1);
/* Insert in hash table all strings up to the end of the match.
* strstart-1 and strstart are already inserted. If there is not
* enough lookahead, the last two strings are not inserted in
* the hash table.
*/
s.lookahead -= s.prev_length - 1;
s.prev_length -= 2;
do {
if (++s.strstart <= max_insert) {
/*** INSERT_STRING(s, s.strstart, hash_head); ***/
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$1 - 1]) & s.hash_mask;
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
s.head[s.ins_h] = s.strstart;
/***/
}
} while (--s.prev_length !== 0);
s.match_available = 0;
s.match_length = MIN_MATCH$1 - 1;
s.strstart++;
if (bflush) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
} else if (s.match_available) {
/* If there was no match at the previous position, output a
* single literal. If there was a match but the current match
* is longer, truncate the previous match to a single literal.
*/
//Tracevv((stderr,"%c", s->window[s->strstart-1]));
/*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
if (bflush) {
/*** FLUSH_BLOCK_ONLY(s, 0) ***/
flush_block_only(s, false);
/***/
}
s.strstart++;
s.lookahead--;
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
} else {
/* There is no previous match to compare with, wait for
* the next step to decide.
*/
s.match_available = 1;
s.strstart++;
s.lookahead--;
}
}
//Assert (flush != Z_NO_FLUSH, "no flush?");
if (s.match_available) {
//Tracevv((stderr,"%c", s->window[s->strstart-1]));
/*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
s.match_available = 0;
}
s.insert = s.strstart < MIN_MATCH$1 - 1 ? s.strstart : MIN_MATCH$1 - 1;
if (flush === Z_FINISH) {
/*** FLUSH_BLOCK(s, 1); ***/
flush_block_only(s, true);
if (s.strm.avail_out === 0) {
return BS_FINISH_STARTED;
}
/***/
return BS_FINISH_DONE;
}
if (s.last_lit) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
return BS_BLOCK_DONE;
}
/* ===========================================================================
* For Z_RLE, simply look for runs of bytes, generate matches only of distance
* one. Do not maintain a hash table. (It will be regenerated if this run of
* deflate switches away from Z_RLE.)
*/
function deflate_rle(s, flush) {
var bflush; /* set if current block must be flushed */
var prev; /* byte at distance one to match */
var scan, strend; /* scan goes up to strend for length of run */
var _win = s.window;
for (;;) {
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need MAX_MATCH bytes
* for the longest run, plus one for the unrolled loop.
*/
if (s.lookahead <= MAX_MATCH$1) {
fill_window(s);
if (s.lookahead <= MAX_MATCH$1 && flush === Z_NO_FLUSH) {
return BS_NEED_MORE;
}
if (s.lookahead === 0) { break; } /* flush the current block */
}
/* See how many times the previous byte repeats */
s.match_length = 0;
if (s.lookahead >= MIN_MATCH$1 && s.strstart > 0) {
scan = s.strstart - 1;
prev = _win[scan];
if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
strend = s.strstart + MAX_MATCH$1;
do {
/*jshint noempty:false*/
} while (prev === _win[++scan] && prev === _win[++scan] &&
prev === _win[++scan] && prev === _win[++scan] &&
prev === _win[++scan] && prev === _win[++scan] &&
prev === _win[++scan] && prev === _win[++scan] &&
scan < strend);
s.match_length = MAX_MATCH$1 - (strend - scan);
if (s.match_length > s.lookahead) {
s.match_length = s.lookahead;
}
}
//Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
}
/* Emit match if have run of MIN_MATCH or longer, else emit literal */
if (s.match_length >= MIN_MATCH$1) {
//check_match(s, s.strstart, s.strstart - 1, s.match_length);
/*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH$1);
s.lookahead -= s.match_length;
s.strstart += s.match_length;
s.match_length = 0;
} else {
/* No match, output a literal byte */
//Tracevv((stderr,"%c", s->window[s->strstart]));
/*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
s.lookahead--;
s.strstart++;
}
if (bflush) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
}
s.insert = 0;
if (flush === Z_FINISH) {
/*** FLUSH_BLOCK(s, 1); ***/
flush_block_only(s, true);
if (s.strm.avail_out === 0) {
return BS_FINISH_STARTED;
}
/***/
return BS_FINISH_DONE;
}
if (s.last_lit) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
return BS_BLOCK_DONE;
}
/* ===========================================================================
* For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
* (It will be regenerated if this run of deflate switches away from Huffman.)
*/
function deflate_huff(s, flush) {
var bflush; /* set if current block must be flushed */
for (;;) {
/* Make sure that we have a literal to write. */
if (s.lookahead === 0) {
fill_window(s);
if (s.lookahead === 0) {
if (flush === Z_NO_FLUSH) {
return BS_NEED_MORE;
}
break; /* flush the current block */
}
}
/* Output a literal byte */
s.match_length = 0;
//Tracevv((stderr,"%c", s->window[s->strstart]));
/*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
s.lookahead--;
s.strstart++;
if (bflush) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
}
s.insert = 0;
if (flush === Z_FINISH) {
/*** FLUSH_BLOCK(s, 1); ***/
flush_block_only(s, true);
if (s.strm.avail_out === 0) {
return BS_FINISH_STARTED;
}
/***/
return BS_FINISH_DONE;
}
if (s.last_lit) {
/*** FLUSH_BLOCK(s, 0); ***/
flush_block_only(s, false);
if (s.strm.avail_out === 0) {
return BS_NEED_MORE;
}
/***/
}
return BS_BLOCK_DONE;
}
/* Values for max_lazy_match, good_match and max_chain_length, depending on
* the desired pack level (0..9). The values given below have been tuned to
* exclude worst case performance for pathological files. Better values may be
* found for specific files.
*/
function Config(good_length, max_lazy, nice_length, max_chain, func) {
this.good_length = good_length;
this.max_lazy = max_lazy;
this.nice_length = nice_length;
this.max_chain = max_chain;
this.func = func;
}
var configuration_table;
configuration_table = [
/* good lazy nice chain */
new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */
new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */
new Config(4, 5, 16, 8, deflate_fast), /* 2 */
new Config(4, 6, 32, 32, deflate_fast), /* 3 */
new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */
new Config(8, 16, 32, 32, deflate_slow), /* 5 */
new Config(8, 16, 128, 128, deflate_slow), /* 6 */
new Config(8, 32, 128, 256, deflate_slow), /* 7 */
new Config(32, 128, 258, 1024, deflate_slow), /* 8 */
new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */
];
/* ===========================================================================
* Initialize the "longest match" routines for a new zlib stream
*/
function lm_init(s) {
s.window_size = 2 * s.w_size;
/*** CLEAR_HASH(s); ***/
zero$1(s.head); // Fill with NIL (= 0);
/* Set the default configuration parameters:
*/
s.max_lazy_match = configuration_table[s.level].max_lazy;
s.good_match = configuration_table[s.level].good_length;
s.nice_match = configuration_table[s.level].nice_length;
s.max_chain_length = configuration_table[s.level].max_chain;
s.strstart = 0;
s.block_start = 0;
s.lookahead = 0;
s.insert = 0;
s.match_length = s.prev_length = MIN_MATCH$1 - 1;
s.match_available = 0;
s.ins_h = 0;
}
function DeflateState() {
this.strm = null; /* pointer back to this zlib stream */
this.status = 0; /* as the name implies */
this.pending_buf = null; /* output still pending */
this.pending_buf_size = 0; /* size of pending_buf */
this.pending_out = 0; /* next pending byte to output to the stream */
this.pending = 0; /* nb of bytes in the pending buffer */
this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
this.gzhead = null; /* gzip header information to write */
this.gzindex = 0; /* where in extra, name, or comment */
this.method = Z_DEFLATED; /* can only be DEFLATED */
this.last_flush = -1; /* value of flush param for previous deflate call */
this.w_size = 0; /* LZ77 window size (32K by default) */
this.w_bits = 0; /* log2(w_size) (8..16) */
this.w_mask = 0; /* w_size - 1 */
this.window = null;
/* Sliding window. Input bytes are read into the second half of the window,
* and move to the first half later to keep a dictionary of at least wSize
* bytes. With this organization, matches are limited to a distance of
* wSize-MAX_MATCH bytes, but this ensures that IO is always
* performed with a length multiple of the block size.
*/
this.window_size = 0;
/* Actual size of window: 2*wSize, except when the user input buffer
* is directly used as sliding window.
*/
this.prev = null;
/* Link to older string with same hash index. To limit the size of this
* array to 64K, this link is maintained only for the last 32K strings.
* An index in this array is thus a window index modulo 32K.
*/
this.head = null; /* Heads of the hash chains or NIL. */
this.ins_h = 0; /* hash index of string to be inserted */
this.hash_size = 0; /* number of elements in hash table */
this.hash_bits = 0; /* log2(hash_size) */
this.hash_mask = 0; /* hash_size-1 */
this.hash_shift = 0;
/* Number of bits by which ins_h must be shifted at each input
* step. It must be such that after MIN_MATCH steps, the oldest
* byte no longer takes part in the hash key, that is:
* hash_shift * MIN_MATCH >= hash_bits
*/
this.block_start = 0;
/* Window position at the beginning of the current output block. Gets
* negative when the window is moved backwards.
*/
this.match_length = 0; /* length of best match */
this.prev_match = 0; /* previous match */
this.match_available = 0; /* set if previous match exists */
this.strstart = 0; /* start of string to insert */
this.match_start = 0; /* start of matching string */
this.lookahead = 0; /* number of valid bytes ahead in window */
this.prev_length = 0;
/* Length of the best match at previous step. Matches not greater than this
* are discarded. This is used in the lazy match evaluation.
*/
this.max_chain_length = 0;
/* To speed up deflation, hash chains are never searched beyond this
* length. A higher limit improves compression ratio but degrades the
* speed.
*/
this.max_lazy_match = 0;
/* Attempt to find a better match only when the current match is strictly
* smaller than this value. This mechanism is used only for compression
* levels >= 4.
*/
// That's alias to max_lazy_match, don't use directly
//this.max_insert_length = 0;
/* Insert new strings in the hash table only if the match length is not
* greater than this length. This saves time but degrades compression.
* max_insert_length is used only for compression levels <= 3.
*/
this.level = 0; /* compression level (1..9) */
this.strategy = 0; /* favor or force Huffman coding*/
this.good_match = 0;
/* Use a faster search when the previous match is longer than this */
this.nice_match = 0; /* Stop searching when current match exceeds this */
/* used by trees.c: */
/* Didn't use ct_data typedef below to suppress compiler warning */
// struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
// struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
// struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
// Use flat array of DOUBLE size, with interleaved fata,
// because JS does not support effective
this.dyn_ltree = new common.Buf16(HEAP_SIZE$1 * 2);
this.dyn_dtree = new common.Buf16((2 * D_CODES$1 + 1) * 2);
this.bl_tree = new common.Buf16((2 * BL_CODES$1 + 1) * 2);
zero$1(this.dyn_ltree);
zero$1(this.dyn_dtree);
zero$1(this.bl_tree);
this.l_desc = null; /* desc. for literal tree */
this.d_desc = null; /* desc. for distance tree */
this.bl_desc = null; /* desc. for bit length tree */
//ush bl_count[MAX_BITS+1];
this.bl_count = new common.Buf16(MAX_BITS$1 + 1);
/* number of codes at each bit length for an optimal tree */
//int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
this.heap = new common.Buf16(2 * L_CODES$1 + 1); /* heap used to build the Huffman trees */
zero$1(this.heap);
this.heap_len = 0; /* number of elements in the heap */
this.heap_max = 0; /* element of largest frequency */
/* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
* The same heap array is used to build all trees.
*/
this.depth = new common.Buf16(2 * L_CODES$1 + 1); //uch depth[2*L_CODES+1];
zero$1(this.depth);
/* Depth of each subtree used as tie breaker for trees of equal frequency
*/
this.l_buf = 0; /* buffer index for literals or lengths */
this.lit_bufsize = 0;
/* Size of match buffer for literals/lengths. There are 4 reasons for
* limiting lit_bufsize to 64K:
* - frequencies can be kept in 16 bit counters
* - if compression is not successful for the first block, all input
* data is still in the window so we can still emit a stored block even
* when input comes from standard input. (This can also be done for
* all blocks if lit_bufsize is not greater than 32K.)
* - if compression is not successful for a file smaller than 64K, we can
* even emit a stored file instead of a stored block (saving 5 bytes).
* This is applicable only for zip (not gzip or zlib).
* - creating new Huffman trees less frequently may not provide fast
* adaptation to changes in the input data statistics. (Take for
* example a binary file with poorly compressible code followed by
* a highly compressible string table.) Smaller buffer sizes give
* fast adaptation but have of course the overhead of transmitting
* trees more frequently.
* - I can't count above 4
*/
this.last_lit = 0; /* running index in l_buf */
this.d_buf = 0;
/* Buffer index for distances. To simplify the code, d_buf and l_buf have
* the same number of elements. To use different lengths, an extra flag
* array would be necessary.
*/
this.opt_len = 0; /* bit length of current block with optimal trees */
this.static_len = 0; /* bit length of current block with static trees */
this.matches = 0; /* number of string matches in current block */
this.insert = 0; /* bytes at end of window left to insert */
this.bi_buf = 0;
/* Output buffer. bits are inserted starting at the bottom (least
* significant bits).
*/
this.bi_valid = 0;
/* Number of valid bits in bi_buf. All bits above the last valid bit
* are always zero.
*/
// Used for window memory init. We safely ignore it for JS. That makes
// sense only for pointers and memory check tools.
//this.high_water = 0;
/* High water mark offset in window for initialized bytes -- bytes above
* this are set to zero in order to avoid memory check warnings when
* longest match routines access bytes past the input. This is then
* updated to the new high water mark.
*/
}
function deflateResetKeep(strm) {
var s;
if (!strm || !strm.state) {
return err(strm, Z_STREAM_ERROR);
}
strm.total_in = strm.total_out = 0;
strm.data_type = Z_UNKNOWN$1;
s = strm.state;
s.pending = 0;
s.pending_out = 0;
if (s.wrap < 0) {
s.wrap = -s.wrap;
/* was made negative by deflate(..., Z_FINISH); */
}
s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
strm.adler = (s.wrap === 2) ?
0 // crc32(0, Z_NULL, 0)
:
1; // adler32(0, Z_NULL, 0)
s.last_flush = Z_NO_FLUSH;
trees._tr_init(s);
return Z_OK;
}
function deflateReset(strm) {
var ret = deflateResetKeep(strm);
if (ret === Z_OK) {
lm_init(strm.state);
}
return ret;
}
function deflateSetHeader(strm, head) {
if (!strm || !strm.state) { return Z_STREAM_ERROR; }
if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
strm.state.gzhead = head;
return Z_OK;
}
function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
if (!strm) { // === Z_NULL
return Z_STREAM_ERROR;
}
var wrap = 1;
if (level === Z_DEFAULT_COMPRESSION) {
level = 6;
}
if (windowBits < 0) { /* suppress zlib wrapper */
wrap = 0;
windowBits = -windowBits;
}
else if (windowBits > 15) {
wrap = 2; /* write gzip wrapper instead */
windowBits -= 16;
}
if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
strategy < 0 || strategy > Z_FIXED$1) {
return err(strm, Z_STREAM_ERROR);
}
if (windowBits === 8) {
windowBits = 9;
}
/* until 256-byte window bug fixed */
var s = new DeflateState();
strm.state = s;
s.strm = strm;
s.wrap = wrap;
s.gzhead = null;
s.w_bits = windowBits;
s.w_size = 1 << s.w_bits;
s.w_mask = s.w_size - 1;
s.hash_bits = memLevel + 7;
s.hash_size = 1 << s.hash_bits;
s.hash_mask = s.hash_size - 1;
s.hash_shift = ~~((s.hash_bits + MIN_MATCH$1 - 1) / MIN_MATCH$1);
s.window = new common.Buf8(s.w_size * 2);
s.head = new common.Buf16(s.hash_size);
s.prev = new common.Buf16(s.w_size);
// Don't need mem init magic for JS.
//s.high_water = 0; /* nothing written to s->window yet */
s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
s.pending_buf_size = s.lit_bufsize * 4;
//overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
//s->pending_buf = (uchf *) overlay;
s.pending_buf = new common.Buf8(s.pending_buf_size);
// It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
//s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
s.d_buf = 1 * s.lit_bufsize;
//s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
s.l_buf = (1 + 2) * s.lit_bufsize;
s.level = level;
s.strategy = strategy;
s.method = method;
return deflateReset(strm);
}
function deflateInit(strm, level) {
return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
}
function deflate(strm, flush) {
var old_flush, s;
var beg, val; // for gzip header write only
if (!strm || !strm.state ||
flush > Z_BLOCK || flush < 0) {
return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
}
s = strm.state;
if (!strm.output ||
(!strm.input && strm.avail_in !== 0) ||
(s.status === FINISH_STATE && flush !== Z_FINISH)) {
return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
}
s.strm = strm; /* just in case */
old_flush = s.last_flush;
s.last_flush = flush;
/* Write the header */
if (s.status === INIT_STATE) {
if (s.wrap === 2) { // GZIP header
strm.adler = 0; //crc32(0L, Z_NULL, 0);
put_byte(s, 31);
put_byte(s, 139);
put_byte(s, 8);
if (!s.gzhead) { // s->gzhead == Z_NULL
put_byte(s, 0);
put_byte(s, 0);
put_byte(s, 0);
put_byte(s, 0);
put_byte(s, 0);
put_byte(s, s.level === 9 ? 2 :
(s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
4 : 0));
put_byte(s, OS_CODE);
s.status = BUSY_STATE;
}
else {
put_byte(s, (s.gzhead.text ? 1 : 0) +
(s.gzhead.hcrc ? 2 : 0) +
(!s.gzhead.extra ? 0 : 4) +
(!s.gzhead.name ? 0 : 8) +
(!s.gzhead.comment ? 0 : 16)
);
put_byte(s, s.gzhead.time & 0xff);
put_byte(s, (s.gzhead.time >> 8) & 0xff);
put_byte(s, (s.gzhead.time >> 16) & 0xff);
put_byte(s, (s.gzhead.time >> 24) & 0xff);
put_byte(s, s.level === 9 ? 2 :
(s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
4 : 0));
put_byte(s, s.gzhead.os & 0xff);
if (s.gzhead.extra && s.gzhead.extra.length) {
put_byte(s, s.gzhead.extra.length & 0xff);
put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
}
if (s.gzhead.hcrc) {
strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);
}
s.gzindex = 0;
s.status = EXTRA_STATE;
}
}
else // DEFLATE header
{
var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
var level_flags = -1;
if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
level_flags = 0;
} else if (s.level < 6) {
level_flags = 1;
} else if (s.level === 6) {
level_flags = 2;
} else {
level_flags = 3;
}
header |= (level_flags << 6);
if (s.strstart !== 0) { header |= PRESET_DICT; }
header += 31 - (header % 31);
s.status = BUSY_STATE;
putShortMSB(s, header);
/* Save the adler32 of the preset dictionary: */
if (s.strstart !== 0) {
putShortMSB(s, strm.adler >>> 16);
putShortMSB(s, strm.adler & 0xffff);
}
strm.adler = 1; // adler32(0L, Z_NULL, 0);
}
}
//#ifdef GZIP
if (s.status === EXTRA_STATE) {
if (s.gzhead.extra/* != Z_NULL*/) {
beg = s.pending; /* start of bytes to update crc */
while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
if (s.pending === s.pending_buf_size) {
if (s.gzhead.hcrc && s.pending > beg) {
strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);
}
flush_pending(strm);
beg = s.pending;
if (s.pending === s.pending_buf_size) {
break;
}
}
put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
s.gzindex++;
}
if (s.gzhead.hcrc && s.pending > beg) {
strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);
}
if (s.gzindex === s.gzhead.extra.length) {
s.gzindex = 0;
s.status = NAME_STATE;
}
}
else {
s.status = NAME_STATE;
}
}
if (s.status === NAME_STATE) {
if (s.gzhead.name/* != Z_NULL*/) {
beg = s.pending; /* start of bytes to update crc */
//int val;
do {
if (s.pending === s.pending_buf_size) {
if (s.gzhead.hcrc && s.pending > beg) {
strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);
}
flush_pending(strm);
beg = s.pending;
if (s.pending === s.pending_buf_size) {
val = 1;
break;
}
}
// JS specific: little magic to add zero terminator to end of string
if (s.gzindex < s.gzhead.name.length) {
val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
} else {
val = 0;
}
put_byte(s, val);
} while (val !== 0);
if (s.gzhead.hcrc && s.pending > beg) {
strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);
}
if (val === 0) {
s.gzindex = 0;
s.status = COMMENT_STATE;
}
}
else {
s.status = COMMENT_STATE;
}
}
if (s.status === COMMENT_STATE) {
if (s.gzhead.comment/* != Z_NULL*/) {
beg = s.pending; /* start of bytes to update crc */
//int val;
do {
if (s.pending === s.pending_buf_size) {
if (s.gzhead.hcrc && s.pending > beg) {
strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);
}
flush_pending(strm);
beg = s.pending;
if (s.pending === s.pending_buf_size) {
val = 1;
break;
}
}
// JS specific: little magic to add zero terminator to end of string
if (s.gzindex < s.gzhead.comment.length) {
val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
} else {
val = 0;
}
put_byte(s, val);
} while (val !== 0);
if (s.gzhead.hcrc && s.pending > beg) {
strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);
}
if (val === 0) {
s.status = HCRC_STATE;
}
}
else {
s.status = HCRC_STATE;
}
}
if (s.status === HCRC_STATE) {
if (s.gzhead.hcrc) {
if (s.pending + 2 > s.pending_buf_size) {
flush_pending(strm);
}
if (s.pending + 2 <= s.pending_buf_size) {
put_byte(s, strm.adler & 0xff);
put_byte(s, (strm.adler >> 8) & 0xff);
strm.adler = 0; //crc32(0L, Z_NULL, 0);
s.status = BUSY_STATE;
}
}
else {
s.status = BUSY_STATE;
}
}
//#endif
/* Flush as much pending output as possible */
if (s.pending !== 0) {
flush_pending(strm);
if (strm.avail_out === 0) {
/* Since avail_out is 0, deflate will be called again with
* more output space, but possibly with both pending and
* avail_in equal to zero. There won't be anything to do,
* but this is not an error situation so make sure we
* return OK instead of BUF_ERROR at next call of deflate:
*/
s.last_flush = -1;
return Z_OK;
}
/* Make sure there is something to do and avoid duplicate consecutive
* flushes. For repeated and useless calls with Z_FINISH, we keep
* returning Z_STREAM_END instead of Z_BUF_ERROR.
*/
} else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
flush !== Z_FINISH) {
return err(strm, Z_BUF_ERROR);
}
/* User must not provide more input after the first FINISH: */
if (s.status === FINISH_STATE && strm.avail_in !== 0) {
return err(strm, Z_BUF_ERROR);
}
/* Start a new block or continue the current one.
*/
if (strm.avail_in !== 0 || s.lookahead !== 0 ||
(flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
(s.strategy === Z_RLE ? deflate_rle(s, flush) :
configuration_table[s.level].func(s, flush));
if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
s.status = FINISH_STATE;
}
if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
if (strm.avail_out === 0) {
s.last_flush = -1;
/* avoid BUF_ERROR next call, see above */
}
return Z_OK;
/* If flush != Z_NO_FLUSH && avail_out == 0, the next call
* of deflate should use the same flush parameter to make sure
* that the flush is complete. So we don't have to output an
* empty block here, this will be done at next call. This also
* ensures that for a very small output buffer, we emit at most
* one empty block.
*/
}
if (bstate === BS_BLOCK_DONE) {
if (flush === Z_PARTIAL_FLUSH) {
trees._tr_align(s);
}
else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
trees._tr_stored_block(s, 0, 0, false);
/* For a full flush, this empty block will be recognized
* as a special marker by inflate_sync().
*/
if (flush === Z_FULL_FLUSH) {
/*** CLEAR_HASH(s); ***/ /* forget history */
zero$1(s.head); // Fill with NIL (= 0);
if (s.lookahead === 0) {
s.strstart = 0;
s.block_start = 0;
s.insert = 0;
}
}
}
flush_pending(strm);
if (strm.avail_out === 0) {
s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
return Z_OK;
}
}
}
//Assert(strm->avail_out > 0, "bug2");
//if (strm.avail_out <= 0) { throw new Error("bug2");}
if (flush !== Z_FINISH) { return Z_OK; }
if (s.wrap <= 0) { return Z_STREAM_END; }
/* Write the trailer */
if (s.wrap === 2) {
put_byte(s, strm.adler & 0xff);
put_byte(s, (strm.adler >> 8) & 0xff);
put_byte(s, (strm.adler >> 16) & 0xff);
put_byte(s, (strm.adler >> 24) & 0xff);
put_byte(s, strm.total_in & 0xff);
put_byte(s, (strm.total_in >> 8) & 0xff);
put_byte(s, (strm.total_in >> 16) & 0xff);
put_byte(s, (strm.total_in >> 24) & 0xff);
}
else
{
putShortMSB(s, strm.adler >>> 16);
putShortMSB(s, strm.adler & 0xffff);
}
flush_pending(strm);
/* If avail_out is zero, the application will call deflate again
* to flush the rest.
*/
if (s.wrap > 0) { s.wrap = -s.wrap; }
/* write the trailer only once! */
return s.pending !== 0 ? Z_OK : Z_STREAM_END;
}
function deflateEnd(strm) {
var status;
if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
return Z_STREAM_ERROR;
}
status = strm.state.status;
if (status !== INIT_STATE &&
status !== EXTRA_STATE &&
status !== NAME_STATE &&
status !== COMMENT_STATE &&
status !== HCRC_STATE &&
status !== BUSY_STATE &&
status !== FINISH_STATE
) {
return err(strm, Z_STREAM_ERROR);
}
strm.state = null;
return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
}
/* =========================================================================
* Initializes the compression dictionary from the given byte
* sequence without producing any compressed output.
*/
function deflateSetDictionary(strm, dictionary) {
var dictLength = dictionary.length;
var s;
var str, n;
var wrap;
var avail;
var next;
var input;
var tmpDict;
if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
return Z_STREAM_ERROR;
}
s = strm.state;
wrap = s.wrap;
if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {
return Z_STREAM_ERROR;
}
/* when using zlib wrappers, compute Adler-32 for provided dictionary */
if (wrap === 1) {
/* adler32(strm->adler, dictionary, dictLength); */
strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);
}
s.wrap = 0; /* avoid computing Adler-32 in read_buf */
/* if dictionary would fill window, just replace the history */
if (dictLength >= s.w_size) {
if (wrap === 0) { /* already empty otherwise */
/*** CLEAR_HASH(s); ***/
zero$1(s.head); // Fill with NIL (= 0);
s.strstart = 0;
s.block_start = 0;
s.insert = 0;
}
/* use the tail */
// dictionary = dictionary.slice(dictLength - s.w_size);
tmpDict = new common.Buf8(s.w_size);
common.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);
dictionary = tmpDict;
dictLength = s.w_size;
}
/* insert dictionary into window and hash */
avail = strm.avail_in;
next = strm.next_in;
input = strm.input;
strm.avail_in = dictLength;
strm.next_in = 0;
strm.input = dictionary;
fill_window(s);
while (s.lookahead >= MIN_MATCH$1) {
str = s.strstart;
n = s.lookahead - (MIN_MATCH$1 - 1);
do {
/* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH$1 - 1]) & s.hash_mask;
s.prev[str & s.w_mask] = s.head[s.ins_h];
s.head[s.ins_h] = str;
str++;
} while (--n);
s.strstart = str;
s.lookahead = MIN_MATCH$1 - 1;
fill_window(s);
}
s.strstart += s.lookahead;
s.block_start = s.strstart;
s.insert = s.lookahead;
s.lookahead = 0;
s.match_length = s.prev_length = MIN_MATCH$1 - 1;
s.match_available = 0;
strm.next_in = next;
strm.input = input;
strm.avail_in = avail;
s.wrap = wrap;
return Z_OK;
}
var deflateInit_1 = deflateInit;
var deflateInit2_1 = deflateInit2;
var deflateReset_1 = deflateReset;
var deflateResetKeep_1 = deflateResetKeep;
var deflateSetHeader_1 = deflateSetHeader;
var deflate_2 = deflate;
var deflateEnd_1 = deflateEnd;
var deflateSetDictionary_1 = deflateSetDictionary;
var deflateInfo = 'pako deflate (from Nodeca project)';
/* Not implemented
exports.deflateBound = deflateBound;
exports.deflateCopy = deflateCopy;
exports.deflateParams = deflateParams;
exports.deflatePending = deflatePending;
exports.deflatePrime = deflatePrime;
exports.deflateTune = deflateTune;
*/
var deflate_1 = {
deflateInit: deflateInit_1,
deflateInit2: deflateInit2_1,
deflateReset: deflateReset_1,
deflateResetKeep: deflateResetKeep_1,
deflateSetHeader: deflateSetHeader_1,
deflate: deflate_2,
deflateEnd: deflateEnd_1,
deflateSetDictionary: deflateSetDictionary_1,
deflateInfo: deflateInfo
};
// String encode/decode helpers
'use strict';
// Quick check if we can use fast array to bin string conversion
//
// - apply(Array) can fail on Android 2.2
// - apply(Uint8Array) can fail on iOS 5.1 Safari
//
var STR_APPLY_OK = true;
var STR_APPLY_UIA_OK = true;
try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }
try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }
// Table with utf8 lengths (calculated by first byte of sequence)
// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
// because max possible codepoint is 0x10ffff
var _utf8len = new common.Buf8(256);
for (var q = 0; q < 256; q++) {
_utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
}
_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start
// convert string to array (typed, when possible)
var string2buf = function (str) {
var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
// count binary size
for (m_pos = 0; m_pos < str_len; m_pos++) {
c = str.charCodeAt(m_pos);
if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
c2 = str.charCodeAt(m_pos + 1);
if ((c2 & 0xfc00) === 0xdc00) {
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
m_pos++;
}
}
buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
}
// allocate buffer
buf = new common.Buf8(buf_len);
// convert
for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
c = str.charCodeAt(m_pos);
if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
c2 = str.charCodeAt(m_pos + 1);
if ((c2 & 0xfc00) === 0xdc00) {
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
m_pos++;
}
}
if (c < 0x80) {
/* one byte */
buf[i++] = c;
} else if (c < 0x800) {
/* two bytes */
buf[i++] = 0xC0 | (c >>> 6);
buf[i++] = 0x80 | (c & 0x3f);
} else if (c < 0x10000) {
/* three bytes */
buf[i++] = 0xE0 | (c >>> 12);
buf[i++] = 0x80 | (c >>> 6 & 0x3f);
buf[i++] = 0x80 | (c & 0x3f);
} else {
/* four bytes */
buf[i++] = 0xf0 | (c >>> 18);
buf[i++] = 0x80 | (c >>> 12 & 0x3f);
buf[i++] = 0x80 | (c >>> 6 & 0x3f);
buf[i++] = 0x80 | (c & 0x3f);
}
}
return buf;
};
// Helper (used in 2 places)
function buf2binstring(buf, len) {
// On Chrome, the arguments in a function call that are allowed is `65534`.
// If the length of the buffer is smaller than that, we can use this optimization,
// otherwise we will take a slower path.
if (len < 65534) {
if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
return String.fromCharCode.apply(null, common.shrinkBuf(buf, len));
}
}
var result = '';
for (var i = 0; i < len; i++) {
result += String.fromCharCode(buf[i]);
}
return result;
}
// Convert byte array to binary string
var buf2binstring_1 = function (buf) {
return buf2binstring(buf, buf.length);
};
// Convert binary string (typed, when possible)
var binstring2buf = function (str) {
var buf = new common.Buf8(str.length);
for (var i = 0, len = buf.length; i < len; i++) {
buf[i] = str.charCodeAt(i);
}
return buf;
};
// convert array to string
var buf2string = function (buf, max) {
var i, out, c, c_len;
var len = max || buf.length;
// Reserve max possible length (2 words per char)
// NB: by unknown reasons, Array is significantly faster for
// String.fromCharCode.apply than Uint16Array.
var utf16buf = new Array(len * 2);
for (out = 0, i = 0; i < len;) {
c = buf[i++];
// quick process ascii
if (c < 0x80) { utf16buf[out++] = c; continue; }
c_len = _utf8len[c];
// skip 5 & 6 byte codes
if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }
// apply mask on first byte
c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
// join the rest
while (c_len > 1 && i < len) {
c = (c << 6) | (buf[i++] & 0x3f);
c_len--;
}
// terminated by end of string?
if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
if (c < 0x10000) {
utf16buf[out++] = c;
} else {
c -= 0x10000;
utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
utf16buf[out++] = 0xdc00 | (c & 0x3ff);
}
}
return buf2binstring(utf16buf, out);
};
// Calculate max possible position in utf8 buffer,
// that will not break sequence. If that's not possible
// - (very small limits) return max size as is.
//
// buf[] - utf8 bytes array
// max - length limit (mandatory);
var utf8border = function (buf, max) {
var pos;
max = max || buf.length;
if (max > buf.length) { max = buf.length; }
// go back from last position, until start of sequence found
pos = max - 1;
while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
// Very small and broken sequence,
// return max, because we should return something anyway.
if (pos < 0) { return max; }
// If we came to start of buffer - that means buffer is too small,
// return max too.
if (pos === 0) { return max; }
return (pos + _utf8len[buf[pos]] > max) ? pos : max;
};
var strings = {
string2buf: string2buf,
buf2binstring: buf2binstring_1,
binstring2buf: binstring2buf,
buf2string: buf2string,
utf8border: utf8border
};
'use strict';
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
function ZStream() {
/* next input byte */
this.input = null; // JS specific, because we have no pointers
this.next_in = 0;
/* number of bytes available at input */
this.avail_in = 0;
/* total number of input bytes read so far */
this.total_in = 0;
/* next output byte should be put there */
this.output = null; // JS specific, because we have no pointers
this.next_out = 0;
/* remaining free space at output */
this.avail_out = 0;
/* total number of bytes output so far */
this.total_out = 0;
/* last error message, NULL if no error */
this.msg = ''/*Z_NULL*/;
/* not visible by applications */
this.state = null;
/* best guess about the data type: binary or text */
this.data_type = 2/*Z_UNKNOWN*/;
/* adler32 value of the uncompressed data */
this.adler = 0;
}
var zstream = ZStream;
'use strict';
var toString$4 = Object.prototype.toString;
/* Public constants ==========================================================*/
/* ===========================================================================*/
var Z_NO_FLUSH$1 = 0;
var Z_FINISH$1 = 4;
var Z_OK$1 = 0;
var Z_STREAM_END$1 = 1;
var Z_SYNC_FLUSH = 2;
var Z_DEFAULT_COMPRESSION$1 = -1;
var Z_DEFAULT_STRATEGY$1 = 0;
var Z_DEFLATED$1 = 8;
/* ===========================================================================*/
/**
* class Deflate
*
* Generic JS-style wrapper for zlib calls. If you don't need
* streaming behaviour - use more simple functions: [[deflate]],
* [[deflateRaw]] and [[gzip]].
**/
/* internal
* Deflate.chunks -> Array
*
* Chunks of output data, if [[Deflate#onData]] not overridden.
**/
/**
* Deflate.result -> Uint8Array|Array
*
* Compressed result, generated by default [[Deflate#onData]]
* and [[Deflate#onEnd]] handlers. Filled after you push last chunk
* (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you
* push a chunk with explicit flush (call [[Deflate#push]] with
* `Z_SYNC_FLUSH` param).
**/
/**
* Deflate.err -> Number
*
* Error code after deflate finished. 0 (Z_OK) on success.
* You will not need it in real life, because deflate errors
* are possible only on wrong options or bad `onData` / `onEnd`
* custom handlers.
**/
/**
* Deflate.msg -> String
*
* Error message, if [[Deflate.err]] != 0
**/
/**
* new Deflate(options)
* - options (Object): zlib deflate options.
*
* Creates new deflator instance with specified params. Throws exception
* on bad params. Supported options:
*
* - `level`
* - `windowBits`
* - `memLevel`
* - `strategy`
* - `dictionary`
*
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
* for more information on these.
*
* Additional options, for internal needs:
*
* - `chunkSize` - size of generated data chunks (16K by default)
* - `raw` (Boolean) - do raw deflate
* - `gzip` (Boolean) - create gzip wrapper
* - `to` (String) - if equal to 'string', then result will be "binary string"
* (each char code [0..255])
* - `header` (Object) - custom header for gzip
* - `text` (Boolean) - true if compressed data believed to be text
* - `time` (Number) - modification time, unix timestamp
* - `os` (Number) - operation system code
* - `extra` (Array) - array of bytes with extra data (max 65536)
* - `name` (String) - file name (binary string)
* - `comment` (String) - comment (binary string)
* - `hcrc` (Boolean) - true if header crc should be added
*
* ##### Example:
*
* ```javascript
* var pako = require('pako')
* , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
* , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
*
* var deflate = new pako.Deflate({ level: 3});
*
* deflate.push(chunk1, false);
* deflate.push(chunk2, true); // true -> last chunk
*
* if (deflate.err) { throw new Error(deflate.err); }
*
* console.log(deflate.result);
* ```
**/
function Deflate(options) {
if (!(this instanceof Deflate)) return new Deflate(options);
this.options = common.assign({
level: Z_DEFAULT_COMPRESSION$1,
method: Z_DEFLATED$1,
chunkSize: 16384,
windowBits: 15,
memLevel: 8,
strategy: Z_DEFAULT_STRATEGY$1,
to: ''
}, options || {});
var opt = this.options;
if (opt.raw && (opt.windowBits > 0)) {
opt.windowBits = -opt.windowBits;
}
else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
opt.windowBits += 16;
}
this.err = 0; // error code, if happens (0 = Z_OK)
this.msg = ''; // error message
this.ended = false; // used to avoid multiple onEnd() calls
this.chunks = []; // chunks of compressed data
this.strm = new zstream();
this.strm.avail_out = 0;
var status = deflate_1.deflateInit2(
this.strm,
opt.level,
opt.method,
opt.windowBits,
opt.memLevel,
opt.strategy
);
if (status !== Z_OK$1) {
throw new Error(messages[status]);
}
if (opt.header) {
deflate_1.deflateSetHeader(this.strm, opt.header);
}
if (opt.dictionary) {
var dict;
// Convert data if needed
if (typeof opt.dictionary === 'string') {
// If we need to compress text, change encoding to utf8.
dict = strings.string2buf(opt.dictionary);
} else if (toString$4.call(opt.dictionary) === '[object ArrayBuffer]') {
dict = new Uint8Array(opt.dictionary);
} else {
dict = opt.dictionary;
}
status = deflate_1.deflateSetDictionary(this.strm, dict);
if (status !== Z_OK$1) {
throw new Error(messages[status]);
}
this._dict_set = true;
}
}
/**
* Deflate#push(data[, mode]) -> Boolean
* - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be
* converted to utf8 byte sequence.
* - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
* See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
*
* Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
* new compressed chunks. Returns `true` on success. The last data block must have
* mode Z_FINISH (or `true`). That will flush internal pending buffers and call
* [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you
* can use mode Z_SYNC_FLUSH, keeping the compression context.
*
* On fail call [[Deflate#onEnd]] with error code and return false.
*
* We strongly recommend to use `Uint8Array` on input for best speed (output
* array format is detected automatically). Also, don't skip last param and always
* use the same type in your code (boolean or number). That will improve JS speed.
*
* For regular `Array`-s make sure all elements are [0..255].
*
* ##### Example
*
* ```javascript
* push(chunk, false); // push one of data chunks
* ...
* push(chunk, true); // push last chunk
* ```
**/
Deflate.prototype.push = function (data, mode) {
var strm = this.strm;
var chunkSize = this.options.chunkSize;
var status, _mode;
if (this.ended) { return false; }
_mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH$1 : Z_NO_FLUSH$1);
// Convert data if needed
if (typeof data === 'string') {
// If we need to compress text, change encoding to utf8.
strm.input = strings.string2buf(data);
} else if (toString$4.call(data) === '[object ArrayBuffer]') {
strm.input = new Uint8Array(data);
} else {
strm.input = data;
}
strm.next_in = 0;
strm.avail_in = strm.input.length;
do {
if (strm.avail_out === 0) {
strm.output = new common.Buf8(chunkSize);
strm.next_out = 0;
strm.avail_out = chunkSize;
}
status = deflate_1.deflate(strm, _mode); /* no bad return value */
if (status !== Z_STREAM_END$1 && status !== Z_OK$1) {
this.onEnd(status);
this.ended = true;
return false;
}
if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH$1 || _mode === Z_SYNC_FLUSH))) {
if (this.options.to === 'string') {
this.onData(strings.buf2binstring(common.shrinkBuf(strm.output, strm.next_out)));
} else {
this.onData(common.shrinkBuf(strm.output, strm.next_out));
}
}
} while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END$1);
// Finalize on the last chunk.
if (_mode === Z_FINISH$1) {
status = deflate_1.deflateEnd(this.strm);
this.onEnd(status);
this.ended = true;
return status === Z_OK$1;
}
// callback interim results if Z_SYNC_FLUSH.
if (_mode === Z_SYNC_FLUSH) {
this.onEnd(Z_OK$1);
strm.avail_out = 0;
return true;
}
return true;
};
/**
* Deflate#onData(chunk) -> Void
* - chunk (Uint8Array|Array|String): output data. Type of array depends
* on js engine support. When string output requested, each chunk
* will be string.
*
* By default, stores data blocks in `chunks[]` property and glue
* those in `onEnd`. Override this handler, if you need another behaviour.
**/
Deflate.prototype.onData = function (chunk) {
this.chunks.push(chunk);
};
/**
* Deflate#onEnd(status) -> Void
* - status (Number): deflate status. 0 (Z_OK) on success,
* other if not.
*
* Called once after you tell deflate that the input stream is
* complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
* or if an error happened. By default - join collected chunks,
* free memory and fill `results` / `err` properties.
**/
Deflate.prototype.onEnd = function (status) {
// On success - join
if (status === Z_OK$1) {
if (this.options.to === 'string') {
this.result = this.chunks.join('');
} else {
this.result = common.flattenChunks(this.chunks);
}
}
this.chunks = [];
this.err = status;
this.msg = this.strm.msg;
};
/**
* deflate(data[, options]) -> Uint8Array|Array|String
* - data (Uint8Array|Array|String): input data to compress.
* - options (Object): zlib deflate options.
*
* Compress `data` with deflate algorithm and `options`.
*
* Supported options are:
*
* - level
* - windowBits
* - memLevel
* - strategy
* - dictionary
*
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
* for more information on these.
*
* Sugar (options):
*
* - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
* negative windowBits implicitly.
* - `to` (String) - if equal to 'string', then result will be "binary string"
* (each char code [0..255])
*
* ##### Example:
*
* ```javascript
* var pako = require('pako')
* , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
*
* console.log(pako.deflate(data));
* ```
**/
function deflate$1(input, options) {
var deflator = new Deflate(options);
deflator.push(input, true);
// That will never happens, if you don't cheat with options :)
if (deflator.err) { throw deflator.msg || messages[deflator.err]; }
return deflator.result;
}
/**
* deflateRaw(data[, options]) -> Uint8Array|Array|String
* - data (Uint8Array|Array|String): input data to compress.
* - options (Object): zlib deflate options.
*
* The same as [[deflate]], but creates raw data, without wrapper
* (header and adler32 crc).
**/
function deflateRaw(input, options) {
options = options || {};
options.raw = true;
return deflate$1(input, options);
}
/**
* gzip(data[, options]) -> Uint8Array|Array|String
* - data (Uint8Array|Array|String): input data to compress.
* - options (Object): zlib deflate options.
*
* The same as [[deflate]], but create gzip wrapper instead of
* deflate one.
**/
function gzip(input, options) {
options = options || {};
options.gzip = true;
return deflate$1(input, options);
}
var Deflate_1 = Deflate;
var deflate_2$1 = deflate$1;
var deflateRaw_1 = deflateRaw;
var gzip_1 = gzip;
var deflate_1$1 = {
Deflate: Deflate_1,
deflate: deflate_2$1,
deflateRaw: deflateRaw_1,
gzip: gzip_1
};
'use strict';
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
// See state defs from inflate.js
var BAD = 30; /* got a data error -- remain here until reset */
var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
/*
Decode literal, length, and distance codes and write out the resulting
literal and match bytes until either not enough input or output is
available, an end-of-block is encountered, or a data error is encountered.
When large enough input and output buffers are supplied to inflate(), for
example, a 16K input buffer and a 64K output buffer, more than 95% of the
inflate execution time is spent in this routine.
Entry assumptions:
state.mode === LEN
strm.avail_in >= 6
strm.avail_out >= 258
start >= strm.avail_out
state.bits < 8
On return, state.mode is one of:
LEN -- ran out of enough output space or enough available input
TYPE -- reached end of block code, inflate() to interpret next block
BAD -- error in block data
Notes:
- The maximum input bits used by a length/distance pair is 15 bits for the
length code, 5 bits for the length extra, 15 bits for the distance code,
and 13 bits for the distance extra. This totals 48 bits, or six bytes.
Therefore if strm.avail_in >= 6, then there is enough input to avoid
checking for available input while decoding.
- The maximum bytes that a single length/distance pair can output is 258
bytes, which is the maximum length that can be coded. inflate_fast()
requires strm.avail_out >= 258 for each loop to avoid checking for
output space.
*/
var inffast = function inflate_fast(strm, start) {
var state;
var _in; /* local strm.input */
var last; /* have enough input while in < last */
var _out; /* local strm.output */
var beg; /* inflate()'s initial strm.output */
var end; /* while out < end, enough space available */
//#ifdef INFLATE_STRICT
var dmax; /* maximum distance from zlib header */
//#endif
var wsize; /* window size or zero if not using window */
var whave; /* valid bytes in the window */
var wnext; /* window write index */
// Use `s_window` instead `window`, avoid conflict with instrumentation tools
var s_window; /* allocated sliding window, if wsize != 0 */
var hold; /* local strm.hold */
var bits; /* local strm.bits */
var lcode; /* local strm.lencode */
var dcode; /* local strm.distcode */
var lmask; /* mask for first level of length codes */
var dmask; /* mask for first level of distance codes */
var here; /* retrieved table entry */
var op; /* code bits, operation, extra bits, or */
/* window position, window bytes to copy */
var len; /* match length, unused bytes */
var dist; /* match distance */
var from; /* where to copy match from */
var from_source;
var input, output; // JS specific, because we have no pointers
/* copy state to local variables */
state = strm.state;
//here = state.here;
_in = strm.next_in;
input = strm.input;
last = _in + (strm.avail_in - 5);
_out = strm.next_out;
output = strm.output;
beg = _out - (start - strm.avail_out);
end = _out + (strm.avail_out - 257);
//#ifdef INFLATE_STRICT
dmax = state.dmax;
//#endif
wsize = state.wsize;
whave = state.whave;
wnext = state.wnext;
s_window = state.window;
hold = state.hold;
bits = state.bits;
lcode = state.lencode;
dcode = state.distcode;
lmask = (1 << state.lenbits) - 1;
dmask = (1 << state.distbits) - 1;
/* decode literals and length/distances until end-of-block or not enough
input data or output space */
top:
do {
if (bits < 15) {
hold += input[_in++] << bits;
bits += 8;
hold += input[_in++] << bits;
bits += 8;
}
here = lcode[hold & lmask];
dolen:
for (;;) { // Goto emulation
op = here >>> 24/*here.bits*/;
hold >>>= op;
bits -= op;
op = (here >>> 16) & 0xff/*here.op*/;
if (op === 0) { /* literal */
//Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
// "inflate: literal '%c'\n" :
// "inflate: literal 0x%02x\n", here.val));
output[_out++] = here & 0xffff/*here.val*/;
}
else if (op & 16) { /* length base */
len = here & 0xffff/*here.val*/;
op &= 15; /* number of extra bits */
if (op) {
if (bits < op) {
hold += input[_in++] << bits;
bits += 8;
}
len += hold & ((1 << op) - 1);
hold >>>= op;
bits -= op;
}
//Tracevv((stderr, "inflate: length %u\n", len));
if (bits < 15) {
hold += input[_in++] << bits;
bits += 8;
hold += input[_in++] << bits;
bits += 8;
}
here = dcode[hold & dmask];
dodist:
for (;;) { // goto emulation
op = here >>> 24/*here.bits*/;
hold >>>= op;
bits -= op;
op = (here >>> 16) & 0xff/*here.op*/;
if (op & 16) { /* distance base */
dist = here & 0xffff/*here.val*/;
op &= 15; /* number of extra bits */
if (bits < op) {
hold += input[_in++] << bits;
bits += 8;
if (bits < op) {
hold += input[_in++] << bits;
bits += 8;
}
}
dist += hold & ((1 << op) - 1);
//#ifdef INFLATE_STRICT
if (dist > dmax) {
strm.msg = 'invalid distance too far back';
state.mode = BAD;
break top;
}
//#endif
hold >>>= op;
bits -= op;
//Tracevv((stderr, "inflate: distance %u\n", dist));
op = _out - beg; /* max distance in output */
if (dist > op) { /* see if copy from window */
op = dist - op; /* distance back in window */
if (op > whave) {
if (state.sane) {
strm.msg = 'invalid distance too far back';
state.mode = BAD;
break top;
}
// (!) This block is disabled in zlib defaults,
// don't enable it for binary compatibility
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
// if (len <= op - whave) {
// do {
// output[_out++] = 0;
// } while (--len);
// continue top;
// }
// len -= op - whave;
// do {
// output[_out++] = 0;
// } while (--op > whave);
// if (op === 0) {
// from = _out - dist;
// do {
// output[_out++] = output[from++];
// } while (--len);
// continue top;
// }
//#endif
}
from = 0; // window index
from_source = s_window;
if (wnext === 0) { /* very common case */
from += wsize - op;
if (op < len) { /* some from window */
len -= op;
do {
output[_out++] = s_window[from++];
} while (--op);
from = _out - dist; /* rest from output */
from_source = output;
}
}
else if (wnext < op) { /* wrap around window */
from += wsize + wnext - op;
op -= wnext;
if (op < len) { /* some from end of window */
len -= op;
do {
output[_out++] = s_window[from++];
} while (--op);
from = 0;
if (wnext < len) { /* some from start of window */
op = wnext;
len -= op;
do {
output[_out++] = s_window[from++];
} while (--op);
from = _out - dist; /* rest from output */
from_source = output;
}
}
}
else { /* contiguous in window */
from += wnext - op;
if (op < len) { /* some from window */
len -= op;
do {
output[_out++] = s_window[from++];
} while (--op);
from = _out - dist; /* rest from output */
from_source = output;
}
}
while (len > 2) {
output[_out++] = from_source[from++];
output[_out++] = from_source[from++];
output[_out++] = from_source[from++];
len -= 3;
}
if (len) {
output[_out++] = from_source[from++];
if (len > 1) {
output[_out++] = from_source[from++];
}
}
}
else {
from = _out - dist; /* copy direct from output */
do { /* minimum length is three */
output[_out++] = output[from++];
output[_out++] = output[from++];
output[_out++] = output[from++];
len -= 3;
} while (len > 2);
if (len) {
output[_out++] = output[from++];
if (len > 1) {
output[_out++] = output[from++];
}
}
}
}
else if ((op & 64) === 0) { /* 2nd level distance code */
here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
continue dodist;
}
else {
strm.msg = 'invalid distance code';
state.mode = BAD;
break top;
}
break; // need to emulate goto via "continue"
}
}
else if ((op & 64) === 0) { /* 2nd level length code */
here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
continue dolen;
}
else if (op & 32) { /* end-of-block */
//Tracevv((stderr, "inflate: end of block\n"));
state.mode = TYPE;
break top;
}
else {
strm.msg = 'invalid literal/length code';
state.mode = BAD;
break top;
}
break; // need to emulate goto via "continue"
}
} while (_in < last && _out < end);
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
len = bits >> 3;
_in -= len;
bits -= len << 3;
hold &= (1 << bits) - 1;
/* update state and return */
strm.next_in = _in;
strm.next_out = _out;
strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
state.hold = hold;
state.bits = bits;
return;
};
'use strict';
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
var MAXBITS = 15;
var ENOUGH_LENS = 852;
var ENOUGH_DISTS = 592;
//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
var CODES = 0;
var LENS = 1;
var DISTS = 2;
var lbase = [ /* Length codes 257..285 base */
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
];
var lext = [ /* Length codes 257..285 extra */
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
];
var dbase = [ /* Distance codes 0..29 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
8193, 12289, 16385, 24577, 0, 0
];
var dext = [ /* Distance codes 0..29 extra */
16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
28, 28, 29, 29, 64, 64
];
var inftrees = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
{
var bits = opts.bits;
//here = opts.here; /* table entry for duplication */
var len = 0; /* a code's length in bits */
var sym = 0; /* index of code symbols */
var min = 0, max = 0; /* minimum and maximum code lengths */
var root = 0; /* number of index bits for root table */
var curr = 0; /* number of index bits for current table */
var drop = 0; /* code bits to drop for sub-table */
var left = 0; /* number of prefix codes available */
var used = 0; /* code entries in table used */
var huff = 0; /* Huffman code */
var incr; /* for incrementing code, index */
var fill; /* index for replicating entries */
var low; /* low bits for current root entry */
var mask; /* mask for low root bits */
var next; /* next available space in table */
var base = null; /* base value table to use */
var base_index = 0;
// var shoextra; /* extra bits table to use */
var end; /* use base and extra for symbol > end */
var count = new common.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */
var offs = new common.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */
var extra = null;
var extra_index = 0;
var here_bits, here_op, here_val;
/*
Process a set of code lengths to create a canonical Huffman code. The
code lengths are lens[0..codes-1]. Each length corresponds to the
symbols 0..codes-1. The Huffman code is generated by first sorting the
symbols by length from short to long, and retaining the symbol order
for codes with equal lengths. Then the code starts with all zero bits
for the first code of the shortest length, and the codes are integer
increments for the same length, and zeros are appended as the length
increases. For the deflate format, these bits are stored backwards
from their more natural integer increment ordering, and so when the
decoding tables are built in the large loop below, the integer codes
are incremented backwards.
This routine assumes, but does not check, that all of the entries in
lens[] are in the range 0..MAXBITS. The caller must assure this.
1..MAXBITS is interpreted as that code length. zero means that that
symbol does not occur in this code.
The codes are sorted by computing a count of codes for each length,
creating from that a table of starting indices for each length in the
sorted table, and then entering the symbols in order in the sorted
table. The sorted table is work[], with that space being provided by
the caller.
The length counts are used for other purposes as well, i.e. finding
the minimum and maximum length codes, determining if there are any
codes at all, checking for a valid set of lengths, and looking ahead
at length counts to determine sub-table sizes when building the
decoding tables.
*/
/* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
for (len = 0; len <= MAXBITS; len++) {
count[len] = 0;
}
for (sym = 0; sym < codes; sym++) {
count[lens[lens_index + sym]]++;
}
/* bound code lengths, force root to be within code lengths */
root = bits;
for (max = MAXBITS; max >= 1; max--) {
if (count[max] !== 0) { break; }
}
if (root > max) {
root = max;
}
if (max === 0) { /* no symbols to code at all */
//table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */
//table.bits[opts.table_index] = 1; //here.bits = (var char)1;
//table.val[opts.table_index++] = 0; //here.val = (var short)0;
table[table_index++] = (1 << 24) | (64 << 16) | 0;
//table.op[opts.table_index] = 64;
//table.bits[opts.table_index] = 1;
//table.val[opts.table_index++] = 0;
table[table_index++] = (1 << 24) | (64 << 16) | 0;
opts.bits = 1;
return 0; /* no symbols, but wait for decoding to report error */
}
for (min = 1; min < max; min++) {
if (count[min] !== 0) { break; }
}
if (root < min) {
root = min;
}
/* check for an over-subscribed or incomplete set of lengths */
left = 1;
for (len = 1; len <= MAXBITS; len++) {
left <<= 1;
left -= count[len];
if (left < 0) {
return -1;
} /* over-subscribed */
}
if (left > 0 && (type === CODES || max !== 1)) {
return -1; /* incomplete set */
}
/* generate offsets into symbol table for each length for sorting */
offs[1] = 0;
for (len = 1; len < MAXBITS; len++) {
offs[len + 1] = offs[len] + count[len];
}
/* sort symbols by length, by symbol order within each length */
for (sym = 0; sym < codes; sym++) {
if (lens[lens_index + sym] !== 0) {
work[offs[lens[lens_index + sym]]++] = sym;
}
}
/*
Create and fill in decoding tables. In this loop, the table being
filled is at next and has curr index bits. The code being used is huff
with length len. That code is converted to an index by dropping drop
bits off of the bottom. For codes where len is less than drop + curr,
those top drop + curr - len bits are incremented through all values to
fill the table with replicated entries.
root is the number of index bits for the root table. When len exceeds
root, sub-tables are created pointed to by the root entry with an index
of the low root bits of huff. This is saved in low to check for when a
new sub-table should be started. drop is zero when the root table is
being filled, and drop is root when sub-tables are being filled.
When a new sub-table is needed, it is necessary to look ahead in the
code lengths to determine what size sub-table is needed. The length
counts are used for this, and so count[] is decremented as codes are
entered in the tables.
used keeps track of how many table entries have been allocated from the
provided *table space. It is checked for LENS and DIST tables against
the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
the initial root table size constants. See the comments in inftrees.h
for more information.
sym increments through all symbols, and the loop terminates when
all codes of length max, i.e. all codes, have been processed. This
routine permits incomplete codes, so another loop after this one fills
in the rest of the decoding tables with invalid code markers.
*/
/* set up for code type */
// poor man optimization - use if-else instead of switch,
// to avoid deopts in old v8
if (type === CODES) {
base = extra = work; /* dummy value--not used */
end = 19;
} else if (type === LENS) {
base = lbase;
base_index -= 257;
extra = lext;
extra_index -= 257;
end = 256;
} else { /* DISTS */
base = dbase;
extra = dext;
end = -1;
}
/* initialize opts for loop */
huff = 0; /* starting code */
sym = 0; /* starting code symbol */
len = min; /* starting code length */
next = table_index; /* current table to fill in */
curr = root; /* current table index bits */
drop = 0; /* current bits to drop from code for index */
low = -1; /* trigger new sub-table when len > root */
used = 1 << root; /* use root table entries */
mask = used - 1; /* mask for comparing low */
/* check available table space */
if ((type === LENS && used > ENOUGH_LENS) ||
(type === DISTS && used > ENOUGH_DISTS)) {
return 1;
}
/* process all codes and make table entries */
for (;;) {
/* create table entry */
here_bits = len - drop;
if (work[sym] < end) {
here_op = 0;
here_val = work[sym];
}
else if (work[sym] > end) {
here_op = extra[extra_index + work[sym]];
here_val = base[base_index + work[sym]];
}
else {
here_op = 32 + 64; /* end of block */
here_val = 0;
}
/* replicate for those indices with low len bits equal to huff */
incr = 1 << (len - drop);
fill = 1 << curr;
min = fill; /* save offset to next table */
do {
fill -= incr;
table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
} while (fill !== 0);
/* backwards increment the len-bit code huff */
incr = 1 << (len - 1);
while (huff & incr) {
incr >>= 1;
}
if (incr !== 0) {
huff &= incr - 1;
huff += incr;
} else {
huff = 0;
}
/* go to next symbol, update count, len */
sym++;
if (--count[len] === 0) {
if (len === max) { break; }
len = lens[lens_index + work[sym]];
}
/* create new sub-table if needed */
if (len > root && (huff & mask) !== low) {
/* if first time, transition to sub-tables */
if (drop === 0) {
drop = root;
}
/* increment past last table */
next += min; /* here min is 1 << curr */
/* determine length of next table */
curr = len - drop;
left = 1 << curr;
while (curr + drop < max) {
left -= count[curr + drop];
if (left <= 0) { break; }
curr++;
left <<= 1;
}
/* check for enough space */
used += 1 << curr;
if ((type === LENS && used > ENOUGH_LENS) ||
(type === DISTS && used > ENOUGH_DISTS)) {
return 1;
}
/* point entry in root table to sub-table */
low = huff & mask;
/*table.op[low] = curr;
table.bits[low] = root;
table.val[low] = next - opts.table_index;*/
table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
}
}
/* fill in remaining table entry if code is incomplete (guaranteed to have
at most one remaining entry, since if the code is incomplete, the
maximum code length that was allowed to get this far is one bit) */
if (huff !== 0) {
//table.op[next + huff] = 64; /* invalid code marker */
//table.bits[next + huff] = len - drop;
//table.val[next + huff] = 0;
table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
}
/* set return parameters */
//opts.table_index += used;
opts.bits = root;
return 0;
};
'use strict';
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
var CODES$1 = 0;
var LENS$1 = 1;
var DISTS$1 = 2;
/* Public constants ==========================================================*/
/* ===========================================================================*/
/* Allowed flush values; see deflate() and inflate() below for details */
//var Z_NO_FLUSH = 0;
//var Z_PARTIAL_FLUSH = 1;
//var Z_SYNC_FLUSH = 2;
//var Z_FULL_FLUSH = 3;
var Z_FINISH$2 = 4;
var Z_BLOCK$1 = 5;
var Z_TREES = 6;
/* Return codes for the compression/decompression functions. Negative values
* are errors, positive values are used for special but normal events.
*/
var Z_OK$2 = 0;
var Z_STREAM_END$2 = 1;
var Z_NEED_DICT = 2;
//var Z_ERRNO = -1;
var Z_STREAM_ERROR$1 = -2;
var Z_DATA_ERROR$1 = -3;
var Z_MEM_ERROR = -4;
var Z_BUF_ERROR$1 = -5;
//var Z_VERSION_ERROR = -6;
/* The deflate compression method */
var Z_DEFLATED$2 = 8;
/* STATES ====================================================================*/
/* ===========================================================================*/
var HEAD = 1; /* i: waiting for magic header */
var FLAGS = 2; /* i: waiting for method and flags (gzip) */
var TIME = 3; /* i: waiting for modification time (gzip) */
var OS = 4; /* i: waiting for extra flags and operating system (gzip) */
var EXLEN = 5; /* i: waiting for extra length (gzip) */
var EXTRA$1 = 6; /* i: waiting for extra bytes (gzip) */
var NAME = 7; /* i: waiting for end of file name (gzip) */
var COMMENT = 8; /* i: waiting for end of comment (gzip) */
var HCRC = 9; /* i: waiting for header crc (gzip) */
var DICTID = 10; /* i: waiting for dictionary check value */
var DICT = 11; /* waiting for inflateSetDictionary() call */
var TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */
var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */
var STORED = 14; /* i: waiting for stored size (length and complement) */
var COPY_ = 15; /* i/o: same as COPY below, but only first time in */
var COPY = 16; /* i/o: waiting for input or output to copy stored block */
var TABLE = 17; /* i: waiting for dynamic block table lengths */
var LENLENS = 18; /* i: waiting for code length code lengths */
var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */
var LEN_ = 20; /* i: same as LEN below, but only first time in */
var LEN = 21; /* i: waiting for length/lit/eob code */
var LENEXT = 22; /* i: waiting for length extra bits */
var DIST = 23; /* i: waiting for distance code */
var DISTEXT = 24; /* i: waiting for distance extra bits */
var MATCH = 25; /* o: waiting for output space to copy string */
var LIT = 26; /* o: waiting for output space to write literal */
var CHECK = 27; /* i: waiting for 32-bit check value */
var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */
var DONE = 29; /* finished check, done -- remain here until reset */
var BAD$1 = 30; /* got a data error -- remain here until reset */
var MEM = 31; /* got an inflate() memory error -- remain here until reset */
var SYNC = 32; /* looking for synchronization bytes to restart inflate() */
/* ===========================================================================*/
var ENOUGH_LENS$1 = 852;
var ENOUGH_DISTS$1 = 592;
//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
var MAX_WBITS$1 = 15;
/* 32K LZ77 window */
var DEF_WBITS = MAX_WBITS$1;
function zswap32(q) {
return (((q >>> 24) & 0xff) +
((q >>> 8) & 0xff00) +
((q & 0xff00) << 8) +
((q & 0xff) << 24));
}
function InflateState() {
this.mode = 0; /* current inflate mode */
this.last = false; /* true if processing last block */
this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
this.havedict = false; /* true if dictionary provided */
this.flags = 0; /* gzip header method and flags (0 if zlib) */
this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
this.check = 0; /* protected copy of check value */
this.total = 0; /* protected copy of output count */
// TODO: may be {}
this.head = null; /* where to save gzip header information */
/* sliding window */
this.wbits = 0; /* log base 2 of requested window size */
this.wsize = 0; /* window size or zero if not using window */
this.whave = 0; /* valid bytes in the window */
this.wnext = 0; /* window write index */
this.window = null; /* allocated sliding window, if needed */
/* bit accumulator */
this.hold = 0; /* input bit accumulator */
this.bits = 0; /* number of bits in "in" */
/* for string and stored block copying */
this.length = 0; /* literal or length of data to copy */
this.offset = 0; /* distance back to copy string from */
/* for table and code decoding */
this.extra = 0; /* extra bits needed */
/* fixed and dynamic code tables */
this.lencode = null; /* starting table for length/literal codes */
this.distcode = null; /* starting table for distance codes */
this.lenbits = 0; /* index bits for lencode */
this.distbits = 0; /* index bits for distcode */
/* dynamic table building */
this.ncode = 0; /* number of code length code lengths */
this.nlen = 0; /* number of length code lengths */
this.ndist = 0; /* number of distance code lengths */
this.have = 0; /* number of code lengths in lens[] */
this.next = null; /* next available space in codes[] */
this.lens = new common.Buf16(320); /* temporary storage for code lengths */
this.work = new common.Buf16(288); /* work area for code table building */
/*
because we don't have pointers in js, we use lencode and distcode directly
as buffers so we don't need codes
*/
//this.codes = new utils.Buf32(ENOUGH); /* space for code tables */
this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */
this.distdyn = null; /* dynamic table for distance codes (JS specific) */
this.sane = 0; /* if false, allow invalid distance too far */
this.back = 0; /* bits back of last unprocessed length/lit */
this.was = 0; /* initial length of match */
}
function inflateResetKeep(strm) {
var state;
if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }
state = strm.state;
strm.total_in = strm.total_out = state.total = 0;
strm.msg = ''; /*Z_NULL*/
if (state.wrap) { /* to support ill-conceived Java test suite */
strm.adler = state.wrap & 1;
}
state.mode = HEAD;
state.last = 0;
state.havedict = 0;
state.dmax = 32768;
state.head = null/*Z_NULL*/;
state.hold = 0;
state.bits = 0;
//state.lencode = state.distcode = state.next = state.codes;
state.lencode = state.lendyn = new common.Buf32(ENOUGH_LENS$1);
state.distcode = state.distdyn = new common.Buf32(ENOUGH_DISTS$1);
state.sane = 1;
state.back = -1;
//Tracev((stderr, "inflate: reset\n"));
return Z_OK$2;
}
function inflateReset(strm) {
var state;
if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }
state = strm.state;
state.wsize = 0;
state.whave = 0;
state.wnext = 0;
return inflateResetKeep(strm);
}
function inflateReset2(strm, windowBits) {
var wrap;
var state;
/* get the state */
if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }
state = strm.state;
/* extract wrap request from windowBits parameter */
if (windowBits < 0) {
wrap = 0;
windowBits = -windowBits;
}
else {
wrap = (windowBits >> 4) + 1;
if (windowBits < 48) {
windowBits &= 15;
}
}
/* set number of window bits, free window if different */
if (windowBits && (windowBits < 8 || windowBits > 15)) {
return Z_STREAM_ERROR$1;
}
if (state.window !== null && state.wbits !== windowBits) {
state.window = null;
}
/* update state and reset the rest of it */
state.wrap = wrap;
state.wbits = windowBits;
return inflateReset(strm);
}
function inflateInit2(strm, windowBits) {
var ret;
var state;
if (!strm) { return Z_STREAM_ERROR$1; }
//strm.msg = Z_NULL; /* in case we return an error */
state = new InflateState();
//if (state === Z_NULL) return Z_MEM_ERROR;
//Tracev((stderr, "inflate: allocated\n"));
strm.state = state;
state.window = null/*Z_NULL*/;
ret = inflateReset2(strm, windowBits);
if (ret !== Z_OK$2) {
strm.state = null/*Z_NULL*/;
}
return ret;
}
function inflateInit(strm) {
return inflateInit2(strm, DEF_WBITS);
}
/*
Return state with length and distance decoding tables and index sizes set to
fixed code decoding. Normally this returns fixed tables from inffixed.h.
If BUILDFIXED is defined, then instead this routine builds the tables the
first time it's called, and returns those tables the first time and
thereafter. This reduces the size of the code by about 2K bytes, in
exchange for a little execution time. However, BUILDFIXED should not be
used for threaded applications, since the rewriting of the tables and virgin
may not be thread-safe.
*/
var virgin = true;
var lenfix, distfix; // We have no pointers in JS, so keep tables separate
function fixedtables(state) {
/* build fixed huffman tables if first call (may not be thread safe) */
if (virgin) {
var sym;
lenfix = new common.Buf32(512);
distfix = new common.Buf32(32);
/* literal/length table */
sym = 0;
while (sym < 144) { state.lens[sym++] = 8; }
while (sym < 256) { state.lens[sym++] = 9; }
while (sym < 280) { state.lens[sym++] = 7; }
while (sym < 288) { state.lens[sym++] = 8; }
inftrees(LENS$1, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });
/* distance table */
sym = 0;
while (sym < 32) { state.lens[sym++] = 5; }
inftrees(DISTS$1, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });
/* do this just once */
virgin = false;
}
state.lencode = lenfix;
state.lenbits = 9;
state.distcode = distfix;
state.distbits = 5;
}
/*
Update the window with the last wsize (normally 32K) bytes written before
returning. If window does not exist yet, create it. This is only called
when a window is already in use, or when output has been written during this
inflate call, but the end of the deflate stream has not been reached yet.
It is also called to create a window for dictionary data when a dictionary
is loaded.
Providing output buffers larger than 32K to inflate() should provide a speed
advantage, since only the last 32K of output is copied to the sliding window
upon return from inflate(), and since all distances after the first 32K of
output will fall in the output data, making match copies simpler and faster.
The advantage may be dependent on the size of the processor's data caches.
*/
function updatewindow(strm, src, end, copy) {
var dist;
var state = strm.state;
/* if it hasn't been done already, allocate space for the window */
if (state.window === null) {
state.wsize = 1 << state.wbits;
state.wnext = 0;
state.whave = 0;
state.window = new common.Buf8(state.wsize);
}
/* copy state->wsize or less output bytes into the circular window */
if (copy >= state.wsize) {
common.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
state.wnext = 0;
state.whave = state.wsize;
}
else {
dist = state.wsize - state.wnext;
if (dist > copy) {
dist = copy;
}
//zmemcpy(state->window + state->wnext, end - copy, dist);
common.arraySet(state.window, src, end - copy, dist, state.wnext);
copy -= dist;
if (copy) {
//zmemcpy(state->window, end - copy, copy);
common.arraySet(state.window, src, end - copy, copy, 0);
state.wnext = copy;
state.whave = state.wsize;
}
else {
state.wnext += dist;
if (state.wnext === state.wsize) { state.wnext = 0; }
if (state.whave < state.wsize) { state.whave += dist; }
}
}
return 0;
}
function inflate(strm, flush) {
var state;
var input, output; // input/output buffers
var next; /* next input INDEX */
var put; /* next output INDEX */
var have, left; /* available input and output */
var hold; /* bit buffer */
var bits; /* bits in bit buffer */
var _in, _out; /* save starting available input and output */
var copy; /* number of stored or match bytes to copy */
var from; /* where to copy match bytes from */
var from_source;
var here = 0; /* current decoding table entry */
var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
//var last; /* parent table entry */
var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
var len; /* length to copy for repeats, bits to drop */
var ret; /* return code */
var hbuf = new common.Buf8(4); /* buffer for gzip header crc calculation */
var opts;
var n; // temporary var for NEED_BITS
var order = /* permutation of code lengths */
[ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
if (!strm || !strm.state || !strm.output ||
(!strm.input && strm.avail_in !== 0)) {
return Z_STREAM_ERROR$1;
}
state = strm.state;
if (state.mode === TYPE$1) { state.mode = TYPEDO; } /* skip check */
//--- LOAD() ---
put = strm.next_out;
output = strm.output;
left = strm.avail_out;
next = strm.next_in;
input = strm.input;
have = strm.avail_in;
hold = state.hold;
bits = state.bits;
//---
_in = have;
_out = left;
ret = Z_OK$2;
inf_leave: // goto emulation
for (;;) {
switch (state.mode) {
case HEAD:
if (state.wrap === 0) {
state.mode = TYPEDO;
break;
}
//=== NEEDBITS(16);
while (bits < 16) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */
state.check = 0/*crc32(0L, Z_NULL, 0)*/;
//=== CRC2(state.check, hold);
hbuf[0] = hold & 0xff;
hbuf[1] = (hold >>> 8) & 0xff;
state.check = crc32_1(state.check, hbuf, 2, 0);
//===//
//=== INITBITS();
hold = 0;
bits = 0;
//===//
state.mode = FLAGS;
break;
}
state.flags = 0; /* expect zlib header */
if (state.head) {
state.head.done = false;
}
if (!(state.wrap & 1) || /* check if zlib header allowed */
(((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
strm.msg = 'incorrect header check';
state.mode = BAD$1;
break;
}
if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED$2) {
strm.msg = 'unknown compression method';
state.mode = BAD$1;
break;
}
//--- DROPBITS(4) ---//
hold >>>= 4;
bits -= 4;
//---//
len = (hold & 0x0f)/*BITS(4)*/ + 8;
if (state.wbits === 0) {
state.wbits = len;
}
else if (len > state.wbits) {
strm.msg = 'invalid window size';
state.mode = BAD$1;
break;
}
state.dmax = 1 << len;
//Tracev((stderr, "inflate: zlib header ok\n"));
strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
state.mode = hold & 0x200 ? DICTID : TYPE$1;
//=== INITBITS();
hold = 0;
bits = 0;
//===//
break;
case FLAGS:
//=== NEEDBITS(16); */
while (bits < 16) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
state.flags = hold;
if ((state.flags & 0xff) !== Z_DEFLATED$2) {
strm.msg = 'unknown compression method';
state.mode = BAD$1;
break;
}
if (state.flags & 0xe000) {
strm.msg = 'unknown header flags set';
state.mode = BAD$1;
break;
}
if (state.head) {
state.head.text = ((hold >> 8) & 1);
}
if (state.flags & 0x0200) {
//=== CRC2(state.check, hold);
hbuf[0] = hold & 0xff;
hbuf[1] = (hold >>> 8) & 0xff;
state.check = crc32_1(state.check, hbuf, 2, 0);
//===//
}
//=== INITBITS();
hold = 0;
bits = 0;
//===//
state.mode = TIME;
/* falls through */
case TIME:
//=== NEEDBITS(32); */
while (bits < 32) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
if (state.head) {
state.head.time = hold;
}
if (state.flags & 0x0200) {
//=== CRC4(state.check, hold)
hbuf[0] = hold & 0xff;
hbuf[1] = (hold >>> 8) & 0xff;
hbuf[2] = (hold >>> 16) & 0xff;
hbuf[3] = (hold >>> 24) & 0xff;
state.check = crc32_1(state.check, hbuf, 4, 0);
//===
}
//=== INITBITS();
hold = 0;
bits = 0;
//===//
state.mode = OS;
/* falls through */
case OS:
//=== NEEDBITS(16); */
while (bits < 16) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
if (state.head) {
state.head.xflags = (hold & 0xff);
state.head.os = (hold >> 8);
}
if (state.flags & 0x0200) {
//=== CRC2(state.check, hold);
hbuf[0] = hold & 0xff;
hbuf[1] = (hold >>> 8) & 0xff;
state.check = crc32_1(state.check, hbuf, 2, 0);
//===//
}
//=== INITBITS();
hold = 0;
bits = 0;
//===//
state.mode = EXLEN;
/* falls through */
case EXLEN:
if (state.flags & 0x0400) {
//=== NEEDBITS(16); */
while (bits < 16) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
state.length = hold;
if (state.head) {
state.head.extra_len = hold;
}
if (state.flags & 0x0200) {
//=== CRC2(state.check, hold);
hbuf[0] = hold & 0xff;
hbuf[1] = (hold >>> 8) & 0xff;
state.check = crc32_1(state.check, hbuf, 2, 0);
//===//
}
//=== INITBITS();
hold = 0;
bits = 0;
//===//
}
else if (state.head) {
state.head.extra = null/*Z_NULL*/;
}
state.mode = EXTRA$1;
/* falls through */
case EXTRA$1:
if (state.flags & 0x0400) {
copy = state.length;
if (copy > have) { copy = have; }
if (copy) {
if (state.head) {
len = state.head.extra_len - state.length;
if (!state.head.extra) {
// Use untyped array for more convenient processing later
state.head.extra = new Array(state.head.extra_len);
}
common.arraySet(
state.head.extra,
input,
next,
// extra field is limited to 65536 bytes
// - no need for additional size check
copy,
/*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
len
);
//zmemcpy(state.head.extra + len, next,
// len + copy > state.head.extra_max ?
// state.head.extra_max - len : copy);
}
if (state.flags & 0x0200) {
state.check = crc32_1(state.check, input, copy, next);
}
have -= copy;
next += copy;
state.length -= copy;
}
if (state.length) { break inf_leave; }
}
state.length = 0;
state.mode = NAME;
/* falls through */
case NAME:
if (state.flags & 0x0800) {
if (have === 0) { break inf_leave; }
copy = 0;
do {
// TODO: 2 or 1 bytes?
len = input[next + copy++];
/* use constant limit because in js we should not preallocate memory */
if (state.head && len &&
(state.length < 65536 /*state.head.name_max*/)) {
state.head.name += String.fromCharCode(len);
}
} while (len && copy < have);
if (state.flags & 0x0200) {
state.check = crc32_1(state.check, input, copy, next);
}
have -= copy;
next += copy;
if (len) { break inf_leave; }
}
else if (state.head) {
state.head.name = null;
}
state.length = 0;
state.mode = COMMENT;
/* falls through */
case COMMENT:
if (state.flags & 0x1000) {
if (have === 0) { break inf_leave; }
copy = 0;
do {
len = input[next + copy++];
/* use constant limit because in js we should not preallocate memory */
if (state.head && len &&
(state.length < 65536 /*state.head.comm_max*/)) {
state.head.comment += String.fromCharCode(len);
}
} while (len && copy < have);
if (state.flags & 0x0200) {
state.check = crc32_1(state.check, input, copy, next);
}
have -= copy;
next += copy;
if (len) { break inf_leave; }
}
else if (state.head) {
state.head.comment = null;
}
state.mode = HCRC;
/* falls through */
case HCRC:
if (state.flags & 0x0200) {
//=== NEEDBITS(16); */
while (bits < 16) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
if (hold !== (state.check & 0xffff)) {
strm.msg = 'header crc mismatch';
state.mode = BAD$1;
break;
}
//=== INITBITS();
hold = 0;
bits = 0;
//===//
}
if (state.head) {
state.head.hcrc = ((state.flags >> 9) & 1);
state.head.done = true;
}
strm.adler = state.check = 0;
state.mode = TYPE$1;
break;
case DICTID:
//=== NEEDBITS(32); */
while (bits < 32) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
strm.adler = state.check = zswap32(hold);
//=== INITBITS();
hold = 0;
bits = 0;
//===//
state.mode = DICT;
/* falls through */
case DICT:
if (state.havedict === 0) {
//--- RESTORE() ---
strm.next_out = put;
strm.avail_out = left;
strm.next_in = next;
strm.avail_in = have;
state.hold = hold;
state.bits = bits;
//---
return Z_NEED_DICT;
}
strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
state.mode = TYPE$1;
/* falls through */
case TYPE$1:
if (flush === Z_BLOCK$1 || flush === Z_TREES) { break inf_leave; }
/* falls through */
case TYPEDO:
if (state.last) {
//--- BYTEBITS() ---//
hold >>>= bits & 7;
bits -= bits & 7;
//---//
state.mode = CHECK;
break;
}
//=== NEEDBITS(3); */
while (bits < 3) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
state.last = (hold & 0x01)/*BITS(1)*/;
//--- DROPBITS(1) ---//
hold >>>= 1;
bits -= 1;
//---//
switch ((hold & 0x03)/*BITS(2)*/) {
case 0: /* stored block */
//Tracev((stderr, "inflate: stored block%s\n",
// state.last ? " (last)" : ""));
state.mode = STORED;
break;
case 1: /* fixed block */
fixedtables(state);
//Tracev((stderr, "inflate: fixed codes block%s\n",
// state.last ? " (last)" : ""));
state.mode = LEN_; /* decode codes */
if (flush === Z_TREES) {
//--- DROPBITS(2) ---//
hold >>>= 2;
bits -= 2;
//---//
break inf_leave;
}
break;
case 2: /* dynamic block */
//Tracev((stderr, "inflate: dynamic codes block%s\n",
// state.last ? " (last)" : ""));
state.mode = TABLE;
break;
case 3:
strm.msg = 'invalid block type';
state.mode = BAD$1;
}
//--- DROPBITS(2) ---//
hold >>>= 2;
bits -= 2;
//---//
break;
case STORED:
//--- BYTEBITS() ---// /* go to byte boundary */
hold >>>= bits & 7;
bits -= bits & 7;
//---//
//=== NEEDBITS(32); */
while (bits < 32) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
strm.msg = 'invalid stored block lengths';
state.mode = BAD$1;
break;
}
state.length = hold & 0xffff;
//Tracev((stderr, "inflate: stored length %u\n",
// state.length));
//=== INITBITS();
hold = 0;
bits = 0;
//===//
state.mode = COPY_;
if (flush === Z_TREES) { break inf_leave; }
/* falls through */
case COPY_:
state.mode = COPY;
/* falls through */
case COPY:
copy = state.length;
if (copy) {
if (copy > have) { copy = have; }
if (copy > left) { copy = left; }
if (copy === 0) { break inf_leave; }
//--- zmemcpy(put, next, copy); ---
common.arraySet(output, input, next, copy, put);
//---//
have -= copy;
next += copy;
left -= copy;
put += copy;
state.length -= copy;
break;
}
//Tracev((stderr, "inflate: stored end\n"));
state.mode = TYPE$1;
break;
case TABLE:
//=== NEEDBITS(14); */
while (bits < 14) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
//--- DROPBITS(5) ---//
hold >>>= 5;
bits -= 5;
//---//
state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
//--- DROPBITS(5) ---//
hold >>>= 5;
bits -= 5;
//---//
state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
//--- DROPBITS(4) ---//
hold >>>= 4;
bits -= 4;
//---//
//#ifndef PKZIP_BUG_WORKAROUND
if (state.nlen > 286 || state.ndist > 30) {
strm.msg = 'too many length or distance symbols';
state.mode = BAD$1;
break;
}
//#endif
//Tracev((stderr, "inflate: table sizes ok\n"));
state.have = 0;
state.mode = LENLENS;
/* falls through */
case LENLENS:
while (state.have < state.ncode) {
//=== NEEDBITS(3);
while (bits < 3) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
//--- DROPBITS(3) ---//
hold >>>= 3;
bits -= 3;
//---//
}
while (state.have < 19) {
state.lens[order[state.have++]] = 0;
}
// We have separate tables & no pointers. 2 commented lines below not needed.
//state.next = state.codes;
//state.lencode = state.next;
// Switch to use dynamic table
state.lencode = state.lendyn;
state.lenbits = 7;
opts = { bits: state.lenbits };
ret = inftrees(CODES$1, state.lens, 0, 19, state.lencode, 0, state.work, opts);
state.lenbits = opts.bits;
if (ret) {
strm.msg = 'invalid code lengths set';
state.mode = BAD$1;
break;
}
//Tracev((stderr, "inflate: code lengths ok\n"));
state.have = 0;
state.mode = CODELENS;
/* falls through */
case CODELENS:
while (state.have < state.nlen + state.ndist) {
for (;;) {
here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
here_bits = here >>> 24;
here_op = (here >>> 16) & 0xff;
here_val = here & 0xffff;
if ((here_bits) <= bits) { break; }
//--- PULLBYTE() ---//
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
//---//
}
if (here_val < 16) {
//--- DROPBITS(here.bits) ---//
hold >>>= here_bits;
bits -= here_bits;
//---//
state.lens[state.have++] = here_val;
}
else {
if (here_val === 16) {
//=== NEEDBITS(here.bits + 2);
n = here_bits + 2;
while (bits < n) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
//--- DROPBITS(here.bits) ---//
hold >>>= here_bits;
bits -= here_bits;
//---//
if (state.have === 0) {
strm.msg = 'invalid bit length repeat';
state.mode = BAD$1;
break;
}
len = state.lens[state.have - 1];
copy = 3 + (hold & 0x03);//BITS(2);
//--- DROPBITS(2) ---//
hold >>>= 2;
bits -= 2;
//---//
}
else if (here_val === 17) {
//=== NEEDBITS(here.bits + 3);
n = here_bits + 3;
while (bits < n) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
//--- DROPBITS(here.bits) ---//
hold >>>= here_bits;
bits -= here_bits;
//---//
len = 0;
copy = 3 + (hold & 0x07);//BITS(3);
//--- DROPBITS(3) ---//
hold >>>= 3;
bits -= 3;
//---//
}
else {
//=== NEEDBITS(here.bits + 7);
n = here_bits + 7;
while (bits < n) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
//--- DROPBITS(here.bits) ---//
hold >>>= here_bits;
bits -= here_bits;
//---//
len = 0;
copy = 11 + (hold & 0x7f);//BITS(7);
//--- DROPBITS(7) ---//
hold >>>= 7;
bits -= 7;
//---//
}
if (state.have + copy > state.nlen + state.ndist) {
strm.msg = 'invalid bit length repeat';
state.mode = BAD$1;
break;
}
while (copy--) {
state.lens[state.have++] = len;
}
}
}
/* handle error breaks in while */
if (state.mode === BAD$1) { break; }
/* check for end-of-block code (better have one) */
if (state.lens[256] === 0) {
strm.msg = 'invalid code -- missing end-of-block';
state.mode = BAD$1;
break;
}
/* build code tables -- note: do not change the lenbits or distbits
values here (9 and 6) without reading the comments in inftrees.h
concerning the ENOUGH constants, which depend on those values */
state.lenbits = 9;
opts = { bits: state.lenbits };
ret = inftrees(LENS$1, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
// We have separate tables & no pointers. 2 commented lines below not needed.
// state.next_index = opts.table_index;
state.lenbits = opts.bits;
// state.lencode = state.next;
if (ret) {
strm.msg = 'invalid literal/lengths set';
state.mode = BAD$1;
break;
}
state.distbits = 6;
//state.distcode.copy(state.codes);
// Switch to use dynamic table
state.distcode = state.distdyn;
opts = { bits: state.distbits };
ret = inftrees(DISTS$1, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
// We have separate tables & no pointers. 2 commented lines below not needed.
// state.next_index = opts.table_index;
state.distbits = opts.bits;
// state.distcode = state.next;
if (ret) {
strm.msg = 'invalid distances set';
state.mode = BAD$1;
break;
}
//Tracev((stderr, 'inflate: codes ok\n'));
state.mode = LEN_;
if (flush === Z_TREES) { break inf_leave; }
/* falls through */
case LEN_:
state.mode = LEN;
/* falls through */
case LEN:
if (have >= 6 && left >= 258) {
//--- RESTORE() ---
strm.next_out = put;
strm.avail_out = left;
strm.next_in = next;
strm.avail_in = have;
state.hold = hold;
state.bits = bits;
//---
inffast(strm, _out);
//--- LOAD() ---
put = strm.next_out;
output = strm.output;
left = strm.avail_out;
next = strm.next_in;
input = strm.input;
have = strm.avail_in;
hold = state.hold;
bits = state.bits;
//---
if (state.mode === TYPE$1) {
state.back = -1;
}
break;
}
state.back = 0;
for (;;) {
here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/
here_bits = here >>> 24;
here_op = (here >>> 16) & 0xff;
here_val = here & 0xffff;
if (here_bits <= bits) { break; }
//--- PULLBYTE() ---//
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
//---//
}
if (here_op && (here_op & 0xf0) === 0) {
last_bits = here_bits;
last_op = here_op;
last_val = here_val;
for (;;) {
here = state.lencode[last_val +
((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
here_bits = here >>> 24;
here_op = (here >>> 16) & 0xff;
here_val = here & 0xffff;
if ((last_bits + here_bits) <= bits) { break; }
//--- PULLBYTE() ---//
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
//---//
}
//--- DROPBITS(last.bits) ---//
hold >>>= last_bits;
bits -= last_bits;
//---//
state.back += last_bits;
}
//--- DROPBITS(here.bits) ---//
hold >>>= here_bits;
bits -= here_bits;
//---//
state.back += here_bits;
state.length = here_val;
if (here_op === 0) {
//Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
// "inflate: literal '%c'\n" :
// "inflate: literal 0x%02x\n", here.val));
state.mode = LIT;
break;
}
if (here_op & 32) {
//Tracevv((stderr, "inflate: end of block\n"));
state.back = -1;
state.mode = TYPE$1;
break;
}
if (here_op & 64) {
strm.msg = 'invalid literal/length code';
state.mode = BAD$1;
break;
}
state.extra = here_op & 15;
state.mode = LENEXT;
/* falls through */
case LENEXT:
if (state.extra) {
//=== NEEDBITS(state.extra);
n = state.extra;
while (bits < n) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
//--- DROPBITS(state.extra) ---//
hold >>>= state.extra;
bits -= state.extra;
//---//
state.back += state.extra;
}
//Tracevv((stderr, "inflate: length %u\n", state.length));
state.was = state.length;
state.mode = DIST;
/* falls through */
case DIST:
for (;;) {
here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
here_bits = here >>> 24;
here_op = (here >>> 16) & 0xff;
here_val = here & 0xffff;
if ((here_bits) <= bits) { break; }
//--- PULLBYTE() ---//
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
//---//
}
if ((here_op & 0xf0) === 0) {
last_bits = here_bits;
last_op = here_op;
last_val = here_val;
for (;;) {
here = state.distcode[last_val +
((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
here_bits = here >>> 24;
here_op = (here >>> 16) & 0xff;
here_val = here & 0xffff;
if ((last_bits + here_bits) <= bits) { break; }
//--- PULLBYTE() ---//
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
//---//
}
//--- DROPBITS(last.bits) ---//
hold >>>= last_bits;
bits -= last_bits;
//---//
state.back += last_bits;
}
//--- DROPBITS(here.bits) ---//
hold >>>= here_bits;
bits -= here_bits;
//---//
state.back += here_bits;
if (here_op & 64) {
strm.msg = 'invalid distance code';
state.mode = BAD$1;
break;
}
state.offset = here_val;
state.extra = (here_op) & 15;
state.mode = DISTEXT;
/* falls through */
case DISTEXT:
if (state.extra) {
//=== NEEDBITS(state.extra);
n = state.extra;
while (bits < n) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
//--- DROPBITS(state.extra) ---//
hold >>>= state.extra;
bits -= state.extra;
//---//
state.back += state.extra;
}
//#ifdef INFLATE_STRICT
if (state.offset > state.dmax) {
strm.msg = 'invalid distance too far back';
state.mode = BAD$1;
break;
}
//#endif
//Tracevv((stderr, "inflate: distance %u\n", state.offset));
state.mode = MATCH;
/* falls through */
case MATCH:
if (left === 0) { break inf_leave; }
copy = _out - left;
if (state.offset > copy) { /* copy from window */
copy = state.offset - copy;
if (copy > state.whave) {
if (state.sane) {
strm.msg = 'invalid distance too far back';
state.mode = BAD$1;
break;
}
// (!) This block is disabled in zlib defaults,
// don't enable it for binary compatibility
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
// Trace((stderr, "inflate.c too far\n"));
// copy -= state.whave;
// if (copy > state.length) { copy = state.length; }
// if (copy > left) { copy = left; }
// left -= copy;
// state.length -= copy;
// do {
// output[put++] = 0;
// } while (--copy);
// if (state.length === 0) { state.mode = LEN; }
// break;
//#endif
}
if (copy > state.wnext) {
copy -= state.wnext;
from = state.wsize - copy;
}
else {
from = state.wnext - copy;
}
if (copy > state.length) { copy = state.length; }
from_source = state.window;
}
else { /* copy from output */
from_source = output;
from = put - state.offset;
copy = state.length;
}
if (copy > left) { copy = left; }
left -= copy;
state.length -= copy;
do {
output[put++] = from_source[from++];
} while (--copy);
if (state.length === 0) { state.mode = LEN; }
break;
case LIT:
if (left === 0) { break inf_leave; }
output[put++] = state.length;
left--;
state.mode = LEN;
break;
case CHECK:
if (state.wrap) {
//=== NEEDBITS(32);
while (bits < 32) {
if (have === 0) { break inf_leave; }
have--;
// Use '|' instead of '+' to make sure that result is signed
hold |= input[next++] << bits;
bits += 8;
}
//===//
_out -= left;
strm.total_out += _out;
state.total += _out;
if (_out) {
strm.adler = state.check =
/*UPDATE(state.check, put - _out, _out);*/
(state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));
}
_out = left;
// NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
if ((state.flags ? hold : zswap32(hold)) !== state.check) {
strm.msg = 'incorrect data check';
state.mode = BAD$1;
break;
}
//=== INITBITS();
hold = 0;
bits = 0;
//===//
//Tracev((stderr, "inflate: check matches trailer\n"));
}
state.mode = LENGTH;
/* falls through */
case LENGTH:
if (state.wrap && state.flags) {
//=== NEEDBITS(32);
while (bits < 32) {
if (have === 0) { break inf_leave; }
have--;
hold += input[next++] << bits;
bits += 8;
}
//===//
if (hold !== (state.total & 0xffffffff)) {
strm.msg = 'incorrect length check';
state.mode = BAD$1;
break;
}
//=== INITBITS();
hold = 0;
bits = 0;
//===//
//Tracev((stderr, "inflate: length matches trailer\n"));
}
state.mode = DONE;
/* falls through */
case DONE:
ret = Z_STREAM_END$2;
break inf_leave;
case BAD$1:
ret = Z_DATA_ERROR$1;
break inf_leave;
case MEM:
return Z_MEM_ERROR;
case SYNC:
/* falls through */
default:
return Z_STREAM_ERROR$1;
}
}
// inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
/*
Return from inflate(), updating the total counts and the check value.
If there was no progress during the inflate() call, return a buffer
error. Call updatewindow() to create and/or update the window state.
Note: a memory error from inflate() is non-recoverable.
*/
//--- RESTORE() ---
strm.next_out = put;
strm.avail_out = left;
strm.next_in = next;
strm.avail_in = have;
state.hold = hold;
state.bits = bits;
//---
if (state.wsize || (_out !== strm.avail_out && state.mode < BAD$1 &&
(state.mode < CHECK || flush !== Z_FINISH$2))) {
if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
state.mode = MEM;
return Z_MEM_ERROR;
}
}
_in -= strm.avail_in;
_out -= strm.avail_out;
strm.total_in += _in;
strm.total_out += _out;
state.total += _out;
if (state.wrap && _out) {
strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
(state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));
}
strm.data_type = state.bits + (state.last ? 64 : 0) +
(state.mode === TYPE$1 ? 128 : 0) +
(state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
if (((_in === 0 && _out === 0) || flush === Z_FINISH$2) && ret === Z_OK$2) {
ret = Z_BUF_ERROR$1;
}
return ret;
}
function inflateEnd(strm) {
if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
return Z_STREAM_ERROR$1;
}
var state = strm.state;
if (state.window) {
state.window = null;
}
strm.state = null;
return Z_OK$2;
}
function inflateGetHeader(strm, head) {
var state;
/* check state */
if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }
state = strm.state;
if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }
/* save header structure */
state.head = head;
head.done = false;
return Z_OK$2;
}
function inflateSetDictionary(strm, dictionary) {
var dictLength = dictionary.length;
var state;
var dictid;
var ret;
/* check state */
if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; }
state = strm.state;
if (state.wrap !== 0 && state.mode !== DICT) {
return Z_STREAM_ERROR$1;
}
/* check for correct dictionary identifier */
if (state.mode === DICT) {
dictid = 1; /* adler32(0, null, 0)*/
/* dictid = adler32(dictid, dictionary, dictLength); */
dictid = adler32_1(dictid, dictionary, dictLength, 0);
if (dictid !== state.check) {
return Z_DATA_ERROR$1;
}
}
/* copy dictionary to window using updatewindow(), which will amend the
existing dictionary if appropriate */
ret = updatewindow(strm, dictionary, dictLength, dictLength);
if (ret) {
state.mode = MEM;
return Z_MEM_ERROR;
}
state.havedict = 1;
// Tracev((stderr, "inflate: dictionary set\n"));
return Z_OK$2;
}
var inflateReset_1 = inflateReset;
var inflateReset2_1 = inflateReset2;
var inflateResetKeep_1 = inflateResetKeep;
var inflateInit_1 = inflateInit;
var inflateInit2_1 = inflateInit2;
var inflate_2 = inflate;
var inflateEnd_1 = inflateEnd;
var inflateGetHeader_1 = inflateGetHeader;
var inflateSetDictionary_1 = inflateSetDictionary;
var inflateInfo = 'pako inflate (from Nodeca project)';
/* Not implemented
exports.inflateCopy = inflateCopy;
exports.inflateGetDictionary = inflateGetDictionary;
exports.inflateMark = inflateMark;
exports.inflatePrime = inflatePrime;
exports.inflateSync = inflateSync;
exports.inflateSyncPoint = inflateSyncPoint;
exports.inflateUndermine = inflateUndermine;
*/
var inflate_1 = {
inflateReset: inflateReset_1,
inflateReset2: inflateReset2_1,
inflateResetKeep: inflateResetKeep_1,
inflateInit: inflateInit_1,
inflateInit2: inflateInit2_1,
inflate: inflate_2,
inflateEnd: inflateEnd_1,
inflateGetHeader: inflateGetHeader_1,
inflateSetDictionary: inflateSetDictionary_1,
inflateInfo: inflateInfo
};
'use strict';
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
var constants = {
/* Allowed flush values; see deflate() and inflate() below for details */
Z_NO_FLUSH: 0,
Z_PARTIAL_FLUSH: 1,
Z_SYNC_FLUSH: 2,
Z_FULL_FLUSH: 3,
Z_FINISH: 4,
Z_BLOCK: 5,
Z_TREES: 6,
/* Return codes for the compression/decompression functions. Negative values
* are errors, positive values are used for special but normal events.
*/
Z_OK: 0,
Z_STREAM_END: 1,
Z_NEED_DICT: 2,
Z_ERRNO: -1,
Z_STREAM_ERROR: -2,
Z_DATA_ERROR: -3,
//Z_MEM_ERROR: -4,
Z_BUF_ERROR: -5,
//Z_VERSION_ERROR: -6,
/* compression levels */
Z_NO_COMPRESSION: 0,
Z_BEST_SPEED: 1,
Z_BEST_COMPRESSION: 9,
Z_DEFAULT_COMPRESSION: -1,
Z_FILTERED: 1,
Z_HUFFMAN_ONLY: 2,
Z_RLE: 3,
Z_FIXED: 4,
Z_DEFAULT_STRATEGY: 0,
/* Possible values of the data_type field (though see inflate()) */
Z_BINARY: 0,
Z_TEXT: 1,
//Z_ASCII: 1, // = Z_TEXT (deprecated)
Z_UNKNOWN: 2,
/* The deflate compression method */
Z_DEFLATED: 8
//Z_NULL: null // Use -1 or null inline, depending on var type
};
var constants_1 = constants.Z_NO_FLUSH;
var constants_2 = constants.Z_PARTIAL_FLUSH;
var constants_3 = constants.Z_SYNC_FLUSH;
var constants_4 = constants.Z_FULL_FLUSH;
var constants_5 = constants.Z_FINISH;
var constants_6 = constants.Z_BLOCK;
var constants_7 = constants.Z_TREES;
var constants_8 = constants.Z_OK;
var constants_9 = constants.Z_STREAM_END;
var constants_10 = constants.Z_NEED_DICT;
var constants_11 = constants.Z_ERRNO;
var constants_12 = constants.Z_STREAM_ERROR;
var constants_13 = constants.Z_DATA_ERROR;
var constants_14 = constants.Z_BUF_ERROR;
var constants_15 = constants.Z_NO_COMPRESSION;
var constants_16 = constants.Z_BEST_SPEED;
var constants_17 = constants.Z_BEST_COMPRESSION;
var constants_18 = constants.Z_DEFAULT_COMPRESSION;
var constants_19 = constants.Z_FILTERED;
var constants_20 = constants.Z_HUFFMAN_ONLY;
var constants_21 = constants.Z_RLE;
var constants_22 = constants.Z_FIXED;
var constants_23 = constants.Z_DEFAULT_STRATEGY;
var constants_24 = constants.Z_BINARY;
var constants_25 = constants.Z_TEXT;
var constants_26 = constants.Z_UNKNOWN;
var constants_27 = constants.Z_DEFLATED;
'use strict';
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
function GZheader() {
/* true if compressed data believed to be text */
this.text = 0;
/* modification time */
this.time = 0;
/* extra flags (not used when writing a gzip file) */
this.xflags = 0;
/* operating system */
this.os = 0;
/* pointer to extra field or Z_NULL if none */
this.extra = null;
/* extra field length (valid if extra != Z_NULL) */
this.extra_len = 0; // Actually, we don't need it in JS,
// but leave for few code modifications
//
// Setup limits is not necessary because in js we should not preallocate memory
// for inflate use constant limit in 65536 bytes
//
/* space at extra (only when reading header) */
// this.extra_max = 0;
/* pointer to zero-terminated file name or Z_NULL */
this.name = '';
/* space at name (only when reading header) */
// this.name_max = 0;
/* pointer to zero-terminated comment or Z_NULL */
this.comment = '';
/* space at comment (only when reading header) */
// this.comm_max = 0;
/* true if there was or will be a header crc */
this.hcrc = 0;
/* true when done reading gzip header (not used when writing a gzip file) */
this.done = false;
}
var gzheader = GZheader;
'use strict';
var toString$5 = Object.prototype.toString;
/**
* class Inflate
*
* Generic JS-style wrapper for zlib calls. If you don't need
* streaming behaviour - use more simple functions: [[inflate]]
* and [[inflateRaw]].
**/
/* internal
* inflate.chunks -> Array
*
* Chunks of output data, if [[Inflate#onData]] not overridden.
**/
/**
* Inflate.result -> Uint8Array|Array|String
*
* Uncompressed result, generated by default [[Inflate#onData]]
* and [[Inflate#onEnd]] handlers. Filled after you push last chunk
* (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you
* push a chunk with explicit flush (call [[Inflate#push]] with
* `Z_SYNC_FLUSH` param).
**/
/**
* Inflate.err -> Number
*
* Error code after inflate finished. 0 (Z_OK) on success.
* Should be checked if broken data possible.
**/
/**
* Inflate.msg -> String
*
* Error message, if [[Inflate.err]] != 0
**/
/**
* new Inflate(options)
* - options (Object): zlib inflate options.
*
* Creates new inflator instance with specified params. Throws exception
* on bad params. Supported options:
*
* - `windowBits`
* - `dictionary`
*
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
* for more information on these.
*
* Additional options, for internal needs:
*
* - `chunkSize` - size of generated data chunks (16K by default)
* - `raw` (Boolean) - do raw inflate
* - `to` (String) - if equal to 'string', then result will be converted
* from utf8 to utf16 (javascript) string. When string output requested,
* chunk length can differ from `chunkSize`, depending on content.
*
* By default, when no options set, autodetect deflate/gzip data format via
* wrapper header.
*
* ##### Example:
*
* ```javascript
* var pako = require('pako')
* , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
* , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
*
* var inflate = new pako.Inflate({ level: 3});
*
* inflate.push(chunk1, false);
* inflate.push(chunk2, true); // true -> last chunk
*
* if (inflate.err) { throw new Error(inflate.err); }
*
* console.log(inflate.result);
* ```
**/
function Inflate(options) {
if (!(this instanceof Inflate)) return new Inflate(options);
this.options = common.assign({
chunkSize: 16384,
windowBits: 0,
to: ''
}, options || {});
var opt = this.options;
// Force window size for `raw` data, if not set directly,
// because we have no header for autodetect.
if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
opt.windowBits = -opt.windowBits;
if (opt.windowBits === 0) { opt.windowBits = -15; }
}
// If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
!(options && options.windowBits)) {
opt.windowBits += 32;
}
// Gzip header has no info about windows size, we can do autodetect only
// for deflate. So, if window size not set, force it to max when gzip possible
if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
// bit 3 (16) -> gzipped data
// bit 4 (32) -> autodetect gzip/deflate
if ((opt.windowBits & 15) === 0) {
opt.windowBits |= 15;
}
}
this.err = 0; // error code, if happens (0 = Z_OK)
this.msg = ''; // error message
this.ended = false; // used to avoid multiple onEnd() calls
this.chunks = []; // chunks of compressed data
this.strm = new zstream();
this.strm.avail_out = 0;
var status = inflate_1.inflateInit2(
this.strm,
opt.windowBits
);
if (status !== constants.Z_OK) {
throw new Error(messages[status]);
}
this.header = new gzheader();
inflate_1.inflateGetHeader(this.strm, this.header);
// Setup dictionary
if (opt.dictionary) {
// Convert data if needed
if (typeof opt.dictionary === 'string') {
opt.dictionary = strings.string2buf(opt.dictionary);
} else if (toString$5.call(opt.dictionary) === '[object ArrayBuffer]') {
opt.dictionary = new Uint8Array(opt.dictionary);
}
if (opt.raw) { //In raw mode we need to set the dictionary early
status = inflate_1.inflateSetDictionary(this.strm, opt.dictionary);
if (status !== constants.Z_OK) {
throw new Error(messages[status]);
}
}
}
}
/**
* Inflate#push(data[, mode]) -> Boolean
* - data (Uint8Array|Array|ArrayBuffer|String): input data
* - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
* See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
*
* Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
* new output chunks. Returns `true` on success. The last data block must have
* mode Z_FINISH (or `true`). That will flush internal pending buffers and call
* [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you
* can use mode Z_SYNC_FLUSH, keeping the decompression context.
*
* On fail call [[Inflate#onEnd]] with error code and return false.
*
* We strongly recommend to use `Uint8Array` on input for best speed (output
* format is detected automatically). Also, don't skip last param and always
* use the same type in your code (boolean or number). That will improve JS speed.
*
* For regular `Array`-s make sure all elements are [0..255].
*
* ##### Example
*
* ```javascript
* push(chunk, false); // push one of data chunks
* ...
* push(chunk, true); // push last chunk
* ```
**/
Inflate.prototype.push = function (data, mode) {
var strm = this.strm;
var chunkSize = this.options.chunkSize;
var dictionary = this.options.dictionary;
var status, _mode;
var next_out_utf8, tail, utf8str;
// Flag to properly process Z_BUF_ERROR on testing inflate call
// when we check that all output data was flushed.
var allowBufError = false;
if (this.ended) { return false; }
_mode = (mode === ~~mode) ? mode : ((mode === true) ? constants.Z_FINISH : constants.Z_NO_FLUSH);
// Convert data if needed
if (typeof data === 'string') {
// Only binary strings can be decompressed on practice
strm.input = strings.binstring2buf(data);
} else if (toString$5.call(data) === '[object ArrayBuffer]') {
strm.input = new Uint8Array(data);
} else {
strm.input = data;
}
strm.next_in = 0;
strm.avail_in = strm.input.length;
do {
if (strm.avail_out === 0) {
strm.output = new common.Buf8(chunkSize);
strm.next_out = 0;
strm.avail_out = chunkSize;
}
status = inflate_1.inflate(strm, constants.Z_NO_FLUSH); /* no bad return value */
if (status === constants.Z_NEED_DICT && dictionary) {
status = inflate_1.inflateSetDictionary(this.strm, dictionary);
}
if (status === constants.Z_BUF_ERROR && allowBufError === true) {
status = constants.Z_OK;
allowBufError = false;
}
if (status !== constants.Z_STREAM_END && status !== constants.Z_OK) {
this.onEnd(status);
this.ended = true;
return false;
}
if (strm.next_out) {
if (strm.avail_out === 0 || status === constants.Z_STREAM_END || (strm.avail_in === 0 && (_mode === constants.Z_FINISH || _mode === constants.Z_SYNC_FLUSH))) {
if (this.options.to === 'string') {
next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
tail = strm.next_out - next_out_utf8;
utf8str = strings.buf2string(strm.output, next_out_utf8);
// move tail
strm.next_out = tail;
strm.avail_out = chunkSize - tail;
if (tail) { common.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
this.onData(utf8str);
} else {
this.onData(common.shrinkBuf(strm.output, strm.next_out));
}
}
}
// When no more input data, we should check that internal inflate buffers
// are flushed. The only way to do it when avail_out = 0 - run one more
// inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.
// Here we set flag to process this error properly.
//
// NOTE. Deflate does not return error in this case and does not needs such
// logic.
if (strm.avail_in === 0 && strm.avail_out === 0) {
allowBufError = true;
}
} while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== constants.Z_STREAM_END);
if (status === constants.Z_STREAM_END) {
_mode = constants.Z_FINISH;
}
// Finalize on the last chunk.
if (_mode === constants.Z_FINISH) {
status = inflate_1.inflateEnd(this.strm);
this.onEnd(status);
this.ended = true;
return status === constants.Z_OK;
}
// callback interim results if Z_SYNC_FLUSH.
if (_mode === constants.Z_SYNC_FLUSH) {
this.onEnd(constants.Z_OK);
strm.avail_out = 0;
return true;
}
return true;
};
/**
* Inflate#onData(chunk) -> Void
* - chunk (Uint8Array|Array|String): output data. Type of array depends
* on js engine support. When string output requested, each chunk
* will be string.
*
* By default, stores data blocks in `chunks[]` property and glue
* those in `onEnd`. Override this handler, if you need another behaviour.
**/
Inflate.prototype.onData = function (chunk) {
this.chunks.push(chunk);
};
/**
* Inflate#onEnd(status) -> Void
* - status (Number): inflate status. 0 (Z_OK) on success,
* other if not.
*
* Called either after you tell inflate that the input stream is
* complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
* or if an error happened. By default - join collected chunks,
* free memory and fill `results` / `err` properties.
**/
Inflate.prototype.onEnd = function (status) {
// On success - join
if (status === constants.Z_OK) {
if (this.options.to === 'string') {
// Glue & convert here, until we teach pako to send
// utf8 aligned strings to onData
this.result = this.chunks.join('');
} else {
this.result = common.flattenChunks(this.chunks);
}
}
this.chunks = [];
this.err = status;
this.msg = this.strm.msg;
};
/**
* inflate(data[, options]) -> Uint8Array|Array|String
* - data (Uint8Array|Array|String): input data to decompress.
* - options (Object): zlib inflate options.
*
* Decompress `data` with inflate/ungzip and `options`. Autodetect
* format via wrapper header by default. That's why we don't provide
* separate `ungzip` method.
*
* Supported options are:
*
* - windowBits
*
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
* for more information.
*
* Sugar (options):
*
* - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
* negative windowBits implicitly.
* - `to` (String) - if equal to 'string', then result will be converted
* from utf8 to utf16 (javascript) string. When string output requested,
* chunk length can differ from `chunkSize`, depending on content.
*
*
* ##### Example:
*
* ```javascript
* var pako = require('pako')
* , input = pako.deflate([1,2,3,4,5,6,7,8,9])
* , output;
*
* try {
* output = pako.inflate(input);
* } catch (err)
* console.log(err);
* }
* ```
**/
function inflate$1(input, options) {
var inflator = new Inflate(options);
inflator.push(input, true);
// That will never happens, if you don't cheat with options :)
if (inflator.err) { throw inflator.msg || messages[inflator.err]; }
return inflator.result;
}
/**
* inflateRaw(data[, options]) -> Uint8Array|Array|String
* - data (Uint8Array|Array|String): input data to decompress.
* - options (Object): zlib inflate options.
*
* The same as [[inflate]], but creates raw data, without wrapper
* (header and adler32 crc).
**/
function inflateRaw(input, options) {
options = options || {};
options.raw = true;
return inflate$1(input, options);
}
/**
* ungzip(data[, options]) -> Uint8Array|Array|String
* - data (Uint8Array|Array|String): input data to decompress.
* - options (Object): zlib inflate options.
*
* Just shortcut to [[inflate]], because it autodetects format
* by header.content. Done for convenience.
**/
var Inflate_1 = Inflate;
var inflate_2$1 = inflate$1;
var inflateRaw_1 = inflateRaw;
var ungzip = inflate$1;
var inflate_1$1 = {
Inflate: Inflate_1,
inflate: inflate_2$1,
inflateRaw: inflateRaw_1,
ungzip: ungzip
};
// Top level file is just a mixin of submodules & constants
'use strict';
var assign$1 = common.assign;
var pako = {};
assign$1(pako, deflate_1$1, inflate_1$1, constants);
var pako_1 = pako;
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_1.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_1.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 = pomeloProtocol;
var _protobuf = protobuf;
var _package = pomeloProtocol.Package;
var _message = pomeloProtocol.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;
return zbysdk$1;
})));