blitz-pdf 0.1.8 → 0.1.9

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/README.md CHANGED
@@ -77,7 +77,7 @@ cross-origin isolation are not required.
77
77
  ## Rendering in a worker
78
78
 
79
79
  `renderPdfInWorker` has the same signature as `renderPdf`, but layout and PDF
80
- serialization run in a reusable worker: a Web Worker in browsers and a
80
+ serialization run in a fresh worker: a Web Worker in browsers and a
81
81
  `worker_threads` worker in Node.js and Bun. The calling thread stays responsive:
82
82
 
83
83
  ```js
@@ -89,16 +89,17 @@ const pdfs = await Promise.all(documents.map(html =>
89
89
 
90
90
  The WASM is compiled once into a `WebAssembly.Module` and posted to
91
91
  every worker. Workers only instantiate it, so they skip WASM compilation.
92
- `init({ wasm })` sets the source for this shared module as well. The default pool
93
- runs up to four documents concurrently and queues additional work. Each worker
94
- keeps its initialized engine and registered bundled fonts between documents; HTML,
95
- custom fonts, assets, metadata and attachments remain local to each render.
96
- Idle workers are released after 30 seconds, and workers are replaced after 100
97
- documents or any render/asset/worker error. Idle Node/Bun workers do not keep the
98
- process alive. A worker's first render still initializes its font collection;
99
- warming only the parent with `init()` does not warm the workers.
100
-
101
- For application-specific concurrency and shutdown, own a pool:
92
+ `init({ wasm })` sets the source for this shared module as well. Each render
93
+ creates one worker and waits for its termination on success or failure before
94
+ settling. No idle engine or font collection is retained. Bound concurrent calls
95
+ in the application when rendering many documents at once.
96
+
97
+ For applications that explicitly choose to retain engines between documents,
98
+ `createPdfWorkerPool` remains an opt-in API. It is not used by
99
+ `renderPdfInWorker`. A pool retains initialized engines and bundled fonts while
100
+ idle, so it uses more resident memory. Assets, custom fonts, metadata and
101
+ attachments remain local to each render. Configure its lifetime and close it
102
+ when no longer needed:
102
103
 
103
104
  ```js
104
105
  import { createPdfWorkerPool } from "blitz-pdf";
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3G,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,EAAE,aAAa,EAAE,OAAgC,EAAE,WAAW,EAAE,EAAE,SAAS;qBAa5E,WAAW,KAAQ,OAAO,CAAC,IAAI,CAAC;sBAYxB,MAAM,YAAW,UAAU,KAAQ,OAAO,CAAC,UAAU,CAAC;8BAiC9C,MAAM,YAAW,UAAU,KAAQ,OAAO,CAAC,UAAU,CAAC;oCAzBvD,oBAAoB,KAAQ,aAAa;yBAXrD,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;4BAyClB,OAAO,CAAC,MAAM,CAAC;EAEnD"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3G,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,EAAE,aAAa,EAAE,OAAgC,EAAE,WAAW,EAAE,EAAE,SAAS;qBAY5E,WAAW,KAAQ,OAAO,CAAC,IAAI,CAAC;sBAYxB,MAAM,YAAW,UAAU,KAAQ,OAAO,CAAC,UAAU,CAAC;8BAiC9C,MAAM,YAAW,UAAU,KAAQ,OAAO,CAAC,UAAU,CAAC;oCAzBvD,oBAAoB,KAAQ,aAAa;yBAXrD,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;4BA0ClB,OAAO,CAAC,MAAM,CAAC;EAEnD"}
package/dist/api.js CHANGED
@@ -3,11 +3,10 @@ import { createAssetLoader } from "./assets.js";
3
3
  import { normalizeOptions } from "./options.js";
4
4
  import { render, validateHtml } from "./render.js";
5
5
  import { compileWasm } from "./wasm.js";
