@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.20
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/breakouts/breakout.js +116 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/index.js +226 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/common/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +10 -24
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +11 -24
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +12 -25
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +10 -24
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +10 -24
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +9 -23
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +10 -24
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +10 -24
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +6 -41
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +5 -25
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +37 -60
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +88 -46
- package/dist/constants.js.map +1 -1
- package/dist/index.js +1 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +12 -29
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +184 -190
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +3 -37
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +12 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +92 -118
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +34 -91
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +67 -111
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +80 -114
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +10 -12
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +125 -190
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +5 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +1692 -1925
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +36 -77
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +224 -230
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +43 -215
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +6 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +14 -32
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +193 -268
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +3 -15
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +137 -228
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +5 -20
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +490 -560
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +24 -41
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +99 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +78 -86
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +31 -68
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +3 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +93 -200
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +16 -39
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +9 -38
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +0 -2
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +1 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +55 -135
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +57 -32
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/multistreamMedia.js +15 -21
- package/dist/multistream/multistreamMedia.js.map +1 -1
- package/dist/multistream/receiveSlot.js +10 -50
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +45 -82
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +18 -58
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +362 -416
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +36 -57
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +21 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +1 -31
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +138 -182
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +3 -18
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +109 -0
- package/dist/reactions/reactions.js.map +1 -0
- package/dist/reactions/reactions.type.js +36 -0
- package/dist/reactions/reactions.type.js.map +1 -0
- package/dist/reconnection-manager/index.js +322 -455
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +39 -64
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +94 -113
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +85 -94
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +0 -2
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +85 -175
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +72 -53
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +22 -47
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +7 -6
- package/package.json +25 -20
- package/src/breakouts/README.md +190 -0
- package/src/breakouts/breakout.ts +110 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/index.ts +225 -0
- package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
- package/src/common/collection.ts +9 -7
- package/src/common/{config.js → config.ts} +1 -1
- package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
- package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
- package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
- package/src/common/errors/{media.js → media.ts} +11 -7
- package/src/common/errors/parameter.ts +11 -7
- package/src/common/errors/{password-error.js → password-error.ts} +11 -7
- package/src/common/errors/{permission.js → permission.ts} +10 -6
- package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
- package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
- package/src/common/errors/{stats.js → stats.ts} +11 -7
- package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
- package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
- package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
- package/src/common/events/{events.js → events.ts} +5 -1
- package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
- package/src/common/events/{util.js → util.ts} +2 -3
- package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
- package/src/common/logs/logger-proxy.ts +44 -0
- package/src/common/logs/{request.js → request.ts} +22 -9
- package/src/common/queue.ts +1 -2
- package/src/{config.js → config.ts} +17 -12
- package/src/constants.ts +40 -1
- package/src/index.js +1 -1
- package/src/locus-info/controlsUtils.ts +114 -0
- package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
- package/src/locus-info/{fullState.js → fullState.ts} +16 -12
- package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
- package/src/locus-info/{index.js → index.ts} +148 -64
- package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
- package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
- package/src/locus-info/{parser.js → parser.ts} +67 -79
- package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
- package/src/media/{index.js → index.ts} +181 -131
- package/src/media/{properties.js → properties.ts} +47 -28
- package/src/media/{util.js → util.ts} +2 -2
- package/src/mediaQualityMetrics/{config.js → config.ts} +46 -46
- package/src/meeting/{effectsState.js → effectsState.ts} +47 -41
- package/src/meeting/in-meeting-actions.ts +15 -3
- package/src/meeting/{index.js → index.ts} +2263 -1427
- package/src/meeting/{muteState.js → muteState.ts} +78 -42
- package/src/meeting/{request.js → request.ts} +292 -142
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/{state.js → state.ts} +50 -35
- package/src/meeting/{util.js → util.ts} +112 -115
- package/src/meeting-info/{collection.js → collection.ts} +6 -2
- package/src/meeting-info/{index.js → index.ts} +42 -36
- package/src/meeting-info/meeting-info-v2.ts +273 -0
- package/src/meeting-info/{request.js → request.ts} +14 -4
- package/src/meeting-info/{util.js → util.ts} +60 -51
- package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
- package/src/meetings/{collection.js → collection.ts} +6 -3
- package/src/meetings/index.ts +1159 -0
- package/src/meetings/{request.js → request.ts} +32 -25
- package/src/meetings/{util.js → util.ts} +34 -32
- package/src/member/{index.js → index.ts} +102 -56
- package/src/member/{util.js → util.ts} +52 -25
- package/src/members/{collection.js → collection.ts} +2 -2
- package/src/members/{index.js → index.ts} +219 -142
- package/src/members/{request.js → request.ts} +60 -16
- package/src/members/{util.js → util.ts} +50 -48
- package/src/metrics/{config.js → config.ts} +254 -83
- package/src/metrics/{constants.js → constants.ts} +0 -2
- package/src/metrics/{index.js → index.ts} +106 -74
- package/src/multistream/mediaRequestManager.ts +81 -15
- package/src/multistream/multistreamMedia.ts +5 -0
- package/src/multistream/receiveSlot.ts +18 -12
- package/src/multistream/receiveSlotManager.ts +23 -21
- package/src/multistream/remoteMedia.ts +15 -5
- package/src/multistream/remoteMediaGroup.ts +4 -3
- package/src/multistream/remoteMediaManager.ts +153 -37
- package/src/networkQualityMonitor/{index.js → index.ts} +37 -25
- package/src/personal-meeting-room/{index.js → index.ts} +28 -19
- package/src/personal-meeting-room/{request.js → request.ts} +13 -4
- package/src/personal-meeting-room/{util.js → util.ts} +4 -4
- package/src/reachability/{index.js → index.ts} +99 -83
- package/src/reachability/request.ts +39 -33
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +104 -0
- package/src/reactions/reactions.type.ts +62 -0
- package/src/reconnection-manager/{index.js → index.ts} +195 -102
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/{index.js → index.ts} +73 -56
- package/src/roap/request.ts +157 -0
- package/src/roap/turnDiscovery.ts +77 -37
- package/src/statsAnalyzer/{global.js → global.ts} +30 -33
- package/src/statsAnalyzer/{index.js → index.ts} +468 -192
- package/src/statsAnalyzer/mqaUtil.ts +290 -0
- package/src/transcription/{index.js → index.ts} +46 -39
- package/test/integration/spec/journey.js +664 -463
- package/test/integration/spec/space-meeting.js +320 -206
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/breakouts/breakout.ts +119 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/index.ts +293 -0
- 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 +25 -5
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +104 -2
- package/test/unit/spec/locus-info/infoUtils.js +41 -32
- 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 +97 -103
- package/test/unit/spec/locus-info/selfUtils.js +105 -12
- package/test/unit/spec/media/index.ts +31 -47
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/effectsState.js +39 -45
- package/test/unit/spec/meeting/in-meeting-actions.ts +5 -2
- package/test/unit/spec/meeting/index.js +2017 -742
- package/test/unit/spec/meeting/muteState.js +42 -33
- package/test/unit/spec/meeting/request.js +115 -44
- package/test/unit/spec/meeting/utils.js +104 -171
- 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 +439 -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 +31 -7
- 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/multistream/mediaRequestManager.ts +316 -50
- package/test/unit/spec/multistream/receiveSlot.ts +6 -6
- package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
- package/test/unit/spec/multistream/remoteMedia.ts +10 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
- 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 +58 -26
- package/test/unit/spec/reconnection-manager/index.js +102 -9
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +2 -1
- package/test/unit/spec/roap/request.ts +114 -0
- package/test/unit/spec/roap/turnDiscovery.ts +64 -45
- package/test/unit/spec/stats-analyzer/index.js +27 -22
- 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 +54 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -124
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/src/common/logs/logger-proxy.js +0 -33
- package/src/locus-info/controlsUtils.js +0 -102
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/meeting-info/meeting-info-v2.js +0 -255
- package/src/meetings/index.js +0 -1015
- package/src/peer-connection-manager/util.ts +0 -117
- package/src/roap/request.js +0 -127
- package/src/statsAnalyzer/mqaUtil.js +0 -173
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
|
@@ -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.js"],"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 /**\n * Creates a new instance of StatsAnalyzer\n * @constructor\n * @public\n * @param {Object} config SDK Configuration Object\n * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)\n * @param {Object} statsResults Default properties for stats\n */\n constructor(config, networkQualityMonitor = {}, statsResults = defaultStats) {\n super();\n this.statsStarted = false;\n this.statsResults = statsResults;\n this.lastStatsResults = null;\n this.config = config;\n this.networkQualityMonitor = networkQualityMonitor;\n this.correlationId = config.correlationId;\n this.mqaSentCount = -1;\n this.lastMqaDataSent = {\n resolutions: {video: {send: {}, recv: {}}, audio: {send: {}, recv: {}}, share: {send: {}, recv: {}}},\n video: {send: {}, recv: {}},\n audio: {send: {}, recv: {}},\n share: {send: {}, recv: {}}\n };\n this.localMQEStats = {\n audio: {\n RX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: []\n },\n TX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: []\n }\n },\n video: {\n RX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: [],\n frameRate: [],\n resolutionWidth: [],\n resolutionHeight: [],\n requestedKeyFrame: [],\n receivedKeyFrame: []\n },\n TX: {\n packetsLost: [],\n jitter: [],\n latency: [],\n bitRate: [],\n frameRate: [],\n resolutionWidth: [],\n resolutionHeight: [],\n requestedKeyFrame: [],\n receivedKeyFrame: []\n }\n }\n };\n this.lastEmittedStartStopEvent = {\n audio: {\n local: undefined,\n remote: undefined,\n },\n video: {\n local: undefined,\n remote: undefined,\n },\n share: {\n local: undefined,\n remote: undefined,\n },\n };\n }\n\n populateResults(lastMqa) {\n // Audio\n\n this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);\n this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);\n this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);\n this.localMQEStats.audio.RX.bitRate.push(lastMqa.audioReceive[0].streams[0].common.receivedBitrate);\n\n this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);\n this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);\n this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);\n this.localMQEStats.audio.TX.bitRate.push(lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate);\n\n // Video\n\n this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);\n this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);\n this.localMQEStats.video.RX.latency.push(lastMqa.videoReceive[0].streams[0].common.roundTripTime);\n this.localMQEStats.video.RX.bitRate.push(lastMqa.videoReceive[0].streams[0].common.receivedBitrate);\n this.localMQEStats.video.RX.frameRate.push(lastMqa.videoReceive[0].streams[0].common.receivedFrameRate);\n this.localMQEStats.video.RX.resolutionWidth.push(lastMqa.videoReceive[0].streams[0].receivedWidth);\n this.localMQEStats.video.RX.resolutionHeight.push(lastMqa.videoReceive[0].streams[0].receivedHeight);\n this.localMQEStats.video.RX.requestedKeyFrame.push();\n this.localMQEStats.video.RX.receivedKeyFrame.push();\n\n this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);\n this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);\n this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);\n this.localMQEStats.video.TX.bitRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate);\n this.localMQEStats.video.TX.frameRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate);\n this.localMQEStats.video.TX.resolutionWidth.push(lastMqa.videoTransmit[0].streams[0].transmittedWidth);\n this.localMQEStats.video.TX.resolutionHeight.push(lastMqa.videoTransmit[0].streams[0].transmittedHeight);\n this.localMQEStats.video.TX.requestedKeyFrame.push(lastMqa.videoTransmit[0].streams[0].requestedKeyFrames);\n this.localMQEStats.video.TX.receivedKeyFrame.push();\n }\n\n\n resetStatsResults() {\n this.statsResults.audio.send.meanRemoteJitter = [];\n this.statsResults.video.send.meanRemoteJitter = [];\n this.statsResults.share.send.meanRemoteJitter = [];\n\n this.statsResults.audio.recv.meanRtpJitter = [];\n\n // TODO: currently no values are present\n this.statsResults.video.recv.meanRtpJitter = [];\n this.statsResults.share.recv.meanRtpJitter = [];\n\n // Reset the roundTripTime\n this.statsResults.audio.send.meanRoundTripTime = [];\n this.statsResults.video.send.meanRoundTripTime = [];\n this.statsResults.share.send.meanRoundTripTime = [];\n }\n\n /**\n * sets mediaStatus status for analyzing metrics\n *\n * @public\n * @param {Object} status for the audio and video\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n updateMediaStatus(status) {\n this.meetingMediaStatus = status;\n }\n\n /**\n * captures MQA data from media connection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n sendMqaData() {\n const audioReceiver = mqaData.intervals[0].audioReceive[0];\n const audioSender = mqaData.intervals[0].audioTransmit[0];\n const videoReceiver = mqaData.intervals[0].videoReceive[0];\n const videoSender = mqaData.intervals[0].videoTransmit[0];\n const shareSender = mqaData.intervals[0].videoTransmit[1];\n const shareReceiver = mqaData.intervals[0].videoReceive[1];\n\n getAudioSenderMqa({\n audioSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n getAudioReceiverMqa({\n audioReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n\n getVideoReceiverMqa({\n videoReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n getVideoSenderMqa({\n videoSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent\n });\n\n // Capture mqa for share scenario\n\n getVideoSenderMqa({\n videoSender: shareSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n isShareStream: true\n });\n\n getVideoReceiverMqa({\n videoReceiver: shareReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n isShareStream: true\n });\n\n mqaData.intervals[0].intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];\n\n // Adding peripheral information\n mqaData.intervals[0].intervalMetadata.peripherals = [];\n mqaData.intervals[0].intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});\n mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.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 mqaData.networkType = this.statsResults.connectionType.local.networkType;\n\n this.mqaSentCount += 1;\n\n mqaData.intervals[0].intervalNumber = this.mqaSentCount;\n\n // DO Deep copy, for some reason it takes the reference all the time rather then old value set\n this.lastMqaDataSent = cloneDeep(this.statsResults);\n\n this.populateResults(mqaData.intervals[0]);\n\n this.resetStatsResults();\n\n this.emit(\n {\n file: 'statsAnalyzer',\n function: 'sendMqaData'\n },\n EVENTS.MEDIA_QUALITY,\n {\n data: mqaData.intervals[0],\n networkType: mqaData.networkType\n }\n );\n }\n\n /**\n * updated the media connection when changed\n *\n * @private\n * @memberof StatsAnalyzer\n * @param {MC.RoapMediaConnection} mediaConnection\n * @returns {void}\n */\n updateMediaConnection(mediaConnection) {\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 startAnalyzer(mediaConnection) {\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 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 parseGetStatsResult(getStatsResult, type, isSender) {\n if (!getStatsResult) {\n return;\n }\n\n switch (getStatsResult.type) {\n case 'outbound-rtp':\n this.processOutboundRTPResult(getStatsResult, type);\n break;\n case 'inbound-rtp':\n this.processInboundRTPResult(getStatsResult, type);\n break;\n case 'track':\n this.processTrackResult(getStatsResult, type);\n break;\n case 'remote-inbound-rtp':\n case 'remote-outbound-rtp':\n this.compareSentAndReceived(getStatsResult, type, isSender);\n break;\n case 'remotecandidate':\n case 'remote-candidate':\n this.parseCandidate(getStatsResult, type, isSender, true);\n break;\n case 'local-candidate':\n this.parseCandidate(getStatsResult, type, isSender, false);\n break;\n case 'media-source':\n this.parseAudioSource(getStatsResult, type);\n break;\n default:\n break;\n }\n }\n\n /**\n * Filters the get stats results for types\n * @private\n * @param {Array} getStatsResults\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n */\n filterAndParseGetStatsResults(getStatsResults, type, isSender) {\n const {types} = DEFAULT_GET_STATS_FILTER;\n\n getStatsResults.forEach((result) => {\n if (types.includes(result.type)) {\n this.parseGetStatsResult(result, type, isSender);\n }\n });\n }\n\n /**\n * parse the audio\n * @param {String} result\n * @param {boolean} type\n * @returns {void}\n */\n parseAudioSource(result, type) {\n if (!result) {\n return;\n }\n\n if (type === STATS.AUDIO_CORRELATE) {\n this.statsResults[type].send.audioLevel = result.audioLevel;\n this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;\n }\n }\n\n /**\n * emits started/stopped events for local/remote media by checking\n * if given values are increasing or not. The previousValue, currentValue\n * params can be any numerical value like number of receive packets or\n * decoded frames, etc.\n *\n * @private\n * @param {string} mediaType\n * @param {number} previousValue - value to compare\n * @param {number} currentValue - value to compare (must be same type of value as previousValue)\n * @param {boolean} isLocal - true if stats are for local media being sent out, false for remote media being received\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n emitStartStopEvents = (mediaType, previousValue, currentValue, isLocal) => {\n if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {\n throw new Error(`Unsupported mediaType: ${mediaType}`);\n }\n\n // eslint-disable-next-line no-param-reassign\n if (previousValue === undefined) previousValue = 0;\n // eslint-disable-next-line no-param-reassign\n if (currentValue === undefined) currentValue = 0;\n\n const lastEmittedEvent = isLocal ? this.lastEmittedStartStopEvent[mediaType].local : this.lastEmittedStartStopEvent[mediaType].remote;\n\n let newEvent;\n\n if ((currentValue - previousValue) > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;\n }\n else if ((currentValue === previousValue) && currentValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;\n }\n\n if (newEvent && lastEmittedEvent !== newEvent) {\n if (isLocal) {\n this.lastEmittedStartStopEvent[mediaType].local = newEvent;\n }\n else {\n this.lastEmittedStartStopEvent[mediaType].remote = newEvent;\n }\n this.emit(\n {\n file: 'statsAnalyzer/index',\n function: 'compareLastStatsResult'\n },\n newEvent,\n {\n type: mediaType\n }\n );\n }\n };\n\n /**\n * compares current and previous stats to check if packets are not sent\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n compareLastStatsResult() {\n if (this.lastStatsResults !== null && this.meetingMediaStatus) {\n // compare audio stats sent\n let mediaType = STATS.AUDIO_CORRELATE;\n let currentStats = null;\n let previousStats = null;\n\n if (this.meetingMediaStatus.expected.sendAudio) {\n currentStats = this.statsResults[mediaType].send;\n previousStats = this.lastStatsResults[mediaType].send;\n\n if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);\n }\n else {\n if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`);\n }\n\n if (currentStats.audioLevel === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`);\n }\n }\n\n this.emitStartStopEvents(mediaType, previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);\n }\n\n if (this.meetingMediaStatus.expected.receiveAudio) {\n // compare audio stats received\n currentStats = this.statsResults[mediaType].recv;\n previousStats = this.lastStatsResults[mediaType].recv;\n\n if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);\n }\n else if (currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||\n currentStats.totalSamplesReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`);\n }\n\n this.emitStartStopEvents(mediaType, previousStats.totalPacketsReceived, currentStats.totalPacketsReceived, false);\n }\n\n mediaType = STATS.VIDEO_CORRELATE;\n if (this.meetingMediaStatus.expected.sendVideo) {\n // compare video stats sent\n currentStats = this.statsResults[mediaType].send;\n previousStats = this.lastStatsResults[mediaType].send;\n\n if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);\n }\n else {\n if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`);\n }\n }\n\n this.emitStartStopEvents(\n mediaType,\n previousStats.framesSent,\n currentStats.framesSent,\n true\n );\n }\n\n\n if (this.meetingMediaStatus.expected.receiveVideo) {\n // compare video stats reveived\n\n currentStats = this.statsResults[mediaType].recv;\n previousStats = this.lastStatsResults[mediaType].recv;\n\n if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);\n }\n else {\n if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);\n }\n\n if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);\n }\n }\n\n this.emitStartStopEvents(\n mediaType,\n previousStats.framesDecoded,\n currentStats.framesDecoded,\n false\n );\n }\n\n mediaType = STATS.SHARE_CORRELATE;\n if (this.meetingMediaStatus.expected.sendShare) {\n // compare share stats sent\n\n currentStats = this.statsResults[mediaType].send;\n previousStats = this.lastStatsResults[mediaType].send;\n\n if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);\n }\n else {\n if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`);\n }\n }\n\n // TODO:need to check receive share value\n // compare share stats reveived\n currentStats = this.statsResults[mediaType].recv;\n previousStats = this.lastStatsResults[mediaType].recv;\n\n if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsSent === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);\n }\n else {\n if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);\n }\n\n if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);\n }\n\n if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);\n }\n }\n\n // we are not calling emitStartStopEvents() for sending or receiving share because sharing is often started and stopped\n // in meetings and this.meetingMediaStatus.expected values can be out of sync with the actual packet flow\n // so we would send \"sharing stopped\" events incorrectly\n }\n }\n }\n\n /**\n * Does a `getStats` on all the transceivers and parses the results\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {Promise}\n */\n getStatsAndParse() {\n if (!this.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 processOutboundRTPResult(result, type) {\n const mediaType = type || STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n if (result.bytesSent) {\n let kilobytes = 0;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;\n }\n\n const bytes = result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n\n kilobytes = bytes / 1024;\n\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesSent = kilobytes;\n\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;\n this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded - this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;\n this.statsResults.internal[mediaType].outboundRtpId = result.id;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n\n // Data saved to send MQA metrics\n\n this.statsResults[mediaType][sendrecvType].totalKeyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].totalPacketsSent = result.packetsSent;\n this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;\n this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].encoderImplementation = result.encoderImplementation;\n this.statsResults[mediaType][sendrecvType].qualityLimitationReason = result.qualityLimitationReason;\n this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges = result.qualityLimitationResolutionChanges;\n this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent = result.retransmittedPacketsSent;\n this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;\n this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;\n this.statsResults[mediaType][sendrecvType].retransmittedBytesSent = result.retransmittedBytesSent;\n }\n }\n\n\n /**\n * Processes InboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n */\n processInboundRTPResult(result, type) {\n const mediaType = type || STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n if (result.bytesReceived) {\n let kilobytes = 0;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {\n this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {\n this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {\n this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;\n }\n\n const bytes = result.bytesReceived - (this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived);\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;\n\n kilobytes = bytes / 1024;\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);\n\n this.statsResults[mediaType][sendrecvType].pliCount = result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;\n this.statsResults[mediaType][sendrecvType].currentPacketsLost = result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;\n if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {\n this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsReceived = result.packetsReceived - this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {\n LoggerProxy.logger.info(`StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `, this.statsResults[mediaType][sendrecvType].packetsReceived);\n }\n\n // Check the over all packet Lost ratio\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0 ? this.statsResults[mediaType][sendrecvType].currentPacketsLost / (this.statsResults[mediaType][sendrecvType].packetsReceived + this.statsResults[mediaType][sendrecvType].currentPacketsLost) : 0;\n if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {\n LoggerProxy.logger.info('StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ', this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);\n }\n\n // TODO: check the packet loss value is negative values here\n\n if (result.packetsLost) {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;\n }\n else {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;\n\n // From Thin\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;\n\n this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n\n this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;\n this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;\n this.statsResults[mediaType][sendrecvType].headerBytesReceived = result.headerBytesReceived;\n\n this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter);\n\n // Audio stats\n\n this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;\n this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;\n this.statsResults[mediaType][sendrecvType].totalSamplesReceived = result.totalSamplesReceived || 0;\n this.statsResults[mediaType][sendrecvType].totalSamplesDecoded = result.totalSamplesDecoded || 0;\n this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;\n }\n }\n\n /**\n * Processes remote and local candidate result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @param {boolean} isSender\n * @param {boolean} isRemote\n *\n * @returns {void}\n */\n parseCandidate = (result, type, isSender, isRemote) => {\n if (!result || !result.id) {\n return;\n }\n const RemoteCandidateType = {};\n const RemoteTransport = {};\n const RemoteIpAddress = {};\n const RemoteNetworkType = {};\n\n if (!result.id) return;\n\n const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;\n const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;\n\n if (!RemoteCandidateType[result.id]) {\n RemoteCandidateType[result.id] = [];\n }\n\n if (!RemoteTransport[result.id]) {\n RemoteTransport[result.id] = [];\n }\n\n if (!RemoteIpAddress[result.id]) {\n RemoteIpAddress[result.id] = [];\n }\n if (!RemoteNetworkType[result.id]) {\n RemoteNetworkType[result.id] = [];\n }\n\n if (result.candidateType && RemoteCandidateType[result.id].indexOf(result.candidateType) === -1) {\n RemoteCandidateType[result.id].push(result.candidateType);\n }\n\n if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {\n RemoteTransport[result.id].push(result.protocol.toUpperCase());\n }\n\n if (result.ip && RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1) {\n RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports\n }\n\n if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {\n RemoteNetworkType[result.id].push(result.networkType);\n }\n\n this.statsResults.internal.candidates[result.id] = {\n candidateType: RemoteCandidateType[result.id],\n ipAddress: RemoteIpAddress[result.id],\n portNumber: result.port,\n networkType: RemoteNetworkType[result.id],\n priority: result.priority,\n transport: RemoteTransport[result.id],\n timestamp: result.time,\n id: result.id,\n type: result.type\n };\n\n this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];\n this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];\n\n this.statsResults.connectionType[ipType].networkType = RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : RemoteNetworkType[result.id][0];\n this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];\n\n this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;\n };\n\n /**\n * Process Track results\n *\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n processTrackResult(result, mediaType) {\n if (!result || result.type !== 'track') {\n return;\n }\n if (result.type !== 'track') return;\n\n const sendrecvType = result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;\n }\n\n if (sendrecvType === STATS.RECEIVE_DIRECTION) {\n this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;\n }\n\n\n if (result.trackIdentifier && mediaType !== STATS.AUDIO_CORRELATE) {\n this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;\n\n const jitterBufferDelay = result && result.jitterBufferDelay;\n const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;\n\n this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay = jitterBufferEmittedCount && (+jitterBufferDelay / +jitterBufferEmittedCount);\n\n // Used to calculate the jitter\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay = result.jitterBufferDelay;\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount = result.jitterBufferEmittedCount;\n }\n }\n\n /**\n *\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n compareSentAndReceived(result, type) {\n if (!type) {\n return;\n }\n\n const mediaType = type;\n\n if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) { this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost; }\n\n const currentPacketLoss = result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;\n\n this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n\n this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);\n this.statsResults[mediaType].send.meanRoundTripTime.push(result.roundTripTime);\n\n this.statsResults[mediaType].send.timestamp = result.timestamp;\n this.statsResults[mediaType].send.ssrc = result.ssrc;\n this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;\n\n // Total packloss ratio on this video section of the call\n this.statsResults[mediaType].send.overAllPacketLossRatio = this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0 ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver / this.statsResults[mediaType].send.totalPacketsSent : 0;\n this.statsResults[mediaType].send.currentPacketLossRatio = this.statsResults[mediaType].send.packetsLostOnReceiver > 0 ? this.statsResults[mediaType].send.packetsLostOnReceiver * 100 / (this.statsResults[mediaType].send.packetsSent + this.statsResults[mediaType].send.packetsLostOnReceiver) : 0;\n\n if (this.statsResults[mediaType].send.maxPacketLossRatio < this.statsResults[mediaType].send.currentPacketLossRatio) {\n this.statsResults[mediaType].send.maxPacketLossRatio = this.statsResults[mediaType].send.currentPacketLossRatio;\n }\n\n if (result.type === 'remote-inbound-rtp') {\n this.networkQualityMonitor.determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults: result,\n statsAnalyzerCurrentStats: this.statsResults\n });\n }\n }\n}\n"],"mappings":"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"}
|
|
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","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 {ConnectionState} 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 {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 {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() === 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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"}
|