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