blitz-pdf 0.1.7 → 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.
Files changed (57) hide show
  1. package/README.md +44 -5
  2. package/THIRD_PARTY_NOTICES.md +1 -1
  3. package/dist/api.d.ts +2 -1
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +28 -3
  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 +14 -0
  16. package/dist/types.d.ts.map +1 -1
  17. package/dist/worker-host.d.ts +12 -5
  18. package/dist/worker-host.d.ts.map +1 -1
  19. package/dist/worker-host.js +187 -20
  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/RUST_DEPENDENCIES.txt +34 -40
  28. package/package.json +1 -1
  29. package/src/api.ts +29 -4
  30. package/src/browser.ts +2 -1
  31. package/src/node.ts +7 -2
  32. package/src/types.ts +15 -0
  33. package/src/worker-host.ts +176 -23
  34. package/src/worker-protocol.ts +5 -5
  35. package/src/worker-runtime.ts +20 -6
  36. package/vendor/README.md +19 -5
  37. package/vendor/blitz-dom/Cargo.toml +6 -6
  38. package/vendor/blitz-dom/src/accessibility.rs +175 -2
  39. package/vendor/blitz-dom/src/config.rs +8 -10
  40. package/vendor/blitz-dom/src/document.rs +66 -3
  41. package/vendor/blitz-dom/src/events/keyboard.rs +2 -6
  42. package/vendor/blitz-dom/src/layout/construct.rs +5 -300
  43. package/vendor/blitz-dom/src/layout/inline/build.rs +309 -0
  44. package/vendor/blitz-dom/src/layout/{inline.rs → inline/layout.rs} +1 -1
  45. package/vendor/blitz-dom/src/layout/inline/mod.rs +4 -0
  46. package/vendor/blitz-dom/src/layout/mod.rs +3 -1
  47. package/vendor/blitz-dom/src/layout/replaced.rs +13 -4
  48. package/vendor/blitz-dom/src/mutator.rs +47 -0
  49. package/vendor/blitz-dom/src/node/element.rs +17 -0
  50. package/vendor/blitz-dom/src/node/mod.rs +1 -0
  51. package/vendor/blitz-dom/src/node/node.rs +46 -5
  52. package/vendor/blitz-dom/src/node/text.rs +11 -11
  53. package/vendor/blitz-dom/src/resolve.rs +2 -2
  54. package/vendor/blitz-dom/src/stylo.rs +30 -22
  55. package/vendor/blitz-dom/src/util.rs +1 -1
  56. package/vendor/blitz-paint/Cargo.toml +4 -4
  57. package/wasm/blitz_pdf_bg.wasm +2 -2
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 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,10 +89,34 @@ 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. 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:
103
+
104
+ ```js
105
+ import { createPdfWorkerPool } from "blitz-pdf";
106
+
107
+ const pool = createPdfWorkerPool({ maxWorkers: 4, idleTimeoutMs: 300_000 });
108
+ try {
109
+ const pdf = await pool.renderPdf(html, { format: "A4" });
110
+ } finally {
111
+ await pool.close(); // on application shutdown, not after every document
112
+ }
113
+ ```
114
+
115
+ `maxWorkers` and `maxJobsPerWorker` must be positive safe integers;
116
+ `idleTimeoutMs` must be an integer from 0 to 2147483647 (0 disables reuse).
117
+ `close()` rejects new submissions, drains already accepted renders, and waits
118
+ for worker termination. CPU work is not interrupted. Applications must bound
119
+ their asset resolvers with their own deadlines so shutdown can finish.
96
120
 
97
121
  Options are validated on the calling thread. An `assets` function also runs
98
122
  there, so it can use closures, credentials, and caches; the worker receives
@@ -725,14 +749,29 @@ To retry a failed release, rerun its GitHub Actions run or use
725
749
  tag too. Published npm versions cannot be overwritten; subsequent releases need
726
750
  a new version.
727
751
 
