@webex/plugin-meetings 3.0.0-beta.30 → 3.0.0-beta.301
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 +46 -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/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +709 -35
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +45 -1
- 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 +5 -11
- package/dist/config.js.map +1 -1
- package/dist/constants.js +233 -29
- 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 +112 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -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 +383 -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 +57 -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 +61 -116
- 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/meeting/in-meeting-actions.js +82 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3767 -2924
- 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 +230 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +256 -196
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +601 -417
- package/dist/meeting/util.js.map +1 -1
- 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 +192 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +402 -115
- 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 +72 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +58 -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 +102 -6
- 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 +13 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +238 -49
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +29 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +39 -36
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +209 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +233 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/index.js +225 -59
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +17 -8
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +201 -156
- 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 +62 -32
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +112 -97
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +95 -36
- 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 +117 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +84 -73
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +11 -10
- 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/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/utils.d.ts +14 -0
- 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 +1 -7
- package/dist/types/constants.d.ts +188 -21
- 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 -4
- 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 +67 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -48
- package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
- package/dist/types/meeting/index.d.ts +460 -508
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +99 -23
- package/dist/types/meeting/request.d.ts +72 -43
- package/dist/types/meeting/util.d.ts +101 -1
- 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 +8 -0
- package/dist/types/meetings/index.d.ts +90 -20
- 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 +12 -4
- package/dist/types/metrics/index.d.ts +4 -119
- package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
- package/dist/types/multistream/receiveSlot.d.ts +13 -11
- package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
- package/dist/types/multistream/remoteMedia.d.ts +8 -29
- package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
- package/dist/types/multistream/sendSlotManager.d.ts +61 -0
- package/dist/types/reachability/index.d.ts +61 -7
- package/dist/types/reachability/request.d.ts +7 -3
- package/dist/types/reconnection-manager/index.d.ts +9 -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 +2 -1
- package/dist/types/roap/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +21 -3
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +47 -0
- package/dist/types/statsAnalyzer/index.d.ts +7 -1
- 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 +23 -20
- 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 +42 -12
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +592 -20
- package/src/breakouts/utils.ts +42 -0
- 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 +4 -10
- package/src/constants.ts +216 -18
- 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 +40 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +413 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +102 -122
- package/src/media/properties.ts +87 -110
- package/src/meeting/in-meeting-actions.ts +163 -3
- package/src/meeting/index.ts +3112 -2527
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +229 -131
- package/src/meeting/request.ts +172 -121
- package/src/meeting/util.ts +588 -394
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +170 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +434 -123
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +80 -11
- package/src/member/index.ts +58 -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 +134 -8
- 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 +12 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +31 -17
- package/src/multistream/receiveSlotManager.ts +34 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +148 -30
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/reachability/index.ts +228 -37
- package/src/reachability/request.ts +17 -8
- package/src/reconnection-manager/index.ts +83 -56
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +63 -32
- package/src/roap/request.ts +100 -104
- package/src/roap/turnDiscovery.ts +48 -26
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/index.ts +103 -87
- package/src/statsAnalyzer/mqaUtil.ts +13 -14
- 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 +320 -261
- 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 +118 -28
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1395 -69
- package/test/unit/spec/breakouts/utils.js +52 -1
- 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/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -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 +1304 -33
- 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 +32 -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 +208 -17
- package/test/unit/spec/media/index.ts +104 -37
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
- package/test/unit/spec/meeting/index.js +5146 -1933
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +408 -208
- package/test/unit/spec/meeting/request.js +440 -45
- package/test/unit/spec/meeting/utils.js +679 -64
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +1011 -205
- package/test/unit/spec/meetings/utils.js +202 -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 +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
- package/test/unit/spec/multistream/receiveSlot.ts +28 -20
- package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/reachability/index.ts +549 -9
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +85 -9
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +178 -64
- package/test/unit/spec/roap/request.ts +203 -85
- package/test/unit/spec/roap/turnDiscovery.ts +82 -36
- package/test/unit/spec/rtcMetrics/index.ts +73 -0
- package/test/unit/spec/stats-analyzer/index.js +112 -2
- 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 -52
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/meeting/effectsState.d.ts +0 -42
- package/dist/types/metrics/config.d.ts +0 -178
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/test/unit/spec/meeting/effectsState.js +0 -285
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import RTC_METRICS from './constants';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Rtc Metrics
|
|
5
|
+
*/
|
|
6
|
+
export default class RtcMetrics {
|
|
7
|
+
/**
|
|
8
|
+
* Array of MetricData items to be sent to the metrics service.
|
|
9
|
+
*/
|
|
10
|
+
metricsQueue = [];
|
|
11
|
+
|
|
12
|
+
intervalId: number;
|
|
13
|
+
|
|
14
|
+
webex: any;
|
|
15
|
+
|
|
16
|
+
meetingId: string;
|
|
17
|
+
|
|
18
|
+
correlationId: string;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Initialize the interval.
|
|
22
|
+
*
|
|
23
|
+
* @param {object} webex - The main `webex` object.
|
|
24
|
+
* @param {string} meetingId - The meeting id.
|
|
25
|
+
* @param {string} correlationId - The correlation id.
|
|
26
|
+
*/
|
|
27
|
+
constructor(webex, meetingId, correlationId) {
|
|
28
|
+
// `window` is used to prevent typescript from returning a NodeJS.Timer.
|
|
29
|
+
this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
|
|
30
|
+
this.meetingId = meetingId;
|
|
31
|
+
this.webex = webex;
|
|
32
|
+
this.correlationId = correlationId;
|
|
33
|
+
// Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.
|
|
34
|
+
setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Check to see if the metrics queue has any items.
|
|
39
|
+
*
|
|
40
|
+
* @returns {void}
|
|
41
|
+
*/
|
|
42
|
+
public sendMetricsInQueue() {
|
|
43
|
+
if (this.metricsQueue.length) {
|
|
44
|
+
this.sendMetrics();
|
|
45
|
+
this.metricsQueue = [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Add metrics items to the metrics queue.
|
|
51
|
+
*
|
|
52
|
+
* @param {object} data - An object with a payload array of metrics items.
|
|
53
|
+
*
|
|
54
|
+
* @returns {void}
|
|
55
|
+
*/
|
|
56
|
+
addMetrics(data) {
|
|
57
|
+
if (data.payload.length) {
|
|
58
|
+
this.metricsQueue.push(data);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Clear the metrics interval.
|
|
64
|
+
*
|
|
65
|
+
* @returns {void}
|
|
66
|
+
*/
|
|
67
|
+
closeMetrics() {
|
|
68
|
+
this.sendMetricsInQueue();
|
|
69
|
+
clearInterval(this.intervalId);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Send metrics to the metrics service.
|
|
74
|
+
*
|
|
75
|
+
* @returns {void}
|
|
76
|
+
*/
|
|
77
|
+
private sendMetrics() {
|
|
78
|
+
this.webex.request({
|
|
79
|
+
method: 'POST',
|
|
80
|
+
service: 'unifiedTelemetry',
|
|
81
|
+
resource: 'metric/v2',
|
|
82
|
+
headers: {
|
|
83
|
+
type: 'webrtcMedia',
|
|
84
|
+
appId: RTC_METRICS.APP_ID,
|
|
85
|
+
},
|
|
86
|
+
body: {
|
|
87
|
+
metrics: [
|
|
88
|
+
{
|
|
89
|
+
type: 'webrtc',
|
|
90
|
+
version: '1.0.1',
|
|
91
|
+
userId: this.webex.internal.device.userId,
|
|
92
|
+
meetingId: this.meetingId,
|
|
93
|
+
correlationId: this.correlationId,
|
|
94
|
+
data: this.metricsQueue,
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
getVideoSenderMqa,
|
|
29
29
|
getVideoReceiverMqa,
|
|
30
30
|
} from './mqaUtil';
|
|
31
|
+
import {ReceiveSlot} from '../multistream/receiveSlot';
|
|
31
32
|
|
|
32
33
|
export const EVENTS = {
|
|
33
34
|
MEDIA_QUALITY: 'MEDIA_QUALITY',
|
|
@@ -53,6 +54,8 @@ const emptyReceiver = {
|
|
|
53
54
|
meanRoundTripTime: [],
|
|
54
55
|
};
|
|
55
56
|
|
|
57
|
+
type ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;
|
|
58
|
+
|
|
56
59
|
/**
|
|
57
60
|
* Stats Analyzer class that will emit events based on detected quality
|
|
58
61
|
*
|
|
@@ -74,17 +77,21 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
74
77
|
statsInterval: NodeJS.Timeout;
|
|
75
78
|
statsResults: any;
|
|
76
79
|
statsStarted: any;
|
|
80
|
+
successfulCandidatePair: any;
|
|
81
|
+
receiveSlotCallback: ReceiveSlotCallback;
|
|
77
82
|
|
|
78
83
|
/**
|
|
79
84
|
* Creates a new instance of StatsAnalyzer
|
|
80
85
|
* @constructor
|
|
81
86
|
* @public
|
|
82
87
|
* @param {Object} config SDK Configuration Object
|
|
88
|
+
* @param {Function} receiveSlotCallback Callback used to access receive slots.
|
|
83
89
|
* @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
|
|
84
90
|
* @param {Object} statsResults Default properties for stats
|
|
85
91
|
*/
|
|
86
92
|
constructor(
|
|
87
93
|
config: any,
|
|
94
|
+
receiveSlotCallback: ReceiveSlotCallback = () => undefined,
|
|
88
95
|
networkQualityMonitor: object = {},
|
|
89
96
|
statsResults: object = defaultStats
|
|
90
97
|
) {
|
|
@@ -98,6 +105,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
98
105
|
this.mqaSentCount = -1;
|
|
99
106
|
this.lastMqaDataSent = {};
|
|
100
107
|
this.lastEmittedStartStopEvent = {};
|
|
108
|
+
this.receiveSlotCallback = receiveSlotCallback;
|
|
109
|
+
this.successfulCandidatePair = {};
|
|
101
110
|
}
|
|
102
111
|
|
|
103
112
|
/**
|
|
@@ -186,7 +195,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
186
195
|
}
|
|
187
196
|
});
|
|
188
197
|
|
|
189
|
-
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress
|
|
198
|
+
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
|
|
190
199
|
|
|
191
200
|
// Adding peripheral information
|
|
192
201
|
newMqa.intervalMetadata.peripherals = [];
|
|
@@ -293,7 +302,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
293
302
|
this.mediaConnection = null;
|
|
294
303
|
});
|
|
295
304
|
}
|
|
296
|
-
this.mediaConnection = null;
|
|
297
305
|
|
|
298
306
|
return Promise.resolve();
|
|
299
307
|
}
|
|
@@ -386,6 +394,13 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
386
394
|
filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {
|
|
387
395
|
const {types} = DEFAULT_GET_STATS_FILTER;
|
|
388
396
|
|
|
397
|
+
// get the successful candidate pair before parsing stats.
|
|
398
|
+
statsItem.report.forEach((report) => {
|
|
399
|
+
if (report.type === 'candidate-pair' && report.state === 'succeeded') {
|
|
400
|
+
this.successfulCandidatePair = report;
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
|
|
389
404
|
statsItem.report.forEach((result) => {
|
|
390
405
|
if (types.includes(result.type)) {
|
|
391
406
|
this.parseGetStatsResult(result, type, isSender);
|
|
@@ -396,6 +411,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
396
411
|
this.statsResults[type].direction = statsItem.currentDirection;
|
|
397
412
|
this.statsResults[type].trackLabel = statsItem.localTrackLabel;
|
|
398
413
|
this.statsResults[type].csi = statsItem.csi;
|
|
414
|
+
// reset the successful candidate pair.
|
|
415
|
+
this.successfulCandidatePair = {};
|
|
399
416
|
}
|
|
400
417
|
}
|
|
401
418
|
|
|
@@ -492,23 +509,23 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
492
509
|
const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>
|
|
493
510
|
Object.keys(this.statsResults)
|
|
494
511
|
.filter((key) => key.startsWith(keyPrefix))
|
|
495
|
-
.reduce((prev, cur) => prev + (this.statsResults[cur]
|
|
512
|
+
.reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);
|
|
496
513
|
|
|
497
514
|
const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>
|
|
498
515
|
Object.keys(this.statsResults)
|
|
499
516
|
.filter((key) => key.startsWith(keyPrefix))
|
|
500
|
-
.reduce((prev, cur) => prev + (this.lastStatsResults[cur]
|
|
517
|
+
.reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
|
|
501
518
|
|
|
502
519
|
const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
503
520
|
Object.keys(this.statsResults)
|
|
504
521
|
.filter((key) => key.startsWith(keyPrefix))
|
|
505
|
-
.reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]
|
|
522
|
+
.reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
|
|
506
523
|
|
|
507
524
|
const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
508
525
|
Object.keys(this.statsResults)
|
|
509
526
|
.filter((key) => key.startsWith(keyPrefix))
|
|
510
527
|
.reduce(
|
|
511
|
-
(prev, cur) => prev + (this.lastStatsResults.resolutions[cur]
|
|
528
|
+
(prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
|
|
512
529
|
0
|
|
513
530
|
);
|
|
514
531
|
|
|
@@ -523,7 +540,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
523
540
|
currentStats.totalPacketsSent === 0
|
|
524
541
|
) {
|
|
525
542
|
LoggerProxy.logger.info(
|
|
526
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent
|
|
543
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,
|
|
544
|
+
currentStats.totalPacketsSent
|
|
527
545
|
);
|
|
528
546
|
} else {
|
|
529
547
|
if (
|
|
@@ -531,7 +549,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
531
549
|
currentStats.totalAudioEnergy === 0
|
|
532
550
|
) {
|
|
533
551
|
LoggerProxy.logger.info(
|
|
534
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present
|
|
552
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,
|
|
553
|
+
currentStats.totalAudioEnergy
|
|
535
554
|
);
|
|
536
555
|
}
|
|
537
556
|
|
|
@@ -565,14 +584,16 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
565
584
|
|
|
566
585
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
567
586
|
LoggerProxy.logger.info(
|
|
568
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received
|
|
587
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,
|
|
588
|
+
currentPacketsReceived
|
|
569
589
|
);
|
|
570
590
|
} else if (
|
|
571
591
|
currentSamplesReceived === previousSamplesReceived ||
|
|
572
592
|
currentSamplesReceived === 0
|
|
573
593
|
) {
|
|
574
594
|
LoggerProxy.logger.info(
|
|
575
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio samples received
|
|
595
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,
|
|
596
|
+
currentSamplesReceived
|
|
576
597
|
);
|
|
577
598
|
}
|
|
578
599
|
|
|
@@ -589,7 +610,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
589
610
|
currentStats.totalPacketsSent === 0
|
|
590
611
|
) {
|
|
591
612
|
LoggerProxy.logger.info(
|
|
592
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent
|
|
613
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,
|
|
614
|
+
currentStats.totalPacketsSent
|
|
593
615
|
);
|
|
594
616
|
} else {
|
|
595
617
|
if (
|
|
@@ -597,7 +619,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
597
619
|
currentStats.framesEncoded === 0
|
|
598
620
|
) {
|
|
599
621
|
LoggerProxy.logger.info(
|
|
600
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded
|
|
622
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,
|
|
623
|
+
currentStats.framesEncoded
|
|
601
624
|
);
|
|
602
625
|
}
|
|
603
626
|
|
|
@@ -607,7 +630,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
607
630
|
this.statsResults.resolutions['video-send'].send.framesSent === 0
|
|
608
631
|
) {
|
|
609
632
|
LoggerProxy.logger.info(
|
|
610
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent
|
|
633
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
|
|
634
|
+
this.statsResults.resolutions['video-send'].send.framesSent
|
|
611
635
|
);
|
|
612
636
|
}
|
|
613
637
|
}
|
|
@@ -643,24 +667,28 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
643
667
|
|
|
644
668
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
645
669
|
LoggerProxy.logger.info(
|
|
646
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received
|
|
670
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,
|
|
671
|
+
currentPacketsReceived
|
|
647
672
|
);
|
|
648
673
|
} else {
|
|
649
674
|
if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
|
|
650
675
|
LoggerProxy.logger.info(
|
|
651
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video frames received
|
|
676
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,
|
|
677
|
+
currentFramesReceived
|
|
652
678
|
);
|
|
653
679
|
}
|
|
654
680
|
|
|
655
681
|
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
656
682
|
LoggerProxy.logger.info(
|
|
657
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded
|
|
683
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,
|
|
684
|
+
currentFramesDecoded
|
|
658
685
|
);
|
|
659
686
|
}
|
|
660
687
|
|
|
661
688
|
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
662
689
|
LoggerProxy.logger.info(
|
|
663
|
-
`StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped
|
|
690
|
+
`StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,
|
|
691
|
+
currentFramesDropped - previousFramesDropped
|
|
664
692
|
);
|
|
665
693
|
}
|
|
666
694
|
}
|
|
@@ -679,7 +707,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
679
707
|
currentStats.totalPacketsSent === 0
|
|
680
708
|
) {
|
|
681
709
|
LoggerProxy.logger.info(
|
|
682
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent
|
|
710
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,
|
|
711
|
+
currentStats.totalPacketsSent
|
|
683
712
|
);
|
|
684
713
|
} else {
|
|
685
714
|
if (
|
|
@@ -687,7 +716,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
687
716
|
currentStats.framesEncoded === 0
|
|
688
717
|
) {
|
|
689
718
|
LoggerProxy.logger.info(
|
|
690
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded
|
|
719
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,
|
|
720
|
+
currentStats.framesEncoded
|
|
691
721
|
);
|
|
692
722
|
}
|
|
693
723
|
|
|
@@ -697,7 +727,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
697
727
|
this.statsResults.resolutions['video-share-send'].send.framesSent === 0
|
|
698
728
|
) {
|
|
699
729
|
LoggerProxy.logger.info(
|
|
700
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames sent
|
|
730
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
|
|
731
|
+
this.statsResults.resolutions['video-share-send'].send.framesSent
|
|
701
732
|
);
|
|
702
733
|
}
|
|
703
734
|
}
|
|
@@ -735,24 +766,28 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
735
766
|
|
|
736
767
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
737
768
|
LoggerProxy.logger.info(
|
|
738
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received
|
|
769
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,
|
|
770
|
+
currentPacketsReceived
|
|
739
771
|
);
|
|
740
772
|
} else {
|
|
741
773
|
if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
|
|
742
774
|
LoggerProxy.logger.info(
|
|
743
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames received
|
|
775
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,
|
|
776
|
+
currentFramesReceived
|
|
744
777
|
);
|
|
745
778
|
}
|
|
746
779
|
|
|
747
780
|
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
748
781
|
LoggerProxy.logger.info(
|
|
749
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded
|
|
782
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,
|
|
783
|
+
currentFramesDecoded
|
|
750
784
|
);
|
|
751
785
|
}
|
|
752
786
|
|
|
753
787
|
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
754
788
|
LoggerProxy.logger.info(
|
|
755
|
-
`StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped
|
|
789
|
+
`StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,
|
|
790
|
+
currentFramesDropped - previousFramesDropped
|
|
756
791
|
);
|
|
757
792
|
}
|
|
758
793
|
}
|
|
@@ -853,6 +888,14 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
853
888
|
if (result.bytesSent) {
|
|
854
889
|
let kilobytes = 0;
|
|
855
890
|
|
|
891
|
+
if (result.frameWidth && result.frameHeight) {
|
|
892
|
+
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
893
|
+
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
894
|
+
this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
895
|
+
this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =
|
|
896
|
+
result.hugeFramesSent;
|
|
897
|
+
}
|
|
898
|
+
|
|
856
899
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
|
|
857
900
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
|
|
858
901
|
}
|
|
@@ -925,6 +968,17 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
925
968
|
|
|
926
969
|
if (result.bytesReceived) {
|
|
927
970
|
let kilobytes = 0;
|
|
971
|
+
const receiveSlot = this.receiveSlotCallback(result.ssrc);
|
|
972
|
+
const idAndCsi = receiveSlot
|
|
973
|
+
? `id: "${receiveSlot.id || ''}"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`
|
|
974
|
+
: '';
|
|
975
|
+
|
|
976
|
+
if (result.frameWidth && result.frameHeight) {
|
|
977
|
+
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
978
|
+
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
979
|
+
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =
|
|
980
|
+
result.framesReceived;
|
|
981
|
+
}
|
|
928
982
|
|
|
929
983
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
|
|
930
984
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
|
|
@@ -974,10 +1028,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
974
1028
|
result.packetsReceived;
|
|
975
1029
|
|
|
976
1030
|
if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
1031
|
+
if (receiveSlot) {
|
|
1032
|
+
LoggerProxy.logger.info(
|
|
1033
|
+
`StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
|
|
1034
|
+
this.statsResults[mediaType][sendrecvType].packetsReceived
|
|
1035
|
+
);
|
|
1036
|
+
}
|
|
981
1037
|
}
|
|
982
1038
|
|
|
983
1039
|
// Check the over all packet Lost ratio
|
|
@@ -989,7 +1045,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
989
1045
|
: 0;
|
|
990
1046
|
if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
|
|
991
1047
|
LoggerProxy.logger.info(
|
|
992
|
-
|
|
1048
|
+
`StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,
|
|
993
1049
|
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
|
|
994
1050
|
);
|
|
995
1051
|
}
|
|
@@ -1049,73 +1105,40 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1049
1105
|
if (!result || !result.id) {
|
|
1050
1106
|
return;
|
|
1051
1107
|
}
|
|
1052
|
-
const RemoteCandidateType = {};
|
|
1053
|
-
const RemoteTransport = {};
|
|
1054
|
-
const RemoteIpAddress = {};
|
|
1055
|
-
const RemoteNetworkType = {};
|
|
1056
|
-
|
|
1057
|
-
if (!result.id) return;
|
|
1058
|
-
|
|
1059
|
-
const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
|
|
1060
|
-
const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
|
|
1061
|
-
|
|
1062
|
-
if (!RemoteCandidateType[result.id]) {
|
|
1063
|
-
RemoteCandidateType[result.id] = [];
|
|
1064
|
-
}
|
|
1065
1108
|
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
if (!RemoteIpAddress[result.id]) {
|
|
1071
|
-
RemoteIpAddress[result.id] = [];
|
|
1072
|
-
}
|
|
1073
|
-
if (!RemoteNetworkType[result.id]) {
|
|
1074
|
-
RemoteNetworkType[result.id] = [];
|
|
1075
|
-
}
|
|
1076
|
-
|
|
1077
|
-
if (
|
|
1078
|
-
result.candidateType &&
|
|
1079
|
-
RemoteCandidateType[result.id].indexOf(result.candidateType) === -1
|
|
1080
|
-
) {
|
|
1081
|
-
RemoteCandidateType[result.id].push(result.candidateType);
|
|
1082
|
-
}
|
|
1083
|
-
|
|
1084
|
-
if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
|
|
1085
|
-
RemoteTransport[result.id].push(result.protocol.toUpperCase());
|
|
1109
|
+
// We only care about the successful local candidate
|
|
1110
|
+
if (this.successfulCandidatePair?.localCandidateId !== result.id) {
|
|
1111
|
+
return;
|
|
1086
1112
|
}
|
|
1087
1113
|
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
) {
|
|
1092
|
-
|
|
1114
|
+
let transport;
|
|
1115
|
+
if (result.relayProtocol) {
|
|
1116
|
+
transport = result.relayProtocol.toUpperCase();
|
|
1117
|
+
} else if (result.protocol) {
|
|
1118
|
+
transport = result.protocol.toUpperCase();
|
|
1093
1119
|
}
|
|
1094
1120
|
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
}
|
|
1121
|
+
const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
|
|
1122
|
+
const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
|
|
1098
1123
|
|
|
1099
1124
|
this.statsResults.internal.candidates[result.id] = {
|
|
1100
|
-
candidateType:
|
|
1101
|
-
ipAddress:
|
|
1125
|
+
candidateType: result.candidateType,
|
|
1126
|
+
ipAddress: result.ip, // TODO: add ports
|
|
1102
1127
|
portNumber: result.port,
|
|
1103
|
-
networkType:
|
|
1128
|
+
networkType: result.networkType,
|
|
1104
1129
|
priority: result.priority,
|
|
1105
|
-
transport
|
|
1130
|
+
transport,
|
|
1106
1131
|
timestamp: result.time,
|
|
1107
1132
|
id: result.id,
|
|
1108
1133
|
type: result.type,
|
|
1109
1134
|
};
|
|
1110
1135
|
|
|
1111
|
-
this.statsResults.connectionType[ipType].candidateType =
|
|
1112
|
-
this.statsResults.connectionType[ipType].ipAddress =
|
|
1136
|
+
this.statsResults.connectionType[ipType].candidateType = result.candidateType;
|
|
1137
|
+
this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
|
|
1113
1138
|
|
|
1114
1139
|
this.statsResults.connectionType[ipType].networkType =
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
: RemoteNetworkType[result.id][0];
|
|
1118
|
-
this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
|
|
1140
|
+
result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
|
|
1141
|
+
this.statsResults.connectionType[ipType].transport = transport;
|
|
1119
1142
|
|
|
1120
1143
|
this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
|
|
1121
1144
|
};
|
|
@@ -1137,13 +1160,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1137
1160
|
const sendrecvType =
|
|
1138
1161
|
result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
|
|
1139
1162
|
|
|
1140
|
-
if (result.frameWidth && result.frameHeight) {
|
|
1141
|
-
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
1142
|
-
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
1143
|
-
this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
1144
|
-
this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
|
|
1145
|
-
}
|
|
1146
|
-
|
|
1147
1163
|
if (sendrecvType === STATS.RECEIVE_DIRECTION) {
|
|
1148
1164
|
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
1149
1165
|
this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
|
|
@@ -23,7 +23,7 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
audioReceiver.common.common.direction = statsResults[mediaType].direction;
|
|
26
|
-
audioReceiver.common.transportType = statsResults.connectionType.
|
|
26
|
+
audioReceiver.common.transportType = statsResults.connectionType.local.transport;
|
|
27
27
|
|
|
28
28
|
// add rtpPacket info inside common as also for call analyzer
|
|
29
29
|
audioReceiver.common.rtpPackets =
|
|
@@ -83,7 +83,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, m
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
audioSender.common.common.direction = statsResults[mediaType].direction;
|
|
86
|
-
audioSender.common.transportType = statsResults.connectionType.local.transport
|
|
86
|
+
audioSender.common.transportType = statsResults.connectionType.local.transport;
|
|
87
87
|
|
|
88
88
|
audioSender.common.maxRemoteJitter =
|
|
89
89
|
// @ts-ignore
|
|
@@ -146,7 +146,8 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
videoReceiver.common.common.direction = statsResults[mediaType].direction;
|
|
149
|
-
videoReceiver.common.transportType = statsResults.connectionType.
|
|
149
|
+
videoReceiver.common.transportType = statsResults.connectionType.local.transport;
|
|
150
|
+
|
|
150
151
|
// collect the packets received for the last min
|
|
151
152
|
videoReceiver.common.rtpPackets =
|
|
152
153
|
statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
|
|
@@ -199,12 +200,11 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
199
200
|
videoReceiver.streams[0].common.framesDropped =
|
|
200
201
|
statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
|
|
201
202
|
videoReceiver.streams[0].receivedHeight =
|
|
202
|
-
statsResults.resolutions[mediaType][sendrecvType].height;
|
|
203
|
-
videoReceiver.streams[0].receivedWidth =
|
|
203
|
+
statsResults.resolutions[mediaType][sendrecvType].height || 0;
|
|
204
|
+
videoReceiver.streams[0].receivedWidth =
|
|
205
|
+
statsResults.resolutions[mediaType][sendrecvType].width || 0;
|
|
204
206
|
videoReceiver.streams[0].receivedFrameSize =
|
|
205
|
-
(
|
|
206
|
-
statsResults.resolutions[mediaType][sendrecvType].height) /
|
|
207
|
-
256;
|
|
207
|
+
(videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
|
|
208
208
|
|
|
209
209
|
videoReceiver.streams[0].receivedKeyFrames =
|
|
210
210
|
statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
|
|
@@ -229,7 +229,7 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
|
|
|
229
229
|
}
|
|
230
230
|
|
|
231
231
|
videoSender.common.common.direction = statsResults[mediaType].direction;
|
|
232
|
-
videoSender.common.transportType = statsResults.connectionType.local.transport
|
|
232
|
+
videoSender.common.transportType = statsResults.connectionType.local.transport;
|
|
233
233
|
|
|
234
234
|
// @ts-ignore
|
|
235
235
|
videoSender.common.maxRemoteJitter =
|
|
@@ -284,10 +284,9 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
|
|
|
284
284
|
? (totalFrameSentInaMin * 100) / 60
|
|
285
285
|
: 0;
|
|
286
286
|
videoSender.streams[0].transmittedHeight =
|
|
287
|
-
statsResults.resolutions[mediaType][sendrecvType].height;
|
|
288
|
-
videoSender.streams[0].transmittedWidth =
|
|
287
|
+
statsResults.resolutions[mediaType][sendrecvType].height || 0;
|
|
288
|
+
videoSender.streams[0].transmittedWidth =
|
|
289
|
+
statsResults.resolutions[mediaType][sendrecvType].width || 0;
|
|
289
290
|
videoSender.streams[0].transmittedFrameSize =
|
|
290
|
-
(
|
|
291
|
-
statsResults.resolutions[mediaType][sendrecvType].width) /
|
|
292
|
-
254;
|
|
291
|
+
(videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
|
|
293
292
|
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {MEETINGS} from '../constants';
|
|
6
|
+
|
|
7
|
+
class WebinarCollection {
|
|
8
|
+
webinarInfo: any;
|
|
9
|
+
|
|
10
|
+
namespace = MEETINGS;
|
|
11
|
+
|
|
12
|
+
mainIndex = 'sessionId';
|
|
13
|
+
|
|
14
|
+
constructor() {
|
|
15
|
+
this.webinarInfo = {};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
set(id, info) {
|
|
19
|
+
this.webinarInfo[id] = info;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @param {String} id
|
|
24
|
+
* @returns {Member}
|
|
25
|
+
*/
|
|
26
|
+
get(id: string) {
|
|
27
|
+
return this.webinarInfo[id];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default WebinarCollection;
|