@webex/plugin-meetings 3.0.0-beta.42 → 3.0.0-beta.420
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/README.md +58 -8
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +94 -15
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +625 -123
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +27 -8
- package/dist/breakouts/utils.js.map +1 -1
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/reclaim-host-role-errors.js +158 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/webex-errors.js +48 -7
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +5 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +247 -34
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +14 -2
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +109 -15
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +309 -18
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +116 -2
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.js +15 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/locusRetry.js +93 -0
- package/dist/interceptors/locusRetry.js.map +1 -0
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +380 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +386 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +71 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +249 -72
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +65 -102
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +73 -124
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +135 -330
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +86 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +4525 -2997
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +236 -136
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +189 -155
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +676 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting/voicea-meeting.js +172 -0
- package/dist/meeting/voicea-meeting.js.map +1 -0
- package/dist/meeting-info/index.js +73 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +201 -57
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +8 -7
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +44 -40
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +39 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +484 -119
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +73 -7
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +57 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +132 -25
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +100 -5
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +326 -232
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +18 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -446
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +223 -32
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +10 -0
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +20 -4
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +3 -1
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +76 -5
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +366 -104
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +255 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/clusterReachability.js +356 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.js +263 -390
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +16 -12
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reconnection-manager/index.js +266 -202
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +66 -28
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +50 -66
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +407 -79
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +179 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +389 -304
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +296 -156
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/utils.d.ts +9 -2
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/types/common/errors/webex-errors.d.ts +25 -1
- package/dist/types/common/logs/request.d.ts +2 -0
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +2 -7
- package/dist/types/constants.d.ts +204 -32
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -5
- package/dist/types/interceptors/index.d.ts +2 -0
- package/dist/types/interceptors/locusRetry.d.ts +27 -0
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +66 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -49
- package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
- package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
- package/dist/types/meeting/index.d.ts +631 -505
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +88 -26
- package/dist/types/meeting/request.d.ts +67 -43
- package/dist/types/meeting/util.d.ts +118 -1
- package/dist/types/meeting/voicea-meeting.d.ts +16 -0
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +17 -0
- package/dist/types/meetings/index.d.ts +114 -21
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +14 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +25 -0
- package/dist/types/members/util.d.ts +214 -1
- package/dist/types/metrics/constants.d.ts +17 -0
- package/dist/types/metrics/index.d.ts +4 -111
- package/dist/types/multistream/mediaRequestManager.d.ts +71 -3
- package/dist/types/multistream/receiveSlot.d.ts +7 -3
- package/dist/types/multistream/receiveSlotManager.d.ts +7 -0
- package/dist/types/multistream/remoteMedia.d.ts +3 -31
- package/dist/types/multistream/remoteMediaGroup.d.ts +2 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +61 -2
- package/dist/types/multistream/sendSlotManager.d.ts +69 -0
- package/dist/types/reachability/clusterReachability.d.ts +109 -0
- package/dist/types/reachability/index.d.ts +60 -95
- package/dist/types/reachability/request.d.ts +3 -1
- package/dist/types/reachability/util.d.ts +8 -0
- package/dist/types/reconnection-manager/index.d.ts +19 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/index.d.ts +11 -2
- package/dist/types/roap/request.d.ts +9 -8
- package/dist/types/roap/turnDiscovery.d.ts +90 -9
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +61 -0
- package/dist/types/statsAnalyzer/index.d.ts +34 -12
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/collection.js +44 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +69 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +22 -19
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +27 -6
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +494 -73
- package/src/breakouts/utils.ts +26 -8
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/reclaim-host-role-errors.ts +134 -0
- package/src/common/errors/webex-errors.ts +44 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +5 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +6 -13
- package/src/constants.ts +234 -22
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +45 -0
- package/src/interceptors/index.ts +3 -0
- package/src/interceptors/locusRetry.ts +67 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +349 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +417 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +80 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +100 -108
- package/src/media/properties.ts +88 -117
- package/src/mediaQualityMetrics/config.ts +103 -238
- package/src/meeting/in-meeting-actions.ts +171 -3
- package/src/meeting/index.ts +3869 -2574
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +237 -136
- package/src/meeting/request.ts +173 -122
- package/src/meeting/util.ts +690 -395
- package/src/meeting/voicea-meeting.ts +122 -0
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +166 -16
- package/src/meeting-info/util.ts +13 -10
- package/src/meeting-info/utilv2.ts +47 -37
- package/src/meetings/collection.ts +33 -0
- package/src/meetings/index.ts +507 -127
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +81 -12
- package/src/member/index.ts +57 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +141 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +133 -7
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +333 -240
- package/src/metrics/constants.ts +17 -0
- package/src/metrics/index.ts +1 -469
- package/src/multistream/mediaRequestManager.ts +271 -56
- package/src/multistream/receiveSlot.ts +11 -4
- package/src/multistream/receiveSlotManager.ts +16 -4
- package/src/multistream/remoteMedia.ts +5 -3
- package/src/multistream/remoteMediaGroup.ts +78 -0
- package/src/multistream/remoteMediaManager.ts +248 -45
- package/src/multistream/sendSlotManager.ts +198 -0
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +229 -346
- package/src/reachability/request.ts +22 -14
- package/src/reachability/util.ts +24 -0
- package/src/reconnection-manager/index.ts +128 -97
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +76 -25
- package/src/roap/request.ts +50 -69
- package/src/roap/turnDiscovery.ts +331 -67
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +166 -0
- package/src/statsAnalyzer/index.ts +496 -419
- package/src/statsAnalyzer/mqaUtil.ts +317 -170
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +60 -3
- package/test/integration/spec/journey.js +321 -262
- package/test/integration/spec/space-meeting.js +76 -3
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +119 -28
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1204 -118
- package/test/unit/spec/breakouts/utils.js +27 -2
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interceptors/locusRetry.ts +131 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +625 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1372 -37
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +203 -17
- package/test/unit/spec/media/index.ts +178 -81
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
- package/test/unit/spec/meeting/index.js +7775 -2521
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +549 -207
- package/test/unit/spec/meeting/request.js +494 -54
- package/test/unit/spec/meeting/utils.js +827 -74
- package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +535 -9
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +26 -0
- package/test/unit/spec/meetings/index.js +1496 -219
- package/test/unit/spec/meetings/utils.js +229 -2
- package/test/unit/spec/member/index.js +61 -6
- package/test/unit/spec/member/util.js +510 -34
- package/test/unit/spec/members/index.js +432 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +210 -0
- package/test/unit/spec/metrics/index.js +2 -52
- package/test/unit/spec/multistream/mediaRequestManager.ts +782 -114
- package/test/unit/spec/multistream/receiveSlot.ts +9 -1
- package/test/unit/spec/multistream/receiveSlotManager.ts +11 -3
- package/test/unit/spec/multistream/remoteMedia.ts +2 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +344 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +524 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +551 -14
- package/test/unit/spec/reachability/request.js +18 -8
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +171 -11
- package/test/unit/spec/recording-controller/index.js +293 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +233 -81
- package/test/unit/spec/roap/request.ts +100 -62
- package/test/unit/spec/roap/turnDiscovery.ts +682 -108
- package/test/unit/spec/rtcMetrics/index.ts +122 -0
- package/test/unit/spec/stats-analyzer/index.js +1431 -12
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -57
- package/test/utils/webex-test-users.js +12 -4
- package/dist/metrics/config.js +0 -289
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/metrics/config.d.ts +0 -169
- package/src/index.js +0 -18
- package/src/metrics/config.ts +0 -485
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
|
|
4
|
+
var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
|
|
5
|
+
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
|
|
6
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
|
|
7
|
+
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
|
|
8
|
+
var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
|
|
4
9
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
5
10
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
11
|
_Object$defineProperty(exports, "__esModule", {
|
|
@@ -17,6 +22,7 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/
|
|
|
17
22
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
|
|
18
23
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
19
24
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
25
|
+
var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
|
|
20
26
|
var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
21
27
|
var _internalMediaCore = require("@webex/internal-media-core");
|
|
22
28
|
var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
|
|
@@ -25,6 +31,8 @@ var _config = require("../mediaQualityMetrics/config");
|
|
|
25
31
|
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
26
32
|
var _global = _interopRequireDefault(require("./global"));
|
|
27
33
|
var _mqaUtil = require("./mqaUtil");
|
|
34
|
+
function ownKeys(object, enumerableOnly) { var keys = _Object$keys2(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
35
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
28
36
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
29
37
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
30
38
|
var EVENTS = {
|
|
@@ -49,7 +57,6 @@ var emptyReceiver = {
|
|
|
49
57
|
meanRtpJitter: [],
|
|
50
58
|
meanRoundTripTime: []
|
|
51
59
|
};
|
|
52
|
-
|
|
53
60
|
/**
|
|
54
61
|
* Stats Analyzer class that will emit events based on detected quality
|
|
55
62
|
*
|
|
@@ -60,18 +67,24 @@ var emptyReceiver = {
|
|
|
60
67
|
var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
61
68
|
(0, _inherits2.default)(StatsAnalyzer, _EventsScope);
|
|
62
69
|
var _super = _createSuper(StatsAnalyzer);
|
|
70
|
+
// Returns the local IP address for diagnostics. this is the local IP of the interface used for the current media connection a host can have many local Ip Addresses
|
|
71
|
+
|
|
63
72
|
/**
|
|
64
73
|
* Creates a new instance of StatsAnalyzer
|
|
65
74
|
* @constructor
|
|
66
75
|
* @public
|
|
67
76
|
* @param {Object} config SDK Configuration Object
|
|
77
|
+
* @param {Function} receiveSlotCallback Callback used to access receive slots.
|
|
68
78
|
* @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
|
|
69
79
|
* @param {Object} statsResults Default properties for stats
|
|
70
80
|
*/
|
|
71
81
|
function StatsAnalyzer(config) {
|
|
72
82
|
var _this;
|
|
73
|
-
var
|
|
74
|
-
|
|
83
|
+
var receiveSlotCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
|
|
84
|
+
return undefined;
|
|
85
|
+
};
|
|
86
|
+
var networkQualityMonitor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
87
|
+
var statsResults = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _global.default;
|
|
75
88
|
(0, _classCallCheck2.default)(this, StatsAnalyzer);
|
|
76
89
|
_this = _super.call(this);
|
|
77
90
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "config", void 0);
|
|
@@ -87,6 +100,9 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
87
100
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsInterval", void 0);
|
|
88
101
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsResults", void 0);
|
|
89
102
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsStarted", void 0);
|
|
103
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "successfulCandidatePair", void 0);
|
|
104
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "localIpAddress", void 0);
|
|
105
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "receiveSlotCallback", void 0);
|
|
90
106
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "emitStartStopEvents", function (mediaType, previousValue, currentValue, isLocal) {
|
|
91
107
|
if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {
|
|
92
108
|
throw new Error("Unsupported mediaType: ".concat(mediaType));
|
|
@@ -120,57 +136,75 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
120
136
|
});
|
|
121
137
|
}
|
|
122
138
|
});
|
|
139
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "extractAndSetLocalIpAddressInfoForDiagnostics", function (successfulCandidatePairId, candidates) {
|
|
140
|
+
var newIpAddress = '';
|
|
141
|
+
if (successfulCandidatePairId && !(0, _isEmpty2.default)(candidates)) {
|
|
142
|
+
var localCandidate = candidates[successfulCandidatePairId];
|
|
143
|
+
if (localCandidate) {
|
|
144
|
+
if (localCandidate.candidateType === 'host') {
|
|
145
|
+
// if it's a host candidate, use the address property - it will be the local IP
|
|
146
|
+
newIpAddress = "".concat(localCandidate.address);
|
|
147
|
+
} else if (localCandidate.candidateType === 'prflx') {
|
|
148
|
+
// if it's a peer reflexive candidate and we're not using a relay (there is no relayProtocol set)
|
|
149
|
+
// then look at the relatedAddress - it will be the local
|
|
150
|
+
//
|
|
151
|
+
// Firefox doesn't populate the relayProtocol property
|
|
152
|
+
if (!localCandidate.relayProtocol) {
|
|
153
|
+
newIpAddress = "".concat(localCandidate.relatedAddress);
|
|
154
|
+
} else {
|
|
155
|
+
// if it's a peer reflexive candidate and we are using a relay -
|
|
156
|
+
// in that case the relatedAddress will be the IP of the TURN server (Linus),
|
|
157
|
+
// so we can only look at the address, but it might be local IP or public IP,
|
|
158
|
+
// depending on if the user is behind a NAT or not
|
|
159
|
+
newIpAddress = "".concat(localCandidate.address);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
_this.localIpAddress = newIpAddress;
|
|
165
|
+
});
|
|
123
166
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "parseCandidate", function (result, type, isSender, isRemote) {
|
|
167
|
+
var _this$successfulCandi;
|
|
124
168
|
if (!result || !result.id) {
|
|
125
169
|
return;
|
|
126
170
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if (!result.id) return;
|
|
132
|
-
var sendRecvType = isSender ? _constants.STATS.SEND_DIRECTION : _constants.STATS.RECEIVE_DIRECTION;
|
|
133
|
-
var ipType = isRemote ? _constants.STATS.REMOTE : _constants.STATS.LOCAL;
|
|
134
|
-
if (!RemoteCandidateType[result.id]) {
|
|
135
|
-
RemoteCandidateType[result.id] = [];
|
|
136
|
-
}
|
|
137
|
-
if (!RemoteTransport[result.id]) {
|
|
138
|
-
RemoteTransport[result.id] = [];
|
|
139
|
-
}
|
|
140
|
-
if (!RemoteIpAddress[result.id]) {
|
|
141
|
-
RemoteIpAddress[result.id] = [];
|
|
142
|
-
}
|
|
143
|
-
if (!RemoteNetworkType[result.id]) {
|
|
144
|
-
RemoteNetworkType[result.id] = [];
|
|
145
|
-
}
|
|
146
|
-
if (result.candidateType && RemoteCandidateType[result.id].indexOf(result.candidateType) === -1) {
|
|
147
|
-
RemoteCandidateType[result.id].push(result.candidateType);
|
|
148
|
-
}
|
|
149
|
-
if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
|
|
150
|
-
RemoteTransport[result.id].push(result.protocol.toUpperCase());
|
|
171
|
+
|
|
172
|
+
// We only care about the successful local candidate
|
|
173
|
+
if (((_this$successfulCandi = _this.successfulCandidatePair) === null || _this$successfulCandi === void 0 ? void 0 : _this$successfulCandi.localCandidateId) !== result.id) {
|
|
174
|
+
return;
|
|
151
175
|
}
|
|
152
|
-
|
|
153
|
-
|
|
176
|
+
var transport;
|
|
177
|
+
if (result.relayProtocol) {
|
|
178
|
+
transport = result.relayProtocol.toUpperCase();
|
|
179
|
+
} else if (result.protocol) {
|
|
180
|
+
transport = result.protocol.toUpperCase();
|
|
154
181
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
182
|
+
var sendRecvType = isSender ? _constants.STATS.SEND_DIRECTION : _constants.STATS.RECEIVE_DIRECTION;
|
|
183
|
+
var ipType = isRemote ? _constants.STATS.REMOTE : _constants.STATS.LOCAL;
|
|
184
|
+
if (!_this.statsResults.candidates) {
|
|
185
|
+
_this.statsResults.candidates = {};
|
|
158
186
|
}
|
|
159
|
-
_this.statsResults.
|
|
160
|
-
candidateType:
|
|
161
|
-
ipAddress:
|
|
187
|
+
_this.statsResults.candidates[result.id] = {
|
|
188
|
+
candidateType: result.candidateType,
|
|
189
|
+
ipAddress: result.ip,
|
|
190
|
+
// TODO: add ports
|
|
191
|
+
relatedAddress: result.relatedAddress,
|
|
192
|
+
relatedPort: result.relatedPort,
|
|
193
|
+
relayProtocol: result.relayProtocol,
|
|
194
|
+
protocol: result.protocol,
|
|
195
|
+
address: result.address,
|
|
162
196
|
portNumber: result.port,
|
|
163
|
-
networkType:
|
|
197
|
+
networkType: result.networkType,
|
|
164
198
|
priority: result.priority,
|
|
165
|
-
transport:
|
|
199
|
+
transport: transport,
|
|
166
200
|
timestamp: result.time,
|
|
167
201
|
id: result.id,
|
|
168
202
|
type: result.type
|
|
169
203
|
};
|
|
170
|
-
_this.statsResults.connectionType[ipType].candidateType =
|
|
171
|
-
_this.statsResults.connectionType[ipType].ipAddress =
|
|
172
|
-
_this.statsResults.connectionType[ipType].networkType =
|
|
173
|
-
_this.statsResults.connectionType[ipType].transport =
|
|
204
|
+
_this.statsResults.connectionType[ipType].candidateType = result.candidateType;
|
|
205
|
+
_this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
|
|
206
|
+
_this.statsResults.connectionType[ipType].networkType = result.networkType === _constants.NETWORK_TYPE.VPN ? _constants.NETWORK_TYPE.UNKNOWN : result.networkType;
|
|
207
|
+
_this.statsResults.connectionType[ipType].transport = transport;
|
|
174
208
|
_this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
|
|
175
209
|
});
|
|
176
210
|
_this.statsStarted = false;
|
|
@@ -182,6 +216,9 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
182
216
|
_this.mqaSentCount = -1;
|
|
183
217
|
_this.lastMqaDataSent = {};
|
|
184
218
|
_this.lastEmittedStartStopEvent = {};
|
|
219
|
+
_this.receiveSlotCallback = receiveSlotCallback;
|
|
220
|
+
_this.successfulCandidatePair = {};
|
|
221
|
+
_this.localIpAddress = '';
|
|
185
222
|
return _this;
|
|
186
223
|
}
|
|
187
224
|
|
|
@@ -218,7 +255,11 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
218
255
|
}, {
|
|
219
256
|
key: "updateMediaStatus",
|
|
220
257
|
value: function updateMediaStatus(status) {
|
|
221
|
-
|
|
258
|
+
var _this$meetingMediaSta, _this$meetingMediaSta2;
|
|
259
|
+
this.meetingMediaStatus = {
|
|
260
|
+
actual: _objectSpread(_objectSpread({}, (_this$meetingMediaSta = this.meetingMediaStatus) === null || _this$meetingMediaSta === void 0 ? void 0 : _this$meetingMediaSta.actual), status === null || status === void 0 ? void 0 : status.actual),
|
|
261
|
+
expected: _objectSpread(_objectSpread({}, (_this$meetingMediaSta2 = this.meetingMediaStatus) === null || _this$meetingMediaSta2 === void 0 ? void 0 : _this$meetingMediaSta2.expected), status === null || status === void 0 ? void 0 : status.expected)
|
|
262
|
+
};
|
|
222
263
|
}
|
|
223
264
|
|
|
224
265
|
/**
|
|
@@ -233,64 +274,190 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
233
274
|
value: function sendMqaData() {
|
|
234
275
|
var _this3 = this;
|
|
235
276
|
var newMqa = (0, _cloneDeep2.default)(_config.emptyMqaInterval);
|
|
277
|
+
|
|
278
|
+
// Fill in empty stats items for lastMqaDataSent
|
|
279
|
+
(0, _keys.default)(this.statsResults).forEach(function (mediaType) {
|
|
280
|
+
if (!_this3.lastMqaDataSent[mediaType]) {
|
|
281
|
+
_this3.lastMqaDataSent[mediaType] = {};
|
|
282
|
+
}
|
|
283
|
+
if (!_this3.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
|
|
284
|
+
_this3.lastMqaDataSent[mediaType].send = {};
|
|
285
|
+
}
|
|
286
|
+
if (!_this3.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
|
|
287
|
+
_this3.lastMqaDataSent[mediaType].recv = {};
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
// Create stats the first level, totals for senders and receivers
|
|
292
|
+
var audioSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
|
|
293
|
+
var audioShareSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
|
|
294
|
+
var audioReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
|
|
295
|
+
var audioShareReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
|
|
296
|
+
var videoSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
|
|
297
|
+
var videoShareSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
|
|
298
|
+
var videoReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
|
|
299
|
+
var videoShareReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
|
|
300
|
+
(0, _mqaUtil.getAudioSenderMqa)({
|
|
301
|
+
audioSender: audioSender,
|
|
302
|
+
statsResults: this.statsResults,
|
|
303
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
304
|
+
baseMediaType: 'audio-send'
|
|
305
|
+
});
|
|
306
|
+
newMqa.audioTransmit.push(audioSender);
|
|
307
|
+
(0, _mqaUtil.getAudioSenderMqa)({
|
|
308
|
+
audioSender: audioShareSender,
|
|
309
|
+
statsResults: this.statsResults,
|
|
310
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
311
|
+
baseMediaType: 'audio-share-send'
|
|
312
|
+
});
|
|
313
|
+
newMqa.audioTransmit.push(audioShareSender);
|
|
314
|
+
(0, _mqaUtil.getAudioReceiverMqa)({
|
|
315
|
+
audioReceiver: audioReceiver,
|
|
316
|
+
statsResults: this.statsResults,
|
|
317
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
318
|
+
baseMediaType: 'audio-recv'
|
|
319
|
+
});
|
|
320
|
+
newMqa.audioReceive.push(audioReceiver);
|
|
321
|
+
(0, _mqaUtil.getAudioReceiverMqa)({
|
|
322
|
+
audioReceiver: audioShareReceiver,
|
|
323
|
+
statsResults: this.statsResults,
|
|
324
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
325
|
+
baseMediaType: 'audio-share-recv'
|
|
326
|
+
});
|
|
327
|
+
newMqa.audioReceive.push(audioShareReceiver);
|
|
328
|
+
(0, _mqaUtil.getVideoSenderMqa)({
|
|
329
|
+
videoSender: videoSender,
|
|
330
|
+
statsResults: this.statsResults,
|
|
331
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
332
|
+
baseMediaType: 'video-send'
|
|
333
|
+
});
|
|
334
|
+
newMqa.videoTransmit.push(videoSender);
|
|
335
|
+
(0, _mqaUtil.getVideoSenderMqa)({
|
|
336
|
+
videoSender: videoShareSender,
|
|
337
|
+
statsResults: this.statsResults,
|
|
338
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
339
|
+
baseMediaType: 'video-share-send'
|
|
340
|
+
});
|
|
341
|
+
newMqa.videoTransmit.push(videoShareSender);
|
|
342
|
+
(0, _mqaUtil.getVideoReceiverMqa)({
|
|
343
|
+
videoReceiver: videoReceiver,
|
|
344
|
+
statsResults: this.statsResults,
|
|
345
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
346
|
+
baseMediaType: 'video-recv'
|
|
347
|
+
});
|
|
348
|
+
newMqa.videoReceive.push(videoReceiver);
|
|
349
|
+
(0, _mqaUtil.getVideoReceiverMqa)({
|
|
350
|
+
videoReceiver: videoShareReceiver,
|
|
351
|
+
statsResults: this.statsResults,
|
|
352
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
353
|
+
baseMediaType: 'video-share-recv'
|
|
354
|
+
});
|
|
355
|
+
newMqa.videoReceive.push(videoShareReceiver);
|
|
356
|
+
|
|
357
|
+
// Add stats for individual streams
|
|
236
358
|
(0, _keys.default)(this.statsResults).forEach(function (mediaType) {
|
|
237
|
-
if (mediaType.
|
|
238
|
-
var
|
|
239
|
-
(0, _mqaUtil.
|
|
240
|
-
|
|
359
|
+
if (mediaType.startsWith('audio-send')) {
|
|
360
|
+
var audioSenderStream = (0, _cloneDeep2.default)(_config.emptyAudioTransmitStream);
|
|
361
|
+
(0, _mqaUtil.getAudioSenderStreamMqa)({
|
|
362
|
+
audioSenderStream: audioSenderStream,
|
|
241
363
|
statsResults: _this3.statsResults,
|
|
242
364
|
lastMqaDataSent: _this3.lastMqaDataSent,
|
|
243
365
|
mediaType: mediaType
|
|
244
366
|
});
|
|
245
|
-
newMqa.audioTransmit.push(
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
(0,
|
|
249
|
-
|
|
367
|
+
newMqa.audioTransmit[0].streams.push(audioSenderStream);
|
|
368
|
+
_this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
|
|
369
|
+
} else if (mediaType.startsWith('audio-share-send')) {
|
|
370
|
+
var _audioSenderStream = (0, _cloneDeep2.default)(_config.emptyAudioTransmitStream);
|
|
371
|
+
(0, _mqaUtil.getAudioSenderStreamMqa)({
|
|
372
|
+
audioSenderStream: _audioSenderStream,
|
|
250
373
|
statsResults: _this3.statsResults,
|
|
251
374
|
lastMqaDataSent: _this3.lastMqaDataSent,
|
|
252
375
|
mediaType: mediaType
|
|
253
376
|
});
|
|
254
|
-
newMqa.
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
(0,
|
|
258
|
-
|
|
377
|
+
newMqa.audioTransmit[1].streams.push(_audioSenderStream);
|
|
378
|
+
_this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
|
|
379
|
+
} else if (mediaType.startsWith('audio-recv')) {
|
|
380
|
+
var audioReceiverStream = (0, _cloneDeep2.default)(_config.emptyAudioReceiveStream);
|
|
381
|
+
(0, _mqaUtil.getAudioReceiverStreamMqa)({
|
|
382
|
+
audioReceiverStream: audioReceiverStream,
|
|
259
383
|
statsResults: _this3.statsResults,
|
|
260
384
|
lastMqaDataSent: _this3.lastMqaDataSent,
|
|
261
385
|
mediaType: mediaType
|
|
262
386
|
});
|
|
263
|
-
newMqa.
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
(0,
|
|
267
|
-
|
|
387
|
+
newMqa.audioReceive[0].streams.push(audioReceiverStream);
|
|
388
|
+
_this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
|
|
389
|
+
} else if (mediaType.startsWith('audio-share-recv')) {
|
|
390
|
+
var _audioReceiverStream = (0, _cloneDeep2.default)(_config.emptyAudioReceiveStream);
|
|
391
|
+
(0, _mqaUtil.getAudioReceiverStreamMqa)({
|
|
392
|
+
audioReceiverStream: _audioReceiverStream,
|
|
268
393
|
statsResults: _this3.statsResults,
|
|
269
394
|
lastMqaDataSent: _this3.lastMqaDataSent,
|
|
270
395
|
mediaType: mediaType
|
|
271
396
|
});
|
|
272
|
-
newMqa.
|
|
397
|
+
newMqa.audioReceive[1].streams.push(_audioReceiverStream);
|
|
398
|
+
_this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
|
|
399
|
+
} else if (mediaType.startsWith('video-send-layer')) {
|
|
400
|
+
// We only want the stream-specific stats we get with video-send-layer-0, video-send-layer-1, etc.
|
|
401
|
+
var videoSenderStream = (0, _cloneDeep2.default)(_config.emptyVideoTransmitStream);
|
|
402
|
+
(0, _mqaUtil.getVideoSenderStreamMqa)({
|
|
403
|
+
videoSenderStream: videoSenderStream,
|
|
404
|
+
statsResults: _this3.statsResults,
|
|
405
|
+
lastMqaDataSent: _this3.lastMqaDataSent,
|
|
406
|
+
mediaType: mediaType
|
|
407
|
+
});
|
|
408
|
+
newMqa.videoTransmit[0].streams.push(videoSenderStream);
|
|
409
|
+
_this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
|
|
410
|
+
} else if (mediaType.startsWith('video-share-send')) {
|
|
411
|
+
var _videoSenderStream = (0, _cloneDeep2.default)(_config.emptyVideoTransmitStream);
|
|
412
|
+
(0, _mqaUtil.getVideoSenderStreamMqa)({
|
|
413
|
+
videoSenderStream: _videoSenderStream,
|
|
414
|
+
statsResults: _this3.statsResults,
|
|
415
|
+
lastMqaDataSent: _this3.lastMqaDataSent,
|
|
416
|
+
mediaType: mediaType
|
|
417
|
+
});
|
|
418
|
+
newMqa.videoTransmit[1].streams.push(_videoSenderStream);
|
|
419
|
+
_this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
|
|
420
|
+
} else if (mediaType.startsWith('video-recv')) {
|
|
421
|
+
var videoReceiverStream = (0, _cloneDeep2.default)(_config.emptyVideoReceiveStream);
|
|
422
|
+
(0, _mqaUtil.getVideoReceiverStreamMqa)({
|
|
423
|
+
videoReceiverStream: videoReceiverStream,
|
|
424
|
+
statsResults: _this3.statsResults,
|
|
425
|
+
lastMqaDataSent: _this3.lastMqaDataSent,
|
|
426
|
+
mediaType: mediaType
|
|
427
|
+
});
|
|
428
|
+
newMqa.videoReceive[0].streams.push(videoReceiverStream);
|
|
429
|
+
_this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
|
|
430
|
+
} else if (mediaType.startsWith('video-share-recv')) {
|
|
431
|
+
var _videoReceiverStream = (0, _cloneDeep2.default)(_config.emptyVideoReceiveStream);
|
|
432
|
+
(0, _mqaUtil.getVideoReceiverStreamMqa)({
|
|
433
|
+
videoReceiverStream: _videoReceiverStream,
|
|
434
|
+
statsResults: _this3.statsResults,
|
|
435
|
+
lastMqaDataSent: _this3.lastMqaDataSent,
|
|
436
|
+
mediaType: mediaType
|
|
437
|
+
});
|
|
438
|
+
newMqa.videoReceive[1].streams.push(_videoReceiverStream);
|
|
439
|
+
_this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
|
|
273
440
|
}
|
|
274
441
|
});
|
|
275
|
-
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress
|
|
442
|
+
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
|
|
276
443
|
|
|
277
444
|
// Adding peripheral information
|
|
278
|
-
newMqa.intervalMetadata.peripherals = [];
|
|
279
445
|
newMqa.intervalMetadata.peripherals.push({
|
|
280
446
|
information: _constants._UNKNOWN_,
|
|
281
447
|
name: _constants.MEDIA_DEVICES.SPEAKER
|
|
282
448
|
});
|
|
283
449
|
if (this.statsResults['audio-send']) {
|
|
284
|
-
var _this$statsResults$au;
|
|
285
450
|
newMqa.intervalMetadata.peripherals.push({
|
|
286
|
-
information:
|
|
451
|
+
information: this.statsResults['audio-send'].trackLabel || _constants._UNKNOWN_,
|
|
287
452
|
name: _constants.MEDIA_DEVICES.MICROPHONE
|
|
288
453
|
});
|
|
289
454
|
}
|
|
290
|
-
|
|
291
|
-
|
|
455
|
+
var existingVideoSender = (0, _keys.default)(this.statsResults).find(function (item) {
|
|
456
|
+
return item.includes('video-send');
|
|
457
|
+
});
|
|
458
|
+
if (existingVideoSender) {
|
|
292
459
|
newMqa.intervalMetadata.peripherals.push({
|
|
293
|
-
information:
|
|
460
|
+
information: this.statsResults[existingVideoSender].trackLabel || _constants._UNKNOWN_,
|
|
294
461
|
name: _constants.MEDIA_DEVICES.CAMERA
|
|
295
462
|
});
|
|
296
463
|
}
|
|
@@ -322,6 +489,18 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
322
489
|
this.mediaConnection = mediaConnection;
|
|
323
490
|
}
|
|
324
491
|
|
|
492
|
+
/**
|
|
493
|
+
* Returns the local IP address for diagnostics.
|
|
494
|
+
* this is the local IP of the interface used for the current media connection
|
|
495
|
+
* a host can have many local Ip Addresses
|
|
496
|
+
* @returns {string | undefined} The local IP address.
|
|
497
|
+
*/
|
|
498
|
+
}, {
|
|
499
|
+
key: "getLocalIpAddress",
|
|
500
|
+
value: function getLocalIpAddress() {
|
|
501
|
+
return this.localIpAddress;
|
|
502
|
+
}
|
|
503
|
+
|
|
325
504
|
/**
|
|
326
505
|
* Starts the stats analyzer on interval
|
|
327
506
|
*
|
|
@@ -345,7 +524,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
345
524
|
_this4.sendMqaData();
|
|
346
525
|
_this4.mqaInterval = setInterval(function () {
|
|
347
526
|
_this4.sendMqaData();
|
|
348
|
-
}, _constants.
|
|
527
|
+
}, _constants.MQA_INTERVAL);
|
|
349
528
|
});
|
|
350
529
|
}
|
|
351
530
|
return _promise.default.resolve();
|
|
@@ -377,7 +556,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
377
556
|
_this5.mediaConnection = null;
|
|
378
557
|
});
|
|
379
558
|
}
|
|
380
|
-
this.mediaConnection = null;
|
|
381
559
|
return _promise.default.resolve();
|
|
382
560
|
}
|
|
383
561
|
|
|
@@ -407,22 +585,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
407
585
|
} else if (!isSender && !this.statsResults[type].recv) {
|
|
408
586
|
this.statsResults[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
|
|
409
587
|
}
|
|
410
|
-
if (!this.statsResults.resolutions[type]) {
|
|
411
|
-
this.statsResults.resolutions[type] = {};
|
|
412
|
-
}
|
|
413
|
-
if (isSender && !this.statsResults.resolutions[type].send) {
|
|
414
|
-
this.statsResults.resolutions[type].send = (0, _cloneDeep2.default)(emptySender);
|
|
415
|
-
} else if (!isSender && !this.statsResults.resolutions[type].recv) {
|
|
416
|
-
this.statsResults.resolutions[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
|
|
417
|
-
}
|
|
418
|
-
if (!this.statsResults.internal[type]) {
|
|
419
|
-
this.statsResults.internal[type] = {};
|
|
420
|
-
}
|
|
421
|
-
if (isSender && !this.statsResults.internal[type].send) {
|
|
422
|
-
this.statsResults.internal[type].send = (0, _cloneDeep2.default)(emptySender);
|
|
423
|
-
} else if (!isSender && !this.statsResults.internal[type].recv) {
|
|
424
|
-
this.statsResults.internal[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
|
|
425
|
-
}
|
|
426
588
|
switch (getStatsResult.type) {
|
|
427
589
|
case 'outbound-rtp':
|
|
428
590
|
this.processOutboundRTPResult(getStatsResult, type);
|
|
@@ -430,13 +592,9 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
430
592
|
case 'inbound-rtp':
|
|
431
593
|
this.processInboundRTPResult(getStatsResult, type);
|
|
432
594
|
break;
|
|
433
|
-
case 'track':
|
|
434
|
-
this.processTrackResult(getStatsResult, type);
|
|
435
|
-
break;
|
|
436
595
|
case 'remote-inbound-rtp':
|
|
437
596
|
case 'remote-outbound-rtp':
|
|
438
|
-
|
|
439
|
-
this.compareSentAndReceived(getStatsResult, type, isSender);
|
|
597
|
+
this.compareSentAndReceived(getStatsResult, type);
|
|
440
598
|
break;
|
|
441
599
|
case 'remotecandidate':
|
|
442
600
|
case 'remote-candidate':
|
|
@@ -446,7 +604,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
446
604
|
this.parseCandidate(getStatsResult, type, isSender, false);
|
|
447
605
|
break;
|
|
448
606
|
case 'media-source':
|
|
449
|
-
// @ts-ignore
|
|
450
607
|
this.parseAudioSource(getStatsResult, type);
|
|
451
608
|
break;
|
|
452
609
|
default:
|
|
@@ -467,15 +624,37 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
467
624
|
value: function filterAndParseGetStatsResults(statsItem, type, isSender) {
|
|
468
625
|
var _this6 = this;
|
|
469
626
|
var types = _constants.DEFAULT_GET_STATS_FILTER.types;
|
|
627
|
+
|
|
628
|
+
// get the successful candidate pair before parsing stats.
|
|
629
|
+
statsItem.report.forEach(function (report) {
|
|
630
|
+
if (report.type === 'candidate-pair' && report.state === 'succeeded') {
|
|
631
|
+
_this6.successfulCandidatePair = report;
|
|
632
|
+
}
|
|
633
|
+
});
|
|
634
|
+
var videoSenderIndex = 0;
|
|
470
635
|
statsItem.report.forEach(function (result) {
|
|
471
636
|
if (types.includes(result.type)) {
|
|
472
|
-
|
|
637
|
+
// if the video sender has multiple streams in the report, it is a new stream object.
|
|
638
|
+
if (type === 'video-send' && result.type === 'outbound-rtp') {
|
|
639
|
+
var newType = "video-send-layer-".concat(videoSenderIndex);
|
|
640
|
+
_this6.parseGetStatsResult(result, newType, isSender);
|
|
641
|
+
videoSenderIndex += 1;
|
|
642
|
+
_this6.statsResults[newType].direction = statsItem.currentDirection;
|
|
643
|
+
_this6.statsResults[newType].trackLabel = statsItem.localTrackLabel;
|
|
644
|
+
_this6.statsResults[newType].csi = statsItem.csi;
|
|
645
|
+
} else {
|
|
646
|
+
_this6.parseGetStatsResult(result, type, isSender);
|
|
647
|
+
}
|
|
473
648
|
}
|
|
474
649
|
});
|
|
475
650
|
if (this.statsResults[type]) {
|
|
651
|
+
var _this$successfulCandi2, _this$statsResults;
|
|
476
652
|
this.statsResults[type].direction = statsItem.currentDirection;
|
|
477
653
|
this.statsResults[type].trackLabel = statsItem.localTrackLabel;
|
|
478
654
|
this.statsResults[type].csi = statsItem.csi;
|
|
655
|
+
this.extractAndSetLocalIpAddressInfoForDiagnostics((_this$successfulCandi2 = this.successfulCandidatePair) === null || _this$successfulCandi2 === void 0 ? void 0 : _this$successfulCandi2.localCandidateId, (_this$statsResults = this.statsResults) === null || _this$statsResults === void 0 ? void 0 : _this$statsResults.candidates);
|
|
656
|
+
// reset the successful candidate pair.
|
|
657
|
+
this.successfulCandidatePair = {};
|
|
479
658
|
}
|
|
480
659
|
}
|
|
481
660
|
|
|
@@ -529,7 +708,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
529
708
|
return key.startsWith(keyPrefix);
|
|
530
709
|
}).reduce(function (prev, cur) {
|
|
531
710
|
var _this7$statsResults$c;
|
|
532
|
-
return prev + (((_this7$statsResults$c = _this7.statsResults[cur]) === null || _this7$statsResults$c === void 0 ? void 0 : _this7$statsResults$c.recv[value]) || 0);
|
|
711
|
+
return prev + (((_this7$statsResults$c = _this7.statsResults[cur]) === null || _this7$statsResults$c === void 0 ? void 0 : _this7$statsResults$c[keyPrefix.includes('send') ? 'send' : 'recv'][value]) || 0);
|
|
533
712
|
}, 0);
|
|
534
713
|
};
|
|
535
714
|
var getPreviousStatsTotals = function getPreviousStatsTotals(keyPrefix, value) {
|
|
@@ -537,141 +716,88 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
537
716
|
return key.startsWith(keyPrefix);
|
|
538
717
|
}).reduce(function (prev, cur) {
|
|
539
718
|
var _this7$lastStatsResul;
|
|
540
|
-
return prev + (((_this7$lastStatsResul = _this7.lastStatsResults[cur]) === null || _this7$lastStatsResul === void 0 ? void 0 : _this7$lastStatsResul.recv[value]) || 0);
|
|
541
|
-
}, 0);
|
|
542
|
-
};
|
|
543
|
-
var getCurrentResolutionsStatsTotals = function getCurrentResolutionsStatsTotals(keyPrefix, value) {
|
|
544
|
-
return (0, _keys.default)(_this7.statsResults).filter(function (key) {
|
|
545
|
-
return key.startsWith(keyPrefix);
|
|
546
|
-
}).reduce(function (prev, cur) {
|
|
547
|
-
var _this7$statsResults$r;
|
|
548
|
-
return prev + (((_this7$statsResults$r = _this7.statsResults.resolutions[cur]) === null || _this7$statsResults$r === void 0 ? void 0 : _this7$statsResults$r.recv[value]) || 0);
|
|
719
|
+
return prev + (((_this7$lastStatsResul = _this7.lastStatsResults[cur]) === null || _this7$lastStatsResul === void 0 ? void 0 : _this7$lastStatsResul[keyPrefix.includes('send') ? 'send' : 'recv'][value]) || 0);
|
|
549
720
|
}, 0);
|
|
550
721
|
};
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
}).reduce(function (prev, cur) {
|
|
555
|
-
var _this7$lastStatsResul2;
|
|
556
|
-
return prev + (((_this7$lastStatsResul2 = _this7.lastStatsResults.resolutions[cur]) === null || _this7$lastStatsResul2 === void 0 ? void 0 : _this7$lastStatsResul2.recv[value]) || 0);
|
|
557
|
-
}, 0);
|
|
558
|
-
};
|
|
559
|
-
if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {
|
|
722
|
+
|
|
723
|
+
// Audio Transmit
|
|
724
|
+
if (this.lastStatsResults['audio-send']) {
|
|
560
725
|
// compare audio stats sent
|
|
561
726
|
// NOTE: relies on there being only one sender.
|
|
562
727
|
var currentStats = this.statsResults['audio-send'].send;
|
|
563
728
|
var previousStats = this.lastStatsResults['audio-send'].send;
|
|
564
|
-
if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
|
|
565
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent");
|
|
729
|
+
if (this.meetingMediaStatus.expected.sendAudio && currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
|
|
730
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent", currentStats.totalPacketsSent);
|
|
566
731
|
} else {
|
|
567
|
-
if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
|
|
568
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present");
|
|
732
|
+
if (this.meetingMediaStatus.expected.sendAudio && currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
|
|
733
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present", currentStats.totalAudioEnergy);
|
|
569
734
|
}
|
|
570
|
-
if (currentStats.audioLevel === 0) {
|
|
735
|
+
if (this.meetingMediaStatus.expected.sendAudio && currentStats.audioLevel === 0) {
|
|
571
736
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user");
|
|
572
737
|
}
|
|
573
738
|
}
|
|
574
739
|
this.emitStartStopEvents('audio', previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
|
|
575
740
|
}
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
741
|
+
|
|
742
|
+
// Audio Receive
|
|
743
|
+
var currentAudioPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');
|
|
744
|
+
var previousAudioPacketsReceived = getPreviousStatsTotals('audio-recv', 'totalPacketsReceived');
|
|
745
|
+
this.emitStartStopEvents('audio', previousAudioPacketsReceived, currentAudioPacketsReceived, false);
|
|
746
|
+
var currentTotalPacketsSent = getCurrentStatsTotals('video-send', 'totalPacketsSent');
|
|
747
|
+
var previousTotalPacketsSent = getPreviousStatsTotals('video-send', 'totalPacketsSent');
|
|
748
|
+
var currentFramesEncoded = getCurrentStatsTotals('video-send', 'framesEncoded');
|
|
749
|
+
var previousFramesEncoded = getPreviousStatsTotals('video-send', 'framesEncoded');
|
|
750
|
+
var currentFramesSent = getCurrentStatsTotals('video-send', 'framesSent');
|
|
751
|
+
var previousFramesSent = getPreviousStatsTotals('video-send', 'framesSent');
|
|
752
|
+
var doesVideoSendExist = (0, _keys.default)(this.lastStatsResults).some(function (item) {
|
|
753
|
+
return item.includes('video-send');
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
// Video Transmit
|
|
757
|
+
if (doesVideoSendExist) {
|
|
590
758
|
// compare video stats sent
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent");
|
|
595
|
-
} else {
|
|
596
|
-
if (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0) {
|
|
597
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded");
|
|
598
|
-
}
|
|
599
|
-
if (this.statsResults.resolutions['video-send'].send.framesSent === this.lastStatsResults.resolutions['video-send'].send.framesSent || this.statsResults.resolutions['video-send'].send.framesSent === 0) {
|
|
600
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent");
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
this.emitStartStopEvents('video', _previousStats.framesSent, _currentStats.framesSent, true);
|
|
604
|
-
}
|
|
605
|
-
if (this.meetingMediaStatus.expected.receiveVideo) {
|
|
606
|
-
// compare video stats received
|
|
607
|
-
var _currentPacketsReceived = getCurrentStatsTotals('video-recv', 'totalPacketsReceived');
|
|
608
|
-
var _previousPacketsReceived = getPreviousStatsTotals('video-recv', 'totalPacketsReceived');
|
|
609
|
-
var currentFramesReceived = getCurrentResolutionsStatsTotals('video-recv', 'framesReceived');
|
|
610
|
-
var previousFramesReceived = getPreviousResolutionsStatsTotals('video-recv', 'framesReceived');
|
|
611
|
-
var currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
|
|
612
|
-
var previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
|
|
613
|
-
var currentFramesDropped = getCurrentResolutionsStatsTotals('video-recv', 'framesDropped');
|
|
614
|
-
var previousFramesDropped = getPreviousResolutionsStatsTotals('video-recv', 'framesDropped');
|
|
615
|
-
if (_currentPacketsReceived === _previousPacketsReceived || _currentPacketsReceived === 0) {
|
|
616
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received");
|
|
759
|
+
|
|
760
|
+
if (this.meetingMediaStatus.expected.sendVideo && (currentTotalPacketsSent === previousTotalPacketsSent || currentTotalPacketsSent === 0)) {
|
|
761
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent", currentTotalPacketsSent);
|
|
617
762
|
} else {
|
|
618
|
-
if (
|
|
619
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video
|
|
620
|
-
}
|
|
621
|
-
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
622
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded");
|
|
763
|
+
if (this.meetingMediaStatus.expected.sendVideo && (currentFramesEncoded === previousFramesEncoded || currentFramesEncoded === 0)) {
|
|
764
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded", currentFramesEncoded);
|
|
623
765
|
}
|
|
624
|
-
if (
|
|
625
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> video
|
|
766
|
+
if (this.meetingMediaStatus.expected.sendVideo && (currentFramesSent === previousFramesSent || currentFramesSent === 0)) {
|
|
767
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent", currentFramesSent);
|
|
626
768
|
}
|
|
627
769
|
}
|
|
628
|
-
this.emitStartStopEvents('video',
|
|
770
|
+
this.emitStartStopEvents('video', previousFramesSent, currentFramesSent, true);
|
|
629
771
|
}
|
|
630
|
-
|
|
772
|
+
|
|
773
|
+
// Video Receive
|
|
774
|
+
var currentVideoFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
|
|
775
|
+
var previousVideoFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
|
|
776
|
+
this.emitStartStopEvents('video', previousVideoFramesDecoded, currentVideoFramesDecoded, false);
|
|
777
|
+
|
|
778
|
+
// Share Transmit
|
|
779
|
+
if (this.lastStatsResults['video-share-send']) {
|
|
631
780
|
// compare share stats sent
|
|
632
781
|
|
|
633
|
-
var
|
|
634
|
-
var
|
|
635
|
-
if (
|
|
636
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent");
|
|
782
|
+
var _currentStats = this.statsResults['video-share-send'].send;
|
|
783
|
+
var _previousStats = this.lastStatsResults['video-share-send'].send;
|
|
784
|
+
if (this.meetingMediaStatus.expected.sendShare && (_currentStats.totalPacketsSent === _previousStats.totalPacketsSent || _currentStats.totalPacketsSent === 0)) {
|
|
785
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent", _currentStats.totalPacketsSent);
|
|
637
786
|
} else {
|
|
638
|
-
if (
|
|
639
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded");
|
|
787
|
+
if (this.meetingMediaStatus.expected.sendShare && (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0)) {
|
|
788
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded", _currentStats.framesEncoded);
|
|
640
789
|
}
|
|
641
|
-
if (this.statsResults
|
|
642
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames sent");
|
|
790
|
+
if (this.meetingMediaStatus.expected.sendShare && (this.statsResults['video-share-send'].send.framesSent === this.lastStatsResults['video-share-send'].send.framesSent || this.statsResults['video-share-send'].send.framesSent === 0)) {
|
|
791
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames sent", this.statsResults['video-share-send'].send.framesSent);
|
|
643
792
|
}
|
|
644
793
|
}
|
|
794
|
+
this.emitStartStopEvents('share', _previousStats.framesSent, _currentStats.framesSent, true);
|
|
645
795
|
}
|
|
646
|
-
if (this.meetingMediaStatus.expected.sendShare) {
|
|
647
|
-
// TODO:need to check receive share value
|
|
648
|
-
// compare share stats received
|
|
649
|
-
var _currentPacketsReceived2 = getCurrentStatsTotals('video-share-recv', 'totalPacketsReceived');
|
|
650
|
-
var _previousPacketsReceived2 = getPreviousStatsTotals('video-share-recv', 'totalPacketsReceived');
|
|
651
|
-
var _currentFramesReceived = getCurrentResolutionsStatsTotals('video-share-recv', 'framesReceived');
|
|
652
|
-
var _previousFramesReceived = getPreviousResolutionsStatsTotals('video-share-recv', 'framesReceived');
|
|
653
|
-
var _currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
|
|
654
|
-
var _previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
|
|
655
|
-
var _currentFramesDropped = getCurrentResolutionsStatsTotals('video-share-recv', 'framesDropped');
|
|
656
|
-
var _previousFramesDropped = getPreviousResolutionsStatsTotals('video-share-recv', 'framesDropped');
|
|
657
|
-
if (_currentPacketsReceived2 === _previousPacketsReceived2 || _currentPacketsReceived2 === 0) {
|
|
658
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received");
|
|
659
|
-
} else {
|
|
660
|
-
if (_currentFramesReceived === _previousFramesReceived || _currentFramesReceived === 0) {
|
|
661
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames received");
|
|
662
|
-
}
|
|
663
|
-
if (_currentFramesDecoded === _previousFramesDecoded || _currentFramesDecoded === 0) {
|
|
664
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded");
|
|
665
|
-
}
|
|
666
|
-
if (_currentFramesDropped - _previousFramesDropped > 10) {
|
|
667
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped");
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
796
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
797
|
+
// Share receive
|
|
798
|
+
var currentShareFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
|
|
799
|
+
var previousShareFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
|
|
800
|
+
this.emitStartStopEvents('share', previousShareFramesDecoded, currentShareFramesDecoded, false);
|
|
675
801
|
}
|
|
676
802
|
}
|
|
677
803
|
|
|
@@ -753,28 +879,16 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
753
879
|
var sendrecvType = _constants.STATS.SEND_DIRECTION;
|
|
754
880
|
if (result.bytesSent) {
|
|
755
881
|
var kilobytes = 0;
|
|
756
|
-
if (
|
|
757
|
-
this.statsResults
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
this.statsResults
|
|
761
|
-
}
|
|
762
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
|
|
763
|
-
this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
|
|
882
|
+
if (result.frameWidth && result.frameHeight) {
|
|
883
|
+
this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
|
|
884
|
+
this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
|
|
885
|
+
this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
886
|
+
this.statsResults[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
|
|
764
887
|
}
|
|
765
|
-
var bytes = result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
|
|
766
|
-
this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
|
|
767
|
-
kilobytes = bytes / 1024;
|
|
768
888
|
this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
|
|
769
|
-
this.statsResults[mediaType].
|
|
770
|
-
this.statsResults[mediaType][sendrecvType].
|
|
771
|
-
this.statsResults[mediaType][sendrecvType].
|
|
772
|
-
this.statsResults.internal[mediaType].outboundRtpId = result.id;
|
|
773
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {
|
|
774
|
-
this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
|
|
775
|
-
}
|
|
776
|
-
this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
|
|
777
|
-
this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
|
|
889
|
+
this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
|
|
890
|
+
this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
|
|
891
|
+
this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent;
|
|
778
892
|
|
|
779
893
|
// Data saved to send MQA metrics
|
|
780
894
|
|
|
@@ -808,41 +922,53 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
808
922
|
var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
|
|
809
923
|
if (result.bytesReceived) {
|
|
810
924
|
var kilobytes = 0;
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;
|
|
816
|
-
}
|
|
817
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {
|
|
818
|
-
this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;
|
|
819
|
-
}
|
|
820
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
|
|
821
|
-
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
|
|
822
|
-
}
|
|
823
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
|
|
824
|
-
this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;
|
|
825
|
-
}
|
|
826
|
-
var bytes = result.bytesReceived - this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;
|
|
827
|
-
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
|
|
925
|
+
var receiveSlot = this.receiveSlotCallback(result.ssrc);
|
|
926
|
+
var sourceState = receiveSlot === null || receiveSlot === void 0 ? void 0 : receiveSlot.sourceState;
|
|
927
|
+
var idAndCsi = receiveSlot ? "id: \"".concat(receiveSlot.id || '', "\"").concat(receiveSlot.csi ? " and csi: ".concat(receiveSlot.csi) : '') : '';
|
|
928
|
+
var bytes = result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;
|
|
828
929
|
kilobytes = bytes / 1024;
|
|
829
930
|
this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
|
|
830
|
-
this.statsResults[mediaType].
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
931
|
+
var currentPacketsLost = result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;
|
|
932
|
+
if (currentPacketsLost < 0) {
|
|
933
|
+
currentPacketsLost = 0;
|
|
934
|
+
}
|
|
935
|
+
var packetsReceivedDiff = result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;
|
|
936
|
+
this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
|
|
937
|
+
if (packetsReceivedDiff === 0) {
|
|
938
|
+
if (receiveSlot && sourceState === 'live') {
|
|
939
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total packets received on slot: "), result.packetsReceived);
|
|
940
|
+
}
|
|
835
941
|
}
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
942
|
+
if (mediaType.startsWith('video') || mediaType.startsWith('share')) {
|
|
943
|
+
var videoFramesReceivedDiff = result.framesReceived - this.statsResults[mediaType][sendrecvType].framesReceived;
|
|
944
|
+
if (videoFramesReceivedDiff === 0) {
|
|
945
|
+
if (receiveSlot && sourceState === 'live') {
|
|
946
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames received on slot: "), result.framesReceived);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
var videoFramesDecodedDiff = result.framesDecoded - this.statsResults[mediaType][sendrecvType].framesDecoded;
|
|
950
|
+
if (videoFramesDecodedDiff === 0) {
|
|
951
|
+
if (receiveSlot && sourceState === 'live') {
|
|
952
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames decoded for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames decoded on slot: "), result.framesDecoded);
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
var videoFramesDroppedDiff = result.framesDropped - this.statsResults[mediaType][sendrecvType].framesDropped;
|
|
956
|
+
if (videoFramesDroppedDiff > 10) {
|
|
957
|
+
if (receiveSlot && sourceState === 'live') {
|
|
958
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Frames dropped for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames dropped on slot: "), result.framesDropped);
|
|
959
|
+
}
|
|
960
|
+
}
|
|
840
961
|
}
|
|
841
962
|
|
|
842
963
|
// Check the over all packet Lost ratio
|
|
843
|
-
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =
|
|
964
|
+
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = currentPacketsLost > 0 ? currentPacketsLost / (packetsReceivedDiff + currentPacketsLost) : 0;
|
|
844
965
|
if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
|
|
845
|
-
_loggerProxy.default.logger.info(
|
|
966
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ".concat(idAndCsi), this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
|
|
967
|
+
}
|
|
968
|
+
if (result.frameWidth && result.frameHeight) {
|
|
969
|
+
this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
|
|
970
|
+
this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
|
|
971
|
+
this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
846
972
|
}
|
|
847
973
|
|
|
848
974
|
// TODO: check the packet loss value is negative values here
|
|
@@ -859,6 +985,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
859
985
|
this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;
|
|
860
986
|
this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
|
|
861
987
|
this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;
|
|
988
|
+
this.statsResults[mediaType][sendrecvType].framesDropped = result.framesDropped;
|
|
862
989
|
this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;
|
|
863
990
|
this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
|
|
864
991
|
this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;
|
|
@@ -878,55 +1005,19 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
878
1005
|
}
|
|
879
1006
|
|
|
880
1007
|
/**
|
|
881
|
-
*
|
|
1008
|
+
* extracts the local Ip address from the statsResult object by looking at stats results candidates
|
|
1009
|
+
* and matches that ID with the successful candidate pair. It looks at the type of local candidate it is
|
|
1010
|
+
* and then extracts the IP address from the relatedAddress or address property based on conditions known in webrtc
|
|
1011
|
+
* note, there are known incompatibilities and it is possible for this to set undefined, or for the IP address to be the public IP address
|
|
1012
|
+
* for example, firefox does not set the relayProtocol, and if the user is behind a NAT it might be the public IP
|
|
882
1013
|
* @private
|
|
883
|
-
* @param {
|
|
884
|
-
* @param {
|
|
885
|
-
* @param {boolean} isSender
|
|
886
|
-
* @param {boolean} isRemote
|
|
887
|
-
*
|
|
1014
|
+
* @param {string} successfulCandidatePairId - The ID of the successful candidate pair.
|
|
1015
|
+
* @param {Object} candidates - the stats result candidates
|
|
888
1016
|
* @returns {void}
|
|
889
1017
|
*/
|
|
890
1018
|
}, {
|
|
891
|
-
key: "
|
|
1019
|
+
key: "compareSentAndReceived",
|
|
892
1020
|
value:
|
|
893
|
-
/**
|
|
894
|
-
* Process Track results
|
|
895
|
-
*
|
|
896
|
-
* @private
|
|
897
|
-
* @param {*} result
|
|
898
|
-
* @param {*} mediaType
|
|
899
|
-
* @returns {void}
|
|
900
|
-
* @memberof StatsAnalyzer
|
|
901
|
-
*/
|
|
902
|
-
function processTrackResult(result, mediaType) {
|
|
903
|
-
if (!result || result.type !== 'track') {
|
|
904
|
-
return;
|
|
905
|
-
}
|
|
906
|
-
var sendrecvType = result.remoteSource === true ? _constants.STATS.RECEIVE_DIRECTION : _constants.STATS.SEND_DIRECTION;
|
|
907
|
-
if (result.frameWidth && result.frameHeight) {
|
|
908
|
-
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
909
|
-
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
910
|
-
this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
911
|
-
this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
|
|
912
|
-
}
|
|
913
|
-
if (sendrecvType === _constants.STATS.RECEIVE_DIRECTION) {
|
|
914
|
-
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
915
|
-
this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
|
|
916
|
-
this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
|
|
917
|
-
}
|
|
918
|
-
if (result.trackIdentifier && !mediaType.includes('audio')) {
|
|
919
|
-
this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;
|
|
920
|
-
var jitterBufferDelay = result && result.jitterBufferDelay;
|
|
921
|
-
var jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
|
|
922
|
-
this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay = jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;
|
|
923
|
-
|
|
924
|
-
// Used to calculate the jitter
|
|
925
|
-
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay = result.jitterBufferDelay;
|
|
926
|
-
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount = result.jitterBufferEmittedCount;
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
|
|
930
1021
|
/**
|
|
931
1022
|
*
|
|
932
1023
|
* @private
|
|
@@ -935,19 +1026,13 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
935
1026
|
* @returns {void}
|
|
936
1027
|
* @memberof StatsAnalyzer
|
|
937
1028
|
*/
|
|
938
|
-
|
|
939
|
-
key: "compareSentAndReceived",
|
|
940
|
-
value: function compareSentAndReceived(result, type) {
|
|
1029
|
+
function compareSentAndReceived(result, type) {
|
|
941
1030
|
// Don't compare on transceivers without a sender.
|
|
942
|
-
if (!type || !this.statsResults
|
|
1031
|
+
if (!type || !this.statsResults[type].send) {
|
|
943
1032
|
return;
|
|
944
1033
|
}
|
|
945
1034
|
var mediaType = type;
|
|
946
|
-
|
|
947
|
-
this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
948
|
-
}
|
|
949
|
-
var currentPacketLoss = result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
|
|
950
|
-
this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
1035
|
+
var currentPacketLoss = result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;
|
|
951
1036
|
this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
|
|
952
1037
|
this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
953
1038
|
this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);
|