# CSP for WASM / Web Worker Libraries SPQ pages use `` tags with restrictive defaults. When adding client-side libraries that use WebAssembly or Web Workers (Tesseract.js, ONNX runtime, etc.), the CSP MUST be updated or the library silently fails. ## Required CSP Directives ### `script-src` — add `'unsafe-eval'` WASM compilation uses `new Function()` / `eval()` internally. Without it: ``` 'unsafe-eval' is not allowed source of script in ... "script-src 'self' 'unsafe-inline'" ``` ### `connect-src` — add CDN origin + `blob:` Web Workers download WASM cores and data files (e.g. `eng.traineddata`) from CDN via `fetch()`. Blob URLs are needed for worker communication. Without CDN: ``` Tesseract.min.js.map - violates ... "connect-src 'self'" ``` Without `blob:`: ``` Refused to connect to 'blob:...' because it violates ... "connect-src" ``` ### `worker-src` — add `blob:` Inline Web Workers created via `new Worker(URL.createObjectURL(blob))` need `blob:` in `worker-src`. ## Full CSP Template ```html ``` ## Diagnosis Pattern When a WASM/worker library silently hangs with no console errors visible at first glance: 1. Open **F12 → Console** and look for CSP violation messages (they appear as warnings, not errors) 2. They say exactly which directive was violated and which resource was blocked 3. Add the missing origin/blob: to the relevant directive 4. Hard refresh (Ctrl+Shift+R) to bypass `` tag cache Common silent-failure symptoms: - **Tesseract.js**: "Running OCR..." forever (worker can't download WASM/traineddata) - **ONNX**: Model loading hangs (can't fetch `.onnx` from CDN) - **Any WASM**: White screen or stuck spinner (WASM compilation blocked) ## Pages Affected Every SPQ page has its own `` CSP tag: | Page | CSP needed? | |---|---| | `appointments.html` | Yes (Tesseract.js) | | `index.html` | Minimal (no WASM) | | `customers.html` | Minimal | | `login.html` | Minimal | | `repair-orders.html` | Minimal (but has AI features via api.js) | Only update CSP on pages that actually load WASM/worker libraries. Over-restricting is fine; over-permissing is not.