@vedivad/typst-web-service 0.1.0 → 0.2.0
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.d.ts +5 -13
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +9 -1
package/dist/index.d.ts
CHANGED
|
@@ -18,16 +18,12 @@ interface CompileResult {
|
|
|
18
18
|
/** Vector artifact bytes from the compiler, usable with typst-ts-renderer for SVG rendering. */
|
|
19
19
|
vector?: Uint8Array;
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
* A dynamic `import()` expression that resolves to the `@myriaddreamin/typst-ts-renderer` module.
|
|
23
|
-
* Keeps the renderer dependency opt-in — users who only need diagnostics never load the WASM.
|
|
24
|
-
*/
|
|
25
|
-
type RendererModule = () => Promise<{
|
|
21
|
+
type RendererModuleExports = {
|
|
26
22
|
default: (wasmUrl?: string) => Promise<unknown>;
|
|
27
23
|
TypstRendererBuilder: new () => {
|
|
28
24
|
build(): Promise<RendererInstance>;
|
|
29
25
|
};
|
|
30
|
-
}
|
|
26
|
+
};
|
|
31
27
|
/** Minimal interface for the built TypstRenderer. */
|
|
32
28
|
interface RendererInstance {
|
|
33
29
|
create_session(): RendererSession;
|
|
@@ -40,11 +36,8 @@ interface RendererSession {
|
|
|
40
36
|
}
|
|
41
37
|
/** Options for the opt-in SVG renderer. */
|
|
42
38
|
interface RendererOptions {
|
|
43
|
-
/**
|
|
44
|
-
|
|
45
|
-
* Example: () => import('@myriaddreamin/typst-ts-renderer')
|
|
46
|
-
*/
|
|
47
|
-
module: RendererModule;
|
|
39
|
+
/** Dynamic import for the renderer module. Defaults to `() => import('@myriaddreamin/typst-ts-renderer')`. */
|
|
40
|
+
module?: () => Promise<RendererModuleExports>;
|
|
48
41
|
/** URL to the typst-ts-renderer WASM binary. Defaults to jsDelivr CDN. */
|
|
49
42
|
wasmUrl?: string;
|
|
50
43
|
/** Called after each compile with the rendered SVG string. */
|
|
@@ -71,7 +64,6 @@ interface TypstServiceOptions {
|
|
|
71
64
|
*
|
|
72
65
|
* Example:
|
|
73
66
|
* renderer: {
|
|
74
|
-
* module: () => import('@myriaddreamin/typst-ts-renderer'),
|
|
75
67
|
* onSvg: (svg) => { previewEl.innerHTML = svg },
|
|
76
68
|
* }
|
|
77
69
|
*/
|
|
@@ -116,4 +108,4 @@ declare class TypstService {
|
|
|
116
108
|
destroy(): void;
|
|
117
109
|
}
|
|
118
110
|
|
|
119
|
-
export { type CompileResult, type DiagnosticMessage, type DiagnosticRange, type RendererInstance, type
|
|
111
|
+
export { type CompileResult, type DiagnosticMessage, type DiagnosticRange, type RendererInstance, type RendererOptions, type RendererSession, TypstService, type TypstServiceOptions };
|
package/dist/index.js
CHANGED
|
@@ -48,7 +48,7 @@ var _TypstService = class _TypstService {
|
|
|
48
48
|
this.idCounter = 0;
|
|
49
49
|
this.onSvg = options.renderer?.onSvg;
|
|
50
50
|
if (options.renderer) {
|
|
51
|
-
this.rendererInstance = __privateMethod(this, _TypstService_instances, initRenderer_fn).call(this, options.renderer.module, options.renderer.wasmUrl);
|
|
51
|
+
this.rendererInstance = __privateMethod(this, _TypstService_instances, initRenderer_fn).call(this, options.renderer.module ?? (() => import("@myriaddreamin/typst-ts-renderer")), options.renderer.wasmUrl);
|
|
52
52
|
this.rendererReady = this.rendererInstance.then(() => {
|
|
53
53
|
});
|
|
54
54
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rpc.ts","../src/service.ts"],"sourcesContent":["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 type { DiagnosticMessage } from \"./types.js\";\nimport { createWorker, workerRpc } from \"./rpc.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(session: RendererSession, action: string, data: Uint8Array): 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\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(options.renderer.module, options.renderer.wasmUrl);\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 60_000,\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 async compile(source: string): Promise<CompileResult> {\n await this.ready;\n const id = ++this.idCounter;\n const response = await workerRpc(this.worker, {\n type: \"compile\",\n id,\n source,\n });\n if (response.type === \"cancelled\") return { diagnostics: [] };\n if (response.type === \"result\") {\n const vector = response.vector ? new Uint8Array(response.vector) : 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 async renderPdf(source: string): Promise<Uint8Array> {\n await this.ready;\n const id = ++this.idCounter;\n const response = await workerRpc(this.worker, { type: \"render\", id, source }, 60_000);\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 }, 5_000)\n .catch((err) => console.error(\"TypstService destroy failed:\", err))\n .finally(() => this.worker.terminate());\n }\n}\n\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/rpc.ts","../src/service.ts"],"sourcesContent":["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 type { DiagnosticMessage } from \"./types.js\";\nimport { createWorker, workerRpc } from \"./rpc.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\ntype RendererModuleExports = {\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(session: RendererSession, action: string, data: Uint8Array): 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 /** Dynamic import for the renderer module. Defaults to `() => import('@myriaddreamin/typst-ts-renderer')`. */\n module?: () => Promise<RendererModuleExports>;\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 * 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\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 ?? (() => import(\"@myriaddreamin/typst-ts-renderer\")),\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 60_000,\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: () => Promise<RendererModuleExports>,\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 async compile(source: string): Promise<CompileResult> {\n await this.ready;\n const id = ++this.idCounter;\n const response = await workerRpc(this.worker, {\n type: \"compile\",\n id,\n source,\n });\n if (response.type === \"cancelled\") return { diagnostics: [] };\n if (response.type === \"result\") {\n const vector = response.vector ? new Uint8Array(response.vector) : 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 async renderPdf(source: string): Promise<Uint8Array> {\n await this.ready;\n const id = ++this.idCounter;\n const response = await workerRpc(this.worker, { type: \"render\", id, source }, 60_000);\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 }, 5_000)\n .catch((err) => console.error(\"TypstService destroy failed:\", err))\n .finally(() => this.worker.terminate());\n }\n}\n\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vedivad/typst-web-service",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Editor-agnostic Typst compilation service running in a Web Worker",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,6 +25,14 @@
|
|
|
25
25
|
"@myriaddreamin/typst.ts": "^0.7.0-rc2",
|
|
26
26
|
"@myriaddreamin/typst-ts-web-compiler": "^0.7.0-rc2"
|
|
27
27
|
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@myriaddreamin/typst-ts-renderer": "^0.7.0-rc2"
|
|
30
|
+
},
|
|
31
|
+
"peerDependenciesMeta": {
|
|
32
|
+
"@myriaddreamin/typst-ts-renderer": {
|
|
33
|
+
"optional": true
|
|
34
|
+
}
|
|
35
|
+
},
|
|
28
36
|
"devDependencies": {
|
|
29
37
|
"esbuild": "^0.27.3",
|
|
30
38
|
"tsup": "^8.0.0",
|