752
+ ## Font startup
753
+
754
+ Bundled WOFF2 assets are decoded to SFNT by `build.rs`. The WASM registers
755
+ immutable slices of those bytes directly, avoiding runtime WOFF2 decompression
756
+ and a second font-sized heap allocation. The original fonts, family ordering,
757
+ Unicode coverage and document-specific font isolation are preserved. This trades
758
+ a larger WASM download for faster cold renders; serve the WASM with HTTP
759
+ compression in browsers. User-supplied WOFF/WOFF2 fonts are still decoded at runtime.
760
+
728
761
  ## Performance benchmarks
729
762
 
730
763
  ```sh
731
764
  bun run bench
732
765
  bun run bench --iterations=50 --warmup=5
766
+ bun run bench --mode=worker --iterations=50 --warmup=5
767
+ bun run bench --mode=fresh-worker --iterations=20 --warmup=1
733
768
  bun run bench --iterations=50 --warmup=5 --json > benchmark-results.json
734
769
  ```
735
770
 
771
+ `--mode=main` (default) renders on the calling thread, `worker` reuses one
772
+ worker, and `fresh-worker` retires the worker after each document to expose
773
+ font startup costs.
774
+
736
775
  Benchmarks measure WASM initialization separately, then first-render, mean,
737
776
  median, p95, throughput, and output size for small HTML, a styled invoice,
