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.
- package/README.md +66 -11
- package/THIRD_PARTY_NOTICES.md +19 -1
- package/dist/api.d.ts +2 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +31 -6
- package/dist/api.js.map +1 -1
- package/dist/browser.d.ts +2 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/node.d.ts +2 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +6 -2
- package/dist/node.js.map +1 -1
- package/dist/types.d.ts +16 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/worker-host.d.ts +10 -5
- package/dist/worker-host.d.ts.map +1 -1
- package/dist/worker-host.js +149 -28
- package/dist/worker-host.js.map +1 -1
- package/dist/worker-protocol.d.ts +5 -0
- package/dist/worker-protocol.d.ts.map +1 -1
- package/dist/worker-runtime.d.ts +1 -1
- package/dist/worker-runtime.d.ts.map +1 -1
- package/dist/worker-runtime.js +22 -6
- package/dist/worker-runtime.js.map +1 -1
- package/licenses/Noto-OFL.txt +94 -0
- package/licenses/NotoCJK-OFL.txt +92 -0
- package/licenses/NotoEmoji-OFL.txt +93 -0
- package/licenses/RUST_DEPENDENCIES.txt +34 -40
- package/licenses/Unifont-OFL.txt +90 -0
- package/licenses/font-sources.json +106 -0
- package/package.json +1 -1
- package/src/api.ts +32 -7
- package/src/browser.ts +2 -1
- package/src/node.ts +7 -2
- package/src/types.ts +17 -1
- package/src/worker-host.ts +148 -29
- package/src/worker-protocol.ts +5 -5
- package/src/worker-runtime.ts +20 -6
- package/vendor/README.md +38 -5
- package/vendor/blitz-dom/Cargo.toml +6 -6
- package/vendor/blitz-dom/src/accessibility.rs +175 -2
- package/vendor/blitz-dom/src/config.rs +8 -10
- package/vendor/blitz-dom/src/document.rs +66 -3
- package/vendor/blitz-dom/src/events/keyboard.rs +2 -6
- package/vendor/blitz-dom/src/layout/construct.rs +5 -300
- package/vendor/blitz-dom/src/layout/inline/build.rs +309 -0
- package/vendor/blitz-dom/src/layout/{inline.rs → inline/layout.rs} +1 -1
- package/vendor/blitz-dom/src/layout/inline/mod.rs +4 -0
- package/vendor/blitz-dom/src/layout/mod.rs +3 -1
- package/vendor/blitz-dom/src/layout/replaced.rs +13 -4
- package/vendor/blitz-dom/src/mutator.rs +47 -0
- package/vendor/blitz-dom/src/node/element.rs +17 -0
- package/vendor/blitz-dom/src/node/mod.rs +1 -0
- package/vendor/blitz-dom/src/node/node.rs +46 -5
- package/vendor/blitz-dom/src/node/text.rs +11 -11
- package/vendor/blitz-dom/src/resolve.rs +2 -2
- package/vendor/blitz-dom/src/stylo.rs +30 -22
- package/vendor/blitz-dom/src/util.rs +1 -1
- package/vendor/blitz-paint/Cargo.toml +4 -4
- package/vendor/fontique/Cargo.toml +194 -0
- package/vendor/fontique/LICENSE-APACHE +201 -0
- package/vendor/fontique/LICENSE-MIT +25 -0
- package/vendor/fontique/README.md +54 -0
- package/vendor/fontique/examples/generic_families.rs +37 -0
- package/vendor/fontique/src/attributes.rs +42 -0
- package/vendor/fontique/src/backend/android.rs +218 -0
- package/vendor/fontique/src/backend/coretext.rs +206 -0
- package/vendor/fontique/src/backend/dwrite.rs +395 -0
- package/vendor/fontique/src/backend/fontconfig.rs +844 -0
- package/vendor/fontique/src/backend/mod.rs +75 -0
- package/vendor/fontique/src/charmap.rs +127 -0
- package/vendor/fontique/src/collection/mod.rs +1016 -0
- package/vendor/fontique/src/collection/query.rs +392 -0
- package/vendor/fontique/src/fallback.rs +293 -0
- package/vendor/fontique/src/family.rs +111 -0
- package/vendor/fontique/src/family_name.rs +153 -0
- package/vendor/fontique/src/font.rs +562 -0
- package/vendor/fontique/src/generic.rs +36 -0
- package/vendor/fontique/src/impl_fontconfig.rs +159 -0
- package/vendor/fontique/src/lib.rs +87 -0
- package/vendor/fontique/src/matching.rs +483 -0
- package/vendor/fontique/src/scan.rs +312 -0
- package/vendor/fontique/src/script.rs +271 -0
- package/vendor/fontique/src/source.rs +108 -0
- package/vendor/fontique/src/source_cache.rs +254 -0
- 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
|
|
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.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
390
|
-
backs `monospace`.
|
|
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.
|
|
393
|
-
|
|
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
|
|
556
|
-
|
|
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
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -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 `
|
|
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,
|
|
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 {
|
|
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
|
-
/**
|
|
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
|
-
|
|
38
|
-
|
|
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,
|
|
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
|
|
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
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -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,
|
|
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" });
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,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
|
|
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
|
package/dist/node.d.ts.map
CHANGED
|
@@ -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,
|
|
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 {
|
|
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;
|
|
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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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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"}
|
package/dist/worker-host.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
/**
|
|
15
|
-
export declare function
|
|
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;
|
|
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"}
|
package/dist/worker-host.js
CHANGED
|
@@ -1,31 +1,152 @@
|
|
|
1
1
|
import { createAssetLoader } from "./assets.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
package/dist/worker-host.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"worker-host.js","sourceRoot":"","sources":["../src/worker-host.ts"],"names":[],"mappings":"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"}
|