@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.
@@ -458,7 +458,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
458
458
  }, _callee7);
459
459
  }))();
460
460
  },
461
- version: "3.10.0-next.1"
461
+ version: "3.10.0-next.2"
462
462
  });
463
463
  var _default = exports.default = Webinar;
464
464
  //# sourceMappingURL=index.js.map
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.0",
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.9.0-next.2",
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.6.0",
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.1"
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',
@@ -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,
@@ -30,6 +30,7 @@ import {
30
30
  NetworkQualityMonitor,
31
31
  StatsMonitor,
32
32
  StatsMonitorEventNames,
33
+ InboundAudioIssueSubTypes,
33
34
  } from '@webex/internal-media-core';
34
35
 
35
36
  import {
@@ -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);