/** * render-worker.js — Web Worker for off-main-thread PDF rendering. * * Has its own PDF.js instance. Renders pages via OffscreenCanvas and transfers * ImageBitmap objects back to the main thread with zero-copy transfer. * * Message protocol: * * Main → Worker: * { type: "init", pdfData: ArrayBuffer } (transferred, not copied) * { type: "render", pageNum, scale, gen } * { type: "cancel", gen } — renderGen check handles this implicitly * { type: "cleanup" } — pdfDoc.cleanup() (free caches) * { type: "destroy" } — pdfDoc.destroy(); self.close() * * Worker → Main: * { type: "ready", numPages } * { type: "rendered", pageNum, gen, bitmap } (bitmap as transferable) * { type: "error", message } */ importScripts("brittle://app/pdfjs/build/pdf.min.js"); const pdfjsLib = globalThis.pdfjsLib; // Do NOT set workerSrc to a brittle:// URL here. When PDF.js tries to spawn its // own sub-worker with new Worker("brittle://…") and that fails, it falls back to // a "fake worker" that injects a