@webex/web-client-media-engine 3.31.5 → 3.32.0

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
@@ -7218,6 +7218,7 @@ exports.WcmeErrorType = void 0;
7218
7218
  WcmeErrorType["GET_MAX_BITRATE_FAILED"] = "GET_MAX_BITRATE_FAILED";
7219
7219
  WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"] = "GET_PAYLOAD_TYPE_FAILED";
7220
7220
  WcmeErrorType["SET_NMG_FAILED"] = "SET_NMG_FAILED";
7221
+ WcmeErrorType["SET_SOURCE_STATE_OVERRIDE_FAILED"] = "SET_SOURCE_STATE_OVERRIDE_FAILED";
7221
7222
  WcmeErrorType["DATA_CHANNEL_SEND_FAILED"] = "DATA_CHANNEL_SEND_FAILED";
7222
7223
  WcmeErrorType["RENEW_PEER_CONNECTION_FAILED"] = "RENEW_PEER_CONNECTION_FAILED";
7223
7224
  })(exports.WcmeErrorType || (exports.WcmeErrorType = {}));
@@ -14526,6 +14527,7 @@ class SendOnlyTransceiver extends Transceiver {
14526
14527
  this.rtxEnabled = false;
14527
14528
  this.dtxDisabled = true;
14528
14529
  this.streamMuteStateChange = new TypedEvent();
14530
+ this.streamReadyStateChanged = new TypedEvent();
14529
14531
  this.streamPublishStateChange = new TypedEvent();
14530
14532
  this.negotiationNeeded = new TypedEvent();
14531
14533
  this.namedMediaGroupsChange = new TypedEvent();
@@ -14539,6 +14541,7 @@ class SendOnlyTransceiver extends Transceiver {
14539
14541
  this.handleTrackChange = this.handleTrackChange.bind(this);
14540
14542
  this.handleStreamConstraintsChange = this.handleStreamConstraintsChange.bind(this);
14541
14543
  this.handleStreamMuteStateChange = this.handleStreamMuteStateChange.bind(this);
14544
+ this.handleStreamEnded = this.handleStreamEnded.bind(this);
14542
14545
  }
14543
14546
  replaceSenderSource(stream) {
14544
14547
  var _a, _b;
@@ -14570,6 +14573,9 @@ class SendOnlyTransceiver extends Transceiver {
14570
14573
  handleStreamMuteStateChange() {
14571
14574
  this.streamMuteStateChange.emit();
14572
14575
  }
14576
+ handleStreamEnded() {
14577
+ this.streamReadyStateChanged.emit();
14578
+ }
14573
14579
  get requested() {
14574
14580
  return this.requestedIdEncodingParamsMap.size > 0;
14575
14581
  }
@@ -14592,6 +14598,7 @@ class SendOnlyTransceiver extends Transceiver {
14592
14598
  oldStream === null || oldStream === void 0 ? void 0 : oldStream.off(exports.LocalStreamEventNames.ConstraintsChange, this.handleStreamConstraintsChange);
14593
14599
  oldStream === null || oldStream === void 0 ? void 0 : oldStream.off(exports.LocalStreamEventNames.UserMuteStateChange, this.handleStreamMuteStateChange);
14594
14600
  oldStream === null || oldStream === void 0 ? void 0 : oldStream.off(exports.LocalStreamEventNames.SystemMuteStateChange, this.handleStreamMuteStateChange);
14601
+ oldStream === null || oldStream === void 0 ? void 0 : oldStream.off(exports.StreamEventNames.Ended, this.handleStreamEnded);
14595
14602
  if (this.requested) {
14596
14603
  yield this.replaceSenderSource(newStream);
14597
14604
  }
@@ -14600,12 +14607,17 @@ class SendOnlyTransceiver extends Transceiver {
14600
14607
  newStream === null || newStream === void 0 ? void 0 : newStream.on(exports.LocalStreamEventNames.ConstraintsChange, this.handleStreamConstraintsChange);
14601
14608
  newStream === null || newStream === void 0 ? void 0 : newStream.on(exports.LocalStreamEventNames.UserMuteStateChange, this.handleStreamMuteStateChange);
14602
14609
  newStream === null || newStream === void 0 ? void 0 : newStream.on(exports.LocalStreamEventNames.SystemMuteStateChange, this.handleStreamMuteStateChange);
14603
- if ((!oldStream && newStream && !newStream.muted) ||
14604
- (oldStream && !newStream && !oldStream.muted)) {
14610
+ newStream === null || newStream === void 0 ? void 0 : newStream.on(exports.StreamEventNames.Ended, this.handleStreamEnded);
14611
+ if ((!oldStream && newStream) || (oldStream && !newStream)) {
14605
14612
  this.streamPublishStateChange.emit();
14606
14613
  }
14607
- else if ((oldStream === null || oldStream === void 0 ? void 0 : oldStream.muted) !== (newStream === null || newStream === void 0 ? void 0 : newStream.muted)) {
14608
- this.streamMuteStateChange.emit();
14614
+ if (oldStream && newStream) {
14615
+ if (oldStream.muted !== newStream.muted) {
14616
+ this.streamMuteStateChange.emit();
14617
+ }
14618
+ if (oldStream.readyState !== newStream.readyState) {
14619
+ this.streamReadyStateChanged.emit();
14620
+ }
14609
14621
  }
14610
14622
  });
14611
14623
  }
@@ -14641,6 +14653,7 @@ class SendOnlyTransceiver extends Transceiver {
14641
14653
  if (stats.type === 'outbound-rtp') {
14642
14654
  stats.mid = this.mid;
14643
14655
  stats.csi = this.csi;
14656
+ stats.sourceState = this.currentSourceState;
14644
14657
  stats.calliopeMediaType = this.mediaType;
14645
14658
  const senderId = this.munger.getSenderIds().find((id) => id.ssrc === stats.ssrc);
14646
14659
  if (senderId) {
@@ -14774,10 +14787,16 @@ class SendOnlyTransceiver extends Transceiver {
14774
14787
  this.negotiationNeeded.emit(OfferAnswerType.LocalOnly);
14775
14788
  }
14776
14789
  setSourceStateOverride(state) {
14790
+ if (getMediaFamily(this.mediaType) !== exports.MediaFamily.Video) {
14791
+ logErrorAndThrow(exports.WcmeErrorType.SET_SOURCE_STATE_OVERRIDE_FAILED, `Source state can only be overridden for video.`);
14792
+ }
14777
14793
  this.sourceStateOverride = state;
14778
14794
  this.sourceStateOverrideChange.emit();
14779
14795
  }
14780
14796
  get currentSourceState() {
14797
+ if (getMediaFamily(this.mediaType) !== exports.MediaFamily.Video) {
14798
+ return undefined;
14799
+ }
14781
14800
  if (this.sourceStateOverride) {
14782
14801
  return this.sourceStateOverride;
14783
14802
  }
@@ -15091,6 +15110,10 @@ class MultistreamConnection extends EventEmitter$2 {
15091
15110
  this.sendSourceAdvertisement(mediaType);
15092
15111
  this.sendMediaRequestStatus(mediaType);
15093
15112
  });
15113
+ transceiver.streamReadyStateChanged.on(() => {
15114
+ this.sendSourceAdvertisement(mediaType);
15115
+ this.sendMediaRequestStatus(mediaType);
15116
+ });
15094
15117
  transceiver.negotiationNeeded.on((offerAnswerType) => {
15095
15118
  if (offerAnswerType === OfferAnswerType.Remote) {
15096
15119
  this.emit(exports.MultistreamConnectionEventNames.NegotiationNeeded);
@@ -15311,7 +15334,7 @@ SCTP Max Message Size: ${maxMessageSize}`);
15311
15334
  if (!this.getSendTransceiverOrThrow(mediaType).requested) {
15312
15335
  return;
15313
15336
  }
15314
- const streamStates = this.getVideoStreamStates(mediaType);
15337
+ const streamStates = this.getVideoStreamStates(getMediaContent(mediaType));
15315
15338
  const task = () => {
15316
15339
  var _a;
15317
15340
  (_a = this.jmpSessions.get(mediaType)) === null || _a === void 0 ? void 0 : _a.sendMediaRequestStatus(streamStates);
@@ -15324,12 +15347,15 @@ SCTP Max Message Size: ${maxMessageSize}`);
15324
15347
  }
15325
15348
  }
15326
15349
  sendSourceAdvertisement(mediaType) {
15327
- var _a, _b;
15350
+ var _a, _b, _c;
15328
15351
  const transceiver = this.getSendTransceiverOrThrow(mediaType);
15329
- const numLiveSources = ((_a = transceiver.publishedStream) === null || _a === void 0 ? void 0 : _a.muted) === false ? 1 : 0;
15352
+ const numLiveSources = ((_a = transceiver.publishedStream) === null || _a === void 0 ? void 0 : _a.muted) === false &&
15353
+ ((_b = transceiver.publishedStream) === null || _b === void 0 ? void 0 : _b.readyState) === 'live'
15354
+ ? 1
15355
+ : 0;
15330
15356
  let task;
15331
15357
  if (getMediaFamily(mediaType) === exports.MediaFamily.Video) {
15332
- const sources = this.getVideoStreamStates(mediaType);
15358
+ const sources = this.getVideoStreamStates(getMediaContent(mediaType));
15333
15359
  if (sources === null) {
15334
15360
  return;
15335
15361
  }
@@ -15350,15 +15376,15 @@ SCTP Max Message Size: ${maxMessageSize}`);
15350
15376
  .get(mediaType)) === null || _a === void 0 ? void 0 : _a.sendSourceAdvertisement(1, numLiveSources, mediaType === exports.MediaType.AudioMain ? transceiver.namedMediaGroups : []);
15351
15377
  };
15352
15378
  }
15353
- if (((_b = this.dataChannel) === null || _b === void 0 ? void 0 : _b.readyState) === 'open') {
15379
+ if (((_c = this.dataChannel) === null || _c === void 0 ? void 0 : _c.readyState) === 'open') {
15354
15380
  task();
15355
15381
  }
15356
15382
  else {
15357
15383
  this.pendingJmpTasks.push(task);
15358
15384
  }
15359
15385
  }
15360
- getVideoStreamStates(mediaType) {
15361
- const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
15386
+ getVideoStreamStates(mediaContent) {
15387
+ const sendTransceiver = this.getSendTransceiverOrThrow(getMediaType(exports.MediaFamily.Video, mediaContent));
15362
15388
  return sendTransceiver.senderIds.map((id) => ({
15363
15389
  id,
15364
15390
  state: sendTransceiver.currentSourceState,