2026-01-13 14:49:19 +01:00

64 lines
2.1 KiB
TypeScript

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<void> {
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<unknown>) => {
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<unknown>): void => {
if (isWorkerMessageEnvelope(event.data) && event.data.type === 'WORKER_READY') {
clearTimeout(readyTimeout)
params.worker.removeEventListener('message', readyHandler)
params.resolve()
}
}
params.worker.addEventListener('message', readyHandler)
}