@stream-io/video-react-native-sdk 1.38.0 → 1.38.2

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,26 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [1.38.2](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.38.1...@stream-io/video-react-native-sdk-1.38.2) (2026-06-12)
6
+
7
+ ### Dependency Updates
8
+
9
+ - `@stream-io/video-client` updated to version `1.53.2`
10
+ - `@stream-io/video-react-bindings` updated to version `1.16.5`
11
+
12
+ ## [1.38.1](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.38.0...@stream-io/video-react-native-sdk-1.38.1) (2026-06-12)
13
+
14
+ ### Dependency Updates
15
+
16
+ - `@stream-io/react-native-callingx` updated to version `0.5.1`
17
+ - `@stream-io/video-client` updated to version `1.53.1`
18
+ - `@stream-io/video-react-bindings` updated to version `1.16.4`
19
+
20
+ ### Bug Fixes
21
+
22
+ - avoid constraint warning log spam in iOS PiP ([ead822b](https://github.com/GetStream/stream-video-js/commit/ead822b2d12e5f09a14d8b179f1d6a49450b2491))
23
+ - **ios:** joining a call muted may break remote audio playout ([#2282](https://github.com/GetStream/stream-video-js/issues/2282)) ([dc672a6](https://github.com/GetStream/stream-video-js/commit/dc672a69971d6ca46648696c242609c687cb42d7))
24
+
5
25
  ## [1.38.0](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.37.0...@stream-io/video-react-native-sdk-1.38.0) (2026-06-11)
6
26
 
7
27
  ### Dependency Updates
@@ -73,6 +73,22 @@ const streamRNVideoSDKGlobals = {
73
73
  return;
74
74
  }
75
75
  StreamInCallManagerNativeModule.stop();
76
+ },
77
+ // iOS-only. Keep the AVAudioEngine mic-input (voice-processing) chain
78
+ // prepared while muted so the engine stays full-duplex and remote audio
79
+ // renders when joining muted. Intentionally NOT gated by
80
+ // `shouldBypassForCallKit`: it acts on the shared `RTCAudioDeviceModule`, so
81
+ // it must run for both the StreamInCallManager and CallKit/callingx paths.
82
+ setMutedRecordingPrepared: enabled => {
83
+ if (_reactNative.Platform.OS !== 'ios') {
84
+ return;
85
+ }
86
+ if (enabled) {
87
+ // Mute via the voice-processing unit (it's the default, fail safe config here) so the input chain
88
+ // stays built while muted, rather than tearing the engine down.
89
+ _reactNativeWebrtc.AudioDeviceModule.setMuteMode(_reactNativeWebrtc.AudioEngineMuteMode.VoiceProcessing).catch(() => {});
90
+ }
91
+ _reactNativeWebrtc.AudioDeviceModule.setRecordingAlwaysPreparedMode(enabled).catch(() => {});
76
92
  }
77
93
  },
78
94
  permissions: {
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_reactNativeWebrtc","_callingx","_callingx2","StreamInCallManagerNativeModule","NativeModules","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","CallingxModule","getCallingxLibIfAvailable","shouldBypassForCallKit","isRingingTypeCall","Platform","OS","bypass","isSetup","isOngoingCallsEnabled","streamRNVideoSDKGlobals","callingX","joinCall","joinCallingxCall","endCall","endCallingxCall","registerOutgoingCall","callManager","setup","defaultDevice","setDefaultAudioDeviceEndpointType","start","stop","permissions","check","permission","nativeAndroidPermission","PermissionsAndroid","PERMISSIONS","CAMERA","RECORD_AUDIO","Boolean","checkPermission","nativeEvents","speechActivity","subscribe","cb","subscription","audioDeviceModuleEvents","addSpeechActivityListener","data","isSoundDetected","event","remove","registerSDKGlobals","global","streamRNVideoSDK"],"sourceRoot":"../../../../src","sources":["utils/internal/registerSDKGlobals.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_reactNativeWebrtc","_callingx","_callingx2","StreamInCallManagerNativeModule","NativeModules","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","CallingxModule","getCallingxLibIfAvailable","shouldBypassForCallKit","isRingingTypeCall","Platform","OS","bypass","isSetup","isOngoingCallsEnabled","streamRNVideoSDKGlobals","callingX","joinCall","joinCallingxCall","endCall","endCallingxCall","registerOutgoingCall","callManager","setup","defaultDevice","setDefaultAudioDeviceEndpointType","start","stop","setMutedRecordingPrepared","enabled","AudioDeviceModule","setMuteMode","AudioEngineMuteMode","VoiceProcessing","catch","setRecordingAlwaysPreparedMode","permissions","check","permission","nativeAndroidPermission","PermissionsAndroid","PERMISSIONS","CAMERA","RECORD_AUDIO","Boolean","checkPermission","nativeEvents","speechActivity","subscribe","cb","subscription","audioDeviceModuleEvents","addSpeechActivityListener","data","isSoundDetected","event","remove","registerSDKGlobals","global","streamRNVideoSDK"],"sourceRoot":"../../../../src","sources":["utils/internal/registerSDKGlobals.ts"],"mappings":"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","ignoreList":[]}
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = void 0;
7
- const version = exports.version = '1.38.0';
7
+ const version = exports.version = '1.38.2';
8
8
  //# sourceMappingURL=version.js.map
@@ -1,5 +1,5 @@
1
1
  import { NativeModules, PermissionsAndroid, Platform } from 'react-native';
2
- import { audioDeviceModuleEvents } from '@stream-io/react-native-webrtc';
2
+ import { AudioDeviceModule, AudioEngineMuteMode, audioDeviceModuleEvents } from '@stream-io/react-native-webrtc';
3
3
  import { getCallingxLibIfAvailable } from '../push/libs/callingx';
4
4
  import { endCallingxCall, registerOutgoingCall, joinCallingxCall } from './callingx/callingx';
5
5
  const StreamInCallManagerNativeModule = NativeModules.StreamInCallManager;
@@ -67,6 +67,22 @@ const streamRNVideoSDKGlobals = {
67
67
  return;
68
68
  }
69
69
  StreamInCallManagerNativeModule.stop();
70
+ },
71
+ // iOS-only. Keep the AVAudioEngine mic-input (voice-processing) chain
72
+ // prepared while muted so the engine stays full-duplex and remote audio
73
+ // renders when joining muted. Intentionally NOT gated by
74
+ // `shouldBypassForCallKit`: it acts on the shared `RTCAudioDeviceModule`, so
75
+ // it must run for both the StreamInCallManager and CallKit/callingx paths.
76
+ setMutedRecordingPrepared: enabled => {
77
+ if (Platform.OS !== 'ios') {
78
+ return;
79
+ }
80
+ if (enabled) {
81
+ // Mute via the voice-processing unit (it's the default, fail safe config here) so the input chain
82
+ // stays built while muted, rather than tearing the engine down.
83
+ AudioDeviceModule.setMuteMode(AudioEngineMuteMode.VoiceProcessing).catch(() => {});
84
+ }
85
+ AudioDeviceModule.setRecordingAlwaysPreparedMode(enabled).catch(() => {});
70
86
  }
71
87
  },
72
88
  permissions: {
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","PermissionsAndroid","Platform","audioDeviceModuleEvents","getCallingxLibIfAvailable","endCallingxCall","registerOutgoingCall","joinCallingxCall","StreamInCallManagerNativeModule","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","CallingxModule","shouldBypassForCallKit","isRingingTypeCall","OS","bypass","isSetup","isOngoingCallsEnabled","streamRNVideoSDKGlobals","callingX","joinCall","endCall","callManager","setup","defaultDevice","setDefaultAudioDeviceEndpointType","start","stop","permissions","check","permission","nativeAndroidPermission","PERMISSIONS","CAMERA","RECORD_AUDIO","Boolean","checkPermission","nativeEvents","speechActivity","subscribe","cb","subscription","addSpeechActivityListener","data","isSoundDetected","event","remove","registerSDKGlobals","global","streamRNVideoSDK"],"sourceRoot":"../../../../src","sources":["utils/internal/registerSDKGlobals.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeModules","PermissionsAndroid","Platform","AudioDeviceModule","AudioEngineMuteMode","audioDeviceModuleEvents","getCallingxLibIfAvailable","endCallingxCall","registerOutgoingCall","joinCallingxCall","StreamInCallManagerNativeModule","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","CallingxModule","shouldBypassForCallKit","isRingingTypeCall","OS","bypass","isSetup","isOngoingCallsEnabled","streamRNVideoSDKGlobals","callingX","joinCall","endCall","callManager","setup","defaultDevice","setDefaultAudioDeviceEndpointType","start","stop","setMutedRecordingPrepared","enabled","setMuteMode","VoiceProcessing","catch","setRecordingAlwaysPreparedMode","permissions","check","permission","nativeAndroidPermission","PERMISSIONS","CAMERA","RECORD_AUDIO","Boolean","checkPermission","nativeEvents","speechActivity","subscribe","cb","subscription","addSpeechActivityListener","data","isSoundDetected","event","remove","registerSDKGlobals","global","streamRNVideoSDK"],"sourceRoot":"../../../../src","sources":["utils/internal/registerSDKGlobals.ts"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- export const version = '1.38.0';
1
+ export const version = '1.38.2';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registerSDKGlobals.d.ts","sourceRoot":"","sources":["../../../../src/utils/internal/registerSDKGlobals.ts"],"names":[],"mappings":"AA2GA,wBAAgB,kBAAkB,SAIjC"}
1
+ {"version":3,"file":"registerSDKGlobals.d.ts","sourceRoot":"","sources":["../../../../src/utils/internal/registerSDKGlobals.ts"],"names":[],"mappings":"AAiIA,wBAAgB,kBAAkB,SAIjC"}
@@ -1,2 +1,2 @@
1
- export declare const version = "1.38.0";
1
+ export declare const version = "1.38.2";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -191,7 +191,9 @@ final class PictureInPictureAvatarView: UIView {
191
191
  if !isVideoEnabled {
192
192
  PictureInPictureLogger.log("AvatarView updateVisibility: becoming visible, forcing layout")
193
193
  setNeedsLayout()
194
- layoutIfNeeded()
194
+ if bounds.width > 0, bounds.height > 0 {
195
+ layoutIfNeeded()
196
+ }
195
197
  }
196
198
  }
197
199
 
@@ -431,7 +431,9 @@ final class StreamPictureInPictureVideoRenderer: UIView, RTCVideoRenderer {
431
431
  if shouldShowAvatar {
432
432
  PictureInPictureLogger.log("updateOverlayVisibility: showing avatar, forcing layout. participantName=\(participantName ?? "nil"), avatarView.participantName='\(avatarView.participantName ?? "nil")'")
433
433
  avatarView.setNeedsLayout()
434
- avatarView.layoutIfNeeded()
434
+ if bounds.width > 0, bounds.height > 0 {
435
+ avatarView.layoutIfNeeded()
436
+ }
435
437
  }
436
438
 
437
439
  // Participant overlay shows on BOTH video and avatar (matches upstream)
@@ -117,6 +117,17 @@ class StreamInCallManager: RCTEventEmitter {
117
117
  // TODO: for stereo we should disallow BluetoothHFP and allow only allowBluetoothA2DP
118
118
  // note: this is the behaviour of iOS native SDK, but fails here with (OSStatus error -50.)
119
119
  // options = self.enableStereo ? [.allowBluetoothA2DP] : []
120
+ } else if !micPermissionGranted() {
121
+ // Communicator without mic permission (denied or not yet asked): use a
122
+ // pure-output, no-VPIO session so the output-only AVAudioEngine renders
123
+ // remote audio. Mirrors stream-video-swift
124
+ // (isRecordingEnabled ? .playAndRecord : .playback). We can't record anyway.
125
+ // Self-heals: granting permission + unmuting rebuilds the engine.
126
+ // Known gap: .playback can't route to the receiver (earpiece) — that route
127
+ // only exists under .playAndRecord.
128
+ category = .playback
129
+ mode = .spokenAudio
130
+ options = []
120
131
  } else {
121
132
  // XCode 16 and older don't expose .allowBluetoothHFP
122
133
  // https://forums.swift.org/t/xcode-26-avaudiosession-categoryoptions-allowbluetooth-deprecated/80956
@@ -139,6 +150,14 @@ class StreamInCallManager: RCTEventEmitter {
139
150
  return rtcConfig
140
151
  }
141
152
 
153
+ private func micPermissionGranted() -> Bool {
154
+ if #available(iOS 17.0, *) {
155
+ return AVAudioApplication.shared.recordPermission == .granted
156
+ } else {
157
+ return AVAudioSession.sharedInstance().recordPermission == .granted
158
+ }
159
+ }
160
+
142
161
  @objc
143
162
  func setup() {
144
163
  audioSessionQueue.async { [self] in
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-io/video-react-native-sdk",
3
- "version": "1.38.0",
3
+ "version": "1.38.2",
4
4
  "description": "Stream Video SDK for React Native",
5
5
  "author": "https://getstream.io",
6
6
  "homepage": "https://getstream.io/video/docs/react-native/",
@@ -50,8 +50,8 @@
50
50
  "!**/.*"
51
51
  ],
52
52
  "dependencies": {
53
- "@stream-io/video-client": "1.53.0",
54
- "@stream-io/video-react-bindings": "1.16.3",
53
+ "@stream-io/video-client": "1.53.2",
54
+ "@stream-io/video-react-bindings": "1.16.5",
55
55
  "intl-pluralrules": "2.0.1",
56
56
  "react-native-url-polyfill": "^3.0.0",
57
57
  "rxjs": "~7.8.2",
@@ -117,7 +117,7 @@
117
117
  "@react-native/babel-preset": "0.85.3",
118
118
  "@react-native/metro-config": "0.85.3",
119
119
  "@stream-io/noise-cancellation-react-native": "^0.8.0",
120
- "@stream-io/react-native-callingx": "^0.5.0",
120
+ "@stream-io/react-native-callingx": "^0.5.1",
121
121
  "@stream-io/react-native-webrtc": "145.0.0",
122
122
  "@stream-io/video-filters-react-native": "^0.13.0",
123
123
  "@testing-library/jest-native": "^5.4.3",
@@ -1,6 +1,10 @@
1
1
  import { StreamRNVideoSDKGlobals } from '@stream-io/video-client';
2
2
  import { NativeModules, PermissionsAndroid, Platform } from 'react-native';
3
- import { audioDeviceModuleEvents } from '@stream-io/react-native-webrtc';
3
+ import {
4
+ AudioDeviceModule,
5
+ AudioEngineMuteMode,
6
+ audioDeviceModuleEvents,
7
+ } from '@stream-io/react-native-webrtc';
4
8
  import { getCallingxLibIfAvailable } from '../push/libs/callingx';
5
9
  import {
6
10
  endCallingxCall,
@@ -71,6 +75,24 @@ const streamRNVideoSDKGlobals: StreamRNVideoSDKGlobals = {
71
75
  }
72
76
  StreamInCallManagerNativeModule.stop();
73
77
  },
78
+ // iOS-only. Keep the AVAudioEngine mic-input (voice-processing) chain
79
+ // prepared while muted so the engine stays full-duplex and remote audio
80
+ // renders when joining muted. Intentionally NOT gated by
81
+ // `shouldBypassForCallKit`: it acts on the shared `RTCAudioDeviceModule`, so
82
+ // it must run for both the StreamInCallManager and CallKit/callingx paths.
83
+ setMutedRecordingPrepared: (enabled) => {
84
+ if (Platform.OS !== 'ios') {
85
+ return;
86
+ }
87
+ if (enabled) {
88
+ // Mute via the voice-processing unit (it's the default, fail safe config here) so the input chain
89
+ // stays built while muted, rather than tearing the engine down.
90
+ AudioDeviceModule.setMuteMode(
91
+ AudioEngineMuteMode.VoiceProcessing,
92
+ ).catch(() => {});
93
+ }
94
+ AudioDeviceModule.setRecordingAlwaysPreparedMode(enabled).catch(() => {});
95
+ },
74
96
  },
75
97
  permissions: {
76
98
  check: async (permission) => {
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '1.38.0';
1
+ export const version = '1.38.2';