@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/cjs/index.js CHANGED
@@ -1285,11 +1285,30 @@ class _LocalStream extends Stream {
1285
1285
  get inputTrack() {
1286
1286
  return this.inputStream.getTracks()[0];
1287
1287
  }
1288
+ /**
1289
+ * @inheritdoc
1290
+ */
1291
+ handleTrackMuted() {
1292
+ if (this.inputTrack.enabled) {
1293
+ super.handleTrackMuted();
1294
+ }
1295
+ }
1296
+ /**
1297
+ * @inheritdoc
1298
+ */
1299
+ handleTrackUnmuted() {
1300
+ if (this.inputTrack.enabled) {
1301
+ super.handleTrackUnmuted();
1302
+ }
1303
+ }
1288
1304
  /**
1289
1305
  * @inheritdoc
1290
1306
  */
1291
1307
  get muted() {
1292
- return !this.inputTrack.enabled;
1308
+ // Calls to `setMuted` will only affect the "enabled" state, but there are specific cases in
1309
+ // which the browser may mute the track, which will affect the "muted" state but not the
1310
+ // "enabled" state, e.g. minimizing a shared window or unplugging a shared screen.
1311
+ return !this.inputTrack.enabled || this.inputTrack.muted;
1293
1312
  }
1294
1313
  /**
1295
1314
  * Set the mute state of this stream.
@@ -1300,7 +1319,9 @@ class _LocalStream extends Stream {
1300
1319
  if (this.inputTrack.enabled === isMuted) {
1301
1320
  this.inputTrack.enabled = !isMuted;
1302
1321
  // setting `enabled` will not automatically emit MuteStateChange, so we emit it here
1303
- this[exports.StreamEventNames.MuteStateChange].emit(isMuted);
1322
+ if (!this.inputTrack.muted) {
1323
+ this[exports.StreamEventNames.MuteStateChange].emit(isMuted);
1324
+ }
1304
1325
  }
1305
1326
  }
1306
1327
  /**
@@ -6228,6 +6249,80 @@ Logger$1.useDefaults({
6228
6249
  },
6229
6250
  });
6230
6251
 
6252
+ exports.MediaFamily = void 0;
6253
+ (function (MediaFamily) {
6254
+ MediaFamily["Audio"] = "AUDIO";
6255
+ MediaFamily["Video"] = "VIDEO";
6256
+ })(exports.MediaFamily || (exports.MediaFamily = {}));
6257
+ exports.MediaContent = void 0;
6258
+ (function (MediaContent) {
6259
+ MediaContent["Main"] = "MAIN";
6260
+ MediaContent["Slides"] = "SLIDES";
6261
+ })(exports.MediaContent || (exports.MediaContent = {}));
6262
+ exports.Policy = void 0;
6263
+ (function (Policy) {
6264
+ Policy["ActiveSpeaker"] = "active-speaker";
6265
+ Policy["ReceiverSelected"] = "receiver-selected";
6266
+ })(exports.Policy || (exports.Policy = {}));
6267
+ exports.MediaType = void 0;
6268
+ (function (MediaType) {
6269
+ MediaType["VideoMain"] = "VIDEO-MAIN";
6270
+ MediaType["VideoSlides"] = "VIDEO-SLIDES";
6271
+ MediaType["AudioMain"] = "AUDIO-MAIN";
6272
+ MediaType["AudioSlides"] = "AUDIO-SLIDES";
6273
+ })(exports.MediaType || (exports.MediaType = {}));
6274
+
6275
+ function randomInteger(min, max) {
6276
+ return Math.floor(Math.random() * (max - min + 1)) + min;
6277
+ }
6278
+ function generateSceneId() {
6279
+ return randomInteger(0, 0x7fffff);
6280
+ }
6281
+ function generateCsi(mediaFamily, sceneId) {
6282
+ let av;
6283
+ if (mediaFamily === exports.MediaFamily.Audio) {
6284
+ av = 0;
6285
+ }
6286
+ else {
6287
+ av = 1;
6288
+ }
6289
+ return (sceneId << 8) | av;
6290
+ }
6291
+ function getMediaType(mediaFamily, mediaContent) {
6292
+ if (mediaFamily === exports.MediaFamily.Video && mediaContent === exports.MediaContent.Main) {
6293
+ return exports.MediaType.VideoMain;
6294
+ }
6295
+ if (mediaFamily === exports.MediaFamily.Video && mediaContent === exports.MediaContent.Slides) {
6296
+ return exports.MediaType.VideoSlides;
6297
+ }
6298
+ if (mediaFamily === exports.MediaFamily.Audio && mediaContent === exports.MediaContent.Main) {
6299
+ return exports.MediaType.AudioMain;
6300
+ }
6301
+ return exports.MediaType.AudioSlides;
6302
+ }
6303
+ function getMediaFamily(mediaType) {
6304
+ return [exports.MediaType.VideoMain, exports.MediaType.VideoSlides].includes(mediaType)
6305
+ ? exports.MediaFamily.Video
6306
+ : exports.MediaFamily.Audio;
6307
+ }
6308
+ function getMediaContent(mediaType) {
6309
+ return [exports.MediaType.VideoMain, exports.MediaType.AudioMain].includes(mediaType)
6310
+ ? exports.MediaContent.Main
6311
+ : exports.MediaContent.Slides;
6312
+ }
6313
+ const truthyOrZero = (value) => value === 0 || value;
6314
+ function arraysAreEqual(left, right, predicate) {
6315
+ if (left.length !== right.length) {
6316
+ return false;
6317
+ }
6318
+ for (let i = 0; i < left.length; i += 1) {
6319
+ if (!predicate(left[i], right[i])) {
6320
+ return false;
6321
+ }
6322
+ }
6323
+ return true;
6324
+ }
6325
+
6231
6326
  class ActiveSpeakerInfo {
6232
6327
  constructor(priority, crossPriorityDuplication, crossPolicyDuplication, preferLiveVideo, namedMediaGroups) {
6233
6328
  this.priority = priority;
@@ -6251,15 +6346,7 @@ function areNamedMediaGroupArraysEqual(left, right) {
6251
6346
  if (left === undefined || right === undefined) {
6252
6347
  return left === right;
6253
6348
  }
6254
- if (left.length !== right.length) {
6255
- return false;
6256
- }
6257
- for (let i = 0; i < left.length; i += 1) {
6258
- if (left[i] !== right[i]) {
6259
- return false;
6260
- }
6261
- }
6262
- return true;
6349
+ return arraysAreEqual(left, right, (l, r) => l.type === r.type && l.value === r.value);
6263
6350
  }
6264
6351
  function areActiveSpeakerInfosEqual(left, right) {
6265
6352
  return (left.priority === right.priority &&
@@ -6461,69 +6548,6 @@ function areReceiverSelectedInfosEqual(left, right) {
6461
6548
  return left.csi === right.csi;
6462
6549
  }
6463
6550
 
6464
- exports.MediaFamily = void 0;
6465
- (function (MediaFamily) {
6466
- MediaFamily["Audio"] = "AUDIO";
6467
- MediaFamily["Video"] = "VIDEO";
6468
- })(exports.MediaFamily || (exports.MediaFamily = {}));
6469
- exports.MediaContent = void 0;
6470
- (function (MediaContent) {
6471
- MediaContent["Main"] = "MAIN";
6472
- MediaContent["Slides"] = "SLIDES";
6473
- })(exports.MediaContent || (exports.MediaContent = {}));
6474
- exports.Policy = void 0;
6475
- (function (Policy) {
6476
- Policy["ActiveSpeaker"] = "active-speaker";
6477
- Policy["ReceiverSelected"] = "receiver-selected";
6478
- })(exports.Policy || (exports.Policy = {}));
6479
- exports.MediaType = void 0;
6480
- (function (MediaType) {
6481
- MediaType["VideoMain"] = "VIDEO-MAIN";
6482
- MediaType["VideoSlides"] = "VIDEO-SLIDES";
6483
- MediaType["AudioMain"] = "AUDIO-MAIN";
6484
- MediaType["AudioSlides"] = "AUDIO-SLIDES";
6485
- })(exports.MediaType || (exports.MediaType = {}));
6486
-
6487
- function randomInteger(min, max) {
6488
- return Math.floor(Math.random() * (max - min + 1)) + min;
6489
- }
6490
- function generateSceneId() {
6491
- return randomInteger(0, 0x7fffff);
6492
- }
6493
- function generateCsi(mediaFamily, sceneId) {
6494
- let av;
6495
- if (mediaFamily === exports.MediaFamily.Audio) {
6496
- av = 0;
6497
- }
6498
- else {
6499
- av = 1;
6500
- }
6501
- return (sceneId << 8) | av;
6502
- }
6503
- function getMediaType(mediaFamily, mediaContent) {
6504
- if (mediaFamily === exports.MediaFamily.Video && mediaContent === exports.MediaContent.Main) {
6505
- return exports.MediaType.VideoMain;
6506
- }
6507
- if (mediaFamily === exports.MediaFamily.Video && mediaContent === exports.MediaContent.Slides) {
6508
- return exports.MediaType.VideoSlides;
6509
- }
6510
- if (mediaFamily === exports.MediaFamily.Audio && mediaContent === exports.MediaContent.Main) {
6511
- return exports.MediaType.AudioMain;
6512
- }
6513
- return exports.MediaType.AudioSlides;
6514
- }
6515
- function getMediaFamily(mediaType) {
6516
- return [exports.MediaType.VideoMain, exports.MediaType.VideoSlides].includes(mediaType)
6517
- ? exports.MediaFamily.Video
6518
- : exports.MediaFamily.Audio;
6519
- }
6520
- function getMediaContent(mediaType) {
6521
- return [exports.MediaType.VideoMain, exports.MediaType.AudioMain].includes(mediaType)
6522
- ? exports.MediaContent.Main
6523
- : exports.MediaContent.Slides;
6524
- }
6525
- const truthyOrZero = (value) => value === 0 || value;
6526
-
6527
6551
  class SourceAdvertisementMsg {
6528
6552
  constructor(seqNum, numTotalSources, numLiveSources, namedMediaGroups, videoContentHint) {
6529
6553
  this.seqNum = seqNum;
@@ -6584,26 +6608,10 @@ function arePolicySpecificInfosEqual(left, right) {
6584
6608
  throw new Error('Invalid PolicySpecificInfo');
6585
6609
  }
6586
6610
  function areCodecInfoArraysEqual(left, right) {
6587
- if (left.length !== right.length) {
6588
- return false;
6589
- }
6590
- for (let i = 0; i < left.length; i += 1) {
6591
- if (!areCodecInfosEqual(left[i], right[i])) {
6592
- return false;
6593
- }
6594
- }
6595
- return true;
6611
+ return arraysAreEqual(left, right, areCodecInfosEqual);
6596
6612
  }
6597
6613
  function areStreamIdArraysEqual(left, right) {
6598
- if (left.length !== right.length) {
6599
- return false;
6600
- }
6601
- for (let i = 0; i < left.length; i += 1) {
6602
- if (!compareStreamIds(left[i], right[i])) {
6603
- return false;
6604
- }
6605
- }
6606
- return true;
6614
+ return arraysAreEqual(left, right, compareStreamIds);
6607
6615
  }
6608
6616
  function areStreamRequestsEqual(left, right) {
6609
6617
  if (left.policy !== right.policy) {
@@ -6675,7 +6683,7 @@ function areStreamRequestArraysEqual(left, right) {
6675
6683
  return true;
6676
6684
  }
6677
6685
  class JmpSession extends events$3.EventEmitter {
6678
- constructor(mediaFamily, mediaContent, maxNumRetransmits = 3, retransmitIntervalMs = 250) {
6686
+ constructor(mediaFamily, mediaContent, maxNumRetransmits = 200, retransmitIntervalMs = 250) {
6679
6687
  super();
6680
6688
  this.currMediaRequestSeqNum = 1;
6681
6689
  this.currSourceAdvertisementSeqNum = 1;
@@ -6700,16 +6708,25 @@ class JmpSession extends events$3.EventEmitter {
6700
6708
  !areStreamRequestArraysEqual(this.lastSentMediaRequest.msg.requests, requests)) {
6701
6709
  this.sendJmpMsg(JmpMsgType.MediaRequest, mediaRequestMsg);
6702
6710
  (_a = this.lastSentMediaRequest) === null || _a === void 0 ? void 0 : _a.cancel();
6703
- this.lastSentMediaRequest = new RetransmitHandler(mediaRequestMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => this.sendJmpMsg(JmpMsgType.MediaRequest, mediaRequestMsg), (expiredJmpMsg) => {
6711
+ this.lastSentMediaRequest = new RetransmitHandler(mediaRequestMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => {
6712
+ this.logger.info(`Retransmitting previously sent MediaRequest...`);
6713
+ this.sendJmpMsg(JmpMsgType.MediaRequest, mediaRequestMsg);
6714
+ }, (expiredJmpMsg) => {
6704
6715
  this.logger.warn(`Retransmits for message expired: ${expiredJmpMsg}`);
6705
6716
  });
6706
6717
  this.currMediaRequestSeqNum++;
6707
6718
  }
6719
+ else {
6720
+ this.logger.info(`Duplicate MediaRequest detected and will not be sent: ${mediaRequestMsg}`);
6721
+ }
6708
6722
  }
6709
6723
  sendSourceAdvertisement(numTotalSources, numLiveSources, namedMediaGroups, videoContentHint) {
6710
6724
  const sourceAdvertisementMsg = new SourceAdvertisementMsg(this.currSourceAdvertisementSeqNum++, numTotalSources, numLiveSources, namedMediaGroups, videoContentHint);
6711
6725
  this.sendJmpMsg(JmpMsgType.SourceAdvertisement, sourceAdvertisementMsg);
6712
- this.lastSentSourceAdvertisement = new RetransmitHandler(sourceAdvertisementMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => this.sendJmpMsg(JmpMsgType.SourceAdvertisement, sourceAdvertisementMsg), (expiredMsg) => {
6726
+ this.lastSentSourceAdvertisement = new RetransmitHandler(sourceAdvertisementMsg, this.maxNumRetransmits, this.retransmitIntervalMs, () => {
6727
+ this.logger.info(`Retransmitting previously sent SourceAdvertisement...`);
6728
+ this.sendJmpMsg(JmpMsgType.SourceAdvertisement, sourceAdvertisementMsg);
6729
+ }, (expiredMsg) => {
6713
6730
  this.logger.warn(`Retransmits for message expired: `, expiredMsg);
6714
6731
  });
6715
6732
  }
@@ -6724,11 +6741,17 @@ class JmpSession extends events$3.EventEmitter {
6724
6741
  !compareStreamStateArrays(filteredStreamStates, this.lastSentMediaRequestStatus.msg.streamStates)) {
6725
6742
  this.sendJmpMsg(JmpMsgType.MediaRequestStatus, mediaRequestStatus);
6726
6743
  (_b = this.lastSentMediaRequestStatus) === null || _b === void 0 ? void 0 : _b.cancel();
6727
- this.lastSentMediaRequestStatus = new RetransmitHandler(mediaRequestStatus, this.maxNumRetransmits, this.retransmitIntervalMs, () => this.sendJmpMsg(JmpMsgType.MediaRequestStatus, mediaRequestStatus), (expiredMsg) => {
6744
+ this.lastSentMediaRequestStatus = new RetransmitHandler(mediaRequestStatus, this.maxNumRetransmits, this.retransmitIntervalMs, () => {
6745
+ this.logger.info(`Retransmitting previously sent MediaRequestStatus...`);
6746
+ this.sendJmpMsg(JmpMsgType.MediaRequestStatus, mediaRequestStatus);
6747
+ }, (expiredMsg) => {
6728
6748
  this.logger.warn(`Retransmits for message expired: `, expiredMsg);
6729
6749
  });
6730
6750
  this.currMediaRequestStatusSeqNum++;
6731
6751
  }
6752
+ else {
6753
+ this.logger.info(`Duplicate MediaRequestStatus detected and will not be sent: `, mediaRequestStatus);
6754
+ }
6732
6755
  }
6733
6756
  receive(jmpMsg) {
6734
6757
  if (jmpMsg.mediaContent !== this.mediaContent || jmpMsg.mediaFamily !== this.mediaFamily) {
@@ -6925,6 +6948,26 @@ class JmpSession extends events$3.EventEmitter {
6925
6948
  }
6926
6949
  }
6927
6950
 
6951
+ exports.WcmeErrorType = void 0;
6952
+ (function (WcmeErrorType) {
6953
+ WcmeErrorType["CREATE_OFFER_FAILED"] = "CREATE_OFFER_FAILED";
6954
+ WcmeErrorType["SET_ANSWER_FAILED"] = "SET_ANSWER_FAILED";
6955
+ WcmeErrorType["OFFER_ANSWER_MISMATCH"] = "OFFER_ANSWER_MISMATCH";
6956
+ WcmeErrorType["SDP_MUNGE_FAILED"] = "SDP_MUNGE_FAILED";
6957
+ WcmeErrorType["SDP_MUNGE_MISSING_CODECS"] = "SDP_MUNGE_MISSING_CODECS";
6958
+ WcmeErrorType["INVALID_STREAM_REQUEST"] = "INVALID_STREAM_REQUEST";
6959
+ WcmeErrorType["GET_TRANSCEIVER_FAILED"] = "GET_TRANSCEIVER_FAILED";
6960
+ WcmeErrorType["GET_MAX_BITRATE_FAILED"] = "GET_MAX_BITRATE_FAILED";
6961
+ WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"] = "GET_PAYLOAD_TYPE_FAILED";
6962
+ WcmeErrorType["SET_NMG_FAILED"] = "SET_NMG_FAILED";
6963
+ })(exports.WcmeErrorType || (exports.WcmeErrorType = {}));
6964
+ class WcmeError {
6965
+ constructor(type, message = '') {
6966
+ this.type = type;
6967
+ this.message = message;
6968
+ }
6969
+ }
6970
+
6928
6971
  var commonjsGlobal$1 = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
6929
6972
 
6930
6973
  var logger$1 = {exports: {}};
@@ -7211,26 +7254,6 @@ var logger$1 = {exports: {}};
7211
7254
 
7212
7255
  var Logger = logger$1.exports;
7213
7256
 
7214
- exports.WcmeErrorType = void 0;
7215
- (function (WcmeErrorType) {
7216
- WcmeErrorType["CREATE_OFFER_FAILED"] = "CREATE_OFFER_FAILED";
7217
- WcmeErrorType["SET_ANSWER_FAILED"] = "SET_ANSWER_FAILED";
7218
- WcmeErrorType["OFFER_ANSWER_MISMATCH"] = "OFFER_ANSWER_MISMATCH";
7219
- WcmeErrorType["SDP_MUNGE_FAILED"] = "SDP_MUNGE_FAILED";
7220
- WcmeErrorType["SDP_MUNGE_MISSING_CODECS"] = "SDP_MUNGE_MISSING_CODECS";
7221
- WcmeErrorType["INVALID_STREAM_REQUEST"] = "INVALID_STREAM_REQUEST";
7222
- WcmeErrorType["GET_TRANSCEIVER_FAILED"] = "GET_TRANSCEIVER_FAILED";
7223
- WcmeErrorType["GET_MAX_BITRATE_FAILED"] = "GET_MAX_BITRATE_FAILED";
7224
- WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"] = "GET_PAYLOAD_TYPE_FAILED";
7225
- WcmeErrorType["SET_NMG_FAILED"] = "SET_NMG_FAILED";
7226
- })(exports.WcmeErrorType || (exports.WcmeErrorType = {}));
7227
- class WcmeError {
7228
- constructor(type, message = '') {
7229
- this.type = type;
7230
- this.message = message;
7231
- }
7232
- }
7233
-
7234
7257
  const DEFAULT_LOGGER_NAME = 'web-client-media-engine';
7235
7258
  const logger = Logger.get(DEFAULT_LOGGER_NAME);
7236
7259
  logger.setLevel(Logger.DEBUG);
@@ -14516,8 +14539,8 @@ class MultistreamConnection extends EventEmitter$2 {
14516
14539
  ordered: false,
14517
14540
  maxRetransmits: 0,
14518
14541
  });
14519
- dataChannel.onopen = (e) => {
14520
- logger.info('DataChannel opened: ', e);
14542
+ dataChannel.onopen = (event) => {
14543
+ logger.info('DataChannel opened:', JSON.stringify(event));
14521
14544
  [...this.sendTransceivers.keys()].forEach((mediaType) => {
14522
14545
  this.sendSourceAdvertisement(mediaType);
14523
14546
  });
@@ -14553,11 +14576,11 @@ class MultistreamConnection extends EventEmitter$2 {
14553
14576
  }
14554
14577
  jmpSession.receive(jmpMsg);
14555
14578
  };
14556
- dataChannel.onclose = (e) => {
14557
- logger.info('DataChannel closed: ', e);
14579
+ dataChannel.onclose = (event) => {
14580
+ logger.info('DataChannel closed:', JSON.stringify(event));
14558
14581
  };
14559
- dataChannel.onerror = (e) => {
14560
- logger.info('DataChannel error: ', e);
14582
+ dataChannel.onerror = (event) => {
14583
+ logger.info('DataChannel error:', JSON.stringify(event));
14561
14584
  };
14562
14585
  this.dataChannel = dataChannel;
14563
14586
  }