import { isWorkerMessageEnvelope } from './workerMessage' export function isWebWorkerAvailable(): boolean { return typeof window !== 'undefined' && Boolean(window.Worker) } export function createWriteWorkerInitPromise(params: { setWorker: (worker: Worker | null) => void }): Promise { return new Promise((resolve) => { if (!isWebWorkerAvailable()) { console.warn('[WriteService] Web Workers not available, using direct writes') resolve() return } try { const worker = new Worker('/writeWorker.js', { type: 'classic' }) params.setWorker(worker) registerWorkerListeners({ worker, resolve, setWorker: params.setWorker }) } catch (error) { console.warn('[WriteService] Failed to create worker, using direct writes:', error) resolve() } }) } function registerWorkerListeners(params: { worker: Worker resolve: () => void setWorker: (worker: Worker | null) => void }): void { params.worker.addEventListener('message', (event: MessageEvent) => { if (!isWorkerMessageEnvelope(event.data)) { console.error('[WriteService] Received invalid worker message envelope', { data: event.data }) return } if (event.data.type === 'ERROR') { console.error('[WriteService] Worker error:', event.data.data) } }) params.worker.addEventListener('error', (error) => { console.error('[WriteService] Worker error:', error) console.warn('[WriteService] Falling back to direct writes') params.setWorker(null) params.resolve() }) const readyTimeout = setTimeout(() => { console.warn('[WriteService] Worker ready timeout, using direct writes') params.worker.terminate() params.setWorker(null) params.resolve() }, 2000) const readyHandler = (event: MessageEvent): void => { if (isWorkerMessageEnvelope(event.data) && event.data.type === 'WORKER_READY') { clearTimeout(readyTimeout) params.worker.removeEventListener('message', readyHandler) params.resolve() } } params.worker.addEventListener('message', readyHandler) }