@whereby.com/media 1.6.0 → 1.6.1

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/index.cjs CHANGED
@@ -3072,22 +3072,15 @@ class Session {
3072
3072
  return this.pc && this.pc.connectionState === "connected";
3073
3073
  }
3074
3074
  replaceTrack(oldTrack, newTrack) {
3075
+ if (!newTrack) {
3076
+ rtcStats.sendEvent("replaceTrackP2P", { nullTrack: "newTrack", oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind });
3077
+ }
3075
3078
  const pc = this.pc;
3076
3079
  if (!pc)
3077
3080
  return false;
3078
3081
  const senders = pc.getSenders();
3079
- function dbg(msg) {
3080
- const tr = (t) => t && `id:${t.id},kind:${t.kind},state:${t.readyState}`;
3081
- logger$5.warn(`${msg}. newTrack:${tr(newTrack)}, oldTrack:${tr(oldTrack)}, sender tracks: ${JSON.stringify(senders.map((s) => `s ${tr(s.track)}`))}, sender first codecs: ${JSON.stringify(senders.map((s) => (s.getParameters().codecs || [])[0]))}`);
3082
- }
3083
- if (!senders.length) {
3084
- dbg("No senders!");
3085
- }
3086
3082
  if (!oldTrack) {
3087
3083
  oldTrack = (senders.find((s) => s.track && s.track.kind === newTrack.kind) || {}).track;
3088
- if (!oldTrack) {
3089
- dbg("No sender with same kind! Add new track then.");
3090
- }
3091
3084
  }
3092
3085
  if (window.RTCRtpSender && window.RTCRtpSender.prototype.replaceTrack) {
3093
3086
  if (oldTrack) {
@@ -3095,8 +3088,8 @@ class Session {
3095
3088
  for (let i = 0; i < senders.length; i++) {
3096
3089
  const sender = senders[i];
3097
3090
  const track = sender.track;
3098
- if (!sender && !track) {
3099
- dbg("One of the tracks is null!");
3091
+ if (!track) {
3092
+ rtcStats.sendEvent("replaceTrackP2P", { nullTrack: "trackFromSender", oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind, newTrackKind: newTrack === null || newTrack === void 0 ? void 0 : newTrack.kind });
3100
3093
  }
3101
3094
  if (track.id === newTrack.id) {
3102
3095
  return Promise.resolve(newTrack);
@@ -3124,7 +3117,6 @@ class Session {
3124
3117
  if (3 < ++retried) {
3125
3118
  clearInterval(timer);
3126
3119
  timer = null;
3127
- dbg("No sender track to replace");
3128
3120
  reject("No sender track to replace");
3129
3121
  }
3130
3122
  return;
@@ -3138,7 +3130,6 @@ class Session {
3138
3130
  }
3139
3131
  const stream = this.streams.find((s) => s.getTracks().find((t) => t.id === newTrack.id)) || this.streams[0];
3140
3132
  if (!stream) {
3141
- dbg("No stream?");
3142
3133
  return Promise.reject(new Error("replaceTrack: No stream?"));
3143
3134
  }
3144
3135
  return pc.addTrack(newTrack, stream);
@@ -4732,21 +4723,6 @@ function createMicAnalyser({ micTrack, params, onScoreUpdated, }) {
4732
4723
  };
4733
4724
  }
4734
4725
 
4735
- const maybeTurnOnly = (transportConfig, features) => {
4736
- if (!features.useOnlyTURN) {
4737
- return;
4738
- }
4739
- transportConfig.iceTransportPolicy = "relay";
4740
- const filter = {
4741
- onlyudp: /^turn:.*transport=udp$/,
4742
- onlytcp: /^turn:.*transport=tcp$/,
4743
- onlytls: /^turns:.*transport=tcp$/,
4744
- }[features.useOnlyTURN];
4745
- if (filter) {
4746
- transportConfig.iceServers = transportConfig.iceServers.filter((entry) => entry.url && entry.url.match(filter));
4747
- }
4748
- };
4749
-
4750
4726
  const logger$2 = new Logger();
4751
4727
  const MEDIA_QUALITY = Object.freeze({
4752
4728
  ok: "ok",
@@ -4901,6 +4877,56 @@ class VegaMediaQualityMonitor extends EventEmitter {
4901
4877
  }
4902
4878
  }
4903
4879
 
4880
+ const maybeTurnOnly = (transportConfig, features) => {
4881
+ if (!features.useOnlyTURN) {
4882
+ return;
4883
+ }
4884
+ transportConfig.iceTransportPolicy = "relay";
4885
+ const filter = {
4886
+ onlyudp: /^turn:.*transport=udp$/,
4887
+ onlytcp: /^turn:.*transport=tcp$/,
4888
+ onlytls: /^turns:.*transport=tcp$/,
4889
+ }[features.useOnlyTURN];
4890
+ if (filter) {
4891
+ transportConfig.iceServers = transportConfig.iceServers.filter((entry) => entry.url && entry.url.match(filter));
4892
+ }
4893
+ };
4894
+
4895
+ function getLayers({ width, height, }, { numberOfActiveVideos, numberOfTemporalLayers, uncappedSingleRemoteVideoOn, }) {
4896
+ const maxSide = Math.max(width, height);
4897
+ let spatialLayer = maxSide >= 480 ? (maxSide >= 960 ? 2 : 1) : 0;
4898
+ let temporalLayer = numberOfTemporalLayers - 1;
4899
+ if (maxSide < 100) {
4900
+ temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
4901
+ }
4902
+ if (numberOfActiveVideos > 8 && spatialLayer === 0) {
4903
+ temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
4904
+ }
4905
+ if (numberOfActiveVideos < 4 && maxSide > 300 && spatialLayer === 0) {
4906
+ spatialLayer = 1;
4907
+ }
4908
+ if (uncappedSingleRemoteVideoOn && numberOfActiveVideos === 1) {
4909
+ spatialLayer = 2;
4910
+ temporalLayer = numberOfTemporalLayers - 1;
4911
+ }
4912
+ return { spatialLayer, temporalLayer };
4913
+ }
4914
+ function getNumberOfActiveVideos(consumers) {
4915
+ let numberOfActiveVideos = 0;
4916
+ consumers.forEach((c) => {
4917
+ var _a, _b;
4918
+ if (c._closed || c._paused)
4919
+ return;
4920
+ if (((_a = c._appData) === null || _a === void 0 ? void 0 : _a.source) === "webcam" || ((_b = c._appData) === null || _b === void 0 ? void 0 : _b.source) === "screenvideo")
4921
+ numberOfActiveVideos++;
4922
+ });
4923
+ return numberOfActiveVideos;
4924
+ }
4925
+ function getNumberOfTemporalLayers(consumer) {
4926
+ var _a, _b, _c;
4927
+ return /T3/.test(((_c = (_b = (_a = consumer._rtpParameters) === null || _a === void 0 ? void 0 : _a.encodings) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.scalabilityMode) || "") ? 3 : 2;
4928
+ }
4929
+
4904
4930
  var _a$1;
4905
4931
  const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4906
4932
  const logger$1 = new Logger();
@@ -5827,43 +5853,23 @@ class VegaRtcManager {
5827
5853
  this._syncIncomingStreamsWithPWA(clientId);
5828
5854
  }
5829
5855
  updateStreamResolution(streamId, _ignored, { width, height, }) {
5830
- var _a, _b, _c, _d, _e;
5856
+ var _a, _b;
5831
5857
  logger$1.info("updateStreamResolution()", { streamId, width, height });
5832
5858
  const consumerId = this._streamIdToVideoConsumerId.get(streamId);
5833
5859
  const consumer = this._consumers.get(consumerId);
5834
5860
  if (!consumer)
5835
5861
  return;
5836
- let numberOfActiveVideos = 0;
5837
- this._consumers.forEach((c) => {
5838
- var _a, _b;
5839
- if (c._closed || c._paused)
5840
- return;
5841
- if (((_a = c._appData) === null || _a === void 0 ? void 0 : _a.source) === "webcam" || ((_b = c._appData) === null || _b === void 0 ? void 0 : _b.source) === "screenvideo")
5842
- numberOfActiveVideos++;
5862
+ const numberOfActiveVideos = getNumberOfActiveVideos(this._consumers);
5863
+ const numberOfTemporalLayers = getNumberOfTemporalLayers(consumer);
5864
+ const { spatialLayer, temporalLayer } = getLayers({ width, height }, {
5865
+ numberOfActiveVideos,
5866
+ numberOfTemporalLayers,
5867
+ uncappedSingleRemoteVideoOn: (_a = this._features) === null || _a === void 0 ? void 0 : _a.uncappedSingleRemoteVideoOn,
5843
5868
  });
5844
- let numberOfTemporalLayers = 2;
5845
- if (/T3/.test(((_c = (_b = (_a = consumer._rtpParameters) === null || _a === void 0 ? void 0 : _a.encodings) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.scalabilityMode) || ""))
5846
- numberOfTemporalLayers = 3;
5847
- const maxSide = Math.max(width, height);
5848
- let spatialLayer = maxSide >= 480 ? (maxSide >= 960 ? 2 : 1) : 0;
5849
- let temporalLayer = numberOfTemporalLayers - 1;
5850
- if (maxSide < 100) {
5851
- temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
5852
- }
5853
- if (numberOfActiveVideos > 8 && spatialLayer === 0) {
5854
- temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
5855
- }
5856
- if (numberOfActiveVideos < 4 && maxSide > 300 && spatialLayer === 0) {
5857
- spatialLayer = 1;
5858
- }
5859
- if (((_d = this._features) === null || _d === void 0 ? void 0 : _d.uncappedSingleRemoteVideoOn) && numberOfActiveVideos === 1) {
5860
- spatialLayer = 2;
5861
- temporalLayer = numberOfTemporalLayers - 1;
5862
- }
5863
5869
  if (consumer.appData.spatialLayer !== spatialLayer || consumer.appData.temporalLayer !== temporalLayer) {
5864
5870
  consumer.appData.spatialLayer = spatialLayer;
5865
5871
  consumer.appData.temporalLayer = temporalLayer;
5866
- (_e = this._vegaConnection) === null || _e === void 0 ? void 0 : _e.message("setConsumersPreferredLayers", {
5872
+ (_b = this._vegaConnection) === null || _b === void 0 ? void 0 : _b.message("setConsumersPreferredLayers", {
5867
5873
  consumerIds: [consumerId],
5868
5874
  spatialLayer,
5869
5875
  temporalLayer,
package/dist/index.mjs CHANGED
@@ -3051,22 +3051,15 @@ class Session {
3051
3051
  return this.pc && this.pc.connectionState === "connected";
3052
3052
  }
3053
3053
  replaceTrack(oldTrack, newTrack) {
3054
+ if (!newTrack) {
3055
+ rtcStats.sendEvent("replaceTrackP2P", { nullTrack: "newTrack", oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind });
3056
+ }
3054
3057
  const pc = this.pc;
3055
3058
  if (!pc)
3056
3059
  return false;
3057
3060
  const senders = pc.getSenders();
3058
- function dbg(msg) {
3059
- const tr = (t) => t && `id:${t.id},kind:${t.kind},state:${t.readyState}`;
3060
- logger$5.warn(`${msg}. newTrack:${tr(newTrack)}, oldTrack:${tr(oldTrack)}, sender tracks: ${JSON.stringify(senders.map((s) => `s ${tr(s.track)}`))}, sender first codecs: ${JSON.stringify(senders.map((s) => (s.getParameters().codecs || [])[0]))}`);
3061
- }
3062
- if (!senders.length) {
3063
- dbg("No senders!");
3064
- }
3065
3061
  if (!oldTrack) {
3066
3062
  oldTrack = (senders.find((s) => s.track && s.track.kind === newTrack.kind) || {}).track;
3067
- if (!oldTrack) {
3068
- dbg("No sender with same kind! Add new track then.");
3069
- }
3070
3063
  }
3071
3064
  if (window.RTCRtpSender && window.RTCRtpSender.prototype.replaceTrack) {
3072
3065
  if (oldTrack) {
@@ -3074,8 +3067,8 @@ class Session {
3074
3067
  for (let i = 0; i < senders.length; i++) {
3075
3068
  const sender = senders[i];
3076
3069
  const track = sender.track;
3077
- if (!sender && !track) {
3078
- dbg("One of the tracks is null!");
3070
+ if (!track) {
3071
+ rtcStats.sendEvent("replaceTrackP2P", { nullTrack: "trackFromSender", oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind, newTrackKind: newTrack === null || newTrack === void 0 ? void 0 : newTrack.kind });
3079
3072
  }
3080
3073
  if (track.id === newTrack.id) {
3081
3074
  return Promise.resolve(newTrack);
@@ -3103,7 +3096,6 @@ class Session {
3103
3096
  if (3 < ++retried) {
3104
3097
  clearInterval(timer);
3105
3098
  timer = null;
3106
- dbg("No sender track to replace");
3107
3099
  reject("No sender track to replace");
3108
3100
  }
3109
3101
  return;
@@ -3117,7 +3109,6 @@ class Session {
3117
3109
  }
3118
3110
  const stream = this.streams.find((s) => s.getTracks().find((t) => t.id === newTrack.id)) || this.streams[0];
3119
3111
  if (!stream) {
3120
- dbg("No stream?");
3121
3112
  return Promise.reject(new Error("replaceTrack: No stream?"));
3122
3113
  }
3123
3114
  return pc.addTrack(newTrack, stream);
@@ -4711,21 +4702,6 @@ function createMicAnalyser({ micTrack, params, onScoreUpdated, }) {
4711
4702
  };
4712
4703
  }
4713
4704
 
4714
- const maybeTurnOnly = (transportConfig, features) => {
4715
- if (!features.useOnlyTURN) {
4716
- return;
4717
- }
4718
- transportConfig.iceTransportPolicy = "relay";
4719
- const filter = {
4720
- onlyudp: /^turn:.*transport=udp$/,
4721
- onlytcp: /^turn:.*transport=tcp$/,
4722
- onlytls: /^turns:.*transport=tcp$/,
4723
- }[features.useOnlyTURN];
4724
- if (filter) {
4725
- transportConfig.iceServers = transportConfig.iceServers.filter((entry) => entry.url && entry.url.match(filter));
4726
- }
4727
- };
4728
-
4729
4705
  const logger$2 = new Logger();
4730
4706
  const MEDIA_QUALITY = Object.freeze({
4731
4707
  ok: "ok",
@@ -4880,6 +4856,56 @@ class VegaMediaQualityMonitor extends EventEmitter$1 {
4880
4856
  }
4881
4857
  }
4882
4858
 
4859
+ const maybeTurnOnly = (transportConfig, features) => {
4860
+ if (!features.useOnlyTURN) {
4861
+ return;
4862
+ }
4863
+ transportConfig.iceTransportPolicy = "relay";
4864
+ const filter = {
4865
+ onlyudp: /^turn:.*transport=udp$/,
4866
+ onlytcp: /^turn:.*transport=tcp$/,
4867
+ onlytls: /^turns:.*transport=tcp$/,
4868
+ }[features.useOnlyTURN];
4869
+ if (filter) {
4870
+ transportConfig.iceServers = transportConfig.iceServers.filter((entry) => entry.url && entry.url.match(filter));
4871
+ }
4872
+ };
4873
+
4874
+ function getLayers({ width, height, }, { numberOfActiveVideos, numberOfTemporalLayers, uncappedSingleRemoteVideoOn, }) {
4875
+ const maxSide = Math.max(width, height);
4876
+ let spatialLayer = maxSide >= 480 ? (maxSide >= 960 ? 2 : 1) : 0;
4877
+ let temporalLayer = numberOfTemporalLayers - 1;
4878
+ if (maxSide < 100) {
4879
+ temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
4880
+ }
4881
+ if (numberOfActiveVideos > 8 && spatialLayer === 0) {
4882
+ temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
4883
+ }
4884
+ if (numberOfActiveVideos < 4 && maxSide > 300 && spatialLayer === 0) {
4885
+ spatialLayer = 1;
4886
+ }
4887
+ if (uncappedSingleRemoteVideoOn && numberOfActiveVideos === 1) {
4888
+ spatialLayer = 2;
4889
+ temporalLayer = numberOfTemporalLayers - 1;
4890
+ }
4891
+ return { spatialLayer, temporalLayer };
4892
+ }
4893
+ function getNumberOfActiveVideos(consumers) {
4894
+ let numberOfActiveVideos = 0;
4895
+ consumers.forEach((c) => {
4896
+ var _a, _b;
4897
+ if (c._closed || c._paused)
4898
+ return;
4899
+ if (((_a = c._appData) === null || _a === void 0 ? void 0 : _a.source) === "webcam" || ((_b = c._appData) === null || _b === void 0 ? void 0 : _b.source) === "screenvideo")
4900
+ numberOfActiveVideos++;
4901
+ });
4902
+ return numberOfActiveVideos;
4903
+ }
4904
+ function getNumberOfTemporalLayers(consumer) {
4905
+ var _a, _b, _c;
4906
+ return /T3/.test(((_c = (_b = (_a = consumer._rtpParameters) === null || _a === void 0 ? void 0 : _a.encodings) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.scalabilityMode) || "") ? 3 : 2;
4907
+ }
4908
+
4883
4909
  var _a$1;
4884
4910
  const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4885
4911
  const logger$1 = new Logger();
@@ -5806,43 +5832,23 @@ class VegaRtcManager {
5806
5832
  this._syncIncomingStreamsWithPWA(clientId);
5807
5833
  }
5808
5834
  updateStreamResolution(streamId, _ignored, { width, height, }) {
5809
- var _a, _b, _c, _d, _e;
5835
+ var _a, _b;
5810
5836
  logger$1.info("updateStreamResolution()", { streamId, width, height });
5811
5837
  const consumerId = this._streamIdToVideoConsumerId.get(streamId);
5812
5838
  const consumer = this._consumers.get(consumerId);
5813
5839
  if (!consumer)
5814
5840
  return;
5815
- let numberOfActiveVideos = 0;
5816
- this._consumers.forEach((c) => {
5817
- var _a, _b;
5818
- if (c._closed || c._paused)
5819
- return;
5820
- if (((_a = c._appData) === null || _a === void 0 ? void 0 : _a.source) === "webcam" || ((_b = c._appData) === null || _b === void 0 ? void 0 : _b.source) === "screenvideo")
5821
- numberOfActiveVideos++;
5841
+ const numberOfActiveVideos = getNumberOfActiveVideos(this._consumers);
5842
+ const numberOfTemporalLayers = getNumberOfTemporalLayers(consumer);
5843
+ const { spatialLayer, temporalLayer } = getLayers({ width, height }, {
5844
+ numberOfActiveVideos,
5845
+ numberOfTemporalLayers,
5846
+ uncappedSingleRemoteVideoOn: (_a = this._features) === null || _a === void 0 ? void 0 : _a.uncappedSingleRemoteVideoOn,
5822
5847
  });
5823
- let numberOfTemporalLayers = 2;
5824
- if (/T3/.test(((_c = (_b = (_a = consumer._rtpParameters) === null || _a === void 0 ? void 0 : _a.encodings) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.scalabilityMode) || ""))
5825
- numberOfTemporalLayers = 3;
5826
- const maxSide = Math.max(width, height);
5827
- let spatialLayer = maxSide >= 480 ? (maxSide >= 960 ? 2 : 1) : 0;
5828
- let temporalLayer = numberOfTemporalLayers - 1;
5829
- if (maxSide < 100) {
5830
- temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
5831
- }
5832
- if (numberOfActiveVideos > 8 && spatialLayer === 0) {
5833
- temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
5834
- }
5835
- if (numberOfActiveVideos < 4 && maxSide > 300 && spatialLayer === 0) {
5836
- spatialLayer = 1;
5837
- }
5838
- if (((_d = this._features) === null || _d === void 0 ? void 0 : _d.uncappedSingleRemoteVideoOn) && numberOfActiveVideos === 1) {
5839
- spatialLayer = 2;
5840
- temporalLayer = numberOfTemporalLayers - 1;
5841
- }
5842
5848
  if (consumer.appData.spatialLayer !== spatialLayer || consumer.appData.temporalLayer !== temporalLayer) {
5843
5849
  consumer.appData.spatialLayer = spatialLayer;
5844
5850
  consumer.appData.temporalLayer = temporalLayer;
5845
- (_e = this._vegaConnection) === null || _e === void 0 ? void 0 : _e.message("setConsumersPreferredLayers", {
5851
+ (_b = this._vegaConnection) === null || _b === void 0 ? void 0 : _b.message("setConsumersPreferredLayers", {
5846
5852
  consumerIds: [consumerId],
5847
5853
  spatialLayer,
5848
5854
  temporalLayer,
@@ -3051,22 +3051,15 @@ class Session {
3051
3051
  return this.pc && this.pc.connectionState === "connected";
3052
3052
  }
3053
3053
  replaceTrack(oldTrack, newTrack) {
3054
+ if (!newTrack) {
3055
+ rtcStats.sendEvent("replaceTrackP2P", { nullTrack: "newTrack", oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind });
3056
+ }
3054
3057
  const pc = this.pc;
3055
3058
  if (!pc)
3056
3059
  return false;
3057
3060
  const senders = pc.getSenders();
3058
- function dbg(msg) {
3059
- const tr = (t) => t && `id:${t.id},kind:${t.kind},state:${t.readyState}`;
3060
- logger$5.warn(`${msg}. newTrack:${tr(newTrack)}, oldTrack:${tr(oldTrack)}, sender tracks: ${JSON.stringify(senders.map((s) => `s ${tr(s.track)}`))}, sender first codecs: ${JSON.stringify(senders.map((s) => (s.getParameters().codecs || [])[0]))}`);
3061
- }
3062
- if (!senders.length) {
3063
- dbg("No senders!");
3064
- }
3065
3061
  if (!oldTrack) {
3066
3062
  oldTrack = (senders.find((s) => s.track && s.track.kind === newTrack.kind) || {}).track;
3067
- if (!oldTrack) {
3068
- dbg("No sender with same kind! Add new track then.");
3069
- }
3070
3063
  }
3071
3064
  if (window.RTCRtpSender && window.RTCRtpSender.prototype.replaceTrack) {
3072
3065
  if (oldTrack) {
@@ -3074,8 +3067,8 @@ class Session {
3074
3067
  for (let i = 0; i < senders.length; i++) {
3075
3068
  const sender = senders[i];
3076
3069
  const track = sender.track;
3077
- if (!sender && !track) {
3078
- dbg("One of the tracks is null!");
3070
+ if (!track) {
3071
+ rtcStats.sendEvent("replaceTrackP2P", { nullTrack: "trackFromSender", oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind, newTrackKind: newTrack === null || newTrack === void 0 ? void 0 : newTrack.kind });
3079
3072
  }
3080
3073
  if (track.id === newTrack.id) {
3081
3074
  return Promise.resolve(newTrack);
@@ -3103,7 +3096,6 @@ class Session {
3103
3096
  if (3 < ++retried) {
3104
3097
  clearInterval(timer);
3105
3098
  timer = null;
3106
- dbg("No sender track to replace");
3107
3099
  reject("No sender track to replace");
3108
3100
  }
3109
3101
  return;
@@ -3117,7 +3109,6 @@ class Session {
3117
3109
  }
3118
3110
  const stream = this.streams.find((s) => s.getTracks().find((t) => t.id === newTrack.id)) || this.streams[0];
3119
3111
  if (!stream) {
3120
- dbg("No stream?");
3121
3112
  return Promise.reject(new Error("replaceTrack: No stream?"));
3122
3113
  }
3123
3114
  return pc.addTrack(newTrack, stream);
@@ -4711,21 +4702,6 @@ function createMicAnalyser({ micTrack, params, onScoreUpdated, }) {
4711
4702
  };
4712
4703
  }
4713
4704
 
4714
- const maybeTurnOnly = (transportConfig, features) => {
4715
- if (!features.useOnlyTURN) {
4716
- return;
4717
- }
4718
- transportConfig.iceTransportPolicy = "relay";
4719
- const filter = {
4720
- onlyudp: /^turn:.*transport=udp$/,
4721
- onlytcp: /^turn:.*transport=tcp$/,
4722
- onlytls: /^turns:.*transport=tcp$/,
4723
- }[features.useOnlyTURN];
4724
- if (filter) {
4725
- transportConfig.iceServers = transportConfig.iceServers.filter((entry) => entry.url && entry.url.match(filter));
4726
- }
4727
- };
4728
-
4729
4705
  const logger$2 = new Logger();
4730
4706
  const MEDIA_QUALITY = Object.freeze({
4731
4707
  ok: "ok",
@@ -4880,6 +4856,56 @@ class VegaMediaQualityMonitor extends EventEmitter$1 {
4880
4856
  }
4881
4857
  }
4882
4858
 
4859
+ const maybeTurnOnly = (transportConfig, features) => {
4860
+ if (!features.useOnlyTURN) {
4861
+ return;
4862
+ }
4863
+ transportConfig.iceTransportPolicy = "relay";
4864
+ const filter = {
4865
+ onlyudp: /^turn:.*transport=udp$/,
4866
+ onlytcp: /^turn:.*transport=tcp$/,
4867
+ onlytls: /^turns:.*transport=tcp$/,
4868
+ }[features.useOnlyTURN];
4869
+ if (filter) {
4870
+ transportConfig.iceServers = transportConfig.iceServers.filter((entry) => entry.url && entry.url.match(filter));
4871
+ }
4872
+ };
4873
+
4874
+ function getLayers({ width, height, }, { numberOfActiveVideos, numberOfTemporalLayers, uncappedSingleRemoteVideoOn, }) {
4875
+ const maxSide = Math.max(width, height);
4876
+ let spatialLayer = maxSide >= 480 ? (maxSide >= 960 ? 2 : 1) : 0;
4877
+ let temporalLayer = numberOfTemporalLayers - 1;
4878
+ if (maxSide < 100) {
4879
+ temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
4880
+ }
4881
+ if (numberOfActiveVideos > 8 && spatialLayer === 0) {
4882
+ temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
4883
+ }
4884
+ if (numberOfActiveVideos < 4 && maxSide > 300 && spatialLayer === 0) {
4885
+ spatialLayer = 1;
4886
+ }
4887
+ if (uncappedSingleRemoteVideoOn && numberOfActiveVideos === 1) {
4888
+ spatialLayer = 2;
4889
+ temporalLayer = numberOfTemporalLayers - 1;
4890
+ }
4891
+ return { spatialLayer, temporalLayer };
4892
+ }
4893
+ function getNumberOfActiveVideos(consumers) {
4894
+ let numberOfActiveVideos = 0;
4895
+ consumers.forEach((c) => {
4896
+ var _a, _b;
4897
+ if (c._closed || c._paused)
4898
+ return;
4899
+ if (((_a = c._appData) === null || _a === void 0 ? void 0 : _a.source) === "webcam" || ((_b = c._appData) === null || _b === void 0 ? void 0 : _b.source) === "screenvideo")
4900
+ numberOfActiveVideos++;
4901
+ });
4902
+ return numberOfActiveVideos;
4903
+ }
4904
+ function getNumberOfTemporalLayers(consumer) {
4905
+ var _a, _b, _c;
4906
+ return /T3/.test(((_c = (_b = (_a = consumer._rtpParameters) === null || _a === void 0 ? void 0 : _a.encodings) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.scalabilityMode) || "") ? 3 : 2;
4907
+ }
4908
+
4883
4909
  var _a$1;
4884
4910
  const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4885
4911
  const logger$1 = new Logger();
@@ -5806,43 +5832,23 @@ class VegaRtcManager {
5806
5832
  this._syncIncomingStreamsWithPWA(clientId);
5807
5833
  }
5808
5834
  updateStreamResolution(streamId, _ignored, { width, height, }) {
5809
- var _a, _b, _c, _d, _e;
5835
+ var _a, _b;
5810
5836
  logger$1.info("updateStreamResolution()", { streamId, width, height });
5811
5837
  const consumerId = this._streamIdToVideoConsumerId.get(streamId);
5812
5838
  const consumer = this._consumers.get(consumerId);
5813
5839
  if (!consumer)
5814
5840
  return;
5815
- let numberOfActiveVideos = 0;
5816
- this._consumers.forEach((c) => {
5817
- var _a, _b;
5818
- if (c._closed || c._paused)
5819
- return;
5820
- if (((_a = c._appData) === null || _a === void 0 ? void 0 : _a.source) === "webcam" || ((_b = c._appData) === null || _b === void 0 ? void 0 : _b.source) === "screenvideo")
5821
- numberOfActiveVideos++;
5841
+ const numberOfActiveVideos = getNumberOfActiveVideos(this._consumers);
5842
+ const numberOfTemporalLayers = getNumberOfTemporalLayers(consumer);
5843
+ const { spatialLayer, temporalLayer } = getLayers({ width, height }, {
5844
+ numberOfActiveVideos,
5845
+ numberOfTemporalLayers,
5846
+ uncappedSingleRemoteVideoOn: (_a = this._features) === null || _a === void 0 ? void 0 : _a.uncappedSingleRemoteVideoOn,
5822
5847
  });
5823
- let numberOfTemporalLayers = 2;
5824
- if (/T3/.test(((_c = (_b = (_a = consumer._rtpParameters) === null || _a === void 0 ? void 0 : _a.encodings) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.scalabilityMode) || ""))
5825
- numberOfTemporalLayers = 3;
5826
- const maxSide = Math.max(width, height);
5827
- let spatialLayer = maxSide >= 480 ? (maxSide >= 960 ? 2 : 1) : 0;
5828
- let temporalLayer = numberOfTemporalLayers - 1;
5829
- if (maxSide < 100) {
5830
- temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
5831
- }
5832
- if (numberOfActiveVideos > 8 && spatialLayer === 0) {
5833
- temporalLayer = Math.max(numberOfTemporalLayers - 2, 0);
5834
- }
5835
- if (numberOfActiveVideos < 4 && maxSide > 300 && spatialLayer === 0) {
5836
- spatialLayer = 1;
5837
- }
5838
- if (((_d = this._features) === null || _d === void 0 ? void 0 : _d.uncappedSingleRemoteVideoOn) && numberOfActiveVideos === 1) {
5839
- spatialLayer = 2;
5840
- temporalLayer = numberOfTemporalLayers - 1;
5841
- }
5842
5848
  if (consumer.appData.spatialLayer !== spatialLayer || consumer.appData.temporalLayer !== temporalLayer) {
5843
5849
  consumer.appData.spatialLayer = spatialLayer;
5844
5850
  consumer.appData.temporalLayer = temporalLayer;
5845
- (_e = this._vegaConnection) === null || _e === void 0 ? void 0 : _e.message("setConsumersPreferredLayers", {
5851
+ (_b = this._vegaConnection) === null || _b === void 0 ? void 0 : _b.message("setConsumersPreferredLayers", {
5846
5852
  consumerIds: [consumerId],
5847
5853
  spatialLayer,
5848
5854
  temporalLayer,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@whereby.com/media",
3
3
  "description": "Media library for Whereby",
4
- "version": "1.6.0",
4
+ "version": "1.6.1",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/whereby/sdk",
7
7
  "repository": {