@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.15
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.
- package/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/common/browser-detection.js +1 -0
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -5
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -5
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -6
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -5
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -5
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -5
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -4
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -5
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -5
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +11 -8
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +2 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +2 -1
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/internal-media-core-wrapper.js.map +1 -1
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -1
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +1 -1
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +118 -89
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +1 -1
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +25 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +8 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +5 -5
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +2 -2
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +48 -48
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +1 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +251 -250
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +2 -2
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +14 -14
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +31 -31
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +43 -43
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +23 -20
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/multistreamMedia.js +2 -1
- package/dist/multistream/multistreamMedia.js.map +1 -1
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +2 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +8 -8
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +7 -7
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +3 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +4 -4
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js +5 -5
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +4 -1
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +7 -6
- package/package.json +18 -18
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +11 -11
- package/src/constants.ts +1 -1
- package/src/index.js +1 -1
- package/src/locus-info/controlsUtils.ts +34 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +25 -34
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +4 -4
- package/src/locus-info/parser.ts +45 -68
- package/src/locus-info/selfUtils.ts +106 -57
- package/src/media/index.ts +123 -135
- package/src/media/internal-media-core-wrapper.ts +2 -2
- package/src/media/properties.ts +30 -20
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +46 -46
- package/src/meeting/effectsState.ts +35 -35
- package/src/meeting/in-meeting-actions.ts +7 -3
- package/src/meeting/index.ts +1576 -1291
- package/src/meeting/muteState.ts +62 -31
- package/src/meeting/request.ts +174 -113
- package/src/meeting/request.type.ts +11 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +101 -70
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +106 -108
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +59 -53
- package/src/meetings/collection.ts +1 -1
- package/src/meetings/index.ts +512 -440
- package/src/meetings/request.ts +26 -24
- package/src/meetings/util.ts +29 -29
- package/src/member/index.ts +55 -49
- package/src/member/util.ts +26 -13
- package/src/members/collection.ts +0 -1
- package/src/members/index.ts +182 -126
- package/src/members/request.ts +46 -14
- package/src/members/util.ts +44 -42
- package/src/metrics/config.ts +254 -81
- package/src/metrics/constants.ts +0 -2
- package/src/metrics/index.ts +84 -71
- package/src/multistream/multistreamMedia.ts +1 -0
- package/src/multistream/receiveSlot.ts +1 -0
- package/src/multistream/receiveSlotManager.ts +1 -0
- package/src/multistream/remoteMedia.ts +1 -1
- package/src/multistream/remoteMediaGroup.ts +2 -1
- package/src/multistream/remoteMediaManager.ts +3 -0
- package/src/networkQualityMonitor/index.ts +20 -23
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +61 -59
- package/src/reachability/request.ts +36 -32
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +4 -3
- package/src/reconnection-manager/index.ts +139 -84
- package/src/roap/index.ts +46 -38
- package/src/roap/request.ts +44 -31
- package/src/roap/turnDiscovery.ts +59 -30
- package/src/statsAnalyzer/global.ts +30 -33
- package/src/statsAnalyzer/index.ts +432 -175
- package/src/statsAnalyzer/mqaUtil.ts +178 -72
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/journey.js +663 -462
- package/test/integration/spec/space-meeting.js +318 -203
- package/test/integration/spec/transcription.js +6 -7
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +5 -5
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +1 -2
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +72 -103
- package/test/unit/spec/locus-info/selfUtils.js +21 -12
- package/test/unit/spec/meeting/effectsState.js +36 -46
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -3
- package/test/unit/spec/meeting/index.js +1342 -684
- package/test/unit/spec/meeting/muteState.js +42 -33
- package/test/unit/spec/meeting/request.js +75 -45
- package/test/unit/spec/meeting/utils.js +78 -53
- package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +110 -74
- package/test/unit/spec/meetings/collection.js +1 -1
- package/test/unit/spec/meetings/index.js +438 -257
- package/test/unit/spec/meetings/utils.js +14 -12
- package/test/unit/spec/member/index.js +0 -1
- package/test/unit/spec/member/util.js +5 -6
- package/test/unit/spec/members/index.js +104 -54
- package/test/unit/spec/members/request.js +29 -20
- package/test/unit/spec/members/utils.js +8 -5
- package/test/unit/spec/metrics/index.js +16 -21
- package/test/unit/spec/networkQualityMonitor/index.js +21 -15
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +9 -11
- package/test/unit/spec/reconnection-manager/index.js +16 -18
- package/test/unit/spec/roap/turnDiscovery.ts +22 -19
- package/test/unit/spec/stats-analyzer/index.js +25 -20
- package/test/utils/cmr.js +44 -42
- package/test/utils/testUtils.js +83 -74
- package/test/utils/webex-config.js +18 -18
- package/test/utils/webex-test-users.js +53 -50
|
@@ -1 +1 @@
|
|
|
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","AUDIO_CORRELATE","trackLabel","MICROPHONE","VIDEO_CORRELATE","CAMERA","intervalNumber","populateResults","resetStatsResults","data","mediaConnection","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","audioLevel","totalAudioEnergy","currentStats","previousStats","expected","sendAudio","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","receiveAudio","totalPacketsReceived","totalSamplesReceived","sendVideo","framesEncoded","framesSent","receiveVideo","framesReceived","framesDecoded","framesDropped","SHARE_CORRELATE","sendShare","getConnectionState","MC","ConnectionState","Failed","trace","getTransceiverStats","transceiverStats","filterAndParseGetStatsResults","sender","receiver","screenShareVideo","direction","currentDirection","localTrackLabel","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.ts"],"sourcesContent":["import {cloneDeep} from 'lodash';\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport EventsScope from '../common/events/events-scope';\nimport {DEFAULT_GET_STATS_FILTER, 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 config: any;\n correlationId: any;\n lastEmittedStartStopEvent: any;\n lastMqaDataSent: any;\n lastStatsResults: any;\n localMQEStats: 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\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: any, networkQualityMonitor: object = {}, statsResults: object = 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 public updateMediaStatus(status: object) {\n this.meetingMediaStatus = status;\n }\n\n /**\n * captures MQA data from media connection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public 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.statsResults[STATS.AUDIO_CORRELATE][STATS.SEND_DIRECTION].trackLabel || _UNKNOWN_, name: MEDIA_DEVICES.MICROPHONE});\n mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.statsResults[STATS.VIDEO_CORRELATE][STATS.SEND_DIRECTION].trackLabel || _UNKNOWN_, name: MEDIA_DEVICES.CAMERA});\n\n\n // @ts-ignore\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 // @ts-ignore\n networkType: mqaData.networkType\n }\n );\n }\n\n /**\n * updated the media connection when changed\n *\n * @private\n * @memberof StatsAnalyzer\n * @param {MC.RoapMediaConnection} mediaConnection\n * @returns {void}\n */\n updateMediaConnection(mediaConnection: any) {\n this.mediaConnection = mediaConnection;\n }\n\n /**\n * Starts the stats analyzer on interval\n *\n * @public\n * @memberof StatsAnalyzer\n * @param {MC.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()\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 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 this.mediaConnection = 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 private parseGetStatsResult(getStatsResult: any, type: string, isSender: boolean) {\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 // @ts-ignore\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 // @ts-ignore\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 private filterAndParseGetStatsResults(getStatsResults: Array<any>, type: string, isSender: boolean) {\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: any, type: any) {\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: string, previousValue: number, currentValue: number, isLocal: boolean) => {\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 private 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 private getStatsAndParse() {\n if (!this.mediaConnection) {\n return Promise.resolve();\n }\n\n if (this.mediaConnection && this.mediaConnection.getConnectionState() === MC.ConnectionState.Failed) {\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> media connection is in failed state');\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 this.filterAndParseGetStatsResults(transceiverStats.video.sender, STATS.VIDEO_CORRELATE, true);\n this.filterAndParseGetStatsResults(transceiverStats.video.receiver, STATS.VIDEO_CORRELATE, false);\n this.filterAndParseGetStatsResults(transceiverStats.audio.sender, STATS.AUDIO_CORRELATE, true);\n this.filterAndParseGetStatsResults(transceiverStats.audio.receiver, STATS.AUDIO_CORRELATE, false);\n this.filterAndParseGetStatsResults(transceiverStats.screenShareVideo.sender, STATS.SHARE_CORRELATE, true);\n this.filterAndParseGetStatsResults(transceiverStats.screenShareVideo.receiver, STATS.SHARE_CORRELATE, false);\n\n // updates the current direction of media\n this.statsResults[STATS.AUDIO_CORRELATE].direction = transceiverStats.audio.currentDirection;\n this.statsResults[STATS.VIDEO_CORRELATE].direction = transceiverStats.video.currentDirection;\n this.statsResults[STATS.SHARE_CORRELATE].direction = transceiverStats.screenShareVideo.currentDirection;\n\n this.statsResults[STATS.AUDIO_CORRELATE][STATS.SEND_DIRECTION].trackLabel = transceiverStats.audio.localTrackLabel;\n this.statsResults[STATS.VIDEO_CORRELATE][STATS.SEND_DIRECTION].trackLabel = transceiverStats.video.localTrackLabel;\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('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 private processOutboundRTPResult(result: any, type: any) {\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 private processInboundRTPResult(result: any, type: any) {\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: any, type: any, isSender: boolean, isRemote: boolean) => {\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 private processTrackResult(result: any, mediaType: any) {\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 private compareSentAndReceived(result: any, type: any) {\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","AUDIO_CORRELATE","trackLabel","MICROPHONE","VIDEO_CORRELATE","CAMERA","intervalNumber","populateResults","resetStatsResults","data","mediaConnection","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","audioLevel","totalAudioEnergy","currentStats","previousStats","expected","sendAudio","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","receiveAudio","totalPacketsReceived","totalSamplesReceived","sendVideo","framesEncoded","framesSent","receiveVideo","framesReceived","framesDecoded","framesDropped","SHARE_CORRELATE","sendShare","getConnectionState","MC","ConnectionState","Failed","trace","getTransceiverStats","transceiverStats","filterAndParseGetStatsResults","sender","receiver","screenShareVideo","direction","currentDirection","localTrackLabel","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.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\n\nimport {cloneDeep} from 'lodash';\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport EventsScope from '../common/events/events-scope';\nimport {\n DEFAULT_GET_STATS_FILTER,\n STATS,\n MQA_INTEVAL,\n NETWORK_TYPE,\n MEDIA_DEVICES,\n _UNKNOWN_,\n} 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 config: any;\n correlationId: any;\n lastEmittedStartStopEvent: any;\n lastMqaDataSent: any;\n lastStatsResults: any;\n localMQEStats: 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\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(\n config: any,\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 resolutions: {\n video: {send: {}, recv: {}},\n audio: {send: {}, recv: {}},\n share: {send: {}, recv: {}},\n },\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(\n lastMqa.audioReceive[0].streams[0].common.receivedBitrate\n );\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(\n lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate\n );\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(\n lastMqa.videoReceive[0].streams[0].common.roundTripTime\n );\n this.localMQEStats.video.RX.bitRate.push(\n lastMqa.videoReceive[0].streams[0].common.receivedBitrate\n );\n this.localMQEStats.video.RX.frameRate.push(\n lastMqa.videoReceive[0].streams[0].common.receivedFrameRate\n );\n this.localMQEStats.video.RX.resolutionWidth.push(\n lastMqa.videoReceive[0].streams[0].receivedWidth\n );\n this.localMQEStats.video.RX.resolutionHeight.push(\n lastMqa.videoReceive[0].streams[0].receivedHeight\n );\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(\n lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate\n );\n this.localMQEStats.video.TX.frameRate.push(\n lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate\n );\n this.localMQEStats.video.TX.resolutionWidth.push(\n lastMqa.videoTransmit[0].streams[0].transmittedWidth\n );\n this.localMQEStats.video.TX.resolutionHeight.push(\n lastMqa.videoTransmit[0].streams[0].transmittedHeight\n );\n this.localMQEStats.video.TX.requestedKeyFrame.push(\n lastMqa.videoTransmit[0].streams[0].requestedKeyFrames\n );\n this.localMQEStats.video.TX.receivedKeyFrame.push();\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 public updateMediaStatus(status: object) {\n this.meetingMediaStatus = status;\n }\n\n /**\n * captures MQA data from media connection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public 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 mqaData.intervals[0].intervalMetadata.peerReflexiveIP =\n this.statsResults.connectionType.local.ipAddress[0];\n\n // Adding peripheral information\n mqaData.intervals[0].intervalMetadata.peripherals = [];\n mqaData.intervals[0].intervalMetadata.peripherals.push({\n information: _UNKNOWN_,\n name: MEDIA_DEVICES.SPEAKER,\n });\n mqaData.intervals[0].intervalMetadata.peripherals.push({\n information:\n this.statsResults[STATS.AUDIO_CORRELATE][STATS.SEND_DIRECTION].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.MICROPHONE,\n });\n mqaData.intervals[0].intervalMetadata.peripherals.push({\n information:\n this.statsResults[STATS.VIDEO_CORRELATE][STATS.SEND_DIRECTION].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.CAMERA,\n });\n\n // @ts-ignore\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 // @ts-ignore\n networkType: mqaData.networkType,\n }\n );\n }\n\n /**\n * updated the media connection when changed\n *\n * @private\n * @memberof StatsAnalyzer\n * @param {MC.RoapMediaConnection} mediaConnection\n * @returns {void}\n */\n updateMediaConnection(mediaConnection: any) {\n this.mediaConnection = mediaConnection;\n }\n\n /**\n * Starts the stats analyzer on interval\n *\n * @public\n * @memberof StatsAnalyzer\n * @param {MC.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_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 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 this.mediaConnection = 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 private parseGetStatsResult(getStatsResult: any, type: string, isSender: boolean) {\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 // @ts-ignore\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 // @ts-ignore\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 private filterAndParseGetStatsResults(\n getStatsResults: Array<any>,\n type: string,\n isSender: boolean\n ) {\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: any, type: any) {\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 = (\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 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 // 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 (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`\n );\n } else {\n if (\n currentStats.totalAudioEnergy === previousStats.totalAudioEnergy ||\n currentStats.totalAudioEnergy === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`\n );\n }\n\n if (currentStats.audioLevel === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`\n );\n }\n }\n\n this.emitStartStopEvents(\n mediaType,\n previousStats.totalPacketsSent,\n currentStats.totalPacketsSent,\n true\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 (\n currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||\n currentStats.totalPacketsReceived === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`\n );\n } else if (\n currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||\n currentStats.totalSamplesReceived === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`\n );\n }\n\n this.emitStartStopEvents(\n mediaType,\n previousStats.totalPacketsReceived,\n currentStats.totalPacketsReceived,\n false\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 (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`\n );\n } else {\n if (\n currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`\n );\n }\n\n if (\n this.statsResults.resolutions[mediaType].send.framesSent ===\n this.lastStatsResults.resolutions[mediaType].send.framesSent ||\n this.statsResults.resolutions[mediaType].send.framesSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`\n );\n }\n }\n\n this.emitStartStopEvents(\n mediaType,\n previousStats.framesSent,\n currentStats.framesSent,\n true\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 (\n currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||\n currentStats.totalPacketsReceived === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`\n );\n } else {\n if (\n this.statsResults.resolutions[mediaType].recv.framesReceived ===\n this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||\n this.statsResults.resolutions[mediaType].recv.framesReceived === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`\n );\n }\n\n if (\n this.statsResults[mediaType].recv.framesDecoded ===\n this.lastStatsResults[mediaType].recv.framesDecoded ||\n this.statsResults.resolutions[mediaType].send.framesDecoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`\n );\n }\n\n if (\n this.statsResults.resolutions[mediaType].recv.framesDropped -\n this.lastStatsResults.resolutions[mediaType].recv.framesDropped >\n 10\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`\n );\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 (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`\n );\n } else {\n if (\n currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`\n );\n }\n\n if (\n this.statsResults.resolutions[mediaType].send.framesSent ===\n this.lastStatsResults.resolutions[mediaType].send.framesSent ||\n this.statsResults.resolutions[mediaType].send.framesSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`\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 (\n currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`\n );\n } else {\n if (\n this.statsResults.resolutions[mediaType].recv.framesReceived ===\n this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||\n this.statsResults.resolutions[mediaType].recv.framesReceived === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`\n );\n }\n\n if (\n this.statsResults[mediaType].recv.framesDecoded ===\n this.lastStatsResults[mediaType].recv.framesDecoded ||\n this.statsResults.resolutions[mediaType].send.framesDecoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`\n );\n }\n\n if (\n this.statsResults.resolutions[mediaType].recv.framesDropped -\n this.lastStatsResults.resolutions[mediaType].recv.framesDropped >\n 10\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`\n );\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 private getStatsAndParse() {\n if (!this.mediaConnection) {\n return Promise.resolve();\n }\n\n if (\n this.mediaConnection &&\n this.mediaConnection.getConnectionState() === MC.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 this.filterAndParseGetStatsResults(\n transceiverStats.video.sender,\n STATS.VIDEO_CORRELATE,\n true\n );\n this.filterAndParseGetStatsResults(\n transceiverStats.video.receiver,\n STATS.VIDEO_CORRELATE,\n false\n );\n this.filterAndParseGetStatsResults(\n transceiverStats.audio.sender,\n STATS.AUDIO_CORRELATE,\n true\n );\n this.filterAndParseGetStatsResults(\n transceiverStats.audio.receiver,\n STATS.AUDIO_CORRELATE,\n false\n );\n this.filterAndParseGetStatsResults(\n transceiverStats.screenShareVideo.sender,\n STATS.SHARE_CORRELATE,\n true\n );\n this.filterAndParseGetStatsResults(\n transceiverStats.screenShareVideo.receiver,\n STATS.SHARE_CORRELATE,\n false\n );\n\n // updates the current direction of media\n this.statsResults[STATS.AUDIO_CORRELATE].direction = transceiverStats.audio.currentDirection;\n this.statsResults[STATS.VIDEO_CORRELATE].direction = transceiverStats.video.currentDirection;\n this.statsResults[STATS.SHARE_CORRELATE].direction =\n transceiverStats.screenShareVideo.currentDirection;\n\n this.statsResults[STATS.AUDIO_CORRELATE][STATS.SEND_DIRECTION].trackLabel =\n transceiverStats.audio.localTrackLabel;\n this.statsResults[STATS.VIDEO_CORRELATE][STATS.SEND_DIRECTION].trackLabel =\n transceiverStats.video.localTrackLabel;\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 {*} type\n * @returns {void}\n */\n private processOutboundRTPResult(result: any, type: any) {\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 =\n result.keyFramesEncoded;\n }\n\n const bytes =\n 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 =\n result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;\n this.statsResults[mediaType][sendrecvType].keyFramesEncoded =\n result.keyFramesEncoded -\n 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 =\n 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 =\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].retransmittedPacketsSent =\n result.retransmittedPacketsSent;\n this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;\n this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;\n this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =\n result.retransmittedBytesSent;\n }\n }\n\n /**\n * Processes InboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n */\n private processInboundRTPResult(result: any, type: any) {\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 =\n 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 =\n result.packetsReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {\n this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =\n result.lastPacketReceivedTimestamp;\n }\n\n const bytes =\n result.bytesReceived -\n 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 =\n result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;\n this.statsResults[mediaType][sendrecvType].currentPacketsLost =\n 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 =\n result.packetsReceived -\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =\n result.packetsReceived;\n\n if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `,\n this.statsResults[mediaType][sendrecvType].packetsReceived\n );\n }\n\n // Check the over all packet Lost ratio\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =\n this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0\n ? this.statsResults[mediaType][sendrecvType].currentPacketsLost /\n (this.statsResults[mediaType][sendrecvType].packetsReceived +\n this.statsResults[mediaType][sendrecvType].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 ',\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio\n );\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\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 =\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\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 * 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 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 (\n result.candidateType &&\n RemoteCandidateType[result.id].indexOf(result.candidateType) === -1\n ) {\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 (\n result.ip &&\n RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1\n ) {\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 =\n RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN\n ? NETWORK_TYPE.UNKNOWN\n : 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 private processTrackResult(result: any, mediaType: any) {\n if (!result || result.type !== 'track') {\n return;\n }\n if (result.type !== 'track') return;\n\n const sendrecvType =\n 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 if (result.trackIdentifier && mediaType !== STATS.AUDIO_CORRELATE) {\n this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =\n result.trackIdentifier;\n\n const jitterBufferDelay = result && result.jitterBufferDelay;\n const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;\n\n this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =\n jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;\n\n // Used to calculate the jitter\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =\n result.jitterBufferDelay;\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount =\n result.jitterBufferEmittedCount;\n }\n }\n\n /**\n *\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n private compareSentAndReceived(result: any, type: any) {\n if (!type) {\n return;\n }\n\n const mediaType = type;\n\n if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {\n this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n }\n\n const currentPacketLoss =\n 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 =\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 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","STATS","AUDIO_CORRELATE","sendrecvType","RECEIVE_DIRECTION","common","direction","transportType","connectionType","remote","transport","rtpPackets","totalPacketsReceived","streams","mediaHopByHopLost","totalPacketsLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","fecPacketsReceived","fecPacketsDiscarded","rtpEndToEndLost","framesDropped","totalSamplesDecoded","renderedFrameRate","framesReceived","totalSamplesReceived","concealedFrames","concealedSamples","receivedBitrate","totalBytesReceived","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","local","maxRemoteJitter","meanRemoteJitter","totalPacketsSent","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","totalPacketsLostOnReceiver","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","totalBytesSent","transmittedBitrate","transmittedKeyFrames","totalKeyFramesEncoded","requestedKeyFrames","totalFirCount","getVideoReceiverMqa","videoReceiver","isShareStream","SHARE_CORRELATE","VIDEO_CORRELATE","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","resolutions","totalFrameDecodedInaMin","framesDecoded","receivedFrameRate","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","keyFramesDecoded","totalPliCount","getVideoSenderMqa","videoSender","totalFrameSentInaMin","framesSent","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["import {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) || 0;\n audioReceiver.common.rtpHopByHopLost = statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n\n // @ts-ignore\n audioReceiver.streams[0].common.maxRtpJitter = max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter = mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered = (statsResults[mediaType][sendrecvType].fecPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].fecPacketsReceived) - (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastMqaDataSent[mediaType][sendrecvType].fecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) - fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped = statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastMqaDataSent[mediaType][sendrecvType].totalSamplesDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate = audioReceiver.streams[0].common.framesDropped * 100 / 60 || 0;\n audioReceiver.streams[0].common.framesReceived = statsResults[mediaType][sendrecvType].totalSamplesReceived - lastMqaDataSent[mediaType][sendrecvType].totalSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames = statsResults[mediaType][sendrecvType].concealedSamples - lastMqaDataSent[mediaType][sendrecvType].concealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate = (statsResults[mediaType][sendrecvType].totalBytesReceived - lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) * 8 / 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n // @ts-ignore\n audioSender.common.maxRemoteJitter = max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter = mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate = statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin = statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n audioSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin * 100 / audioSender.common.rtpPackets) : 0; // This is the packets sent with in last min || 0;\n\n // @ts-ignore\n audioSender.common.maxRoundTripTime = max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime = mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin) * 8 / 60 : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n\n audioSender.streams[0].transmittedKeyFrames = statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalFirCount - lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n};\n\n\nexport const getVideoReceiverMqa = ({\n videoReceiver, statsResults, lastMqaDataSent, isShareStream = false\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n // @ts-ignore\n videoReceiver.common.maxRemoteJitter = max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter = mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount) * 1000 || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin = statsResults[mediaType][sendrecvType].totalBytesReceived - lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin ? (totalBytesReceivedInaMin) * 8 / 60 : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin = statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived;\n const totalFrameDecodedInaMin = statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin ? totalFrameReceivedInaMin * 100 / 60 : 0;\n videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin ? totalFrameDecodedInaMin * 100 / 60 : 0;\n\n videoReceiver.streams[0].common.framesDropped = statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDropped;\n videoReceiver.streams[0].receivedHeight = statsResults.resolutions[mediaType][sendrecvType].height;\n videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoReceiver.streams[0].receivedFrameSize = statsResults.resolutions[mediaType][sendrecvType].height * statsResults.resolutions[mediaType][sendrecvType].height / 256;\n\n videoReceiver.streams[0].receivedKeyFrames = statsResults[mediaType][sendrecvType].keyFramesDecoded - lastMqaDataSent[mediaType][sendrecvType].keyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalPliCount - lastMqaDataSent[mediaType][sendrecvType].totalPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({\n videoSender, statsResults, lastMqaDataSent, isShareStream = false\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter = max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter = mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n\n videoSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n videoSender.common.availableBitrate = statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin = statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n videoSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin) * 100 / (videoSender.common.rtpPackets + totalpacketsLostForaMin) : 0; // This is the packets sent with in last min || 0;\n\n // @ts-ignore\n videoSender.common.maxRoundTripTime = max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime = mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin) * 8 / 60 : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n\n videoSender.streams[0].transmittedKeyFrames = statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalFirCount - lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin = statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin ? totalFrameSentInaMin * 100 / 60 : 0;\n videoSender.streams[0].transmittedHeight = statsResults.resolutions[mediaType][sendrecvType].height;\n videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoSender.streams[0].transmittedFrameSize = statsResults.resolutions[mediaType][sendrecvType].height * statsResults.resolutions[mediaType][sendrecvType].width / 254;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","STATS","AUDIO_CORRELATE","sendrecvType","RECEIVE_DIRECTION","common","direction","transportType","connectionType","remote","transport","rtpPackets","totalPacketsReceived","streams","mediaHopByHopLost","totalPacketsLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","fecPacketsReceived","fecPacketsDiscarded","rtpEndToEndLost","framesDropped","totalSamplesDecoded","renderedFrameRate","framesReceived","totalSamplesReceived","concealedFrames","concealedSamples","receivedBitrate","totalBytesReceived","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","local","maxRemoteJitter","meanRemoteJitter","totalPacketsSent","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","totalPacketsLostOnReceiver","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","totalBytesSent","transmittedBitrate","transmittedKeyFrames","totalKeyFramesEncoded","requestedKeyFrames","totalFirCount","getVideoReceiverMqa","videoReceiver","isShareStream","SHARE_CORRELATE","VIDEO_CORRELATE","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","resolutions","totalFrameDecodedInaMin","framesDecoded","receivedFrameRate","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","keyFramesDecoded","totalPliCount","getVideoSenderMqa","videoSender","totalFrameSentInaMin","framesSent","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\n\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n audioReceiver.common.rtpHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n\n // @ts-ignore\n audioReceiver.streams[0].common.maxRtpJitter =\n max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter =\n mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered =\n statsResults[mediaType][sendrecvType].fecPacketsReceived -\n lastMqaDataSent[mediaType][sendrecvType].fecPacketsReceived -\n (statsResults[mediaType][sendrecvType].fecPacketsDiscarded -\n lastMqaDataSent[mediaType][sendrecvType].fecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost -\n fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].totalSamplesDecoded -\n lastMqaDataSent[mediaType][sendrecvType].totalSamplesDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate =\n (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;\n audioReceiver.streams[0].common.framesReceived =\n statsResults[mediaType][sendrecvType].totalSamplesReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames =\n statsResults[mediaType][sendrecvType].concealedSamples -\n lastMqaDataSent[mediaType][sendrecvType].concealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate =\n ((statsResults[mediaType][sendrecvType].totalBytesReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) *\n 8) /\n 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n // @ts-ignore\n audioSender.common.maxRemoteJitter =\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n audioSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets\n : 0; // This is the packets sent with in last min || 0;\n\n // @ts-ignore\n audioSender.common.maxRoundTripTime =\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin =\n statsResults[mediaType][sendrecvType].totalBytesSent -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n audioSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -\n lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount -\n lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n};\n\nexport const getVideoReceiverMqa = ({\n videoReceiver,\n statsResults,\n lastMqaDataSent,\n isShareStream = false,\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n // @ts-ignore\n videoReceiver.common.maxRemoteJitter =\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount) * 1000 || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin =\n statsResults[mediaType][sendrecvType].totalBytesReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin\n ? (totalBytesReceivedInaMin * 8) / 60\n : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesReceived -\n lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived;\n const totalFrameDecodedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesDecoded -\n lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin\n ? (totalFrameReceivedInaMin * 100) / 60\n : 0;\n videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin\n ? (totalFrameDecodedInaMin * 100) / 60\n : 0;\n\n videoReceiver.streams[0].common.framesDropped =\n statsResults.resolutions[mediaType][sendrecvType].framesDropped -\n lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDropped;\n videoReceiver.streams[0].receivedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height;\n videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoReceiver.streams[0].receivedFrameSize =\n (statsResults.resolutions[mediaType][sendrecvType].height *\n statsResults.resolutions[mediaType][sendrecvType].height) /\n 256;\n\n videoReceiver.streams[0].receivedKeyFrames =\n statsResults[mediaType][sendrecvType].keyFramesDecoded -\n lastMqaDataSent[mediaType][sendrecvType].keyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalPliCount -\n lastMqaDataSent[mediaType][sendrecvType].totalPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({\n videoSender,\n statsResults,\n lastMqaDataSent,\n isShareStream = false,\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter =\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n videoSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n videoSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)\n : 0; // This is the packets sent with in last min || 0;\n\n // @ts-ignore\n videoSender.common.maxRoundTripTime =\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin =\n statsResults[mediaType][sendrecvType].totalBytesSent -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n videoSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -\n lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount -\n lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesSent -\n (lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin\n ? (totalFrameSentInaMin * 100) / 60\n : 0;\n videoSender.streams[0].transmittedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height;\n videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoSender.streams[0].transmittedFrameSize =\n (statsResults.resolutions[mediaType][sendrecvType].height *\n statsResults.resolutions[mediaType][sendrecvType].width) /\n 254;\n};\n"],"mappings":"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"}
|
|
@@ -193,7 +193,10 @@ var Transcription = /*#__PURE__*/function () {
|
|
|
193
193
|
value: function subscribe(callback) {
|
|
194
194
|
var _this3 = this;
|
|
195
195
|
|
|
196
|
-
var data
|
|
196
|
+
var data;
|
|
197
|
+
var csis;
|
|
198
|
+
var speaker;
|
|
199
|
+
var transcription;
|
|
197
200
|
|
|
198
201
|
this.webSocket.onmessage = function (event) {
|
|
199
202
|
var _data$data, _data$data$voiceaPayl, _data$data2, _data$data2$voiceaPay;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Transcription","webSocketUrl","sessionId","members","sessionID","memberCSIs","params","webSocket","WebSocket","token","onopen","send","id","uuidv4","type","data","trackingId","toString","callback","onclose","event","onerror","csis","csi","member","membersCollection","find","participant","status","selfIsSpeaking","includes","speaker","transcription","onmessage","JSON","parse","voiceaPayload","getSpeaker","messageID","transcript_id","personID","timestamp","close"],"sources":["index.ts"],"sourcesContent":["import {v4 as uuidv4} from 'uuid';\n\n/**\n * @description Meeting Webex assistance transcription feature.\n * @exports\n * @class Transcription\n */\nexport default class Transcription {\n webSocketUrl: any;\n sessionID: any;\n members: any;\n memberCSIs: any;\n webSocket: any;\n\n /**\n * @param {string} webSocketUrl\n * @param {sessionID} sessionId\n * @param {object} members\n * @constructor\n * @memberof Transcription\n */\n constructor(webSocketUrl: string, sessionId: any, members: object) {\n this.webSocketUrl = webSocketUrl;\n this.sessionID = sessionId;\n this.members = members;\n this.memberCSIs = {};\n\n const params = '?outboundWireFormat=text&bufferStates=true&aliasHttpStatus=true';\n\n this.webSocket = new WebSocket(`${this.webSocketUrl}${params}`);\n }\n\n /**\n * open the Low Latency Mercury connection\n * An event parameter will be send to the callback.\n *\n * @param {string} token\n * @param {string} sessionID\n * @returns {void}\n */\n connect(token: string) {\n this.webSocket.onopen = () => {\n this.webSocket.send(JSON.stringify({\n
|
|
1
|
+
{"version":3,"names":["Transcription","webSocketUrl","sessionId","members","sessionID","memberCSIs","params","webSocket","WebSocket","token","onopen","send","id","uuidv4","type","data","trackingId","toString","callback","onclose","event","onerror","csis","csi","member","membersCollection","find","participant","status","selfIsSpeaking","includes","speaker","transcription","onmessage","JSON","parse","voiceaPayload","getSpeaker","messageID","transcript_id","personID","timestamp","close"],"sources":["index.ts"],"sourcesContent":["import {v4 as uuidv4} from 'uuid';\n\n/**\n * @description Meeting Webex assistance transcription feature.\n * @exports\n * @class Transcription\n */\nexport default class Transcription {\n webSocketUrl: any;\n sessionID: any;\n members: any;\n memberCSIs: any;\n webSocket: any;\n\n /**\n * @param {string} webSocketUrl\n * @param {sessionID} sessionId\n * @param {object} members\n * @constructor\n * @memberof Transcription\n */\n constructor(webSocketUrl: string, sessionId: any, members: object) {\n this.webSocketUrl = webSocketUrl;\n this.sessionID = sessionId;\n this.members = members;\n this.memberCSIs = {};\n\n const params = '?outboundWireFormat=text&bufferStates=true&aliasHttpStatus=true';\n\n this.webSocket = new WebSocket(`${this.webSocketUrl}${params}`);\n }\n\n /**\n * open the Low Latency Mercury connection\n * An event parameter will be send to the callback.\n *\n * @param {string} token\n * @param {string} sessionID\n * @returns {void}\n */\n connect(token: string) {\n this.webSocket.onopen = () => {\n this.webSocket.send(\n JSON.stringify({\n id: uuidv4(),\n type: 'authorization',\n data: {token: `Bearer ${token}`},\n trackingId: `webex-js-sdk_${this.sessionID}${Date.now.toString()}`,\n })\n );\n };\n }\n\n /**\n * Sets callback to invoke when the web socket connection is closed.\n *\n * @param {Function} callback\n * @returns {void}\n */\n onCloseSocket(callback: any) {\n if (callback) {\n this.webSocket.onclose = (event) => {\n callback(event);\n };\n }\n }\n\n /**\n * Sets callback to invoke when a web socket connection error occurs.\n * An event parameter will be send to the callback.\n *\n * @param {Function} callback\n * @returns {void}\n */\n onErrorSocket(callback: any) {\n if (callback) {\n this.webSocket.onerror = (event) => {\n callback(event);\n };\n }\n }\n\n /**\n * Get current speaker from the given csis payload and update the global csis map\n *\n * @private\n * @param {object} csis\n * @returns {object}\n */\n private getSpeaker(csis: any) {\n for (const csi of csis) {\n const member = this.memberCSIs[csi];\n\n if (member) {\n return member;\n }\n }\n\n return Object.values(this.members.membersCollection.members).find((member: any) => {\n const memberCSIs = member.participant.status.csis;\n let selfIsSpeaking = false;\n\n for (const csi of csis) {\n if (memberCSIs.includes(csi)) {\n this.memberCSIs[csi] = member;\n selfIsSpeaking = true;\n break;\n }\n }\n\n return selfIsSpeaking;\n });\n }\n\n /**\n * Sends transcription data to given callback as it arrives.\n *\n * @param {Function} callback\n * @returns {void}\n */\n subscribe(callback: any) {\n let data;\n let csis;\n let speaker;\n let transcription;\n\n this.webSocket.onmessage = (event) => {\n data = JSON.parse(event.data);\n csis = data.data?.voiceaPayload?.csis || [];\n speaker = this.getSpeaker(csis);\n transcription = data.data?.voiceaPayload?.data || '';\n\n this.webSocket.send(JSON.stringify({messageID: data.id, type: 'ack'}));\n\n if (transcription) {\n callback({\n id: data.data?.voiceaPayload?.transcript_id,\n personID: speaker?.id,\n transcription,\n timestamp: data.timestamp,\n type: data?.data?.voiceaPayload?.type,\n });\n }\n };\n }\n\n /**\n * Close the LLM web socket connection\n * @returns {void}\n */\n closeSocket() {\n this.webSocket.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAEA;AACA;AACA;AACA;AACA;IACqBA,a;EAOnB;AACF;AACA;AACA;AACA;AACA;AACA;EACE,uBAAYC,YAAZ,EAAkCC,SAAlC,EAAkDC,OAAlD,EAAmE;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IACjE,KAAKF,YAAL,GAAoBA,YAApB;IACA,KAAKG,SAAL,GAAiBF,SAAjB;IACA,KAAKC,OAAL,GAAeA,OAAf;IACA,KAAKE,UAAL,GAAkB,EAAlB;IAEA,IAAMC,MAAM,GAAG,iEAAf;IAEA,KAAKC,SAAL,GAAiB,IAAIC,SAAJ,WAAiB,KAAKP,YAAtB,SAAqCK,MAArC,EAAjB;EACD;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;WACE,iBAAQG,KAAR,EAAuB;MAAA;;MACrB,KAAKF,SAAL,CAAeG,MAAf,GAAwB,YAAM;QAC5B,KAAI,CAACH,SAAL,CAAeI,IAAf,CACE,wBAAe;UACbC,EAAE,EAAE,IAAAC,QAAA,GADS;UAEbC,IAAI,EAAE,eAFO;UAGbC,IAAI,EAAE;YAACN,KAAK,mBAAYA,KAAZ;UAAN,CAHO;UAIbO,UAAU,yBAAkB,KAAI,CAACZ,SAAvB,SAAmC,aAASa,QAAT,EAAnC;QAJG,CAAf,CADF;MAQD,CATD;IAUD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,uBAAcC,QAAd,EAA6B;MAC3B,IAAIA,QAAJ,EAAc;QACZ,KAAKX,SAAL,CAAeY,OAAf,GAAyB,UAACC,KAAD,EAAW;UAClCF,QAAQ,CAACE,KAAD,CAAR;QACD,CAFD;MAGD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,uBAAcF,QAAd,EAA6B;MAC3B,IAAIA,QAAJ,EAAc;QACZ,KAAKX,SAAL,CAAec,OAAf,GAAyB,UAACD,KAAD,EAAW;UAClCF,QAAQ,CAACE,KAAD,CAAR;QACD,CAFD;MAGD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,oBAAmBE,IAAnB,EAA8B;MAAA;;MAAA,2CACVA,IADU;MAAA;;MAAA;QAC5B,oDAAwB;UAAA,IAAbC,GAAa;UACtB,IAAMC,MAAM,GAAG,KAAKnB,UAAL,CAAgBkB,GAAhB,CAAf;;UAEA,IAAIC,MAAJ,EAAY;YACV,OAAOA,MAAP;UACD;QACF;MAP2B;QAAA;MAAA;QAAA;MAAA;;MAS5B,OAAO,qBAAc,KAAKrB,OAAL,CAAasB,iBAAb,CAA+BtB,OAA7C,EAAsDuB,IAAtD,CAA2D,UAACF,MAAD,EAAiB;QACjF,IAAMnB,UAAU,GAAGmB,MAAM,CAACG,WAAP,CAAmBC,MAAnB,CAA0BN,IAA7C;QACA,IAAIO,cAAc,GAAG,KAArB;;QAFiF,4CAI/DP,IAJ+D;QAAA;;QAAA;UAIjF,uDAAwB;YAAA,IAAbC,GAAa;;YACtB,IAAIlB,UAAU,CAACyB,QAAX,CAAoBP,GAApB,CAAJ,EAA8B;cAC5B,MAAI,CAAClB,UAAL,CAAgBkB,GAAhB,IAAuBC,MAAvB;cACAK,cAAc,GAAG,IAAjB;cACA;YACD;UACF;QAVgF;UAAA;QAAA;UAAA;QAAA;;QAYjF,OAAOA,cAAP;MACD,CAbM,CAAP;IAcD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,mBAAUX,QAAV,EAAyB;MAAA;;MACvB,IAAIH,IAAJ;MACA,IAAIO,IAAJ;MACA,IAAIS,OAAJ;MACA,IAAIC,aAAJ;;MAEA,KAAKzB,SAAL,CAAe0B,SAAf,GAA2B,UAACb,KAAD,EAAW;QAAA;;QACpCL,IAAI,GAAGmB,IAAI,CAACC,KAAL,CAAWf,KAAK,CAACL,IAAjB,CAAP;QACAO,IAAI,GAAG,eAAAP,IAAI,CAACA,IAAL,mFAAWqB,aAAX,gFAA0Bd,IAA1B,KAAkC,EAAzC;QACAS,OAAO,GAAG,MAAI,CAACM,UAAL,CAAgBf,IAAhB,CAAV;QACAU,aAAa,GAAG,gBAAAjB,IAAI,CAACA,IAAL,qFAAWqB,aAAX,gFAA0BrB,IAA1B,KAAkC,EAAlD;;QAEA,MAAI,CAACR,SAAL,CAAeI,IAAf,CAAoB,wBAAe;UAAC2B,SAAS,EAAEvB,IAAI,CAACH,EAAjB;UAAqBE,IAAI,EAAE;QAA3B,CAAf,CAApB;;QAEA,IAAIkB,aAAJ,EAAmB;UAAA;;UACjBd,QAAQ,CAAC;YACPN,EAAE,iBAAEG,IAAI,CAACA,IAAP,yEAAE,YAAWqB,aAAb,0DAAE,sBAA0BG,aADvB;YAEPC,QAAQ,cAAET,OAAF,6CAAE,SAASnB,EAFZ;YAGPoB,aAAa,EAAbA,aAHO;YAIPS,SAAS,EAAE1B,IAAI,CAAC0B,SAJT;YAKP3B,IAAI,WAAEC,IAAF,yDAAE,MAAMA,IAAR,yEAAE,YAAYqB,aAAd,0DAAE,sBAA2BtB;UAL1B,CAAD,CAAR;QAOD;MACF,CAjBD;IAkBD;IAED;AACF;AACA;AACA;;;;WACE,uBAAc;MACZ,KAAKP,SAAL,CAAemC,KAAf;IACD"}
|