@webex/plugin-meetings 3.9.0-webinar5k.1 → 3.10.0-multi-llms.1
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/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/common/errors/webex-errors.js +21 -1
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/constants.js +25 -0
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/index.js +22 -5
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.js +7 -0
- package/dist/interceptors/index.js.map +1 -1
- package/dist/interceptors/locusRouteToken.js +116 -0
- package/dist/interceptors/locusRouteToken.js.map +1 -0
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +11 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +76 -322
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +4 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/media/index.js +5 -0
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +53 -5
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +14 -0
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +468 -278
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +177 -14
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/type.js +7 -0
- package/dist/meeting/type.js.map +1 -0
- package/dist/meeting/util.js +100 -3
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +29 -21
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/index.js +20 -16
- package/dist/meetings/index.js.map +1 -1
- package/dist/member/index.js +9 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +10 -0
- package/dist/member/util.js.map +1 -1
- package/dist/members/index.js +10 -7
- package/dist/members/index.js.map +1 -1
- package/dist/members/util.js +7 -2
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +2 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +1 -1
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +34 -5
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +42 -2
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/reachability/index.js +3 -3
- package/dist/reachability/index.js.map +1 -1
- package/dist/types/common/errors/webex-errors.d.ts +12 -0
- package/dist/types/constants.d.ts +23 -0
- package/dist/types/controls-options-manager/index.d.ts +9 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/interceptors/index.d.ts +2 -1
- package/dist/types/interceptors/locusRouteToken.d.ts +38 -0
- package/dist/types/locus-info/index.d.ts +9 -54
- package/dist/types/media/properties.d.ts +21 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +14 -0
- package/dist/types/meeting/index.d.ts +64 -29
- package/dist/types/meeting/request.d.ts +42 -0
- package/dist/types/meeting/type.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +13 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +6 -3
- package/dist/types/meetings/index.d.ts +3 -1
- package/dist/types/member/index.d.ts +1 -0
- package/dist/types/member/util.d.ts +5 -0
- package/dist/types/members/index.d.ts +12 -11
- package/dist/types/members/util.d.ts +8 -4
- package/dist/types/metrics/constants.d.ts +1 -0
- package/dist/types/multistream/remoteMedia.d.ts +20 -1
- package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +26 -28
- package/src/common/errors/webex-errors.ts +19 -0
- package/src/constants.ts +26 -2
- package/src/controls-options-manager/index.ts +26 -5
- package/src/index.ts +4 -1
- package/src/interceptors/index.ts +2 -1
- package/src/interceptors/locusRouteToken.ts +80 -0
- package/src/locus-info/controlsUtils.ts +18 -0
- package/src/locus-info/index.ts +69 -357
- package/src/locus-info/parser.ts +5 -1
- package/src/media/index.ts +6 -0
- package/src/media/properties.ts +43 -0
- package/src/meeting/in-meeting-actions.ts +29 -0
- package/src/meeting/index.ts +299 -88
- package/src/meeting/request.ts +141 -0
- package/src/meeting/type.ts +9 -0
- package/src/meeting/util.ts +107 -3
- package/src/meeting-info/meeting-info-v2.ts +24 -5
- package/src/meetings/index.ts +15 -22
- package/src/member/index.ts +10 -0
- package/src/member/util.ts +14 -0
- package/src/members/index.ts +20 -10
- package/src/members/util.ts +20 -3
- package/src/metrics/constants.ts +1 -0
- package/src/multistream/mediaRequestManager.ts +7 -7
- package/src/multistream/remoteMedia.ts +34 -4
- package/src/multistream/remoteMediaGroup.ts +37 -2
- package/src/reachability/index.ts +3 -3
- package/test/unit/spec/common/browser-detection.js +0 -24
- package/test/unit/spec/controls-options-manager/index.js +47 -0
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interceptors/locusRouteToken.ts +87 -0
- package/test/unit/spec/locus-info/index.js +80 -361
- package/test/unit/spec/locus-info/parser.js +3 -2
- package/test/unit/spec/media/index.ts +140 -9
- package/test/unit/spec/media/properties.ts +137 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +14 -0
- package/test/unit/spec/meeting/index.js +679 -82
- package/test/unit/spec/meeting/muteState.js +32 -6
- package/test/unit/spec/meeting/request.js +21 -0
- package/test/unit/spec/meeting/utils.js +170 -17
- package/test/unit/spec/meeting-info/meetinginfov2.js +8 -3
- package/test/unit/spec/meetings/index.js +12 -7
- package/test/unit/spec/member/util.js +24 -0
- package/test/unit/spec/members/collection.js +120 -0
- package/test/unit/spec/members/index.js +107 -2
- package/test/unit/spec/members/request.js +55 -0
- package/test/unit/spec/members/utils.js +116 -14
- package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
- package/test/unit/spec/multistream/remoteMedia.ts +66 -2
- package/test/unit/spec/reachability/index.ts +158 -3
- package/test/unit/spec/roap/turnDiscovery.ts +3 -3
- package/dist/hashTree/constants.js +0 -23
- package/dist/hashTree/constants.js.map +0 -1
- package/dist/hashTree/hashTree.js +0 -516
- package/dist/hashTree/hashTree.js.map +0 -1
- package/dist/hashTree/hashTreeParser.js +0 -521
- package/dist/hashTree/hashTreeParser.js.map +0 -1
- package/dist/types/hashTree/constants.d.ts +0 -8
- package/dist/types/hashTree/hashTree.d.ts +0 -128
- package/dist/types/hashTree/hashTreeParser.d.ts +0 -152
- package/src/hashTree/constants.ts +0 -12
- package/src/hashTree/hashTree.ts +0 -460
- package/src/hashTree/hashTreeParser.ts +0 -556
- package/test/unit/spec/hashTree/hashTree.ts +0 -394
- package/test/unit/spec/hashTree/hashTreeParser.ts +0 -156
|
@@ -141,12 +141,12 @@ describe('createMediaConnection', () => {
|
|
|
141
141
|
const roapMediaConnectionConstructorStub = sinon
|
|
142
142
|
.stub(InternalMediaCoreModule, 'RoapMediaConnection')
|
|
143
143
|
.returns(fakeRoapMediaConnection);
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
StaticConfig.set({bandwidth: {audio: 123, video: 456, startBitrate: 999}});
|
|
146
|
-
|
|
146
|
+
|
|
147
147
|
const ENABLE_EXTMAP = false;
|
|
148
148
|
const ENABLE_RTX = true;
|
|
149
|
-
|
|
149
|
+
|
|
150
150
|
Media.createMediaConnection(false, 'sendonly-debug-id', 'meetingId', {
|
|
151
151
|
mediaProperties: {
|
|
152
152
|
mediaDirection: {
|
|
@@ -168,7 +168,7 @@ describe('createMediaConnection', () => {
|
|
|
168
168
|
turnServerInfo: undefined,
|
|
169
169
|
iceCandidatesTimeout: undefined,
|
|
170
170
|
});
|
|
171
|
-
|
|
171
|
+
|
|
172
172
|
assert.calledWith(
|
|
173
173
|
roapMediaConnectionConstructorStub,
|
|
174
174
|
sinon.match.any,
|
|
@@ -194,12 +194,12 @@ describe('createMediaConnection', () => {
|
|
|
194
194
|
const roapMediaConnectionConstructorStub = sinon
|
|
195
195
|
.stub(InternalMediaCoreModule, 'RoapMediaConnection')
|
|
196
196
|
.returns(fakeRoapMediaConnection);
|
|
197
|
-
|
|
197
|
+
|
|
198
198
|
StaticConfig.set({bandwidth: {audio: 123, video: 456, startBitrate: 999}});
|
|
199
|
-
|
|
199
|
+
|
|
200
200
|
const ENABLE_EXTMAP = true;
|
|
201
201
|
const ENABLE_RTX = false;
|
|
202
|
-
|
|
202
|
+
|
|
203
203
|
Media.createMediaConnection(false, 'recvonly-debug-id', 'meetingId', {
|
|
204
204
|
mediaProperties: {
|
|
205
205
|
mediaDirection: {
|
|
@@ -221,7 +221,7 @@ describe('createMediaConnection', () => {
|
|
|
221
221
|
turnServerInfo: undefined,
|
|
222
222
|
iceCandidatesTimeout: undefined,
|
|
223
223
|
});
|
|
224
|
-
|
|
224
|
+
|
|
225
225
|
assert.calledWith(
|
|
226
226
|
roapMediaConnectionConstructorStub,
|
|
227
227
|
sinon.match.any,
|
|
@@ -242,7 +242,6 @@ describe('createMediaConnection', () => {
|
|
|
242
242
|
'recvonly-debug-id'
|
|
243
243
|
);
|
|
244
244
|
});
|
|
245
|
-
|
|
246
245
|
|
|
247
246
|
it('creates a MultistreamRoapMediaConnection when multistream is enabled', () => {
|
|
248
247
|
const multistreamRoapMediaConnectionConstructorStub = sinon
|
|
@@ -511,6 +510,138 @@ describe('createMediaConnection', () => {
|
|
|
511
510
|
);
|
|
512
511
|
});
|
|
513
512
|
|
|
513
|
+
const testEnableInboundAudioLevelMonitoring = (
|
|
514
|
+
testName: string,
|
|
515
|
+
browserStubs: {isChrome?: boolean; isEdge?: boolean; isFirefox?: boolean},
|
|
516
|
+
isMultistream: boolean,
|
|
517
|
+
expectedConfig: object,
|
|
518
|
+
additionalOptions = {}
|
|
519
|
+
) => {
|
|
520
|
+
it(testName, () => {
|
|
521
|
+
const connectionConstructorStub = isMultistream
|
|
522
|
+
? sinon.stub(InternalMediaCoreModule, 'MultistreamRoapMediaConnection')
|
|
523
|
+
: sinon.stub(InternalMediaCoreModule, 'RoapMediaConnection');
|
|
524
|
+
|
|
525
|
+
connectionConstructorStub.returns(fakeRoapMediaConnection);
|
|
526
|
+
|
|
527
|
+
// Set up browser stubs
|
|
528
|
+
sinon.stub(BrowserInfo, 'isChrome').returns(browserStubs.isChrome || false);
|
|
529
|
+
sinon.stub(BrowserInfo, 'isEdge').returns(browserStubs.isEdge || false);
|
|
530
|
+
sinon.stub(BrowserInfo, 'isFirefox').returns(browserStubs.isFirefox || false);
|
|
531
|
+
|
|
532
|
+
const baseOptions = {
|
|
533
|
+
mediaProperties: {
|
|
534
|
+
mediaDirection: {
|
|
535
|
+
sendAudio: true,
|
|
536
|
+
sendVideo: true,
|
|
537
|
+
sendShare: false,
|
|
538
|
+
receiveAudio: true,
|
|
539
|
+
receiveVideo: true,
|
|
540
|
+
receiveShare: true,
|
|
541
|
+
},
|
|
542
|
+
...(isMultistream
|
|
543
|
+
? {}
|
|
544
|
+
: {
|
|
545
|
+
audioStream: fakeAudioStream,
|
|
546
|
+
videoStream: fakeVideoStream,
|
|
547
|
+
shareVideoTrack: null,
|
|
548
|
+
shareAudioTrack: null,
|
|
549
|
+
}),
|
|
550
|
+
},
|
|
551
|
+
...(isMultistream
|
|
552
|
+
? {}
|
|
553
|
+
: {
|
|
554
|
+
remoteQualityLevel: 'HIGH',
|
|
555
|
+
enableRtx: true,
|
|
556
|
+
enableExtmap: true,
|
|
557
|
+
}),
|
|
558
|
+
...additionalOptions,
|
|
559
|
+
};
|
|
560
|
+
|
|
561
|
+
if (!isMultistream) {
|
|
562
|
+
StaticConfig.set({bandwidth: {audio: 123, video: 456, startBitrate: 999}});
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
Media.createMediaConnection(isMultistream, 'debug string', 'meeting id', baseOptions);
|
|
566
|
+
|
|
567
|
+
if (isMultistream) {
|
|
568
|
+
assert.calledOnceWithExactly(
|
|
569
|
+
connectionConstructorStub,
|
|
570
|
+
expectedConfig,
|
|
571
|
+
'meeting id',
|
|
572
|
+
sinon.match.func,
|
|
573
|
+
sinon.match.func,
|
|
574
|
+
sinon.match.func
|
|
575
|
+
);
|
|
576
|
+
} else {
|
|
577
|
+
assert.calledOnceWithExactly(
|
|
578
|
+
connectionConstructorStub,
|
|
579
|
+
expectedConfig,
|
|
580
|
+
sinon.match.object,
|
|
581
|
+
'debug string'
|
|
582
|
+
);
|
|
583
|
+
}
|
|
584
|
+
});
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
testEnableInboundAudioLevelMonitoring(
|
|
588
|
+
'enables enableInboundAudioLevelMonitoring for multistream when browser is Chrome',
|
|
589
|
+
{isChrome: true},
|
|
590
|
+
true,
|
|
591
|
+
{
|
|
592
|
+
iceServers: [],
|
|
593
|
+
disableAudioTwcc: true,
|
|
594
|
+
enableInboundAudioLevelMonitoring: true,
|
|
595
|
+
}
|
|
596
|
+
);
|
|
597
|
+
|
|
598
|
+
testEnableInboundAudioLevelMonitoring(
|
|
599
|
+
'enables enableInboundAudioLevelMonitoring for multistream when browser is Edge',
|
|
600
|
+
{isEdge: true},
|
|
601
|
+
true,
|
|
602
|
+
{
|
|
603
|
+
iceServers: [],
|
|
604
|
+
disableAudioTwcc: true,
|
|
605
|
+
enableInboundAudioLevelMonitoring: true,
|
|
606
|
+
}
|
|
607
|
+
);
|
|
608
|
+
|
|
609
|
+
testEnableInboundAudioLevelMonitoring(
|
|
610
|
+
'does not enable enableInboundAudioLevelMonitoring for multistream when browser is Firefox',
|
|
611
|
+
{isFirefox: true},
|
|
612
|
+
true,
|
|
613
|
+
{
|
|
614
|
+
iceServers: [],
|
|
615
|
+
disableAudioTwcc: true,
|
|
616
|
+
doFullIce: true,
|
|
617
|
+
stopIceGatheringAfterFirstRelayCandidate: undefined,
|
|
618
|
+
}
|
|
619
|
+
);
|
|
620
|
+
|
|
621
|
+
testEnableInboundAudioLevelMonitoring(
|
|
622
|
+
'does not enable enableInboundAudioLevelMonitoring for non-multistream connections even when browser is Chrome',
|
|
623
|
+
{isChrome: true},
|
|
624
|
+
false,
|
|
625
|
+
{
|
|
626
|
+
iceServers: [],
|
|
627
|
+
iceCandidatesTimeout: undefined,
|
|
628
|
+
skipInactiveTransceivers: false,
|
|
629
|
+
requireH264: true,
|
|
630
|
+
sdpMunging: {
|
|
631
|
+
convertPort9to0: false,
|
|
632
|
+
addContentSlides: true,
|
|
633
|
+
bandwidthLimits: {
|
|
634
|
+
audio: 123,
|
|
635
|
+
video: 456,
|
|
636
|
+
},
|
|
637
|
+
startBitrate: 999,
|
|
638
|
+
periodicKeyframes: 20,
|
|
639
|
+
disableExtmap: false,
|
|
640
|
+
disableRtx: false,
|
|
641
|
+
},
|
|
642
|
+
}
|
|
643
|
+
);
|
|
644
|
+
|
|
514
645
|
[
|
|
515
646
|
{testCase: 'turnServerInfo is undefined', turnServerInfo: undefined},
|
|
516
647
|
{
|
|
@@ -6,6 +6,8 @@ import * as tsSdpModule from '@webex/ts-sdp';
|
|
|
6
6
|
import MediaProperties from '@webex/plugin-meetings/src/media/properties';
|
|
7
7
|
import {Defer} from '@webex/common';
|
|
8
8
|
import MediaConnectionAwaiter from '../../../../src/media/MediaConnectionAwaiter';
|
|
9
|
+
import Metrics from '../../../../src/metrics';
|
|
10
|
+
import BEHAVIORAL_METRICS from '../../../../src/metrics/constants';
|
|
9
11
|
|
|
10
12
|
describe('MediaProperties', () => {
|
|
11
13
|
let mediaProperties;
|
|
@@ -389,4 +391,139 @@ describe('MediaProperties', () => {
|
|
|
389
391
|
});
|
|
390
392
|
});
|
|
391
393
|
});
|
|
394
|
+
|
|
395
|
+
// issue types and subtypes used in these tests are just examples
|
|
396
|
+
// they don't reflect real issue types/subtypes used in production
|
|
397
|
+
describe('sendMediaIssueMetric', () => {
|
|
398
|
+
let sendBehavioralMetricStub;
|
|
399
|
+
let clock;
|
|
400
|
+
|
|
401
|
+
beforeEach(() => {
|
|
402
|
+
clock = sinon.useFakeTimers();
|
|
403
|
+
sendBehavioralMetricStub = sinon.stub(Metrics, 'sendBehavioralMetric');
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
afterEach(() => {
|
|
407
|
+
clock.restore();
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
it('should send a behavioral metric with correct parameters', () => {
|
|
411
|
+
const issueType = 'audio';
|
|
412
|
+
const issueSubType = 'packet-loss';
|
|
413
|
+
const correlationId = 'test-correlation-id-123';
|
|
414
|
+
|
|
415
|
+
mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
|
|
416
|
+
|
|
417
|
+
assert.calledOnce(sendBehavioralMetricStub);
|
|
418
|
+
assert.calledWith(sendBehavioralMetricStub, BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED, {
|
|
419
|
+
correlationId,
|
|
420
|
+
'audio_packet-loss': 1,
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
it('should increment count while being throttled and reset it once metric goes out', () => {
|
|
425
|
+
const issueType = 'video';
|
|
426
|
+
const issueSubType = 'freeze';
|
|
427
|
+
const correlationId = 'test-correlation-id';
|
|
428
|
+
|
|
429
|
+
// Call multiple times with same issue type/subtype
|
|
430
|
+
mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
|
|
431
|
+
mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
|
|
432
|
+
mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
|
|
433
|
+
|
|
434
|
+
// First call should go through immediately, subsequent calls are throttled
|
|
435
|
+
assert.calledOnce(sendBehavioralMetricStub);
|
|
436
|
+
assert.calledWith(sendBehavioralMetricStub, BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED, {
|
|
437
|
+
correlationId,
|
|
438
|
+
video_freeze: 1, // Only the first call goes through due to throttling
|
|
439
|
+
});
|
|
440
|
+
sendBehavioralMetricStub.resetHistory();
|
|
441
|
+
|
|
442
|
+
assert.equal(mediaProperties.mediaIssueCounters['video_freeze'], 2); // counter should be reset after the first metric goes out, hence only 2 not 3 here
|
|
443
|
+
|
|
444
|
+
clock.tick(5 * 60 * 1000); // Advance time by 5 minutes to expire throttle
|
|
445
|
+
|
|
446
|
+
assert.calledOnceWithExactly(
|
|
447
|
+
sendBehavioralMetricStub,
|
|
448
|
+
BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
|
|
449
|
+
{
|
|
450
|
+
correlationId,
|
|
451
|
+
video_freeze: 2,
|
|
452
|
+
}
|
|
453
|
+
);
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
it('should track different issue types separately in counters', () => {
|
|
457
|
+
const correlationId = 'test-correlation-id';
|
|
458
|
+
|
|
459
|
+
// Send different issue types
|
|
460
|
+
mediaProperties.sendMediaIssueMetric('audio', 'packet-loss', correlationId);
|
|
461
|
+
mediaProperties.sendMediaIssueMetric('video', 'freeze', correlationId);
|
|
462
|
+
mediaProperties.sendMediaIssueMetric('audio', 'packet-loss', correlationId);
|
|
463
|
+
mediaProperties.sendMediaIssueMetric('audio', 'packet-loss', correlationId);
|
|
464
|
+
mediaProperties.sendMediaIssueMetric('audio', 'packet-loss', correlationId);
|
|
465
|
+
mediaProperties.sendMediaIssueMetric('video', 'freeze', correlationId);
|
|
466
|
+
|
|
467
|
+
// First call should go through immediately, subsequent calls are throttled
|
|
468
|
+
assert.calledOnceWithExactly(
|
|
469
|
+
sendBehavioralMetricStub,
|
|
470
|
+
BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
|
|
471
|
+
{
|
|
472
|
+
correlationId,
|
|
473
|
+
'audio_packet-loss': 1,
|
|
474
|
+
}
|
|
475
|
+
);
|
|
476
|
+
|
|
477
|
+
// But the counters should be tracked separately
|
|
478
|
+
assert.equal(mediaProperties.mediaIssueCounters['audio_packet-loss'], 3);
|
|
479
|
+
assert.equal(mediaProperties.mediaIssueCounters['video_freeze'], 2);
|
|
480
|
+
|
|
481
|
+
sendBehavioralMetricStub.resetHistory();
|
|
482
|
+
|
|
483
|
+
clock.tick(5 * 60 * 1000); // Advance time by 5 minutes to expire throttle
|
|
484
|
+
|
|
485
|
+
assert.calledOnceWithExactly(
|
|
486
|
+
sendBehavioralMetricStub,
|
|
487
|
+
BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
|
|
488
|
+
{
|
|
489
|
+
correlationId,
|
|
490
|
+
video_freeze: 2,
|
|
491
|
+
'audio_packet-loss': 3,
|
|
492
|
+
}
|
|
493
|
+
);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
it('should flush throttled metrics when unsetPeerConnection is called', () => {
|
|
497
|
+
const issueType = 'share';
|
|
498
|
+
const issueSubType = 'connection-lost';
|
|
499
|
+
const correlationId = 'test-correlation-id';
|
|
500
|
+
|
|
501
|
+
// Send metrics multiple times
|
|
502
|
+
mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
|
|
503
|
+
mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
|
|
504
|
+
|
|
505
|
+
// First call should go through immediately
|
|
506
|
+
assert.calledOnceWithExactly(
|
|
507
|
+
sendBehavioralMetricStub,
|
|
508
|
+
BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
|
|
509
|
+
{
|
|
510
|
+
correlationId,
|
|
511
|
+
'share_connection-lost': 1,
|
|
512
|
+
}
|
|
513
|
+
);
|
|
514
|
+
sendBehavioralMetricStub.resetHistory();
|
|
515
|
+
|
|
516
|
+
// Call unsetPeerConnection which should flush throttled metrics
|
|
517
|
+
mediaProperties.unsetPeerConnection();
|
|
518
|
+
|
|
519
|
+
assert.calledOnceWithExactly(
|
|
520
|
+
sendBehavioralMetricStub,
|
|
521
|
+
BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
|
|
522
|
+
{
|
|
523
|
+
correlationId,
|
|
524
|
+
'share_connection-lost': 1,
|
|
525
|
+
}
|
|
526
|
+
);
|
|
527
|
+
});
|
|
528
|
+
});
|
|
392
529
|
});
|
|
@@ -32,9 +32,15 @@ describe('plugin-meetings', () => {
|
|
|
32
32
|
isClosedCaptionActive: null,
|
|
33
33
|
canStartManualCaption: null,
|
|
34
34
|
canStopManualCaption: null,
|
|
35
|
+
isLocalRecordingStarted: null,
|
|
36
|
+
isLocalRecordingStopped: null,
|
|
37
|
+
isLocalRecordingPaused: null,
|
|
38
|
+
isLocalStreamingStarted:null,
|
|
39
|
+
isLocalStreamingStopped:null,
|
|
35
40
|
isManualCaptionActive: null,
|
|
36
41
|
isPremiseRecordingEnabled: null,
|
|
37
42
|
isSaveTranscriptsEnabled: null,
|
|
43
|
+
isSpokenLanguageAutoDetectionEnabled: null,
|
|
38
44
|
isWebexAssistantActive: null,
|
|
39
45
|
canViewCaptionPanel: null,
|
|
40
46
|
isRealTimeTranslationEnabled: null,
|
|
@@ -82,6 +88,7 @@ describe('plugin-meetings', () => {
|
|
|
82
88
|
canDoVideo: null,
|
|
83
89
|
canAnnotate: null,
|
|
84
90
|
canUseVoip: null,
|
|
91
|
+
showAutoEndMeetingWarning: null,
|
|
85
92
|
supportHQV: null,
|
|
86
93
|
supportHDV: null,
|
|
87
94
|
canShareWhiteBoard: null,
|
|
@@ -129,6 +136,11 @@ describe('plugin-meetings', () => {
|
|
|
129
136
|
'canPauseRecording',
|
|
130
137
|
'canResumeRecording',
|
|
131
138
|
'canStopRecording',
|
|
139
|
+
'isLocalRecordingStarted',
|
|
140
|
+
'isLocalRecordingStopped',
|
|
141
|
+
'isLocalRecordingPaused',
|
|
142
|
+
'isLocalStreamingStarted',
|
|
143
|
+
'isLocalStreamingStopped',
|
|
132
144
|
'canSetMuteOnEntry',
|
|
133
145
|
'canUnsetMuteOnEntry',
|
|
134
146
|
'canSetDisallowUnmute',
|
|
@@ -145,6 +157,7 @@ describe('plugin-meetings', () => {
|
|
|
145
157
|
'isManualCaptionActive',
|
|
146
158
|
'isPremiseRecordingEnabled',
|
|
147
159
|
'isSaveTranscriptsEnabled',
|
|
160
|
+
'isSpokenLanguageAutoDetectionEnabled',
|
|
148
161
|
'isWebexAssistantActive',
|
|
149
162
|
'canViewCaptionPanel',
|
|
150
163
|
'isRealTimeTranslationEnabled',
|
|
@@ -189,6 +202,7 @@ describe('plugin-meetings', () => {
|
|
|
189
202
|
'canRealtimeCloseCaption',
|
|
190
203
|
'canRealtimeCloseCaptionManual',
|
|
191
204
|
'canChat',
|
|
205
|
+
'showAutoEndMeetingWarning',
|
|
192
206
|
'canDoVideo',
|
|
193
207
|
'canAnnotate',
|
|
194
208
|
'canUseVoip',
|