@vedivad/typst-web-service 0.3.0 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formatter.ts","../src/rpc.ts","../src/service.ts"],"sourcesContent":["export interface FormatConfig {\n /** Number of spaces per indentation level. Default: 2 */\n tab_spaces?: number;\n /** Maximum line width. Default: 80 */\n max_width?: number;\n /** Maximum consecutive blank lines allowed. */\n blank_lines_upper_bound?: number;\n /** Collapse consecutive whitespace in markup to a single space. */\n collapse_markup_spaces?: boolean;\n /** Sort import items alphabetically. */\n reorder_import_items?: boolean;\n /** Wrap text in markup to fit within max_width. Implies collapse_markup_spaces. */\n wrap_text?: boolean;\n}\n\nexport interface FormatRangeResult {\n /** Start index (UTF-16) of the actual formatted range. */\n start: number;\n /** End index (UTF-16) of the actual formatted range. */\n end: number;\n /** The formatted text for the range. */\n text: string;\n}\n\ntype TypstyleModule = typeof import(\"@typstyle/typstyle-wasm-bundler\");\n\nlet typstylePromise: Promise<TypstyleModule> | null = null;\n\nfunction getTypstyle(): Promise<TypstyleModule> {\n if (!typstylePromise) {\n typstylePromise = import(\"@typstyle/typstyle-wasm-bundler\");\n }\n return typstylePromise;\n}\n\n/**\n * Typst code formatter powered by typstyle.\n *\n * Runs on the main thread — typstyle is lightweight and fast.\n * The WASM module is loaded lazily on first format call.\n *\n * const formatter = new TypstFormatter({ tab_spaces: 2, max_width: 80 });\n * const formatted = await formatter.format(source);\n */\nexport class TypstFormatter {\n private config: FormatConfig;\n\n constructor(config: FormatConfig = {}) {\n this.config = config;\n // Eagerly start loading WASM so it's ready by first use\n getTypstyle();\n }\n\n /** Format an entire Typst source string. */\n async format(source: string): Promise<string> {\n const typstyle = await getTypstyle();\n return typstyle.format(source, this.config);\n }\n\n /** Format a range within a Typst source string. Indices are UTF-16 code units. */\n async formatRange(\n source: string,\n start: number,\n end: number,\n ): Promise<FormatRangeResult> {\n const typstyle = await getTypstyle();\n const result = typstyle.format_range(source, start, end, this.config);\n return { start: result.start, end: result.end, text: result.text };\n }\n}\n","import type { WorkerRequest, WorkerResponse } from \"./types.js\";\n\n// Injected at build time by tsup (see tsup.config.ts)\ndeclare const __WORKER_CODE__: string;\n\nexport function createWorker(): Worker {\n const blob = new Blob([__WORKER_CODE__], { type: \"application/javascript\" });\n const url = URL.createObjectURL(blob);\n const worker = new Worker(url);\n const origTerminate = worker.terminate.bind(worker);\n worker.terminate = () => {\n origTerminate();\n URL.revokeObjectURL(url);\n };\n return worker;\n}\n\nexport function workerRpc(\n worker: Worker,\n request: WorkerRequest,\n timeoutMs = 30_000,\n): Promise<WorkerResponse> {\n return new Promise((resolve, reject) => {\n const handler = (e: MessageEvent<WorkerResponse>) => {\n if (e.data.id !== request.id) return;\n clearTimeout(timer);\n worker.removeEventListener(\"message\", handler);\n resolve(e.data);\n };\n const timer = setTimeout(() => {\n worker.removeEventListener(\"message\", handler);\n reject(new Error(`typst worker timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n worker.addEventListener(\"message\", handler);\n worker.postMessage(request);\n });\n}\n","import { createWorker, workerRpc } from \"./rpc.js\";\nimport type { DiagnosticMessage } from \"./types.js\";\n\nexport interface CompileResult {\n diagnostics: DiagnosticMessage[];\n /** Vector artifact bytes from the compiler, usable with typst-ts-renderer for SVG rendering. */\n vector?: Uint8Array;\n}\n\n/**\n * A dynamic `import()` expression that resolves to the `@myriaddreamin/typst-ts-renderer` module.\n * Keeps the renderer dependency opt-in — users who only need diagnostics never load the WASM.\n */\nexport type RendererModule = () => Promise<{\n default: (wasmUrl?: string) => Promise<unknown>;\n TypstRendererBuilder: new () => {\n build(): Promise<RendererInstance>;\n };\n}>;\n\n/** Minimal interface for the built TypstRenderer. */\nexport interface RendererInstance {\n create_session(): RendererSession;\n manipulate_data(\n session: RendererSession,\n action: string,\n data: Uint8Array,\n ): void;\n svg_data(session: RendererSession): string;\n}\n\n/** Minimal interface for a TypstRenderer session. */\nexport interface RendererSession {\n free(): void;\n}\n\n/** Options for the opt-in SVG renderer. */\nexport interface RendererOptions {\n /**\n * Dynamic import for the renderer module.\n * Example: () => import('@myriaddreamin/typst-ts-renderer')\n */\n module: RendererModule;\n /** URL to the typst-ts-renderer WASM binary. Defaults to jsDelivr CDN. */\n wasmUrl?: string;\n /** Called after each compile with the rendered SVG string. */\n onSvg: (svg: string) => void;\n}\n\nexport interface TypstServiceOptions {\n /**\n * URL to the typst-ts-web-compiler WASM binary.\n * Defaults to the matching version on jsDelivr CDN.\n * Override with a local asset URL for offline support or faster load:\n * `new URL('@myriaddreamin/typst-ts-web-compiler/pkg/typst_ts_web_compiler_bg.wasm', import.meta.url).href`\n */\n wasmUrl?: string;\n /** Font URLs to load into the Typst compiler. Defaults to Roboto from jsDelivr. */\n fonts?: string[];\n /**\n * Enable fetching @preview/ packages from packages.typst.org on demand.\n * Default: true.\n */\n packages?: boolean;\n /**\n * Opt-in SVG preview. When set, the renderer is initialized lazily and `onSvg`\n * is called after each successful compile.\n *\n * Example:\n * renderer: {\n * module: () => import('@myriaddreamin/typst-ts-renderer'),\n * onSvg: (svg) => { previewEl.innerHTML = svg },\n * }\n */\n renderer?: RendererOptions;\n}\n\nconst DEFAULT_FONTS = [\n \"https://cdn.jsdelivr.net/npm/roboto-font@0.1.0/fonts/Roboto/roboto-regular-webfont.ttf\",\n];\n\nconst DEFAULT_WASM_URL =\n \"https://cdn.jsdelivr.net/npm/@myriaddreamin/typst-ts-web-compiler@0.7.0-rc2/pkg/typst_ts_web_compiler_bg.wasm\";\n\nconst DEFAULT_RENDERER_WASM_URL =\n \"https://cdn.jsdelivr.net/npm/@myriaddreamin/typst-ts-renderer@0.7.0-rc2/pkg/typst_ts_renderer_bg.wasm\";\n\nconst TIMEOUT = { INIT: 60_000, RENDER: 60_000, DESTROY: 5_000 } as const;\n\n/**\n * Manages a Typst compiler worker. Create one instance and share it across\n * all extensions (linter, autocomplete, preview, etc.).\n *\n * Prefer constructing with an explicit Worker for Vite apps:\n * new TypstService(new Worker(new URL('typst-web-service/worker', import.meta.url)), options)\n *\n * Or use createTypstService() for a zero-config setup via an inlined blob worker.\n */\nexport class TypstService {\n readonly ready: Promise<void>;\n /** Resolves when the SVG renderer is ready, or rejects if it failed to initialize. Undefined if no renderer was configured. */\n readonly rendererReady?: Promise<void>;\n private idCounter = 0;\n\n private onSvg?: (svg: string) => void;\n private rendererInstance?: Promise<RendererInstance>;\n\n /** The most recent vector artifact from a compile, if any. */\n lastVector?: Uint8Array;\n\n constructor(\n private worker: Worker,\n options: TypstServiceOptions = {},\n ) {\n this.onSvg = options.renderer?.onSvg;\n\n if (options.renderer) {\n this.rendererInstance = this.#initRenderer(\n options.renderer.module,\n options.renderer.wasmUrl,\n );\n this.rendererReady = this.rendererInstance.then(() => {});\n }\n\n this.ready = workerRpc(\n this.worker,\n {\n type: \"init\",\n id: ++this.idCounter,\n wasmUrl: options.wasmUrl ?? DEFAULT_WASM_URL,\n fonts: options.fonts ?? DEFAULT_FONTS,\n packages: options.packages ?? true,\n },\n TIMEOUT.INIT,\n ).then((res) => {\n if (res.type === \"error\")\n throw new Error(`TypstService init failed: ${res.message}`);\n });\n }\n\n async #initRenderer(\n loadModule: RendererModule,\n wasmUrl?: string,\n ): Promise<RendererInstance> {\n const mod = await loadModule();\n await mod.default(wasmUrl ?? DEFAULT_RENDERER_WASM_URL);\n return new mod.TypstRendererBuilder().build();\n }\n\n #vectorToSvg(renderer: RendererInstance, vector: Uint8Array): string {\n const session = renderer.create_session();\n try {\n renderer.manipulate_data(session, \"reset\", vector);\n return renderer.svg_data(session);\n } finally {\n session.free();\n }\n }\n\n /** Compile a single source string (treated as /main.typ) or a map of files. */\n async compile(\n source: string | Record<string, string>,\n ): Promise<CompileResult> {\n await this.ready;\n const id = ++this.idCounter;\n const files = typeof source === \"string\" ? { \"/main.typ\": source } : source;\n const response = await workerRpc(this.worker, {\n type: \"compile\",\n id,\n files,\n });\n if (response.type === \"cancelled\") return { diagnostics: [] };\n if (response.type === \"result\") {\n const vector = response.vector\n ? new Uint8Array(response.vector)\n : undefined;\n if (vector) {\n this.lastVector = vector;\n this.#emitSvg(vector);\n }\n return { diagnostics: response.diagnostics, vector };\n }\n if (response.type === \"error\") throw new Error(response.message);\n return { diagnostics: [] };\n }\n\n async #emitSvg(vector: Uint8Array): Promise<void> {\n if (!this.onSvg || !this.rendererInstance) return;\n try {\n const renderer = await this.rendererInstance;\n this.onSvg(this.#vectorToSvg(renderer, vector));\n } catch {\n // renderer init failed; observable via rendererReady\n }\n }\n\n /**\n * Render a vector artifact to an SVG string.\n * Requires the `renderer` option to be set. Returns null if the renderer is unavailable.\n */\n async renderSvg(vector: Uint8Array): Promise<string | null> {\n if (!this.rendererInstance) return null;\n const renderer = await this.rendererInstance;\n return this.#vectorToSvg(renderer, vector);\n }\n\n /** Render to PDF from a single source string (treated as /main.typ) or a map of files. */\n async renderPdf(\n source: string | Record<string, string>,\n ): Promise<Uint8Array> {\n await this.ready;\n const id = ++this.idCounter;\n const files = typeof source === \"string\" ? { \"/main.typ\": source } : source;\n const response = await workerRpc(\n this.worker,\n { type: \"render\", id, files },\n TIMEOUT.RENDER,\n );\n if (response.type === \"cancelled\") throw new Error(\"Render cancelled\");\n if (response.type === \"pdf\") return new Uint8Array(response.data);\n if (response.type === \"error\") throw new Error(response.message);\n throw new Error(\"Unexpected response type\");\n }\n\n /**\n * Create a TypstService using an inlined worker blob.\n * Works without any bundler configuration.\n *\n * For Vite apps, prefer the explicit Worker constructor to avoid the blob indirection:\n * new TypstService(new Worker(new URL('typst-web-service/worker', import.meta.url)), options)\n */\n static create(options: TypstServiceOptions = {}): TypstService {\n return new TypstService(createWorker(), options);\n }\n\n destroy(): void {\n const id = ++this.idCounter;\n workerRpc(this.worker, { type: \"destroy\", id }, TIMEOUT.DESTROY)\n .catch((err) => console.error(\"TypstService destroy failed:\", err))\n .finally(() => this.worker.terminate());\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/rpc.ts","../src/uri.ts","../src/analyzer.ts","../src/analyzer-session.ts","../src/compiler.ts","../src/formatter.ts","../src/renderer.ts"],"sourcesContent":["// Injected at build time by tsup (see tsup.config.ts)\ndeclare const __WORKER_CODE__: string;\ndeclare const __ANALYZER_WORKER_CODE__: string;\n\n/** Create a Worker from an inlined code string, auto-revoking the blob URL on terminate. */\nexport function createBlobWorker(code: string): Worker {\n const blob = new Blob([code], { type: \"application/javascript\" });\n const url = URL.createObjectURL(blob);\n const worker = new Worker(url);\n const origTerminate = worker.terminate.bind(worker);\n worker.terminate = () => {\n origTerminate();\n URL.revokeObjectURL(url);\n };\n return worker;\n}\n\n/** Create a blob Worker from the inlined compiler worker code. */\nexport function createWorker(): Worker {\n return createBlobWorker(__WORKER_CODE__);\n}\n\n/** Create a blob Worker from the inlined analyzer worker code. */\nexport function createAnalyzerWorker(): Worker {\n return createBlobWorker(__ANALYZER_WORKER_CODE__);\n}\n\n/** Generic RPC helper: post a message to a worker and await a response matched by id. */\nexport function workerRpc<\n TReq extends { id: number },\n TRes extends { id: number },\n>(\n worker: Worker,\n request: TReq,\n timeoutMs: number = 30_000,\n transfer?: Transferable[],\n): Promise<TRes> {\n return new Promise((resolve, reject) => {\n const handler = (e: MessageEvent<TRes>) => {\n if (e.data.id !== request.id) return;\n clearTimeout(timer);\n worker.removeEventListener(\"message\", handler);\n resolve(e.data);\n };\n const timer = setTimeout(() => {\n worker.removeEventListener(\"message\", handler);\n reject(new Error(`worker timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n worker.addEventListener(\"message\", handler);\n worker.postMessage(request, transfer ?? []);\n });\n}\n\n/** Convenience: send a destroy RPC and terminate the worker. */\nexport function destroyWorker<TReq extends { id: number }>(\n worker: Worker,\n request: TReq,\n timeoutMs: number,\n label: string,\n): void {\n workerRpc(worker, request, timeoutMs)\n .catch((err) => console.error(`${label} destroy failed:`, err))\n .finally(() => worker.terminate());\n}\n","export function normalizeUntitledUri(uri: string): string {\n if (!uri.startsWith(\"untitled:\")) return uri;\n return `untitled:${uri.slice(\"untitled:\".length).replace(/^\\/+/, \"\")}`;\n}\n\nexport function normalizePath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nexport function normalizeRoot(rootPath: string): string {\n const root = normalizePath(rootPath);\n return root === \"/\" ? \"\" : root.replace(/\\/+$/, \"\");\n}","import type {\n AnalyzerDiagnosticEvent,\n AnalyzerMessage,\n AnalyzerRequest,\n AnalyzerResponse,\n LspDiagnostic,\n} from \"./analyzer-types.js\";\nimport { createAnalyzerWorker, destroyWorker, workerRpc } from \"./rpc.js\";\nimport { normalizeUntitledUri } from \"./uri.js\";\n\nexport type { LspDiagnostic };\n\nexport type DiagnosticsListener = (\n uri: string,\n diagnostics: LspDiagnostic[],\n) => void;\n\nexport interface TypstAnalyzerOptions {\n /**\n * Explicit Worker instance. When omitted, an inlined blob worker is created automatically.\n * Use this for Vite apps:\n * `new TypstAnalyzer({ worker: new Worker(new URL('typst-web-service/analyzer-worker', import.meta.url), { type: 'module' }) })`\n */\n worker?: Worker;\n /**\n * URL to the tinymist WASM binary.\n * Required — there is no default CDN URL for tinymist-web.\n */\n wasmUrl: string;\n}\n\nconst TIMEOUT = { INIT: 120_000, REQUEST: 30_000, DESTROY: 5_000 } as const;\n\n/**\n * Manages a tinymist language server in a Web Worker. Provides LSP-based\n * diagnostics, completion, and hover for Typst documents.\n *\n * Diagnostics are push-based: call `didChange()` to notify the analyzer of\n * content changes, and receive diagnostics via `onDiagnostics()` listeners\n * whenever tinymist publishes them.\n *\n * const analyzer = new TypstAnalyzer({ wasmUrl: '...' });\n * analyzer.onDiagnostics((uri, diags) => { ... });\n */\nexport class TypstAnalyzer {\n readonly ready: Promise<void>;\n private idCounter = 0;\n private versionCounter = 0;\n private worker: Worker;\n private openedUris = new Set<string>();\n private diagnosticsListeners = new Set<DiagnosticsListener>();\n private latestDiagnosticsByUri = new Map<string, LspDiagnostic[]>();\n\n constructor(options: TypstAnalyzerOptions) {\n this.worker = options.worker ?? createAnalyzerWorker();\n const absoluteWasmUrl = new URL(options.wasmUrl, globalThis.location?.href)\n .href;\n\n // Listen for unsolicited diagnostic push notifications from the worker.\n this.worker.addEventListener(\n \"message\",\n (e: MessageEvent<AnalyzerMessage>) => {\n if (e.data.type === \"diagnostics\" && !(\"id\" in e.data)) {\n const event = e.data as AnalyzerDiagnosticEvent;\n const normalizedUri = normalizeUntitledUri(event.uri);\n this.latestDiagnosticsByUri.set(normalizedUri, event.diagnostics);\n for (const listener of this.diagnosticsListeners) {\n listener(normalizedUri, event.diagnostics);\n }\n }\n },\n );\n\n this.ready = this.rpc(\n { type: \"init\", id: ++this.idCounter, wasmUrl: absoluteWasmUrl },\n TIMEOUT.INIT,\n ).then((res) => {\n if (res.type === \"error\")\n throw new Error(`TypstAnalyzer init failed: ${res.message}`);\n });\n }\n\n /**\n * Register a listener for push-based diagnostics.\n * Returns an unsubscribe function.\n */\n onDiagnostics(listener: DiagnosticsListener): () => void {\n this.diagnosticsListeners.add(listener);\n return () => this.diagnosticsListeners.delete(listener);\n }\n\n /** Returns the latest pushed diagnostics for a URI, if available. */\n getLatestDiagnostics(uri: string): LspDiagnostic[] | undefined {\n return this.latestDiagnosticsByUri.get(normalizeUntitledUri(uri));\n }\n\n private rpc(\n request: AnalyzerRequest,\n timeoutMs: number = TIMEOUT.REQUEST,\n ): Promise<AnalyzerResponse> {\n return workerRpc(this.worker, request, timeoutMs);\n }\n\n async didOpen(uri: string, content: string): Promise<void> {\n await this.ready;\n const res = await this.rpc({\n type: \"didOpen\",\n id: ++this.idCounter,\n uri,\n content,\n });\n if (res.type === \"error\") throw new Error(res.message);\n this.openedUris.add(uri);\n }\n\n /**\n * Notify the analyzer that a document has changed.\n * Diagnostics will arrive asynchronously via `onDiagnostics()` listeners.\n */\n async didChange(uri: string, content: string): Promise<void> {\n await this.ready;\n if (!this.openedUris.has(uri)) {\n await this.didOpen(uri, content);\n return;\n }\n\n const version = ++this.versionCounter;\n const res = await this.rpc({\n type: \"didChange\",\n id: ++this.idCounter,\n uri,\n version,\n content,\n });\n if (res.type === \"error\") throw new Error(res.message);\n }\n\n async completion(\n uri: string,\n line: number,\n character: number,\n ): Promise<unknown> {\n await this.ready;\n const res = await this.rpc({\n type: \"completion\",\n id: ++this.idCounter,\n uri,\n line,\n character,\n });\n if (res.type === \"error\") throw new Error(res.message);\n if (res.type === \"completionResult\") return res.result;\n return null;\n }\n\n async hover(uri: string, line: number, character: number): Promise<unknown> {\n await this.ready;\n const res = await this.rpc({\n type: \"hover\",\n id: ++this.idCounter,\n uri,\n line,\n character,\n });\n if (res.type === \"error\") throw new Error(res.message);\n if (res.type === \"hoverResult\") return res.result;\n return null;\n }\n\n destroy(): void {\n this.diagnosticsListeners.clear();\n this.latestDiagnosticsByUri.clear();\n destroyWorker(\n this.worker,\n { type: \"destroy\" as const, id: ++this.idCounter },\n TIMEOUT.DESTROY,\n \"TypstAnalyzer\",\n );\n }\n}\n","import type { TypstAnalyzer } from \"./analyzer.js\";\n\nexport interface AnalyzerSessionOptions {\n analyzer: Pick<\n TypstAnalyzer,\n \"ready\" | \"didOpen\" | \"didChange\" | \"completion\" | \"hover\"\n >;\n /** Project root used to build stable in-memory analyzer URIs. Default: \"/project\". */\n rootPath?: string;\n /** Entry file path within the project. Synced last to ensure dependencies load first. Default: \"/main.typ\". */\n entryPath?: string;\n}\n\n\nimport { normalizePath, normalizeRoot } from \"./uri.js\";\n\n/**\n * Synchronizes an in-memory Typst project with a TypstAnalyzer.\n * Handles multi-file ordering and avoids cross-file race conditions.\n *\n * Diagnostics are not returned — they arrive via the analyzer's `onDiagnostics` callback.\n *\n * const session = new AnalyzerSession({ analyzer });\n * await session.sync(\"/main.typ\", source, files);\n */\nexport class AnalyzerSession {\n readonly ready: Promise<void>;\n\n private readonly analyzer: Pick<\n TypstAnalyzer,\n \"ready\" | \"didOpen\" | \"didChange\" | \"completion\" | \"hover\"\n >;\n private readonly rootPath: string;\n private readonly entryPath: string;\n private readonly syncedFiles = new Map<string, string>();\n private queue: Promise<void> = Promise.resolve();\n private syncRevision = 0;\n\n constructor(options: AnalyzerSessionOptions) {\n this.analyzer = options.analyzer;\n this.rootPath = normalizeRoot(options.rootPath ?? \"/project\");\n this.entryPath = normalizePath(options.entryPath ?? \"/main.typ\");\n this.ready = this.analyzer.ready;\n }\n\n /** Build a tinymist URI from a project-relative path. */\n toUri(path: string): string {\n // Tinymist publishes untitled URIs without a leading slash after the scheme.\n const root = this.rootPath.replace(/^\\//, \"\");\n return `untitled:${root}${normalizePath(path)}`;\n }\n\n /**\n * Sync all project files with the analyzer, then notify it of the active file change.\n * Diagnostics will arrive asynchronously via the analyzer's `onDiagnostics` callback.\n */\n async sync(\n path: string,\n content: string,\n files: Record<string, string>,\n ): Promise<void> {\n const revision = ++this.syncRevision;\n const normalizedPath = normalizePath(path);\n const mergedFiles = { ...files, [normalizedPath]: content };\n\n await this.enqueue(async () => {\n // Notify the active file last — tinymist will publish diagnostics for it.\n await this.syncForRequest(normalizedPath, mergedFiles, true);\n });\n }\n\n private async syncForRequest(\n normalizedPath: string,\n mergedFiles: Record<string, string>,\n forceDidChange: boolean,\n ): Promise<void> {\n await this.ready;\n await this.syncFiles(mergedFiles, normalizedPath);\n await this.syncActive(\n normalizedPath,\n mergedFiles[normalizedPath],\n forceDidChange,\n );\n }\n\n private async syncActive(\n path: string,\n content: string,\n forceDidChange: boolean,\n ): Promise<void> {\n if (forceDidChange) {\n await this.analyzer.didOpen(this.toUri(path), content);\n this.syncedFiles.set(path, content);\n return;\n }\n\n const prev = this.syncedFiles.get(path);\n\n if (prev == null) {\n await this.analyzer.didOpen(this.toUri(path), content);\n this.syncedFiles.set(path, content);\n return;\n }\n\n if (forceDidChange || prev !== content) {\n await this.analyzer.didChange(this.toUri(path), content);\n this.syncedFiles.set(path, content);\n }\n }\n\n private orderedPaths(files: Record<string, string>): string[] {\n return Object.keys(files)\n .map((path) => normalizePath(path))\n .sort((a, b) => {\n if (a === this.entryPath) return 1;\n if (b === this.entryPath) return -1;\n return a.localeCompare(b);\n });\n }\n\n private async syncFiles(\n files: Record<string, string>,\n activePath: string,\n ): Promise<void> {\n for (const path of this.orderedPaths(files)) {\n if (path === activePath) continue;\n\n const next = files[path];\n const prev = this.syncedFiles.get(path);\n\n if (prev == null) {\n await this.analyzer.didOpen(this.toUri(path), next);\n this.syncedFiles.set(path, next);\n continue;\n }\n\n if (prev !== next) {\n await this.analyzer.didChange(this.toUri(path), next);\n this.syncedFiles.set(path, next);\n }\n }\n\n for (const path of Array.from(this.syncedFiles.keys())) {\n if (!Object.hasOwn(files, path)) {\n this.syncedFiles.delete(path);\n }\n }\n }\n\n /**\n * Sync files and request completions at the given position.\n * Returns the raw LSP CompletionList/CompletionItem[] from tinymist.\n */\n async completion(\n path: string,\n content: string,\n files: Record<string, string>,\n line: number,\n character: number,\n ): Promise<unknown> {\n const enqueuedRevision = this.syncRevision;\n const normalizedPath = normalizePath(path);\n const mergedFiles = { ...files, [normalizedPath]: content };\n\n return this.enqueue(async () => {\n if (enqueuedRevision !== this.syncRevision) return null;\n\n await this.syncForRequest(normalizedPath, mergedFiles, false);\n return this.analyzer.completion(\n this.toUri(normalizedPath),\n line,\n character,\n );\n });\n }\n\n /**\n * Sync files and request hover info at the given position.\n * Returns the raw LSP Hover result from tinymist.\n */\n async hover(\n path: string,\n content: string,\n files: Record<string, string>,\n line: number,\n character: number,\n ): Promise<unknown> {\n const enqueuedRevision = this.syncRevision;\n const normalizedPath = normalizePath(path);\n const mergedFiles = { ...files, [normalizedPath]: content };\n\n return this.enqueue(async () => {\n if (enqueuedRevision !== this.syncRevision) return null;\n\n await this.syncForRequest(normalizedPath, mergedFiles, false);\n return this.analyzer.hover(this.toUri(normalizedPath), line, character);\n });\n }\n\n private enqueue<T>(task: () => Promise<T>): Promise<T> {\n const run = this.queue.then(task, task);\n this.queue = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n }\n}\n","import { createWorker, destroyWorker, workerRpc } from \"./rpc.js\";\nimport type {\n DiagnosticMessage,\n WorkerRequest,\n WorkerResponse,\n} from \"./types.js\";\n\nexport interface CompileResult {\n diagnostics: DiagnosticMessage[];\n /** Vector artifact bytes from the compiler, usable with TypstRenderer for SVG rendering. */\n vector?: Uint8Array;\n}\n\nexport interface TypstCompilerOptions {\n /**\n * Explicit Worker instance. When omitted, an inlined blob worker is created automatically.\n * Use this for Vite apps to get proper source maps:\n * `new TypstCompiler({ worker: new Worker(new URL('typst-web-service/worker', import.meta.url)) })`\n */\n worker?: Worker;\n /**\n * URL to the typst-ts-web-compiler WASM binary.\n * Defaults to the matching version on jsDelivr CDN.\n * Override with a local asset URL for offline support or faster load:\n * `new URL('@myriaddreamin/typst-ts-web-compiler/pkg/typst_ts_web_compiler_bg.wasm', import.meta.url).href`\n */\n wasmUrl?: string;\n /** Font URLs to load into the Typst compiler. Defaults to Roboto from jsDelivr. */\n fonts?: string[];\n /**\n * Enable fetching @preview/ packages from packages.typst.org on demand.\n * Default: true.\n */\n packages?: boolean;\n}\n\nconst DEFAULT_FONTS = [\n \"https://cdn.jsdelivr.net/npm/roboto-font@0.1.0/fonts/Roboto/roboto-regular-webfont.ttf\",\n];\n\nconst DEFAULT_WASM_URL =\n \"https://cdn.jsdelivr.net/npm/@myriaddreamin/typst-ts-web-compiler@0.7.0-rc2/pkg/typst_ts_web_compiler_bg.wasm\";\n\nconst TIMEOUT = { INIT: 60_000, RENDER: 60_000, DESTROY: 5_000 } as const;\n\nfunction toFiles(\n source: string | Record<string, string>,\n): Record<string, string> {\n return typeof source === \"string\" ? { \"/main.typ\": source } : source;\n}\n\n/**\n * Manages a Typst compiler worker. Create one instance and share it across\n * all extensions (linter, autocomplete, preview, etc.).\n *\n * new TypstCompiler() // blob worker, defaults\n * new TypstCompiler({ wasmUrl: '...' }) // blob worker, custom WASM\n * new TypstCompiler({ worker: myWorker }) // explicit Worker (Vite)\n * new TypstCompiler({ worker: myWorker, fonts: [...] }) // explicit Worker + options\n */\nexport class TypstCompiler {\n readonly ready: Promise<void>;\n private idCounter = 0;\n private worker: Worker;\n\n /** The most recent vector artifact from a compile, if any. */\n lastVector?: Uint8Array;\n\n constructor(options: TypstCompilerOptions = {}) {\n this.worker = options.worker ?? createWorker();\n\n this.ready = workerRpc<WorkerRequest, WorkerResponse>(\n this.worker,\n {\n type: \"init\",\n id: ++this.idCounter,\n wasmUrl: options.wasmUrl ?? DEFAULT_WASM_URL,\n fonts: options.fonts ?? DEFAULT_FONTS,\n packages: options.packages ?? true,\n },\n TIMEOUT.INIT,\n ).then((res) => {\n if (res.type === \"error\")\n throw new Error(`TypstCompiler init failed: ${res.message}`);\n });\n }\n\n /** Compile a single source string (treated as /main.typ) or a map of files. */\n async compile(\n source: string | Record<string, string>,\n ): Promise<CompileResult> {\n await this.ready;\n const id = ++this.idCounter;\n const files = toFiles(source);\n const response = await workerRpc<WorkerRequest, WorkerResponse>(\n this.worker,\n {\n type: \"compile\",\n id,\n files,\n },\n );\n if (response.type === \"cancelled\") return { diagnostics: [] };\n if (response.type === \"result\") {\n const vector = response.vector\n ? new Uint8Array(response.vector)\n : undefined;\n if (vector) this.lastVector = vector;\n return { diagnostics: response.diagnostics, vector };\n }\n if (response.type === \"error\") throw new Error(response.message);\n return { diagnostics: [] };\n }\n\n /** Compile to PDF from a single source string (treated as /main.typ) or a map of files. */\n async compilePdf(\n source: string | Record<string, string>,\n ): Promise<Uint8Array> {\n await this.ready;\n const id = ++this.idCounter;\n const files = toFiles(source);\n const response = await workerRpc<WorkerRequest, WorkerResponse>(\n this.worker,\n { type: \"render\", id, files },\n TIMEOUT.RENDER,\n );\n if (response.type === \"cancelled\") throw new Error(\"Render cancelled\");\n if (response.type === \"pdf\") return new Uint8Array(response.data);\n if (response.type === \"error\") throw new Error(response.message);\n throw new Error(\"Unexpected response type\");\n }\n\n destroy(): void {\n const id = ++this.idCounter;\n destroyWorker(\n this.worker,\n { type: \"destroy\" as const, id },\n TIMEOUT.DESTROY,\n \"TypstCompiler\",\n );\n }\n}\n","export interface FormatConfig {\n /** Number of spaces per indentation level. Default: 2 */\n tab_spaces?: number;\n /** Maximum line width. Default: 80 */\n max_width?: number;\n /** Maximum consecutive blank lines allowed. */\n blank_lines_upper_bound?: number;\n /** Collapse consecutive whitespace in markup to a single space. */\n collapse_markup_spaces?: boolean;\n /** Sort import items alphabetically. */\n reorder_import_items?: boolean;\n /** Wrap text in markup to fit within max_width. Implies collapse_markup_spaces. */\n wrap_text?: boolean;\n}\n\nexport interface FormatRangeResult {\n /** Start index (UTF-16) of the actual formatted range. */\n start: number;\n /** End index (UTF-16) of the actual formatted range. */\n end: number;\n /** The formatted text for the range. */\n text: string;\n}\n\ntype TypstyleModule = typeof import(\"@typstyle/typstyle-wasm-bundler\");\n\nlet typstylePromise: Promise<TypstyleModule> | null = null;\n\nfunction getTypstyle(): Promise<TypstyleModule> {\n if (!typstylePromise) {\n typstylePromise = import(\"@typstyle/typstyle-wasm-bundler\").catch((err) => {\n // Reset so subsequent calls can retry\n typstylePromise = null;\n throw err;\n });\n }\n return typstylePromise;\n}\n\n/**\n * Typst code formatter powered by typstyle.\n *\n * Runs on the main thread — typstyle is lightweight and fast.\n * The WASM module is loaded lazily on first format call.\n *\n * const formatter = new TypstFormatter({ tab_spaces: 2, max_width: 80 });\n * const formatted = await formatter.format(source);\n */\nexport class TypstFormatter {\n private config: FormatConfig;\n\n constructor(config: FormatConfig = {}) {\n this.config = config;\n // Eagerly start loading WASM so it's ready by first use.\n // Swallow preload errors — they'll surface on first format() call.\n getTypstyle().catch(() => {});\n }\n\n /** Format an entire Typst source string. */\n async format(source: string): Promise<string> {\n const typstyle = await getTypstyle();\n return typstyle.format(source, this.config);\n }\n\n /** Format a range within a Typst source string. Indices are UTF-16 code units. */\n async formatRange(\n source: string,\n start: number,\n end: number,\n ): Promise<FormatRangeResult> {\n const typstyle = await getTypstyle();\n const result = typstyle.format_range(source, start, end, this.config);\n return { start: result.start, end: result.end, text: result.text };\n }\n}\n","/** Minimal interface for the built TypstRenderer instance. */\nexport interface RendererInstance {\n create_session(): RendererSession;\n manipulate_data(\n session: RendererSession,\n action: string,\n data: Uint8Array,\n ): void;\n svg_data(session: RendererSession): string;\n}\n\n/** Minimal interface for a TypstRenderer session. */\nexport interface RendererSession {\n free(): void;\n}\n\ntype RendererWasmModule = typeof import(\"@myriaddreamin/typst-ts-renderer\");\n\nconst DEFAULT_RENDERER_WASM_URL =\n \"https://cdn.jsdelivr.net/npm/@myriaddreamin/typst-ts-renderer@0.7.0-rc2/pkg/typst_ts_renderer_bg.wasm\";\n\nlet rendererModulePromise: Promise<RendererWasmModule> | null = null;\n\nfunction getRendererModule(): Promise<RendererWasmModule> {\n if (!rendererModulePromise) {\n rendererModulePromise = import(\"@myriaddreamin/typst-ts-renderer\").catch(\n (err) => {\n rendererModulePromise = null;\n throw err;\n },\n );\n }\n return rendererModulePromise;\n}\n\nexport interface TypstRendererOptions {\n /** URL to the typst-ts-renderer WASM binary. Defaults to jsDelivr CDN. */\n wasmUrl?: string;\n}\n\n/**\n * Converts Typst vector artifacts to SVG strings.\n *\n * The renderer WASM module is loaded lazily on first use.\n *\n * const renderer = new TypstRenderer();\n * const svg = await renderer.renderSvg(vector);\n */\nexport class TypstRenderer {\n private wasmUrl: string;\n private instance: Promise<RendererInstance> | null = null;\n\n constructor(options: TypstRendererOptions = {}) {\n this.wasmUrl = options.wasmUrl ?? DEFAULT_RENDERER_WASM_URL;\n // Eagerly start loading the WASM module so it's ready by first use.\n getRendererModule().catch(() => {});\n }\n\n private getInstance(): Promise<RendererInstance> {\n if (!this.instance) {\n this.instance = this.#init().catch((err) => {\n this.instance = null;\n throw err;\n });\n }\n return this.instance;\n }\n\n async #init(): Promise<RendererInstance> {\n const mod = await getRendererModule();\n await mod.default(this.wasmUrl);\n return new mod.TypstRendererBuilder().build();\n }\n\n /** Render a Typst vector artifact to an SVG string. */\n async renderSvg(vector: Uint8Array): Promise<string> {\n const renderer = await this.getInstance();\n const session = renderer.create_session();\n try {\n renderer.manipulate_data(session, \"reset\", vector);\n return renderer.svg_data(session);\n } finally {\n session.free();\n }\n }\n}\n"],"mappings":"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","names":["TIMEOUT"]}
package/dist/worker.js CHANGED
@@ -1,6 +1,5 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
3
  var __esm = (fn, res) => function __init() {
5
4
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
6
5
  };
