# SharedArrayBuffer for Zoom Meeting SDK Web SharedArrayBuffer (SAB) is a web API that enables shared memory in JavaScript, significantly improving performance for WebAssembly-based features. Zoom uses SharedArrayBuffer to power advanced features. ## Why SharedArrayBuffer Matters **Features that REQUIRE SharedArrayBuffer:** - 720p video sending (HD) - 1080p video for webinar attendees - Gallery view (up to 25 videos) - Virtual backgrounds - Background noise suppression - Share tab audio (Chrome/Edge) **Without SharedArrayBuffer:** - Video limited to standard definition - Gallery view may show fewer participants - Virtual backgrounds unavailable - Some performance features degraded > **Note**: SharedArrayBuffer is NOT required for basic meeting functionality or WebRTC. The SDK will work without it, but with limited features. ## How to Enable SharedArrayBuffer SharedArrayBuffer requires **Cross-Origin Isolation**. You must configure your server to send specific HTTP headers. ### Quick Comparison of Methods | Method | Type | Custom Headers Required | Best For | |--------|------|------------------------|----------| | **Cross-Origin Isolation** | Permanent | Yes | Production | | **Credentialless Headers** | Permanent | Yes | Production with 3rd-party content | | **Document-Isolation-Policy** | Permanent | Yes | Chrome/Edge 137+ with iframes | | **Service Workers** | Permanent | No | GitHub Pages, static hosts | | **Chrome Origin Trials** | Temporary | No | Testing only (renew every 3 months) | ## Implementation Methods ### Method 1: Cross-Origin Isolation (Recommended) Add these headers to ALL responses from your server: ``` Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp ``` **Pros**: Industry standard, works across all browsers **Cons**: May break third-party iframes/content without CORS headers ### Method 2: Credentialless Headers ``` Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: credentialless ``` **Pros**: More compatible with third-party content **Cons**: Same browser support as Method 1 ### Method 3: Document-Isolation-Policy (Chrome/Edge 137+) ``` Document-Isolation-Policy: isolate-and-require-corp # OR Document-Isolation-Policy: isolate-and-credentialless ``` **Pros**: Allows embedding third-party iframes, videos, payment gateways **Cons**: Chrome/Edge 137+ only (desktop) ### Method 4: Service Worker (No Server Headers) For platforms that don't allow custom headers (GitHub Pages): 1. Add [coi-serviceworker](https://github.com/gzuidhof/coi-serviceworker) to your project: ```html ``` 2. Place `coi-serviceworker.js` in your root directory **Pros**: Works on static hosting without header control **Cons**: Adds slight overhead, requires service worker support ### Method 5: Chrome Origin Trials (Temporary) 1. Register at [Chrome Origin Trials](https://developer.chrome.com/origintrials/#/trials/active) 2. Add meta tag to your page: ```html ``` **Pros**: Quick testing without server changes **Cons**: Must renew every 3 months, will be deprecated ## Platform-Specific Configuration ### Vercel **Next.js (next.config.js):** ```javascript module.exports = { async headers() { return [ { source: '/(.*)', headers: [ { key: 'Cross-Origin-Opener-Policy', value: 'same-origin', }, { key: 'Cross-Origin-Embedder-Policy', value: 'require-corp', }, ], }, ]; }, }; ``` **Non-Next.js (vercel.json):** ```json { "headers": [ { "source": "/(.*)", "headers": [ { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" } ] } ] } ``` ### Netlify (_headers file) Create `_headers` in your publish directory: ``` /* Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp ``` ### AWS CloudFront Use CloudFront Response Headers Policy: 1. Go to CloudFront > Policies > Response headers 2. Create custom policy with: - `Cross-Origin-Opener-Policy: same-origin` - `Cross-Origin-Embedder-Policy: require-corp` 3. Attach to your distribution ### Google App Engine (app.yaml) ```yaml handlers: - url: /.* static_files: index.html upload: index.html http_headers: Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp ``` ### nginx ```nginx server { location / { add_header Cross-Origin-Opener-Policy "same-origin" always; add_header Cross-Origin-Embedder-Policy "require-corp" always; # ... other config } } ``` ### Apache (.htaccess) ```apache Header set Cross-Origin-Opener-Policy "same-origin" Header set Cross-Origin-Embedder-Policy "require-corp" ``` ### Express.js ```javascript app.use((req, res, next) => { res.setHeader('Cross-Origin-Opener-Policy', 'same-origin'); res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp'); next(); }); ``` ### GitHub Pages GitHub Pages doesn't support custom headers. Use the **Service Worker method**: 1. Download [coi-serviceworker.js](https://github.com/gzuidhof/coi-serviceworker) 2. Place in repository root 3. Add to your HTML before other scripts: ```html ``` ## Verify SharedArrayBuffer is Enabled ### In Browser Console ```javascript // Check if SharedArrayBuffer is available console.log('SharedArrayBuffer:', typeof SharedArrayBuffer === 'function'); // Check cross-origin isolation console.log('Cross-Origin Isolated:', window.crossOriginIsolated); ``` ### In Your Application ```javascript // Before initializing Zoom SDK if (typeof SharedArrayBuffer !== 'function') { console.warn('SharedArrayBuffer not available. HD features will be limited.'); console.warn('Enable COOP/COEP headers on your server.'); } // Check isolation status if (!window.crossOriginIsolated) { console.warn('Page is not cross-origin isolated.'); } ``` ### Using Zoom SDK ```javascript // Client View - use disableCORP for development without headers ZoomMtg.init({ disableCORP: !window.crossOriginIsolated, // ... other options }); ``` ## Troubleshooting ### "SharedArrayBuffer is not defined" **Cause**: Headers not configured or browser doesn't support cross-origin isolation. **Fix**: 1. Verify headers are being sent (check Network tab in DevTools) 2. Ensure headers are on ALL responses (not just HTML) 3. Check for conflicting headers from CDN/proxy ### Third-Party Content Blocked **Cause**: `require-corp` blocks resources without CORS headers. **Fix**: 1. Use `credentialless` instead of `require-corp` 2. Or add `crossorigin="anonymous"` to external resources: ```html ``` ### Service Worker Not Working **Cause**: Service worker not registered or not at root. **Fix**: 1. Ensure `coi-serviceworker.js` is in the root directory 2. Check service worker is registered in DevTools > Application > Service Workers 3. Try hard refresh (Ctrl+Shift+R) ### Headers Present but SAB Still Unavailable **Cause**: Possibly Chrome < 92 or other browser limitations. **Fix**: 1. Update browser to latest version 2. Check if browsing in incognito (some extensions can interfere) 3. Verify both COOP and COEP headers are present ## Browser Support for SharedArrayBuffer | Browser | Version | Notes | |---------|---------|-------| | Chrome | 92+ | Full support with COOP/COEP | | Edge | 92+ | Full support with COOP/COEP | | Firefox | 79+ | Full support with COOP/COEP | | Safari | 15.2+ | Full support with COOP/COEP | | iOS Safari | 15.2+ | Full support with COOP/COEP | | Android Chrome | 92+ | Full support with COOP/COEP | ## Additional Resources - [Why you need "cross-origin isolated" for powerful features](https://web.dev/articles/why-coop-coep) - [Making your website "cross-origin isolated"](https://web.dev/articles/coop-coep) - [coi-serviceworker GitHub](https://github.com/gzuidhof/coi-serviceworker) - [Document-Isolation-Policy explainer](https://github.com/nickreese/nickreese.github.io/tree/main/document-isolation-policy)