Skip to content

chore: backport #2594 and #2596 to v1 - #2597

Merged
oliverlaz merged 2 commits into
release-v1from
backport/v1-2026-11-06
Nov 6, 2026
Merged

oliverlaz merged 2 commits into
release-v1from
backport/v1-2026-11-06

Conversation

@oliverlaz

Copy link
Copy Markdown
Member

💡 Overview

Weekly v1 backport round. Cherry-picks (-x) of the merged backport-v1 PRs from main, in merge order:

📝 Implementation notes

  • Both picks applied without conflicts and change exactly the same lines as their originals; each commit keeps its original author and the (cherry picked from commit ...) trailer.
  • fix(client): report the noise cancellation engine and model to the SFU #2596 updates the generated SFU protobuf files; after the pick they are identical to main's.
  • Verified locally against release-v1: no new type errors in the touched packages, client vitest passes (the three suites that need STREAM_SECRET run in CI), audio-filters-web tests pass (24), Prettier and ESLint clean.
  • Merge with "Rebase and merge", not squash, so authorship and the per-PR commits are preserved.

🎫 Ticket: https://linear.app/stream/issue/REACT-1531

📑 Docs: N/A

### 💡 Overview

Follow-up to #2589. Every option in `call.settings.extra_opts` can now
be overridden per browser with a suffixed key next to it, e.g.
`audio.use_web_audio_safari` next to `audio.use_web_audio`, or
`audio.media_constraints.echo_cancellation_firefox`. The suffixed key
wins over the plain key.

Each browser matches exactly one suffix:

| Runtime | Suffix |
|---|---|
| Safari (macOS/iOS), the other iOS browsers, and iOS WebViews that copy
Safari's user agent | `_safari` |
| Other WebKit runtimes: WKWebViews without a `Safari` token | `_webkit`
|
| Chromium browsers and shells: Chrome, Edge, Android Chrome, Android
WebViews, Electron | `_chrome` |
| Firefox | `_firefox` |
| No browser (React Native, server) | none: plain keys only |

### 📝 Implementation notes

- All in `getCallExtraOpts` (`helpers/extraOpts.ts`), so screen share,
mic constraints, Web Audio, silent audio, noise cancellation and the
React and React Native providers pick it up without changes. The backend
stores `extra_opts` untyped, so no backend change is needed.
- The suffix comes from the existing
`isSafari`/`isWebKit`/`isFirefox`/`isChrome` helpers. Each option reads
as `asX(read(record, key))`: a missing or `null` override falls back to
the plain key, and an override of the wrong type falls to the SDK
default, like an invalid plain value.
- Groups (`audio`, `media_constraints`, `noise_cancellation`) take no
suffix; their options do.
- Tests stub real user agents for Safari, iOS Chrome, a WKWebView, the
Google app's WebView, an Android WebView, Chrome, Edge, Firefox and no
browser.

🎫 Ticket:
https://linear.app/stream/issue/VID-1741/staff-managed-client-media-settings-per-call-type-screenshare-content

📑 Docs: not needed, staff-only settings

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
<!-- coderabbit-ai-generated:v1 -->

## Summary by CodeRabbit

* **New Features**
* Call options can use browser-specific overrides for Safari (including
iOS browsers reporting as Safari), WebViews, Firefox, and Chromium
browsers. Missing or `null` overrides fall back to the plain option.
* Browser-specific overrides apply to individual options, not to audio,
media constraints, or noise cancellation groups.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

(cherry picked from commit 4a31de3)
#2596)

### 💡 Overview

`StartNoiseCancellation` and `StopNoiseCancellation` now tell the SFU
which engine runs (Krisp or Stream's FastEnhancer) and which model
variant. Protocol change:
GetStream/protocol#2242

### 📝 Implementation notes

- Regenerated the SFU protocol types (protobuf-ts 2.10.0). This also
picks up two comment-only updates already on protocol main.
- `@stream-io/audio-filters-web`: a `model` getter on
`INoiseCancellation`. Krisp reports its model file name without the
extension (from `krispSDKParams.models.modelNC`, then the call settings
`model_path`, then the default `krisp-nc-o-med-v7`). FastEnhancer
reports its size (`tiny`, `base`, `small`). The `NoiseCancellation`
router reports the running engine's model.
- `MicrophoneManager` maps `engine: 'stream'` to `STREAM` and anything
else to Krisp, the proto zero value. That covers React Native and custom
implementations; the model is empty when unknown.
- Stop sends what Start sent: the router drops its engine before the
final `change` event, so reading the model at that point would lose it.
- Tests: the reported engine and model in `MicrophoneManager`, the
router's `model`, and the Krisp and FastEnhancer model getters.

🎫 Ticket: https://linear.app/stream/issue/VID-1741

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
<!-- coderabbit-ai-generated:v1 -->

## Summary by CodeRabbit

* **New Features**
* Noise cancellation notifications now include the selected engine and
model when starting or stopping, providing more detail about the active
configuration.
* Supported noise cancellation engines now expose their model name when
available. The reported name reflects the configured model, including
custom model selections.
* The active model is available through the noise cancellation interface
while an engine is running, and is undefined when no active model is
available.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

(cherry picked from commit 595b708)
@coderabbitai

coderabbitai Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5f1474a2-fd9d-4ac5-8d22-986e1ef58187

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Share

@oliverlaz
oliverlaz requested a review from jdimovska November 6, 2026 14:04
@oliverlaz
oliverlaz merged commit f20ed8a into release-v1 Nov 6, 2026
17 checks passed
@oliverlaz
oliverlaz deleted the backport/v1-2026-11-06 branch November 6, 2026 14:04
@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown

Bundle size

Built package output. Sizes in KB; delta vs release-v1@da61d12.

Package Unminified Minified Δ min vs main
@stream-io/video-client 903.2 KB 317.7 KB +1.2 KB (+0.4%)
@stream-io/video-react-sdk 371.5 KB 224.2 KB 0 KB
↳ install total (+ client + react-bindings) 1312.0 KB 555.1 KB +1.2 KB (+0.2%)
@stream-io/video-react-native-sdk 465.4 KB 210.8 KB 0 KB
↳ install total (+ client + react-bindings) 1405.8 KB 541.8 KB +1.2 KB (+0.2%)
@stream-io/audio-filters-web (cjs) 42.0 KB 20.7 KB +362 B (+1.7%)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant