@webex/plugin-meetings 3.10.0-next.1 → 3.10.0-next.2
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/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/media/index.js +5 -0
- package/dist/media/index.js.map +1 -1
- package/dist/meeting/index.js.map +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +4 -4
- package/src/constants.ts +1 -1
- package/src/media/index.ts +6 -0
- package/src/meeting/index.ts +1 -0
- package/test/unit/spec/media/index.ts +140 -9
- package/test/unit/spec/meetings/index.js +0 -2
package/dist/webinar/index.js
CHANGED
package/package.json
CHANGED
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@webex/common": "3.8.1-next.11",
|
|
64
64
|
"@webex/event-dictionary-ts": "^1.0.1930",
|
|
65
|
-
"@webex/internal-media-core": "2.20.
|
|
65
|
+
"@webex/internal-media-core": "2.20.1",
|
|
66
66
|
"@webex/internal-plugin-conversation": "3.9.0-next.8",
|
|
67
67
|
"@webex/internal-plugin-device": "3.9.0-next.6",
|
|
68
68
|
"@webex/internal-plugin-llm": "3.9.0-next.7",
|
|
@@ -71,11 +71,11 @@
|
|
|
71
71
|
"@webex/internal-plugin-support": "3.9.0-next.9",
|
|
72
72
|
"@webex/internal-plugin-user": "3.9.0-next.6",
|
|
73
73
|
"@webex/internal-plugin-voicea": "3.9.0-next.8",
|
|
74
|
-
"@webex/media-helpers": "3.
|
|
74
|
+
"@webex/media-helpers": "3.10.0-next.1",
|
|
75
75
|
"@webex/plugin-people": "3.9.0-next.7",
|
|
76
76
|
"@webex/plugin-rooms": "3.9.0-next.8",
|
|
77
77
|
"@webex/ts-sdp": "^1.8.1",
|
|
78
|
-
"@webex/web-capabilities": "^1.
|
|
78
|
+
"@webex/web-capabilities": "^1.7.1",
|
|
79
79
|
"@webex/webex-core": "3.9.0-next.6",
|
|
80
80
|
"ampersand-collection": "^2.0.2",
|
|
81
81
|
"bowser": "^2.11.0",
|
|
@@ -92,5 +92,5 @@
|
|
|
92
92
|
"//": [
|
|
93
93
|
"TODO: upgrade jwt-decode when moving to node 18"
|
|
94
94
|
],
|
|
95
|
-
"version": "3.10.0-next.
|
|
95
|
+
"version": "3.10.0-next.2"
|
|
96
96
|
}
|
package/src/constants.ts
CHANGED
|
@@ -347,7 +347,7 @@ export const EVENT_TRIGGERS = {
|
|
|
347
347
|
MEETING_SELF_LEFT: 'meeting:self:left',
|
|
348
348
|
NETWORK_QUALITY: 'network:quality',
|
|
349
349
|
MEDIA_NEGOTIATED: 'media:negotiated',
|
|
350
|
-
MEDIA_INBOUND_AUDIO_ISSUE_DETECTED: 'media:inboundAudio:issueDetected',
|
|
350
|
+
MEDIA_INBOUND_AUDIO_ISSUE_DETECTED: 'media:inboundAudio:issueDetected', // event.data: InboundAudioIssueEvent
|
|
351
351
|
// the following events apply only to multistream media connections
|
|
352
352
|
ACTIVE_SPEAKER_CHANGED: 'media:activeSpeakerChanged',
|
|
353
353
|
REMOTE_VIDEO_SOURCE_COUNT_CHANGED: 'media:remoteVideoSourceCountChanged',
|
package/src/media/index.ts
CHANGED
|
@@ -194,6 +194,12 @@ Media.createMediaConnection = (
|
|
|
194
194
|
config.stopIceGatheringAfterFirstRelayCandidate = stopIceGatheringAfterFirstRelayCandidate;
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
+
if (BrowserInfo.isEdge() || BrowserInfo.isChrome()) {
|
|
198
|
+
// we need this for getting inbound audio metadata
|
|
199
|
+
// but the audioLevel that we use is only available on Chromium based browsers
|
|
200
|
+
config.enableInboundAudioLevelMonitoring = true;
|
|
201
|
+
}
|
|
202
|
+
|
|
197
203
|
return new MultistreamRoapMediaConnection(
|
|
198
204
|
config,
|
|
199
205
|
meetingId,
|
package/src/meeting/index.ts
CHANGED
|
@@ -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
|
{
|
|
@@ -690,11 +690,9 @@ describe('plugin-meetings', () => {
|
|
|
690
690
|
assert.deepEqual(result.options, {
|
|
691
691
|
mode: 'BLUR',
|
|
692
692
|
blurStrength: 'STRONG',
|
|
693
|
-
generator: 'worker',
|
|
694
693
|
quality: 'LOW',
|
|
695
694
|
authToken: 'fake_token',
|
|
696
695
|
mirror: false,
|
|
697
|
-
canvasResolutionScaling: 1,
|
|
698
696
|
});
|
|
699
697
|
assert.exists(result.enable);
|
|
700
698
|
assert.exists(result.disable);
|