blitz-pdf 0.1.6 → 0.1.8

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.
Files changed (88) hide show
  1. package/README.md +66 -11
  2. package/THIRD_PARTY_NOTICES.md +19 -1
  3. package/dist/api.d.ts +2 -1
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +31 -6
  6. package/dist/api.js.map +1 -1
  7. package/dist/browser.d.ts +2 -1
  8. package/dist/browser.d.ts.map +1 -1
  9. package/dist/browser.js +1 -1
  10. package/dist/browser.js.map +1 -1
  11. package/dist/node.d.ts +2 -1
  12. package/dist/node.d.ts.map +1 -1
  13. package/dist/node.js +6 -2
  14. package/dist/node.js.map +1 -1
  15. package/dist/types.d.ts +16 -1
  16. package/dist/types.d.ts.map +1 -1
  17. package/dist/worker-host.d.ts +10 -5
  18. package/dist/worker-host.d.ts.map +1 -1
  19. package/dist/worker-host.js +149 -28
  20. package/dist/worker-host.js.map +1 -1
  21. package/dist/worker-protocol.d.ts +5 -0
  22. package/dist/worker-protocol.d.ts.map +1 -1
  23. package/dist/worker-runtime.d.ts +1 -1
  24. package/dist/worker-runtime.d.ts.map +1 -1
  25. package/dist/worker-runtime.js +22 -6
  26. package/dist/worker-runtime.js.map +1 -1
  27. package/licenses/Noto-OFL.txt +94 -0
  28. package/licenses/NotoCJK-OFL.txt +92 -0
  29. package/licenses/NotoEmoji-OFL.txt +93 -0
  30. package/licenses/RUST_DEPENDENCIES.txt +34 -40
  31. package/licenses/Unifont-OFL.txt +90 -0
  32. package/licenses/font-sources.json +106 -0
  33. package/package.json +1 -1
  34. package/src/api.ts +32 -7
  35. package/src/browser.ts +2 -1
  36. package/src/node.ts +7 -2
  37. package/src/types.ts +17 -1
  38. package/src/worker-host.ts +148 -29
  39. package/src/worker-protocol.ts +5 -5
  40. package/src/worker-runtime.ts +20 -6
  41. package/vendor/README.md +38 -5
  42. package/vendor/blitz-dom/Cargo.toml +6 -6
  43. package/vendor/blitz-dom/src/accessibility.rs +175 -2
  44. package/vendor/blitz-dom/src/config.rs +8 -10
  45. package/vendor/blitz-dom/src/document.rs +66 -3
  46. package/vendor/blitz-dom/src/events/keyboard.rs +2 -6
  47. package/vendor/blitz-dom/src/layout/construct.rs +5 -300
  48. package/vendor/blitz-dom/src/layout/inline/build.rs +309 -0
  49. package/vendor/blitz-dom/src/layout/{inline.rs → inline/layout.rs} +1 -1
  50. package/vendor/blitz-dom/src/layout/inline/mod.rs +4 -0
  51. package/vendor/blitz-dom/src/layout/mod.rs +3 -1
  52. package/vendor/blitz-dom/src/layout/replaced.rs +13 -4
  53. package/vendor/blitz-dom/src/mutator.rs +47 -0
  54. package/vendor/blitz-dom/src/node/element.rs +17 -0
  55. package/vendor/blitz-dom/src/node/mod.rs +1 -0
  56. package/vendor/blitz-dom/src/node/node.rs +46 -5
  57. package/vendor/blitz-dom/src/node/text.rs +11 -11
  58. package/vendor/blitz-dom/src/resolve.rs +2 -2
  59. package/vendor/blitz-dom/src/stylo.rs +30 -22
  60. package/vendor/blitz-dom/src/util.rs +1 -1
  61. package/vendor/blitz-paint/Cargo.toml +4 -4
  62. package/vendor/fontique/Cargo.toml +194 -0
  63. package/vendor/fontique/LICENSE-APACHE +201 -0
  64. package/vendor/fontique/LICENSE-MIT +25 -0
  65. package/vendor/fontique/README.md +54 -0
  66. package/vendor/fontique/examples/generic_families.rs +37 -0
  67. package/vendor/fontique/src/attributes.rs +42 -0
  68. package/vendor/fontique/src/backend/android.rs +218 -0
  69. package/vendor/fontique/src/backend/coretext.rs +206 -0
  70. package/vendor/fontique/src/backend/dwrite.rs +395 -0
  71. package/vendor/fontique/src/backend/fontconfig.rs +844 -0
  72. package/vendor/fontique/src/backend/mod.rs +75 -0
  73. package/vendor/fontique/src/charmap.rs +127 -0
  74. package/vendor/fontique/src/collection/mod.rs +1016 -0
  75. package/vendor/fontique/src/collection/query.rs +392 -0
  76. package/vendor/fontique/src/fallback.rs +293 -0
  77. package/vendor/fontique/src/family.rs +111 -0
  78. package/vendor/fontique/src/family_name.rs +153 -0
  79. package/vendor/fontique/src/font.rs +562 -0
  80. package/vendor/fontique/src/generic.rs +36 -0
  81. package/vendor/fontique/src/impl_fontconfig.rs +159 -0
  82. package/vendor/fontique/src/lib.rs +87 -0
  83. package/vendor/fontique/src/matching.rs +483 -0
  84. package/vendor/fontique/src/scan.rs +312 -0
  85. package/vendor/fontique/src/script.rs +271 -0
  86. package/vendor/fontique/src/source.rs +108 -0
  87. package/vendor/fontique/src/source_cache.rs +254 -0
  88. package/wasm/blitz_pdf_bg.wasm +0 -0
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 new worker: a Web Worker in browsers and a
80
+ serialization run in a reusable 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,10 +89,33 @@ 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. Each call
93
- starts a separate worker and terminates it after the render, so its memory is
94
- freed and concurrent calls run in parallel. Limit concurrency yourself, for
95
- example to `navigator.hardwareConcurrency` or `os.availableParallelism()`.
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:
102
+
103
+ ```js
104
+ import { createPdfWorkerPool } from "blitz-pdf";
105
+
106
+ const pool = createPdfWorkerPool({ maxWorkers: 4, idleTimeoutMs: 300_000 });
107
+ try {
108
+ const pdf = await pool.renderPdf(html, { format: "A4" });
109
+ } finally {
110
+ await pool.close(); // on application shutdown, not after every document
111
+ }
112
+ ```
113
+
114
+ `maxWorkers` and `maxJobsPerWorker` must be positive safe integers;
115
+ `idleTimeoutMs` must be an integer from 0 to 2147483647 (0 disables reuse).
116
+ `close()` rejects new submissions, drains already accepted renders, and waits
117
+ for worker termination. CPU work is not interrupted. Applications must bound
118
+ their asset resolvers with their own deadlines so shutdown can finish.
96
119
 