@@ -8,7 +7,6 @@ var __export = (target, all) => {
8
7
  for (var name in all)
9
8
  __defProp(target, name, { get: all[name], enumerable: true });
10
9
  };
11
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
12
10
 
13
11
  // ../../node_modules/.bun/@myriaddreamin+typst-ts-web-compiler@0.7.0-rc2/node_modules/@myriaddreamin/typst-ts-web-compiler/pkg/typst_ts_web_compiler.mjs
14
12
  function addHeapObject(obj) {
@@ -1571,16 +1569,14 @@ var init_wasm_pack_shim = __esm({
1571
1569
 
1572
1570
  // ../../node_modules/.bun/@myriaddreamin+typst.ts@0.7.0-rc2+5e675a3c06b42b50/node_modules/@myriaddreamin/typst.ts/dist/esm/init.mjs
1573
1571
  var ComponentBuilder = class {
1574
- constructor() {
1575
- __publicField(this, "loadedFonts", /* @__PURE__ */ new Set());
1576
- __publicField(this, "fetcher", fetch);
1577
- }
1572
+ loadedFonts = /* @__PURE__ */ new Set();
1573
+ fetcher = fetch;
1578
1574
  setFetcher(fetcher) {
1579
1575
  this.fetcher = fetcher;
1580
1576
  }
1581
1577
  async loadFonts(builder, fonts) {
1582
1578
  const escapeImport = new Function("m", "return import(m)");
1583
- const fetcher = this.fetcher || (this.fetcher = await (async function() {
1579
+ const fetcher = this.fetcher ||= await (async function() {
1584
1580
  const { fetchBuilder, FileSystemCache } = await escapeImport("node-fetch-cache");
1585
1581
  const cache = new FileSystemCache({
1586
1582
  /// By default, we don't have a complicated cache policy.
@@ -1595,7 +1591,7 @@ var ComponentBuilder = class {
1595
1591
  clearTimeout(timeout);
1596
1592
  });
1597
1593
  };
1598
- })());
1594
+ })();
1599
1595
  const fontsToLoad = fonts.filter((font) => {
1600
1596
  if (font instanceof Uint8Array || typeof font === "object" && "info" in font) {
1601
1597
  return true;
@@ -1784,9 +1780,9 @@ var once = (fn) => {
1784
1780
  };
1785
1781
  };
1786
1782
  var LazyWasmModule = class {
1783
+ wasmBin;
1784
+ initOnce;
1787
1785
  constructor(initFn) {
1788
- __publicField(this, "wasmBin");
1789
- __publicField(this, "initOnce");
1790
1786
  if (typeof initFn !== "function") {
1791
1787
  throw new Error("initFn is not a function");
1792
1788
  }
@@ -1807,17 +1803,15 @@ var CompileFormatEnum;
1807
1803
  CompileFormatEnum2[CompileFormatEnum2["pdf"] = 1] = "pdf";
1808
1804
  CompileFormatEnum2[CompileFormatEnum2["_dummy"] = 2] = "_dummy";
1809
1805
  })(CompileFormatEnum || (CompileFormatEnum = {}));
1810
- var _a;
1811
- _a = kObject;
1812
1806
  var IncrementalServer = class {
1807
+ /**
1808
+ * @internal
1809
+ */
1810
+ [kObject];
1813
1811
  /**
1814
1812
  * @internal
1815
1813
  */
1816
1814
  constructor(s) {
1817
- /**
1818
- * @internal
1819
- */
1820
- __publicField(this, _a);
1821
1815
  this[kObject] = s;
1822
1816
  }
1823
1817
  /**
@@ -1842,11 +1836,9 @@ var IncrementalServer = class {
1842
1836
  var TypstFontResolverCons;
1843
1837
  /* @__PURE__ */ (function(TypstFontResolverCons2) {
1844
1838
  })(TypstFontResolverCons || (TypstFontResolverCons = {}));
1845
- var _a2;
1846
- _a2 = kObject;
1847
1839
  var TypstWorld = class {
1840
+ [kObject];
1848
1841
  constructor(world) {
1849
- __publicField(this, _a2);
1850
1842
  this[kObject] = world;
1851
1843
  }
1852
1844
  /**
@@ -1905,16 +1897,17 @@ var gCompilerModule = (module) => new LazyWasmModule(async (bin) => {
1905
1897
  function createTypstCompiler() {
1906
1898
  return new TypstCompilerDriver();
1907
1899
  }
1908
- var _TypstCompilerDriver = class _TypstCompilerDriver {
1900
+ var TypstCompilerDriver = class _TypstCompilerDriver {
1901
+ compiler;
1902
+ compilerJs;
1903
+ static defaultAssets = ["text"];
1909
1904
  constructor() {
1910
- __publicField(this, "compiler");
1911
- __publicField(this, "compilerJs");
1912
1905
  }
1913
1906
  async init(options) {
1914
1907
  this.compilerJs = await (options?.getWrapper?.() || Promise.resolve().then(() => (init_wasm_pack_shim(), wasm_pack_shim_exports)));
1915
1908
  const TypstCompilerBuilder2 = this.compilerJs.TypstCompilerBuilder;
1916
1909
  const compilerOptions = { ...options || {} };
1917
- const beforeBuild = compilerOptions.beforeBuild ?? (compilerOptions.beforeBuild = []);
1910
+ const beforeBuild = compilerOptions.beforeBuild ??= [];
1918
1911
  const hasPreloadRemoteFonts = beforeBuild.some((fn) => fn._preloadRemoteFontOptions !== void 0);
1919
1912
  const hasSpecifiedAssets = beforeBuild.some((fn) => fn._preloadRemoteFontOptions?.assets !== void 0);
1920
1913
  const hasDisableAssets = beforeBuild.some((fn) => fn._preloadRemoteFontOptions?.assets === false);
@@ -1998,8 +1991,6 @@ var _TypstCompilerDriver = class _TypstCompilerDriver {
1998
1991
  throw new Error("Please use the api TypstRenderer.renderToCanvas in v0.4.0");
1999
1992
  }
2000
1993
  };
2001
- __publicField(_TypstCompilerDriver, "defaultAssets", ["text"]);
2002
- var TypstCompilerDriver = _TypstCompilerDriver;
2003
1994
  createTypstCompiler._impl = TypstCompilerDriver;
2004
1995
  function convertInputs(inputs) {
2005
1996
  return inputs ? Object.entries(inputs) : void 0;
@@ -2018,9 +2009,9 @@ function getDiagnosticsArg(diagnostics) {
2018
2009
 
2019
2010
  // ../../node_modules/.bun/@myriaddreamin+typst.ts@0.7.0-rc2+5e675a3c06b42b50/node_modules/@myriaddreamin/typst.ts/dist/esm/fs/memory.mjs
2020
2011
  var MemoryAccessModel = class {
2012
+ mTimes = /* @__PURE__ */ new Map();
2013
+ mData = /* @__PURE__ */ new Map();
2021
2014
  constructor() {
2022
- __publicField(this, "mTimes", /* @__PURE__ */ new Map());
2023
- __publicField(this, "mData", /* @__PURE__ */ new Map());
2024
2015
  }
2025
2016
  reset() {
2026
2017
  this.mTimes.clear();
@@ -2062,9 +2053,9 @@ var MemoryAccessModel = class {
2062
2053
 
2063
2054
  // ../../node_modules/.bun/@myriaddreamin+typst.ts@0.7.0-rc2+5e675a3c06b42b50/node_modules/@myriaddreamin/typst.ts/dist/esm/fs/package.mjs
2064
2055
  var FetchPackageRegistry = class {
2056
+ am;
2057
+ cache = /* @__PURE__ */ new Map();
2065
2058
  constructor(am) {
2066
- __publicField(this, "am");
2067
- __publicField(this, "cache", /* @__PURE__ */ new Map());
2068
2059
  this.am = am;
2069
2060
  }
2070
2061
  resolvePath(path) {
@@ -2108,6 +2099,34 @@ var FetchPackageRegistry = class {
2108
2099
  }
2109
2100
  };
2110
2101
 
2102
+ // src/queue.ts
2103
+ var yieldToEventLoop = () => new Promise((r) => setTimeout(r, 0));
2104
+ function makeQueue(handle, onCancel) {
2105
+ let pending = null;
2106
+ let processing = false;
2107
+ async function drain() {
2108
+ processing = true;
2109
+ while (pending) {
2110
+ const req = pending;
2111
+ pending = null;
2112
+ await yieldToEventLoop();
2113
+ if (pending) {
2114
+ onCancel?.(req);
2115
+ continue;
2116
+ }
2117
+ try {
2118
+ await handle(req);
2119
+ } catch {
2120
+ }
2121
+ }
2122
+ processing = false;
2123
+ }
2124
+ return (req) => {
2125
+ pending = req;
2126
+ if (!processing) drain();
2127
+ };
2128
+ }
2129
+
2111
2130
  // src/worker.ts
2112
2131
  var MAIN_FILE = "/main.typ";
2113
2132
  var accessModel = new MemoryAccessModel();
@@ -2133,11 +2152,14 @@ function parseRange(range) {
2133
2152
  }
2134
2153
  return { startLine: +m[1], startCol: +m[2], endLine: +m[3], endCol: +m[4] };
2135
2154
  }
2136
- async function compile(files) {
2155
+ function addSources(files) {
2137
2156
  if (!compiler) throw new Error("Compiler not initialized");
2138
2157
  for (const [path, source] of Object.entries(files)) {
2139
2158
  compiler.addSource(path, source);
2140
2159
  }
2160
+ }
2161
+ async function compile(files) {
2162
+ addSources(files);
2141
2163
  const result = await compiler.compile({
2142
2164
  mainFilePath: MAIN_FILE,
2143
2165
  diagnostics: "full"
@@ -2166,31 +2188,11 @@ function transferBuffer(data) {
2166
2188
  data.byteOffset + data.byteLength
2167
2189
  );
2168
2190
  }
2169
- var yieldToEventLoop = () => new Promise((r) => setTimeout(r, 0));
2170
- function makeQueue(handle) {
2171
- let pending = null;
2172
- let processing = false;
2173
- async function drain() {
2174
- processing = true;
2175
- while (pending) {
2176
- const req = pending;
2177
- pending = null;
2178
- await yieldToEventLoop();
2179
- if (pending) {
2180
- self.postMessage({
2181
- type: "cancelled",
2182
- id: req.id
2183
- });
2184
- continue;
2185
- }
2186
- await handle(req);
2187
- }
2188
- processing = false;
2189
- }
2190
- return (req) => {
2191
- pending = req;
2192
- if (!processing) drain();
2193
- };
2191
+ function postCancelled(req) {
2192
+ self.postMessage({
2193
+ type: "cancelled",
2194
+ id: req.id
2195
+ });
2194
2196
  }
2195
2197
  var enqueueCompile = makeQueue(async (req) => {
2196
2198
  try {
@@ -2206,13 +2208,10 @@ var enqueueCompile = makeQueue(async (req) => {
2206
2208
  } catch (err) {
2207
2209
  postError(req.id, err);
2208
2210
  }
2209
- });
2211
+ }, postCancelled);
2210
2212
  var enqueueRender = makeQueue(async (req) => {
2211
2213
  try {
2212
- if (!compiler) throw new Error("Compiler not initialized");
2213
- for (const [path, source] of Object.entries(req.files)) {
2214
- compiler.addSource(path, source);
2215
- }
2214
+ addSources(req.files);
2216
2215
  const result = await compiler.compile({
2217
2216
  mainFilePath: MAIN_FILE,
2218
2217
  format: CompileFormatEnum.pdf,
@@ -2227,7 +2226,7 @@ var enqueueRender = makeQueue(async (req) => {
2227
2226
  } catch (err) {
2228
2227
  postError(req.id, err);
2229
2228
  }
2230
- });
2229
+ }, postCancelled);
2231
2230
  self.onmessage = async (e) => {
2232
2231
  const req = e.data;
2233
2232
  if (req.type === "init") {