@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/esm/index.js CHANGED
@@ -7214,6 +7214,7 @@ var WcmeErrorType;
7214
7214
  WcmeErrorType["GET_MAX_BITRATE_FAILED"] = "GET_MAX_BITRATE_FAILED";
7215
7215
  WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"] = "GET_PAYLOAD_TYPE_FAILED";
7216
7216
  WcmeErrorType["SET_NMG_FAILED"] = "SET_NMG_FAILED";
7217
+ WcmeErrorType["SET_SOURCE_STATE_OVERRIDE_FAILED"] = "SET_SOURCE_STATE_OVERRIDE_FAILED";
7217
7218
  WcmeErrorType["DATA_CHANNEL_SEND_FAILED"] = "DATA_CHANNEL_SEND_FAILED";
7218
7219
  WcmeErrorType["RENEW_PEER_CONNECTION_FAILED"] = "RENEW_PEER_CONNECTION_FAILED";
7219
7220
  })(WcmeErrorType || (WcmeErrorType = {}));
@@ -14522,6 +14523,7 @@ class SendOnlyTransceiver extends Transceiver {
14522
14523
  this.rtxEnabled = false;
14523
14524
  this.dtxDisabled = true;
14524
14525
  this.streamMuteStateChange = new TypedEvent();
14526
+ this.streamReadyStateChanged = new TypedEvent();
14525
14527
  this.streamPublishStateChange = new TypedEvent();
14526
14528
  this.negotiationNeeded = new TypedEvent();
14527
14529
  this.namedMediaGroupsChange = new TypedEvent();
@@ -14535,6 +14537,7 @@ class SendOnlyTransceiver extends Transceiver {
14535
14537
  this.handleTrackChange = this.handleTrackChange.bind(this);
14536
14538
  this.handleStreamConstraintsChange = this.handleStreamConstraintsChange.bind(this);
14537
14539
  this.handleStreamMuteStateChange = this.handleStreamMuteStateChange.bind(this);
14540
+ this.handleStreamEnded = this.handleStreamEnded.bind(this);
14538
14541
  }
14539
14542
  replaceSenderSource(stream) {
14540
14543
  var _a, _b;
@@ -14566,6 +14569,9 @@ class SendOnlyTransceiver extends Transceiver {
14566
14569
  handleStreamMuteStateChange() {
14567
14570
  this.streamMuteStateChange.emit();
14568
14571
  }
14572
+ handleStreamEnded() {
14573
+ this.streamReadyStateChanged.emit();
14574
+ }
14569
14575
  get requested() {
14570
14576
  return this.requestedIdEncodingParamsMap.size > 0;
14571
14577
  }
@@ -14588,6 +14594,7 @@ class SendOnlyTransceiver extends Transceiver {
14588
14594
  oldStream === null || oldStream === void 0 ? void 0 : oldStream.off(LocalStreamEventNames.ConstraintsChange, this.handleStreamConstraintsChange);
14589
14595
  oldStream === null || oldStream === void 0 ? void 0 : oldStream.off(LocalStreamEventNames.UserMuteStateChange, this.handleStreamMuteStateChange);
14590
14596
  oldStream === null || oldStream === void 0 ? void 0 : oldStream.off(LocalStreamEventNames.SystemMuteStateChange, this.handleStreamMuteStateChange);
14597
+ oldStream === null || oldStream === void 0 ? void 0 : oldStream.off(StreamEventNames.Ended, this.handleStreamEnded);
14591
14598
  if (this.requested) {
14592
14599
  yield this.replaceSenderSource(newStream);
14593
14600
  }
@@ -14596,12 +14603,17 @@ class SendOnlyTransceiver extends Transceiver {
14596
14603
  newStream === null || newStream === void 0 ? void 0 : newStream.on(LocalStreamEventNames.ConstraintsChange, this.handleStreamConstraintsChange);
14597
14604
  newStream === null || newStream === void 0 ? void 0 : newStream.on(LocalStreamEventNames.UserMuteStateChange, this.handleStreamMuteStateChange);
14598
14605
  newStream === null || newStream === void 0 ? void 0 : newStream.on(LocalStreamEventNames.SystemMuteStateChange, this.handleStreamMuteStateChange);
14599
- if ((!oldStream && newStream && !newStream.muted) ||
14600
- (oldStream && !newStream && !oldStream.muted)) {
14606
+ newStream === null || newStream === void 0 ? void 0 : newStream.on(StreamEventNames.Ended, this.handleStreamEnded);
14607
+ if ((!oldStream && newStream) || (oldStream && !newStream)) {
14601
14608
  this.streamPublishStateChange.emit();
14602
14609
  }
14603
- else if ((oldStream === null || oldStream === void 0 ? void 0 : oldStream.muted) !== (newStream === null || newStream === void 0 ? void 0 : newStream.muted)) {
14604
- this.streamMuteStateChange.emit();
14610
+ if (oldStream && newStream) {
14611
+ if (oldStream.muted !== newStream.muted) {
14612
+ this.streamMuteStateChange.emit();
14613
+ }
14614
+ if (oldStream.readyState !== newStream.readyState) {
14615
+ this.streamReadyStateChanged.emit();
14616
+ }
14605
14617
  }
14606
14618
  });
14607
14619
  }
@@ -14637,6 +14649,7 @@ class SendOnlyTransceiver extends Transceiver {
14637
14649
  if (stats.type === 'outbound-rtp') {
14638
14650
  stats.mid = this.mid;
14639
14651
  stats.csi = this.csi;
14652
+ stats.sourceState = this.currentSourceState;
14640
14653
  stats.calliopeMediaType = this.mediaType;
14641
14654
  const senderId = this.munger.getSenderIds().find((id) => id.ssrc === stats.ssrc);
14642
14655
  if (senderId) {
@@ -14770,10 +14783,16 @@ class SendOnlyTransceiver extends Transceiver {
14770
14783
  this.negotiationNeeded.emit(OfferAnswerType.LocalOnly);
14771
14784
  }
14772
14785
  setSourceStateOverride(state) {
14786
+ if (getMediaFamily(this.mediaType) !== MediaFamily.Video) {
14787
+ logErrorAndThrow(WcmeErrorType.SET_SOURCE_STATE_OVERRIDE_FAILED, `Source state can only be overridden for video.`);
14788
+ }
14773
14789
  this.sourceStateOverride = state;
14774
14790
  this.sourceStateOverrideChange.emit();
14775
14791
  }
14776
14792
  get currentSourceState() {
14793
+ if (getMediaFamily(this.mediaType) !== MediaFamily.Video) {
14794
+ return undefined;
14795
+ }
14777
14796
  if (this.sourceStateOverride) {
14778
14797
  return this.sourceStateOverride;
14779
14798
  }
@@ -15087,6 +15106,10 @@ class MultistreamConnection extends EventEmitter$2 {
15087
15106
  this.sendSourceAdvertisement(mediaType);
15088
15107
  this.sendMediaRequestStatus(mediaType);
15089
15108
  });
15109
+ transceiver.streamReadyStateChanged.on(() => {
15110
+ this.sendSourceAdvertisement(mediaType);
15111
+ this.sendMediaRequestStatus(mediaType);
15112
+ });
15090
15113
  transceiver.negotiationNeeded.on((offerAnswerType) => {
15091
15114
  if (offerAnswerType === OfferAnswerType.Remote) {
15092
15115
  this.emit(MultistreamConnectionEventNames.NegotiationNeeded);
@@ -15307,7 +15330,7 @@ SCTP Max Message Size: ${maxMessageSize}`);
15307
15330
  if (!this.getSendTransceiverOrThrow(mediaType).requested) {
15308
15331
  return;
15309
15332
  }
15310
- const streamStates = this.getVideoStreamStates(mediaType);
15333
+ const streamStates = this.getVideoStreamStates(getMediaContent(mediaType));
15311
15334
  const task = () => {
15312
15335
  var _a;
15313
15336
  (_a = this.jmpSessions.get(mediaType)) === null || _a === void 0 ? void 0 : _a.sendMediaRequestStatus(streamStates);
@@ -15320,12 +15343,15 @@ SCTP Max Message Size: ${maxMessageSize}`);
15320
15343
  }
15321
15344
  }
15322
15345
  sendSourceAdvertisement(mediaType) {
15323
- var _a, _b;
15346
+ var _a, _b, _c;
15324
15347
  const transceiver = this.getSendTransceiverOrThrow(mediaType);
15325
- const numLiveSources = ((_a = transceiver.publishedStream) === null || _a === void 0 ? void 0 : _a.muted) === false ? 1 : 0;
15348
+ const numLiveSources = ((_a = transceiver.publishedStream) === null || _a === void 0 ? void 0 : _a.muted) === false &&
15349
+ ((_b = transceiver.publishedStream) === null || _b === void 0 ? void 0 : _b.readyState) === 'live'
15350
+ ? 1
15351
+ : 0;
15326
15352
  let task;
15327
15353
  if (getMediaFamily(mediaType) === MediaFamily.Video) {
15328
- const sources = this.getVideoStreamStates(mediaType);
15354
+ const sources = this.getVideoStreamStates(getMediaContent(mediaType));
15329
15355
  if (sources === null) {
15330
15356
  return;
15331
15357
  }
@@ -15346,15 +15372,15 @@ SCTP Max Message Size: ${maxMessageSize}`);
15346
15372
  .get(mediaType)) === null || _a === void 0 ? void 0 : _a.sendSourceAdvertisement(1, numLiveSources, mediaType === MediaType.AudioMain ? transceiver.namedMediaGroups : []);
15347
15373
  };
15348
15374
  }
15349
- if (((_b = this.dataChannel) === null || _b === void 0 ? void 0 : _b.readyState) === 'open') {
15375
+ if (((_c = this.dataChannel) === null || _c === void 0 ? void 0 : _c.readyState) === 'open') {
15350
15376
  task();
15351
15377
  }
15352
15378
  else {
15353
15379
  this.pendingJmpTasks.push(task);
15354
15380
  }
15355
15381
  }
15356
- getVideoStreamStates(mediaType) {
15357
- const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
15382
+ getVideoStreamStates(mediaContent) {
15383
+ const sendTransceiver = this.getSendTransceiverOrThrow(getMediaType(MediaFamily.Video, mediaContent));
15358
15384
  return sendTransceiver.senderIds.map((id) => ({
15359
15385
  id,
15360
15386
  state: sendTransceiver.currentSourceState,