97
120
  Options are validated on the calling thread. An `assets` function also runs
98
121
  there, so it can use closures, credentials, and caches; the worker receives
@@ -386,11 +409,28 @@ limit also reject. Already-running callbacks may finish after another callback
386
409
  fails; their results are discarded. Apply fetch timeouts in your loader when
387
410
  needed. The existing asset-map API continues to work.
388
411
 
389
- DejaVu Sans regular, bold, italic, and bold italic are bundled; DejaVu Sans Mono
390
- backs `monospace`. Other generic families fall back to DejaVu Sans. There is no
412
+ Noto Sans regular, bold, italic, and bold italic are the bundled defaults;
413
+ Noto Sans Mono backs `monospace`. Noto Sans CJK regular and bold cover CJK text,
414
+ including supplementary ideographs. DejaVu families remain available when
415
+ explicitly requested. Other generic families fall back to Noto Sans. There is no
391
416
  system font discovery. Fonts passed in `fonts` use their internal family names;
392
- use `@font-face` with an asset URL for a CSS alias. Supply fonts for scripts not
393
- covered by the bundled family.
417
+ use `@font-face` with an asset URL for a CSS alias.
418
+
419
+ Missing glyphs automatically fall back to other registered fonts, including
420
+ fonts loaded asynchronously through `@font-face`. Requested CSS families and
421
+ script-specific fallbacks take precedence, then registered fonts are tried in
422
+ registration order. Bundled Unifont and Unifont Upper are the last resorts for
423
+ broader Unicode coverage; monochrome Noto Emoji covers emoji sequences. This
424
+ works for body text, generated CSS content, headers, footers and page numbers,
425
+ through both `renderPdf` and `renderPdfInWorker`, without editing CSS font stacks.
426
+
427
+ Supply a suitable script font (such as a Noto family) for higher-quality shaping
428
+ and typography in complex scripts; it takes precedence over Unifont. The fallback
429
+ search is not restricted to a language or Unicode plane. Bundled font coverage
430
+ is finite; supply additional fonts for characters they do not contain. A glyph
431
+ must exist in at least one available font, including for custom private-use
432
+ characters. Missing glyphs continue to fail PDF/A validation.
433
+ No text is removed or replaced to hide a missing glyph.
394
434
 
395
435
  Input limits: 16 MiB HTML, 64 MiB supplied assets, 64 MiB attachments, 32 MiB supplied fonts, and 1024
396
436
  resource requests. These are practical limits, not a complete sandbox; isolate
@@ -552,8 +592,8 @@ fit the page width fails explicitly.
552
592
 
553
593
  The renderer reserves a footer band of `2 × fontSize + 8px` above the bottom
