64 lines
2.1 KiB
TypeScript
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)
|
|
}
|