stream.startAudio() hangs on Safari 26.2 (macOS Tahoe) — media WebSocket closed before established

## Environment

  • SDK: `@zoom/videosdk` v2.3.14 (also tested v2.2.12)

  • Browser: Safari 26.2 (Build 21623.1.14.11.9)

  • OS: macOS Tahoe (Darwin 25.2.0)

  • Chrome on the same machine works perfectly

## Issue

`stream.startAudio()` hangs forever — the promise never resolves or rejects. This happens 100% of the time on Safari 26.2.

## What works

  • `ZoomVideo.checkSystemRequirements()` returns `audio: true`

  • `client.init()` and `client.join()` succeed

  • `getUserMedia({ audio: true })` works (mic permission granted)

  • AudioContext can be created and resumed (state: running)

  • AudioWorklet is supported and `addModule()` works

  • SDK CDN resources download fine (js_media.min.js, audio.encode.wasm, etc.)

  • Web Workers can be created from CDN blob URLs

## What fails

By intercepting Worker `postMessage`, we found the SDK sends audio init commands to its media worker (command 1 with `websocket_ip_address` and `encode: true`), but the **audio media WebSocket connection is

closed before it’s established**. The worker receives a `close` event. The SDK then polls with `command: 138` repeatedly but never gets the expected response.

The signaling WebSocket works (sessions join), but the media WebSocket to `wss://zoomyyz*.zoom.us/wc/media/…` fails specifically on Safari 26.2.

## What we tried (all fail)

  • `startAudio()` with no options

  • `startAudio({ autoStartAudioInSafari: true })`

  • `startAudio({ speakerOnly: true })`

  • `patchJsMedia: true` and `false`

  • `dependentAssets: ‘Global’` and `‘CDN’`

  • `audio_webrtc_mode: 1` in JWT token

  • Pre-warming AudioContext + getUserMedia before startAudio

  • With and without COOP/COEP headers

  • SDK v2.3.14 and v2.2.12

## Expected

`startAudio()` should resolve and audio should work, as it does on Chrome.