@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310
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 +3777 -2929
- 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 +260 -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 +39 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +415 -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 +86 -78
- 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 +194 -24
- 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 +463 -510
- 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 +17 -0
- package/dist/types/meetings/index.d.ts +98 -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 +221 -19
- 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 +3132 -2541
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +229 -131
- package/src/meeting/request.ts +177 -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 +33 -0
- package/src/meetings/index.ts +445 -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 +105 -91
- 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 +5216 -1956
- 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 +483 -49
- 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 +26 -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 +136 -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,21 +195,19 @@ 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
|
-
newMqa.intervalMetadata.peripherals = [];
|
|
193
|
-
|
|
194
201
|
newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});
|
|
195
202
|
if (this.statsResults['audio-send']) {
|
|
196
203
|
newMqa.intervalMetadata.peripherals.push({
|
|
197
|
-
information: this.statsResults['audio-send']
|
|
204
|
+
information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,
|
|
198
205
|
name: MEDIA_DEVICES.MICROPHONE,
|
|
199
206
|
});
|
|
200
207
|
}
|
|
201
208
|
if (this.statsResults['video-send']) {
|
|
202
209
|
newMqa.intervalMetadata.peripherals.push({
|
|
203
|
-
information: this.statsResults['video-send']
|
|
210
|
+
information: this.statsResults['video-send'].trackLabel || _UNKNOWN_,
|
|
204
211
|
name: MEDIA_DEVICES.CAMERA,
|
|
205
212
|
});
|
|
206
213
|
}
|
|
@@ -293,7 +300,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
293
300
|
this.mediaConnection = null;
|
|
294
301
|
});
|
|
295
302
|
}
|
|
296
|
-
this.mediaConnection = null;
|
|
297
303
|
|
|
298
304
|
return Promise.resolve();
|
|
299
305
|
}
|
|
@@ -386,6 +392,13 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
386
392
|
filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {
|
|
387
393
|
const {types} = DEFAULT_GET_STATS_FILTER;
|
|
388
394
|
|
|
395
|
+
// get the successful candidate pair before parsing stats.
|
|
396
|
+
statsItem.report.forEach((report) => {
|
|
397
|
+
if (report.type === 'candidate-pair' && report.state === 'succeeded') {
|
|
398
|
+
this.successfulCandidatePair = report;
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
|
|
389
402
|
statsItem.report.forEach((result) => {
|
|
390
403
|
if (types.includes(result.type)) {
|
|
391
404
|
this.parseGetStatsResult(result, type, isSender);
|
|
@@ -396,6 +409,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
396
409
|
this.statsResults[type].direction = statsItem.currentDirection;
|
|
397
410
|
this.statsResults[type].trackLabel = statsItem.localTrackLabel;
|
|
398
411
|
this.statsResults[type].csi = statsItem.csi;
|
|
412
|
+
// reset the successful candidate pair.
|
|
413
|
+
this.successfulCandidatePair = {};
|
|
399
414
|
}
|
|
400
415
|
}
|
|
401
416
|
|
|
@@ -492,23 +507,23 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
492
507
|
const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>
|
|
493
508
|
Object.keys(this.statsResults)
|
|
494
509
|
.filter((key) => key.startsWith(keyPrefix))
|
|
495
|
-
.reduce((prev, cur) => prev + (this.statsResults[cur]
|
|
510
|
+
.reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);
|
|
496
511
|
|
|
497
512
|
const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>
|
|
498
513
|
Object.keys(this.statsResults)
|
|
499
514
|
.filter((key) => key.startsWith(keyPrefix))
|
|
500
|
-
.reduce((prev, cur) => prev + (this.lastStatsResults[cur]
|
|
515
|
+
.reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
|
|
501
516
|
|
|
502
517
|
const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
503
518
|
Object.keys(this.statsResults)
|
|
504
519
|
.filter((key) => key.startsWith(keyPrefix))
|
|
505
|
-
.reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]
|
|
520
|
+
.reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
|
|
506
521
|
|
|
507
522
|
const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
508
523
|
Object.keys(this.statsResults)
|
|
509
524
|
.filter((key) => key.startsWith(keyPrefix))
|
|
510
525
|
.reduce(
|
|
511
|
-
(prev, cur) => prev + (this.lastStatsResults.resolutions[cur]
|
|
526
|
+
(prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
|
|
512
527
|
0
|
|
513
528
|
);
|
|
514
529
|
|
|
@@ -523,7 +538,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
523
538
|
currentStats.totalPacketsSent === 0
|
|
524
539
|
) {
|
|
525
540
|
LoggerProxy.logger.info(
|
|
526
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent
|
|
541
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,
|
|
542
|
+
currentStats.totalPacketsSent
|
|
527
543
|
);
|
|
528
544
|
} else {
|
|
529
545
|
if (
|
|
@@ -531,7 +547,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
531
547
|
currentStats.totalAudioEnergy === 0
|
|
532
548
|
) {
|
|
533
549
|
LoggerProxy.logger.info(
|
|
534
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present
|
|
550
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,
|
|
551
|
+
currentStats.totalAudioEnergy
|
|
535
552
|
);
|
|
536
553
|
}
|
|
537
554
|
|
|
@@ -565,14 +582,16 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
565
582
|
|
|
566
583
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
567
584
|
LoggerProxy.logger.info(
|
|
568
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received
|
|
585
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,
|
|
586
|
+
currentPacketsReceived
|
|
569
587
|
);
|
|
570
588
|
} else if (
|
|
571
589
|
currentSamplesReceived === previousSamplesReceived ||
|
|
572
590
|
currentSamplesReceived === 0
|
|
573
591
|
) {
|
|
574
592
|
LoggerProxy.logger.info(
|
|
575
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio samples received
|
|
593
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,
|
|
594
|
+
currentSamplesReceived
|
|
576
595
|
);
|
|
577
596
|
}
|
|
578
597
|
|
|
@@ -589,7 +608,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
589
608
|
currentStats.totalPacketsSent === 0
|
|
590
609
|
) {
|
|
591
610
|
LoggerProxy.logger.info(
|
|
592
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent
|
|
611
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,
|
|
612
|
+
currentStats.totalPacketsSent
|
|
593
613
|
);
|
|
594
614
|
} else {
|
|
595
615
|
if (
|
|
@@ -597,7 +617,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
597
617
|
currentStats.framesEncoded === 0
|
|
598
618
|
) {
|
|
599
619
|
LoggerProxy.logger.info(
|
|
600
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded
|
|
620
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,
|
|
621
|
+
currentStats.framesEncoded
|
|
601
622
|
);
|
|
602
623
|
}
|
|
603
624
|
|
|
@@ -607,7 +628,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
607
628
|
this.statsResults.resolutions['video-send'].send.framesSent === 0
|
|
608
629
|
) {
|
|
609
630
|
LoggerProxy.logger.info(
|
|
610
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent
|
|
631
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
|
|
632
|
+
this.statsResults.resolutions['video-send'].send.framesSent
|
|
611
633
|
);
|
|
612
634
|
}
|
|
613
635
|
}
|
|
@@ -643,24 +665,28 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
643
665
|
|
|
644
666
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
645
667
|
LoggerProxy.logger.info(
|
|
646
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received
|
|
668
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,
|
|
669
|
+
currentPacketsReceived
|
|
647
670
|
);
|
|
648
671
|
} else {
|
|
649
672
|
if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
|
|
650
673
|
LoggerProxy.logger.info(
|
|
651
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video frames received
|
|
674
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,
|
|
675
|
+
currentFramesReceived
|
|
652
676
|
);
|
|
653
677
|
}
|
|
654
678
|
|
|
655
679
|
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
656
680
|
LoggerProxy.logger.info(
|
|
657
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded
|
|
681
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,
|
|
682
|
+
currentFramesDecoded
|
|
658
683
|
);
|
|
659
684
|
}
|
|
660
685
|
|
|
661
686
|
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
662
687
|
LoggerProxy.logger.info(
|
|
663
|
-
`StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped
|
|
688
|
+
`StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,
|
|
689
|
+
currentFramesDropped - previousFramesDropped
|
|
664
690
|
);
|
|
665
691
|
}
|
|
666
692
|
}
|
|
@@ -679,7 +705,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
679
705
|
currentStats.totalPacketsSent === 0
|
|
680
706
|
) {
|
|
681
707
|
LoggerProxy.logger.info(
|
|
682
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent
|
|
708
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,
|
|
709
|
+
currentStats.totalPacketsSent
|
|
683
710
|
);
|
|
684
711
|
} else {
|
|
685
712
|
if (
|
|
@@ -687,7 +714,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
687
714
|
currentStats.framesEncoded === 0
|
|
688
715
|
) {
|
|
689
716
|
LoggerProxy.logger.info(
|
|
690
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded
|
|
717
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,
|
|
718
|
+
currentStats.framesEncoded
|
|
691
719
|
);
|
|
692
720
|
}
|
|
693
721
|
|
|
@@ -697,7 +725,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
697
725
|
this.statsResults.resolutions['video-share-send'].send.framesSent === 0
|
|
698
726
|
) {
|
|
699
727
|
LoggerProxy.logger.info(
|
|
700
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames sent
|
|
728
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
|
|
729
|
+
this.statsResults.resolutions['video-share-send'].send.framesSent
|
|
701
730
|
);
|
|
702
731
|
}
|
|
703
732
|
}
|
|
@@ -735,24 +764,28 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
735
764
|
|
|
736
765
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
737
766
|
LoggerProxy.logger.info(
|
|
738
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received
|
|
767
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,
|
|
768
|
+
currentPacketsReceived
|
|
739
769
|
);
|
|
740
770
|
} else {
|
|
741
771
|
if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
|
|
742
772
|
LoggerProxy.logger.info(
|
|
743
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames received
|
|
773
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,
|
|
774
|
+
currentFramesReceived
|
|
744
775
|
);
|
|
745
776
|
}
|
|
746
777
|
|
|
747
778
|
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
748
779
|
LoggerProxy.logger.info(
|
|
749
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded
|
|
780
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,
|
|
781
|
+
currentFramesDecoded
|
|
750
782
|
);
|
|
751
783
|
}
|
|
752
784
|
|
|
753
785
|
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
754
786
|
LoggerProxy.logger.info(
|
|
755
|
-
`StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped
|
|
787
|
+
`StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,
|
|
788
|
+
currentFramesDropped - previousFramesDropped
|
|
756
789
|
);
|
|
757
790
|
}
|
|
758
791
|
}
|
|
@@ -853,6 +886,14 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
853
886
|
if (result.bytesSent) {
|
|
854
887
|
let kilobytes = 0;
|
|
855
888
|
|
|
889
|
+
if (result.frameWidth && result.frameHeight) {
|
|
890
|
+
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
891
|
+
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
892
|
+
this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
893
|
+
this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =
|
|
894
|
+
result.hugeFramesSent;
|
|
895
|
+
}
|
|
896
|
+
|
|
856
897
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
|
|
857
898
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
|
|
858
899
|
}
|
|
@@ -925,6 +966,17 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
925
966
|
|
|
926
967
|
if (result.bytesReceived) {
|
|
927
968
|
let kilobytes = 0;
|
|
969
|
+
const receiveSlot = this.receiveSlotCallback(result.ssrc);
|
|
970
|
+
const idAndCsi = receiveSlot
|
|
971
|
+
? `id: "${receiveSlot.id || ''}"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`
|
|
972
|
+
: '';
|
|
973
|
+
|
|
974
|
+
if (result.frameWidth && result.frameHeight) {
|
|
975
|
+
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
976
|
+
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
977
|
+
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =
|
|
978
|
+
result.framesReceived;
|
|
979
|
+
}
|
|
928
980
|
|
|
929
981
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
|
|
930
982
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
|
|
@@ -974,10 +1026,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
974
1026
|
result.packetsReceived;
|
|
975
1027
|
|
|
976
1028
|
if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
1029
|
+
if (receiveSlot) {
|
|
1030
|
+
LoggerProxy.logger.info(
|
|
1031
|
+
`StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
|
|
1032
|
+
this.statsResults[mediaType][sendrecvType].packetsReceived
|
|
1033
|
+
);
|
|
1034
|
+
}
|
|
981
1035
|
}
|
|
982
1036
|
|
|
983
1037
|
// Check the over all packet Lost ratio
|
|
@@ -989,7 +1043,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
989
1043
|
: 0;
|
|
990
1044
|
if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
|
|
991
1045
|
LoggerProxy.logger.info(
|
|
992
|
-
|
|
1046
|
+
`StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,
|
|
993
1047
|
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
|
|
994
1048
|
);
|
|
995
1049
|
}
|
|
@@ -1049,73 +1103,40 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1049
1103
|
if (!result || !result.id) {
|
|
1050
1104
|
return;
|
|
1051
1105
|
}
|
|
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
|
-
|
|
1066
|
-
if (!RemoteTransport[result.id]) {
|
|
1067
|
-
RemoteTransport[result.id] = [];
|
|
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
1106
|
|
|
1084
|
-
|
|
1085
|
-
|
|
1107
|
+
// We only care about the successful local candidate
|
|
1108
|
+
if (this.successfulCandidatePair?.localCandidateId !== result.id) {
|
|
1109
|
+
return;
|
|
1086
1110
|
}
|
|
1087
1111
|
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
) {
|
|
1092
|
-
|
|
1112
|
+
let transport;
|
|
1113
|
+
if (result.relayProtocol) {
|
|
1114
|
+
transport = result.relayProtocol.toUpperCase();
|
|
1115
|
+
} else if (result.protocol) {
|
|
1116
|
+
transport = result.protocol.toUpperCase();
|
|
1093
1117
|
}
|
|
1094
1118
|
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
}
|
|
1119
|
+
const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
|
|
1120
|
+
const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
|
|
1098
1121
|
|
|
1099
1122
|
this.statsResults.internal.candidates[result.id] = {
|
|
1100
|
-
candidateType:
|
|
1101
|
-
ipAddress:
|
|
1123
|
+
candidateType: result.candidateType,
|
|
1124
|
+
ipAddress: result.ip, // TODO: add ports
|
|
1102
1125
|
portNumber: result.port,
|
|
1103
|
-
networkType:
|
|
1126
|
+
networkType: result.networkType,
|
|
1104
1127
|
priority: result.priority,
|
|
1105
|
-
transport
|
|
1128
|
+
transport,
|
|
1106
1129
|
timestamp: result.time,
|
|
1107
1130
|
id: result.id,
|
|
1108
1131
|
type: result.type,
|
|
1109
1132
|
};
|
|
1110
1133
|
|
|
1111
|
-
this.statsResults.connectionType[ipType].candidateType =
|
|
1112
|
-
this.statsResults.connectionType[ipType].ipAddress =
|
|
1134
|
+
this.statsResults.connectionType[ipType].candidateType = result.candidateType;
|
|
1135
|
+
this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
|
|
1113
1136
|
|
|
1114
1137
|
this.statsResults.connectionType[ipType].networkType =
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
: RemoteNetworkType[result.id][0];
|
|
1118
|
-
this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
|
|
1138
|
+
result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
|
|
1139
|
+
this.statsResults.connectionType[ipType].transport = transport;
|
|
1119
1140
|
|
|
1120
1141
|
this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
|
|
1121
1142
|
};
|
|
@@ -1137,13 +1158,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1137
1158
|
const sendrecvType =
|
|
1138
1159
|
result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
|
|
1139
1160
|
|
|
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
1161
|
if (sendrecvType === STATS.RECEIVE_DIRECTION) {
|
|
1148
1162
|
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
1149
1163
|
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;
|