@webex/plugin-meetings 3.11.0-next.31 → 3.11.0-next.32

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.
@@ -463,6 +463,7 @@ export default class Meeting extends StatelessWebexPlugin {
463
463
  localAudioStreamMuteStateHandler: () => void;
464
464
  localVideoStreamMuteStateHandler: () => void;
465
465
  localOutputTrackChangeHandler: () => void;
466
+ localConstraintsChangeHandler: () => void;
466
467
  environment: string;
467
468
  namespace: string;
468
469
  allowMediaInLobby: boolean;
@@ -506,7 +506,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
506
506
  }, _callee8);
507
507
  }))();
508
508
  },
509
- version: "3.11.0-next.31"
509
+ version: "3.11.0-next.32"
510
510
  });
511
511
  var _default = exports.default = Webinar;
512
512
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -93,5 +93,5 @@
93
93
  "//": [
94
94
  "TODO: upgrade jwt-decode when moving to node 18"
95
95
  ],
96
- "version": "3.11.0-next.31"
96
+ "version": "3.11.0-next.32"
97
97
  }
@@ -687,6 +687,7 @@ export default class Meeting extends StatelessWebexPlugin {
687
687
  localAudioStreamMuteStateHandler: () => void;
688
688
  localVideoStreamMuteStateHandler: () => void;
689
689
  localOutputTrackChangeHandler: () => void;
690
+ localConstraintsChangeHandler: () => void;
690
691
  environment: string;
691
692
  namespace = MEETINGS;
692
693
  allowMediaInLobby: boolean;
@@ -1556,6 +1557,12 @@ export default class Meeting extends StatelessWebexPlugin {
1556
1557
  }
1557
1558
  };
1558
1559
 
1560
+ this.localConstraintsChangeHandler = () => {
1561
+ if (!this.isMultistream) {
1562
+ this.mediaProperties.webrtcMediaConnection?.updatePreferredBitrateKbps();
1563
+ }
1564
+ };
1565
+
1559
1566
  /**
1560
1567
  * Promise that exists if SDP offer has been generated, and resolves once sdp answer is received.
1561
1568
  * @instance
@@ -4844,6 +4851,7 @@ export default class Meeting extends StatelessWebexPlugin {
4844
4851
  this.localVideoStreamMuteStateHandler
4845
4852
  );
4846
4853
  oldStream?.off(LocalStreamEventNames.OutputTrackChange, this.localOutputTrackChangeHandler);
4854
+ oldStream?.off(LocalStreamEventNames.ConstraintsChange, this.localConstraintsChangeHandler);
4847
4855
 
4848
4856
  // we don't update this.mediaProperties.mediaDirection.sendVideo, because we always keep it as true to avoid extra SDP exchanges
4849
4857
  this.mediaProperties.setLocalVideoStream(localStream);
@@ -4859,6 +4867,7 @@ export default class Meeting extends StatelessWebexPlugin {
4859
4867
  this.localVideoStreamMuteStateHandler
4860
4868
  );
4861
4869
  localStream?.on(LocalStreamEventNames.OutputTrackChange, this.localOutputTrackChangeHandler);
4870
+ localStream?.on(LocalStreamEventNames.ConstraintsChange, this.localConstraintsChangeHandler);
4862
4871
 
4863
4872
  if (!this.isMultistream || !localStream) {
4864
4873
  // for multistream WCME automatically un-publishes the old stream when we publish a new one
@@ -4993,6 +5002,7 @@ export default class Meeting extends StatelessWebexPlugin {
4993
5002
  this.localVideoStreamMuteStateHandler
4994
5003
  );
4995
5004
  videoStream?.off(LocalStreamEventNames.OutputTrackChange, this.localOutputTrackChangeHandler);
5005
+ videoStream?.off(LocalStreamEventNames.ConstraintsChange, this.localConstraintsChangeHandler);
4996
5006
 
4997
5007
  shareAudioStream?.off(StreamEventNames.Ended, this.handleShareAudioStreamEnded);
4998
5008
  shareAudioStream?.off(
@@ -11473,6 +11473,41 @@ describe('plugin-meetings', () => {
11473
11473
  });
11474
11474
  });
11475
11475
 
11476
+ describe('localConstraintsChangeHandler', () => {
11477
+ it('calls updatePreferredBitrateKbps when not multistream', () => {
11478
+ meeting.isMultistream = false;
11479
+ meeting.mediaProperties.webrtcMediaConnection = {
11480
+ updatePreferredBitrateKbps: sinon.stub(),
11481
+ };
11482
+
11483
+ meeting.localConstraintsChangeHandler();
11484
+
11485
+ assert.calledOnce(
11486
+ meeting.mediaProperties.webrtcMediaConnection.updatePreferredBitrateKbps
11487
+ );
11488
+ });
11489
+
11490
+ it('does not call updatePreferredBitrateKbps when multistream', () => {
11491
+ meeting.isMultistream = true;
11492
+ meeting.mediaProperties.webrtcMediaConnection = {
11493
+ updatePreferredBitrateKbps: sinon.stub(),
11494
+ };
11495
+
11496
+ meeting.localConstraintsChangeHandler();
11497
+
11498
+ assert.notCalled(
11499
+ meeting.mediaProperties.webrtcMediaConnection.updatePreferredBitrateKbps
11500
+ );
11501
+ });
11502
+
11503
+ it('does not throw when webrtcMediaConnection is undefined', () => {
11504
+ meeting.isMultistream = false;
11505
+ meeting.mediaProperties.webrtcMediaConnection = undefined;
11506
+
11507
+ assert.doesNotThrow(() => meeting.localConstraintsChangeHandler());
11508
+ });
11509
+ });
11510
+
11476
11511
  describe('#parseMeetingInfo', () => {
11477
11512
  const checkParseMeetingInfo = (expectedInfoToParse) => {
11478
11513
  assert.equal(meeting.conversationUrl, expectedInfoToParse.conversationUrl);