## 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.