554
594
  margin **before pagination**. Numbers use the final page count, including
555
- intentional blanks. The footer uses embedded DejaVu Sans and the same Unicode
556
- shaping as body text, preserving selectable text and PDF/A-3u. It works with
595
+ intentional blanks. The footer shares the document's font collection, Unicode
596
+ fallbacks and shaping, preserving selectable text and PDF/A-3u. It works with
557
597
  async assets in every runtime. `PageNumberOptions` is an exported TypeScript type.
558
598
 
559
599
  ### Repeated HTML headers and footers
@@ -708,14 +748,29 @@ To retry a failed release, rerun its GitHub Actions run or use
708
748
  tag too. Published npm versions cannot be overwritten; subsequent releases need
709
749
  a new version.
710
750
 
751
+ ## Font startup
752
+
753
+ Bundled WOFF2 assets are decoded to SFNT by `build.rs`. The WASM registers
754
+ immutable slices of those bytes directly, avoiding runtime WOFF2 decompression
755
+ and a second font-sized heap allocation. The original fonts, family ordering,
756
+ Unicode coverage and document-specific font isolation are preserved. This trades
757
+ a larger WASM download for faster cold renders; serve the WASM with HTTP
758
+ compression in browsers. User-supplied WOFF/WOFF2 fonts are still decoded at runtime.
759
+
711
760
  ## Performance benchmarks
712
761
 
713
762
  ```sh
714
763
  bun run bench
715
764
  bun run bench --iterations=50 --warmup=5
765
+ bun run bench --mode=worker --iterations=50 --warmup=5
766
+ bun run bench --mode=fresh-worker --iterations=20 --warmup=1
716
767
  bun run bench --iterations=50 --warmup=5 --json > benchmark-results.json
717
768
  ```
718
769
 
770
+ `--mode=main` (default) renders on the calling thread, `worker` reuses one
771
+ worker, and `fresh-worker` retires the worker after each document to expose
772
+ font startup costs.
773
+
719
774
  Benchmarks measure WASM initialization separately, then first-render, mean,
720
775
  median, p95, throughput, and output size for small HTML, a styled invoice,
721
776
  100 paragraphs, matching asset-map/async-loader documents with nested CSS
@@ -4,7 +4,7 @@ blitz-pdf is an independent project, not an official Dioxus Labs package.
4
4
 
5
5
  The distributed WebAssembly module includes:
6
6
 
