feat: webrtc 145 upgrade#2133
Conversation
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThis PR bumps ChangesWebRTC Alpha & iOS Audio Refactor
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@sample-apps/react-native/dogfood/ios/Podfile`:
- Line 13: Move the pod declaration for StreamWebRTC into the target block to
make the Podfile intent explicit: locate the top-level line "pod 'StreamWebRTC',
podspec:
'https://raw.githubusercontent.com/GetStream/stream-video-swift-webrtc/137.0.62/StreamWebRTC.podspec'"
and cut it into the "target 'StreamReactNativeVideoSDKSample'" block (near the
"use_frameworks! :linkage => :static" statement) so the pod is declared inside
that target rather than at root scope.
In `@sample-apps/react-native/dogfood/package.json`:
- Line 24: The PR updates the react-native WebRTC dependency to the pre-release
"@stream-io/react-native-webrtc": "137.1.3-alpha.1" but does not include the
regenerated CocoaPods lock; run pod install in the iOS workspace to produce an
updated Podfile.lock that reflects the pinned StreamWebRTC (e.g., the manual pin
"StreamWebRTC 137.0.62" in the Podfile), then add and commit the updated
Podfile.lock alongside the package.json change so other contributors will get
the exact CocoaPods resolution.
# Conflicts: # sample-apps/react-native/dogfood/ios/Podfile.lock # sample-apps/react-native/dogfood/package.json # yarn.lock
# Conflicts: # sample-apps/react-native/dogfood/ios/Podfile.lock # yarn.lock
# Conflicts: # .yarnrc.yml # yarn.lock
### 💡 Overview Adds `hasInterruptedTrack(participant, trackType)` to `@stream-io/video-client` that returns `true` only when a track is in both `interruptedTracks` and `publishedTracks`. This avoids a stale "audio interrupted" indicator that lingers after a remote sender unpublishes the track while it was interrupted, because the receiver-side `unmute` event does not always fire for an unpublish. 📑 Docs: GetStream/docs-content#1322
…and Expo 56 (#2268) Rolls up the dependency upgrades on the `deps-upgrade` branch into a single PR. This is a maintenance/chore change with no intended public API changes for the SDKs; the bulk of the diff is `yarn.lock`, sample-app manifests, and native lockfiles (`Podfile.lock`, `Gemfile.lock`, gradle wrapper). Highlights: - React Native 0.81 -> 0.85, React 19.1 -> 19.2 - Vite 8 and Vitest 4 (with test adaptations for Vitest 4 breaking changes) - Expo SDK 56 patch releases (expo, expo-build-properties, expo-constants, expo-dev-client, expo-linking, expo-notifications, expo-router) - @gorhom/bottom-sheet 5.1.8 -> 5.2.9 (dogfood) - react-native-teleport 0.5.6 -> 1.1.7 (dogfood) - React web sample apps dependency bumps ### 📝 Implementation notes - `@gorhom/bottom-sheet` 5.2 removed `shouldHandleKeyboardEvents` from its internal context; the dogfood livestream chat (`BottomSheetChatWrapper.tsx`) was migrated to the new `animatedKeyboardState` / `textInputNodesRef` keyboard API. - Vitest 4 test adaptations in `packages/client`. --------- Co-authored-by: Ivan Sekovanikj <ivan.sekovanikj@getstream.io> # Conflicts: # packages/noise-cancellation-react-native/package.json # packages/react-native-callingx/package.json # packages/video-filters-react-native/package.json # sample-apps/react-native/dogfood/ios/Podfile.lock # yarn.lock
# Conflicts: # sample-apps/react-native/dogfood/ios/Podfile.lock # sample-apps/react-native/dogfood/package.json # yarn.lock
# Conflicts: # packages/noise-cancellation-react-native/package.json # packages/react-native-callingx/package.json # packages/video-filters-react-native/package.json # sample-apps/react-native/dogfood/ios/Podfile.lock # sample-apps/react/react-dogfood/next-env.d.ts # yarn.lock
# Conflicts: # sample-apps/react-native/dogfood/ios/Podfile.lock
Decoded remote frames arrive as RTCNV12Buffer (enabled by the new NV12 rendering path), a type the PiP buffer transform didn't handle, so no CMSampleBuffer was produced and the PiP window stayed empty while the overlays still rendered.
- Convert non-i420/non-CVPixelBuffer frames to i420 via toI420()
- Round the resize target to even dimensions; odd YUV sizes break the
pixel buffer pool and conversion
- Gate rendering on a non-zero contentSize and recompute resize params
in layoutSubviews once the real size is known
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/noise-cancellation-react-native/android/build.gradle`:
- Line 110: The repository content filters currently whitelist only the module
'stream-video-android-noise-cancellation' so the new dependency
io.getstream:stream-video-android-noise-cancellation-libwebrtc:3.0.0 will be
blocked; update both snapshot repository content { ... includeModule(...) }
blocks to also include the module
'stream-video-android-noise-cancellation-libwebrtc' for group 'io.getstream'
(i.e., add includeModule("io.getstream",
"stream-video-android-noise-cancellation-libwebrtc") alongside the existing
includeModule calls) so the libwebrtc artifact can be resolved.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 5ffc788e-bbae-46ae-930e-04dc291221bd
📒 Files selected for processing (14)
.yarnrc.ymlpackages/noise-cancellation-react-native/android/build.gradlepackages/noise-cancellation-react-native/package.jsonpackages/react-native-callingx/ios/AudioSessionManager.swiftpackages/react-native-callingx/ios/Callingx.mmpackages/react-native-callingx/ios/CallingxImpl.swiftpackages/react-native-callingx/ios/CallingxSessionOwnership.swiftpackages/react-native-callingx/package.jsonpackages/react-native-callingx/src/types.tspackages/react-native-sdk/ios/PictureInPicture/StreamBufferTransformer.swiftpackages/react-native-sdk/ios/PictureInPicture/StreamPictureInPictureVideoRenderer.swiftpackages/react-native-sdk/ios/PictureInPicture/StreamRTCYUVBuffer.swiftpackages/react-native-sdk/ios/StreamInCallManager.swiftpackages/react-native-sdk/package.json
💤 Files with no reviewable changes (11)
- packages/react-native-callingx/package.json
- packages/react-native-callingx/ios/Callingx.mm
- packages/react-native-callingx/ios/CallingxSessionOwnership.swift
- packages/react-native-sdk/package.json
- packages/react-native-callingx/src/types.ts
- packages/react-native-callingx/ios/AudioSessionManager.swift
- packages/react-native-sdk/ios/PictureInPicture/StreamBufferTransformer.swift
- packages/react-native-sdk/ios/PictureInPicture/StreamRTCYUVBuffer.swift
- packages/react-native-sdk/ios/StreamInCallManager.swift
- packages/react-native-callingx/ios/CallingxImpl.swift
- packages/react-native-sdk/ios/PictureInPicture/StreamPictureInPictureVideoRenderer.swift
# Conflicts: # sample-apps/react-native/dogfood/ios/Podfile.lock
There was a problem hiding this comment.
♻️ Duplicate comments (1)
packages/noise-cancellation-react-native/android/build.gradle (1)
76-90:⚠️ Potential issue | 🟠 Major | ⚡ Quick winFix repository filters to match the new libwebrtc artifact.
Line 76 passes a full coordinate as the module name (
io.getstream:...), which does not match Gradle’sincludeModule(group, module)contract, and Line 89 still whitelists the old module. This can block resolution from snapshot repos forstream-video-android-noise-cancellation-libwebrtc.Proposed fix
content { // This efficiently tells Gradle to only look for this specific dependency in this repository - includeModule('io.getstream', 'io.getstream:stream-video-android-noise-cancellation-libwebrtc') + includeModule('io.getstream', 'stream-video-android-noise-cancellation-libwebrtc') } ... content { // This efficiently tells Gradle to only look for this specific dependency here - includeModule('io.getstream', 'stream-video-android-noise-cancellation') + includeModule('io.getstream', 'stream-video-android-noise-cancellation-libwebrtc') }#!/bin/bash set -euo pipefail f="packages/noise-cancellation-react-native/android/build.gradle" echo "== includeModule entries ==" rg -n "includeModule\(" "$f" echo echo "== dependency artifact ==" rg -n "stream-video-android-noise-cancellation" "$f"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/noise-cancellation-react-native/android/build.gradle` around lines 76 - 90, The repository filters are using the wrong module names: replace the incorrect full-coordinate call includeModule('io.getstream', 'io.getstream:stream-video-android-noise-cancellation-libwebrtc') with the proper group+module form includeModule('io.getstream', 'stream-video-android-noise-cancellation-libwebrtc') where includeModule is used, and update the whitelist entry inside rootProject.allprojects (currently including 'stream-video-android-noise-cancellation') to the new artifact name 'stream-video-android-noise-cancellation-libwebrtc' so Gradle can resolve snapshots from the Sonatype repo.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Duplicate comments:
In `@packages/noise-cancellation-react-native/android/build.gradle`:
- Around line 76-90: The repository filters are using the wrong module names:
replace the incorrect full-coordinate call includeModule('io.getstream',
'io.getstream:stream-video-android-noise-cancellation-libwebrtc') with the
proper group+module form includeModule('io.getstream',
'stream-video-android-noise-cancellation-libwebrtc') where includeModule is
used, and update the whitelist entry inside rootProject.allprojects (currently
including 'stream-video-android-noise-cancellation') to the new artifact name
'stream-video-android-noise-cancellation-libwebrtc' so Gradle can resolve
snapshots from the Sonatype repo.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: dd55055d-deac-41c2-878c-a15adf24b4a3
📒 Files selected for processing (1)
packages/noise-cancellation-react-native/android/build.gradle
Add a CallId badge overlaid at the top of the active meeting and ringing call screens. It shows the current call ID and opens the share sheet on tap so the ID can be copied or sent. The badge only renders while the call is active, so it never covers the lobby, ringing, or PiP UI. Also shorten randomId() to a 6-char ID so it is easier to type elsewhere.
Accepting an incoming CallKit call after the app was killed started the mic muted (UI muted + no audio out) until manual unmute. With the WebRTC ADM in .voiceProcessing mute mode, iOS 17+ unifies voice-processing input mute with the system input mute and CallKit auto-adopts it. So the app's transient setMutedCall(true) (synced while isMute is still true pre-join) round-trips back as a system-initiated CXSetMutedCallAction, and engine startup emits more. Forwarding those to JS ran microphone.disable() and the mic stuck muted. performSetMutedCallAction now forwards only genuine native-CallKit-UI mutes, suppressing: - app-initiated actions, matched by CXAction.uuid (appInitiatedMuteActionIds; a set, so concurrent toggles each match their own action) - the iOS 17 system echo of our own setMutedCall, matched by value (lastAppRequestedMute), reset on call end so it can't leak across calls - engine-startup artifacts, via an isAudioEngineStarting window (willEnableAudioEngine..willStartAudioEngine) Also re-wire the ADM engine subscription when the ADM instance changes, so a JS reload (new WebRTCModule) doesn't leave it bound to a dead publisher, and remove the now-unused per-call isSelfMuted flag. Replaces the package's #if DEBUG NSLog calls with CallingxLog, a unified os.Logger wrapper (per-area categories under the io.getstream.callingx subsystem, public-privacy values, @objc bridge for ObjC callers), so logs are filterable via Console.app / `log stream` without an attached debugger.
Overview
Test plan
Summary by CodeRabbit
New Features
Bug Fixes
Chores