UNPKG

workano-js-sdk

Version:

Workano Communications SDK - A modern JavaScript SDK for WebRTC and VoIP integration.

792 lines 2.99 MB
/*! 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.