6
- import { createWorkerPool } from "./worker-host.js";
6
+ import { createWorkerPool, renderInWorker } from "./worker-host.js";
7
7
  export function createApi({ defaultSource, prepare = async (source) => source, spawnWorker }) {
8
8
  let compiled;
9
9
  let ready;
10
- let defaultPool;
11
10
  function compile(source) {
12
11
  if (compiled)
13
12
  return compiled;
@@ -58,10 +57,11 @@ export function createApi({ defaultSource, prepare = async (source) => source, s
58
57
  },
59
58
  };
60
59
  }
61
- /** Render in the shared bounded pool. An assets function still runs on the calling thread. */
60
+ /** Render in a fresh worker and release its engine before settling. */
62
61
  async function renderPdfInWorker(html, options = {}) {
63
- defaultPool ??= createPdfWorkerPool();
64
- return defaultPool.renderPdf(html, options);
62
+ validateHtml(html);
63
+ const { assetResolver, ...normalized } = normalizeOptions(options);
64
+ return renderInWorker(spawnWorker, await compile(), html, normalized, assetResolver);
65
65
  }
66
66
  async function getEngineVersion() { await init(); return engine_version(); }
67
67
  return { init, renderPdf, renderPdfInWorker, createPdfWorkerPool, getWasmModule, getEngineVersion };
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ export interface WorkerHandle {
13
13
  unref?(): void;
14
14
  }
15
15
  export type SpawnWorker = (events: WorkerEvents) => WorkerHandle;
16
+ /** One engine per document; wait for termination before releasing the caller's slot. */
17
+ export declare function renderInWorker(spawn: SpawnWorker, module: WebAssembly.Module, html: string, options: RenderOptions, resolver?: AssetResolver): Promise<Uint8Array>;
16
18
  /** Jobs have their own resolver and document; only the initialized engine survives. */
17
19
  export declare function createWorkerPool(spawn: SpawnWorker, options?: PdfWorkerPoolOptions): {
18
20
  render(module: WebAssembly.Module, html: string, options: RenderOptions, resolver?: AssetResolver): Promise<Uint8Array>;
@@ -1 +1 @@
1
- {"version":3,"file":"worker-host.d.ts","sourceRoot":"","sources":["../src/worker-host.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,iFAAiF;IACjF,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC1D,SAAS,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,GAAG,CAAC,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,YAAY,KAAK,YAAY,CAAC;AAyBjE,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,oBAAyB;mBAsGpE,WAAW,CAAC,MAAM,QAAQ,MAAM,WAAW,aAAa,aAAa,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;aAS9G,OAAO,CAAC,IAAI,CAAC;EAQzB"}
1
+ {"version":3,"file":"worker-host.d.ts","sourceRoot":"","sources":["../src/worker-host.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,iFAAiF;IACjF,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC1D,SAAS,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,GAAG,CAAC,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,YAAY,KAAK,YAAY,CAAC;AAEjE,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EACzF,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CA8BvE;AAyBD,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,oBAAyB;mBAsGpE,WAAW,CAAC,MAAM,QAAQ,MAAM,WAAW,aAAa,aAAa,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;aAS9G,OAAO,CAAC,IAAI,CAAC;EAQzB"}
@@ -1,4 +1,50 @@
1
1
  import { createAssetLoader } from "./assets.js";
2
+ /** One engine per document; wait for termination before releasing the caller's slot. */
3
+ export function renderInWorker(spawn, module, html, options, resolver) {
4
+ return new Promise((resolve, reject) => {
5
+ const load = resolver && createAssetLoader(resolver);
6
+ let worker;
7
+ let settled = false;
8
+ function finish(callback) {
9
+ if (settled)
10
+ return;
11
+ settled = true;
12
+ void Promise.resolve().then(() => worker?.terminate()).then(callback, reject);
13
+ }
14
+ const fail = (error) => finish(() => reject(error));
15
+ try {
16
+ worker = spawn({
17
+ message(message) {
18
+ if (settled || message.id !== 1)
19
+ return;
20
+ if (message.type === "done")
21
+ finish(() => resolve(message.pdf));
22
+ else if (message.type === "error")
23
+ fail(message.error);
24
+ else if (!load)
25
+ fail(new Error("Render worker requested assets without a resolver"));
26
+ else
27
+ void load(message.urls).then(data => {
28
+ if (settled)
29
+ return;
30
+ try {
31
+ worker.post({ type: "assets", id: 1, data }, data.map(bytes => bytes.buffer));
32
+ }
33
+ catch (error) {
34
+ fail(error);
35
+ }
36
+ }, fail);
37
+ },
38
+ error: fail,
39
+ });
40
+ if (!settled)
41
+ worker.post({ type: "render", id: 1, module, html, options, external: load !== undefined }, []);
42
+ }
43
+ catch (error) {
44
+ fail(error);
45
+ }
46
+ });
47
+ }
2
48
  function integer(value, min, max, name) {
3
49
  if (!Number.isSafeInteger(value) || value < min || value > max) {
4
50
  throw new RangeError(`${name} must be an integer from ${min} to ${max}`);
@@ -1 +1 @@
1
- {"version":3,"file":"worker-host.js","sourceRoot":"","sources":["../src/worker-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker-host.js","sourceRoot":"","sources":["../src/worker-host.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitz-pdf",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "Render HTML and CSS to PDF with Blitz and WebAssembly in Node.js, Bun, and browsers.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/api.ts CHANGED
@@ -3,7 +3,7 @@ import { createAssetLoader } from "./assets.js";
3
3
  import { normalizeOptions } from "./options.js";
4
4
  import { render, validateHtml } from "./render.js";
5
5
  import { compileWasm } from "./wasm.js";
6
- import { createWorkerPool, type SpawnWorker } from "./worker-host.js";
6
+ import { createWorkerPool, renderInWorker, type SpawnWorker } from "./worker-host.js";
7
7
  import type { InitOptions, PdfOptions, PdfWorkerPool, PdfWorkerPoolOptions, WasmSource } from "./types.js";
8
8
 
9
9
  export interface ApiConfig {
@@ -15,7 +15,6 @@ export interface ApiConfig {
15
15
  export function createApi({ defaultSource, prepare = async source => source, spawnWorker }: ApiConfig) {
16
16
  let compiled: Promise<WebAssembly.Module> | undefined;
17
17
  let ready: Promise<void> | undefined;
18
- let defaultPool: PdfWorkerPool | undefined;
19
18
 
20
19
  function compile(source?: WasmSource): Promise<WebAssembly.Module> {
21
20
  if (compiled) return compiled;
@@ -69,10 +68,11 @@ export function createApi({ defaultSource, prepare = async source => source, spa
69
68
  };
70
69
  }
71
70
 
72
- /** Render in the shared bounded pool. An assets function still runs on the calling thread. */
71
+ /** Render in a fresh worker and release its engine before settling. */
73
72
  async function renderPdfInWorker(html: string, options: PdfOptions = {}): Promise<Uint8Array> {
74
- defaultPool ??= createPdfWorkerPool();
75
- return defaultPool.renderPdf(html, options);
73
+ validateHtml(html);
74
+ const { assetResolver, ...normalized } = normalizeOptions(options);
75
+ return renderInWorker(spawnWorker, await compile(), html, normalized, assetResolver);
76
76
  }
77
77
 
78
78
  async function getEngineVersion(): Promise<string> { await init(); return engine_version(); }
@@ -18,6 +18,40 @@ export interface WorkerHandle {
18
18
 
19
19
  export type SpawnWorker = (events: WorkerEvents) => WorkerHandle;
20
20
 
21
+ /** One engine per document; wait for termination before releasing the caller's slot. */
22
+ export function renderInWorker(spawn: SpawnWorker, module: WebAssembly.Module, html: string,
23
+ options: RenderOptions, resolver?: AssetResolver): Promise<Uint8Array> {
24
+ return new Promise((resolve, reject) => {
25
+ const load = resolver && createAssetLoader(resolver);
26
+ let worker: WorkerHandle | undefined;
27
+ let settled = false;
28
+ function finish(callback: () => void) {
29
+ if (settled) return;
30
+ settled = true;
31
+ void Promise.resolve().then(() => worker?.terminate()).then(callback, reject);
32
+ }
33
+ const fail = (error: unknown) => finish(() => reject(error));
34
+ try {
35
+ worker = spawn({
36
+ message(message) {
37
+ if (settled || message.id !== 1) return;
38
+ if (message.type === "done") finish(() => resolve(message.pdf));
39
+ else if (message.type === "error") fail(message.error);
40
+ else if (!load) fail(new Error("Render worker requested assets without a resolver"));
41
+ else void load(message.urls).then(data => {
42
+ if (settled) return;
43
+ try {
44
+ worker!.post({ type: "assets", id: 1, data }, data.map(bytes => bytes.buffer as ArrayBuffer));
45
+ } catch (error) { fail(error); }
46
+ }, fail);
47
+ },
48
+ error: fail,
49
+ });
50
+ if (!settled) worker.post({ type: "render", id: 1, module, html, options, external: load !== undefined }, []);
51
+ } catch (error) { fail(error); }
52
+ });
53
+ }
54
+
21
55
  interface Job {
22
56
  id: number;
23
57
  message: Extract<HostMessage, { type: "render" }>;
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/wasm/blitz_pdf_bg.wasm
3
3
  size: 72552047 bytes
4
- sha256: 50255e9cc08a644ef1e7d8935e4288a6fda60b15a508f601694063f449af6586
4
+ sha256: 2167d21c26e52f4b969c583622e08710eb5185242322f8eb90fd01f2b53e7402