7
- - [Blitz](https://github.com/DioxusLabs/blitz), MIT OR Apache-2.0, pinned to `e72650a6e67941852fddf025295cfee30c39ea32`.
7
+ - [Blitz](https://github.com/DioxusLabs/blitz), MIT OR Apache-2.0, pinned to `f8723f495c7c6bfb611a923a21ed5c8e0fe95d55`.
8
8
  - [Krilla](https://github.com/LaurenzV/krilla), MIT OR Apache-2.0, for PDF serialization and font subsetting.
9
9
  - [Parley](https://github.com/linebender/parley), MIT OR Apache-2.0, for text layout.
10
10
  - [Stylo](https://github.com/servo/stylo), MPL-2.0, for CSS styling.
@@ -22,6 +22,9 @@ table-cell sizing/spacing, anonymous table wrappers, and paragraph margin
22
22
  collapse; its source and MIT/Apache-2.0 licenses are in `vendor/blitz-dom`.
23
23
  Blitz's paint crate exposes source-layout notifications for Unicode PDF text;
24
24
  its source and MIT/Apache-2.0 licenses are in `vendor/blitz-paint`.
25
+
26
+ Fontique 0.12.0 is patched for opt-in registered-font fallback; its complete
27
+ source and MIT/Apache-2.0 licenses are included in `vendor/fontique`.
25
28
  `vendor/README.md` lists these patches. Other dependencies are used without
26
29
  source modifications.
27
30
 
@@ -30,3 +33,18 @@ Bundled DejaVu fonts use the Bitstream Vera / DejaVu license reproduced in
30
33
  `examples/wasm_hello/assets/DejaVuSans.woff2` at the pinned revision. Other faces
31
34
  are from the official DejaVu 2.37 TTF release. Fonts are subsetted and embedded
32
35
  in generated PDFs.
36
+
37
+ Unifont 18.0.01 and Unifont Upper provide last-resort Unicode glyphs under the
38
+ SIL Open Font License in `licenses/Unifont-OFL.txt`. Monochrome Noto Emoji uses
39
+ `licenses/NotoEmoji-OFL.txt`. The default Noto Sans and Noto Sans Mono fonts and
40
+ the Noto Sans Tamil regression fixture use `licenses/Noto-OFL.txt`; Noto Sans CJK
41
+ uses `licenses/NotoCJK-OFL.txt`. Exact upstream URLs, source/bundled SHA-256 checksums,
42
+ copyright notices and the static emoji instance are recorded in
43
+ `licenses/font-sources.json`. WOFF2 files were compressed without glyph
44
+ subsetting using FontTools 4.67.0 and Brotli 1.2.0; Noto Emoji was instantiated
45
+ at weight 400. Unifont straight-line outlines were converted losslessly from
46
+ CFF to TrueType, preserving glyph coverage and metrics, to avoid CFF font-matrix
47
+ width inconsistencies in PDF/A readers. Rebuild them with
48
+ `python scripts/build-unicode-fallbacks.py /path/to/original-fonts` using the
49
+ versions above and the upstream files listed in the manifest. All bundled fonts
50
+ are available offline in the WASM module.
package/dist/api.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type SpawnWorker } from "./worker-host.js";
2
- import type { InitOptions, PdfOptions, WasmSource } from "./types.js";
2
+ import type { InitOptions, PdfOptions, PdfWorkerPool, PdfWorkerPoolOptions, WasmSource } from "./types.js";
3
3
  export interface ApiConfig {
4
4
  defaultSource: () => Promise<WasmSource> | WasmSource;
5
5
  prepare?: (source: WasmSource) => Promise<WasmSource>;
@@ -9,6 +9,7 @@ export declare function createApi({ defaultSource, prepare, spawnWorker }: ApiCo
9
9
  init: (options?: InitOptions) => Promise<void>;
10
10
  renderPdf: (html: string, options?: PdfOptions) => Promise<Uint8Array>;
11
11
  renderPdfInWorker: (html: string, options?: PdfOptions) => Promise<Uint8Array>;
12
+ createPdfWorkerPool: (options?: PdfWorkerPoolOptions) => PdfWorkerPool;
12
13
  getWasmModule: () => Promise<WebAssembly.Module>;
13
14
  getEngineVersion: () => Promise<string>;
14
15
  };
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,EAAkB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtE,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;8BAQ9C,MAAM,YAAW,UAAU,KAAQ,OAAO,CAAC,UAAU,CAAC;yBAXnE,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;4BAiBlB,OAAO,CAAC,MAAM,CAAC;EAEnD"}
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"}
package/dist/api.js CHANGED
@@ -3,10 +3,11 @@ 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 { renderInWorker } from "./worker-host.js";
6
+ import { createWorkerPool } 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;
10
11
  function compile(source) {
11
12
  if (compiled)
12
13
  return compiled;
@@ -32,13 +33,37 @@ export function createApi({ defaultSource, prepare = async (source) => source, s
32
33
  await init();
33
34
  return render(html, normalized, assetResolver && createAssetLoader(assetResolver));
34
35
  }
35
- /** Like `renderPdf`, but layout and serialization run in a new worker. An `assets` function still runs on the calling thread. */
36
+ /** Create an owned pool, with independent concurrency and shutdown. No workers start until needed. */
37
+ function createPdfWorkerPool(options = {}) {
38
+ const pool = createWorkerPool(spawnWorker, options);
39
+ // Include compilation in accepted work so close also drains renders waiting for WASM.
40
+ const pending = new Set();
41
+ let closing;
42
+ return {
43
+ renderPdf(html, options = {}) {
44
+ if (closing)
45
+ return Promise.reject(new Error("PDF worker pool is closed"));
46
+ const work = (async () => {
47
+ validateHtml(html);
48
+ const { assetResolver, ...normalized } = normalizeOptions(options);
49
+ return pool.render(await compile(), html, normalized, assetResolver);
50
+ })();
51
+ pending.add(work);
52
+ void work.then(() => pending.delete(work), () => pending.delete(work));
53
+ return work;
54
+ },
55
+ close() {
56
+ closing ??= Promise.allSettled([...pending]).then(() => pool.close());
57
+ return closing;
58
+ },
59
+ };
60
+ }
61
+ /** Render in the shared bounded pool. An assets function still runs on the calling thread. */
36
62
  async function renderPdfInWorker(html, options = {}) {
37
- validateHtml(html);
38
- const { assetResolver, ...normalized } = normalizeOptions(options);
39
- return renderInWorker(spawnWorker, await compile(), html, normalized, assetResolver);
63
+ defaultPool ??= createPdfWorkerPool();
64
+ return defaultPool.renderPdf(html, options);
40
65
  }
41
66
  async function getEngineVersion() { await init(); return engine_version(); }
42
- return { init, renderPdf, renderPdfInWorker, getWasmModule, getEngineVersion };
67
+ return { init, renderPdf, renderPdfInWorker, createPdfWorkerPool, getWasmModule, getEngineVersion };
43
68
  }
44
69
  //# sourceMappingURL=api.js.map
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAC;AASpE,MAAM,UAAU,SAAS,CAAC,EAAE,aAAa,EAAE,OAAO,GAAG,KAAK,EAAC,MAAM,EAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAa;IACnG,IAAI,QAAiD,CAAC;IACtD,IAAI,KAAgC,CAAC;IAErC,SAAS,OAAO,CAAC,MAAmB;QAClC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,OAAO,CAAC,MAAM,IAAI,MAAM,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE;aACnF,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,6FAA6F;IAC7F,SAAS,IAAI,CAAC,UAAuB,EAAE;QACrC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;YAClB,MAAM,QAAQ,CAAC,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kHAAkH;IAClH,SAAS,aAAa,KAAkC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAE3E,oFAAoF;IACpF,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,UAAsB,EAAE;QAC7D,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnE,MAAM,IAAI,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,iIAAiI;IACjI,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,UAAsB,EAAE;QACrE,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnE,OAAO,cAAc,CAAC,WAAW,EAAE,MAAM,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,UAAU,gBAAgB,KAAsB,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC;IAC7F,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AACjF,CAAC"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/browser.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export type { AssetData, AssetMap, AssetResolver, AttachmentRelationship, BinaryData, InitOptions, Length, PageFormat, PageNumberOptions, PdfAttachment, PdfDate, PdfMetadata, PdfOptions, PdfXmpProperty, PdfXmpSchema, WasmSource } from "./types.js";
2
- export declare const init: (options?: import("./types.js").InitOptions) => Promise<void>, renderPdf: (html: string, options?: import("./types.js").PdfOptions) => Promise<Uint8Array>, renderPdfInWorker: (html: string, options?: import("./types.js").PdfOptions) => Promise<Uint8Array>, getWasmModule: () => Promise<WebAssembly.Module>, getEngineVersion: () => Promise<string>;
2
+ export type { PdfWorkerPool, PdfWorkerPoolOptions } from "./types.js";
3
+ export declare const init: (options?: import("./types.js").InitOptions) => Promise<void>, renderPdf: (html: string, options?: import("./types.js").PdfOptions) => Promise<Uint8Array>, renderPdfInWorker: (html: string, options?: import("./types.js").PdfOptions) => Promise<Uint8Array>, createPdfWorkerPool: (options?: import("./types.js").PdfWorkerPoolOptions) => import("./types.js").PdfWorkerPool, getWasmModule: () => Promise<WebAssembly.Module>, getEngineVersion: () => Promise<string>;
3
4
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,sBAAsB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxP,eAAO,MAAQ,IAAI,iEAAE,SAAS,oFAAE,iBAAiB,oFAAE,aAAa,qCAAE,gBAAgB,uBAYhF,CAAC"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,sBAAsB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxP,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACtE,eAAO,MAAQ,IAAI,iEAAE,SAAS,oFAAE,iBAAiB,oFAAE,mBAAmB,+FAAE,aAAa,qCAAE,gBAAgB,uBAYrG,CAAC"}
package/dist/browser.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createApi } from "./api.js";
2
- export const { init, renderPdf, renderPdfInWorker, getWasmModule, getEngineVersion } = createApi({
2
+ export const { init, renderPdf, renderPdfInWorker, createPdfWorkerPool, getWasmModule, getEngineVersion } = createApi({
3
3
  defaultSource: () => new URL("../wasm/blitz_pdf_bg.wasm", import.meta.url),
4
4
  spawnWorker: events => {
5
5
  const worker = new Worker(new URL("./worker.js", import.meta.url), { type: "module" });
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAC/F,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1E,WAAW,EAAE,MAAM,CAAC,EAAE;QACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE;YACvB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;QACrH,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;IACrH,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAIrC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACpH,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1E,WAAW,EAAE,MAAM,CAAC,EAAE;QACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE;YACvB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;QACrH,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;IACrH,CAAC;CACF,CAAC,CAAC"}
package/dist/node.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export type { AssetData, AssetMap, AssetResolver, AttachmentRelationship, BinaryData, InitOptions, Length, PageFormat, PageNumberOptions, PdfAttachment, PdfDate, PdfMetadata, PdfOptions, PdfXmpProperty, PdfXmpSchema, WasmSource } from "./types.js";
2
- export declare const init: (options?: import("./types.js").InitOptions) => Promise<void>, renderPdf: (html: string, options?: import("./types.js").PdfOptions) => Promise<Uint8Array>, renderPdfInWorker: (html: string, options?: import("./types.js").PdfOptions) => Promise<Uint8Array>, getWasmModule: () => Promise<WebAssembly.Module>, getEngineVersion: () => Promise<string>;
2
+ export type { PdfWorkerPool, PdfWorkerPoolOptions } from "./types.js";
3
+ export declare const init: (options?: import("./types.js").InitOptions) => Promise<void>, renderPdf: (html: string, options?: import("./types.js").PdfOptions) => Promise<Uint8Array>, renderPdfInWorker: (html: string, options?: import("./types.js").PdfOptions) => Promise<Uint8Array>, createPdfWorkerPool: (options?: import("./types.js").PdfWorkerPoolOptions) => import("./types.js").PdfWorkerPool, getWasmModule: () => Promise<WebAssembly.Module>, getEngineVersion: () => Promise<string>;
3
4
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,sBAAsB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxP,eAAO,MAAQ,IAAI,iEAAE,SAAS,oFAAE,iBAAiB,oFAAE,aAAa,qCAAE,gBAAgB,uBAehF,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,sBAAsB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxP,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACtE,eAAO,MAAQ,IAAI,iEAAE,SAAS,oFAAE,iBAAiB,oFAAE,mBAAmB,+FAAE,aAAa,qCAAE,gBAAgB,uBAmBrG,CAAC"}
package/dist/node.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { Worker } from "node:worker_threads";
3
3
  import { createApi } from "./api.js";
4
- export const { init, renderPdf, renderPdfInWorker, getWasmModule, getEngineVersion } = createApi({
4
+ export const { init, renderPdf, renderPdfInWorker, createPdfWorkerPool, getWasmModule, getEngineVersion } = createApi({
5
5
  defaultSource: () => readFile(new URL("../wasm/blitz_pdf_bg.wasm", import.meta.url)),
6
6
  prepare: async (source) => {
7
7
  if (source instanceof URL && source.protocol === "file:")
@@ -16,7 +16,11 @@ export const { init, renderPdf, renderPdfInWorker, getWasmModule, getEngineVersi
16
16
  worker.on("error", events.error);
17
17
  worker.on("messageerror", events.error);
18
18
  worker.on("exit", code => events.error(new Error(`Render worker exited with code ${code}`)));
19
- return { post: (message, transfer) => worker.postMessage(message, transfer), terminate: () => void worker.terminate() };
19
+ return {
20
+ post: (message, transfer) => worker.postMessage(message, transfer),
21
+ terminate: async () => { await worker.terminate(); },
22
+ ref: () => { worker.ref(); }, unref: () => { worker.unref(); },
23
+ };
20
24
  },
21
25
  });
22
26
  //# sourceMappingURL=node.js.map
package/dist/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAC/F,aAAa,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpF,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACtB,IAAI,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClF,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/F,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,WAAW,EAAE,MAAM,CAAC,EAAE;QACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;IAC1H,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAIrC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACpH,aAAa,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpF,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACtB,IAAI,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClF,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/F,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,WAAW,EAAE,MAAM,CAAC,EAAE;QACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO;YACL,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC;YAClE,SAAS,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACpD,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAC/D,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
package/dist/types.d.ts CHANGED
@@ -101,7 +101,8 @@ export interface PdfOptions {
101
101
  baseUrl?: string;
102
102
  /** Resource map or async loader, called once per absolute URL per render. Data URLs are handled internally. */
103
103
  assets?: AssetMap | AssetResolver;
104
- /** Additional static TTF, OTF, WOFF, or WOFF2 fonts, using their internal family names. */
104
+ /** Additional static TTF, OTF, WOFF, or WOFF2 fonts, using their internal family names.
105
+ * Automatically used as fallbacks when the requested font lacks a glyph. */
105
106
  fonts?: readonly BinaryData[];
106
107
  /** PDF document title. */
107
108
  title?: string;
@@ -118,4 +119,18 @@ export interface PdfOptions {
118
119
  /** Reject larger documents. Default: 100; maximum: 1000. */
119
120
  maxPages?: number;
120
121
  }
122
+ /** Limits for a pool of reusable, independent PDF engines. */
123
+ export interface PdfWorkerPoolOptions {
124
+ /** Maximum simultaneous renders. Default: 4. */
125
+ maxWorkers?: number;
126
+ /** Release an unused worker after this many milliseconds. Default: 30000; 0 disables reuse. */
127
+ idleTimeoutMs?: number;
128
+ /** Recreate a worker after this many documents to bound retained engine memory. Default: 100. */
129
+ maxJobsPerWorker?: number;
130
+ }
131
+ export interface PdfWorkerPool {
132
+ renderPdf(html: string, options?: PdfOptions): Promise<Uint8Array>;
133
+ /** Stop accepting work, finish accepted renders, and release every worker. Idempotent. */
134
+ close(): Promise<void>;
135
+ }
121
136
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,21 @@
1
1
  import type { RenderOptions } from "./render.js";
2
- import type { AssetResolver } from "./types.js";
2
+ import type { AssetResolver, PdfWorkerPoolOptions } from "./types.js";
3
3
  import type { HostMessage, WorkerMessage } from "./worker-protocol.js";
4
4
  export interface WorkerEvents {
5
5
  message(message: WorkerMessage): void;
6
- /** Crashes, unreadable messages, or an exit before the render settled. */
6
+ /** Crashes, unreadable messages, or an unexpected exit, including while idle. */
7
7
  error(error: unknown): void;
8
8
  }
9
9
  export interface WorkerHandle {
10
10
  post(message: HostMessage, transfer: ArrayBuffer[]): void;
11
- terminate(): void;
11
+ terminate(): void | Promise<void>;
12
+ ref?(): void;
13
+ unref?(): void;
12
14
  }
13
15
  export type SpawnWorker = (events: WorkerEvents) => WorkerHandle;
14
- /** Renders in a fresh worker that instantiates the precompiled module, then terminates it. */
15
- export declare function renderInWorker(spawn: SpawnWorker, module: WebAssembly.Module, html: string, options: RenderOptions, resolver: AssetResolver | undefined): Promise<Uint8Array>;
16
+ /** Jobs have their own resolver and document; only the initialized engine survives. */
17
+ export declare function createWorkerPool(spawn: SpawnWorker, options?: PdfWorkerPoolOptions): {
18
+ render(module: WebAssembly.Module, html: string, options: RenderOptions, resolver?: AssetResolver): Promise<Uint8Array>;
19
+ close(): Promise<void>;
20
+ };
16
21
  //# sourceMappingURL=worker-host.d.ts.map
@@ -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,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,0EAA0E;IAC1E,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,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,YAAY,KAAK,YAAY,CAAC;AAEjE,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EACzF,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAwBlF"}
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,31 +1,152 @@
1
1
  import { createAssetLoader } from "./assets.js";
2
- /** Renders in a fresh worker that instantiates the precompiled module, then terminates it. */
3
- export function renderInWorker(spawn, module, html, options, resolver) {
4
- return new Promise((resolve, reject) => {
5
- const load = resolver && createAssetLoader(resolver);
6
- let settled = false;
7
- const settle = (callback) => {
8
- if (settled)
9
- return;
10
- settled = true;
11
- worker.terminate();
12
- callback();
13
- };
14
- const worker = spawn({
15
- message(message) {
16
- if (message.type === "done")
17
- settle(() => resolve(message.pdf));
18
- else if (message.type === "error")
19
- settle(() => reject(message.error));
20
- else if (!load)
21
- settle(() => reject(new Error("Render worker requested assets without a resolver")));
22
- else
23
- load(message.urls).then(data => { if (!settled)
24
- worker.post({ type: "assets", data }, data.map(bytes => bytes.buffer)); }, (error) => settle(() => reject(error)));
25
- },
26
- error(error) { settle(() => reject(error)); },
27
- });
28
- worker.post({ type: "render", module, html, options, external: load !== undefined }, []);
29
- });
2
+ function integer(value, min, max, name) {
3
+ if (!Number.isSafeInteger(value) || value < min || value > max) {
4
+ throw new RangeError(`${name} must be an integer from ${min} to ${max}`);
5
+ }
6
+ return value;
7
+ }
8
+ /** Jobs have their own resolver and document; only the initialized engine survives. */
9
+ export function createWorkerPool(spawn, options = {}) {
10
+ const maxWorkers = integer(options.maxWorkers ?? 4, 1, Number.MAX_SAFE_INTEGER, "maxWorkers");
11
+ const idleTimeoutMs = integer(options.idleTimeoutMs ?? 30_000, 0, 2_147_483_647, "idleTimeoutMs");
12
+ const maxJobs = integer(options.maxJobsPerWorker ?? 100, 1, Number.MAX_SAFE_INTEGER, "maxJobsPerWorker");
13
+ const slots = new Set();
14
+ const queue = [];
15
+ const terminating = new Set();
16
+ let nextId = 0;
17
+ let closing;
18
+ let resolveClosed;
19
+ let pumping = false;
20
+ function checkClosed() {
21
+ if (closing && queue.length === 0 && slots.size === 0 && terminating.size === 0)
22
+ resolveClosed?.();
23
+ }
24
+ function retire(slot) {
25
+ if (slot.retired)
26
+ return;
27
+ slot.retired = true;
28
+ clearTimeout(slot.timer);
29
+ slots.delete(slot);
30
+ // Observe asynchronous termination before close resolves; late exit events are ignored.
31
+ const done = Promise.resolve().then(() => slot.worker?.terminate()).then(() => { }, () => { });
32
+ terminating.add(done);
33
+ void done.then(() => { terminating.delete(done); checkClosed(); });
34
+ }
35
+ function fail(slot, error) {
36
+ if (slot.retired)
37
+ return;
38
+ const job = slot.job;
39
+ delete slot.job;
40
+ retire(slot);
41
+ job?.reject(error);
42
+ pump();
43
+ }
44
+ function release(slot) {
45
+ slot.completed++;
46
+ if (slot.completed >= maxJobs || idleTimeoutMs === 0 || (closing && queue.length === 0)) {
47
+ retire(slot);
48
+ }
49
+ else if (queue.length === 0) {
50
+ slot.worker?.unref?.();
51
+ slot.timer = setTimeout(() => { retire(slot); checkClosed(); }, idleTimeoutMs);
52
+ // A warm worker and its eviction timer must not keep a CLI alive.
53
+ slot.timer.unref?.();
54
+ }
55
+ pump();
56
+ }
57
+ function message(slot, value) {
58
+ const job = slot.job;
59
+ if (slot.retired || !job || value.id !== job.id)
60
+ return;
61
+ if (value.type === "done") {
62
+ delete slot.job;
63
+ release(slot);
64
+ job.resolve(value.pdf);
65
+ }
66
+ else if (value.type === "error") {
67
+ fail(slot, value.error);
68
+ }
69
+ else if (!job.load) {
70
+ fail(slot, new Error("Render worker requested assets without a resolver"));
71
+ }
72
+ else {
73
+ void job.load(value.urls).then(data => {
74
+ // Resolver promises can finish after a crash or retirement. Never send them to another job.
75
+ if (slot.retired || slot.job !== job)
76
+ return;
77
+ try {
78
+ slot.worker.post({ type: "assets", id: job.id, data }, data.map(bytes => bytes.buffer));
79
+ }
80
+ catch (error) {
81
+ fail(slot, error);
82
+ }
83
+ }, error => { if (!slot.retired && slot.job === job)
84
+ fail(slot, error); });
85
+ }
86
+ }
87
+ function pump() {
88
+ if (pumping)
89
+ return;
90
+ pumping = true;
91
+ try {
92
+ while (queue.length > 0) {
93
+ let slot = [...slots].find(candidate => !candidate.job);
94
+ if (!slot && slots.size >= maxWorkers)
95
+ break;
96
+ const job = queue.shift();
97
+ if (!slot) {
98
+ slot = { completed: 0, retired: false, job };
99
+ slots.add(slot);
100
+ const created = slot;
101
+ try {
102
+ created.worker = spawn({ message: value => message(created, value), error: error => fail(created, error) });
103
+ }
104
+ catch (error) {
105
+ fail(created, error);
106
+ continue;
107
+ }
108
+ }
109
+ else {
110
+ clearTimeout(slot.timer);
111
+ delete slot.timer;
112
+ slot.job = job;
113
+ }
114
+ try {
115
+ slot.worker.ref?.();
116
+ slot.worker.post(job.message, []);
117
+ }
118
+ catch (error) {
119
+ fail(slot, error);
120
+ }
121
+ }
122
+ if (closing && queue.length === 0)
123
+ for (const slot of slots)
124
+ if (!slot.job)
125
+ retire(slot);
126
+ }
127
+ finally {
128
+ pumping = false;
129
+ }
130
+ checkClosed();
131
+ }
132
+ return {
133
+ render(module, html, options, resolver) {
134
+ if (closing)
135
+ return Promise.reject(new Error("PDF worker pool is closed"));
136
+ return new Promise((resolve, reject) => {
137
+ const id = ++nextId;
138
+ queue.push({ id, message: { type: "render", id, module, html, options, external: resolver !== undefined },
139
+ load: resolver ? createAssetLoader(resolver) : undefined, resolve, reject });
140
+ pump();
141
+ });
142
+ },
143
+ close() {
144
+ if (!closing) {
145
+ closing = new Promise(resolve => { resolveClosed = resolve; });
146
+ pump();
147
+ }
148
+ return closing;
149
+ },
150
+ };
30
151
  }
31
152
  //# sourceMappingURL=worker-host.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker-host.js","sourceRoot":"","sources":["../src/worker-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAkBhD,8FAA8F;AAC9F,MAAM,UAAU,cAAc,CAAC,KAAkB,EAAE,MAA0B,EAAE,IAAY,EACzF,OAAsB,EAAE,QAAmC;IAC3D,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,QAAoB,EAAE,EAAE;YACtC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,SAAS,EAAE,CAAC;YACnB,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;QACF,MAAM,MAAM,GAAiB,KAAK,CAAC;YACjC,OAAO,CAAC,OAAO;gBACb,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;oBAAE,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;qBAC3D,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;oBAAE,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;qBAClE,IAAI,CAAC,IAAI;oBAAE,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC,CAAC;;oBAChG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAC1B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,EAChH,CAAC,KAAc,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAChD,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9C,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,KAAK,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"worker-host.js","sourceRoot":"","sources":["../src/worker-host.ts"],"names":[],"mappings":"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"}