@webex/plugin-meetings 2.60.0-next.1 → 2.60.0-next.11
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/dist/annotation/annotation.types.d.ts +42 -0
- package/dist/annotation/constants.d.ts +31 -0
- package/dist/annotation/index.d.ts +117 -0
- package/dist/breakouts/breakout.d.ts +8 -0
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/collection.d.ts +5 -0
- package/dist/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/breakouts/events.d.ts +8 -0
- package/dist/breakouts/index.d.ts +5 -0
- package/dist/breakouts/index.js +1 -1
- package/dist/breakouts/request.d.ts +22 -0
- package/dist/breakouts/utils.d.ts +15 -0
- package/dist/common/browser-detection.d.ts +9 -0
- package/dist/common/collection.d.ts +48 -0
- package/dist/common/config.d.ts +2 -0
- package/dist/common/errors/captcha-error.d.ts +15 -0
- package/dist/common/errors/intent-to-join.d.ts +16 -0
- package/dist/common/errors/join-meeting.d.ts +17 -0
- package/dist/common/errors/media.d.ts +15 -0
- package/dist/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/common/errors/parameter.d.ts +15 -0
- package/dist/common/errors/password-error.d.ts +15 -0
- package/dist/common/errors/permission.d.ts +14 -0
- package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/common/errors/reconnection.d.ts +15 -0
- package/dist/common/errors/stats.d.ts +15 -0
- package/dist/common/errors/webex-errors.d.ts +93 -0
- package/dist/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/common/events/events-scope.d.ts +17 -0
- package/dist/common/events/events.d.ts +12 -0
- package/dist/common/events/trigger-proxy.d.ts +2 -0
- package/dist/common/events/util.d.ts +2 -0
- package/dist/common/logs/logger-config.d.ts +2 -0
- package/dist/common/logs/logger-proxy.d.ts +2 -0
- package/dist/common/logs/request.d.ts +36 -0
- package/dist/common/queue.d.ts +34 -0
- package/dist/config.d.ts +71 -0
- package/dist/constants.d.ts +1072 -0
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.d.ts +4 -0
- package/dist/controls-options-manager/enums.d.ts +15 -0
- package/dist/controls-options-manager/enums.js +2 -1
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.d.ts +136 -0
- package/dist/controls-options-manager/types.d.ts +43 -0
- package/dist/controls-options-manager/util.d.ts +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/interpretation/collection.d.ts +5 -0
- package/dist/interpretation/index.d.ts +5 -0
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.d.ts +5 -0
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.d.ts +2 -0
- package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/locus-info/fullState.d.ts +2 -0
- package/dist/locus-info/hostUtils.d.ts +2 -0
- package/dist/locus-info/index.d.ts +322 -0
- package/dist/locus-info/infoUtils.d.ts +2 -0
- package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/locus-info/parser.d.ts +272 -0
- package/dist/locus-info/parser.js +5 -5
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.d.ts +2 -0
- package/dist/media/index.d.ts +34 -0
- package/dist/media/index.js +6 -5
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +93 -0
- package/dist/media/util.d.ts +2 -0
- package/dist/mediaQualityMetrics/config.d.ts +237 -0
- package/dist/mediaQualityMetrics/config.js +1 -202
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.d.ts +167 -0
- package/dist/meeting/in-meeting-actions.js +4 -0
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +1719 -0
- package/dist/meeting/index.js +288 -155
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/meeting/muteState.d.ts +184 -0
- package/dist/meeting/request.d.ts +290 -0
- package/dist/meeting/request.type.d.ts +11 -0
- package/dist/meeting/state.d.ts +9 -0
- package/dist/meeting/util.d.ts +103 -0
- package/dist/meeting-info/collection.d.ts +20 -0
- package/dist/meeting-info/index.d.ts +69 -0
- package/dist/meeting-info/meeting-info-v2.d.ts +123 -0
- package/dist/meeting-info/meeting-info-v2.js +3 -0
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.d.ts +22 -0
- package/dist/meeting-info/util.d.ts +2 -0
- package/dist/meeting-info/utilv2.d.ts +2 -0
- package/dist/meeting-info/utilv2.js +14 -29
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.d.ts +40 -0
- package/dist/meetings/collection.js +17 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +378 -0
- package/dist/meetings/index.js +30 -9
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.d.ts +4 -0
- package/dist/meetings/request.d.ts +27 -0
- package/dist/meetings/util.d.ts +18 -0
- package/dist/member/index.d.ts +160 -0
- package/dist/member/member.types.d.ts +11 -0
- package/dist/member/types.d.ts +32 -0
- package/dist/member/util.d.ts +2 -0
- package/dist/members/collection.d.ts +29 -0
- package/dist/members/index.d.ts +353 -0
- package/dist/members/request.d.ts +114 -0
- package/dist/members/types.d.ts +25 -0
- package/dist/members/util.d.ts +215 -0
- package/dist/metrics/constants.d.ts +68 -0
- package/dist/metrics/constants.js +3 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +45 -0
- package/dist/multistream/mediaRequestManager.d.ts +118 -0
- package/dist/multistream/receiveSlot.d.ts +68 -0
- package/dist/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/multistream/remoteMedia.d.ts +72 -0
- package/dist/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/multistream/remoteMediaManager.d.ts +285 -0
- package/dist/multistream/sendSlotManager.d.ts +61 -0
- package/dist/networkQualityMonitor/index.d.ts +70 -0
- package/dist/personal-meeting-room/index.d.ts +47 -0
- package/dist/personal-meeting-room/request.d.ts +14 -0
- package/dist/personal-meeting-room/util.d.ts +2 -0
- package/dist/reachability/index.d.ts +194 -0
- package/dist/reachability/request.d.ts +39 -0
- package/dist/reactions/constants.d.ts +3 -0
- package/dist/reactions/reactions.d.ts +4 -0
- package/dist/reactions/reactions.type.d.ts +52 -0
- package/dist/reconnection-manager/index.d.ts +136 -0
- package/dist/reconnection-manager/index.js +27 -28
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.d.ts +7 -0
- package/dist/recording-controller/index.d.ts +207 -0
- package/dist/recording-controller/util.d.ts +14 -0
- package/dist/roap/index.d.ts +78 -0
- package/dist/roap/request.d.ts +41 -0
- package/dist/roap/turnDiscovery.d.ts +92 -0
- package/dist/rtcMetrics/constants.d.ts +4 -0
- package/dist/rtcMetrics/index.d.ts +54 -0
- package/dist/rtcMetrics/index.js +25 -0
- package/dist/rtcMetrics/index.js.map +1 -1
- package/dist/statsAnalyzer/global.d.ts +36 -0
- package/dist/statsAnalyzer/index.d.ts +191 -0
- package/dist/statsAnalyzer/index.js +53 -146
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/statsAnalyzer/mqaUtil.js +11 -12
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.d.ts +64 -0
- package/dist/webinar/collection.d.ts +16 -0
- package/dist/webinar/index.d.ts +5 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +26 -27
- package/src/constants.ts +10 -4
- package/src/controls-options-manager/enums.ts +2 -0
- package/src/locus-info/parser.ts +6 -6
- package/src/media/index.ts +5 -5
- package/src/mediaQualityMetrics/config.ts +0 -135
- package/src/meeting/in-meeting-actions.ts +8 -0
- package/src/meeting/index.ts +263 -125
- package/src/meeting-info/meeting-info-v2.ts +4 -0
- package/src/meeting-info/utilv2.ts +6 -19
- package/src/meetings/collection.ts +13 -0
- package/src/meetings/index.ts +28 -10
- package/src/metrics/constants.ts +3 -0
- package/src/reconnection-manager/index.ts +63 -68
- package/src/rtcMetrics/index.ts +24 -0
- package/src/statsAnalyzer/index.ts +68 -216
- package/src/statsAnalyzer/mqaUtil.ts +17 -22
- package/test/unit/spec/media/index.ts +20 -4
- package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
- package/test/unit/spec/meeting/index.js +1376 -189
- package/test/unit/spec/meeting/muteState.js +2 -1
- package/test/unit/spec/meeting-info/meetinginfov2.js +28 -0
- package/test/unit/spec/meetings/collection.js +12 -0
- package/test/unit/spec/meetings/index.js +382 -118
- package/test/unit/spec/member/util.js +0 -31
- package/test/unit/spec/reconnection-manager/index.js +42 -12
- package/test/unit/spec/rtcMetrics/index.ts +20 -0
- package/test/unit/spec/stats-analyzer/index.js +12 -2
|
@@ -152,6 +152,18 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
152
152
|
const newMqa = cloneDeep(emptyMqaInterval);
|
|
153
153
|
|
|
154
154
|
Object.keys(this.statsResults).forEach((mediaType) => {
|
|
155
|
+
if (!this.lastMqaDataSent[mediaType]) {
|
|
156
|
+
this.lastMqaDataSent[mediaType] = {};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
|
|
160
|
+
this.lastMqaDataSent[mediaType].send = {};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
|
|
164
|
+
this.lastMqaDataSent[mediaType].recv = {};
|
|
165
|
+
}
|
|
166
|
+
|
|
155
167
|
if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
|
|
156
168
|
const audioSender = cloneDeep(emptyAudioTransmit);
|
|
157
169
|
|
|
@@ -162,6 +174,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
162
174
|
mediaType,
|
|
163
175
|
});
|
|
164
176
|
newMqa.audioTransmit.push(audioSender);
|
|
177
|
+
|
|
178
|
+
this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
|
|
165
179
|
} else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
|
|
166
180
|
const audioReceiver = cloneDeep(emptyAudioReceive);
|
|
167
181
|
|
|
@@ -172,6 +186,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
172
186
|
mediaType,
|
|
173
187
|
});
|
|
174
188
|
newMqa.audioReceive.push(audioReceiver);
|
|
189
|
+
|
|
190
|
+
this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
|
|
175
191
|
} else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
|
|
176
192
|
const videoSender = cloneDeep(emptyVideoTransmit);
|
|
177
193
|
|
|
@@ -182,6 +198,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
182
198
|
mediaType,
|
|
183
199
|
});
|
|
184
200
|
newMqa.videoTransmit.push(videoSender);
|
|
201
|
+
|
|
202
|
+
this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
|
|
185
203
|
} else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
|
|
186
204
|
const videoReceiver = cloneDeep(emptyVideoReceive);
|
|
187
205
|
|
|
@@ -192,6 +210,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
192
210
|
mediaType,
|
|
193
211
|
});
|
|
194
212
|
newMqa.videoReceive.push(videoReceiver);
|
|
213
|
+
|
|
214
|
+
this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
|
|
195
215
|
}
|
|
196
216
|
});
|
|
197
217
|
|
|
@@ -330,26 +350,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
330
350
|
this.statsResults[type].recv = cloneDeep(emptyReceiver);
|
|
331
351
|
}
|
|
332
352
|
|
|
333
|
-
if (!this.statsResults.resolutions[type]) {
|
|
334
|
-
this.statsResults.resolutions[type] = {};
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
if (isSender && !this.statsResults.resolutions[type].send) {
|
|
338
|
-
this.statsResults.resolutions[type].send = cloneDeep(emptySender);
|
|
339
|
-
} else if (!isSender && !this.statsResults.resolutions[type].recv) {
|
|
340
|
-
this.statsResults.resolutions[type].recv = cloneDeep(emptyReceiver);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
if (!this.statsResults.internal[type]) {
|
|
344
|
-
this.statsResults.internal[type] = {};
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
if (isSender && !this.statsResults.internal[type].send) {
|
|
348
|
-
this.statsResults.internal[type].send = cloneDeep(emptySender);
|
|
349
|
-
} else if (!isSender && !this.statsResults.internal[type].recv) {
|
|
350
|
-
this.statsResults.internal[type].recv = cloneDeep(emptyReceiver);
|
|
351
|
-
}
|
|
352
|
-
|
|
353
353
|
switch (getStatsResult.type) {
|
|
354
354
|
case 'outbound-rtp':
|
|
355
355
|
this.processOutboundRTPResult(getStatsResult, type);
|
|
@@ -357,13 +357,9 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
357
357
|
case 'inbound-rtp':
|
|
358
358
|
this.processInboundRTPResult(getStatsResult, type);
|
|
359
359
|
break;
|
|
360
|
-
case 'track':
|
|
361
|
-
this.processTrackResult(getStatsResult, type);
|
|
362
|
-
break;
|
|
363
360
|
case 'remote-inbound-rtp':
|
|
364
361
|
case 'remote-outbound-rtp':
|
|
365
|
-
|
|
366
|
-
this.compareSentAndReceived(getStatsResult, type, isSender);
|
|
362
|
+
this.compareSentAndReceived(getStatsResult, type);
|
|
367
363
|
break;
|
|
368
364
|
case 'remotecandidate':
|
|
369
365
|
case 'remote-candidate':
|
|
@@ -514,19 +510,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
514
510
|
.filter((key) => key.startsWith(keyPrefix))
|
|
515
511
|
.reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
|
|
516
512
|
|
|
517
|
-
const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
518
|
-
Object.keys(this.statsResults)
|
|
519
|
-
.filter((key) => key.startsWith(keyPrefix))
|
|
520
|
-
.reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
|
|
521
|
-
|
|
522
|
-
const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
|
|
523
|
-
Object.keys(this.statsResults)
|
|
524
|
-
.filter((key) => key.startsWith(keyPrefix))
|
|
525
|
-
.reduce(
|
|
526
|
-
(prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
|
|
527
|
-
0
|
|
528
|
-
);
|
|
529
|
-
|
|
530
513
|
if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {
|
|
531
514
|
// compare audio stats sent
|
|
532
515
|
// NOTE: relies on there being only one sender.
|
|
@@ -623,13 +606,13 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
623
606
|
}
|
|
624
607
|
|
|
625
608
|
if (
|
|
626
|
-
this.statsResults
|
|
627
|
-
this.lastStatsResults
|
|
628
|
-
this.statsResults
|
|
609
|
+
this.statsResults['video-send'].send.framesSent ===
|
|
610
|
+
this.lastStatsResults['video-send'].send.framesSent ||
|
|
611
|
+
this.statsResults['video-send'].send.framesSent === 0
|
|
629
612
|
) {
|
|
630
613
|
LoggerProxy.logger.info(
|
|
631
614
|
`StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
|
|
632
|
-
this.statsResults
|
|
615
|
+
this.statsResults['video-send'].send.framesSent
|
|
633
616
|
);
|
|
634
617
|
}
|
|
635
618
|
}
|
|
@@ -644,24 +627,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
644
627
|
'video-recv',
|
|
645
628
|
'totalPacketsReceived'
|
|
646
629
|
);
|
|
647
|
-
const currentFramesReceived =
|
|
648
|
-
|
|
649
|
-
'framesReceived'
|
|
650
|
-
);
|
|
651
|
-
const previousFramesReceived = getPreviousResolutionsStatsTotals(
|
|
652
|
-
'video-recv',
|
|
653
|
-
'framesReceived'
|
|
654
|
-
);
|
|
630
|
+
const currentFramesReceived = getCurrentStatsTotals('video-recv', 'framesReceived');
|
|
631
|
+
const previousFramesReceived = getPreviousStatsTotals('video-recv', 'framesReceived');
|
|
655
632
|
const currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
|
|
656
633
|
const previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
|
|
657
|
-
const currentFramesDropped =
|
|
658
|
-
|
|
659
|
-
'framesDropped'
|
|
660
|
-
);
|
|
661
|
-
const previousFramesDropped = getPreviousResolutionsStatsTotals(
|
|
662
|
-
'video-recv',
|
|
663
|
-
'framesDropped'
|
|
664
|
-
);
|
|
634
|
+
const currentFramesDropped = getCurrentStatsTotals('video-recv', 'framesDropped');
|
|
635
|
+
const previousFramesDropped = getPreviousStatsTotals('video-recv', 'framesDropped');
|
|
665
636
|
|
|
666
637
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
667
638
|
LoggerProxy.logger.info(
|
|
@@ -720,13 +691,13 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
720
691
|
}
|
|
721
692
|
|
|
722
693
|
if (
|
|
723
|
-
this.statsResults
|
|
724
|
-
this.lastStatsResults
|
|
725
|
-
this.statsResults
|
|
694
|
+
this.statsResults['video-share-send'].send.framesSent ===
|
|
695
|
+
this.lastStatsResults['video-share-send'].send.framesSent ||
|
|
696
|
+
this.statsResults['video-share-send'].send.framesSent === 0
|
|
726
697
|
) {
|
|
727
698
|
LoggerProxy.logger.info(
|
|
728
699
|
`StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
|
|
729
|
-
this.statsResults
|
|
700
|
+
this.statsResults['video-share-send'].send.framesSent
|
|
730
701
|
);
|
|
731
702
|
}
|
|
732
703
|
}
|
|
@@ -743,24 +714,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
743
714
|
'video-share-recv',
|
|
744
715
|
'totalPacketsReceived'
|
|
745
716
|
);
|
|
746
|
-
const currentFramesReceived =
|
|
747
|
-
|
|
748
|
-
'framesReceived'
|
|
749
|
-
);
|
|
750
|
-
const previousFramesReceived = getPreviousResolutionsStatsTotals(
|
|
751
|
-
'video-share-recv',
|
|
752
|
-
'framesReceived'
|
|
753
|
-
);
|
|
717
|
+
const currentFramesReceived = getCurrentStatsTotals('video-share-recv', 'framesReceived');
|
|
718
|
+
const previousFramesReceived = getPreviousStatsTotals('video-share-recv', 'framesReceived');
|
|
754
719
|
const currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
|
|
755
720
|
const previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
|
|
756
|
-
const currentFramesDropped =
|
|
757
|
-
|
|
758
|
-
'framesDropped'
|
|
759
|
-
);
|
|
760
|
-
const previousFramesDropped = getPreviousResolutionsStatsTotals(
|
|
761
|
-
'video-share-recv',
|
|
762
|
-
'framesDropped'
|
|
763
|
-
);
|
|
721
|
+
const currentFramesDropped = getCurrentStatsTotals('video-share-recv', 'framesDropped');
|
|
722
|
+
const previousFramesDropped = getPreviousStatsTotals('video-share-recv', 'framesDropped');
|
|
764
723
|
|
|
765
724
|
if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
|
|
766
725
|
LoggerProxy.logger.info(
|
|
@@ -884,51 +843,20 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
884
843
|
const sendrecvType = STATS.SEND_DIRECTION;
|
|
885
844
|
|
|
886
845
|
if (result.bytesSent) {
|
|
887
|
-
|
|
846
|
+
const kilobytes = 0;
|
|
888
847
|
|
|
889
848
|
if (result.frameWidth && result.frameHeight) {
|
|
890
|
-
this.statsResults
|
|
891
|
-
this.statsResults
|
|
892
|
-
this.statsResults
|
|
893
|
-
this.statsResults
|
|
894
|
-
result.hugeFramesSent;
|
|
895
|
-
}
|
|
896
|
-
|
|
897
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
|
|
898
|
-
this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
|
|
899
|
-
}
|
|
900
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {
|
|
901
|
-
this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
|
|
902
|
-
}
|
|
903
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
|
|
904
|
-
this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =
|
|
905
|
-
result.keyFramesEncoded;
|
|
849
|
+
this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
|
|
850
|
+
this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
|
|
851
|
+
this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
852
|
+
this.statsResults[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
|
|
906
853
|
}
|
|
907
854
|
|
|
908
|
-
const bytes =
|
|
909
|
-
result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
|
|
910
|
-
|
|
911
|
-
this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
|
|
912
|
-
|
|
913
|
-
kilobytes = bytes / 1024;
|
|
914
|
-
|
|
915
855
|
this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
|
|
916
|
-
this.statsResults[mediaType].bytesSent = kilobytes;
|
|
917
|
-
|
|
918
|
-
this.statsResults[mediaType][sendrecvType].framesEncoded =
|
|
919
|
-
result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
|
|
920
|
-
this.statsResults[mediaType][sendrecvType].keyFramesEncoded =
|
|
921
|
-
result.keyFramesEncoded -
|
|
922
|
-
this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
|
|
923
|
-
this.statsResults.internal[mediaType].outboundRtpId = result.id;
|
|
924
856
|
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
this.statsResults[mediaType][sendrecvType].packetsSent =
|
|
930
|
-
result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
|
|
931
|
-
this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
|
|
857
|
+
this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
|
|
858
|
+
this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
|
|
859
|
+
this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent;
|
|
932
860
|
|
|
933
861
|
// Data saved to send MQA metrics
|
|
934
862
|
|
|
@@ -972,74 +900,40 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
972
900
|
: '';
|
|
973
901
|
|
|
974
902
|
if (result.frameWidth && result.frameHeight) {
|
|
975
|
-
this.statsResults
|
|
976
|
-
this.statsResults
|
|
977
|
-
this.statsResults
|
|
978
|
-
result.framesReceived;
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
|
|
982
|
-
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
|
|
983
|
-
result.bytesReceived;
|
|
984
|
-
}
|
|
985
|
-
|
|
986
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {
|
|
987
|
-
this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;
|
|
988
|
-
}
|
|
989
|
-
|
|
990
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {
|
|
991
|
-
this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;
|
|
992
|
-
}
|
|
993
|
-
|
|
994
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
|
|
995
|
-
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
|
|
996
|
-
result.packetsReceived;
|
|
997
|
-
}
|
|
998
|
-
|
|
999
|
-
if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
|
|
1000
|
-
this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =
|
|
1001
|
-
result.lastPacketReceivedTimestamp;
|
|
903
|
+
this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
|
|
904
|
+
this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
|
|
905
|
+
this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
1002
906
|
}
|
|
1003
907
|
|
|
1004
908
|
const bytes =
|
|
1005
|
-
result.bytesReceived -
|
|
1006
|
-
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;
|
|
1007
|
-
|
|
1008
|
-
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
|
|
909
|
+
result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;
|
|
1009
910
|
|
|
1010
911
|
kilobytes = bytes / 1024;
|
|
1011
912
|
this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
|
|
1018
|
-
if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {
|
|
1019
|
-
this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;
|
|
913
|
+
|
|
914
|
+
let currentPacketsLost =
|
|
915
|
+
result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;
|
|
916
|
+
if (currentPacketsLost < 0) {
|
|
917
|
+
currentPacketsLost = 0;
|
|
1020
918
|
}
|
|
1021
919
|
|
|
1022
|
-
|
|
1023
|
-
result.packetsReceived -
|
|
1024
|
-
|
|
1025
|
-
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
|
|
1026
|
-
result.packetsReceived;
|
|
920
|
+
const currentPacketsReceived =
|
|
921
|
+
result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;
|
|
922
|
+
this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
|
|
1027
923
|
|
|
1028
|
-
if (
|
|
924
|
+
if (currentPacketsReceived === 0) {
|
|
1029
925
|
if (receiveSlot) {
|
|
1030
926
|
LoggerProxy.logger.info(
|
|
1031
927
|
`StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
|
|
1032
|
-
|
|
928
|
+
currentPacketsReceived
|
|
1033
929
|
);
|
|
1034
930
|
}
|
|
1035
931
|
}
|
|
1036
932
|
|
|
1037
933
|
// Check the over all packet Lost ratio
|
|
1038
934
|
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =
|
|
1039
|
-
|
|
1040
|
-
?
|
|
1041
|
-
(this.statsResults[mediaType][sendrecvType].packetsReceived +
|
|
1042
|
-
this.statsResults[mediaType][sendrecvType].currentPacketsLost)
|
|
935
|
+
currentPacketsLost > 0
|
|
936
|
+
? currentPacketsLost / (currentPacketsReceived + currentPacketsLost)
|
|
1043
937
|
: 0;
|
|
1044
938
|
if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
|
|
1045
939
|
LoggerProxy.logger.info(
|
|
@@ -1119,7 +1013,11 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1119
1013
|
const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
|
|
1120
1014
|
const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
|
|
1121
1015
|
|
|
1122
|
-
this.statsResults.
|
|
1016
|
+
if (!this.statsResults.candidates) {
|
|
1017
|
+
this.statsResults.candidates = {};
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
this.statsResults.candidates[result.id] = {
|
|
1123
1021
|
candidateType: result.candidateType,
|
|
1124
1022
|
ipAddress: result.ip, // TODO: add ports
|
|
1125
1023
|
portNumber: result.port,
|
|
@@ -1141,47 +1039,6 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1141
1039
|
this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
|
|
1142
1040
|
};
|
|
1143
1041
|
|
|
1144
|
-
/**
|
|
1145
|
-
* Process Track results
|
|
1146
|
-
*
|
|
1147
|
-
* @private
|
|
1148
|
-
* @param {*} result
|
|
1149
|
-
* @param {*} mediaType
|
|
1150
|
-
* @returns {void}
|
|
1151
|
-
* @memberof StatsAnalyzer
|
|
1152
|
-
*/
|
|
1153
|
-
private processTrackResult(result: any, mediaType: any) {
|
|
1154
|
-
if (!result || result.type !== 'track') {
|
|
1155
|
-
return;
|
|
1156
|
-
}
|
|
1157
|
-
|
|
1158
|
-
const sendrecvType =
|
|
1159
|
-
result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
|
|
1160
|
-
|
|
1161
|
-
if (sendrecvType === STATS.RECEIVE_DIRECTION) {
|
|
1162
|
-
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
1163
|
-
this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
|
|
1164
|
-
this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
|
|
1165
|
-
}
|
|
1166
|
-
|
|
1167
|
-
if (result.trackIdentifier && !mediaType.includes('audio')) {
|
|
1168
|
-
this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =
|
|
1169
|
-
result.trackIdentifier;
|
|
1170
|
-
|
|
1171
|
-
const jitterBufferDelay = result && result.jitterBufferDelay;
|
|
1172
|
-
const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
|
|
1173
|
-
|
|
1174
|
-
this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =
|
|
1175
|
-
jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;
|
|
1176
|
-
|
|
1177
|
-
// Used to calculate the jitter
|
|
1178
|
-
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =
|
|
1179
|
-
result.jitterBufferDelay;
|
|
1180
|
-
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount =
|
|
1181
|
-
result.jitterBufferEmittedCount;
|
|
1182
|
-
}
|
|
1183
|
-
}
|
|
1184
|
-
|
|
1185
1042
|
/**
|
|
1186
1043
|
*
|
|
1187
1044
|
* @private
|
|
@@ -1192,20 +1049,15 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1192
1049
|
*/
|
|
1193
1050
|
compareSentAndReceived(result, type) {
|
|
1194
1051
|
// Don't compare on transceivers without a sender.
|
|
1195
|
-
if (!type || !this.statsResults
|
|
1052
|
+
if (!type || !this.statsResults[type].send) {
|
|
1196
1053
|
return;
|
|
1197
1054
|
}
|
|
1198
1055
|
|
|
1199
1056
|
const mediaType = type;
|
|
1200
1057
|
|
|
1201
|
-
if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
|
|
1202
|
-
this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
1203
|
-
}
|
|
1204
|
-
|
|
1205
1058
|
const currentPacketLoss =
|
|
1206
|
-
result.packetsLost - this.statsResults
|
|
1059
|
+
result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;
|
|
1207
1060
|
|
|
1208
|
-
this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
1209
1061
|
this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
|
|
1210
1062
|
this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
1211
1063
|
|
|
@@ -173,7 +173,6 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
173
173
|
mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
174
174
|
|
|
175
175
|
videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;
|
|
176
|
-
// videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferEmittedCount) * 1000 || 0;
|
|
177
176
|
|
|
178
177
|
// Calculate the outgoing bitrate
|
|
179
178
|
const totalBytesReceivedInaMin =
|
|
@@ -186,23 +185,21 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
186
185
|
|
|
187
186
|
// From tracks //TODO: calculate a proper one
|
|
188
187
|
const totalFrameReceivedInaMin =
|
|
189
|
-
statsResults
|
|
188
|
+
statsResults[mediaType][sendrecvType].framesReceived - lastFramesReceived;
|
|
190
189
|
const totalFrameDecodedInaMin =
|
|
191
|
-
statsResults
|
|
190
|
+
statsResults[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
|
|
192
191
|
|
|
193
|
-
videoReceiver.streams[0].common.receivedFrameRate =
|
|
194
|
-
?
|
|
195
|
-
|
|
196
|
-
videoReceiver.streams[0].common.renderedFrameRate =
|
|
197
|
-
?
|
|
198
|
-
|
|
192
|
+
videoReceiver.streams[0].common.receivedFrameRate = Math.round(
|
|
193
|
+
totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0
|
|
194
|
+
);
|
|
195
|
+
videoReceiver.streams[0].common.renderedFrameRate = Math.round(
|
|
196
|
+
totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0
|
|
197
|
+
);
|
|
199
198
|
|
|
200
199
|
videoReceiver.streams[0].common.framesDropped =
|
|
201
|
-
statsResults
|
|
202
|
-
videoReceiver.streams[0].receivedHeight =
|
|
203
|
-
|
|
204
|
-
videoReceiver.streams[0].receivedWidth =
|
|
205
|
-
statsResults.resolutions[mediaType][sendrecvType].width || 0;
|
|
200
|
+
statsResults[mediaType][sendrecvType].framesDropped - lastFramesDropped;
|
|
201
|
+
videoReceiver.streams[0].receivedHeight = statsResults[mediaType][sendrecvType].height || 0;
|
|
202
|
+
videoReceiver.streams[0].receivedWidth = statsResults[mediaType][sendrecvType].width || 0;
|
|
206
203
|
videoReceiver.streams[0].receivedFrameSize =
|
|
207
204
|
(videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
|
|
208
205
|
|
|
@@ -278,15 +275,13 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
|
|
|
278
275
|
|
|
279
276
|
// From tracks //TODO: calculate a proper one
|
|
280
277
|
const totalFrameSentInaMin =
|
|
281
|
-
statsResults
|
|
278
|
+
statsResults[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
|
|
282
279
|
|
|
283
|
-
videoSender.streams[0].common.transmittedFrameRate =
|
|
284
|
-
?
|
|
285
|
-
|
|
286
|
-
videoSender.streams[0].transmittedHeight =
|
|
287
|
-
|
|
288
|
-
videoSender.streams[0].transmittedWidth =
|
|
289
|
-
statsResults.resolutions[mediaType][sendrecvType].width || 0;
|
|
280
|
+
videoSender.streams[0].common.transmittedFrameRate = Math.round(
|
|
281
|
+
totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0
|
|
282
|
+
);
|
|
283
|
+
videoSender.streams[0].transmittedHeight = statsResults[mediaType][sendrecvType].height || 0;
|
|
284
|
+
videoSender.streams[0].transmittedWidth = statsResults[mediaType][sendrecvType].width || 0;
|
|
290
285
|
videoSender.streams[0].transmittedFrameSize =
|
|
291
286
|
(videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
|
|
292
287
|
};
|
|
@@ -16,16 +16,32 @@ describe('createMediaConnection', () => {
|
|
|
16
16
|
id: 'any fake track'
|
|
17
17
|
}
|
|
18
18
|
const fakeAudioStream = {
|
|
19
|
-
|
|
19
|
+
outputStream: {
|
|
20
|
+
getTracks: () => {
|
|
21
|
+
return [fakeTrack];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
20
24
|
};
|
|
21
25
|
const fakeVideoStream = {
|
|
22
|
-
|
|
26
|
+
outputStream: {
|
|
27
|
+
getTracks: () => {
|
|
28
|
+
return [fakeTrack];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
23
31
|
};
|
|
24
32
|
const fakeShareVideoStream = {
|
|
25
|
-
|
|
33
|
+
outputStream: {
|
|
34
|
+
getTracks: () => {
|
|
35
|
+
return [fakeTrack];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
26
38
|
};
|
|
27
39
|
const fakeShareAudioStream = {
|
|
28
|
-
|
|
40
|
+
outputStream: {
|
|
41
|
+
getTracks: () => {
|
|
42
|
+
return [fakeTrack];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
29
45
|
};
|
|
30
46
|
afterEach(() => {
|
|
31
47
|
sinon.restore();
|
|
@@ -67,12 +67,14 @@ describe('plugin-meetings', () => {
|
|
|
67
67
|
canShareDesktop: null,
|
|
68
68
|
canShareContent: null,
|
|
69
69
|
canTransferFile: null,
|
|
70
|
+
canChat: null,
|
|
70
71
|
canDoVideo: null,
|
|
71
72
|
canAnnotate: null,
|
|
72
73
|
canUseVoip: null,
|
|
73
74
|
supportHQV: null,
|
|
74
75
|
supportHDV: null,
|
|
75
76
|
canShareWhiteBoard: null,
|
|
77
|
+
enforceVirtualBackground: null,
|
|
76
78
|
...expected,
|
|
77
79
|
};
|
|
78
80
|
|
|
@@ -145,12 +147,14 @@ describe('plugin-meetings', () => {
|
|
|
145
147
|
'canShareDesktop',
|
|
146
148
|
'canShareContent',
|
|
147
149
|
'canTransferFile',
|
|
150
|
+
'canChat',
|
|
148
151
|
'canDoVideo',
|
|
149
152
|
'canAnnotate',
|
|
150
153
|
'canUseVoip',
|
|
151
154
|
'supportHQV',
|
|
152
155
|
'supportHDV',
|
|
153
156
|
'canShareWhiteBoard',
|
|
157
|
+
'enforceVirtualBackground',
|
|
154
158
|
].forEach((key) => {
|
|
155
159
|
it(`get and set for ${key} work as expected`, () => {
|
|
156
160
|
const inMeetingActions = new InMeetingActions();
|