@webex/plugin-meetings 3.3.1 → 3.4.0

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 (126) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +7 -2
  3. package/dist/breakouts/index.js.map +1 -1
  4. package/dist/constants.js +11 -4
  5. package/dist/constants.js.map +1 -1
  6. package/dist/interpretation/index.js +1 -1
  7. package/dist/interpretation/siLanguage.js +1 -1
  8. package/dist/locus-info/selfUtils.js +0 -5
  9. package/dist/locus-info/selfUtils.js.map +1 -1
  10. package/dist/media/MediaConnectionAwaiter.js +70 -15
  11. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  12. package/dist/media/index.js +12 -0
  13. package/dist/media/index.js.map +1 -1
  14. package/dist/meeting/connectionStateHandler.js +67 -0
  15. package/dist/meeting/connectionStateHandler.js.map +1 -0
  16. package/dist/meeting/index.js +552 -357
  17. package/dist/meeting/index.js.map +1 -1
  18. package/dist/meeting/locusMediaRequest.js +7 -0
  19. package/dist/meeting/locusMediaRequest.js.map +1 -1
  20. package/dist/meeting/muteState.js +6 -1
  21. package/dist/meeting/muteState.js.map +1 -1
  22. package/dist/meeting/util.js +1 -0
  23. package/dist/meeting/util.js.map +1 -1
  24. package/dist/meeting-info/index.js +4 -4
  25. package/dist/meeting-info/index.js.map +1 -1
  26. package/dist/meeting-info/meeting-info-v2.js +2 -2
  27. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  28. package/dist/meeting-info/util.js +17 -17
  29. package/dist/meeting-info/util.js.map +1 -1
  30. package/dist/meeting-info/utilv2.js +16 -16
  31. package/dist/meeting-info/utilv2.js.map +1 -1
  32. package/dist/meetings/collection.js +1 -1
  33. package/dist/meetings/collection.js.map +1 -1
  34. package/dist/meetings/index.js +37 -33
  35. package/dist/meetings/index.js.map +1 -1
  36. package/dist/meetings/meetings.types.js +8 -0
  37. package/dist/meetings/meetings.types.js.map +1 -1
  38. package/dist/meetings/util.js +3 -2
  39. package/dist/meetings/util.js.map +1 -1
  40. package/dist/metrics/constants.js +2 -1
  41. package/dist/metrics/constants.js.map +1 -1
  42. package/dist/metrics/index.js +57 -0
  43. package/dist/metrics/index.js.map +1 -1
  44. package/dist/personal-meeting-room/index.js +1 -1
  45. package/dist/personal-meeting-room/index.js.map +1 -1
  46. package/dist/reachability/clusterReachability.js +108 -53
  47. package/dist/reachability/clusterReachability.js.map +1 -1
  48. package/dist/reachability/index.js +415 -56
  49. package/dist/reachability/index.js.map +1 -1
  50. package/dist/types/constants.d.ts +11 -3
  51. package/dist/types/media/MediaConnectionAwaiter.d.ts +24 -4
  52. package/dist/types/meeting/connectionStateHandler.d.ts +30 -0
  53. package/dist/types/meeting/index.d.ts +27 -7
  54. package/dist/types/meeting/locusMediaRequest.d.ts +2 -0
  55. package/dist/types/meeting-info/index.d.ts +3 -2
  56. package/dist/types/meeting-info/meeting-info-v2.d.ts +3 -2
  57. package/dist/types/meeting-info/util.d.ts +5 -4
  58. package/dist/types/meeting-info/utilv2.d.ts +3 -2
  59. package/dist/types/meetings/collection.d.ts +3 -2
  60. package/dist/types/meetings/index.d.ts +4 -3
  61. package/dist/types/meetings/meetings.types.d.ts +9 -0
  62. package/dist/types/metrics/constants.d.ts +1 -0
  63. package/dist/types/metrics/index.d.ts +15 -0
  64. package/dist/types/reachability/clusterReachability.d.ts +31 -3
  65. package/dist/types/reachability/index.d.ts +93 -2
  66. package/dist/webinar/index.js +1 -1
  67. package/package.json +23 -23
  68. package/src/breakouts/index.ts +7 -1
  69. package/src/constants.ts +13 -17
  70. package/src/locus-info/selfUtils.ts +0 -5
  71. package/src/media/MediaConnectionAwaiter.ts +89 -14
  72. package/src/media/index.ts +13 -0
  73. package/src/meeting/connectionStateHandler.ts +65 -0
  74. package/src/meeting/index.ts +526 -292
  75. package/src/meeting/locusMediaRequest.ts +5 -0
  76. package/src/meeting/muteState.ts +6 -1
  77. package/src/meeting/util.ts +1 -0
  78. package/src/meeting-info/index.ts +9 -6
  79. package/src/meeting-info/meeting-info-v2.ts +4 -4
  80. package/src/meeting-info/util.ts +23 -28
  81. package/src/meeting-info/utilv2.ts +18 -24
  82. package/src/meetings/collection.ts +3 -3
  83. package/src/meetings/index.ts +39 -40
  84. package/src/meetings/meetings.types.ts +11 -0
  85. package/src/meetings/util.ts +5 -4
  86. package/src/metrics/constants.ts +1 -0
  87. package/src/metrics/index.ts +44 -0
  88. package/src/personal-meeting-room/index.ts +2 -2
  89. package/src/reachability/clusterReachability.ts +86 -25
  90. package/src/reachability/index.ts +316 -27
  91. package/test/unit/spec/breakouts/index.ts +51 -32
  92. package/test/unit/spec/locus-info/selfUtils.js +25 -23
  93. package/test/unit/spec/media/MediaConnectionAwaiter.ts +131 -32
  94. package/test/unit/spec/media/index.ts +42 -27
  95. package/test/unit/spec/meeting/connectionStateHandler.ts +102 -0
  96. package/test/unit/spec/meeting/index.js +758 -179
  97. package/test/unit/spec/meeting/locusMediaRequest.ts +7 -0
  98. package/test/unit/spec/meeting/muteState.js +24 -0
  99. package/test/unit/spec/meeting-info/index.js +4 -4
  100. package/test/unit/spec/meeting-info/meetinginfov2.js +24 -28
  101. package/test/unit/spec/meeting-info/request.js +2 -2
  102. package/test/unit/spec/meeting-info/utilv2.js +41 -49
  103. package/test/unit/spec/meetings/index.js +14 -0
  104. package/test/unit/spec/metrics/index.js +126 -0
  105. package/test/unit/spec/multistream/mediaRequestManager.ts +2 -2
  106. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -2
  107. package/test/unit/spec/reachability/clusterReachability.ts +116 -22
  108. package/test/unit/spec/reachability/index.ts +1153 -84
  109. package/test/unit/spec/rtcMetrics/index.ts +1 -0
  110. package/dist/mediaQualityMetrics/config.js +0 -321
  111. package/dist/mediaQualityMetrics/config.js.map +0 -1
  112. package/dist/statsAnalyzer/global.js +0 -44
  113. package/dist/statsAnalyzer/global.js.map +0 -1
  114. package/dist/statsAnalyzer/index.js +0 -1072
  115. package/dist/statsAnalyzer/index.js.map +0 -1
  116. package/dist/statsAnalyzer/mqaUtil.js +0 -368
  117. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  118. package/dist/types/mediaQualityMetrics/config.d.ts +0 -247
  119. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  120. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  121. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  122. package/src/mediaQualityMetrics/config.ts +0 -255
  123. package/src/statsAnalyzer/global.ts +0 -37
  124. package/src/statsAnalyzer/index.ts +0 -1318
  125. package/src/statsAnalyzer/mqaUtil.ts +0 -463
  126. package/test/unit/spec/stats-analyzer/index.js +0 -1819
