@webex/plugin-meetings 2.18.0 → 2.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +0 -300
  2. package/dist/constants.js +3 -206
  3. package/dist/constants.js.map +1 -1
  4. package/dist/meeting/effectsState.js +1 -2
  5. package/dist/meeting/effectsState.js.map +1 -1
  6. package/dist/meeting/index.js +366 -496
  7. package/dist/meeting/index.js.map +1 -1
  8. package/dist/meeting/util.js +4 -213
  9. package/dist/meeting/util.js.map +1 -1
  10. package/dist/meetings/index.js +0 -28
  11. package/dist/meetings/index.js.map +1 -1
  12. package/dist/statsAnalyzer/index.js +145 -86
  13. package/dist/statsAnalyzer/index.js.map +1 -1
  14. package/package.json +6 -8
  15. package/src/constants.ts +1 -214
  16. package/src/meeting/effectsState.js +1 -2
  17. package/src/meeting/index.js +120 -213
  18. package/src/meeting/util.js +4 -252
  19. package/src/meetings/index.js +0 -22
  20. package/src/statsAnalyzer/index.js +164 -99
  21. package/test/integration/spec/journey.js +2 -67
  22. package/test/unit/spec/meeting/effectsState.js +2 -1
  23. package/test/unit/spec/meeting/index.js +88 -29
  24. package/test/unit/spec/meeting/utils.js +0 -2
  25. package/test/unit/spec/stats-analyzer/index.js +209 -1
  26. package/dist/analyzer/analyzer.js +0 -113
  27. package/dist/analyzer/analyzer.js.map +0 -1
  28. package/dist/analyzer/calculator.js +0 -87
  29. package/dist/analyzer/calculator.js.map +0 -1
  30. package/dist/metrics/mqa-processor.js +0 -170
  31. package/dist/metrics/mqa-processor.js.map +0 -1
  32. package/dist/stats/data.js +0 -93
  33. package/dist/stats/data.js.map +0 -1
  34. package/dist/stats/events.js +0 -222
  35. package/dist/stats/events.js.map +0 -1
  36. package/dist/stats/filter.js +0 -84
  37. package/dist/stats/filter.js.map +0 -1
  38. package/dist/stats/history.js +0 -147
  39. package/dist/stats/history.js.map +0 -1
  40. package/dist/stats/index.js +0 -425
  41. package/dist/stats/index.js.map +0 -1
  42. package/dist/stats/metrics.js +0 -112
  43. package/dist/stats/metrics.js.map +0 -1
  44. package/dist/stats/stats.js +0 -592
  45. package/dist/stats/stats.js.map +0 -1
  46. package/dist/stats/stream.js +0 -156
  47. package/dist/stats/stream.js.map +0 -1
  48. package/dist/stats/transformer.js +0 -126
  49. package/dist/stats/transformer.js.map +0 -1
  50. package/dist/stats/util.js +0 -64
  51. package/dist/stats/util.js.map +0 -1
  52. package/src/analyzer/analyzer.js +0 -78
  53. package/src/analyzer/calculator.js +0 -77
  54. package/src/metrics/mqa-processor.js +0 -118
  55. package/src/stats/data.js +0 -56
  56. package/src/stats/events.js +0 -185
  57. package/src/stats/filter.js +0 -40
  58. package/src/stats/history.js +0 -107
  59. package/src/stats/index.js +0 -320
  60. package/src/stats/metrics.js +0 -95
  61. package/src/stats/stats.js +0 -477
  62. package/src/stats/stream.js +0 -108
  63. package/src/stats/transformer.js +0 -109
  64. package/src/stats/util.js +0 -44
