workano-js-sdk
Version:
Workano Communications SDK - A modern JavaScript SDK for WebRTC and VoIP integration.
792 lines • 2.99 MB
JavaScript
/*! For license information please see wazo-sdk.js.LICENSE.txt */
(function(root, factory) {
if ('object' == typeof exports && 'object' == typeof module) module.exports = factory();
else if ('function' == typeof define && define.amd) define([], factory);
else {
var a = factory();
for(var i in a)('object' == typeof exports ? exports : root)[i] = a[i];
}
})(globalThis, ()=>(()=>{
var __webpack_modules__ = {
"./node_modules/events/events.js": function(module1) {
"use strict";
var R = 'object' == typeof Reflect ? Reflect : null;
var ReflectApply = R && 'function' == typeof R.apply ? R.apply : function(target, receiver, args) {
return Function.prototype.apply.call(target, receiver, args);
};
var ReflectOwnKeys;
ReflectOwnKeys = R && 'function' == typeof R.ownKeys ? R.ownKeys : Object.getOwnPropertySymbols ? function(target) {
return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));
} : function(target) {
return Object.getOwnPropertyNames(target);
};
function ProcessEmitWarning(warning) {
if (console && console.warn) console.warn(warning);
}
var NumberIsNaN = Number.isNaN || function(value) {
return value !== value;
};
function EventEmitter() {
EventEmitter.init.call(this);
}
module1.exports = EventEmitter;
module1.exports.once = once;
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.prototype._events = void 0;
EventEmitter.prototype._eventsCount = 0;
EventEmitter.prototype._maxListeners = void 0;
var defaultMaxListeners = 10;
function checkListener(listener) {
if ('function' != typeof listener) throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
}
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
enumerable: true,
get: function() {
return defaultMaxListeners;
},
set: function(arg) {
if ('number' != typeof arg || arg < 0 || NumberIsNaN(arg)) throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
defaultMaxListeners = arg;
}
});
EventEmitter.init = function() {
if (void 0 === this._events || this._events === Object.getPrototypeOf(this)._events) {
this._events = Object.create(null);
this._eventsCount = 0;
}
this._maxListeners = this._maxListeners || void 0;
};
EventEmitter.prototype.setMaxListeners = function(n) {
if ('number' != typeof n || n < 0 || NumberIsNaN(n)) throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
this._maxListeners = n;
return this;
};
function _getMaxListeners(that) {
if (void 0 === that._maxListeners) return EventEmitter.defaultMaxListeners;
return that._maxListeners;
}
EventEmitter.prototype.getMaxListeners = function() {
return _getMaxListeners(this);
};
EventEmitter.prototype.emit = function(type) {
var args = [];
for(var i = 1; i < arguments.length; i++)args.push(arguments[i]);
var doError = 'error' === type;
var events = this._events;
if (void 0 !== events) doError = doError && void 0 === events.error;
else if (!doError) return false;
if (doError) {
var er;
if (args.length > 0) er = args[0];
if (er instanceof Error) throw er;
var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
err.context = er;
throw err;
}
var handler = events[type];
if (void 0 === handler) return false;
if ('function' == typeof handler) ReflectApply(handler, this, args);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for(var i = 0; i < len; ++i)ReflectApply(listeners[i], this, args);
}
return true;
};
function _addListener(target, type, listener, prepend) {
var m;
var events;
var existing;
checkListener(listener);
events = target._events;
if (void 0 === events) {
events = target._events = Object.create(null);
target._eventsCount = 0;
} else {
if (void 0 !== events.newListener) {
target.emit('newListener', type, listener.listener ? listener.listener : listener);
events = target._events;
}
existing = events[type];
}
if (void 0 === existing) {
existing = events[type] = listener;
++target._eventsCount;
} else {
if ('function' == typeof existing) existing = events[type] = prepend ? [
listener,
existing
] : [
existing,
listener
];
else if (prepend) existing.unshift(listener);
else existing.push(listener);
m = _getMaxListeners(target);
if (m > 0 && existing.length > m && !existing.warned) {
existing.warned = true;
var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");
w.name = 'MaxListenersExceededWarning';
w.emitter = target;
w.type = type;
w.count = existing.length;
ProcessEmitWarning(w);
}
}
return target;
}
EventEmitter.prototype.addListener = function(type, listener) {
return _addListener(this, type, listener, false);
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.prependListener = function(type, listener) {
return _addListener(this, type, listener, true);
};
function onceWrapper() {
if (!this.fired) {
this.target.removeListener(this.type, this.wrapFn);
this.fired = true;
if (0 === arguments.length) return this.listener.call(this.target);
return this.listener.apply(this.target, arguments);
}
}
function _onceWrap(target, type, listener) {
var state = {
fired: false,
wrapFn: void 0,
target: target,
type: type,
listener: listener
};
var wrapped = onceWrapper.bind(state);
wrapped.listener = listener;
state.wrapFn = wrapped;
return wrapped;
}
EventEmitter.prototype.once = function(type, listener) {
checkListener(listener);
this.on(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.prependOnceListener = function(type, listener) {
checkListener(listener);
this.prependListener(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.removeListener = function(type, listener) {
var list, events, position, i, originalListener;
checkListener(listener);
events = this._events;
if (void 0 === events) return this;
list = events[type];
if (void 0 === list) return this;
if (list === listener || list.listener === listener) {
if (0 === --this._eventsCount) this._events = Object.create(null);
else {
delete events[type];
if (events.removeListener) this.emit('removeListener', type, list.listener || listener);
}
} else if ('function' != typeof list) {
position = -1;
for(i = list.length - 1; i >= 0; i--)if (list[i] === listener || list[i].listener === listener) {
originalListener = list[i].listener;
position = i;
break;
}
if (position < 0) return this;
if (0 === position) list.shift();
else spliceOne(list, position);
if (1 === list.length) events[type] = list[0];
if (void 0 !== events.removeListener) this.emit('removeListener', type, originalListener || listener);
}
return this;
};
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
EventEmitter.prototype.removeAllListeners = function(type) {
var listeners, events, i;
events = this._events;
if (void 0 === events) return this;
if (void 0 === events.removeListener) {
if (0 === arguments.length) {
this._events = Object.create(null);
this._eventsCount = 0;
} else if (void 0 !== events[type]) {
if (0 === --this._eventsCount) this._events = Object.create(null);
else delete events[type];
}
return this;
}
if (0 === arguments.length) {
var keys = Object.keys(events);
var key;
for(i = 0; i < keys.length; ++i){
key = keys[i];
if ('removeListener' !== key) this.removeAllListeners(key);
}
this.removeAllListeners('removeListener');
this._events = Object.create(null);
this._eventsCount = 0;
return this;
}
listeners = events[type];
if ('function' == typeof listeners) this.removeListener(type, listeners);
else if (void 0 !== listeners) for(i = listeners.length - 1; i >= 0; i--)this.removeListener(type, listeners[i]);
return this;
};
function _listeners(target, type, unwrap) {
var events = target._events;
if (void 0 === events) return [];
var evlistener = events[type];
if (void 0 === evlistener) return [];
if ('function' == typeof evlistener) return unwrap ? [
evlistener.listener || evlistener
] : [
evlistener
];
return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
}
EventEmitter.prototype.listeners = function(type) {
return _listeners(this, type, true);
};
EventEmitter.prototype.rawListeners = function(type) {
return _listeners(this, type, false);
};
EventEmitter.listenerCount = function(emitter, type) {
if ('function' == typeof emitter.listenerCount) return emitter.listenerCount(type);
return listenerCount.call(emitter, type);
};
EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
var events = this._events;
if (void 0 !== events) {
var evlistener = events[type];
if ('function' == typeof evlistener) return 1;
if (void 0 !== evlistener) return evlistener.length;
}
return 0;
}
EventEmitter.prototype.eventNames = function() {
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
};
function arrayClone(arr, n) {
var copy = new Array(n);
for(var i = 0; i < n; ++i)copy[i] = arr[i];
return copy;
}
function spliceOne(list, index) {
for(; index + 1 < list.length; index++)list[index] = list[index + 1];
list.pop();
}
function unwrapListeners(arr) {
var ret = new Array(arr.length);
for(var i = 0; i < ret.length; ++i)ret[i] = arr[i].listener || arr[i];
return ret;
}
function once(emitter, name) {
return new Promise(function(resolve, reject) {
function errorListener(err) {
emitter.removeListener(name, resolver);
reject(err);
}
function resolver() {
if ('function' == typeof emitter.removeListener) emitter.removeListener('error', errorListener);
resolve([].slice.call(arguments));
}
eventTargetAgnosticAddListener(emitter, name, resolver, {
once: true
});
if ('error' !== name) addErrorHandlerIfEventEmitter(emitter, errorListener, {
once: true
});
});
}
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
if ('function' == typeof emitter.on) eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
}
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
if ('function' == typeof emitter.on) {
if (flags.once) emitter.once(name, listener);
else emitter.on(name, listener);
} else if ('function' == typeof emitter.addEventListener) emitter.addEventListener(name, function wrapListener(arg) {
if (flags.once) emitter.removeEventListener(name, wrapListener);
listener(arg);
});
else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
}
},
"./node_modules/getstats/getStats.js": function(module1, __unused_webpack_exports, __webpack_require__) {
"use strict";
var getStats = function(mediaStreamTrack, callback, interval) {
var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';
(function(that) {
if (!that) return;
if ('undefined' != typeof window) return;
if (void 0 === __webpack_require__.g) return;
__webpack_require__.g.navigator = {
userAgent: browserFakeUserAgent,
getUserMedia: function() {}
};
if (!__webpack_require__.g.console) __webpack_require__.g.console = {};
if (void 0 === __webpack_require__.g.console.log || void 0 === __webpack_require__.g.console.error) __webpack_require__.g.console.error = __webpack_require__.g.console.log = __webpack_require__.g.console.log || function() {
console.log(arguments);
};
if ('undefined' == typeof document) {
that.document = {
documentElement: {
appendChild: function() {
return '';
}
}
};
document.createElement = document.captureStream = document.mozCaptureStream = function() {
var obj = {
getContext: function() {
return obj;
},
play: function() {},
pause: function() {},
drawImage: function() {},
toDataURL: function() {
return '';
}
};
return obj;
};
that.HTMLVideoElement = function() {};
}
if ('undefined' == typeof location) that.location = {
protocol: 'file:',
href: '',
hash: ''
};
if ('undefined' == typeof screen) that.screen = {
width: 0,
height: 0
};
if ('undefined' == typeof URL) that.URL = {
createObjectURL: function() {
return '';
},
revokeObjectURL: function() {
return '';
}
};
if ('undefined' == typeof MediaStreamTrack) that.MediaStreamTrack = function() {};
if (void 0 === RTCPeerConnection1) that.RTCPeerConnection = function() {};
that.window = __webpack_require__.g;
})(void 0 !== __webpack_require__.g ? __webpack_require__.g : null);
var RTCPeerConnection1 = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
if ('undefined' == typeof MediaStreamTrack) MediaStreamTrack = {};
var systemNetworkType = ((navigator.connection || {}).type || 'unknown').toString().toLowerCase();
var getStatsResult = {
encryption: 'sha-256',
audio: {
send: {
tracks: [],
codecs: [],
availableBandwidth: 0,
streams: 0,
framerateMean: 0,
bitrateMean: 0
},
recv: {
tracks: [],
codecs: [],
availableBandwidth: 0,
streams: 0,
framerateMean: 0,
bitrateMean: 0
},
bytesSent: 0,
bytesReceived: 0,
latency: 0,
packetsLost: 0
},
video: {
send: {
tracks: [],
codecs: [],
availableBandwidth: 0,
streams: 0,
framerateMean: 0,
bitrateMean: 0
},
recv: {
tracks: [],
codecs: [],
availableBandwidth: 0,
streams: 0,
framerateMean: 0,
bitrateMean: 0
},
bytesSent: 0,
bytesReceived: 0,
latency: 0,
packetsLost: 0
},
bandwidth: {
systemBandwidth: 0,
sentPerSecond: 0,
encodedPerSecond: 0,
helper: {
audioBytesSent: 0,
videoBytestSent: 0
},
speed: 0
},
results: {},
connectionType: {
systemNetworkType: systemNetworkType,
systemIpAddress: '192.168.1.2',
local: {
candidateType: [],
transport: [],
ipAddress: [],
networkType: []
},
remote: {
candidateType: [],
transport: [],
ipAddress: [],
networkType: []
}
},
resolutions: {
send: {
width: 0,
height: 0
},
recv: {
width: 0,
height: 0
}
},
internal: {
audio: {
send: {},
recv: {}
},
video: {
send: {},
recv: {}
},
candidates: {},
getSendrecvType: function(result) {
var sendrecvType = result.id.split('_').pop();
if ('isRemote' in result) {
if (true === result.isRemote) sendrecvType = 'recv';
if (false === result.isRemote) sendrecvType = 'send';
} else {
var direction = result.type.split('-')[0];
sendrecvType = 'outbound' === direction ? 'send' : 'inbound' === direction ? 'recv' : null;
}
return sendrecvType;
}
},
nomore: function() {
nomore = true;
}
};
var getStatsParser = {
checkIfOfferer: function(result) {
if ('googLibjingleSession' === result.type) getStatsResult.isOfferer = result.googInitiator;
}
};
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
var peer = this;
if (!(arguments[0] instanceof RTCPeerConnection1)) throw '1st argument is not instance of RTCPeerConnection.';
peer = arguments[0];
if (arguments[1] instanceof MediaStreamTrack) {
arguments[1];
callback = arguments[2];
interval = arguments[3];
}
var nomore = false;
function getStatsLooper() {
getStatsWrapper(function(results) {
if (!results || !results.forEach) return;
results.forEach(function(result) {
Object.keys(getStatsParser).forEach(function(key) {
if ('function' == typeof getStatsParser[key]) try {
getStatsParser[key](result);
} catch (e) {
console.error(e.message, e.stack, e);
}
});
});
try {
if (-1 !== peer.iceConnectionState.search(/failed|closed|disconnected/gi)) nomore = true;
} catch (e) {
nomore = true;
}
if (true === nomore) {
if (getStatsResult.datachannel) getStatsResult.datachannel.state = 'close';
getStatsResult.ended = true;
}
getStatsResult.results = results;
if (getStatsResult.audio && getStatsResult.video) {
getStatsResult.bandwidth.speed = getStatsResult.audio.bytesSent - getStatsResult.bandwidth.helper.audioBytesSent + (getStatsResult.video.bytesSent - getStatsResult.bandwidth.helper.videoBytesSent);
getStatsResult.bandwidth.helper.audioBytesSent = getStatsResult.audio.bytesSent;
getStatsResult.bandwidth.helper.videoBytesSent = getStatsResult.video.bytesSent;
}
callback(getStatsResult);
if (!nomore) interval && setTimeout(getStatsLooper, interval || 1000);
});
}
function getStatsWrapper(cb) {
peer.getStats(window.mediaStreamTrack || null).then(function(res) {
var items = [];
res.forEach(function(r) {
items.push(r);
});
cb(items);
}).catch(cb);
}
getStatsParser.datachannel = function(result) {
if ('datachannel' !== result.type) return;
getStatsResult.datachannel = {
state: result.state
};
};
getStatsParser.googCertificate = function(result) {
if ('googCertificate' == result.type) getStatsResult.encryption = result.googFingerprintAlgorithm;
if ('certificate' == result.type) getStatsResult.encryption = result.fingerprintAlgorithm;
};
getStatsParser.checkAudioTracks = function(result) {
if ('audio' !== result.mediaType) return;
var sendrecvType = getStatsResult.internal.getSendrecvType(result);
if (!sendrecvType) return;
if (-1 === getStatsResult.audio[sendrecvType].codecs.indexOf(result.googCodecName || 'opus')) getStatsResult.audio[sendrecvType].codecs.push(result.googCodecName || 'opus');
if (!!result.bytesSent) {
var kilobytes = 0;
if (!getStatsResult.internal.audio[sendrecvType].prevBytesSent) getStatsResult.internal.audio[sendrecvType].prevBytesSent = result.bytesSent;
var bytes = result.bytesSent - getStatsResult.internal.audio[sendrecvType].prevBytesSent;
getStatsResult.internal.audio[sendrecvType].prevBytesSent = result.bytesSent;
kilobytes = bytes / 1024;
getStatsResult.audio[sendrecvType].availableBandwidth = kilobytes.toFixed(1);
getStatsResult.audio.bytesSent = kilobytes.toFixed(1);
}
if (!!result.bytesReceived) {
var kilobytes = 0;
if (!getStatsResult.internal.audio[sendrecvType].prevBytesReceived) getStatsResult.internal.audio[sendrecvType].prevBytesReceived = result.bytesReceived;
var bytes = result.bytesReceived - getStatsResult.internal.audio[sendrecvType].prevBytesReceived;
getStatsResult.internal.audio[sendrecvType].prevBytesReceived = result.bytesReceived;
kilobytes = bytes / 1024;
getStatsResult.audio.bytesReceived = kilobytes.toFixed(1);
}
if (result.googTrackId && -1 === getStatsResult.audio[sendrecvType].tracks.indexOf(result.googTrackId)) getStatsResult.audio[sendrecvType].tracks.push(result.googTrackId);
if (!!result.googCurrentDelayMs) {
var kilobytes = 0;
if (!getStatsResult.internal.audio.prevGoogCurrentDelayMs) getStatsResult.internal.audio.prevGoogCurrentDelayMs = result.googCurrentDelayMs;
var bytes = result.googCurrentDelayMs - getStatsResult.internal.audio.prevGoogCurrentDelayMs;
getStatsResult.internal.audio.prevGoogCurrentDelayMs = result.googCurrentDelayMs;
getStatsResult.audio.latency = bytes.toFixed(1);
if (getStatsResult.audio.latency < 0) getStatsResult.audio.latency = 0;
}
if (!!result.packetsLost) {
var kilobytes = 0;
if (!getStatsResult.internal.audio.prevPacketsLost) getStatsResult.internal.audio.prevPacketsLost = result.packetsLost;
var bytes = result.packetsLost - getStatsResult.internal.audio.prevPacketsLost;
getStatsResult.internal.audio.prevPacketsLost = result.packetsLost;
getStatsResult.audio.packetsLost = bytes.toFixed(1);
if (getStatsResult.audio.packetsLost < 0) getStatsResult.audio.packetsLost = 0;
}
};
getStatsParser.checkVideoTracks = function(result) {
if ('video' !== result.mediaType) return;
var sendrecvType = getStatsResult.internal.getSendrecvType(result);
if (!sendrecvType) return;
if (-1 === getStatsResult.video[sendrecvType].codecs.indexOf(result.googCodecName || 'VP8')) getStatsResult.video[sendrecvType].codecs.push(result.googCodecName || 'VP8');
if (!!result.bytesSent) {
var kilobytes = 0;
if (!getStatsResult.internal.video[sendrecvType].prevBytesSent) getStatsResult.internal.video[sendrecvType].prevBytesSent = result.bytesSent;
var bytes = result.bytesSent - getStatsResult.internal.video[sendrecvType].prevBytesSent;
getStatsResult.internal.video[sendrecvType].prevBytesSent = result.bytesSent;
kilobytes = bytes / 1024;
getStatsResult.video[sendrecvType].availableBandwidth = kilobytes.toFixed(1);
getStatsResult.video.bytesSent = kilobytes.toFixed(1);
}
if (!!result.bytesReceived) {
var kilobytes = 0;
if (!getStatsResult.internal.video[sendrecvType].prevBytesReceived) getStatsResult.internal.video[sendrecvType].prevBytesReceived = result.bytesReceived;
var bytes = result.bytesReceived - getStatsResult.internal.video[sendrecvType].prevBytesReceived;
getStatsResult.internal.video[sendrecvType].prevBytesReceived = result.bytesReceived;
kilobytes = bytes / 1024;
getStatsResult.video.bytesReceived = kilobytes.toFixed(1);
}
if (result.googFrameHeightReceived && result.googFrameWidthReceived) {
getStatsResult.resolutions[sendrecvType].width = result.googFrameWidthReceived;
getStatsResult.resolutions[sendrecvType].height = result.googFrameHeightReceived;
}
if (result.googFrameHeightSent && result.googFrameWidthSent) {
getStatsResult.resolutions[sendrecvType].width = result.googFrameWidthSent;
getStatsResult.resolutions[sendrecvType].height = result.googFrameHeightSent;
}
if (result.googTrackId && -1 === getStatsResult.video[sendrecvType].tracks.indexOf(result.googTrackId)) getStatsResult.video[sendrecvType].tracks.push(result.googTrackId);
if (result.framerateMean) {
getStatsResult.bandwidth.framerateMean = result.framerateMean;
var kilobytes = 0;
if (!getStatsResult.internal.video[sendrecvType].prevFramerateMean) getStatsResult.internal.video[sendrecvType].prevFramerateMean = result.bitrateMean;
var bytes = result.bytesSent - getStatsResult.internal.video[sendrecvType].prevFramerateMean;
getStatsResult.internal.video[sendrecvType].prevFramerateMean = result.framerateMean;
kilobytes = bytes / 1024;
getStatsResult.video[sendrecvType].framerateMean = bytes.toFixed(1);
}
if (result.bitrateMean) {
getStatsResult.bandwidth.bitrateMean = result.bitrateMean;
var kilobytes = 0;
if (!getStatsResult.internal.video[sendrecvType].prevBitrateMean) getStatsResult.internal.video[sendrecvType].prevBitrateMean = result.bitrateMean;
var bytes = result.bytesSent - getStatsResult.internal.video[sendrecvType].prevBitrateMean;
getStatsResult.internal.video[sendrecvType].prevBitrateMean = result.bitrateMean;
kilobytes = bytes / 1024;
getStatsResult.video[sendrecvType].bitrateMean = bytes.toFixed(1);
}
if (!!result.googCurrentDelayMs) {
var kilobytes = 0;
if (!getStatsResult.internal.video.prevGoogCurrentDelayMs) getStatsResult.internal.video.prevGoogCurrentDelayMs = result.googCurrentDelayMs;
var bytes = result.googCurrentDelayMs - getStatsResult.internal.video.prevGoogCurrentDelayMs;
getStatsResult.internal.video.prevGoogCurrentDelayMs = result.googCurrentDelayMs;
getStatsResult.video.latency = bytes.toFixed(1);
if (getStatsResult.video.latency < 0) getStatsResult.video.latency = 0;
}
if (!!result.packetsLost) {
var kilobytes = 0;
if (!getStatsResult.internal.video.prevPacketsLost) getStatsResult.internal.video.prevPacketsLost = result.packetsLost;
var bytes = result.packetsLost - getStatsResult.internal.video.prevPacketsLost;
getStatsResult.internal.video.prevPacketsLost = result.packetsLost;
getStatsResult.video.packetsLost = bytes.toFixed(1);
if (getStatsResult.video.packetsLost < 0) getStatsResult.video.packetsLost = 0;
}
};
getStatsParser.bweforvideo = function(result) {
if ('VideoBwe' !== result.type) return;
getStatsResult.bandwidth.availableSendBandwidth = result.googAvailableSendBandwidth;
getStatsResult.bandwidth.googActualEncBitrate = result.googActualEncBitrate;
getStatsResult.bandwidth.googAvailableSendBandwidth = result.googAvailableSendBandwidth;
getStatsResult.bandwidth.googAvailableReceiveBandwidth = result.googAvailableReceiveBandwidth;
getStatsResult.bandwidth.googRetransmitBitrate = result.googRetransmitBitrate;
getStatsResult.bandwidth.googTargetEncBitrate = result.googTargetEncBitrate;
getStatsResult.bandwidth.googBucketDelay = result.googBucketDelay;
getStatsResult.bandwidth.googTransmitBitrate = result.googTransmitBitrate;
};
getStatsParser.candidatePair = function(result) {
if ('googCandidatePair' !== result.type && 'candidate-pair' !== result.type && 'local-candidate' !== result.type && 'remote-candidate' !== result.type) return;
if ('true' == result.googActiveConnection) {
Object.keys(getStatsResult.internal.candidates).forEach(function(cid) {
var candidate = getStatsResult.internal.candidates[cid];
if (-1 !== candidate.ipAddress.indexOf(result.googLocalAddress)) {
getStatsResult.connectionType.local.candidateType = candidate.candidateType;
getStatsResult.connectionType.local.ipAddress = candidate.ipAddress;
getStatsResult.connectionType.local.networkType = candidate.networkType;
getStatsResult.connectionType.local.transport = candidate.transport;
}
if (-1 !== candidate.ipAddress.indexOf(result.googRemoteAddress)) {
getStatsResult.connectionType.remote.candidateType = candidate.candidateType;
getStatsResult.connectionType.remote.ipAddress = candidate.ipAddress;
getStatsResult.connectionType.remote.networkType = candidate.networkType;
getStatsResult.connectionType.remote.transport = candidate.transport;
}
});
getStatsResult.connectionType.transport = result.googTransportType;
var localCandidate = getStatsResult.internal.candidates[result.localCandidateId];
if (localCandidate) {
if (localCandidate.ipAddress) getStatsResult.connectionType.systemIpAddress = localCandidate.ipAddress;
}
var remoteCandidate = getStatsResult.internal.candidates[result.remoteCandidateId];
if (remoteCandidate) {
if (remoteCandidate.ipAddress) getStatsResult.connectionType.systemIpAddress = remoteCandidate.ipAddress;
}
}
if ('candidate-pair' === result.type) {
if (true === result.selected && true === result.nominated && 'succeeded' === result.state) {
var localCandidate = getStatsResult.internal.candidates[result.remoteCandidateId];
var remoteCandidate = getStatsResult.internal.candidates[result.remoteCandidateId];
}
}
if ('local-candidate' === result.type) {
getStatsResult.connectionType.local.candidateType = result.candidateType;
getStatsResult.connectionType.local.ipAddress = result.ipAddress;
getStatsResult.connectionType.local.networkType = result.networkType;
getStatsResult.connectionType.local.transport = result.mozLocalTransport || result.transport;
}
if ('remote-candidate' === result.type) {
getStatsResult.connectionType.remote.candidateType = result.candidateType;
getStatsResult.connectionType.remote.ipAddress = result.ipAddress;
getStatsResult.connectionType.remote.networkType = result.networkType;
getStatsResult.connectionType.remote.transport = result.mozRemoteTransport || result.transport;
}
if (isSafari) {
var sendrecvType = result.localCandidateId ? 'send' : 'recv';
if (!sendrecvType) return;
if (!!result.bytesSent) {
var kilobytes = 0;
if (!getStatsResult.internal.video[sendrecvType].prevBytesSent) getStatsResult.internal.video[sendrecvType].prevBytesSent = result.bytesSent;
var bytes = result.bytesSent - getStatsResult.internal.video[sendrecvType].prevBytesSent;
getStatsResult.internal.video[sendrecvType].prevBytesSent = result.bytesSent;
kilobytes = bytes / 1024;
getStatsResult.video[sendrecvType].availableBandwidth = kilobytes.toFixed(1);
getStatsResult.video.bytesSent = kilobytes.toFixed(1);
}
if (!!result.bytesReceived) {
var kilobytes = 0;
if (!getStatsResult.internal.video[sendrecvType].prevBytesReceived) getStatsResult.internal.video[sendrecvType].prevBytesReceived = result.bytesReceived;
var bytes = result.bytesReceived - getStatsResult.internal.video[sendrecvType].prevBytesReceived;
getStatsResult.internal.video[sendrecvType].prevBytesReceived = result.bytesReceived;
kilobytes = bytes / 1024;
getStatsResult.video.bytesReceived = kilobytes.toFixed(1);
}
if (!!result.availableOutgoingBitrate) {
var kilobytes = 0;
if (!getStatsResult.internal.video[sendrecvType].prevAvailableOutgoingBitrate) getStatsResult.internal.video[sendrecvType].prevAvailableOutgoingBitrate = result.availableOutgoingBitrate;
var bytes = result.availableOutgoingBitrate - getStatsResult.internal.video[sendrecvType].prevAvailableOutgoingBitrate;
getStatsResult.internal.video[sendrecvType].prevAvailableOutgoingBitrate = result.availableOutgoingBitrate;
kilobytes = bytes / 1024;
getStatsResult.video.availableOutgoingBitrate = kilobytes.toFixed(1);
}
if (!!result.availableIncomingBitrate) {
var kilobytes = 0;
if (!getStatsResult.internal.video[sendrecvType].prevAvailableIncomingBitrate) getStatsResult.internal.video[sendrecvType].prevAvailableIncomingBitrate = result.availableIncomingBitrate;
var bytes = result.availableIncomingBitrate - getStatsResult.internal.video[sendrecvType].prevAvailableIncomingBitrate;
getStatsResult.internal.video[sendrecvType].prevAvailableIncomingBitrate = result.availableIncomingBitrate;
kilobytes = bytes / 1024;
getStatsResult.video.availableIncomingBitrate = kilobytes.toFixed(1);
}
}
};
var LOCAL_candidateType = {};
var LOCAL_transport = {};
var LOCAL_ipAddress = {};
var LOCAL_networkType = {};
getStatsParser.localcandidate = function(result) {
if ('localcandidate' !== result.type && 'local-candidate' !== result.type) return;
if (!result.id) return;
if (!LOCAL_candidateType[result.id]) LOCAL_candidateType[result.id] = [];
if (!LOCAL_transport[result.id]) LOCAL_transport[result.id] = [];
if (!LOCAL_ipAddress[result.id]) LOCAL_ipAddress[result.id] = [];
if (!LOCAL_networkType[result.id]) LOCAL_networkType[result.id] = [];
if (result.candidateType && -1 === LOCAL_candidateType[result.id].indexOf(result.candidateType)) LOCAL_candidateType[result.id].push(result.candidateType);
if (result.transport && -1 === LOCAL_transport[result.id].indexOf(result.transport)) LOCAL_transport[result.id].push(result.transport);
if (result.ipAddress && -1 === LOCAL_ipAddress[result.id].indexOf(result.ipAddress + ':' + result.portNumber)) LOCAL_ipAddress[result.id].push(result.ipAddress + ':' + result.portNumber);
if (result.networkType && -1 === LOCAL_networkType[result.id].indexOf(result.networkType)) LOCAL_networkType[result.id].push(result.networkType);
getStatsResult.internal.candidates[result.id] = {
candidateType: LOCAL_candidateType[result.id],
ipAddress: LOCAL_ipAddress[result.id],
portNumber: result.portNumber,
networkType: LOCAL_networkType[result.id],
priority: result.priority,
transport: LOCAL_transport[result.id],
timestamp: result.timestamp,
id: result.id,
type: result.type
};
getStatsResult.connectionType.local.candidateType = LOCAL_candidateType[result.id];
getStatsResult.connectionType.local.ipAddress = LOCAL_ipAddress[result.id];
getStatsResult.connectionType.local.networkType = LOCAL_networkType[result.id];
getStatsResult.connectionType.local.transport = LOCAL_transport[result.id];
};
var REMOTE_candidateType = {};
var REMOTE_transport = {};
var REMOTE_ipAddress = {};
var REMOTE_networkType = {};
getStatsParser.remotecandidate = function(result) {
if ('remotecandidate' !== result.