738
777
  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.
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,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,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 { renderInWorker } 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;
@@ -32,13 +32,38 @@ export function createApi({ defaultSource, prepare = async (source) => source, s
32
32
  await init();
33
33
  return render(html, normalized, assetResolver && createAssetLoader(assetResolver));
34
34
  }
35
- /** Like `renderPdf`, but layout and serialization run in a new worker. An `assets` function still runs on the calling thread. */
35
+ /** Create an owned pool, with independent concurrency and shutdown. No workers start until needed. */
36
+ function createPdfWorkerPool(options = {}) {
37
+ const pool = createWorkerPool(spawnWorker, options);
38
+ // Include compilation in accepted work so close also drains renders waiting for WASM.
39
+ const pending = new Set();
40
+ let closing;
41
+ return {
42
+ renderPdf(html, options = {}) {
43
+ if (closing)
44
+ return Promise.reject(new Error("PDF worker pool is closed"));
45
+ const work = (async () => {
46
+ validateHtml(html);
47
+ const { assetResolver, ...normalized } = normalizeOptions(options);
48
+ return pool.render(await compile(), html, normalized, assetResolver);
49
+ })();
50
+ pending.add(work);
51
+ void work.then(() => pending.delete(work), () => pending.delete(work));
52
+ return work;
53
+ },
54
+ close() {
55
+ closing ??= Promise.allSettled([...pending]).then(() => pool.close());
56
+ return closing;
57
+ },
58
+ };
59
+ }
60
+ /** Render in a fresh worker and release its engine before settling. */
36
61
  async function renderPdfInWorker(html, options = {}) {
37
62
  validateHtml(html);
38
63
  const { assetResolver, ...normalized } = normalizeOptions(options);
39
64
  return renderInWorker(spawnWorker, await compile(), html, normalized, assetResolver);
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":"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,gBAAgB,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAC;AAStF,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,sGAAsG;IACtG,SAAS,mBAAmB,CAAC,UAAgC,EAAE;QAC7D,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpD,sFAAsF;QACtF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC/C,IAAI,OAAkC,CAAC;QACvC,OAAO;YACL,SAAS,CAAC,IAAY,EAAE,UAAsB,EAAE;gBAC9C,IAAI,OAAO;oBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBAC3E,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;oBACvB,YAAY,CAAC,IAAI,CAAC,CAAC;oBACnB,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;oBACnE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;gBACvE,CAAC,CAAC,EAAE,CAAC;gBACL,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvE,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK;gBACH,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACtE,OAAO,OAAO,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,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,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AACtG,CAAC"}
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
@@ -119,4 +119,18 @@ export interface PdfOptions {
119
119
  /** Reject larger documents. Default: 100; maximum: 1000. */
120
120
  maxPages?: number;
121
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
+ }
122
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,23 @@
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
+ /** 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>;
18
+ /** Jobs have their own resolver and document; only the initialized engine survives. */
19
+ export declare function createWorkerPool(spawn: SpawnWorker, options?: PdfWorkerPoolOptions): {
20
+ render(module: WebAssembly.Module, html: string, options: RenderOptions, resolver?: AssetResolver): Promise<Uint8Array>;
21
+ close(): Promise<void>;
22
+ };
16
23
  //# 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;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,31 +1,198 @@
1
1
  import { createAssetLoader } from "./assets.js";
2
- /** Renders in a fresh worker that instantiates the precompiled module, then terminates it. */
2
+ /** One engine per document; wait for termination before releasing the caller's slot. */
3
3
  export function renderInWorker(spawn, module, html, options, resolver) {
4
4
  return new Promise((resolve, reject) => {
5
5
  const load = resolver && createAssetLoader(resolver);
6
+ let worker;
6
7
  let settled = false;
7
- const settle = (callback) => {
8
+ function finish(callback) {
8
9
  if (settled)
9
10
  return;
10
11
  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 }, []);
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
+ }
29
46
  });
30
47
  }
48
+ function integer(value, min, max, name) {
49
+ if (!Number.isSafeInteger(value) || value < min || value > max) {
50
+ throw new RangeError(`${name} must be an integer from ${min} to ${max}`);
51
+ }
52
+ return value;
53
+ }
54
+ /** Jobs have their own resolver and document; only the initialized engine survives. */
55
+ export function createWorkerPool(spawn, options = {}) {
56
+ const maxWorkers = integer(options.maxWorkers ?? 4, 1, Number.MAX_SAFE_INTEGER, "maxWorkers");
57
+ const idleTimeoutMs = integer(options.idleTimeoutMs ?? 30_000, 0, 2_147_483_647, "idleTimeoutMs");
58
+ const maxJobs = integer(options.maxJobsPerWorker ?? 100, 1, Number.MAX_SAFE_INTEGER, "maxJobsPerWorker");
59
+ const slots = new Set();
60
+ const queue = [];
61
+ const terminating = new Set();
62
+ let nextId = 0;
63
+ let closing;
64
+ let resolveClosed;
65
+ let pumping = false;
66
+ function checkClosed() {
67
+ if (closing && queue.length === 0 && slots.size === 0 && terminating.size === 0)
68
+ resolveClosed?.();
69
+ }
70
+ function retire(slot) {
71
+ if (slot.retired)
72
+ return;
73
+ slot.retired = true;
74
+ clearTimeout(slot.timer);
75
+ slots.delete(slot);
76
+ // Observe asynchronous termination before close resolves; late exit events are ignored.
77
+ const done = Promise.resolve().then(() => slot.worker?.terminate()).then(() => { }, () => { });
78
+ terminating.add(done);
79
+ void done.then(() => { terminating.delete(done); checkClosed(); });
80
+ }
81
+ function fail(slot, error) {
82
+ if (slot.retired)
83
+ return;
84
+ const job = slot.job;
85
+ delete slot.job;
86
+ retire(slot);
87
+ job?.reject(error);
88
+ pump();
89
+ }
90
+ function release(slot) {
91
+ slot.completed++;
92
+ if (slot.completed >= maxJobs || idleTimeoutMs === 0 || (closing && queue.length === 0)) {
93
+ retire(slot);
94
+ }
95
+ else if (queue.length === 0) {
96
+ slot.worker?.unref?.();
97
+ slot.timer = setTimeout(() => { retire(slot); checkClosed(); }, idleTimeoutMs);
98
+ // A warm worker and its eviction timer must not keep a CLI alive.
99
+ slot.timer.unref?.();
100
+ }
101
+ pump();
102
+ }
103
+ function message(slot, value) {
104
+ const job = slot.job;
105
+ if (slot.retired || !job || value.id !== job.id)
106
+ return;
107
+ if (value.type === "done") {
108
+ delete slot.job;
109
+ release(slot);
110
+ job.resolve(value.pdf);
111
+ }
112
+ else if (value.type === "error") {
113
+ fail(slot, value.error);
114
+ }
115
+ else if (!job.load) {
116
+ fail(slot, new Error("Render worker requested assets without a resolver"));
117
+ }
118
+ else {
119
+ void job.load(value.urls).then(data => {
120
+ // Resolver promises can finish after a crash or retirement. Never send them to another job.
121
+ if (slot.retired || slot.job !== job)
122
+ return;
123
+ try {
124
+ slot.worker.post({ type: "assets", id: job.id, data }, data.map(bytes => bytes.buffer));
125
+ }
126
+ catch (error) {
127
+ fail(slot, error);
128
+ }
129
+ }, error => { if (!slot.retired && slot.job === job)
130
+ fail(slot, error); });
131
+ }
132
+ }
133
+ function pump() {
134
+ if (pumping)
135
+ return;
136
+ pumping = true;
137
+ try {
138
+ while (queue.length > 0) {
139
+ let slot = [...slots].find(candidate => !candidate.job);
140
+ if (!slot && slots.size >= maxWorkers)
141
+ break;
142
+ const job = queue.shift();
143
+ if (!slot) {
144
+ slot = { completed: 0, retired: false, job };
145
+ slots.add(slot);
146
+ const created = slot;
147
+ try {
148
+ created.worker = spawn({ message: value => message(created, value), error: error => fail(created, error) });
149
+ }
150
+ catch (error) {
151
+ fail(created, error);
152
+ continue;
153
+ }
154
+ }
155
+ else {
156
+ clearTimeout(slot.timer);
157
+ delete slot.timer;
158
+ slot.job = job;
159
+ }
160
+ try {
161
+ slot.worker.ref?.();
162
+ slot.worker.post(job.message, []);
163
+ }
164
+ catch (error) {
165
+ fail(slot, error);
166
+ }
167
+ }
168
+ if (closing && queue.length === 0)
169
+ for (const slot of slots)
170
+ if (!slot.job)
171
+ retire(slot);
172
+ }
173
+ finally {
174
+ pumping = false;
175
+ }
176
+ checkClosed();
177
+ }
178
+ return {
179
+ render(module, html, options, resolver) {
180
+ if (closing)
181
+ return Promise.reject(new Error("PDF worker pool is closed"));
182
+ return new Promise((resolve, reject) => {
183
+ const id = ++nextId;
184
+ queue.push({ id, message: { type: "render", id, module, html, options, external: resolver !== undefined },
185
+ load: resolver ? createAssetLoader(resolver) : undefined, resolve, reject });
186
+ pump();
187
+ });
188
+ },
189
+ close() {
190
+ if (!closing) {
191
+ closing = new Promise(resolve => { resolveClosed = resolve; });
192
+ pump();
193
+ }
194
+ return closing;
195
+ },
196
+ };
197
+ }
31
198
  //# 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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"}
@@ -1,22 +1,27 @@
1
1
  import type { RenderOptions } from "./render.js";
2
2
  export type HostMessage = {
3
3
  type: "render";
4
+ id: number;
4
5
  module: WebAssembly.Module;
5
6
  html: string;
6
7
  options: RenderOptions;
7
8
  external: boolean;
8
9
  } | {
9
10
  type: "assets";
11
+ id: number;
10
12
  data: Uint8Array[];
11
13
  };
12
14
  export type WorkerMessage = {
13
15
  type: "assets";
16
+ id: number;
14
17
  urls: string[];
15
18
  } | {
16
19
  type: "done";
20
+ id: number;
17
21
  pdf: Uint8Array;
18
22
  } | {
19
23
  type: "error";
24
+ id: number;
20
25
  error: unknown;
21
26
  };
22
27
  //# sourceMappingURL=worker-protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker-protocol.d.ts","sourceRoot":"","sources":["../src/worker-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACvG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAE3C,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"worker-protocol.d.ts","sourceRoot":"","sources":["../src/worker-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACnH;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC"}
@@ -3,6 +3,6 @@ export interface WorkerEndpoint {
3
3
  post(message: WorkerMessage, transfer: ArrayBuffer[]): void;
4
4
  onMessage(handler: (message: HostMessage) => void): void;
5
5
  }
6
- /** Worker side of `renderPdfInWorker`: one render per worker; asset bytes come from the host. */
6
+ /** One document at a time; retain the initialized engine and its bundled-font cache. */
7
7
  export declare function serve(endpoint: WorkerEndpoint): void;
8
8
  //# sourceMappingURL=worker-runtime.d.ts.map