@stream-io/video-client 1.44.1 → 1.44.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/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [1.44.3](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-client-1.44.2...@stream-io/video-client-1.44.3) (2026-03-06)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **client:** prevent concurrent SFU updateSubscriptions during reconnects ([#2155](https://github.com/GetStream/stream-video-js/issues/2155)) ([1ac32d2](https://github.com/GetStream/stream-video-js/commit/1ac32d261c9a54aa8e3636a60e3c8f3e1407ae16))
10
+
11
+ ## [1.44.2](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-client-1.44.1...@stream-io/video-client-1.44.2) (2026-03-06)
12
+
13
+ ### Bug Fixes
14
+
15
+ - do not setup speaker early for ringing type calls ([#2154](https://github.com/GetStream/stream-video-js/issues/2154)) ([57adb90](https://github.com/GetStream/stream-video-js/commit/57adb90f03cfaceb4e6d3c050feaea239b80b1d9))
16
+
5
17
  ## [1.44.1](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-client-1.44.0...@stream-io/video-client-1.44.1) (2026-03-04)
6
18
 
7
19
  ### Bug Fixes
@@ -4005,6 +4005,8 @@ const retryable = async (rpc, signal, maxRetries = Number.POSITIVE_INFINITY) =>
4005
4005
  do {
4006
4006
  if (attempt > 0)
4007
4007
  await sleep(retryInterval(attempt));
4008
+ if (signal?.aborted)
4009
+ throw new Error(signal.reason);
4008
4010
  try {
4009
4011
  result = await rpc({ attempt });
4010
4012
  }
@@ -6281,7 +6283,7 @@ const getSdkVersion = (sdk) => {
6281
6283
  return sdk ? `${sdk.major}.${sdk.minor}.${sdk.patch}` : '0.0.0-development';
6282
6284
  };
6283
6285
 
6284
- const version = "1.44.1";
6286
+ const version = "1.44.3";
6285
6287
  const [major, minor, patch] = version.split('.');
6286
6288
  let sdkInfo = {
6287
6289
  type: SdkType.PLAIN_JAVASCRIPT,
@@ -8582,6 +8584,7 @@ class StreamSfuClient {
8582
8584
  this.isClosingClean = false;
8583
8585
  this.pingIntervalInMs = 5 * 1000;
8584
8586
  this.unhealthyTimeoutInMs = 15 * 1000;
8587
+ this.subscriptionsConcurrencyTag = Symbol('subscriptionsConcurrencyTag');
8585
8588
  /**
8586
8589
  * Promise that resolves when the JoinResponse is received.
8587
8590
  * Rejects after a certain threshold if the response is not received.
@@ -8689,8 +8692,10 @@ class StreamSfuClient {
8689
8692
  this.close(StreamSfuClient.NORMAL_CLOSURE, reason.substring(0, 115));
8690
8693
  };
8691
8694
  this.updateSubscriptions = async (tracks) => {
8692
- await this.joinTask;
8693
- return retryable((invocationMeta) => this.rpc.updateSubscriptions({ sessionId: this.sessionId, tracks }, { invocationMeta }), this.abortController.signal);
8695
+ return withoutConcurrency(this.subscriptionsConcurrencyTag, async () => {
8696
+ await this.joinTask;
8697
+ return retryable((invocationMeta) => this.rpc.updateSubscriptions({ sessionId: this.sessionId, tracks }, { invocationMeta }), this.abortController.signal);
8698
+ });
8694
8699
  };
8695
8700
  this.setPublisher = async (data) => {
8696
8701
  await this.joinTask;
@@ -12997,7 +13002,8 @@ class Call {
12997
13002
  // const calls = useCalls().filter((c) => c.ringing);
12998
13003
  const calls = this.clientStore.calls.filter((c) => c.cid !== this.cid);
12999
13004
  this.clientStore.setCalls([this, ...calls]);
13000
- await this.applyDeviceConfig(settings, false);
13005
+ const skipSpeakerApply = isReactNative();
13006
+ await this.applyDeviceConfig(settings, false, skipSpeakerApply);
13001
13007
  };
13002
13008
  /**
13003
13009
  * Loads the information about the call.
@@ -13020,7 +13026,13 @@ class Call {
13020
13026
  this.watching = true;
13021
13027
  this.clientStore.registerOrUpdateCall(this);
13022
13028
  }
13023
- await this.applyDeviceConfig(response.call.settings, false);
13029
+ // Skip speaker setup on RN if ringing was requested or the call is already ringing
13030
+ const skipSpeakerApply = isReactNative()
13031
+ ? params?.ring === true
13032
+ ? true
13033
+ : this.ringing
13034
+ : false;
13035
+ await this.applyDeviceConfig(response.call.settings, false, skipSpeakerApply);
13024
13036
  return response;
13025
13037
  };
13026
13038
  /**
@@ -13041,7 +13053,13 @@ class Call {
13041
13053
  this.watching = true;
13042
13054
  this.clientStore.registerOrUpdateCall(this);
13043
13055
  }
13044
- await this.applyDeviceConfig(response.call.settings, false);
13056
+ // Skip speaker setup on RN if ringing was requested or the call is already ringing
13057
+ const skipSpeakerApply = isReactNative()
13058
+ ? data?.ring === true
13059
+ ? true
13060
+ : this.ringing
13061
+ : false;
13062
+ await this.applyDeviceConfig(response.call.settings, false, skipSpeakerApply);
13045
13063
  return response;
13046
13064
  };
13047
13065
  /**
@@ -13296,7 +13314,7 @@ class Call {
13296
13314
  // device settings should be applied only once, we don't have to
13297
13315
  // re-apply them on later reconnections or server-side data fetches
13298
13316
  if (!this.deviceSettingsAppliedOnce && this.state.settings) {
13299
- await this.applyDeviceConfig(this.state.settings, true);
13317
+ await this.applyDeviceConfig(this.state.settings, true, false);
13300
13318
  globalThis.streamRNVideoSDK?.callManager.start();
13301
13319
  this.deviceSettingsAppliedOnce = true;
13302
13320
  }
@@ -14554,8 +14572,10 @@ class Call {
14554
14572
  *
14555
14573
  * @internal
14556
14574
  */
14557
- this.applyDeviceConfig = async (settings, publish) => {
14558
- this.speaker.apply(settings);
14575
+ this.applyDeviceConfig = async (settings, publish, skipSpeakerApply) => {
14576
+ if (!skipSpeakerApply) {
14577
+ this.speaker.apply(settings);
14578
+ }
14559
14579
  await this.camera.apply(settings.video, publish).catch((err) => {
14560
14580
  this.logger.warn('Camera init failed', err);
14561
14581
  });
@@ -15870,7 +15890,7 @@ class StreamClient {
15870
15890
  this.getUserAgent = () => {
15871
15891
  if (!this.cachedUserAgent) {
15872
15892
  const { clientAppIdentifier = {} } = this.options;
15873
- const { sdkName = 'js', sdkVersion = "1.44.1", ...extras } = clientAppIdentifier;
15893
+ const { sdkName = 'js', sdkVersion = "1.44.3", ...extras } = clientAppIdentifier;
15874
15894
  this.cachedUserAgent = [
15875
15895
  `stream-video-${sdkName}-v${sdkVersion}`,
15876
15896
  ...Object.entries(extras).map(([key, value]) => `${key}=${value}`),
@@ -16305,7 +16325,7 @@ class StreamVideoClient {
16305
16325
  clientStore: this.writeableStateStore,
16306
16326
  });
16307
16327
  call.state.updateFromCallResponse(c.call);
16308
- await call.applyDeviceConfig(c.call.settings, false);
16328
+ await call.applyDeviceConfig(c.call.settings, false, isReactNative());
16309
16329
  if (data.watch) {
16310
16330
  await call.setup();
16311
16331
  this.writeableStateStore.registerCall(call);