@@ -1 +0,0 @@
1
- {"version":3,"names":["_lodash","require","_internalMediaCore","_eventsScope","_interopRequireDefault","_constants","_config","_loggerProxy","_global","_mqaUtil","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","EVENTS","exports","MEDIA_QUALITY","LOCAL_MEDIA_STARTED","LOCAL_MEDIA_STOPPED","REMOTE_MEDIA_STARTED","REMOTE_MEDIA_STOPPED","emptySender","trackLabel","maxPacketLossRatio","availableBandwidth","bytesSent","meanRemoteJitter","meanRoundTripTime","emptyReceiver","bytesReceived","meanRtpJitter","StatsAnalyzer","_EventsScope","_inherits2","_super","config","_this","receiveSlotCallback","undefined","networkQualityMonitor","statsResults","defaultStats","_classCallCheck2","_assertThisInitialized2","mediaType","previousValue","currentValue","isLocal","Error","concat","lastEmittedStartStopEvent","lastEmittedEvent","local","remote","newEvent","emit","file","function","type","successfulCandidatePairId","candidates","newIpAddress","isEmpty","localCandidate","candidateType","address","relayProtocol","relatedAddress","localIpAddress","isSender","isRemote","_this$successfulCandi","id","successfulCandidatePair","localCandidateId","transport","toUpperCase","protocol","sendRecvType","STATS","SEND_DIRECTION","RECEIVE_DIRECTION","ipType","REMOTE","LOCAL","ipAddress","ip","relatedPort","portNumber","port","networkType","priority","timestamp","time","connectionType","NETWORK_TYPE","VPN","UNKNOWN","totalRoundTripTime","statsStarted","lastStatsResults","correlationId","mqaSentCount","lastMqaDataSent","_createClass2","key","value","resetStatsResults","_this2","_keys","includes","recv","send","updateMediaStatus","status","_this$meetingMediaSta","_this$meetingMediaSta2","meetingMediaStatus","actual","expected","sendMqaData","_this3","newMqa","cloneDeep","emptyMqaInterval","audioSender","emptyAudioTransmit","audioShareSender","audioReceiver","emptyAudioReceive","audioShareReceiver","videoSender","emptyVideoTransmit","videoShareSender","videoReceiver","emptyVideoReceive","videoShareReceiver","getAudioSenderMqa","baseMediaType","audioTransmit","getAudioReceiverMqa","audioReceive","getVideoSenderMqa","videoTransmit","getVideoReceiverMqa","videoReceive","startsWith","audioSenderStream","emptyAudioTransmitStream","getAudioSenderStreamMqa","streams","audioReceiverStream","emptyAudioReceiveStream","getAudioReceiverStreamMqa","videoSenderStream","emptyVideoTransmitStream","getVideoSenderStreamMqa","videoReceiverStream","emptyVideoReceiveStream","getVideoReceiverStreamMqa","intervalMetadata","peerReflexiveIP","peripherals","information","_UNKNOWN_","name","MEDIA_DEVICES","SPEAKER","MICROPHONE","existingVideoSender","find","item","CAMERA","intervalNumber","data","updateMediaConnection","mediaConnection","getLocalIpAddress","startAnalyzer","_this4","getStatsAndParse","then","statsInterval","setInterval","analyzerInterval","mqaInterval","MQA_INTERVAL","_promise","resolve","stopAnalyzer","_this5","sendOneLastMqa","clearInterval","parseGetStatsResult","getStatsResult","processOutboundRTPResult","processInboundRTPResult","compareSentAndReceived","parseCandidate","parseAudioSource","filterAndParseGetStatsResults","statsItem","_this6","types","DEFAULT_GET_STATS_FILTER","report","state","videoSenderIndex","newType","direction","currentDirection","localTrackLabel","csi","_this$successfulCandi2","_this$statsResults","extractAndSetLocalIpAddressInfoForDiagnostics","audioLevel","totalAudioEnergy","compareLastStatsResult","_this7","getCurrentStatsTotals","keyPrefix","reduce","prev","cur","_this7$statsResults$c","getPreviousStatsTotals","_this7$lastStatsResul","currentStats","previousStats","sendAudio","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","currentAudioPacketsReceived","previousAudioPacketsReceived","currentTotalPacketsSent","previousTotalPacketsSent","currentFramesEncoded","previousFramesEncoded","currentFramesSent","previousFramesSent","doesVideoSendExist","some","sendVideo","currentVideoFramesDecoded","previousVideoFramesDecoded","sendShare","framesEncoded","framesSent","currentShareFramesDecoded","previousShareFramesDecoded","_this8","getConnectionState","ConnectionState","Failed","trace","getTransceiverStats","transceiverStats","video","receivers","receiver","i","audio","screenShareVideo","screenShareAudio","senders","sender","JSON","parse","_stringify","sendrecvType","kilobytes","frameWidth","frameHeight","width","height","hugeFramesSent","toFixed","keyFramesEncoded","packetsSent","totalKeyFramesEncoded","totalNackCount","nackCount","totalPliCount","pliCount","totalFirCount","firCount","encoderImplementation","qualityLimitationReason","qualityLimitationResolutionChanges","totalRtxPacketsSent","retransmittedPacketsSent","totalRtxBytesSent","retransmittedBytesSent","totalBytesSent","headerBytesSent","requestedBitrate","requestedFrameSize","receiveSlot","ssrc","sourceState","idAndCsi","bytes","totalBytesReceived","currentPacketsLost","packetsLost","totalPacketsLost","packetsReceivedDiff","packetsReceived","totalPacketsReceived","videoFramesReceivedDiff","framesReceived","videoFramesDecodedDiff","framesDecoded","videoFramesDroppedDiff","framesDropped","currentPacketLossRatio","lastPacketReceivedTimestamp","keyFramesDecoded","decoderImplementation","fecPacketsDiscarded","fecPacketsReceived","headerBytesReceived","totalRtxPacketsReceived","retransmittedPacketsReceived","totalRtxBytesReceived","retransmittedBytesReceived","jitter","totalSamplesReceived","totalSamplesDecoded","concealedSamples","currentPacketLoss","totalPacketsLostOnReceiver","packetsLostOnReceiver","roundTripTime","reportsReceived","overAllPacketLossRatio","determineUplinkNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","EventsScope"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\n\nimport {cloneDeep, isEmpty} from 'lodash';\nimport {ConnectionState} from '@webex/internal-media-core';\n\nimport EventsScope from '../common/events/events-scope';\nimport {\n DEFAULT_GET_STATS_FILTER,\n STATS,\n MQA_INTERVAL,\n NETWORK_TYPE,\n MEDIA_DEVICES,\n _UNKNOWN_,\n} from '../constants';\nimport {\n emptyAudioReceive,\n emptyAudioTransmit,\n emptyMqaInterval,\n emptyVideoReceive,\n emptyVideoTransmit,\n emptyAudioReceiveStream,\n emptyAudioTransmitStream,\n emptyVideoReceiveStream,\n emptyVideoTransmitStream,\n} 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 getAudioSenderStreamMqa,\n getAudioReceiverStreamMqa,\n getVideoSenderStreamMqa,\n getVideoReceiverStreamMqa,\n} from './mqaUtil';\nimport {ReceiveSlot} from '../multistream/receiveSlot';\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\nconst emptySender = {\n trackLabel: '',\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n bytesSent: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n};\n\nconst emptyReceiver = {\n availableBandwidth: 0,\n bytesReceived: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n};\n\ntype ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;\ntype MediaStatus = {\n actual?: any;\n expected?: any;\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 config: any;\n correlationId: any;\n lastEmittedStartStopEvent: any;\n lastMqaDataSent: any;\n lastStatsResults: any;\n meetingMediaStatus: any;\n mqaInterval: NodeJS.Timeout;\n mqaSentCount: any;\n networkQualityMonitor: any;\n mediaConnection: any;\n statsInterval: NodeJS.Timeout;\n statsResults: any;\n statsStarted: any;\n successfulCandidatePair: any;\n localIpAddress: string; // Returns the local IP address for diagnostics. this is the local IP of the interface used for the current media connection a host can have many local Ip Addresses\n receiveSlotCallback: ReceiveSlotCallback;\n\n /**\n * Creates a new instance of StatsAnalyzer\n * @constructor\n * @public\n * @param {Object} config SDK Configuration Object\n * @param {Function} receiveSlotCallback Callback used to access receive slots.\n * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)\n * @param {Object} statsResults Default properties for stats\n */\n constructor(\n config: any,\n receiveSlotCallback: ReceiveSlotCallback = () => undefined,\n networkQualityMonitor: object = {},\n statsResults: object = defaultStats\n ) {\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 this.lastEmittedStartStopEvent = {};\n this.receiveSlotCallback = receiveSlotCallback;\n this.successfulCandidatePair = {};\n this.localIpAddress = '';\n }\n\n /**\n * Resets cumulative stats arrays.\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n resetStatsResults() {\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (mediaType.includes('recv')) {\n this.statsResults[mediaType].recv.meanRtpJitter = [];\n }\n\n if (mediaType.includes('send')) {\n this.statsResults[mediaType].send.meanRemoteJitter = [];\n this.statsResults[mediaType].send.meanRoundTripTime = [];\n }\n });\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 public updateMediaStatus(status: MediaStatus) {\n this.meetingMediaStatus = {\n actual: {\n ...this.meetingMediaStatus?.actual,\n ...status?.actual,\n },\n expected: {\n ...this.meetingMediaStatus?.expected,\n ...status?.expected,\n },\n };\n }\n\n /**\n * captures MQA data from media connection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n sendMqaData() {\n const newMqa = cloneDeep(emptyMqaInterval);\n\n // Fill in empty stats items for lastMqaDataSent\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (!this.lastMqaDataSent[mediaType]) {\n this.lastMqaDataSent[mediaType] = {};\n }\n\n if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {\n this.lastMqaDataSent[mediaType].send = {};\n }\n\n if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {\n this.lastMqaDataSent[mediaType].recv = {};\n }\n });\n\n // Create stats the first level, totals for senders and receivers\n const audioSender = cloneDeep(emptyAudioTransmit);\n const audioShareSender = cloneDeep(emptyAudioTransmit);\n const audioReceiver = cloneDeep(emptyAudioReceive);\n const audioShareReceiver = cloneDeep(emptyAudioReceive);\n const videoSender = cloneDeep(emptyVideoTransmit);\n const videoShareSender = cloneDeep(emptyVideoTransmit);\n const videoReceiver = cloneDeep(emptyVideoReceive);\n const videoShareReceiver = cloneDeep(emptyVideoReceive);\n\n getAudioSenderMqa({\n audioSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-send',\n });\n newMqa.audioTransmit.push(audioSender);\n\n getAudioSenderMqa({\n audioSender: audioShareSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-share-send',\n });\n newMqa.audioTransmit.push(audioShareSender);\n\n getAudioReceiverMqa({\n audioReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-recv',\n });\n newMqa.audioReceive.push(audioReceiver);\n\n getAudioReceiverMqa({\n audioReceiver: audioShareReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-share-recv',\n });\n newMqa.audioReceive.push(audioShareReceiver);\n\n getVideoSenderMqa({\n videoSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-send',\n });\n newMqa.videoTransmit.push(videoSender);\n\n getVideoSenderMqa({\n videoSender: videoShareSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-share-send',\n });\n newMqa.videoTransmit.push(videoShareSender);\n\n getVideoReceiverMqa({\n videoReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-recv',\n });\n newMqa.videoReceive.push(videoReceiver);\n\n getVideoReceiverMqa({\n videoReceiver: videoShareReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-share-recv',\n });\n newMqa.videoReceive.push(videoShareReceiver);\n\n // Add stats for individual streams\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (mediaType.startsWith('audio-send')) {\n const audioSenderStream = cloneDeep(emptyAudioTransmitStream);\n\n getAudioSenderStreamMqa({\n audioSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioTransmit[0].streams.push(audioSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.startsWith('audio-share-send')) {\n const audioSenderStream = cloneDeep(emptyAudioTransmitStream);\n\n getAudioSenderStreamMqa({\n audioSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioTransmit[1].streams.push(audioSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.startsWith('audio-recv')) {\n const audioReceiverStream = cloneDeep(emptyAudioReceiveStream);\n\n getAudioReceiverStreamMqa({\n audioReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioReceive[0].streams.push(audioReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.startsWith('audio-share-recv')) {\n const audioReceiverStream = cloneDeep(emptyAudioReceiveStream);\n\n getAudioReceiverStreamMqa({\n audioReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioReceive[1].streams.push(audioReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.startsWith('video-send-layer')) {\n // We only want the stream-specific stats we get with video-send-layer-0, video-send-layer-1, etc.\n const videoSenderStream = cloneDeep(emptyVideoTransmitStream);\n\n getVideoSenderStreamMqa({\n videoSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoTransmit[0].streams.push(videoSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.startsWith('video-share-send')) {\n const videoSenderStream = cloneDeep(emptyVideoTransmitStream);\n\n getVideoSenderStreamMqa({\n videoSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoTransmit[1].streams.push(videoSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.startsWith('video-recv')) {\n const videoReceiverStream = cloneDeep(emptyVideoReceiveStream);\n\n getVideoReceiverStreamMqa({\n videoReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoReceive[0].streams.push(videoReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.startsWith('video-share-recv')) {\n const videoReceiverStream = cloneDeep(emptyVideoReceiveStream);\n\n getVideoReceiverStreamMqa({\n videoReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoReceive[1].streams.push(videoReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n }\n });\n\n newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;\n\n // Adding peripheral information\n newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});\n if (this.statsResults['audio-send']) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.MICROPHONE,\n });\n }\n\n const existingVideoSender = Object.keys(this.statsResults).find((item) =>\n item.includes('video-send')\n );\n\n if (existingVideoSender) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults[existingVideoSender].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.CAMERA,\n });\n }\n\n newMqa.networkType = this.statsResults.connectionType.local.networkType;\n\n this.mqaSentCount += 1;\n\n newMqa.intervalNumber = this.mqaSentCount;\n\n this.resetStatsResults();\n\n this.emit(\n {\n file: 'statsAnalyzer',\n function: 'sendMqaData',\n },\n EVENTS.MEDIA_QUALITY,\n {\n data: newMqa,\n // @ts-ignore\n networkType: newMqa.networkType,\n }\n );\n }\n\n /**\n * updated the media connection when changed\n *\n * @private\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {void}\n */\n updateMediaConnection(mediaConnection: any) {\n this.mediaConnection = mediaConnection;\n }\n\n /**\n * Returns the local IP address for diagnostics.\n * this is the local IP of the interface used for the current media connection\n * a host can have many local Ip Addresses\n * @returns {string | undefined} The local IP address.\n */\n getLocalIpAddress(): string {\n return this.localIpAddress;\n }\n\n /**\n * Starts the stats analyzer on interval\n *\n * @public\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {Promise}\n */\n public startAnalyzer(mediaConnection: any) {\n if (!this.statsStarted) {\n this.statsStarted = true;\n this.mediaConnection = mediaConnection;\n\n return this.getStatsAndParse().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_INTERVAL);\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 public 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.mediaConnection = null;\n });\n }\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 private parseGetStatsResult(getStatsResult: any, type: string, isSender: boolean) {\n if (!getStatsResult) {\n return;\n }\n\n // Generate empty stats results\n if (!this.statsResults[type]) {\n this.statsResults[type] = {};\n }\n\n if (isSender && !this.statsResults[type].send) {\n this.statsResults[type].send = cloneDeep(emptySender);\n } else if (!isSender && !this.statsResults[type].recv) {\n this.statsResults[type].recv = cloneDeep(emptyReceiver);\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 'remote-inbound-rtp':\n case 'remote-outbound-rtp':\n this.compareSentAndReceived(getStatsResult, type);\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} statsItem\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n */\n filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {\n const {types} = DEFAULT_GET_STATS_FILTER;\n\n // get the successful candidate pair before parsing stats.\n statsItem.report.forEach((report) => {\n if (report.type === 'candidate-pair' && report.state === 'succeeded') {\n this.successfulCandidatePair = report;\n }\n });\n\n let videoSenderIndex = 0;\n statsItem.report.forEach((result) => {\n if (types.includes(result.type)) {\n // if the video sender has multiple streams in the report, it is a new stream object.\n if (type === 'video-send' && result.type === 'outbound-rtp') {\n const newType = `video-send-layer-${videoSenderIndex}`;\n this.parseGetStatsResult(result, newType, isSender);\n videoSenderIndex += 1;\n\n this.statsResults[newType].direction = statsItem.currentDirection;\n this.statsResults[newType].trackLabel = statsItem.localTrackLabel;\n this.statsResults[newType].csi = statsItem.csi;\n } else {\n this.parseGetStatsResult(result, type, isSender);\n }\n }\n });\n\n if (this.statsResults[type]) {\n this.statsResults[type].direction = statsItem.currentDirection;\n this.statsResults[type].trackLabel = statsItem.localTrackLabel;\n this.statsResults[type].csi = statsItem.csi;\n this.extractAndSetLocalIpAddressInfoForDiagnostics(\n this.successfulCandidatePair?.localCandidateId,\n this.statsResults?.candidates\n );\n // reset the successful candidate pair.\n this.successfulCandidatePair = {};\n }\n }\n\n /**\n * parse the audio\n * @param {String} result\n * @param {boolean} type\n * @returns {void}\n */\n parseAudioSource(result: any, type: any) {\n if (!result) {\n return;\n }\n\n if (type.includes('audio-send')) {\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 = (\n mediaType: string,\n previousValue: number,\n currentValue: number,\n isLocal: boolean\n ) => {\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 if (!this.lastEmittedStartStopEvent[mediaType]) {\n this.lastEmittedStartStopEvent[mediaType] = {};\n }\n\n const lastEmittedEvent = isLocal\n ? this.lastEmittedStartStopEvent[mediaType].local\n : 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 } 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 } 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 private compareLastStatsResult() {\n if (this.lastStatsResults !== null && this.meetingMediaStatus) {\n const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce(\n (prev, cur) =>\n prev +\n (this.statsResults[cur]?.[keyPrefix.includes('send') ? 'send' : 'recv'][value] || 0),\n 0\n );\n\n const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce(\n (prev, cur) =>\n prev +\n (this.lastStatsResults[cur]?.[keyPrefix.includes('send') ? 'send' : 'recv'][value] ||\n 0),\n 0\n );\n\n // Audio Transmit\n if (this.lastStatsResults['audio-send']) {\n // compare audio stats sent\n // NOTE: relies on there being only one sender.\n const currentStats = this.statsResults['audio-send'].send;\n const previousStats = this.lastStatsResults['audio-send'].send;\n\n if (\n (this.meetingMediaStatus.expected.sendAudio &&\n currentStats.totalPacketsSent === previousStats.totalPacketsSent) ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n (this.meetingMediaStatus.expected.sendAudio &&\n currentStats.totalAudioEnergy === previousStats.totalAudioEnergy) ||\n currentStats.totalAudioEnergy === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,\n currentStats.totalAudioEnergy\n );\n }\n\n if (this.meetingMediaStatus.expected.sendAudio && currentStats.audioLevel === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user`\n );\n }\n }\n\n this.emitStartStopEvents(\n 'audio',\n previousStats.totalPacketsSent,\n currentStats.totalPacketsSent,\n true\n );\n }\n\n // Audio Receive\n const currentAudioPacketsReceived = getCurrentStatsTotals(\n 'audio-recv',\n 'totalPacketsReceived'\n );\n const previousAudioPacketsReceived = getPreviousStatsTotals(\n 'audio-recv',\n 'totalPacketsReceived'\n );\n\n this.emitStartStopEvents(\n 'audio',\n previousAudioPacketsReceived,\n currentAudioPacketsReceived,\n false\n );\n\n const currentTotalPacketsSent = getCurrentStatsTotals('video-send', 'totalPacketsSent');\n const previousTotalPacketsSent = getPreviousStatsTotals('video-send', 'totalPacketsSent');\n\n const currentFramesEncoded = getCurrentStatsTotals('video-send', 'framesEncoded');\n const previousFramesEncoded = getPreviousStatsTotals('video-send', 'framesEncoded');\n\n const currentFramesSent = getCurrentStatsTotals('video-send', 'framesSent');\n const previousFramesSent = getPreviousStatsTotals('video-send', 'framesSent');\n\n const doesVideoSendExist = Object.keys(this.lastStatsResults).some((item) =>\n item.includes('video-send')\n );\n\n // Video Transmit\n if (doesVideoSendExist) {\n // compare video stats sent\n\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentTotalPacketsSent === previousTotalPacketsSent || currentTotalPacketsSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,\n currentTotalPacketsSent\n );\n } else {\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentFramesEncoded === previousFramesEncoded || currentFramesEncoded === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,\n currentFramesEncoded\n );\n }\n\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentFramesSent === previousFramesSent || currentFramesSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,\n currentFramesSent\n );\n }\n }\n\n this.emitStartStopEvents('video', previousFramesSent, currentFramesSent, true);\n }\n\n // Video Receive\n const currentVideoFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');\n const previousVideoFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');\n\n this.emitStartStopEvents(\n 'video',\n previousVideoFramesDecoded,\n currentVideoFramesDecoded,\n false\n );\n\n // Share Transmit\n if (this.lastStatsResults['video-share-send']) {\n // compare share stats sent\n\n const currentStats = this.statsResults['video-share-send'].send;\n const previousStats = this.lastStatsResults['video-share-send'].send;\n\n if (\n this.meetingMediaStatus.expected.sendShare &&\n (currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n this.meetingMediaStatus.expected.sendShare &&\n (currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,\n currentStats.framesEncoded\n );\n }\n\n if (\n this.meetingMediaStatus.expected.sendShare &&\n (this.statsResults['video-share-send'].send.framesSent ===\n this.lastStatsResults['video-share-send'].send.framesSent ||\n this.statsResults['video-share-send'].send.framesSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,\n this.statsResults['video-share-send'].send.framesSent\n );\n }\n }\n\n this.emitStartStopEvents('share', previousStats.framesSent, currentStats.framesSent, true);\n }\n\n // Share receive\n const currentShareFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');\n const previousShareFramesDecoded = getPreviousStatsTotals(\n 'video-share-recv',\n 'framesDecoded'\n );\n\n this.emitStartStopEvents(\n 'share',\n previousShareFramesDecoded,\n currentShareFramesDecoded,\n false\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 private getStatsAndParse() {\n if (!this.mediaConnection) {\n return Promise.resolve();\n }\n\n if (\n this.mediaConnection &&\n this.mediaConnection.getConnectionState() === ConnectionState.Failed\n ) {\n LoggerProxy.logger.trace(\n 'StatsAnalyzer:index#getStatsAndParse --> media connection is in failed state'\n );\n\n return Promise.resolve();\n }\n\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');\n\n return this.mediaConnection.getTransceiverStats().then((transceiverStats) => {\n transceiverStats.video.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-recv-${i}`, false)\n );\n transceiverStats.audio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-recv-${i}`, false)\n );\n transceiverStats.screenShareVideo.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-share-recv-${i}`, false)\n );\n transceiverStats.screenShareAudio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-share-recv-${i}`, false)\n );\n\n transceiverStats.video.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-send', true);\n });\n transceiverStats.audio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-send', true);\n });\n transceiverStats.screenShareVideo.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-share-send', true);\n });\n transceiverStats.screenShareAudio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-share-send', true);\n });\n\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(\n 'StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats'\n );\n });\n }\n\n /**\n * Processes OutboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processOutboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n if (result.bytesSent) {\n const kilobytes = 0;\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;\n }\n\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[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 =\n result.encoderImplementation;\n this.statsResults[mediaType][sendrecvType].qualityLimitationReason =\n result.qualityLimitationReason;\n this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges =\n result.qualityLimitationResolutionChanges;\n this.statsResults[mediaType][sendrecvType].totalRtxPacketsSent =\n result.retransmittedPacketsSent;\n this.statsResults[mediaType][sendrecvType].totalRtxBytesSent = result.retransmittedBytesSent;\n this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;\n this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;\n this.statsResults[mediaType][sendrecvType].requestedBitrate = result.requestedBitrate;\n this.statsResults[mediaType][sendrecvType].requestedFrameSize = result.requestedFrameSize;\n }\n }\n\n /**\n * Processes InboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processInboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n if (result.bytesReceived) {\n let kilobytes = 0;\n const receiveSlot = this.receiveSlotCallback(result.ssrc);\n const sourceState = receiveSlot?.sourceState;\n const idAndCsi = receiveSlot\n ? `id: \"${receiveSlot.id || ''}\"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`\n : '';\n\n const bytes =\n result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;\n\n kilobytes = bytes / 1024;\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n\n let currentPacketsLost =\n result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;\n if (currentPacketsLost < 0) {\n currentPacketsLost = 0;\n }\n const packetsReceivedDiff =\n result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n if (packetsReceivedDiff === 0) {\n if (receiveSlot && sourceState === 'live') {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No packets received for mediaType: ${mediaType}, receive slot ${idAndCsi}. Total packets received on slot: `,\n result.packetsReceived\n );\n }\n }\n\n if (mediaType.startsWith('video') || mediaType.startsWith('share')) {\n const videoFramesReceivedDiff =\n result.framesReceived - this.statsResults[mediaType][sendrecvType].framesReceived;\n\n if (videoFramesReceivedDiff === 0) {\n if (receiveSlot && sourceState === 'live') {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No frames received for mediaType: ${mediaType}, receive slot ${idAndCsi}. Total frames received on slot: `,\n result.framesReceived\n );\n }\n }\n\n const videoFramesDecodedDiff =\n result.framesDecoded - this.statsResults[mediaType][sendrecvType].framesDecoded;\n\n if (videoFramesDecodedDiff === 0) {\n if (receiveSlot && sourceState === 'live') {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No frames decoded for mediaType: ${mediaType}, receive slot ${idAndCsi}. Total frames decoded on slot: `,\n result.framesDecoded\n );\n }\n }\n\n const videoFramesDroppedDiff =\n result.framesDropped - this.statsResults[mediaType][sendrecvType].framesDropped;\n\n if (videoFramesDroppedDiff > 10) {\n if (receiveSlot && sourceState === 'live') {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> Frames dropped for mediaType: ${mediaType}, receive slot ${idAndCsi}. Total frames dropped on slot: `,\n result.framesDropped\n );\n }\n }\n }\n\n // Check the over all packet Lost ratio\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =\n currentPacketsLost > 0\n ? currentPacketsLost / (packetsReceivedDiff + currentPacketsLost)\n : 0;\n if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio\n );\n }\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;\n }\n\n // TODO: check the packet loss value is negative values here\n\n if (result.packetsLost) {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost =\n result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;\n } else {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =\n result.lastPacketReceivedTimestamp;\n this.statsResults[mediaType][sendrecvType].requestedBitrate = result.requestedBitrate;\n this.statsResults[mediaType][sendrecvType].requestedFrameSize = result.requestedFrameSize;\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 this.statsResults[mediaType][sendrecvType].framesDropped = result.framesDropped;\n\n this.statsResults[mediaType][sendrecvType].decoderImplementation =\n result.decoderImplementation;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\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 this.statsResults[mediaType][sendrecvType].totalRtxPacketsReceived =\n result.retransmittedPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalRtxBytesReceived =\n result.retransmittedBytesReceived;\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 =\n result.totalSamplesReceived || 0;\n this.statsResults[mediaType][sendrecvType].totalSamplesDecoded =\n result.totalSamplesDecoded || 0;\n this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;\n }\n }\n\n /**\n * extracts the local Ip address from the statsResult object by looking at stats results candidates\n * and matches that ID with the successful candidate pair. It looks at the type of local candidate it is\n * and then extracts the IP address from the relatedAddress or address property based on conditions known in webrtc\n * note, there are known incompatibilities and it is possible for this to set undefined, or for the IP address to be the public IP address\n * for example, firefox does not set the relayProtocol, and if the user is behind a NAT it might be the public IP\n * @private\n * @param {string} successfulCandidatePairId - The ID of the successful candidate pair.\n * @param {Object} candidates - the stats result candidates\n * @returns {void}\n */\n extractAndSetLocalIpAddressInfoForDiagnostics = (\n successfulCandidatePairId: string,\n candidates: {[key: string]: Record<string, unknown>}\n ) => {\n let newIpAddress = '';\n if (successfulCandidatePairId && !isEmpty(candidates)) {\n const localCandidate = candidates[successfulCandidatePairId];\n if (localCandidate) {\n if (localCandidate.candidateType === 'host') {\n // if it's a host candidate, use the address property - it will be the local IP\n newIpAddress = `${localCandidate.address}`;\n } else if (localCandidate.candidateType === 'prflx') {\n // if it's a peer reflexive candidate and we're not using a relay (there is no relayProtocol set)\n // then look at the relatedAddress - it will be the local\n //\n // Firefox doesn't populate the relayProtocol property\n if (!localCandidate.relayProtocol) {\n newIpAddress = `${localCandidate.relatedAddress}`;\n } else {\n // if it's a peer reflexive candidate and we are using a relay -\n // in that case the relatedAddress will be the IP of the TURN server (Linus),\n // so we can only look at the address, but it might be local IP or public IP,\n // depending on if the user is behind a NAT or not\n newIpAddress = `${localCandidate.address}`;\n }\n }\n }\n }\n this.localIpAddress = newIpAddress;\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: any, type: any, isSender: boolean, isRemote: boolean) => {\n if (!result || !result.id) {\n return;\n }\n\n // We only care about the successful local candidate\n if (this.successfulCandidatePair?.localCandidateId !== result.id) {\n return;\n }\n\n let transport;\n if (result.relayProtocol) {\n transport = result.relayProtocol.toUpperCase();\n } else if (result.protocol) {\n transport = result.protocol.toUpperCase();\n }\n\n const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;\n const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;\n\n if (!this.statsResults.candidates) {\n this.statsResults.candidates = {};\n }\n\n this.statsResults.candidates[result.id] = {\n candidateType: result.candidateType,\n ipAddress: result.ip, // TODO: add ports\n relatedAddress: result.relatedAddress,\n relatedPort: result.relatedPort,\n relayProtocol: result.relayProtocol,\n protocol: result.protocol,\n address: result.address,\n portNumber: result.port,\n networkType: result.networkType,\n priority: result.priority,\n transport,\n timestamp: result.time,\n id: result.id,\n type: result.type,\n };\n\n this.statsResults.connectionType[ipType].candidateType = result.candidateType;\n this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;\n\n this.statsResults.connectionType[ipType].networkType =\n result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;\n this.statsResults.connectionType[ipType].transport = transport;\n\n this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;\n };\n\n /**\n *\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n compareSentAndReceived(result, type) {\n // Don't compare on transceivers without a sender.\n if (!type || !this.statsResults[type].send) {\n return;\n }\n\n const mediaType = type;\n\n const currentPacketLoss =\n result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;\n\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 =\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0\n ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver /\n this.statsResults[mediaType].send.totalPacketsSent\n : 0;\n this.statsResults[mediaType].send.currentPacketLossRatio =\n this.statsResults[mediaType].send.packetsLostOnReceiver > 0\n ? (this.statsResults[mediaType].send.packetsLostOnReceiver * 100) /\n (this.statsResults[mediaType].send.packetsSent +\n this.statsResults[mediaType].send.packetsLostOnReceiver)\n : 0;\n\n if (\n this.statsResults[mediaType].send.maxPacketLossRatio <\n this.statsResults[mediaType].send.currentPacketLossRatio\n ) {\n this.statsResults[mediaType].send.maxPacketLossRatio =\n 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,368 +0,0 @@
1
- "use strict";
2
-
3
- var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
- var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
- _Object$defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.getVideoSenderStreamMqa = exports.getVideoSenderMqa = exports.getVideoReceiverStreamMqa = exports.getVideoReceiverMqa = exports.getAudioSenderStreamMqa = exports.getAudioSenderMqa = exports.getAudioReceiverStreamMqa = exports.getAudioReceiverMqa = void 0;
9
- var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
10
- var _lodash = require("lodash");
11
- var _constants = require("../constants");
12
- /* eslint-disable no-param-reassign, prefer-destructuring */
13
-
14
- /**
15
- * Get the totals of a certain value from a certain media type.
16
- *
17
- * @param {object} stats - The large stats object.
18
- * @param {string} sendrecvType - "send" or "recv".
19
- * @param {string} baseMediaType - audio or video _and_ share or non-share.
20
- * @param {string} value - The value we want to get the totals of.
21
- * @returns {number}
22
- */
23
- var getTotalValueFromBaseType = function getTotalValueFromBaseType(stats, sendrecvType, baseMediaType, value) {
24
- return (0, _keys.default)(stats).filter(function (mt) {
25
- return mt.includes(baseMediaType);
26
- }).reduce(function (acc, mt) {
27
- var _stats$mt, _stats$mt$sendrecvTyp;
28
- return acc + (((_stats$mt = stats[mt]) === null || _stats$mt === void 0 ? void 0 : (_stats$mt$sendrecvTyp = _stats$mt[sendrecvType]) === null || _stats$mt$sendrecvTyp === void 0 ? void 0 : _stats$mt$sendrecvTyp[value]) || 0);
29
- }, 0);
30
- };
31
- var getAudioReceiverMqa = exports.getAudioReceiverMqa = function getAudioReceiverMqa(_ref) {
32
- var _statsResults$Object$;
33
- var audioReceiver = _ref.audioReceiver,
34
- statsResults = _ref.statsResults,
35
- lastMqaDataSent = _ref.lastMqaDataSent,
36
- baseMediaType = _ref.baseMediaType;
37
- var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
38
- var getLastTotalValue = function getLastTotalValue(value) {
39
- return getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
40
- };
41
- var getTotalValue = function getTotalValue(value) {
42
- return getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
43
- };
44
- var lastPacketsReceived = getLastTotalValue('totalPacketsReceived');
45
- var lastPacketsLost = getLastTotalValue('totalPacketsLost');
46
- var lastBytesReceived = getLastTotalValue('totalBytesReceived');
47
- var lastFecPacketsReceived = getLastTotalValue('fecPacketsReceived');
48
- var lastFecPacketsDiscarded = getLastTotalValue('fecPacketsDiscarded');
49
- var totalPacketsReceived = getTotalValue('totalPacketsReceived');
50
- var packetsLost = getTotalValue('totalPacketsLost');
51
- var totalBytesReceived = getTotalValue('totalBytesReceived');
52
- var totalFecPacketsReceived = getTotalValue('fecPacketsReceived');
53
- var totalFecPacketsDiscarded = getTotalValue('fecPacketsDiscarded');
54
- audioReceiver.common.common.direction = ((_statsResults$Object$ = statsResults[(0, _keys.default)(statsResults).find(function (mediaType) {
55
- return mediaType.includes(baseMediaType);
56
- })]) === null || _statsResults$Object$ === void 0 ? void 0 : _statsResults$Object$.direction) || 'inactive';
57
- audioReceiver.common.common.isMain = !baseMediaType.includes('-share');
58
- audioReceiver.common.transportType = statsResults.connectionType.local.transport;
59
-
60
- // add rtpPacket info inside common as also for call analyzer
61
- audioReceiver.common.rtpPackets = totalPacketsReceived - lastPacketsReceived;
62
-
63
- // Hop by hop are numbers and not percentage so we compare on what we sent the last min
64
- // collect the packets received for the last min
65
- var totalPacketsLost = packetsLost - lastPacketsLost;
66
- audioReceiver.common.mediaHopByHopLost = totalPacketsLost;
67
- audioReceiver.common.rtpHopByHopLost = totalPacketsLost;
68
- var fecRecovered = totalFecPacketsReceived - lastFecPacketsReceived - (totalFecPacketsDiscarded - lastFecPacketsDiscarded);
69
- audioReceiver.common.fecPackets = fecRecovered;
70
- audioReceiver.common.rtpBitrate = (totalBytesReceived - lastBytesReceived) * 8 / 60 || 0;
71
- };
72
- var getAudioReceiverStreamMqa = exports.getAudioReceiverStreamMqa = function getAudioReceiverStreamMqa(_ref2) {
73
- var _lastMqaDataSent$medi, _lastMqaDataSent$medi2, _lastMqaDataSent$medi3, _lastMqaDataSent$medi4, _lastMqaDataSent$medi5, _lastMqaDataSent$medi6, _lastMqaDataSent$medi7, _lastMqaDataSent$medi8;
74
- var audioReceiverStream = _ref2.audioReceiverStream,
75
- statsResults = _ref2.statsResults,
76
- lastMqaDataSent = _ref2.lastMqaDataSent,
77
- mediaType = _ref2.mediaType;
78
- var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
79
- var lastPacketsDecoded = ((_lastMqaDataSent$medi = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi === void 0 ? void 0 : _lastMqaDataSent$medi[sendrecvType].totalSamplesDecoded) || 0;
80
- var lastSamplesReceived = ((_lastMqaDataSent$medi2 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi2 === void 0 ? void 0 : _lastMqaDataSent$medi2[sendrecvType].totalSamplesReceived) || 0;
81
- var lastConcealedSamples = ((_lastMqaDataSent$medi3 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi3 === void 0 ? void 0 : _lastMqaDataSent$medi3[sendrecvType].concealedSamples) || 0;
82
- var lastBytesReceived = ((_lastMqaDataSent$medi4 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi4 === void 0 ? void 0 : _lastMqaDataSent$medi4[sendrecvType].totalBytesReceived) || 0;
83
- var lastFecPacketsReceived = ((_lastMqaDataSent$medi5 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi5 === void 0 ? void 0 : _lastMqaDataSent$medi5[sendrecvType].fecPacketsReceived) || 0;
84
- var lastFecPacketsDiscarded = ((_lastMqaDataSent$medi6 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi6 === void 0 ? void 0 : _lastMqaDataSent$medi6[sendrecvType].fecPacketsDiscarded) || 0;
85
- var lastPacketsReceived = ((_lastMqaDataSent$medi7 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi7 === void 0 ? void 0 : _lastMqaDataSent$medi7[sendrecvType].totalPacketsReceived) || 0;
86
- var lastPacketsLost = ((_lastMqaDataSent$medi8 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi8 === void 0 ? void 0 : _lastMqaDataSent$medi8[sendrecvType].totalPacketsLost) || 0;
87
- var csi = statsResults[mediaType].csi;
88
- if (csi && !audioReceiverStream.common.csi.includes(csi)) {
89
- audioReceiverStream.common.csi.push(csi);
90
- }
91
- audioReceiverStream.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
92
- audioReceiverStream.common.maxRtpJitter =
93
- // @ts-ignore
94
- (0, _lodash.max)(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
95
- audioReceiverStream.common.meanRtpJitter = (0, _lodash.mean)(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
96
- audioReceiverStream.common.rtpJitter = audioReceiverStream.common.maxRtpJitter;
97
-
98
- // Fec packets do come in as part of the FEC only for audio
99
- var fecRecovered = statsResults[mediaType][sendrecvType].fecPacketsReceived - lastFecPacketsReceived - (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);
100
- audioReceiverStream.common.rtpEndToEndLost = statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;
101
- audioReceiverStream.common.framesDropped = statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;
102
- audioReceiverStream.common.renderedFrameRate = audioReceiverStream.common.framesDropped * 100 / 60 || 0;
103
- audioReceiverStream.common.framesReceived = statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;
104
- audioReceiverStream.common.concealedFrames = statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;
105
- audioReceiverStream.common.receivedBitrate = (statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8 / 60 || 0;
106
- };
107
- var getAudioSenderMqa = exports.getAudioSenderMqa = function getAudioSenderMqa(_ref3) {
108
- var _statsResults$Object$2;
109
- var audioSender = _ref3.audioSender,
110
- statsResults = _ref3.statsResults,
111
- lastMqaDataSent = _ref3.lastMqaDataSent,
112
- baseMediaType = _ref3.baseMediaType;
113
- var sendrecvType = _constants.STATS.SEND_DIRECTION;
114
- var getLastTotalValue = function getLastTotalValue(value) {
115
- return getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
116
- };
117
- var getTotalValue = function getTotalValue(value) {
118
- return getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
119
- };
120
- var lastPacketsSent = getLastTotalValue('totalPacketsSent');
121
- var lastPacketsLostTotal = getLastTotalValue('totalPacketsLostOnReceiver');
122
- var totalPacketsLostOnReceiver = getTotalValue('totalPacketsLostOnReceiver');
123
- var totalPacketsSent = getTotalValue('totalPacketsSent');
124
- var meanRemoteJitter = (0, _keys.default)(statsResults).filter(function (mt) {
125
- return mt.includes(baseMediaType);
126
- }).reduce(function (acc, mt) {
127
- return acc.concat(statsResults[mt][sendrecvType].meanRemoteJitter);
128
- }, []);
129
- var meanRoundTripTime = (0, _keys.default)(statsResults).filter(function (mt) {
130
- return mt.includes(baseMediaType);
131
- }).reduce(function (acc, mt) {
132
- return acc.concat(statsResults[mt][sendrecvType].meanRoundTripTime);
133
- }, []);
134
- audioSender.common.common.direction = ((_statsResults$Object$2 = statsResults[(0, _keys.default)(statsResults).find(function (mediaType) {
135
- return mediaType.includes(baseMediaType);
136
- })]) === null || _statsResults$Object$2 === void 0 ? void 0 : _statsResults$Object$2.direction) || 'inactive';
137
- audioSender.common.common.isMain = !baseMediaType.includes('-share');
138
- audioSender.common.transportType = statsResults.connectionType.local.transport;
139
- audioSender.common.maxRemoteJitter = (0, _lodash.max)(meanRemoteJitter) * 1000 || 0;
140
- audioSender.common.meanRemoteJitter = (0, _lodash.mean)(meanRemoteJitter) * 1000 || 0;
141
- audioSender.common.rtpPackets = totalPacketsSent - lastPacketsSent || 0;
142
- // audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;
143
- // From candidate-pair
144
- audioSender.common.availableBitrate = getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, 'availableOutgoingBitrate');
145
- // Calculate based on how much packets lost of received compated to how to the client sent
146
-
147
- var totalPacketsLostForaMin = totalPacketsLostOnReceiver - lastPacketsLostTotal;
148
- audioSender.common.remoteLossRate = totalPacketsSent - lastPacketsSent > 0 ? totalPacketsLostForaMin * 100 / (totalPacketsSent - lastPacketsSent) : 0; // This is the packets sent with in last min
149
-
150
- audioSender.common.maxRoundTripTime = (0, _lodash.max)(meanRoundTripTime) * 1000 || 0;
151
- audioSender.common.meanRoundTripTime = (0, _lodash.mean)(meanRoundTripTime) * 1000 || 0;
152
- audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;
153
-
154
- // Calculate the outgoing bitrate
155
- var totalBytesSentInaMin = getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, 'totalBytesSent') - getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, 'totalBytesSent');
156
- audioSender.common.rtpBitrate = totalBytesSentInaMin ? totalBytesSentInaMin * 8 / 60 : 0;
157
- };
158
- var getAudioSenderStreamMqa = exports.getAudioSenderStreamMqa = function getAudioSenderStreamMqa(_ref4) {
159
- var _lastMqaDataSent$medi9, _lastMqaDataSent$medi10, _lastMqaDataSent$medi11, _lastMqaDataSent$medi12;
160
- var audioSenderStream = _ref4.audioSenderStream,
161
- statsResults = _ref4.statsResults,
162
- lastMqaDataSent = _ref4.lastMqaDataSent,
163
- mediaType = _ref4.mediaType;
164
- var sendrecvType = _constants.STATS.SEND_DIRECTION;
165
- var lastBytesSent = ((_lastMqaDataSent$medi9 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi9 === void 0 ? void 0 : _lastMqaDataSent$medi9[sendrecvType].totalBytesSent) || 0;
166
- var lastFramesEncoded = ((_lastMqaDataSent$medi10 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi10 === void 0 ? void 0 : _lastMqaDataSent$medi10[sendrecvType].totalKeyFramesEncoded) || 0;
167
- var lastFirCount = ((_lastMqaDataSent$medi11 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi11 === void 0 ? void 0 : _lastMqaDataSent$medi11[sendrecvType].totalFirCount) || 0;
168
- var lastPacketsSent = ((_lastMqaDataSent$medi12 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi12 === void 0 ? void 0 : _lastMqaDataSent$medi12[sendrecvType].totalPacketsSent) || 0;
169
- var csi = statsResults[mediaType].csi;
170
- if (csi && !audioSenderStream.common.csi.includes(csi)) {
171
- audioSenderStream.common.csi.push(csi);
172
- }
173
- audioSenderStream.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
174
- var totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
175
- audioSenderStream.common.transmittedBitrate = totalBytesSentInaMin ? totalBytesSentInaMin * 8 / 60 : 0;
176
- audioSenderStream.transmittedKeyFrames = statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;
177
- audioSenderStream.requestedKeyFrames = statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
178
- audioSenderStream.requestedBitrate = statsResults[mediaType][sendrecvType].requestedBitrate || 0;
179
- };
180
- var getVideoReceiverMqa = exports.getVideoReceiverMqa = function getVideoReceiverMqa(_ref5) {
181
- var _statsResults$Object$3;
182
- var videoReceiver = _ref5.videoReceiver,
183
- statsResults = _ref5.statsResults,
184
- lastMqaDataSent = _ref5.lastMqaDataSent,
185
- baseMediaType = _ref5.baseMediaType;
186
- var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
187
- var getLastTotalValue = function getLastTotalValue(value) {
188
- return getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
189
- };
190
- var getTotalValue = function getTotalValue(value) {
191
- return getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
192
- };
193
- var lastPacketsReceived = getLastTotalValue('totalPacketsReceived');
194
- var lastPacketsLost = getLastTotalValue('totalPacketsLost');
195
- var lastBytesReceived = getLastTotalValue('totalBytesReceived');
196
- var lastRtxPacketsReceived = getLastTotalValue('totalRtxPacketsReceived');
197
- var lastRtxBytesReceived = getLastTotalValue('totalRtxBytesReceived');
198
- var packetsLost = getTotalValue('totalPacketsLost');
199
- var totalPacketsReceived = getTotalValue('totalPacketsReceived');
200
- var totalBytesReceived = getTotalValue('totalBytesReceived');
201
- var totalRtxPacketsReceived = getTotalValue('totalRtxPacketsReceived');
202
- var totalRtxBytesReceived = getTotalValue('totalRtxBytesReceived');
203
- var meanRemoteJitter = (0, _keys.default)(statsResults).filter(function (mt) {
204
- return mt.includes(baseMediaType);
205
- }).reduce(function (acc, mt) {
206
- return acc.concat(statsResults[mt][sendrecvType].meanRemoteJitter);
207
- }, []);
208
- videoReceiver.common.common.direction = ((_statsResults$Object$3 = statsResults[(0, _keys.default)(statsResults).find(function (mediaType) {
209
- return mediaType.includes(baseMediaType);
210
- })]) === null || _statsResults$Object$3 === void 0 ? void 0 : _statsResults$Object$3.direction) || 'inactive';
211
- videoReceiver.common.common.isMain = !baseMediaType.includes('-share');
212
- videoReceiver.common.transportType = statsResults.connectionType.local.transport;
213
-
214
- // collect the packets received for the last min
215
- videoReceiver.common.rtpPackets = totalPacketsReceived - lastPacketsReceived || 0;
216
-
217
- // Hop by hop are numbers and not percentage so we compare on what we sent the last min
218
- // this is including packet lost
219
- var totalPacketsLost = packetsLost - lastPacketsLost;
220
- videoReceiver.common.mediaHopByHopLost = totalPacketsLost;
221
- videoReceiver.common.rtpHopByHopLost = totalPacketsLost;
222
-
223
- // calculate this values
224
- videoReceiver.common.maxRemoteJitter = (0, _lodash.max)(meanRemoteJitter) * 1000 || 0;
225
- videoReceiver.common.meanRemoteJitter = (0, _lodash.mean)(meanRemoteJitter) * 1000 || 0;
226
-
227
- // Calculate the outgoing bitrate
228
- var totalBytesReceivedInaMin = totalBytesReceived - lastBytesReceived;
229
- var totalRtxBytesReceivedInaMin = totalRtxBytesReceived - lastRtxBytesReceived;
230
- videoReceiver.common.rtpBitrate = totalBytesReceivedInaMin ? totalBytesReceivedInaMin * 8 / 60 : 0;
231
- videoReceiver.common.rtxPackets = totalRtxPacketsReceived - lastRtxPacketsReceived;
232
- videoReceiver.common.rtxBitrate = totalRtxBytesReceivedInaMin ? totalRtxBytesReceivedInaMin * 8 / 60 : 0;
233
- };
234
- var getVideoReceiverStreamMqa = exports.getVideoReceiverStreamMqa = function getVideoReceiverStreamMqa(_ref6) {
235
- var _lastMqaDataSent$medi13, _lastMqaDataSent$medi14, _lastMqaDataSent$medi15, _lastMqaDataSent$medi16, _lastMqaDataSent$medi17, _lastMqaDataSent$medi18, _lastMqaDataSent$medi19, _lastMqaDataSent$medi20;
236
- var videoReceiverStream = _ref6.videoReceiverStream,
237
- statsResults = _ref6.statsResults,
238
- lastMqaDataSent = _ref6.lastMqaDataSent,
239
- mediaType = _ref6.mediaType;
240
- var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
241
- var lastPacketsReceived = ((_lastMqaDataSent$medi13 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi13 === void 0 ? void 0 : _lastMqaDataSent$medi13[sendrecvType].totalPacketsReceived) || 0;
242
- var lastPacketsLost = ((_lastMqaDataSent$medi14 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi14 === void 0 ? void 0 : _lastMqaDataSent$medi14[sendrecvType].totalPacketsLost) || 0;
243
- var lastBytesReceived = ((_lastMqaDataSent$medi15 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi15 === void 0 ? void 0 : _lastMqaDataSent$medi15[sendrecvType].totalBytesReceived) || 0;
244
- var lastFramesReceived = ((_lastMqaDataSent$medi16 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi16 === void 0 ? void 0 : _lastMqaDataSent$medi16[sendrecvType].framesReceived) || 0;
245
- var lastFramesDecoded = ((_lastMqaDataSent$medi17 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi17 === void 0 ? void 0 : _lastMqaDataSent$medi17[sendrecvType].framesDecoded) || 0;
246
- var lastFramesDropped = ((_lastMqaDataSent$medi18 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi18 === void 0 ? void 0 : _lastMqaDataSent$medi18[sendrecvType].framesDropped) || 0;
247
- var lastKeyFramesDecoded = ((_lastMqaDataSent$medi19 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi19 === void 0 ? void 0 : _lastMqaDataSent$medi19[sendrecvType].keyFramesDecoded) || 0;
248
- var lastPliCount = ((_lastMqaDataSent$medi20 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi20 === void 0 ? void 0 : _lastMqaDataSent$medi20[sendrecvType].totalPliCount) || 0;
249
- var csi = statsResults[mediaType].csi;
250
- if (csi && !videoReceiverStream.common.csi.includes(csi)) {
251
- videoReceiverStream.common.csi.push(csi);
252
- }
253
- videoReceiverStream.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
254
- var totalPacketLoss = statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
255
-
256
- // End to end packetloss is after recovery
257
- videoReceiverStream.common.rtpEndToEndLost = totalPacketLoss;
258
- videoReceiverStream.common.rtpJitter =
259
- // @ts-ignore
260
- (0, _lodash.max)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
261
- var totalBytesReceivedInaMin = statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;
262
- videoReceiverStream.common.receivedBitrate = totalBytesReceivedInaMin ? totalBytesReceivedInaMin * 8 / 60 : 0;
263
- var totalFrameReceivedInaMin = statsResults[mediaType][sendrecvType].framesReceived - lastFramesReceived;
264
- var totalFrameDecodedInaMin = statsResults[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
265
- videoReceiverStream.common.receivedFrameRate = Math.round(totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0);
266
- videoReceiverStream.common.renderedFrameRate = Math.round(totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0);
267
- videoReceiverStream.common.framesDropped = statsResults[mediaType][sendrecvType].framesDropped - lastFramesDropped || 0;
268
- videoReceiverStream.receivedHeight = statsResults[mediaType][sendrecvType].height || 0;
269
- videoReceiverStream.receivedWidth = statsResults[mediaType][sendrecvType].width || 0;
270
- videoReceiverStream.receivedFrameSize = videoReceiverStream.receivedHeight * videoReceiverStream.receivedWidth / 256;
271
- videoReceiverStream.receivedKeyFrames = statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
272
- videoReceiverStream.requestedKeyFrames = statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;
273
- };
274
- var getVideoSenderMqa = exports.getVideoSenderMqa = function getVideoSenderMqa(_ref7) {
275
- var _statsResults$Object$4;
276
- var videoSender = _ref7.videoSender,
277
- statsResults = _ref7.statsResults,
278
- lastMqaDataSent = _ref7.lastMqaDataSent,
279
- baseMediaType = _ref7.baseMediaType;
280
- var sendrecvType = _constants.STATS.SEND_DIRECTION;
281
- var getLastTotalValue = function getLastTotalValue(value) {
282
- return getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
283
- };
284
- var getTotalValue = function getTotalValue(value) {
285
- return getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
286
- };
287
- var lastPacketsSent = getLastTotalValue('totalPacketsSent');
288
- var lastBytesSent = getLastTotalValue('totalBytesSent');
289
- var lastPacketsLostTotal = getLastTotalValue('totalPacketsLostOnReceiver');
290
- var lastRtxPacketsSent = getLastTotalValue('totalRtxPacketsSent');
291
- var lastRtxBytesSent = getLastTotalValue('totalRtxBytesSent');
292
- var totalPacketsLostOnReceiver = getTotalValue('totalPacketsLostOnReceiver');
293
- var totalPacketsSent = getTotalValue('totalPacketsSent');
294
- var totalBytesSent = getTotalValue('totalBytesSent');
295
- var availableOutgoingBitrate = getTotalValue('availableOutgoingBitrate');
296
- var totalRtxPacketsSent = getTotalValue('totalRtxPacketsSent');
297
- var totalRtxBytesSent = getTotalValue('totalRtxBytesSent');
298
- videoSender.common.common.direction = ((_statsResults$Object$4 = statsResults[(0, _keys.default)(statsResults).find(function (mediaType) {
299
- return mediaType.includes(baseMediaType);
300
- })]) === null || _statsResults$Object$4 === void 0 ? void 0 : _statsResults$Object$4.direction) || 'inactive';
301
- videoSender.common.common.isMain = !baseMediaType.includes('-share');
302
- videoSender.common.transportType = statsResults.connectionType.local.transport;
303
- var meanRemoteJitter = (0, _keys.default)(statsResults).filter(function (mt) {
304
- return mt.includes(baseMediaType);
305
- }).reduce(function (acc, mt) {
306
- return acc.concat(statsResults[mt][sendrecvType].meanRemoteJitter);
307
- }, []);
308
- var meanRoundTripTime = (0, _keys.default)(statsResults).filter(function (mt) {
309
- return mt.includes(baseMediaType);
310
- }).reduce(function (acc, mt) {
311
- return acc.concat(statsResults[mt][sendrecvType].meanRoundTripTime);
312
- }, []);
313
-
314
- // @ts-ignore
315
- videoSender.common.maxRemoteJitter = (0, _lodash.max)(meanRemoteJitter) * 1000 || 0;
316
- videoSender.common.meanRemoteJitter = (0, _lodash.mean)(meanRemoteJitter) * 1000 || 0;
317
- videoSender.common.rtpPackets = totalPacketsSent - lastPacketsSent;
318
- videoSender.common.availableBitrate = availableOutgoingBitrate;
319
-
320
- // Calculate based on how much packets lost of received compated to how to the client sent
321
- var totalPacketsLostForaMin = totalPacketsLostOnReceiver - lastPacketsLostTotal;
322
- videoSender.common.remoteLossRate = totalPacketsSent - lastPacketsSent > 0 ? totalPacketsLostForaMin * 100 / (totalPacketsSent - lastPacketsSent) : 0; // This is the packets sent with in last min || 0;
323
-
324
- videoSender.common.maxRoundTripTime = (0, _lodash.max)(meanRoundTripTime) * 1000 || 0;
325
- videoSender.common.meanRoundTripTime = (0, _lodash.mean)(meanRoundTripTime) * 1000 || 0;
326
- videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;
327
-
328
- // Calculate the outgoing bitrate
329
- var totalBytesSentInaMin = totalBytesSent - lastBytesSent;
330
- var totalRtxBytesSentInaMin = totalRtxBytesSent - lastRtxBytesSent;
331
- videoSender.common.rtpBitrate = totalBytesSentInaMin ? totalBytesSentInaMin * 8 / 60 : 0;
332
- videoSender.common.rtxPackets = totalRtxPacketsSent - lastRtxPacketsSent;
333
- videoSender.common.rtxBitrate = totalRtxBytesSentInaMin ? totalRtxBytesSentInaMin * 8 / 60 : 0;
334
- };
335
- var getVideoSenderStreamMqa = exports.getVideoSenderStreamMqa = function getVideoSenderStreamMqa(_ref8) {
336
- var _lastMqaDataSent$medi21, _lastMqaDataSent$medi22, _lastMqaDataSent$medi23, _lastMqaDataSent$medi24, _lastMqaDataSent$medi25;
337
- var videoSenderStream = _ref8.videoSenderStream,
338
- statsResults = _ref8.statsResults,
339
- lastMqaDataSent = _ref8.lastMqaDataSent,
340
- mediaType = _ref8.mediaType;
341
- var sendrecvType = _constants.STATS.SEND_DIRECTION;
342
- var lastPacketsSent = ((_lastMqaDataSent$medi21 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi21 === void 0 ? void 0 : _lastMqaDataSent$medi21[sendrecvType].totalPacketsSent) || 0;
343
- var lastBytesSent = ((_lastMqaDataSent$medi22 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi22 === void 0 ? void 0 : _lastMqaDataSent$medi22[sendrecvType].totalBytesSent) || 0;
344
- var lastKeyFramesEncoded = ((_lastMqaDataSent$medi23 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi23 === void 0 ? void 0 : _lastMqaDataSent$medi23[sendrecvType].totalKeyFramesEncoded) || 0;
345
- var lastFirCount = ((_lastMqaDataSent$medi24 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi24 === void 0 ? void 0 : _lastMqaDataSent$medi24[sendrecvType].totalFirCount) || 0;
346
- var lastFramesSent = ((_lastMqaDataSent$medi25 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi25 === void 0 ? void 0 : _lastMqaDataSent$medi25[sendrecvType].framesSent) || 0;
347
- var csi = statsResults[mediaType].csi;
348
- if (csi && !videoSenderStream.common.csi.includes(csi)) {
349
- videoSenderStream.common.csi.push(csi);
350
- }
351
- videoSenderStream.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
352
-
353
- // Calculate the outgoing bitrate
354
- var totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
355
- videoSenderStream.common.transmittedBitrate = totalBytesSentInaMin ? totalBytesSentInaMin * 8 / 60 : 0;
356
- videoSenderStream.transmittedKeyFrames = statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;
357
- videoSenderStream.requestedKeyFrames = statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
358
-
359
- // From tracks //TODO: calculate a proper one
360
- var totalFrameSentInaMin = statsResults[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
361
- videoSenderStream.common.transmittedFrameRate = Math.round(totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0);
362
- videoSenderStream.transmittedHeight = statsResults[mediaType][sendrecvType].height || 0;
363
- videoSenderStream.transmittedWidth = statsResults[mediaType][sendrecvType].width || 0;
364
- videoSenderStream.transmittedFrameSize = videoSenderStream.transmittedHeight * videoSenderStream.transmittedWidth / 256;
365
- videoSenderStream.requestedBitrate = statsResults[mediaType][sendrecvType].requestedBitrate || 0;
366
- videoSenderStream.requestedFrameSize = statsResults[mediaType][sendrecvType].requestedFrameSize || 0;
367
- };
368
- //# sourceMappingURL=mqaUtil.js.map