@@ -1 +1 @@
1
- {"version":3,"names":["StatsAnalyzer","config","networkQualityMonitor","statsResults","defaultStats","result","type","isSender","isRemote","id","RemoteCandidateType","RemoteTransport","RemoteIpAddress","RemoteNetworkType","sendRecvType","STATS","SEND_DIRECTION","RECEIVE_DIRECTION","ipType","REMOTE","LOCAL","candidateType","indexOf","push","protocol","toUpperCase","ip","portNumber","networkType","internal","candidates","ipAddress","port","priority","transport","timestamp","time","connectionType","NETWORK_TYPE","VPN","UNKNOWN","totalRoundTripTime","statsStarted","lastStatsResults","correlationId","mqaSentCount","lastMqaDataSent","resolutions","video","send","recv","audio","share","localMQEStats","RX","packetsLost","jitter","latency","bitRate","TX","frameRate","resolutionWidth","resolutionHeight","requestedKeyFrame","receivedKeyFrame","lastMqa","audioReceive","common","mediaHopByHopLost","streams","rtpJitter","roundTripTime","receivedBitrate","audioTransmit","remoteLossRate","remoteJitter","transmittedBitrate","videoReceive","receivedFrameRate","receivedWidth","receivedHeight","videoTransmit","transmittedFrameRate","transmittedWidth","transmittedHeight","requestedKeyFrames","meanRemoteJitter","meanRtpJitter","meanRoundTripTime","status","meetingMediaStatus","audioReceiver","mqaData","intervals","audioSender","videoReceiver","videoSender","shareSender","shareReceiver","getAudioSenderMqa","getAudioReceiverMqa","getVideoReceiverMqa","getVideoSenderMqa","isShareStream","intervalMetadata","peerReflexiveIP","local","peripherals","information","_UNKNOWN_","name","MEDIA_DEVICES","SPEAKER","peerConnection","audioTransceiver","sender","track","label","MICROPHONE","videoTransceiver","CAMERA","intervalNumber","populateResults","resetStatsResults","emit","file","function","EVENT_TRIGGERS","MEDIA_QUALITY","data","getStatsAndParse","statsInterval","setInterval","analyzerInterval","sendMqaData","mqaInterval","MQA_INTEVAL","clearInterval","statsInterva","undefined","getStatsResult","processOutboundRTPResult","processInboundRTPResult","processTrackResult","compareSentAndReceived","parseCandidate","parseAudioSource","getStatsResults","types","DEFAULT_GET_STATS_FILTER","forEach","includes","parseGetStatsResult","AUDIO_CORRELATE","audioLevel","totalAudioEnergy","mediaType","currentStats","previousStats","expected","sendAudio","totalPacketsSent","LoggerProxy","logger","info","MEETING_MEDIA_LOCAL_STARTED","AUDIO","receiveAudio","totalPacketsReceived","totalSamplesReceived","VIDEO_CORRELATE","sendVideo","framesEncoded","framesSent","VIDEO","receiveVideo","framesReceived","framesDecoded","framesDropped","SHARE_CORRELATE","sendShare","connectionState","CONNECTION_STATE","FAILED","trace","getStats","then","res","filterAndParseGetStatsResults","receiver","shareTransceiver","direction","currentDirection","compareLastStatsResult","JSON","parse","sendrecvType","bytesSent","kilobytes","prevBytesSent","keyFramesEncoded","bytes","availableBandwidth","toFixed","outboundRtpId","packetsSent","totalKeyFramesEncoded","totalNackCount","nackCount","totalPliCount","pliCount","totalFirCount","firCount","encoderImplementation","qualityLimitationReason","qualityLimitationResolutionChanges","retransmittedPacketsSent","totalBytesSent","headerBytesSent","retransmittedBytesSent","bytesReceived","prevBytesReceived","packetsReceived","lastPacketReceivedTimestamp","currentPacketsLost","currentPacketLossRatio","totalPacketsLost","keyFramesDecoded","decoderImplementation","fecPacketsDiscarded","fecPacketsReceived","totalBytesReceived","headerBytesReceived","totalSamplesDecoded","concealedSamples","remoteSource","frameWidth","frameHeight","width","height","hugeFramesSent","trackIdentifier","jitterBufferDelay","jitterBufferEmittedCount","avgJitterDelay","totalPacketsLostOnReceiver","currentPacketLoss","packetsLostOnReceiver","ssrc","reportsReceived","overAllPacketLossRatio","maxPacketLossRatio","determineUplinkNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","EventsScope"],"sources":["index.js"],"sourcesContent":["import {cloneDeep} from 'lodash';\n\nimport EventsScope from '../common/events/events-scope';\nimport {EVENT_TRIGGERS,\n DEFAULT_GET_STATS_FILTER, CONNECTION_STATE, STATS, MQA_INTEVAL, NETWORK_TYPE, MEDIA_DEVICES, _UNKNOWN_} from '../constants';\nimport mqaData from '../mediaQualityMetrics/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport defaultStats from './global';\nimport {\n getAudioSenderMqa,\n getAudioReceiverMqa,\n getVideoSenderMqa,\n getVideoReceiverMqa\n} from './mqaUtil';\n\n\n/**\n * Meeting High Packet Loss Event\n * Emitted when ever there is high packet loss detected\n * @event meeting:highPacketLoss\n * @type {Object}\n * @property {String} mediaType Type of media experiencing packet loss\n * @property {Number} packetLossRatio current packet loss ratio\n * @memberof StatsAnalyzer\n */\n\n/**\n * Stats Analyzer class that will emit events based on detected quality\n *\n * @export\n * @class StatsAnalyzer\n * @extends {EventsScope}\n */\nexport default class StatsAnalyzer extends EventsScope {\n /**\n * Creates a new instance of StatsAnalyzer\n * @constructor\n * @public\n * @param {Object} config SDK Configuration Object\n * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)\n * @param {Object} statsResults Default properties for stats\n */\n constructor(config, networkQualityMonitor = {}, statsResults = defaultStats) {\n super();\n this.statsStarted = false;\n this.statsResults = statsResults;\n this.lastStatsResults = null;\n this.config = config;\n this.networkQualityMonitor = networkQualityMonitor;\n this.correlationId = config.correlationId;\n this.mqaSentCount = -1;\n this.lastMqaDataSent = {\n resolutions: {video: {send: {}, recv: {}}, audio: {send: {}, recv: {}}, share: {send: {}, recv: {}}},\n video: {send: {}, recv: {}},\n audio: {send: {}, recv: {}},\n share: {send: {}, recv: {}}\n };\n this.localMQEStats = {\n audio: {\n RX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: []\n },\n TX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: []\n }\n },\n video: {\n RX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: [],\n frameRate: [],\n resolutionWidth: [],\n resolutionHeight: [],\n requestedKeyFrame: [],\n receivedKeyFrame: []\n },\n TX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: [],\n frameRate: [],\n resolutionWidth: [],\n resolutionHeight: [],\n requestedKeyFrame: [],\n receivedKeyFrame: []\n }\n }\n };\n }\n\n populateResults(lastMqa) {\n // Audio\n\n this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);\n this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);\n this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);\n this.localMQEStats.audio.RX.bitRate.push(lastMqa.audioReceive[0].streams[0].common.receivedBitrate);\n\n this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);\n this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);\n this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);\n this.localMQEStats.audio.TX.bitRate.push(lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate);\n\n // Video\n\n this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);\n this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);\n this.localMQEStats.video.RX.latency.push(lastMqa.videoReceive[0].streams[0].common.roundTripTime);\n this.localMQEStats.video.RX.bitRate.push(lastMqa.videoReceive[0].streams[0].common.receivedBitrate);\n this.localMQEStats.video.RX.frameRate.push(lastMqa.videoReceive[0].streams[0].common.receivedFrameRate);\n this.localMQEStats.video.RX.resolutionWidth.push(lastMqa.videoReceive[0].streams[0].receivedWidth);\n this.localMQEStats.video.RX.resolutionHeight.push(lastMqa.videoReceive[0].streams[0].receivedHeight);\n this.localMQEStats.video.RX.requestedKeyFrame.push();\n this.localMQEStats.video.RX.receivedKeyFrame.push();\n\n this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);\n this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);\n this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);\n this.localMQEStats.video.TX.bitRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate);\n this.localMQEStats.video.TX.frameRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate);\n this.localMQEStats.video.TX.resolutionWidth.push(lastMqa.videoTransmit[0].streams[0].transmittedWidth);\n this.localMQEStats.video.TX.resolutionHeight.push(lastMqa.videoTransmit[0].streams[0].transmittedHeight);\n this.localMQEStats.video.TX.requestedKeyFrame.push(lastMqa.videoTransmit[0].streams[0].requestedKeyFrames);\n this.localMQEStats.video.TX.receivedKeyFrame.push();\n }\n\n\n resetStatsResults() {\n this.statsResults.audio.send.meanRemoteJitter = [];\n this.statsResults.video.send.meanRemoteJitter = [];\n this.statsResults.share.send.meanRemoteJitter = [];\n\n this.statsResults.audio.recv.meanRtpJitter = [];\n\n // TODO: currently no values are present\n this.statsResults.video.recv.meanRtpJitter = [];\n this.statsResults.share.recv.meanRtpJitter = [];\n\n // Reset the roundTripTime\n this.statsResults.audio.send.meanRoundTripTime = [];\n this.statsResults.video.send.meanRoundTripTime = [];\n this.statsResults.share.send.meanRoundTripTime = [];\n }\n\n /**\n * sets mediaStatus status for analyzing metrics\n *\n * @public\n * @param {Object} status for the audio and video\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n updateMediaStatus(status) {\n this.meetingMediaStatus = status;\n }\n\n /**\n * captures MQA data from peerconnection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n sendMqaData() {\n const audioReceiver = mqaData.intervals[0].audioReceive[0];\n const audioSender = mqaData.intervals[0].audioTransmit[0];\n const videoReceiver = mqaData.intervals[0].videoReceive[0];\n const videoSender = mqaData.intervals[0].videoTransmit[0];\n const shareSender = mqaData.intervals[0].videoTransmit[1];\n const shareReceiver = mqaData.intervals[0].videoReceive[1];\n\n getAudioSenderMqa({\n audioSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n getAudioReceiverMqa({\n audioReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n\n getVideoReceiverMqa({\n videoReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n getVideoSenderMqa({\n videoSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n\n // Capture mqa for share scenario\n\n getVideoSenderMqa({\n videoSender: shareSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n isShareStream: true\n });\n\n getVideoReceiverMqa({\n videoReceiver: shareReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n isShareStream: true\n });\n\n mqaData.intervals[0].intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];\n\n // Adding peripheral information\n mqaData.intervals[0].intervalMetadata.peripherals = [];\n mqaData.intervals[0].intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});\n mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.peerConnection?.audioTransceiver?.sender?.track?.label || _UNKNOWN_, name: MEDIA_DEVICES.MICROPHONE});\n mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.peerConnection?.videoTransceiver?.sender?.track?.label || _UNKNOWN_, name: MEDIA_DEVICES.CAMERA});\n\n\n mqaData.networkType = this.statsResults.connectionType.local.networkType;\n\n this.mqaSentCount += 1;\n\n mqaData.intervals[0].intervalNumber = this.mqaSentCount;\n\n // DO Deep copy, for some reason it takes the reference all the time rather then old value set\n this.lastMqaDataSent = cloneDeep(this.statsResults);\n\n this.populateResults(mqaData.intervals[0]);\n\n this.resetStatsResults();\n\n this.emit(\n {\n file: 'statsAnalyzer',\n function: 'sendMqaData'\n },\n EVENT_TRIGGERS.MEDIA_QUALITY,\n {\n data: mqaData.intervals[0],\n networkType: mqaData.networkType\n }\n );\n }\n\n /**\n * updated the peerconnection when changed\n *\n * @private\n * @memberof updatePeerconnection\n * @param {PeerConnection} peerConnection\n * @returns {void}\n */\n updatePeerconnection(peerConnection) {\n this.peerConnection = peerConnection;\n }\n\n /**\n * Starts the stats analyzer on interval\n *\n * @public\n * @memberof StatsAnalyzer\n * @param {PeerConnection} peerConnection\n * @returns {void}\n */\n startAnalyzer(peerConnection) {\n if (!this.statsStarted) {\n this.statsStarted = true;\n this.peerConnection = peerConnection;\n this.getStatsAndParse();\n this.statsInterval = setInterval(() => {\n this.getStatsAndParse();\n }, this.config.analyzerInterval);\n // Trigger initial fetch\n this.sendMqaData();\n this.mqaInterval = setInterval(() => {\n this.sendMqaData();\n }, MQA_INTEVAL);\n }\n }\n\n /**\n * Cleans up the analyzer when done\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n stopAnalyzer() {\n if (this.statsInterval) {\n this.getStatsAndParse();\n clearInterval(this.statsInterval);\n this.statsInterva = undefined;\n }\n\n if (this.mqaInterval) {\n this.sendMqaData();\n clearInterval(this.mqaInterval);\n this.statsInterva = undefined;\n }\n this.peerConnection = null;\n }\n\n /**\n * Parse a single result of get stats\n *\n * @private\n * @param {*} getStatsResult\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n parseGetStatsResult(getStatsResult, type, isSender) {\n if (!getStatsResult) {\n return;\n }\n\n switch (getStatsResult.type) {\n case 'outbound-rtp':\n this.processOutboundRTPResult(getStatsResult, type);\n break;\n case 'inbound-rtp':\n this.processInboundRTPResult(getStatsResult, type);\n break;\n case 'track':\n this.processTrackResult(getStatsResult, type);\n break;\n case 'remote-inbound-rtp':\n case 'remote-outbound-rtp':\n this.compareSentAndReceived(getStatsResult, type, isSender);\n break;\n case 'remotecandidate':\n case 'remote-candidate':\n this.parseCandidate(getStatsResult, type, isSender, true);\n break;\n case 'local-candidate':\n this.parseCandidate(getStatsResult, type, isSender, false);\n break;\n case 'media-source':\n this.parseAudioSource(getStatsResult, type);\n break;\n default:\n break;\n }\n }\n\n /**\n * Filters the get stats results for types\n * @private\n * @param {Array} getStatsResults\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n */\n filterAndParseGetStatsResults(getStatsResults, type, isSender) {\n const {types} = DEFAULT_GET_STATS_FILTER;\n\n getStatsResults.forEach((result) => {\n if (types.includes(result.type)) {\n this.parseGetStatsResult(result, type, isSender);\n }\n });\n }\n\n /**\n * parse the audio\n * @param {String} result\n * @param {boolean} type\n * @returns {void}\n */\n parseAudioSource(result, type) {\n if (!result) {\n return;\n }\n\n if (type === STATS.AUDIO_CORRELATE) {\n this.statsResults[type].send.audioLevel = result.audioLevel;\n this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;\n }\n }\n\n /**\n * compares current and previous stats to check if packets are not sent\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n compareLastStatsResult() {\n if (this.lastStatsResults !== null && this.meetingMediaStatus) {\n // compare audio stats sent\n let mediaType = STATS.AUDIO_CORRELATE;\n let currentStats = null;\n let previousStats = null;\n\n if (this.meetingMediaStatus.expected.sendAudio) {\n currentStats = this.statsResults[mediaType].send;\n previousStats = this.lastStatsResults[mediaType].send;\n\n if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);\n }\n else {\n if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`);\n }\n\n if (currentStats.audioLevel === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`);\n }\n }\n\n if (previousStats.totalPacketsSent === 0 && currentStats.totalPacketsSent > 0) {\n this.emit(\n {\n file: 'statsAnalyzer/index',\n function: 'compareLastStatsResult'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n }\n }\n\n if (this.meetingMediaStatus.expected.receiveAudio) {\n // compare audio stats received\n currentStats = this.statsResults[mediaType].recv;\n previousStats = this.lastStatsResults[mediaType].recv;\n\n if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);\n }\n else if (currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||\n currentStats.totalSamplesReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`);\n }\n }\n\n mediaType = STATS.VIDEO_CORRELATE;\n if (this.meetingMediaStatus.expected.sendVideo) {\n // compare video stats sent\n currentStats = this.statsResults[mediaType].send;\n previousStats = this.lastStatsResults[mediaType].send;\n\n if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);\n }\n else {\n if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`);\n }\n }\n\n if (previousStats.framesSent === 0 && currentStats.framesSent > 0) {\n this.emit(\n {\n file: 'statsAnalyzer/index',\n function: 'compareLastStatsResult'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n }\n }\n\n\n if (this.meetingMediaStatus.expected.receiveVideo) {\n // compare video stats reveived\n\n currentStats = this.statsResults[mediaType].recv;\n previousStats = this.lastStatsResults[mediaType].recv;\n\n if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);\n }\n else {\n if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);\n }\n\n if (this.statsResults.resolutions[mediaType].recv.framesDecoded === this.lastStatsResults.resolutions[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);\n }\n }\n }\n\n mediaType = STATS.SHARE_CORRELATE;\n if (this.meetingMediaStatus.expected.sendShare) {\n // compare share stats sent\n\n currentStats = this.statsResults[mediaType].send;\n previousStats = this.lastStatsResults[mediaType].send;\n\n if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);\n }\n else {\n if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`);\n }\n }\n\n if (previousStats.framesSent === 0 && currentStats.framesSent > 0) {\n this.emit(\n {\n file: 'statsAnalyzer/index',\n function: 'compareLastStatsResult'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n }\n\n // TODO:need to check receive share value\n // compare share stats reveived\n currentStats = this.statsResults[mediaType].recv;\n previousStats = this.lastStatsResults[mediaType].recv;\n\n if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);\n }\n else {\n if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);\n }\n\n if (this.statsResults.resolutions[mediaType].recv.framesDecoded === this.lastStatsResults.resolutions[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);\n }\n }\n }\n }\n }\n\n /**\n * Does a `getStats` on all the transceivers and parses the results\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n getStatsAndParse() {\n if (!this.peerConnection) {\n return;\n }\n\n if (this.peerConnection && this.peerConnection.connectionState === CONNECTION_STATE.FAILED) {\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> PeerConnection is in failed state');\n\n return;\n }\n\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');\n this.peerConnection.videoTransceiver.sender.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.VIDEO_CORRELATE, true);\n });\n\n this.peerConnection.videoTransceiver.receiver.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.VIDEO_CORRELATE, false);\n });\n\n this.peerConnection.audioTransceiver.sender.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.AUDIO_CORRELATE, true);\n });\n\n this.peerConnection.audioTransceiver.receiver.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.AUDIO_CORRELATE, false);\n });\n\n // TODO: add checks for screen share\n this.peerConnection.shareTransceiver.sender.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, true);\n });\n\n this.peerConnection.shareTransceiver.receiver.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, false);\n });\n\n // updates the current direction of media\n this.statsResults[STATS.AUDIO_CORRELATE].direction = this.peerConnection.audioTransceiver.currentDirection;\n this.statsResults[STATS.VIDEO_CORRELATE].direction = this.peerConnection.videoTransceiver.currentDirection;\n this.statsResults[STATS.SHARE_CORRELATE].direction = this.peerConnection.shareTransceiver.currentDirection;\n\n // Process Stats results every 5 seconds\n this.compareLastStatsResult();\n\n // Save the last results to compare with the current\n // DO Deep copy, for some reason it takes the reference all the time rather then old value set\n this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));\n\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats');\n }\n\n /**\n * Processes OutboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n */\n processOutboundRTPResult(result, type) {\n const mediaType = type || STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n if (result.bytesSent) {\n let kilobytes = 0;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;\n }\n\n const bytes = result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n\n kilobytes = bytes / 1024;\n\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesSent = kilobytes;\n\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;\n this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded - this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;\n this.statsResults.internal[mediaType].outboundRtpId = result.id;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n\n // Data saved to send MQA metrics\n\n this.statsResults[mediaType][sendrecvType].totalKeyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].totalPacketsSent = result.packetsSent;\n this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].encoderImplementation = result.encoderImplementation;\n this.statsResults[mediaType][sendrecvType].qualityLimitationReason = result.qualityLimitationReason;\n this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges = result.qualityLimitationResolutionChanges;\n this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent = result.retransmittedPacketsSent;\n this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;\n this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;\n this.statsResults[mediaType][sendrecvType].retransmittedBytesSent = result.retransmittedBytesSent;\n }\n }\n\n\n /**\n * Processes InboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n */\n processInboundRTPResult(result, type) {\n const mediaType = type || STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n if (result.bytesReceived) {\n let kilobytes = 0;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {\n this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {\n this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {\n this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;\n }\n\n const bytes = result.bytesReceived - (this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived);\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;\n\n kilobytes = bytes / 1024;\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);\n\n this.statsResults[mediaType][sendrecvType].pliCount = result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;\n this.statsResults[mediaType][sendrecvType].currentPacketsLost = result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;\n if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {\n this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsReceived = result.packetsReceived - this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `, this.statsResults[mediaType][sendrecvType].packetsReceived);\n }\n\n // Check the over all packet Lost ratio\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0 ? this.statsResults[mediaType][sendrecvType].currentPacketsLost / (this.statsResults[mediaType][sendrecvType].packetsReceived + this.statsResults[mediaType][sendrecvType].currentPacketsLost) : 0;\n if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {\n LoggerProxy.logger.info('StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ', this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);\n }\n\n // TODO: check the packet loss value is negative values here\n\n if (result.packetsLost) {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;\n }\n else {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;\n\n // From Thin\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;\n\n this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n\n this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;\n this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;\n this.statsResults[mediaType][sendrecvType].headerBytesReceived = result.headerBytesReceived;\n\n this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter);\n\n // Audio stats\n\n this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;\n this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;\n this.statsResults[mediaType][sendrecvType].totalSamplesReceived = result.totalSamplesReceived || 0;\n this.statsResults[mediaType][sendrecvType].totalSamplesDecoded = result.totalSamplesDecoded || 0;\n this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;\n }\n }\n\n /**\n * Processes remote and local candidate result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @param {boolean} isSender\n * @param {boolean} isRemote\n *\n * @returns {void}\n */\n parseCandidate = (result, type, isSender, isRemote) => {\n if (!result || !result.id) {\n return;\n }\n const RemoteCandidateType = {};\n const RemoteTransport = {};\n const RemoteIpAddress = {};\n const RemoteNetworkType = {};\n\n if (!result.id) return;\n\n const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;\n const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;\n\n if (!RemoteCandidateType[result.id]) {\n RemoteCandidateType[result.id] = [];\n }\n\n if (!RemoteTransport[result.id]) {\n RemoteTransport[result.id] = [];\n }\n\n if (!RemoteIpAddress[result.id]) {\n RemoteIpAddress[result.id] = [];\n }\n if (!RemoteNetworkType[result.id]) {\n RemoteNetworkType[result.id] = [];\n }\n\n if (result.candidateType && RemoteCandidateType[result.id].indexOf(result.candidateType) === -1) {\n RemoteCandidateType[result.id].push(result.candidateType);\n }\n\n if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {\n RemoteTransport[result.id].push(result.protocol.toUpperCase());\n }\n\n if (result.ip && RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1) {\n RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports\n }\n\n if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {\n RemoteNetworkType[result.id].push(result.networkType);\n }\n\n this.statsResults.internal.candidates[result.id] = {\n candidateType: RemoteCandidateType[result.id],\n ipAddress: RemoteIpAddress[result.id],\n portNumber: result.port,\n networkType: RemoteNetworkType[result.id],\n priority: result.priority,\n transport: RemoteTransport[result.id],\n timestamp: result.time,\n id: result.id,\n type: result.type\n };\n\n this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];\n this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];\n\n this.statsResults.connectionType[ipType].networkType = RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : RemoteNetworkType[result.id][0];\n this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];\n\n this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;\n };\n\n /**\n * Process Track results\n *\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n processTrackResult(result, mediaType) {\n if (!result || result.type !== 'track') {\n return;\n }\n if (result.type !== 'track') return;\n\n const sendrecvType = result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;\n }\n\n if (sendrecvType === STATS.RECEIVE_DIRECTION) {\n this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;\n }\n\n\n if (result.trackIdentifier && mediaType !== STATS.AUDIO_CORRELATE) {\n this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;\n\n const jitterBufferDelay = result && result.jitterBufferDelay;\n const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;\n\n this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay = jitterBufferEmittedCount && (+jitterBufferDelay / +jitterBufferEmittedCount);\n\n // Used to calculate the jitter\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay = result.jitterBufferDelay;\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount = result.jitterBufferEmittedCount;\n }\n }\n\n /**\n *\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n compareSentAndReceived(result, type) {\n if (!type) {\n return;\n }\n\n const mediaType = type;\n\n if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) { this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost; }\n\n const currentPacketLoss = result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;\n\n this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n\n this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);\n this.statsResults[mediaType].send.meanRoundTripTime.push(result.roundTripTime);\n\n this.statsResults[mediaType].send.timestamp = result.timestamp;\n this.statsResults[mediaType].send.ssrc = result.ssrc;\n this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;\n\n // Total packloss ratio on this video section of the call\n this.statsResults[mediaType].send.overAllPacketLossRatio = this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0 ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver / this.statsResults[mediaType].send.totalPacketsSent : 0;\n this.statsResults[mediaType].send.currentPacketLossRatio = this.statsResults[mediaType].send.packetsLostOnReceiver > 0 ? this.statsResults[mediaType].send.packetsLostOnReceiver * 100 / (this.statsResults[mediaType].send.packetsSent + this.statsResults[mediaType].send.packetsLostOnReceiver) : 0;\n\n if (this.statsResults[mediaType].send.maxPacketLossRatio < this.statsResults[mediaType].send.currentPacketLossRatio) {\n this.statsResults[mediaType].send.maxPacketLossRatio = this.statsResults[mediaType].send.currentPacketLossRatio;\n }\n\n if (result.type === 'remote-inbound-rtp') {\n this.networkQualityMonitor.determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults: result,\n statsAnalyzerCurrentStats: this.statsResults\n });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["EVENTS","MEDIA_QUALITY","LOCAL_MEDIA_STARTED","LOCAL_MEDIA_STOPPED","REMOTE_MEDIA_STARTED","REMOTE_MEDIA_STOPPED","StatsAnalyzer","config","networkQualityMonitor","statsResults","defaultStats","mediaType","previousValue","currentValue","isLocal","Error","undefined","lastEmittedEvent","lastEmittedStartStopEvent","local","remote","newEvent","emit","file","function","type","result","isSender","isRemote","id","RemoteCandidateType","RemoteTransport","RemoteIpAddress","RemoteNetworkType","sendRecvType","STATS","SEND_DIRECTION","RECEIVE_DIRECTION","ipType","REMOTE","LOCAL","candidateType","indexOf","push","protocol","toUpperCase","ip","portNumber","networkType","internal","candidates","ipAddress","port","priority","transport","timestamp","time","connectionType","NETWORK_TYPE","VPN","UNKNOWN","totalRoundTripTime","statsStarted","lastStatsResults","correlationId","mqaSentCount","lastMqaDataSent","resolutions","video","send","recv","audio","share","localMQEStats","RX","packetsLost","jitter","latency","bitRate","TX","frameRate","resolutionWidth","resolutionHeight","requestedKeyFrame","receivedKeyFrame","lastMqa","audioReceive","common","mediaHopByHopLost","streams","rtpJitter","roundTripTime","receivedBitrate","audioTransmit","remoteLossRate","remoteJitter","transmittedBitrate","videoReceive","receivedFrameRate","receivedWidth","receivedHeight","videoTransmit","transmittedFrameRate","transmittedWidth","transmittedHeight","requestedKeyFrames","meanRemoteJitter","meanRtpJitter","meanRoundTripTime","status","meetingMediaStatus","audioReceiver","mqaData","intervals","audioSender","videoReceiver","videoSender","shareSender","shareReceiver","getAudioSenderMqa","getAudioReceiverMqa","getVideoReceiverMqa","getVideoSenderMqa","isShareStream","intervalMetadata","peerReflexiveIP","peripherals","information","_UNKNOWN_","name","MEDIA_DEVICES","SPEAKER","peerConnection","audioTransceiver","sender","track","label","MICROPHONE","videoTransceiver","CAMERA","intervalNumber","populateResults","resetStatsResults","data","getStatsAndParse","then","statsInterval","setInterval","analyzerInterval","sendMqaData","mqaInterval","MQA_INTEVAL","resolve","sendOneLastMqa","clearInterval","getStatsResult","processOutboundRTPResult","processInboundRTPResult","processTrackResult","compareSentAndReceived","parseCandidate","parseAudioSource","getStatsResults","types","DEFAULT_GET_STATS_FILTER","forEach","includes","parseGetStatsResult","AUDIO_CORRELATE","audioLevel","totalAudioEnergy","currentStats","previousStats","expected","sendAudio","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","receiveAudio","totalPacketsReceived","totalSamplesReceived","VIDEO_CORRELATE","sendVideo","framesEncoded","framesSent","receiveVideo","framesReceived","framesDecoded","framesDropped","SHARE_CORRELATE","sendShare","connectionState","CONNECTION_STATE","FAILED","trace","all","getStats","res","filterAndParseGetStatsResults","receiver","shareTransceiver","direction","currentDirection","compareLastStatsResult","JSON","parse","sendrecvType","bytesSent","kilobytes","prevBytesSent","keyFramesEncoded","bytes","availableBandwidth","toFixed","outboundRtpId","packetsSent","totalKeyFramesEncoded","totalNackCount","nackCount","totalPliCount","pliCount","totalFirCount","firCount","encoderImplementation","qualityLimitationReason","qualityLimitationResolutionChanges","retransmittedPacketsSent","totalBytesSent","headerBytesSent","retransmittedBytesSent","bytesReceived","prevBytesReceived","packetsReceived","lastPacketReceivedTimestamp","currentPacketsLost","currentPacketLossRatio","totalPacketsLost","keyFramesDecoded","decoderImplementation","fecPacketsDiscarded","fecPacketsReceived","totalBytesReceived","headerBytesReceived","totalSamplesDecoded","concealedSamples","remoteSource","frameWidth","frameHeight","width","height","hugeFramesSent","trackIdentifier","jitterBufferDelay","jitterBufferEmittedCount","avgJitterDelay","totalPacketsLostOnReceiver","currentPacketLoss","packetsLostOnReceiver","ssrc","reportsReceived","overAllPacketLossRatio","maxPacketLossRatio","determineUplinkNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","EventsScope"],"sources":["index.js"],"sourcesContent":["import {cloneDeep} from 'lodash';\n\nimport EventsScope from '../common/events/events-scope';\nimport {DEFAULT_GET_STATS_FILTER, CONNECTION_STATE, STATS, MQA_INTEVAL, NETWORK_TYPE, MEDIA_DEVICES, _UNKNOWN_} from '../constants';\nimport mqaData from '../mediaQualityMetrics/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport defaultStats from './global';\nimport {\n getAudioSenderMqa,\n getAudioReceiverMqa,\n getVideoSenderMqa,\n getVideoReceiverMqa\n} from './mqaUtil';\n\nexport const EVENTS = {\n MEDIA_QUALITY: 'MEDIA_QUALITY',\n LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',\n LOCAL_MEDIA_STOPPED: 'LOCAL_MEDIA_STOPPED',\n REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',\n REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED',\n};\n\n/**\n * Stats Analyzer class that will emit events based on detected quality\n *\n * @export\n * @class StatsAnalyzer\n * @extends {EventsScope}\n */\nexport class StatsAnalyzer extends EventsScope {\n /**\n * Creates a new instance of StatsAnalyzer\n * @constructor\n * @public\n * @param {Object} config SDK Configuration Object\n * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)\n * @param {Object} statsResults Default properties for stats\n */\n constructor(config, networkQualityMonitor = {}, statsResults = defaultStats) {\n super();\n this.statsStarted = false;\n this.statsResults = statsResults;\n this.lastStatsResults = null;\n this.config = config;\n this.networkQualityMonitor = networkQualityMonitor;\n this.correlationId = config.correlationId;\n this.mqaSentCount = -1;\n this.lastMqaDataSent = {\n resolutions: {video: {send: {}, recv: {}}, audio: {send: {}, recv: {}}, share: {send: {}, recv: {}}},\n video: {send: {}, recv: {}},\n audio: {send: {}, recv: {}},\n share: {send: {}, recv: {}}\n };\n this.localMQEStats = {\n audio: {\n RX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: []\n },\n TX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: []\n }\n },\n video: {\n RX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: [],\n frameRate: [],\n resolutionWidth: [],\n resolutionHeight: [],\n requestedKeyFrame: [],\n receivedKeyFrame: []\n },\n TX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: [],\n frameRate: [],\n resolutionWidth: [],\n resolutionHeight: [],\n requestedKeyFrame: [],\n receivedKeyFrame: []\n }\n }\n };\n this.lastEmittedStartStopEvent = {\n audio: {\n local: undefined,\n remote: undefined,\n },\n video: {\n local: undefined,\n remote: undefined,\n },\n share: {\n local: undefined,\n remote: undefined,\n },\n };\n }\n\n populateResults(lastMqa) {\n // Audio\n\n this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);\n this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);\n this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);\n this.localMQEStats.audio.RX.bitRate.push(lastMqa.audioReceive[0].streams[0].common.receivedBitrate);\n\n this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);\n this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);\n this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);\n this.localMQEStats.audio.TX.bitRate.push(lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate);\n\n // Video\n\n this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);\n this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);\n this.localMQEStats.video.RX.latency.push(lastMqa.videoReceive[0].streams[0].common.roundTripTime);\n this.localMQEStats.video.RX.bitRate.push(lastMqa.videoReceive[0].streams[0].common.receivedBitrate);\n this.localMQEStats.video.RX.frameRate.push(lastMqa.videoReceive[0].streams[0].common.receivedFrameRate);\n this.localMQEStats.video.RX.resolutionWidth.push(lastMqa.videoReceive[0].streams[0].receivedWidth);\n this.localMQEStats.video.RX.resolutionHeight.push(lastMqa.videoReceive[0].streams[0].receivedHeight);\n this.localMQEStats.video.RX.requestedKeyFrame.push();\n this.localMQEStats.video.RX.receivedKeyFrame.push();\n\n this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);\n this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);\n this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);\n this.localMQEStats.video.TX.bitRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate);\n this.localMQEStats.video.TX.frameRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate);\n this.localMQEStats.video.TX.resolutionWidth.push(lastMqa.videoTransmit[0].streams[0].transmittedWidth);\n this.localMQEStats.video.TX.resolutionHeight.push(lastMqa.videoTransmit[0].streams[0].transmittedHeight);\n this.localMQEStats.video.TX.requestedKeyFrame.push(lastMqa.videoTransmit[0].streams[0].requestedKeyFrames);\n this.localMQEStats.video.TX.receivedKeyFrame.push();\n }\n\n\n resetStatsResults() {\n this.statsResults.audio.send.meanRemoteJitter = [];\n this.statsResults.video.send.meanRemoteJitter = [];\n this.statsResults.share.send.meanRemoteJitter = [];\n\n this.statsResults.audio.recv.meanRtpJitter = [];\n\n // TODO: currently no values are present\n this.statsResults.video.recv.meanRtpJitter = [];\n this.statsResults.share.recv.meanRtpJitter = [];\n\n // Reset the roundTripTime\n this.statsResults.audio.send.meanRoundTripTime = [];\n this.statsResults.video.send.meanRoundTripTime = [];\n this.statsResults.share.send.meanRoundTripTime = [];\n }\n\n /**\n * sets mediaStatus status for analyzing metrics\n *\n * @public\n * @param {Object} status for the audio and video\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n updateMediaStatus(status) {\n this.meetingMediaStatus = status;\n }\n\n /**\n * captures MQA data from peerconnection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n sendMqaData() {\n const audioReceiver = mqaData.intervals[0].audioReceive[0];\n const audioSender = mqaData.intervals[0].audioTransmit[0];\n const videoReceiver = mqaData.intervals[0].videoReceive[0];\n const videoSender = mqaData.intervals[0].videoTransmit[0];\n const shareSender = mqaData.intervals[0].videoTransmit[1];\n const shareReceiver = mqaData.intervals[0].videoReceive[1];\n\n getAudioSenderMqa({\n audioSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n getAudioReceiverMqa({\n audioReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n\n getVideoReceiverMqa({\n videoReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n getVideoSenderMqa({\n videoSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n\n // Capture mqa for share scenario\n\n getVideoSenderMqa({\n videoSender: shareSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n isShareStream: true\n });\n\n getVideoReceiverMqa({\n videoReceiver: shareReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n isShareStream: true\n });\n\n mqaData.intervals[0].intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];\n\n // Adding peripheral information\n mqaData.intervals[0].intervalMetadata.peripherals = [];\n mqaData.intervals[0].intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});\n mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.peerConnection?.audioTransceiver?.sender?.track?.label || _UNKNOWN_, name: MEDIA_DEVICES.MICROPHONE});\n mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.peerConnection?.videoTransceiver?.sender?.track?.label || _UNKNOWN_, name: MEDIA_DEVICES.CAMERA});\n\n\n mqaData.networkType = this.statsResults.connectionType.local.networkType;\n\n this.mqaSentCount += 1;\n\n mqaData.intervals[0].intervalNumber = this.mqaSentCount;\n\n // DO Deep copy, for some reason it takes the reference all the time rather then old value set\n this.lastMqaDataSent = cloneDeep(this.statsResults);\n\n this.populateResults(mqaData.intervals[0]);\n\n this.resetStatsResults();\n\n this.emit(\n {\n file: 'statsAnalyzer',\n function: 'sendMqaData'\n },\n EVENTS.MEDIA_QUALITY,\n {\n data: mqaData.intervals[0],\n networkType: mqaData.networkType\n }\n );\n }\n\n /**\n * updated the peerconnection when changed\n *\n * @private\n * @memberof updatePeerconnection\n * @param {PeerConnection} peerConnection\n * @returns {void}\n */\n updatePeerconnection(peerConnection) {\n this.peerConnection = peerConnection;\n }\n\n /**\n * Starts the stats analyzer on interval\n *\n * @public\n * @memberof StatsAnalyzer\n * @param {PeerConnection} peerConnection\n * @returns {Promise}\n */\n startAnalyzer(peerConnection) {\n if (!this.statsStarted) {\n this.statsStarted = true;\n this.peerConnection = peerConnection;\n\n return this.getStatsAndParse()\n .then(() => {\n this.statsInterval = setInterval(() => {\n this.getStatsAndParse();\n }, this.config.analyzerInterval);\n // Trigger initial fetch\n this.sendMqaData();\n this.mqaInterval = setInterval(() => {\n this.sendMqaData();\n }, MQA_INTEVAL);\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Cleans up the analyzer when done\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n stopAnalyzer() {\n const sendOneLastMqa = this.mqaInterval && this.statsInterval;\n\n if (this.statsInterval) {\n clearInterval(this.statsInterval);\n this.statsInterval = undefined;\n }\n\n if (this.mqaInterval) {\n clearInterval(this.mqaInterval);\n this.mqaInterval = undefined;\n }\n\n if (sendOneLastMqa) {\n return this.getStatsAndParse().then(() => {\n this.sendMqaData();\n this.peerConnection = null;\n });\n }\n this.peerConnection = null;\n\n return Promise.resolve();\n }\n\n /**\n * Parse a single result of get stats\n *\n * @private\n * @param {*} getStatsResult\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n parseGetStatsResult(getStatsResult, type, isSender) {\n if (!getStatsResult) {\n return;\n }\n\n switch (getStatsResult.type) {\n case 'outbound-rtp':\n this.processOutboundRTPResult(getStatsResult, type);\n break;\n case 'inbound-rtp':\n this.processInboundRTPResult(getStatsResult, type);\n break;\n case 'track':\n this.processTrackResult(getStatsResult, type);\n break;\n case 'remote-inbound-rtp':\n case 'remote-outbound-rtp':\n this.compareSentAndReceived(getStatsResult, type, isSender);\n break;\n case 'remotecandidate':\n case 'remote-candidate':\n this.parseCandidate(getStatsResult, type, isSender, true);\n break;\n case 'local-candidate':\n this.parseCandidate(getStatsResult, type, isSender, false);\n break;\n case 'media-source':\n this.parseAudioSource(getStatsResult, type);\n break;\n default:\n break;\n }\n }\n\n /**\n * Filters the get stats results for types\n * @private\n * @param {Array} getStatsResults\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n */\n filterAndParseGetStatsResults(getStatsResults, type, isSender) {\n const {types} = DEFAULT_GET_STATS_FILTER;\n\n getStatsResults.forEach((result) => {\n if (types.includes(result.type)) {\n this.parseGetStatsResult(result, type, isSender);\n }\n });\n }\n\n /**\n * parse the audio\n * @param {String} result\n * @param {boolean} type\n * @returns {void}\n */\n parseAudioSource(result, type) {\n if (!result) {\n return;\n }\n\n if (type === STATS.AUDIO_CORRELATE) {\n this.statsResults[type].send.audioLevel = result.audioLevel;\n this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;\n }\n }\n\n /**\n * emits started/stopped events for local/remote media by checking\n * if given values are increasing or not. The previousValue, currentValue\n * params can be any numerical value like number of receive packets or\n * decoded frames, etc.\n *\n * @private\n * @param {string} mediaType\n * @param {number} previousValue - value to compare\n * @param {number} currentValue - value to compare (must be same type of value as previousValue)\n * @param {boolean} isLocal - true if stats are for local media being sent out, false for remote media being received\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n emitStartStopEvents = (mediaType, previousValue, currentValue, isLocal) => {\n if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {\n throw new Error(`Unsupported mediaType: ${mediaType}`);\n }\n\n // eslint-disable-next-line no-param-reassign\n if (previousValue === undefined) previousValue = 0;\n // eslint-disable-next-line no-param-reassign\n if (currentValue === undefined) currentValue = 0;\n\n const lastEmittedEvent = isLocal ? this.lastEmittedStartStopEvent[mediaType].local : this.lastEmittedStartStopEvent[mediaType].remote;\n\n let newEvent;\n\n if ((currentValue - previousValue) > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;\n }\n else if ((currentValue === previousValue) && currentValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;\n }\n\n if (newEvent && lastEmittedEvent !== newEvent) {\n if (isLocal) {\n this.lastEmittedStartStopEvent[mediaType].local = newEvent;\n }\n else {\n this.lastEmittedStartStopEvent[mediaType].remote = newEvent;\n }\n this.emit(\n {\n file: 'statsAnalyzer/index',\n function: 'compareLastStatsResult'\n },\n newEvent,\n {\n type: mediaType\n }\n );\n }\n };\n\n /**\n * compares current and previous stats to check if packets are not sent\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n compareLastStatsResult() {\n if (this.lastStatsResults !== null && this.meetingMediaStatus) {\n // compare audio stats sent\n let mediaType = STATS.AUDIO_CORRELATE;\n let currentStats = null;\n let previousStats = null;\n\n if (this.meetingMediaStatus.expected.sendAudio) {\n currentStats = this.statsResults[mediaType].send;\n previousStats = this.lastStatsResults[mediaType].send;\n\n if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);\n }\n else {\n if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`);\n }\n\n if (currentStats.audioLevel === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`);\n }\n }\n\n this.emitStartStopEvents(mediaType, previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);\n }\n\n if (this.meetingMediaStatus.expected.receiveAudio) {\n // compare audio stats received\n currentStats = this.statsResults[mediaType].recv;\n previousStats = this.lastStatsResults[mediaType].recv;\n\n if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);\n }\n else if (currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||\n currentStats.totalSamplesReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`);\n }\n\n this.emitStartStopEvents(mediaType, previousStats.totalPacketsReceived, currentStats.totalPacketsReceived, false);\n }\n\n mediaType = STATS.VIDEO_CORRELATE;\n if (this.meetingMediaStatus.expected.sendVideo) {\n // compare video stats sent\n currentStats = this.statsResults[mediaType].send;\n previousStats = this.lastStatsResults[mediaType].send;\n\n if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);\n }\n else {\n if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`);\n }\n }\n\n this.emitStartStopEvents(\n mediaType,\n previousStats.framesSent,\n currentStats.framesSent,\n true\n );\n }\n\n\n if (this.meetingMediaStatus.expected.receiveVideo) {\n // compare video stats reveived\n\n currentStats = this.statsResults[mediaType].recv;\n previousStats = this.lastStatsResults[mediaType].recv;\n\n if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);\n }\n else {\n if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);\n }\n\n if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);\n }\n }\n\n this.emitStartStopEvents(\n mediaType,\n previousStats.framesDecoded,\n currentStats.framesDecoded,\n false\n );\n }\n\n mediaType = STATS.SHARE_CORRELATE;\n if (this.meetingMediaStatus.expected.sendShare) {\n // compare share stats sent\n\n currentStats = this.statsResults[mediaType].send;\n previousStats = this.lastStatsResults[mediaType].send;\n\n if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);\n }\n else {\n if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`);\n }\n }\n\n // TODO:need to check receive share value\n // compare share stats reveived\n currentStats = this.statsResults[mediaType].recv;\n previousStats = this.lastStatsResults[mediaType].recv;\n\n if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);\n }\n else {\n if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);\n }\n\n if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);\n }\n }\n\n // we are not calling emitStartStopEvents() for sending or receiving share because sharing is often started and stopped\n // in meetings and this.meetingMediaStatus.expected values can be out of sync with the actual packet flow\n // so we would send \"sharing stopped\" events incorrectly\n }\n }\n }\n\n /**\n * Does a `getStats` on all the transceivers and parses the results\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {Promise}\n */\n getStatsAndParse() {\n if (!this.peerConnection) {\n return Promise.resolve();\n }\n\n if (this.peerConnection && this.peerConnection.connectionState === CONNECTION_STATE.FAILED) {\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> PeerConnection is in failed state');\n\n return Promise.resolve();\n }\n\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');\n\n return Promise.all([\n this.peerConnection.videoTransceiver.sender.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.VIDEO_CORRELATE, true);\n }),\n\n this.peerConnection.videoTransceiver.receiver.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.VIDEO_CORRELATE, false);\n }),\n\n this.peerConnection.audioTransceiver.sender.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.AUDIO_CORRELATE, true);\n }),\n\n this.peerConnection.audioTransceiver.receiver.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.AUDIO_CORRELATE, false);\n }),\n\n // TODO: add checks for screen share\n this.peerConnection.shareTransceiver.sender.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, true);\n }),\n\n this.peerConnection.shareTransceiver.receiver.getStats().then((res) => {\n this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, false);\n }),\n\n ]).then(() => {\n this.statsResults[STATS.AUDIO_CORRELATE].direction = this.peerConnection.audioTransceiver.currentDirection;\n this.statsResults[STATS.VIDEO_CORRELATE].direction = this.peerConnection.videoTransceiver.currentDirection;\n this.statsResults[STATS.SHARE_CORRELATE].direction = this.peerConnection.shareTransceiver.currentDirection;\n\n // Process Stats results every 5 seconds\n this.compareLastStatsResult();\n\n // Save the last results to compare with the current\n this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));\n\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats');\n });\n }\n\n /**\n * Processes OutboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n */\n processOutboundRTPResult(result, type) {\n const mediaType = type || STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n if (result.bytesSent) {\n let kilobytes = 0;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;\n }\n\n const bytes = result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n\n kilobytes = bytes / 1024;\n\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesSent = kilobytes;\n\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;\n this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded - this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;\n this.statsResults.internal[mediaType].outboundRtpId = result.id;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n\n // Data saved to send MQA metrics\n\n this.statsResults[mediaType][sendrecvType].totalKeyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].totalPacketsSent = result.packetsSent;\n this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;\n this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].encoderImplementation = result.encoderImplementation;\n this.statsResults[mediaType][sendrecvType].qualityLimitationReason = result.qualityLimitationReason;\n this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges = result.qualityLimitationResolutionChanges;\n this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent = result.retransmittedPacketsSent;\n this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;\n this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;\n this.statsResults[mediaType][sendrecvType].retransmittedBytesSent = result.retransmittedBytesSent;\n }\n }\n\n\n /**\n * Processes InboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n */\n processInboundRTPResult(result, type) {\n const mediaType = type || STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n if (result.bytesReceived) {\n let kilobytes = 0;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {\n this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {\n this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {\n this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;\n }\n\n const bytes = result.bytesReceived - (this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived);\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;\n\n kilobytes = bytes / 1024;\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);\n\n this.statsResults[mediaType][sendrecvType].pliCount = result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;\n this.statsResults[mediaType][sendrecvType].currentPacketsLost = result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;\n if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {\n this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsReceived = result.packetsReceived - this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `, this.statsResults[mediaType][sendrecvType].packetsReceived);\n }\n\n // Check the over all packet Lost ratio\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0 ? this.statsResults[mediaType][sendrecvType].currentPacketsLost / (this.statsResults[mediaType][sendrecvType].packetsReceived + this.statsResults[mediaType][sendrecvType].currentPacketsLost) : 0;\n if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {\n LoggerProxy.logger.info('StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ', this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);\n }\n\n // TODO: check the packet loss value is negative values here\n\n if (result.packetsLost) {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;\n }\n else {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;\n\n // From Thin\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;\n\n this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n\n this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;\n this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;\n this.statsResults[mediaType][sendrecvType].headerBytesReceived = result.headerBytesReceived;\n\n this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter);\n\n // Audio stats\n\n this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;\n this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;\n this.statsResults[mediaType][sendrecvType].totalSamplesReceived = result.totalSamplesReceived || 0;\n this.statsResults[mediaType][sendrecvType].totalSamplesDecoded = result.totalSamplesDecoded || 0;\n this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;\n }\n }\n\n /**\n * Processes remote and local candidate result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @param {boolean} isSender\n * @param {boolean} isRemote\n *\n * @returns {void}\n */\n parseCandidate = (result, type, isSender, isRemote) => {\n if (!result || !result.id) {\n return;\n }\n const RemoteCandidateType = {};\n const RemoteTransport = {};\n const RemoteIpAddress = {};\n const RemoteNetworkType = {};\n\n if (!result.id) return;\n\n const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;\n const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;\n\n if (!RemoteCandidateType[result.id]) {\n RemoteCandidateType[result.id] = [];\n }\n\n if (!RemoteTransport[result.id]) {\n RemoteTransport[result.id] = [];\n }\n\n if (!RemoteIpAddress[result.id]) {\n RemoteIpAddress[result.id] = [];\n }\n if (!RemoteNetworkType[result.id]) {\n RemoteNetworkType[result.id] = [];\n }\n\n if (result.candidateType && RemoteCandidateType[result.id].indexOf(result.candidateType) === -1) {\n RemoteCandidateType[result.id].push(result.candidateType);\n }\n\n if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {\n RemoteTransport[result.id].push(result.protocol.toUpperCase());\n }\n\n if (result.ip && RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1) {\n RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports\n }\n\n if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {\n RemoteNetworkType[result.id].push(result.networkType);\n }\n\n this.statsResults.internal.candidates[result.id] = {\n candidateType: RemoteCandidateType[result.id],\n ipAddress: RemoteIpAddress[result.id],\n portNumber: result.port,\n networkType: RemoteNetworkType[result.id],\n priority: result.priority,\n transport: RemoteTransport[result.id],\n timestamp: result.time,\n id: result.id,\n type: result.type\n };\n\n this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];\n this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];\n\n this.statsResults.connectionType[ipType].networkType = RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : RemoteNetworkType[result.id][0];\n this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];\n\n this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;\n };\n\n /**\n * Process Track results\n *\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n processTrackResult(result, mediaType) {\n if (!result || result.type !== 'track') {\n return;\n }\n if (result.type !== 'track') return;\n\n const sendrecvType = result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;\n }\n\n if (sendrecvType === STATS.RECEIVE_DIRECTION) {\n this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;\n }\n\n\n if (result.trackIdentifier && mediaType !== STATS.AUDIO_CORRELATE) {\n this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;\n\n const jitterBufferDelay = result && result.jitterBufferDelay;\n const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;\n\n this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay = jitterBufferEmittedCount && (+jitterBufferDelay / +jitterBufferEmittedCount);\n\n // Used to calculate the jitter\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay = result.jitterBufferDelay;\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount = result.jitterBufferEmittedCount;\n }\n }\n\n /**\n *\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n compareSentAndReceived(result, type) {\n if (!type) {\n return;\n }\n\n const mediaType = type;\n\n if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) { this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost; }\n\n const currentPacketLoss = result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;\n\n this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n\n this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);\n this.statsResults[mediaType].send.meanRoundTripTime.push(result.roundTripTime);\n\n this.statsResults[mediaType].send.timestamp = result.timestamp;\n this.statsResults[mediaType].send.ssrc = result.ssrc;\n this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;\n\n // Total packloss ratio on this video section of the call\n this.statsResults[mediaType].send.overAllPacketLossRatio = this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0 ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver / this.statsResults[mediaType].send.totalPacketsSent : 0;\n this.statsResults[mediaType].send.currentPacketLossRatio = this.statsResults[mediaType].send.packetsLostOnReceiver > 0 ? this.statsResults[mediaType].send.packetsLostOnReceiver * 100 / (this.statsResults[mediaType].send.packetsSent + this.statsResults[mediaType].send.packetsLostOnReceiver) : 0;\n\n if (this.statsResults[mediaType].send.maxPacketLossRatio < this.statsResults[mediaType].send.currentPacketLossRatio) {\n this.statsResults[mediaType].send.maxPacketLossRatio = this.statsResults[mediaType].send.currentPacketLossRatio;\n }\n\n if (result.type === 'remote-inbound-rtp') {\n this.networkQualityMonitor.determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults: result,\n statsAnalyzerCurrentStats: this.statsResults\n });\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "2.18.0",
3
+ "version": "2.19.2",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "contributors": [
@@ -24,21 +24,19 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@babel/runtime-corejs2": "^7.14.8",
27
- "@webex/webex-core": "2.18.0",
28
- "@webex/internal-plugin-mercury": "2.18.0",
29
- "@webex/internal-plugin-conversation": "2.18.0",
27
+ "@webex/webex-core": "2.19.2",
28
+ "@webex/internal-plugin-mercury": "2.19.2",
29
+ "@webex/internal-plugin-conversation": "2.19.2",
30
30
  "webrtc-adapter": "^7.7.0",
31
31
  "lodash": "^4.17.21",
32
32
  "uuid": "^3.3.2",
33
33
  "global": "^4.4.0",
34
34
  "ip-anonymize": "^0.1.0",
35
- "@webex/common": "2.18.0",
35
+ "@webex/common": "2.19.2",
36
36
  "bowser": "^2.11.0",
37
37
  "sdp-transform": "^2.12.0",
38
- "readable-stream": "^3.6.0",
39
- "@webex/common-timers": "2.18.0",
40
38
  "btoa": "^1.2.1",
41
- "@webex/internal-media-core": "^0.0.6-beta",
39
+ "@webex/internal-media-core": "^0.0.7-beta",
42
40
  "javascript-state-machine": "^3.1.0",
43
41
  "envify": "^4.1.0"
44
42
  }