@webex/web-client-media-engine 3.11.1 → 3.11.3

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/esm/index.js CHANGED
@@ -1281,11 +1281,30 @@ class _LocalStream extends Stream {
1281
1281
  get inputTrack() {
1282
1282
  return this.inputStream.getTracks()[0];
1283
1283
  }
1284
+ /**
1285
+ * @inheritdoc
1286
+ */
1287
+ handleTrackMuted() {
1288
+ if (this.inputTrack.enabled) {
1289
+ super.handleTrackMuted();
1290
+ }
1291
+ }
1292
+ /**
1293
+ * @inheritdoc
1294
+ */
1295
+ handleTrackUnmuted() {
1296
+ if (this.inputTrack.enabled) {
1297
+ super.handleTrackUnmuted();
1298
+ }
1299
+ }
1284
1300
  /**
1285
1301
  * @inheritdoc
1286
1302
  */
1287
1303
  get muted() {
1288
- return !this.inputTrack.enabled;
1304
+ // Calls to `setMuted` will only affect the "enabled" state, but there are specific cases in
1305
+ // which the browser may mute the track, which will affect the "muted" state but not the
1306
+ // "enabled" state, e.g. minimizing a shared window or unplugging a shared screen.
1307
+ return !this.inputTrack.enabled || this.inputTrack.muted;
1289
1308
  }
1290
1309
  /**
1291
1310
  * Set the mute state of this stream.
@@ -1296,7 +1315,9 @@ class _LocalStream extends Stream {
1296
1315
  if (this.inputTrack.enabled === isMuted) {
1297
1316
  this.inputTrack.enabled = !isMuted;
1298
1317
  // setting `enabled` will not automatically emit MuteStateChange, so we emit it here
1299
- this[StreamEventNames.MuteStateChange].emit(isMuted);
1318
+ if (!this.inputTrack.muted) {
1319
+ this[StreamEventNames.MuteStateChange].emit(isMuted);
1320
+ }
1300
1321
  }
1301
1322
  }
1302
1323
  /**
@@ -6224,6 +6245,80 @@ Logger$1.useDefaults({
6224
6245
  },
6225
6246
  });
6226
6247
 
6248
+ var MediaFamily;
6249
+ (function (MediaFamily) {
6250
+ MediaFamily["Audio"] = "AUDIO";
6251
+ MediaFamily["Video"] = "VIDEO";
6252
+ })(MediaFamily || (MediaFamily = {}));
6253
+ var MediaContent;
6254
+ (function (MediaContent) {
6255
+ MediaContent["Main"] = "MAIN";
6256
+ MediaContent["Slides"] = "SLIDES";
6257
+ })(MediaContent || (MediaContent = {}));
6258
+ var Policy;
6259
+ (function (Policy) {
6260
+ Policy["ActiveSpeaker"] = "active-speaker";
6261
+ Policy["ReceiverSelected"] = "receiver-selected";
6262
+ })(Policy || (Policy = {}));
6263
+ var MediaType;
6264
+ (function (MediaType) {
6265
+ MediaType["VideoMain"] = "VIDEO-MAIN";
6266
+ MediaType["VideoSlides"] = "VIDEO-SLIDES";
6267
+ MediaType["AudioMain"] = "AUDIO-MAIN";
6268
+ MediaType["AudioSlides"] = "AUDIO-SLIDES";
6269
+ })(MediaType || (MediaType = {}));
6270
+
6271
+ function randomInteger(min, max) {
6272
+ return Math.floor(Math.random() * (max - min + 1)) + min;
6273
+ }
6274
+ function generateSceneId() {
6275
+ return randomInteger(0, 0x7fffff);
6276
+ }
6277
+ function generateCsi(mediaFamily, sceneId) {
6278
+ let av;
6279
+ if (mediaFamily === MediaFamily.Audio) {
6280
+ av = 0;
6281
+ }
6282
+ else {
6283
+ av = 1;
6284
+ }
6285
+ return (sceneId << 8) | av;
6286
+ }
6287
+ function getMediaType(mediaFamily, mediaContent) {
6288
+ if (mediaFamily === MediaFamily.Video && mediaContent === MediaContent.Main) {
6289
+ return MediaType.VideoMain;
6290
+ }
6291
+ if (mediaFamily === MediaFamily.Video && mediaContent === MediaContent.Slides) {
6292
+ return MediaType.VideoSlides;
6293
+ }
6294
+ if (mediaFamily === MediaFamily.Audio && mediaContent === MediaContent.Main) {
6295
+ return MediaType.AudioMain;
6296
+ }
6297
+ return MediaType.AudioSlides;
6298
+ }
6299
+ function getMediaFamily(mediaType) {
6300
+ return [MediaType.VideoMain, MediaType.VideoSlides].includes(mediaType)
6301
+ ? MediaFamily.Video
6302
+ : MediaFamily.Audio;
6303
+ }
6304
+ function getMediaContent(mediaType) {
6305
+ return [MediaType.VideoMain, MediaType.AudioMain].includes(mediaType)
6306
+ ? MediaContent.Main
6307
+ : MediaContent.Slides;
6308
+ }
6309
+ const truthyOrZero = (value) => value === 0 || value;
6310
+ function arraysAreEqual(left, right, predicate) {
6311
+ if (left.length !== right.length) {
6312
+ return false;
6313
+ }
6314
+ for (let i = 0; i < left.length; i += 1) {
6315
+ if (!predicate(left[i], right[i])) {
6316
+ return false;
6317
+ }
6318
+ }
6319
+ return true;
6320
+ }
6321
+
6227
6322
  class ActiveSpeakerInfo {
6228
6323
  constructor(priority, crossPriorityDuplication, crossPolicyDuplication, preferLiveVideo, namedMediaGroups) {
6229
6324
  this.priority = priority;
@@ -6247,15 +6342,7 @@ function areNamedMediaGroupArraysEqual(left, right) {
6247
6342
  if (left === undefined || right === undefined) {
6248
6343
  return left === right;
6249
6344
  }
6250
- if (left.length !== right.length) {
6251
- return false;
6252
- }
6253
- for (let i = 0; i < left.length; i += 1) {
6254
- if (left[i] !== right[i]) {
6255
- return false;
6256
- }
6257
- }
6258
- return true;
6345
+ return arraysAreEqual(left, right, (l, r) => l.type === r.type && l.value === r.value);
6259
6346
  }
6260
6347
  function areActiveSpeakerInfosEqual(left, right) {
6261
6348
  return (left.priority === right.priority &&
@@ -6457,69 +6544,6 @@ function areReceiverSelectedInfosEqual(left, right) {
6457
6544
  return left.csi === right.csi;
6458
6545
  }
6459
6546
 
6460
- var MediaFamily;
6461
- (function (MediaFamily) {
6462
- MediaFamily["Audio"] = "AUDIO";
6463
- MediaFamily["Video"] = "VIDEO";
6464
- })(MediaFamily || (MediaFamily = {}));
6465
- var MediaContent;
6466
- (function (MediaContent) {
6467
- MediaContent["Main"] = "MAIN";
6468
- MediaContent["Slides"] = "SLIDES";
6469
- })(MediaContent || (MediaContent = {}));
6470
- var Policy;
6471
- (function (Policy) {
6472
- Policy["ActiveSpeaker"] = "active-speaker";
6473
- Policy["ReceiverSelected"] = "receiver-selected";
6474
- })(Policy || (Policy = {}));
6475
- var MediaType;
6476
- (function (MediaType) {
6477
- MediaType["VideoMain"] = "VIDEO-MAIN";
6478
- MediaType["VideoSlides"] = "VIDEO-SLIDES";
6479
- MediaType["AudioMain"] = "AUDIO-MAIN";
6480
- MediaType["AudioSlides"] = "AUDIO-SLIDES";
6481
- })(MediaType || (MediaType = {}));
6482
-
6483
- function randomInteger(min, max) {
6484
- return Math.floor(Math.random() * (max - min + 1)) + min;
6485
- }
6486
- function generateSceneId() {
6487
- return randomInteger(0, 0x7fffff);
6488
- }
6489
- function generateCsi(mediaFamily, sceneId) {
6490
- let av;
6491
- if (mediaFamily === MediaFamily.Audio) {
6492
- av = 0;
6493
- }
6494
- else {
6495
- av = 1;
6496
- }
6497
- return (sceneId << 8) | av;
6498
- }
6499
- function getMediaType(mediaFamily, mediaContent) {
6500
- if (mediaFamily === MediaFamily.Video && mediaContent === MediaContent.Main) {
6501
- return MediaType.VideoMain;
6502
- }
6503
- if (mediaFamily === MediaFamily.Video && mediaContent === MediaContent.Slides) {
6504
- return MediaType.VideoSlides;
6505
- }
6506
- if (mediaFamily === MediaFamily.Audio && mediaContent === MediaContent.Main) {
6507
- return MediaType.AudioMain;
6508
- }
6509
- return MediaType.AudioSlides;
6510
- }
6511
- function getMediaFamily(mediaType) {
6512
- return [MediaType.VideoMain, MediaType.VideoSlides].includes(mediaType)
6513
- ? MediaFamily.Video
6514
- : MediaFamily.Audio;
6515
- }
6516
- function getMediaContent(mediaType) {
6517
- return [MediaType.VideoMain, MediaType.AudioMain].includes(mediaType)
6518
- ? MediaContent.Main
6519
- : MediaContent.Slides;
6520
- }
6521
- const truthyOrZero = (value) => value === 0 || value;
6522
-
6523
6547
  class SourceAdvertisementMsg {
6524
6548
  constructor(seqNum, numTotalSources, numLiveSources, namedMediaGroups, videoContentHint) {
6525
6549
  this.seqNum = seqNum;
@@ -6580,26 +6604,10 @@ function arePolicySpecificInfosEqual(left, right) {
6580
6604
  throw new Error('Invalid PolicySpecificInfo');
6581
6605
  }
6582
6606
  function areCodecInfoArraysEqual(left, right) {
6583
- if (left.length !== right.length) {
6584
- return false;
6585
- }
6586
- for (let i = 0; i < left.length; i += 1) {
6587
- if (!areCodecInfosEqual(left[i], right[i])) {
6588
- return false;
6589
- }
6590
- }
6591
- return true;
6607
+ return arraysAreEqual(left, right, areCodecInfosEqual);
6592
6608
  }
6593
6609
  function areStreamIdArraysEqual(left, right) {
6594
- if (left.length !== right.length) {
6595
- return false;
6596
- }
6597
- for (let i = 0; i < left.length; i += 1) {
6598
- if (!compareStreamIds(left[i], right[i])) {
6599
- return false;
6600
- }
6601
- }
6602
- return true;
6610
+ return arraysAreEqual(left, right, compareStreamIds);
6603
6611
  }
6604
6612
  function areStreamRequestsEqual(left, right) {
6605
6613
  if (left.policy !== right.policy) {
@@ -6671,7 +6679,7 @@ function areStreamRequestArraysEqual(left, right) {
6671
6679
  return true;
6672
6680
  }
6673
6681
  class JmpSession extends EventEmitter$5 {
6674
- constructor(mediaFamily, mediaContent, maxNumRetransmits = 3, retransmitIntervalMs = 250) {
6682
+ constructor(mediaFamily, mediaContent, maxNumRetransmits = 200, retransmitIntervalMs = 250) {
6675
6683
  super();
6676
6684
  this.currMediaRequestSeqNum = 1;
6677
6685
  this.currSourceAdvertisementSeqNum = 1;
@@ -6696,16 +6704,25 @@ class JmpSession extends EventEmitter$5 {
6696
6704
  !areStreamRequestArraysEqual(this.lastSentMediaRequest.msg.requests, requests)) {
6697
6705
  this.sendJmpMsg(JmpMsgType.MediaRequest, mediaRequestMsg);
6698
6706
  (_a = this.lastSentMediaRequest) === null || _a === void 0 ? void 0 : _a.cancel();
6699
- this.lastSentMediaRequest = new RetransmitHandler(mediaRequestMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => this.sendJmpMsg(JmpMsgType.MediaRequest, mediaRequestMsg), (expiredJmpMsg) => {
6707
+ this.lastSentMediaRequest = new RetransmitHandler(mediaRequestMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => {
6708
+ this.logger.info(`Retransmitting previously sent MediaRequest...`);
6709
+ this.sendJmpMsg(JmpMsgType.MediaRequest, mediaRequestMsg);
6710
+ }, (expiredJmpMsg) => {
6700
6711
  this.logger.warn(`Retransmits for message expired: ${expiredJmpMsg}`);
6701
6712
  });
6702
6713
  this.currMediaRequestSeqNum++;
6703
6714
  }
6715
+ else {
6716
+ this.logger.info(`Duplicate MediaRequest detected and will not be sent: ${mediaRequestMsg}`);
6717
+ }
6704
6718
  }
6705
6719
  sendSourceAdvertisement(numTotalSources, numLiveSources, namedMediaGroups, videoContentHint) {
6706
6720
  const sourceAdvertisementMsg = new SourceAdvertisementMsg(this.currSourceAdvertisementSeqNum++, numTotalSources, numLiveSources, namedMediaGroups, videoContentHint);
6707
6721
  this.sendJmpMsg(JmpMsgType.SourceAdvertisement, sourceAdvertisementMsg);
6708
- this.lastSentSourceAdvertisement = new RetransmitHandler(sourceAdvertisementMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => this.sendJmpMsg(JmpMsgType.SourceAdvertisement, sourceAdvertisementMsg), (expiredMsg) => {
6722
+ this.lastSentSourceAdvertisement = new RetransmitHandler(sourceAdvertisementMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => {
6723
+ this.logger.info(`Retransmitting previously sent SourceAdvertisement...`);
6724
+ this.sendJmpMsg(JmpMsgType.SourceAdvertisement, sourceAdvertisementMsg);
6725
+ }, (expiredMsg) => {
6709
6726
  this.logger.warn(`Retransmits for message expired: `, expiredMsg);
6710
6727
  });
6711
6728
  }
@@ -6720,11 +6737,17 @@ class JmpSession extends EventEmitter$5 {
6720
6737
  !compareStreamStateArrays(filteredStreamStates, this.lastSentMediaRequestStatus.msg.streamStates)) {
6721
6738
  this.sendJmpMsg(JmpMsgType.MediaRequestStatus, mediaRequestStatus);
6722
6739
  (_b = this.lastSentMediaRequestStatus) === null || _b === void 0 ? void 0 : _b.cancel();
6723
- this.lastSentMediaRequestStatus = new RetransmitHandler(mediaRequestStatus, this.maxNumRetransmits, this.retransmitIntervalMs, () => this.sendJmpMsg(JmpMsgType.MediaRequestStatus, mediaRequestStatus), (expiredMsg) => {
6740
+ this.lastSentMediaRequestStatus = new RetransmitHandler(mediaRequestStatus, this.maxNumRetransmits, this.retransmitIntervalMs, () => {
6741
+ this.logger.info(`Retransmitting previously sent MediaRequestStatus...`);
6742
+ this.sendJmpMsg(JmpMsgType.MediaRequestStatus, mediaRequestStatus);
6743
+ }, (expiredMsg) => {
6724
6744
  this.logger.warn(`Retransmits for message expired: `, expiredMsg);
6725
6745
  });
6726
6746
  this.currMediaRequestStatusSeqNum++;
6727
6747
  }
6748
+ else {
6749
+ this.logger.info(`Duplicate MediaRequestStatus detected and will not be sent: `, mediaRequestStatus);
6750
+ }
6728
6751
  }
6729
6752
  receive(jmpMsg) {
6730
6753
  if (jmpMsg.mediaContent !== this.mediaContent || jmpMsg.mediaFamily !== this.mediaFamily) {
@@ -6921,6 +6944,26 @@ class JmpSession extends EventEmitter$5 {
6921
6944
  }
6922
6945
  }
6923
6946
 
6947
+ var WcmeErrorType;
6948
+ (function (WcmeErrorType) {
6949
+ WcmeErrorType["CREATE_OFFER_FAILED"] = "CREATE_OFFER_FAILED";
6950
+ WcmeErrorType["SET_ANSWER_FAILED"] = "SET_ANSWER_FAILED";
6951
+ WcmeErrorType["OFFER_ANSWER_MISMATCH"] = "OFFER_ANSWER_MISMATCH";
6952
+ WcmeErrorType["SDP_MUNGE_FAILED"] = "SDP_MUNGE_FAILED";
6953
+ WcmeErrorType["SDP_MUNGE_MISSING_CODECS"] = "SDP_MUNGE_MISSING_CODECS";
6954
+ WcmeErrorType["INVALID_STREAM_REQUEST"] = "INVALID_STREAM_REQUEST";
6955
+ WcmeErrorType["GET_TRANSCEIVER_FAILED"] = "GET_TRANSCEIVER_FAILED";
6956
+ WcmeErrorType["GET_MAX_BITRATE_FAILED"] = "GET_MAX_BITRATE_FAILED";
6957
+ WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"] = "GET_PAYLOAD_TYPE_FAILED";
6958
+ WcmeErrorType["SET_NMG_FAILED"] = "SET_NMG_FAILED";
6959
+ })(WcmeErrorType || (WcmeErrorType = {}));
6960
+ class WcmeError {
6961
+ constructor(type, message = '') {
6962
+ this.type = type;
6963
+ this.message = message;
6964
+ }
6965
+ }
6966
+
6924
6967
  var commonjsGlobal$1 = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
6925
6968
 
6926
6969
  var logger$1 = {exports: {}};
@@ -7207,26 +7250,6 @@ var logger$1 = {exports: {}};
7207
7250
 
7208
7251
  var Logger = logger$1.exports;
7209
7252
 
7210
- var WcmeErrorType;
7211
- (function (WcmeErrorType) {
7212
- WcmeErrorType["CREATE_OFFER_FAILED"] = "CREATE_OFFER_FAILED";
7213
- WcmeErrorType["SET_ANSWER_FAILED"] = "SET_ANSWER_FAILED";
7214
- WcmeErrorType["OFFER_ANSWER_MISMATCH"] = "OFFER_ANSWER_MISMATCH";
7215
- WcmeErrorType["SDP_MUNGE_FAILED"] = "SDP_MUNGE_FAILED";
7216
- WcmeErrorType["SDP_MUNGE_MISSING_CODECS"] = "SDP_MUNGE_MISSING_CODECS";
7217
- WcmeErrorType["INVALID_STREAM_REQUEST"] = "INVALID_STREAM_REQUEST";
7218
- WcmeErrorType["GET_TRANSCEIVER_FAILED"] = "GET_TRANSCEIVER_FAILED";
7219
- WcmeErrorType["GET_MAX_BITRATE_FAILED"] = "GET_MAX_BITRATE_FAILED";
7220
- WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"] = "GET_PAYLOAD_TYPE_FAILED";
7221
- WcmeErrorType["SET_NMG_FAILED"] = "SET_NMG_FAILED";
7222
- })(WcmeErrorType || (WcmeErrorType = {}));
7223
- class WcmeError {
7224
- constructor(type, message = '') {
7225
- this.type = type;
7226
- this.message = message;
7227
- }
7228
- }
7229
-
7230
7253
  const DEFAULT_LOGGER_NAME = 'web-client-media-engine';
7231
7254
  const logger = Logger.get(DEFAULT_LOGGER_NAME);
7232
7255
  logger.setLevel(Logger.DEBUG);
@@ -14512,8 +14535,8 @@ class MultistreamConnection extends EventEmitter$2 {
14512
14535
  ordered: false,
14513
14536
  maxRetransmits: 0,
14514
14537
  });
14515
- dataChannel.onopen = (e) => {
14516
- logger.info('DataChannel opened: ', e);
14538
+ dataChannel.onopen = (event) => {
14539
+ logger.info('DataChannel opened:', JSON.stringify(event));
14517
14540
  [...this.sendTransceivers.keys()].forEach((mediaType) => {
14518
14541
  this.sendSourceAdvertisement(mediaType);
14519
14542
  });
@@ -14549,11 +14572,11 @@ class MultistreamConnection extends EventEmitter$2 {
14549
14572
  }
14550
14573
  jmpSession.receive(jmpMsg);
14551
14574
  };
14552
- dataChannel.onclose = (e) => {
14553
- logger.info('DataChannel closed: ', e);
14575
+ dataChannel.onclose = (event) => {
14576
+ logger.info('DataChannel closed:', JSON.stringify(event));
14554
14577
  };
14555
- dataChannel.onerror = (e) => {
14556
- logger.info('DataChannel error: ', e);
14578
+ dataChannel.onerror = (event) => {
14579
+ logger.info('DataChannel error:', JSON.stringify(event));
14557
14580
  };
14558
14581
  this.dataChannel = dataChannel;
14559
14582
  }