@webex/plugin-meetings 3.0.0-beta.28 → 3.0.0-beta.280
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 +114 -14
- 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 +763 -31
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- 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/webex-errors.js +28 -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/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +203 -28
- 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 +58 -116
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +72 -123
- 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 +3123 -2814
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +230 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +256 -196
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +601 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +73 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +192 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +394 -94
- 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 +71 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +49 -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 +121 -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 +86 -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 +316 -233
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +12 -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 +40 -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 +199 -154
- 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 +23 -29
- 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 +96 -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 +67 -73
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +11 -10
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/webex-errors.d.ts +13 -1
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +1 -6
- package/dist/types/constants.d.ts +161 -21
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -4
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +67 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -48
- package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
- package/dist/types/meeting/index.d.ts +345 -507
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +99 -23
- package/dist/types/meeting/request.d.ts +72 -43
- package/dist/types/meeting/util.d.ts +101 -1
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +8 -0
- package/dist/types/meetings/index.d.ts +88 -12
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +13 -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 +24 -0
- package/dist/types/members/util.d.ts +209 -1
- package/dist/types/metrics/constants.d.ts +11 -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/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +18 -1
- 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 +6 -1
- 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 +44 -14
- package/src/breakouts/breakout.ts +87 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +646 -18
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/webex-errors.ts +27 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -9
- package/src/constants.ts +184 -18
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +40 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +413 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +100 -122
- package/src/media/properties.ts +85 -108
- package/src/meeting/in-meeting-actions.ts +163 -3
- package/src/meeting/index.ts +2541 -2309
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +229 -131
- package/src/meeting/request.ts +172 -121
- package/src/meeting/util.ts +588 -394
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +170 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +428 -108
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +79 -4
- package/src/member/index.ts +49 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +127 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +106 -7
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/constants.ts +11 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +47 -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 +81 -54
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +23 -30
- package/src/roap/request.ts +100 -104
- package/src/roap/turnDiscovery.ts +51 -25
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/index.ts +88 -88
- package/src/statsAnalyzer/mqaUtil.ts +13 -14
- 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 +142 -24
- 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 +1488 -67
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- 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/meeting/in-meeting-actions.ts +81 -3
- package/test/unit/spec/meeting/index.js +4515 -1932
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +408 -208
- package/test/unit/spec/meeting/request.js +440 -45
- package/test/unit/spec/meeting/utils.js +679 -64
- package/test/unit/spec/meeting-info/index.js +295 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +521 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +1007 -177
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +58 -4
- package/test/unit/spec/member/util.js +479 -35
- package/test/unit/spec/members/index.js +319 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -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 +43 -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 +84 -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 +31 -51
- package/test/unit/spec/roap/request.ts +203 -85
- package/test/unit/spec/roap/turnDiscovery.ts +48 -13
- package/test/unit/spec/rtcMetrics/index.ts +68 -0
- package/test/unit/spec/stats-analyzer/index.js +64 -2
- 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,20 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
74
77
|
statsInterval: NodeJS.Timeout;
|
|
75
78
|
statsResults: any;
|
|
76
79
|
statsStarted: any;
|
|
80
|
+
receiveSlotCallback: ReceiveSlotCallback;
|
|
77
81
|
|
|
78
82
|
/**
|
|
79
83
|
* Creates a new instance of StatsAnalyzer
|
|
80
84
|
* @constructor
|
|
81
85
|
* @public
|
|
82
86
|
* @param {Object} config SDK Configuration Object
|
|
87
|
+
* @param {Function} receiveSlotCallback Callback used to access receive slots.
|
|
83
88
|
* @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
|
|
84
89
|
* @param {Object} statsResults Default properties for stats
|
|
85
90
|
*/
|
|
86
91
|
constructor(
|
|
87
92
|
config: any,
|
|
93
|
+
receiveSlotCallback: ReceiveSlotCallback = () => undefined,
|
|
88
94
|
networkQualityMonitor: object = {},
|
|
89
95
|
statsResults: object = defaultStats
|
|
90
96
|
) {
|
|
@@ -98,6 +104,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
98
104
|
this.mqaSentCount = -1;
|
|
99
105
|
this.lastMqaDataSent = {};
|
|
100
106
|
this.lastEmittedStartStopEvent = {};
|
|
107
|
+
this.receiveSlotCallback = receiveSlotCallback;
|
|
101
108
|
}
|
|
102
109
|
|
|
103
110
|
/**
|
|
@@ -186,7 +193,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
186
193
|
}
|
|
187
194
|
});
|
|
188
195
|
|
|
189
|
-
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress
|
|
196
|
+
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
|
|
190
197
|
|
|
191
198
|
// Adding peripheral information
|
|
192
199
|
newMqa.intervalMetadata.peripherals = [];
|
|
@@ -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
|
}
|
|
@@ -492,23 +498,23 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
492
498
|
const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>
|
|
493
499
|
Object.keys(this.statsResults)
|
|
494
500
|
.filter((key) => key.startsWith(keyPrefix))
|
|
495
|
-
.reduce((prev, cur) => prev + (this.statsResults[cur]
|
|
501
|
+
.reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);
|
|
496
502
|
|
|
497
503
|
const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>
|
|
498
504
|
Object.keys(this.statsResults)
|
|
499
505
|
.filter((key) => key.startsWith(keyPrefix))
|
|
500
|
-
.reduce((prev, cur) => prev + (this.lastStatsResults[cur]
|
|
506
|
+
.reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
|
|
501
507
|
|
|
502
508
|
const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
503
509
|
Object.keys(this.statsResults)
|
|
504
510
|
.filter((key) => key.startsWith(keyPrefix))
|
|
505
|
-
.reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]
|
|
511
|
+
.reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
|
|
506
512
|
|
|
507
513
|
const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
508
514
|
Object.keys(this.statsResults)
|
|
509
515
|
.filter((key) => key.startsWith(keyPrefix))
|
|
510
516
|
.reduce(
|
|
511
|
-
(prev, cur) => prev + (this.lastStatsResults.resolutions[cur]
|
|
517
|
+
(prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
|
|
512
518
|
0
|
|
513
519
|
);
|
|
514
520
|
|
|
@@ -523,7 +529,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
523
529
|
currentStats.totalPacketsSent === 0
|
|
524
530
|
) {
|
|
525
531
|
LoggerProxy.logger.info(
|
|
526
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent
|
|
532
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,
|
|
533
|
+
currentStats.totalPacketsSent
|
|
527
534
|
);
|
|
528
535
|
} else {
|
|
529
536
|
if (
|
|
@@ -531,7 +538,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
531
538
|
currentStats.totalAudioEnergy === 0
|
|
532
539
|
) {
|
|
533
540
|
LoggerProxy.logger.info(
|
|
534
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present
|
|
541
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,
|
|
542
|
+
currentStats.totalAudioEnergy
|
|
535
543
|
);
|
|
536
544
|
}
|
|
537
545
|
|
|
@@ -565,14 +573,16 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
565
573
|
|
|
566
574
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
567
575
|
LoggerProxy.logger.info(
|
|
568
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received
|
|
576
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,
|
|
577
|
+
currentPacketsReceived
|
|
569
578
|
);
|
|
570
579
|
} else if (
|
|
571
580
|
currentSamplesReceived === previousSamplesReceived ||
|
|
572
581
|
currentSamplesReceived === 0
|
|
573
582
|
) {
|
|
574
583
|
LoggerProxy.logger.info(
|
|
575
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No audio samples received
|
|
584
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,
|
|
585
|
+
currentSamplesReceived
|
|
576
586
|
);
|
|
577
587
|
}
|
|
578
588
|
|
|
@@ -589,7 +599,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
589
599
|
currentStats.totalPacketsSent === 0
|
|
590
600
|
) {
|
|
591
601
|
LoggerProxy.logger.info(
|
|
592
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent
|
|
602
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,
|
|
603
|
+
currentStats.totalPacketsSent
|
|
593
604
|
);
|
|
594
605
|
} else {
|
|
595
606
|
if (
|
|
@@ -597,7 +608,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
597
608
|
currentStats.framesEncoded === 0
|
|
598
609
|
) {
|
|
599
610
|
LoggerProxy.logger.info(
|
|
600
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded
|
|
611
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,
|
|
612
|
+
currentStats.framesEncoded
|
|
601
613
|
);
|
|
602
614
|
}
|
|
603
615
|
|
|
@@ -607,7 +619,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
607
619
|
this.statsResults.resolutions['video-send'].send.framesSent === 0
|
|
608
620
|
) {
|
|
609
621
|
LoggerProxy.logger.info(
|
|
610
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent
|
|
622
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
|
|
623
|
+
this.statsResults.resolutions['video-send'].send.framesSent
|
|
611
624
|
);
|
|
612
625
|
}
|
|
613
626
|
}
|
|
@@ -643,24 +656,28 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
643
656
|
|
|
644
657
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
645
658
|
LoggerProxy.logger.info(
|
|
646
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received
|
|
659
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,
|
|
660
|
+
currentPacketsReceived
|
|
647
661
|
);
|
|
648
662
|
} else {
|
|
649
663
|
if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
|
|
650
664
|
LoggerProxy.logger.info(
|
|
651
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video frames received
|
|
665
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,
|
|
666
|
+
currentFramesReceived
|
|
652
667
|
);
|
|
653
668
|
}
|
|
654
669
|
|
|
655
670
|
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
656
671
|
LoggerProxy.logger.info(
|
|
657
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded
|
|
672
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,
|
|
673
|
+
currentFramesDecoded
|
|
658
674
|
);
|
|
659
675
|
}
|
|
660
676
|
|
|
661
677
|
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
662
678
|
LoggerProxy.logger.info(
|
|
663
|
-
`StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped
|
|
679
|
+
`StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,
|
|
680
|
+
currentFramesDropped - previousFramesDropped
|
|
664
681
|
);
|
|
665
682
|
}
|
|
666
683
|
}
|
|
@@ -679,7 +696,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
679
696
|
currentStats.totalPacketsSent === 0
|
|
680
697
|
) {
|
|
681
698
|
LoggerProxy.logger.info(
|
|
682
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent
|
|
699
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,
|
|
700
|
+
currentStats.totalPacketsSent
|
|
683
701
|
);
|
|
684
702
|
} else {
|
|
685
703
|
if (
|
|
@@ -687,7 +705,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
687
705
|
currentStats.framesEncoded === 0
|
|
688
706
|
) {
|
|
689
707
|
LoggerProxy.logger.info(
|
|
690
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded
|
|
708
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,
|
|
709
|
+
currentStats.framesEncoded
|
|
691
710
|
);
|
|
692
711
|
}
|
|
693
712
|
|
|
@@ -697,7 +716,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
697
716
|
this.statsResults.resolutions['video-share-send'].send.framesSent === 0
|
|
698
717
|
) {
|
|
699
718
|
LoggerProxy.logger.info(
|
|
700
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames sent
|
|
719
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
|
|
720
|
+
this.statsResults.resolutions['video-share-send'].send.framesSent
|
|
701
721
|
);
|
|
702
722
|
}
|
|
703
723
|
}
|
|
@@ -735,24 +755,28 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
735
755
|
|
|
736
756
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
737
757
|
LoggerProxy.logger.info(
|
|
738
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received
|
|
758
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,
|
|
759
|
+
currentPacketsReceived
|
|
739
760
|
);
|
|
740
761
|
} else {
|
|
741
762
|
if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
|
|
742
763
|
LoggerProxy.logger.info(
|
|
743
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames received
|
|
764
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,
|
|
765
|
+
currentFramesReceived
|
|
744
766
|
);
|
|
745
767
|
}
|
|
746
768
|
|
|
747
769
|
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
748
770
|
LoggerProxy.logger.info(
|
|
749
|
-
`StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded
|
|
771
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,
|
|
772
|
+
currentFramesDecoded
|
|
750
773
|
);
|
|
751
774
|
}
|
|
752
775
|
|
|
753
776
|
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
754
777
|
LoggerProxy.logger.info(
|
|
755
|
-
`StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped
|
|
778
|
+
`StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,
|
|
779
|
+
currentFramesDropped - previousFramesDropped
|
|
756
780
|
);
|
|
757
781
|
}
|
|
758
782
|
}
|
|
@@ -853,6 +877,14 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
853
877
|
if (result.bytesSent) {
|
|
854
878
|
let kilobytes = 0;
|
|
855
879
|
|
|
880
|
+
if (result.frameWidth && result.frameHeight) {
|
|
881
|
+
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
882
|
+
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
883
|
+
this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
884
|
+
this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =
|
|
885
|
+
result.hugeFramesSent;
|
|
886
|
+
}
|
|
887
|
+
|
|
856
888
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
|
|
857
889
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
|
|
858
890
|
}
|
|
@@ -925,6 +957,17 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
925
957
|
|
|
926
958
|
if (result.bytesReceived) {
|
|
927
959
|
let kilobytes = 0;
|
|
960
|
+
const receiveSlot = this.receiveSlotCallback(result.ssrc);
|
|
961
|
+
const idAndCsi = receiveSlot
|
|
962
|
+
? `id: "${receiveSlot.id || ''}"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`
|
|
963
|
+
: '';
|
|
964
|
+
|
|
965
|
+
if (result.frameWidth && result.frameHeight) {
|
|
966
|
+
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
967
|
+
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
968
|
+
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =
|
|
969
|
+
result.framesReceived;
|
|
970
|
+
}
|
|
928
971
|
|
|
929
972
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
|
|
930
973
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
|
|
@@ -974,10 +1017,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
974
1017
|
result.packetsReceived;
|
|
975
1018
|
|
|
976
1019
|
if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
1020
|
+
if (receiveSlot) {
|
|
1021
|
+
LoggerProxy.logger.info(
|
|
1022
|
+
`StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
|
|
1023
|
+
this.statsResults[mediaType][sendrecvType].packetsReceived
|
|
1024
|
+
);
|
|
1025
|
+
}
|
|
981
1026
|
}
|
|
982
1027
|
|
|
983
1028
|
// Check the over all packet Lost ratio
|
|
@@ -989,7 +1034,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
989
1034
|
: 0;
|
|
990
1035
|
if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
|
|
991
1036
|
LoggerProxy.logger.info(
|
|
992
|
-
|
|
1037
|
+
`StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,
|
|
993
1038
|
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
|
|
994
1039
|
);
|
|
995
1040
|
}
|
|
@@ -1049,73 +1094,35 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1049
1094
|
if (!result || !result.id) {
|
|
1050
1095
|
return;
|
|
1051
1096
|
}
|
|
1052
|
-
const RemoteCandidateType = {};
|
|
1053
|
-
const RemoteTransport = {};
|
|
1054
|
-
const RemoteIpAddress = {};
|
|
1055
|
-
const RemoteNetworkType = {};
|
|
1056
1097
|
|
|
1057
|
-
|
|
1098
|
+
let transport;
|
|
1099
|
+
if (result.relayProtocol) {
|
|
1100
|
+
transport = result.relayProtocol.toUpperCase();
|
|
1101
|
+
} else if (result.protocol) {
|
|
1102
|
+
transport = result.protocol.toUpperCase();
|
|
1103
|
+
}
|
|
1058
1104
|
|
|
1059
1105
|
const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
|
|
1060
1106
|
const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
|
|
1061
1107
|
|
|
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
|
-
|
|
1084
|
-
if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
|
|
1085
|
-
RemoteTransport[result.id].push(result.protocol.toUpperCase());
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
if (
|
|
1089
|
-
result.ip &&
|
|
1090
|
-
RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1
|
|
1091
|
-
) {
|
|
1092
|
-
RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
|
|
1096
|
-
RemoteNetworkType[result.id].push(result.networkType);
|
|
1097
|
-
}
|
|
1098
|
-
|
|
1099
1108
|
this.statsResults.internal.candidates[result.id] = {
|
|
1100
|
-
candidateType:
|
|
1101
|
-
ipAddress:
|
|
1109
|
+
candidateType: result.candidateType,
|
|
1110
|
+
ipAddress: result.ip, // TODO: add ports
|
|
1102
1111
|
portNumber: result.port,
|
|
1103
|
-
networkType:
|
|
1112
|
+
networkType: result.networkType,
|
|
1104
1113
|
priority: result.priority,
|
|
1105
|
-
transport
|
|
1114
|
+
transport,
|
|
1106
1115
|
timestamp: result.time,
|
|
1107
1116
|
id: result.id,
|
|
1108
1117
|
type: result.type,
|
|
1109
1118
|
};
|
|
1110
1119
|
|
|
1111
|
-
this.statsResults.connectionType[ipType].candidateType =
|
|
1112
|
-
this.statsResults.connectionType[ipType].ipAddress =
|
|
1120
|
+
this.statsResults.connectionType[ipType].candidateType = result.candidateType;
|
|
1121
|
+
this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
|
|
1113
1122
|
|
|
1114
1123
|
this.statsResults.connectionType[ipType].networkType =
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
: RemoteNetworkType[result.id][0];
|
|
1118
|
-
this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
|
|
1124
|
+
result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
|
|
1125
|
+
this.statsResults.connectionType[ipType].transport = transport;
|
|
1119
1126
|
|
|
1120
1127
|
this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
|
|
1121
1128
|
};
|
|
@@ -1137,13 +1144,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1137
1144
|
const sendrecvType =
|
|
1138
1145
|
result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
|
|
1139
1146
|
|
|
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
1147
|
if (sendrecvType === STATS.RECEIVE_DIRECTION) {
|
|
1148
1148
|
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
1149
1149
|
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
|
};
|
|
@@ -3,13 +3,30 @@ import 'jsdom-global/register';
|
|
|
3
3
|
import {assert} from '@webex/test-helper-chai';
|
|
4
4
|
import {skipInNode} from '@webex/test-helper-mocha';
|
|
5
5
|
import BrowserDetection from '@webex/plugin-meetings/dist/common/browser-detection';
|
|
6
|
+
import {createCameraStream, createMicrophoneStream} from '@webex/plugin-meetings';
|
|
6
7
|
|
|
7
8
|
import {MEDIA_SERVERS} from '../../utils/constants';
|
|
8
9
|
import testUtils from '../../utils/testUtils';
|
|
10
|
+
import integrationTestUtils from '../../utils/integrationTestUtils';
|
|
9
11
|
import webexTestUsers from '../../utils/webex-test-users';
|
|
10
12
|
|
|
11
13
|
config();
|
|
12
14
|
|
|
15
|
+
const localTracks = {
|
|
16
|
+
alice: {
|
|
17
|
+
microphone: undefined,
|
|
18
|
+
camera: undefined,
|
|
19
|
+
},
|
|
20
|
+
bob: {
|
|
21
|
+
microphone: undefined,
|
|
22
|
+
camera: undefined,
|
|
23
|
+
},
|
|
24
|
+
chris: {
|
|
25
|
+
microphone: undefined,
|
|
26
|
+
camera: undefined,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
13
30
|
skipInNode(describe)('plugin-meetings', () => {
|
|
14
31
|
const {isBrowser} = BrowserDetection();
|
|
15
32
|
|
|
@@ -135,6 +152,17 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
135
152
|
assert.exists(chris.meeting.joinedWith);
|
|
136
153
|
});
|
|
137
154
|
|
|
155
|
+
it('users "alice", "bob", and "chris" create local tracks', async () => {
|
|
156
|
+
localTracks.alice.microphone = await createMicrophoneStream();
|
|
157
|
+
localTracks.alice.camera = await createCameraStream();
|
|
158
|
+
|
|
159
|
+
localTracks.bob.microphone = await createMicrophoneStream();
|
|
160
|
+
localTracks.bob.camera = await createCameraStream();
|
|
161
|
+
|
|
162
|
+
localTracks.chris.microphone = await createMicrophoneStream();
|
|
163
|
+
localTracks.chris.camera = await createCameraStream();
|
|
164
|
+
});
|
|
165
|
+
|
|
138
166
|
it('users "alice", "bob", and "chris" add media', async () => {
|
|
139
167
|
mediaReadyListener = testUtils.waitForEvents([
|
|
140
168
|
{scope: alice.meeting, event: 'media:negotiated'},
|
|
@@ -142,9 +170,9 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
142
170
|
{scope: chris.meeting, event: 'media:negotiated'},
|
|
143
171
|
]);
|
|
144
172
|
|
|
145
|
-
const addMediaAlice =
|
|
146
|
-
const addMediaBob =
|
|
147
|
-
const addMediaChris =
|
|
173
|
+
const addMediaAlice = integrationTestUtils.addMedia(alice, {multistream: true, microphone: localTracks.alice.microphone, camera: localTracks.alice.camera});
|
|
174
|
+
const addMediaBob = integrationTestUtils.addMedia(bob, {multistream: true, microphone: localTracks.bob.microphone, camera: localTracks.bob.camera});
|
|
175
|
+
const addMediaChris = integrationTestUtils.addMedia(chris, {multistream: true, microphone: localTracks.chris.microphone, camera: localTracks.chris.camera});
|
|
148
176
|
|
|
149
177
|
await addMediaAlice;
|
|
150
178
|
await addMediaBob;
|
|
@@ -171,6 +199,35 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
171
199
|
assert.equal(bob.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
|
|
172
200
|
assert.equal(chris.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
|
|
173
201
|
});
|
|
202
|
+
|
|
203
|
+
it('users "alice", "bob", and "chris" stop their local tracks', () => {
|
|
204
|
+
if (localTracks.alice.microphone) {
|
|
205
|
+
localTracks.alice.microphone.stop();
|
|
206
|
+
localTracks.alice.microphone = undefined;
|
|
207
|
+
}
|
|
208
|
+
if (localTracks.alice.camera) {
|
|
209
|
+
localTracks.alice.camera.stop();
|
|
210
|
+
localTracks.alice.camera = undefined;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (localTracks.bob.microphone) {
|
|
214
|
+
localTracks.bob.microphone.stop();
|
|
215
|
+
localTracks.bob.microphone = undefined;
|
|
216
|
+
}
|
|
217
|
+
if (localTracks.bob.camera) {
|
|
218
|
+
localTracks.bob.camera.stop();
|
|
219
|
+
localTracks.bob.camera = undefined;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (localTracks.chris.microphone) {
|
|
223
|
+
localTracks.chris.microphone.stop();
|
|
224
|
+
localTracks.chris.microphone = undefined;
|
|
225
|
+
}
|
|
226
|
+
if (localTracks.chris.camera) {
|
|
227
|
+
localTracks.chris.camera.stop();
|
|
228
|
+
localTracks.chris.camera = undefined;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
174
231
|
});
|
|
175
232
|
}
|
|
176
233
|
});
|