@webex/plugin-meetings 3.0.0-beta.33 → 3.0.0-beta.331
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 +4 -10
- 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 +86 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3917 -2960
- 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 +424 -116
- 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 +16 -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 +228 -58
- 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 +214 -170
- 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 +142 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +107 -79
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +27 -26
- 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 +201 -30
- 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 +86 -2
- package/dist/types/meeting/index.d.ts +502 -512
- 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 +101 -21
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +14 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +25 -0
- package/dist/types/members/util.d.ts +214 -1
- package/dist/types/metrics/constants.d.ts +15 -4
- package/dist/types/metrics/index.d.ts +4 -119
- package/dist/types/multistream/mediaRequestManager.d.ts +72 -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 +19 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/index.d.ts +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 +54 -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 +24 -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 +3 -9
- package/src/constants.ts +224 -20
- 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 +171 -3
- package/src/meeting/index.ts +3267 -2555
- 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 +454 -125
- 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 +15 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +277 -82
- 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 +128 -106
- 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 +124 -0
- package/src/statsAnalyzer/index.ts +135 -92
- package/src/statsAnalyzer/mqaUtil.ts +30 -28
- 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 +85 -3
- package/test/unit/spec/meeting/index.js +5750 -2023
- 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 +1231 -212
- 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 +776 -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 +117 -11
- 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 +93 -0
- package/test/unit/spec/stats-analyzer/index.js +147 -3
- 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
|
@@ -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
|
) {
|
|
@@ -96,8 +103,10 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
96
103
|
this.networkQualityMonitor = networkQualityMonitor;
|
|
97
104
|
this.correlationId = config.correlationId;
|
|
98
105
|
this.mqaSentCount = -1;
|
|
99
|
-
this.lastMqaDataSent = {};
|
|
106
|
+
this.lastMqaDataSent = {resolutions: {}};
|
|
100
107
|
this.lastEmittedStartStopEvent = {};
|
|
108
|
+
this.receiveSlotCallback = receiveSlotCallback;
|
|
109
|
+
this.successfulCandidatePair = {};
|
|
101
110
|
}
|
|
102
111
|
|
|
103
112
|
/**
|
|
@@ -143,6 +152,21 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
143
152
|
const newMqa = cloneDeep(emptyMqaInterval);
|
|
144
153
|
|
|
145
154
|
Object.keys(this.statsResults).forEach((mediaType) => {
|
|
155
|
+
if (!this.lastMqaDataSent[mediaType]) {
|
|
156
|
+
this.lastMqaDataSent[mediaType] = {};
|
|
157
|
+
this.lastMqaDataSent.resolutions[mediaType] = {};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
|
|
161
|
+
this.lastMqaDataSent[mediaType].send = {};
|
|
162
|
+
this.lastMqaDataSent.resolutions[mediaType].send = {};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
|
|
166
|
+
this.lastMqaDataSent[mediaType].recv = {};
|
|
167
|
+
this.lastMqaDataSent.resolutions[mediaType].recv = {};
|
|
168
|
+
}
|
|
169
|
+
|
|
146
170
|
if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
|
|
147
171
|
const audioSender = cloneDeep(emptyAudioTransmit);
|
|
148
172
|
|
|
@@ -153,6 +177,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
153
177
|
mediaType,
|
|
154
178
|
});
|
|
155
179
|
newMqa.audioTransmit.push(audioSender);
|
|
180
|
+
|
|
181
|
+
this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
|
|
156
182
|
} else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
|
|
157
183
|
const audioReceiver = cloneDeep(emptyAudioReceive);
|
|
158
184
|
|
|
@@ -163,6 +189,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
163
189
|
mediaType,
|
|
164
190
|
});
|
|
165
191
|
newMqa.audioReceive.push(audioReceiver);
|
|
192
|
+
|
|
193
|
+
this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
|
|
166
194
|
} else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
|
|
167
195
|
const videoSender = cloneDeep(emptyVideoTransmit);
|
|
168
196
|
|
|
@@ -173,6 +201,11 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
173
201
|
mediaType,
|
|
174
202
|
});
|
|
175
203
|
newMqa.videoTransmit.push(videoSender);
|
|
204
|
+
|
|
205
|
+
this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
|
|
206
|
+
this.lastMqaDataSent.resolutions[mediaType].send = cloneDeep(
|
|
207
|
+
this.statsResults.resolutions[mediaType].send
|
|
208
|
+
);
|
|
176
209
|
} else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
|
|
177
210
|
const videoReceiver = cloneDeep(emptyVideoReceive);
|
|
178
211
|
|
|
@@ -183,24 +216,27 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
183
216
|
mediaType,
|
|
184
217
|
});
|
|
185
218
|
newMqa.videoReceive.push(videoReceiver);
|
|
219
|
+
|
|
220
|
+
this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
|
|
221
|
+
this.lastMqaDataSent.resolutions[mediaType].recv = cloneDeep(
|
|
222
|
+
this.statsResults.resolutions[mediaType].recv
|
|
223
|
+
);
|
|
186
224
|
}
|
|
187
225
|
});
|
|
188
226
|
|
|
189
|
-
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress
|
|
227
|
+
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
|
|
190
228
|
|
|
191
229
|
// Adding peripheral information
|
|
192
|
-
newMqa.intervalMetadata.peripherals = [];
|
|
193
|
-
|
|
194
230
|
newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});
|
|
195
231
|
if (this.statsResults['audio-send']) {
|
|
196
232
|
newMqa.intervalMetadata.peripherals.push({
|
|
197
|
-
information: this.statsResults['audio-send']
|
|
233
|
+
information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,
|
|
198
234
|
name: MEDIA_DEVICES.MICROPHONE,
|
|
199
235
|
});
|
|
200
236
|
}
|
|
201
237
|
if (this.statsResults['video-send']) {
|
|
202
238
|
newMqa.intervalMetadata.peripherals.push({
|
|
203
|
-
information: this.statsResults['video-send']
|
|
239
|
+
information: this.statsResults['video-send'].trackLabel || _UNKNOWN_,
|
|
204
240
|
name: MEDIA_DEVICES.CAMERA,
|
|
205
241
|
});
|
|
206
242
|
}
|
|
@@ -293,7 +329,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
293
329
|
this.mediaConnection = null;
|
|
294
330
|
});
|
|
295
331
|
}
|
|
296
|
-
this.mediaConnection = null;
|
|
297
332
|
|
|
298
333
|
return Promise.resolve();
|
|
299
334
|
}
|
|
@@ -386,6 +421,13 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
386
421
|
filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {
|
|
387
422
|
const {types} = DEFAULT_GET_STATS_FILTER;
|
|
388
423
|
|
|
424
|
+
// get the successful candidate pair before parsing stats.
|
|
425
|
+
statsItem.report.forEach((report) => {
|
|
426
|
+
if (report.type === 'candidate-pair' && report.state === 'succeeded') {
|
|
427
|
+
this.successfulCandidatePair = report;
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
|
|
389
431
|
statsItem.report.forEach((result) => {
|
|
390
432
|
if (types.includes(result.type)) {
|
|
391
433
|
this.parseGetStatsResult(result, type, isSender);
|
|
@@ -396,6 +438,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
396
438
|
this.statsResults[type].direction = statsItem.currentDirection;
|
|
397
439
|
this.statsResults[type].trackLabel = statsItem.localTrackLabel;
|
|
398
440
|
this.statsResults[type].csi = statsItem.csi;
|
|
441
|
+
// reset the successful candidate pair.
|
|
442
|
+
this.successfulCandidatePair = {};
|
|
399
443
|
}
|
|
400
444
|
}
|
|
401
445
|
|
|
@@ -492,23 +536,23 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
492
536
|
const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>
|
|
493
537
|
Object.keys(this.statsResults)
|
|
494
538
|
.filter((key) => key.startsWith(keyPrefix))
|
|
495
|
-
.reduce((prev, cur) => prev + (this.statsResults[cur]
|
|
539
|
+
.reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);
|
|
496
540
|
|
|
497
541
|
const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>
|
|
498
542
|
Object.keys(this.statsResults)
|
|
499
543
|
.filter((key) => key.startsWith(keyPrefix))
|
|
500
|
-
.reduce((prev, cur) => prev + (this.lastStatsResults[cur]
|
|
544
|
+
.reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
|
|
501
545
|
|
|
502
546
|
const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
503
547
|
Object.keys(this.statsResults)
|
|
504
548
|
.filter((key) => key.startsWith(keyPrefix))
|
|
505
|
-
.reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]
|
|
549
|
+
.reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
|
|
506
550
|
|
|
507
551
|
const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
508
552
|
Object.keys(this.statsResults)
|
|
509
553
|
.filter((key) => key.startsWith(keyPrefix))
|
|
510
554
|
.reduce(
|
|
511
|
-
(prev, cur) => prev + (this.lastStatsResults.resolutions[cur]
|
|
555
|
+
(prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
|
|
512
556
|
0
|
|
513
557
|
);
|
|
514
558
|
|
|
@@ -523,7 +567,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
523
567
|
currentStats.totalPacketsSent === 0
|
|
524
568
|
) {
|
|
525
569
|
LoggerProxy.logger.info(
|
|
526
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent
|
|
570
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,
|
|
571
|
+
currentStats.totalPacketsSent
|
|
527
572
|
);
|
|
528
573
|
} else {
|
|
529
574
|
if (
|
|
@@ -531,7 +576,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
531
576
|
currentStats.totalAudioEnergy === 0
|
|
532
577
|
) {
|
|
533
578
|
LoggerProxy.logger.info(
|
|
534
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present
|
|
579
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,
|
|
580
|
+
currentStats.totalAudioEnergy
|
|
535
581
|
);
|
|
536
582
|
}
|
|
537
583
|
|
|
@@ -565,14 +611,16 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
565
611
|
|
|
566
612
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
567
613
|
LoggerProxy.logger.info(
|
|
568
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received
|
|
614
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,
|
|
615
|
+
currentPacketsReceived
|
|
569
616
|
);
|
|
570
617
|
} else if (
|
|
571
618
|
currentSamplesReceived === previousSamplesReceived ||
|
|
572
619
|
currentSamplesReceived === 0
|
|
573
620
|
) {
|
|
574
621
|
LoggerProxy.logger.info(
|
|
575
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio samples received
|
|
622
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,
|
|
623
|
+
currentSamplesReceived
|
|
576
624
|
);
|
|
577
625
|
}
|
|
578
626
|
|
|
@@ -589,7 +637,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
589
637
|
currentStats.totalPacketsSent === 0
|
|
590
638
|
) {
|
|
591
639
|
LoggerProxy.logger.info(
|
|
592
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent
|
|
640
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,
|
|
641
|
+
currentStats.totalPacketsSent
|
|
593
642
|
);
|
|
594
643
|
} else {
|
|
595
644
|
if (
|
|
@@ -597,7 +646,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
597
646
|
currentStats.framesEncoded === 0
|
|
598
647
|
) {
|
|
599
648
|
LoggerProxy.logger.info(
|
|
600
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded
|
|
649
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,
|
|
650
|
+
currentStats.framesEncoded
|
|
601
651
|
);
|
|
602
652
|
}
|
|
603
653
|
|
|
@@ -607,7 +657,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
607
657
|
this.statsResults.resolutions['video-send'].send.framesSent === 0
|
|
608
658
|
) {
|
|
609
659
|
LoggerProxy.logger.info(
|
|
610
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent
|
|
660
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
|
|
661
|
+
this.statsResults.resolutions['video-send'].send.framesSent
|
|
611
662
|
);
|
|
612
663
|
}
|
|
613
664
|
}
|
|
@@ -643,24 +694,28 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
643
694
|
|
|
644
695
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
645
696
|
LoggerProxy.logger.info(
|
|
646
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received
|
|
697
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,
|
|
698
|
+
currentPacketsReceived
|
|
647
699
|
);
|
|
648
700
|
} else {
|
|
649
701
|
if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
|
|
650
702
|
LoggerProxy.logger.info(
|
|
651
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video frames received
|
|
703
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,
|
|
704
|
+
currentFramesReceived
|
|
652
705
|
);
|
|
653
706
|
}
|
|
654
707
|
|
|
655
708
|
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
656
709
|
LoggerProxy.logger.info(
|
|
657
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded
|
|
710
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,
|
|
711
|
+
currentFramesDecoded
|
|
658
712
|
);
|
|
659
713
|
}
|
|
660
714
|
|
|
661
715
|
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
662
716
|
LoggerProxy.logger.info(
|
|
663
|
-
`StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped
|
|
717
|
+
`StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,
|
|
718
|
+
currentFramesDropped - previousFramesDropped
|
|
664
719
|
);
|
|
665
720
|
}
|
|
666
721
|
}
|
|
@@ -679,7 +734,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
679
734
|
currentStats.totalPacketsSent === 0
|
|
680
735
|
) {
|
|
681
736
|
LoggerProxy.logger.info(
|
|
682
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent
|
|
737
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,
|
|
738
|
+
currentStats.totalPacketsSent
|
|
683
739
|
);
|
|
684
740
|
} else {
|
|
685
741
|
if (
|
|
@@ -687,7 +743,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
687
743
|
currentStats.framesEncoded === 0
|
|
688
744
|
) {
|
|
689
745
|
LoggerProxy.logger.info(
|
|
690
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded
|
|
746
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,
|
|
747
|
+
currentStats.framesEncoded
|
|
691
748
|
);
|
|
692
749
|
}
|
|
693
750
|
|
|
@@ -697,7 +754,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
697
754
|
this.statsResults.resolutions['video-share-send'].send.framesSent === 0
|
|
698
755
|
) {
|
|
699
756
|
LoggerProxy.logger.info(
|
|
700
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames sent
|
|
757
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
|
|
758
|
+
this.statsResults.resolutions['video-share-send'].send.framesSent
|
|
701
759
|
);
|
|
702
760
|
}
|
|
703
761
|
}
|
|
@@ -735,24 +793,28 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
735
793
|
|
|
736
794
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
737
795
|
LoggerProxy.logger.info(
|
|
738
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received
|
|
796
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,
|
|
797
|
+
currentPacketsReceived
|
|
739
798
|
);
|
|
740
799
|
} else {
|
|
741
800
|
if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
|
|
742
801
|
LoggerProxy.logger.info(
|
|
743
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames received
|
|
802
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,
|
|
803
|
+
currentFramesReceived
|
|
744
804
|
);
|
|
745
805
|
}
|
|
746
806
|
|
|
747
807
|
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
748
808
|
LoggerProxy.logger.info(
|
|
749
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded
|
|
809
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,
|
|
810
|
+
currentFramesDecoded
|
|
750
811
|
);
|
|
751
812
|
}
|
|
752
813
|
|
|
753
814
|
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
754
815
|
LoggerProxy.logger.info(
|
|
755
|
-
`StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped
|
|
816
|
+
`StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,
|
|
817
|
+
currentFramesDropped - previousFramesDropped
|
|
756
818
|
);
|
|
757
819
|
}
|
|
758
820
|
}
|
|
@@ -853,6 +915,14 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
853
915
|
if (result.bytesSent) {
|
|
854
916
|
let kilobytes = 0;
|
|
855
917
|
|
|
918
|
+
if (result.frameWidth && result.frameHeight) {
|
|
919
|
+
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
920
|
+
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
921
|
+
this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
922
|
+
this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =
|
|
923
|
+
result.hugeFramesSent;
|
|
924
|
+
}
|
|
925
|
+
|
|
856
926
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
|
|
857
927
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
|
|
858
928
|
}
|
|
@@ -925,6 +995,17 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
925
995
|
|
|
926
996
|
if (result.bytesReceived) {
|
|
927
997
|
let kilobytes = 0;
|
|
998
|
+
const receiveSlot = this.receiveSlotCallback(result.ssrc);
|
|
999
|
+
const idAndCsi = receiveSlot
|
|
1000
|
+
? `id: "${receiveSlot.id || ''}"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`
|
|
1001
|
+
: '';
|
|
1002
|
+
|
|
1003
|
+
if (result.frameWidth && result.frameHeight) {
|
|
1004
|
+
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
1005
|
+
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
1006
|
+
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =
|
|
1007
|
+
result.framesReceived;
|
|
1008
|
+
}
|
|
928
1009
|
|
|
929
1010
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
|
|
930
1011
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
|
|
@@ -974,10 +1055,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
974
1055
|
result.packetsReceived;
|
|
975
1056
|
|
|
976
1057
|
if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
1058
|
+
if (receiveSlot) {
|
|
1059
|
+
LoggerProxy.logger.info(
|
|
1060
|
+
`StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
|
|
1061
|
+
this.statsResults[mediaType][sendrecvType].packetsReceived
|
|
1062
|
+
);
|
|
1063
|
+
}
|
|
981
1064
|
}
|
|
982
1065
|
|
|
983
1066
|
// Check the over all packet Lost ratio
|
|
@@ -989,7 +1072,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
989
1072
|
: 0;
|
|
990
1073
|
if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
|
|
991
1074
|
LoggerProxy.logger.info(
|
|
992
|
-
|
|
1075
|
+
`StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,
|
|
993
1076
|
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
|
|
994
1077
|
);
|
|
995
1078
|
}
|
|
@@ -1049,73 +1132,40 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1049
1132
|
if (!result || !result.id) {
|
|
1050
1133
|
return;
|
|
1051
1134
|
}
|
|
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
1135
|
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
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());
|
|
1136
|
+
// We only care about the successful local candidate
|
|
1137
|
+
if (this.successfulCandidatePair?.localCandidateId !== result.id) {
|
|
1138
|
+
return;
|
|
1086
1139
|
}
|
|
1087
1140
|
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
) {
|
|
1092
|
-
|
|
1141
|
+
let transport;
|
|
1142
|
+
if (result.relayProtocol) {
|
|
1143
|
+
transport = result.relayProtocol.toUpperCase();
|
|
1144
|
+
} else if (result.protocol) {
|
|
1145
|
+
transport = result.protocol.toUpperCase();
|
|
1093
1146
|
}
|
|
1094
1147
|
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
}
|
|
1148
|
+
const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
|
|
1149
|
+
const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
|
|
1098
1150
|
|
|
1099
1151
|
this.statsResults.internal.candidates[result.id] = {
|
|
1100
|
-
candidateType:
|
|
1101
|
-
ipAddress:
|
|
1152
|
+
candidateType: result.candidateType,
|
|
1153
|
+
ipAddress: result.ip, // TODO: add ports
|
|
1102
1154
|
portNumber: result.port,
|
|
1103
|
-
networkType:
|
|
1155
|
+
networkType: result.networkType,
|
|
1104
1156
|
priority: result.priority,
|
|
1105
|
-
transport
|
|
1157
|
+
transport,
|
|
1106
1158
|
timestamp: result.time,
|
|
1107
1159
|
id: result.id,
|
|
1108
1160
|
type: result.type,
|
|
1109
1161
|
};
|
|
1110
1162
|
|
|
1111
|
-
this.statsResults.connectionType[ipType].candidateType =
|
|
1112
|
-
this.statsResults.connectionType[ipType].ipAddress =
|
|
1163
|
+
this.statsResults.connectionType[ipType].candidateType = result.candidateType;
|
|
1164
|
+
this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
|
|
1113
1165
|
|
|
1114
1166
|
this.statsResults.connectionType[ipType].networkType =
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
: RemoteNetworkType[result.id][0];
|
|
1118
|
-
this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
|
|
1167
|
+
result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
|
|
1168
|
+
this.statsResults.connectionType[ipType].transport = transport;
|
|
1119
1169
|
|
|
1120
1170
|
this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
|
|
1121
1171
|
};
|
|
@@ -1137,13 +1187,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1137
1187
|
const sendrecvType =
|
|
1138
1188
|
result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
|
|
1139
1189
|
|
|
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
1190
|
if (sendrecvType === STATS.RECEIVE_DIRECTION) {
|
|
1148
1191
|
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
1149
1192
|
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
|
|
@@ -134,9 +134,12 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
134
134
|
const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
|
|
135
135
|
const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
|
|
136
136
|
const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;
|
|
137
|
-
const lastFramesReceived =
|
|
138
|
-
|
|
139
|
-
const
|
|
137
|
+
const lastFramesReceived =
|
|
138
|
+
lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesReceived || 0;
|
|
139
|
+
const lastFramesDecoded =
|
|
140
|
+
lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesDecoded || 0;
|
|
141
|
+
const lastFramesDropped =
|
|
142
|
+
lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesDropped || 0;
|
|
140
143
|
const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;
|
|
141
144
|
const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;
|
|
142
145
|
|
|
@@ -146,7 +149,8 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
146
149
|
}
|
|
147
150
|
|
|
148
151
|
videoReceiver.common.common.direction = statsResults[mediaType].direction;
|
|
149
|
-
videoReceiver.common.transportType = statsResults.connectionType.
|
|
152
|
+
videoReceiver.common.transportType = statsResults.connectionType.local.transport;
|
|
153
|
+
|
|
150
154
|
// collect the packets received for the last min
|
|
151
155
|
videoReceiver.common.rtpPackets =
|
|
152
156
|
statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
|
|
@@ -189,22 +193,21 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
189
193
|
const totalFrameDecodedInaMin =
|
|
190
194
|
statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
|
|
191
195
|
|
|
192
|
-
videoReceiver.streams[0].common.receivedFrameRate =
|
|
193
|
-
?
|
|
194
|
-
|
|
195
|
-
videoReceiver.streams[0].common.renderedFrameRate =
|
|
196
|
-
?
|
|
197
|
-
|
|
196
|
+
videoReceiver.streams[0].common.receivedFrameRate = Math.round(
|
|
197
|
+
totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0
|
|
198
|
+
);
|
|
199
|
+
videoReceiver.streams[0].common.renderedFrameRate = Math.round(
|
|
200
|
+
totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0
|
|
201
|
+
);
|
|
198
202
|
|
|
199
203
|
videoReceiver.streams[0].common.framesDropped =
|
|
200
204
|
statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
|
|
201
205
|
videoReceiver.streams[0].receivedHeight =
|
|
202
|
-
statsResults.resolutions[mediaType][sendrecvType].height;
|
|
203
|
-
videoReceiver.streams[0].receivedWidth =
|
|
206
|
+
statsResults.resolutions[mediaType][sendrecvType].height || 0;
|
|
207
|
+
videoReceiver.streams[0].receivedWidth =
|
|
208
|
+
statsResults.resolutions[mediaType][sendrecvType].width || 0;
|
|
204
209
|
videoReceiver.streams[0].receivedFrameSize =
|
|
205
|
-
(
|
|
206
|
-
statsResults.resolutions[mediaType][sendrecvType].height) /
|
|
207
|
-
256;
|
|
210
|
+
(videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
|
|
208
211
|
|
|
209
212
|
videoReceiver.streams[0].receivedKeyFrames =
|
|
210
213
|
statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
|
|
@@ -220,16 +223,16 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
|
|
|
220
223
|
lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;
|
|
221
224
|
const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
|
|
222
225
|
const lastKeyFramesEncoded =
|
|
223
|
-
lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
|
|
226
|
+
lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
|
|
224
227
|
const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
|
|
225
|
-
const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;
|
|
228
|
+
const lastFramesSent = lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesSent || 0;
|
|
226
229
|
const {csi} = statsResults[mediaType];
|
|
227
230
|
if (csi && !videoSender.streams[0].common.csi.includes(csi)) {
|
|
228
231
|
videoSender.streams[0].common.csi.push(csi);
|
|
229
232
|
}
|
|
230
233
|
|
|
231
234
|
videoSender.common.common.direction = statsResults[mediaType].direction;
|
|
232
|
-
videoSender.common.transportType = statsResults.connectionType.local.transport
|
|
235
|
+
videoSender.common.transportType = statsResults.connectionType.local.transport;
|
|
233
236
|
|
|
234
237
|
// @ts-ignore
|
|
235
238
|
videoSender.common.maxRemoteJitter =
|
|
@@ -280,14 +283,13 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
|
|
|
280
283
|
const totalFrameSentInaMin =
|
|
281
284
|
statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
|
|
282
285
|
|
|
283
|
-
videoSender.streams[0].common.transmittedFrameRate =
|
|
284
|
-
?
|
|
285
|
-
|
|
286
|
+
videoSender.streams[0].common.transmittedFrameRate = Math.round(
|
|
287
|
+
totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0
|
|
288
|
+
);
|
|
286
289
|
videoSender.streams[0].transmittedHeight =
|
|
287
|
-
statsResults.resolutions[mediaType][sendrecvType].height;
|
|
288
|
-
videoSender.streams[0].transmittedWidth =
|
|
290
|
+
statsResults.resolutions[mediaType][sendrecvType].height || 0;
|
|
291
|
+
videoSender.streams[0].transmittedWidth =
|
|
292
|
+
statsResults.resolutions[mediaType][sendrecvType].width || 0;
|
|
289
293
|
videoSender.streams[0].transmittedFrameSize =
|
|
290
|
-
(
|
|
291
|
-
statsResults.resolutions[mediaType][sendrecvType].width) /
|
|
292
|
-
254;
|
|
294
|
+
(videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
|
|
293
295
|
};
|
|
@@ -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;
|