tapirscan 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/LICENSE +220 -0
  2. package/README.md +384 -230
  3. package/dist/browser-worker.d.ts +33 -0
  4. package/dist/browser-worker.js +83 -0
  5. package/dist/browser.d.ts +44 -0
  6. package/dist/browser.js +211 -0
  7. package/dist/freeze.d.ts +6 -0
  8. package/dist/freeze.js +7 -0
  9. package/dist/index.d.ts +30 -18
  10. package/dist/index.js +138 -87
  11. package/dist/layout.d.ts +19 -0
  12. package/dist/layout.js +27 -0
  13. package/dist/multiformat/format-registry.d.ts +2 -2
  14. package/dist/multiformat/format-registry.js +12 -11
  15. package/dist/multiformat/formats.d.ts +2 -0
  16. package/dist/multiformat/formats.js +13 -6
  17. package/dist/rust-session.d.ts +2 -2
  18. package/dist/rust-session.js +16 -6
  19. package/examples/camera.html +28 -29
  20. package/examples/vite/README.md +31 -0
  21. package/examples/vite/index.html +14 -0
  22. package/examples/vite/main.js +33 -0
  23. package/examples/vite/package.json +16 -0
  24. package/examples/vite/vite.config.js +6 -0
  25. package/package.json +27 -8
  26. package/wasm/build.json +295 -0
  27. package/wasm/experimental-turbo16.wasm +0 -0
  28. package/wasm/experimental-turbo2.wasm +0 -0
  29. package/wasm/experimental-turbo4.wasm +0 -0
  30. package/wasm/experimental-turbo8.wasm +0 -0
  31. package/wasm/high.wasm +0 -0
  32. package/wasm/low.wasm +0 -0
  33. package/wasm/medium.wasm +0 -0
  34. package/wasm/very-high.wasm +0 -0
  35. package/examples/scan-worker.mjs +0 -20
  36. package/examples/worker-client.mjs +0 -63
  37. package/wasm/high-release-1.2.2-public-low-r2.wasm +0 -0
  38. package/wasm/low-release-1.2.2-public-low-r2.wasm +0 -0
  39. package/wasm/medium-release-1.2.2-public-low-r2.wasm +0 -0
  40. package/wasm/very-high-release-1.2.2-public-low-r2.wasm +0 -0
@@ -0,0 +1,31 @@
1
+ # Vite example
2
+
3
+ Copy this directory into your application workspace, then run:
4
+
5
+ ```sh
6
+ npm install
7
+ npm run dev
8
+ ```
9
+
10
+ Choose a barcode photo. `tapirscan/browser` decodes the file and scans it in a
11
+ worker; Vite bundles the worker and WASM files without plugins or copy steps.
12
+ The only configuration is `optimizeDeps.exclude` in `vite.config.js`, which the
13
+ development server needs to serve those files from the package. Retail formats
14
+ are enabled by default.
15
+
16
+ To test a locally built package, install its npm tarball instead of
17
+ the registry dependency before running the example:
18
+
19
+ ```sh
20
+ npm install /absolute/path/to/tapirscan-X.Y.Z.tgz
21
+ ```
22
+
23
+ Test production hosting, including a subpath:
24
+
25
+ ```sh
26
+ npm run build -- --base=/scanner/
27
+ npm run preview -- --base=/scanner/
28
+ ```
29
+
30
+ Open `/scanner/` on the preview server. For Svelte and SvelteKit, see the
31
+ [package README](../../README.md#browser-apps-react-and-svelte).
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Tapirscan with Vite</title>
7
+ </head>
8
+ <body>
9
+ <h1>Scan a barcode photo</h1>
10
+ <input type="file" accept="image/*" aria-label="Barcode photo" disabled />
11
+ <pre role="status">Loading scanner…</pre>
12
+ <script type="module" src="/main.js"></script>
13
+ </body>
14
+ </html>
@@ -0,0 +1,33 @@
1
+ import { Scanner } from "tapirscan/browser";
2
+
3
+ const input = document.querySelector("input");
4
+ const status = document.querySelector('[role="status"]');
5
+ // Scanning runs in a worker, so the page stays responsive.
6
+ const scanner = new Scanner();
7
+
8
+ scanner.ready.then(
9
+ () => {
10
+ input.disabled = false;
11
+ status.textContent = "Choose a photo.";
12
+ },
13
+ (error) => {
14
+ status.textContent = error.message;
15
+ },
16
+ );
17
+ // Only the latest selection may update the page; scans can finish out of order.
18
+ let latest = 0;
19
+ input.onchange = async () => {
20
+ const file = input.files[0];
21
+ if (!file) return;
22
+ const request = ++latest;
23
+ status.textContent = "Scanning…";
24
+ try {
25
+ const { barcodes } = await scanner.scan(file);
26
+ if (request !== latest) return;
27
+ status.textContent = barcodes.length
28
+ ? barcodes.map((barcode) => `${barcode.format} ${barcode.text}`).join("\n")
29
+ : "No barcode found.";
30
+ } catch (error) {
31
+ if (request === latest) status.textContent = error.message;
32
+ }
33
+ };
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "tapirscan-vite-example",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "vite",
7
+ "build": "vite build",
8
+ "preview": "vite preview"
9
+ },
10
+ "dependencies": {
11
+ "tapirscan": "^1.3.0"
12
+ },
13
+ "devDependencies": {
14
+ "vite": "^6.3.5"
15
+ }
16
+ }
@@ -0,0 +1,6 @@
1
+ import { defineConfig } from "vite";
2
+
3
+ export default defineConfig({
4
+ // The dev server must serve Tapirscan's worker and WASM files from the package.
5
+ optimizeDeps: { exclude: ["tapirscan"] },
6
+ });
package/package.json CHANGED
@@ -1,29 +1,48 @@
1
1
  {
2
2
  "name": "tapirscan",
3
- "version": "1.2.2",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "description": "Orientation-aware barcode scanning with a Rust/WASM core and four effort modes",
6
6
  "exports": {
7
7
  ".": {
8
8
  "types": "./dist/index.d.ts",
9
9
  "import": "./dist/index.js"
10
- }
10
+ },
11
+ "./browser": {
12
+ "types": "./dist/browser.d.ts",
13
+ "import": "./dist/browser.js"
14
+ },
15
+ "./wasm/low.wasm": "./wasm/low.wasm",
16
+ "./wasm/medium.wasm": "./wasm/medium.wasm",
17
+ "./wasm/high.wasm": "./wasm/high.wasm",
18
+ "./wasm/very-high.wasm": "./wasm/very-high.wasm",
19
+ "./wasm/experimental-turbo2.wasm": "./wasm/experimental-turbo2.wasm",
20
+ "./wasm/experimental-turbo4.wasm": "./wasm/experimental-turbo4.wasm",
21
+ "./wasm/experimental-turbo8.wasm": "./wasm/experimental-turbo8.wasm",
22
+ "./wasm/experimental-turbo16.wasm": "./wasm/experimental-turbo16.wasm"
11
23
  },
12
24
  "files": [
13
25
  "dist",
14
26
  "examples",
15
27
  "THIRD_PARTY_NOTICES.md",
16
- "wasm/low-release-1.2.2-public-low-r2.wasm",
17
- "wasm/medium-release-1.2.2-public-low-r2.wasm",
18
- "wasm/high-release-1.2.2-public-low-r2.wasm",
19
- "wasm/very-high-release-1.2.2-public-low-r2.wasm"
28
+ "wasm/low.wasm",
29
+ "wasm/medium.wasm",
30
+ "wasm/high.wasm",
31
+ "wasm/very-high.wasm",
32
+ "wasm/experimental-turbo2.wasm",
33
+ "wasm/experimental-turbo4.wasm",
34
+ "wasm/experimental-turbo8.wasm",
35
+ "wasm/experimental-turbo16.wasm",
36
+ "wasm/build.json"
20
37
  ],
21
38
  "scripts": {
22
39
  "build": "node scripts/clean-dist.mjs && tsc -p tsconfig.json",
23
- "test": "node --test test/scanner.mjs test/shared-retail.mjs && tsc --noEmit --strict --skipLibCheck --target ES2022 --module NodeNext test/api-types.ts",
40
+ "test": "node --test test/camera-example.mjs test/scanner.mjs test/shared-retail.mjs test/loading.mjs test/turbo.mjs test/packaging.mjs && tsc --noEmit --strict --skipLibCheck --target ES2022 --module NodeNext test/api-types.ts",
41
+ "test:browser": "node --test --test-timeout=120000 test/browser.mjs",
24
42
  "prepack": "npm run build && node scripts/verify-package.mjs"
25
43
  },
26
44
  "devDependencies": {
45
+ "playwright-core": "1.63.0",
27
46
  "typescript": "5.8.3"
28
47
  },
29
48
  "keywords": [
@@ -37,7 +56,7 @@
37
56
  "engines": {
38
57
  "node": ">=20"
39
58
  },
40
- "license": "MIT",
59
+ "license": "MIT OR Apache-2.0",
41
60
  "author": "Florian Nick",
42
61
  "repository": {
43
62
  "type": "git",
@@ -0,0 +1,295 @@
1
+ {
2
+ "schema": 2,
3
+ "rustToolchain": "1.91.1",
4
+ "sourceDigest": "874a9b1e4c11042bdf086145dcb98469d7f6bbf4e6166ffc605b913145fa6304",
5
+ "sourceFiles": {
6
+ "bindings/rust/Cargo.lock": "382d94a1feeb3f1b3d9367aa5b302571e19924a0e239e3581651a891135e4594",
7
+ "bindings/rust/Cargo.toml": "7b50b04d67c1b0104971abf102f902a8c1efbec9f73617280fc9a0a1a05aa454",
8
+ "bindings/rust/api/format.rs": "03e81b2ed51508a9ad7fdf95cc6104a91778eb5541db34c807f736ef743c2dc4",
9
+ "bindings/rust/api/lib.rs": "29a7197c65f3c387822efe990ac8e297f8c069d2718177365b66cbccd7a2549d",
10
+ "bindings/rust/api/pixels.rs": "8c7938acec68c80355b752294f89bb1eeb85d8f2493d1fe16bb8b545b96ccac9",
11
+ "bindings/rust/api/timer.rs": "b27954265e72d1749468e3cbf66b71ca88fdf5b409da23767ac254e4317d9127",
12
+ "bindings/rust/api/types.rs": "b12992dd742b97ea936964e084db795099322b17073fb0c3cf24c67cf7919bb9",
13
+ "bindings/rust/examples/scan_raw.rs": "7c11807f396e3a6108bae7435d733b5ae9ef8b0616ed553ec4127876d55f8341",
14
+ "bindings/rust/src/detail.rs": "a9e64993442b4f224ea24eaae3c091398ef00d2972fb3007f77aa1ba060074ab",
15
+ "bindings/rust/src/effort.rs": "61f2511470037a7f55cb6ff3068b4f580ed643832ccc7e560c9efd23488acd85",
16
+ "bindings/rust/src/fast_linear.rs": "fc36d3b9fd457dcae4abce395691f4ad670770403621774e3a8ae66926c56fd5",
17
+ "bindings/rust/src/fast_linear/recovery.rs": "6d060c04cfe42e94d5e80b6f6a11fd93f3109a7b4b433b55ce94db4f4c4d4672",
18
+ "bindings/rust/src/fast_linear/recovery/band_probe_tests.rs": "5504487d173c7d320fb0015078efb78e0e75b1105c516764e96849b82494d2b9",
19
+ "bindings/rust/src/fast_linear/recovery/bridge_tests.rs": "d18f4b969cc5b47fac72f6d4593354d52a7512f796abfaf6bfe49c1bca59ec87",
20
+ "bindings/rust/src/fast_linear/restored_quiet_tests.rs": "1562440e21540f8361eaa20d86e0bcca56e52edba775eb4c772807e170ec6906",
21
+ "bindings/rust/src/fast_linear/source_ean8_tests.rs": "0fdd767c477c66745112ae6723b1f5607604fea66301502299c24f90611f831e",
22
+ "bindings/rust/src/fast_linear/tests.rs": "b9008a57d382102df68634341090bb6560534ef7bf5c6190594b6843c97d92cd",
23
+ "bindings/rust/src/fast_sparse.rs": "8a238da81735f5420cad499f794327ec887a773b94dc472959eb58ba98a31311",
24
+ "bindings/rust/src/format_registry.rs": "e956596a5094917d650b26ab989a913872f44722be3f0998b79047ba401b0a25",
25
+ "bindings/rust/src/formats.rs": "162127303c0b9b44645b87d90fb108ebceed192edf2aa579104d962428880c0a",
26
+ "bindings/rust/src/formats/grayscale_reuse_tests.rs": "786de798c256549b5c87eb007539ffb97b02fb62258f3d77dd5665742e151d6e",
27
+ "bindings/rust/src/formats/result_tests.rs": "66470971c73732a8a85cc749c0f90600ef47f748473cd9de6e695b2dd421c210",
28
+ "bindings/rust/src/geometry.rs": "cec2076a2a9a6025d4e7d8af59e90212b8311cd1e02066c9c9d94b1617453d74",
29
+ "bindings/rust/src/lib.rs": "b37246eeeb6983f3040ed69a071d36ebd11c8f57d1d9b428e89931107a3f1155",
30
+ "bindings/rust/src/linear_duplicates.rs": "adfccdb23ca198ddb82b8b4a08ce43206fb0d0091e6a473848d773d7336676e2",
31
+ "bindings/rust/src/linear_duplicates/area.rs": "a1a6524ea3769a94748a6316c8cea6192d669253d6e0b846f74962235aa5f1f4",
32
+ "bindings/rust/src/linear_duplicates/footprint.rs": "c415c3da026aa96067e3732b5b56cf9a8248ce503c1f44095a68c6de423b7675",
33
+ "bindings/rust/src/linear_duplicates/footprint/display.rs": "3d15484e572a2f1365b867781ee41eaa17eef3029f52350d1ff13ceaf861b171",
34
+ "bindings/rust/src/linear_duplicates/tests.rs": "357c35584385ef8c0a5c057a08fe4f8915ed882a20d683b207b7e92e61c34eca",
35
+ "bindings/rust/src/matrix_frontend.rs": "281f8e962ebe5c544d0710523d913e3bb663c068971f1a7b63edac43af08e115",
36
+ "bindings/rust/src/matrix_grid.rs": "28c3466d620301a9f74c3731c9d655f0460ffef1d3b552ff3f4a0dca5cc3c770",
37
+ "bindings/rust/src/pipeline.rs": "9cd944802e45c298cfe6017362c73cc3620fa5aae83ce790fb490ae0f1f0d102",
38
+ "bindings/rust/src/pipeline/deblur.rs": "bcbf1d198263d3f0d61635536cf6fe74e79f2584614a8c5e61480b5a1fef5976",
39
+ "bindings/rust/src/pipeline/independent_source_rows_tests.rs": "2fe562a90057c917ed8e57a45ca7befd55afd2832e1e4368c8d10999abbf5ed4",
40
+ "bindings/rust/src/pipeline/recovered_source_tests.rs": "8773f5180276dd34ed37d79d86a05c9640ab19dab3b4b328fbc0f5d3b2e2f33d",
41
+ "bindings/rust/src/pipeline/recovery_tests.rs": "788e8e1993575f4e0490e7b2017b97836067c5f380e1a64e009e0da58ff46c1d",
42
+ "bindings/rust/src/pipeline/restoration.rs": "29a316d8cc723948bfe29e3a419a2bd72cf368f3af49952703d917f57cf6600b",
43
+ "bindings/rust/src/pipeline/segment_voting.rs": "697e4ff057f73f132fe7bf5d745a623bd9a9ea1acfc809b582396d0404f92e45",
44
+ "bindings/rust/src/pipeline/source_evidence.rs": "5071aa47313af18b70da7854c43100df6d467a09fb95d325c6f7b439aafdb6b6",
45
+ "bindings/rust/src/pipeline/tests.rs": "b82e1e7af0c74d152869959ec67eb61b90b9680a8307d9bbd026c895f38a9684",
46
+ "bindings/rust/src/read.rs": "2a358a65ff7dc4d5165db3e5b9a835b06297ec2d89c20869f9888c60580311d0",
47
+ "bindings/rust/src/recovery_conflicts.rs": "d2c9ea06b06202fdec45372dfa8286a40f3e8f591c533f9248aa6c12e4e70a8d",
48
+ "bindings/rust/src/result.rs": "f86acfb6fc879ae2cad9888650f032c625f02e1c8a9b90c86d113a5809fa54a2",
49
+ "bindings/rust/src/short_crop.rs": "d2420735119f8f66c514db72599b295099a325337890392b2aec68847d850cd5",
50
+ "bindings/rust/src/signal_recovery.rs": "0a12c219707231dca9ff02d35a2484985cd21b857c10a9ddda240fa404d65db4",
51
+ "bindings/rust/src/timer.rs": "3c1fff0a0c7e4e5595b22721e857632213ecefd240e50332f6e6a9cec6f973ac",
52
+ "bindings/rust/tests/api.rs": "becbeabad623e635a1bbc734f61bae869f86aab259b2187641e6a49a3150cca7",
53
+ "bindings/rust/tests/parity.rs": "bfff70f75f0da7debcf5243b9ac6e6107fab7045956ecc368a491e37580a6027",
54
+ "bindings/wasm/Cargo.toml.in": "5e9b7bdc521717bacb2600c0afc428f359710298914004e0cf961ee0e4b32c18",
55
+ "bindings/wasm/src/lib.rs": "0a654939f1866207a4e04f6e7c5f331113ba54c40baa77ac655b2323641d5b57",
56
+ "config/formats.json": "28331396b0ca925ad5e95d42a51dcaebec173a31cefa17e8514788f741897ee1",
57
+ "config/modes.json": "3c8d83d7cb2db9ce380778b12cc3c04fa297b0fdc1d2ea2d24e29598bc907791",
58
+ "core/Cargo.lock": "15ffd408087f5f1c4a680140b741615968b6a12d51c3e99091b2b0f5ccf1c532",
59
+ "core/Cargo.toml": "ee31ed20e58ad75d8fc83e022918155d4db5b18a63c21c1f26653b1655163d37",
60
+ "core/src/association.rs": "1bb52ff994ece9460832332a6a7295bf4ad96faf838b2104f4d48d153ea9ce3a",
61
+ "core/src/aztec_frontend/center_index.rs": "da62ef62b5b139f0e8f780c069636198c1316a142b9789169f85c8d76ae168ee",
62
+ "core/src/aztec_frontend/curves.rs": "b8d89c932dc801aa3b00dbb266cc18ee6b2c8ca2a4bd699981c4d1a54c5a3e13",
63
+ "core/src/aztec_frontend/decoder.rs": "41d26f15a3657a5585b8092314d9d3670050cab4581156baff2ce7b9255e83d8",
64
+ "core/src/aztec_frontend/geometry.rs": "66419f20aa04b3ea47f19e8d6ad5c70070b26e329a1150a59cea90209b57ec29",
65
+ "core/src/aztec_frontend/mod.rs": "a9bac0888cbd8cb676d2dc92934764f69931bc6f68d09c3d4c3cb6ee6be365b8",
66
+ "core/src/aztec_frontend/refinement.rs": "8d23b557cb20b9c95c60b320ebe2f1f18431025ebae06944d36d0bcd7f42a56e",
67
+ "core/src/bands.rs": "627fd73277267cd6693a54f37c269929dd7017eeabd8c1e59537de654ff1dcd5",
68
+ "core/src/candidate_scanner.rs": "e7f1f2b01c459d7e7180abfd802d355d7fb34a6672bd0ed8e628ae1bb3c7bab7",
69
+ "core/src/candidate_scanner/association.rs": "96df1fede4fae65ec6bb91df9c6f51f82f4792a6938da379bc41ecba6f8f231a",
70
+ "core/src/candidate_scanner/dark_gap_replay_tests.rs": "333db4d195c5f68953da83a9e25c935118e1581d48f52bf93dfb92c16b52abde",
71
+ "core/src/candidate_scanner/decoding.rs": "2eb9acdaf9619011715f6b2596f101a083c4f2dc88e2daaae0eac82eced575af",
72
+ "core/src/candidate_scanner/diagnostic_validation_tests.rs": "7b0f5e17a3df4b65463215b433a7a9b0ea0f7125b68b5be3294667276534f4c2",
73
+ "core/src/candidate_scanner/evidence_span_tests.rs": "7e7d105b5125c8d97119ff5398534210ccd4975e3a106d7e79c6590eaf65da05",
74
+ "core/src/candidate_scanner/folded_boundary_confirmation_tests.rs": "83449d5b70537ae519c4bd6f2d5d77d9aae6b90bfdec16e1be0a789d19eb6e18",
75
+ "core/src/candidate_scanner/forward_blur_region_tests.rs": "cff79de4e87cbf4d1e2c6406a1c5ec96c2a8c99ede6d1c1de753d346fa285d39",
76
+ "core/src/candidate_scanner/interior_bounds_tests.rs": "ce12ec170eb668ae16e11104b90833fc14cdcd991e4dd3c2ee7e00f4015fde3e",
77
+ "core/src/candidate_scanner/low_contrast_signal_tests.rs": "bf0ac275a1589f1a2f369cc8b167cdaf3baaae11d65484f460875fc7774f61c5",
78
+ "core/src/candidate_scanner/lowres_threshold_tests.rs": "8e664c61fc055fd7e90cea9ebc79bd2098fe220f8f0cb13ed47359a09a223130",
79
+ "core/src/candidate_scanner/nearest_lowres_tests.rs": "4ef2870a49691ac86a4cd1178dae828878e74166ddb06c031bdb5f6afc2a2e46",
80
+ "core/src/candidate_scanner/redundant_collection_test.rs": "6d50eaa91dae6a8f549a68834b053d6c812013a6658eda3edc1cd32eeb6999ee",
81
+ "core/src/candidate_scanner/sampling.rs": "10fd4ff7601d1902341a87a158478f0a73860a6bb39017829f84e31d42ab1d94",
82
+ "core/src/candidate_scanner/segment_diagnostic_tests.rs": "dcd62a2995a8bc0c1c7a9ec9bebd58301680bd9261347e9443713c8df389c63e",
83
+ "core/src/candidate_scanner/tests.rs": "eadfc2690fa3bfa80aea74f6c29203d4cb1270dbfadf915a3bcd8eb8b1a40e63",
84
+ "core/src/continuity.rs": "e6692c36cd1d00abbfa8da99e704eb2791403428a812a42d682a672f03a2347b",
85
+ "core/src/contrast.rs": "664b3302a249de18b6270a92b69ad2438517093411167223e215271ee26ab471",
86
+ "core/src/coverage_arithmetic_tests.rs": "3883dc3a3005b1fdce7a0d8855644d69956af2b8b06e03012d3673db88f33170",
87
+ "core/src/ean.rs": "fc121304194ae2856d14fab8248318b49b54e47a1d370e334032c32087472db0",
88
+ "core/src/ean_blur.rs": "0bf19c8431db4a061bc32dd42d7a71477759b340c3467165c57add90fbac4d62",
89
+ "core/src/extrema_runs.rs": "3393c5f0ae0a8ca4123e46b919ada3b66e7b8a63b2a3d83d42b283014be2334c",
90
+ "core/src/fast_profile.rs": "88211abc16afb4e280bf64e5bcb1563d16ba1e9c71e0e8f62e0312de79f0ca6a",
91
+ "core/src/frame.rs": "9ab7b49497384bf9a134de637713e8de7d83a11dc33e8965b0cba34b4af295a8",
92
+ "core/src/frame/conflict.rs": "661f03b43661655406e2e3b723e84bf9ddd033368fba4e550633d188e8675cac",
93
+ "core/src/frame/crossing_identity_tests.rs": "3503de5cccaf8ee475cfd9ebaea3395db1c617ad1eb829d98de6eddfa848449d",
94
+ "core/src/frame/crossing_physical_evidence_tests.rs": "68045ff73a54d6392ebd0e7b9737b65bf6de53abbc98785c7dda4f825d3153c3",
95
+ "core/src/frame/identity.rs": "0d27e246c2c4a9761f3b8cbb7cb3b5106397ed7b04d2b32963a9be74a95946f4",
96
+ "core/src/frame/optional_identity_tests.rs": "c9fef1b29948baaf7d762fa4d7d2d9ad12ad6b92f26542229d729434ac9bc66e",
97
+ "core/src/frame/paired_pixel_tests.rs": "fc9f5e8dd4c1dc09055d13c8afe7f4caefdbe983e4656ffe121d6779aaaa8ac6",
98
+ "core/src/frame/source_conflict_probe_tests.rs": "0a3b0945544807d019fb6d726cc78f6b7e89467e02123a858ed06fac6d97cc51",
99
+ "core/src/frame/tests.rs": "02699ba4e5085e8bdf75cf2198eb19f7df54d470ebe9fbfc5afabb7e2858b371",
100
+ "core/src/geometry.rs": "3ecd3ad79ef8eba5efdf091da1625dbee3a9d5bbacfe7963793d6ad827afee41",
101
+ "core/src/identity.rs": "4224e8721451c1851bb87a580ae6310e4d338818ff25fe835ddbf3fdb638ae7a",
102
+ "core/src/invalid_visual.rs": "fcd5c2e871888f60aca92c67bd824e42468cf9748169734d2383d07d3079e567",
103
+ "core/src/lib.rs": "8e46249a843826a2f43645136215267ad4e11602828c91e76a505203499d0fc5",
104
+ "core/src/local_signal.rs": "ba42f0cddc32a2db280c8db72f9dc8bdaf8f9ac528c55eac7a1f2542cb1ca2e8",
105
+ "core/src/lowres.rs": "9db7b8ffc6e5fef3d477c3ab14dbe105683300d7d31112b4bc2217fdeeec0fed",
106
+ "core/src/lowres/photo.rs": "5d43a1b32469f4352bf7d3f589c571e7b0ae2e2b76721f535c41518edba08366",
107
+ "core/src/multi_profile.rs": "d4019ec58a145618375c2568ccce2532b0dc4613ed6bd6e83c7e713b713ee018",
108
+ "core/src/multi_profile/asymmetric_quiet_tests.rs": "2bbba6c5c34a1949a9c1c58614ac2f04916f14ac20161eea99318cf8db4666f2",
109
+ "core/src/multi_profile/folded_boundary_tests.rs": "91ef3faee05bc425acdbd3ceba9dbdfb7bff064a228d444124d6b9d0cdeab83f",
110
+ "core/src/multi_profile/redundant_exact_tests.rs": "0bfccef607b8dcbf0be64995ffcfd07df142d9585e474b78da463a3794c1655c",
111
+ "core/src/multi_profile/tests.rs": "bd949ed0d57218f53818235988ac57dcdf5436b7927397eda63757ff70ce8adb",
112
+ "core/src/multi_profile/weak_tests.rs": "0c9e36df651dae3705f13f0ae0643951c1a23eb0c989374ef0db6db39f786b88",
113
+ "core/src/multi_scan.rs": "bdb7359f54cc9018a0b43b05dc21e2ce83a1d1c6e857ff0692dc07f600fce960",
114
+ "core/src/multi_scan/execution.rs": "f6c0f9e9008515b08750a51dfd75f8bea078152ab046a83bcafb680910afb1c2",
115
+ "core/src/multi_scan/plan.rs": "68fb8ded85035b7543ca1d2ab407a823831849279a64b293e5c6d88522f47335",
116
+ "core/src/numeric.rs": "683a108ec8483661cfdef39b570f280ec373d29e384ccd40229e62b658b7346c",
117
+ "core/src/oriented.rs": "a197622f5833d91324c827bd5dcd084f35ea34ea39ae446c7cda2a7ac10bd152",
118
+ "core/src/profile.rs": "0f9b1268ddee001d4960e79a4155063bef867e65fa13867a389adc5f639027e9",
119
+ "core/src/qr_frontend/binarization.rs": "a707d890bf37d6a8afc35a92c7947e29ce0bdb47128cc5046fe13d83104b292b",
120
+ "core/src/qr_frontend/component_geometry.rs": "3c999da2e3e67cb3f7e23304ffa7ff32e4764dce69c4bc6ba27ef13ca1b7e185",
121
+ "core/src/qr_frontend/dm_detect.rs": "a3b7ae82bc8d049ad6580db07f9cbc755507af119eb15616cd0489eba71a434c",
122
+ "core/src/qr_frontend/mod.rs": "229add071e60424bfcc633611f47ffb8f5e246f2430f8a9484810af893631a32",
123
+ "core/src/qr_frontend/qr_detect.rs": "b88ee9663f371b6488b152aefe2a4b43ae90ff38ea73329fafd31f6aaa5c04e8",
124
+ "core/src/qr_frontend/qr_detect/alignment_cached.rs": "ecf8c64aa10a30f74af465f0aafe36da8dee687684bdbeb1c39f54d22d37a6a0",
125
+ "core/src/qr_frontend/qr_detect/curved.rs": "4bcf97aba089dfa3f114d38fe635ccc3b1cd043328d7f0ec5cd68be6a7614909",
126
+ "core/src/qr_frontend/qr_detect/finder_index.rs": "4e0807d84a6c9a58c56d0910b6ed9830e1dbd27bc703eb4c4b89396dda48ca8a",
127
+ "core/src/qr_frontend/qr_detect/partial.rs": "4adeef4317f05bac32bae7845abea11316a61db0ce1ae1885a9568281d141382",
128
+ "core/src/qr_frontend/qr_detect/ring.rs": "72d8af532c8ca3dc6365aa731a6432293f1d22595cfc0bf3f28231c8375cabee",
129
+ "core/src/qr_frontend/qr_detect/single.rs": "c1db0c9d1338d8c79170ed89c27ac9cddf3d8ed93499d752c14670752c43903e",
130
+ "core/src/qr_frontend/qr_enhance.rs": "4c8c61f309c61aa45929be12eea9ba605e9a7989892aa4aa631feff942ba841f",
131
+ "core/src/qr_grid.rs": "e537d7563b54962599ce69a538dccc6f0ef5f6e8b13434a62a78b8ae9c0b0b62",
132
+ "core/src/region_json.rs": "a9d71637e3af7e69e5e7c58e38aba7bfe9bc456b26ad644edb4bf523337dcd98",
133
+ "core/src/region_scan.rs": "4397270adb57b463f653533fc946872da281e9384431efba1bb7805e8bbda249",
134
+ "core/src/retail_anchors.rs": "9fd0155ea56a8b5f419a26afd7e44031c079b1132374c9b1120384395b5a73fc",
135
+ "core/src/retail_peak_scratch.rs": "77f668cc39b41232d32f9c092c8249323da3a1ad48b8fb978459e19c35dd6d13",
136
+ "core/src/retail_peaks.rs": "2e24e066abb4e96b3ebcc088418b9dc51068f18df3e63475dce089ac0c13ab1a",
137
+ "core/src/retail_pipeline.rs": "98d21798d173812dcb9456241549570170fefafee6d05a1671430b40d642389a",
138
+ "core/src/retail_protection.rs": "5aee4e1153a713b619e55dd15c30b5cac80db355e88fdf9a423a51f85192f037",
139
+ "core/src/retail_roi.rs": "9f073d79a0899f846ca450c872383335b163cef3affed0ad3a0b8649cfec1c35",
140
+ "core/src/retail_short.rs": "9287a52900cd6876a5ac13a7a5116c3d9d1dff0143417d11b5b0a28de4598ab6",
141
+ "core/src/run_ean.rs": "0a4186cbe7ec297722d8efdc746ca7a29a0090b62d6a96ace4dfaf5a148f7ede",
142
+ "core/src/run_profile.rs": "5056f889336f57121ebb2936b3744093574f2532c3ff46a79522a0a363517e6c",
143
+ "core/src/sampling.rs": "2b05686ae0894668918e43a92d6b39bd183ea271117e220167f6f4ae3b0938d6",
144
+ "core/src/scan.rs": "2dafbd798135b30aa8d7b84b221b71148c00c069a5895dbaeb7f187e4db045bb",
145
+ "core/src/scanner_clock.rs": "22195a922b297d967ed7c20738fd2cd89bbb00f74fc88a17cdde85957d575976",
146
+ "core/src/shear.rs": "65c7d1ba7e1c58392cf0c32e67badf03af786c845b41921ccc67b6236a3b472e",
147
+ "core/src/source_rescue.rs": "1aa4c8788d967312ca0dbaf1755880f32c5db46f9fb3e908dee53035312ae72d",
148
+ "core/src/stripes.rs": "58a3fad86d12ea9cda07ca254b4d7b906deb918074565306d35c27f70875eb71",
149
+ "core/src/stripes/groups.rs": "ba4215e5d44b78aed4153903b0095d4d0733a8a04a33cd0a17f398d64cfdbc12",
150
+ "core/src/stripes/proposals.rs": "636a5f65814b90671175c7889180d6e3d67f53b38ef7153a23c54a5b3604c81c",
151
+ "core/src/stripes/quick.rs": "fb43b4baed4e8a6d13ed558b92a0ab888125d65159018f40695411f073f0d35f",
152
+ "core/src/stripes/raster.rs": "cf09ce3c1048fa05e5916617cfa657d2fc476910cf361e32408ef9bf647db1b1",
153
+ "core/src/stripes/refinement.rs": "b5033fcc4e86f4a19a15eeb8e777335a042686c9115461300ae71259d4f7507e",
154
+ "core/src/subpixel.rs": "b5b5679b25f678e3b4e73ca857e152dbdc21640c42a406cd7ca44d1ee3f3b25d",
155
+ "core/src/subpixel/model.rs": "7a5b696450b7fd60d3163f9c75eec24f3fc1c668fbe9273f8050a4eb0b93e5bc",
156
+ "core/src/subpixel/sequence.rs": "d55cb16e74f2d8016c0c9ca97ad481a8d3069af3407efecb1868bc8df776b8a4",
157
+ "core/src/transition.rs": "68f44c9dd45d9b2de411ac25757bb974eace9c2933ca949695e3b333b40d1f0a",
158
+ "core/src/verified_coverage.rs": "e0d5a059e1520aae5e6a30df6a78e61db5dd9f659dbeac4c75416fbeb002e788",
159
+ "multiformat/Cargo.lock": "df2ac9308658ddd8c8b2a464f281c99cf133e94406a04c0286cbe4011ae4889e",
160
+ "multiformat/Cargo.toml": "322c2664cf79929ec201ab7cca6101f74add778932d56d3f0149a18ec78ccb2d",
161
+ "multiformat/src/aztec.rs": "7be10cbc7cdf9e984985f5261fa2f5d34d1c7209f9a19e908a60f383653a31a6",
162
+ "multiformat/src/aztec_detect.rs": "0a3074bcbf509d4e89b9faa168909cbe9efbb47980e63203d03028f62748d8ac",
163
+ "multiformat/src/aztec_detect/center_index.rs": "816d3fbdf87c8abdb47ac989c96ce47183531d07a4b4bc53be9e488a71455af8",
164
+ "multiformat/src/bin/finders.rs": "77a5081a20324af6e8c019c4acc714f9d88790d5218c078f7883bb9a8be4cdbc",
165
+ "multiformat/src/bin/matrix.rs": "51f45074f194f75f3f105e4688e17f1e44bf5661b75c78e6917ddcbf35bf5e1a",
166
+ "multiformat/src/bin/oracle.rs": "4b3c7330d0b6c8aec1e843d72587ac1e7df4564b0d36b29e26a08ce2ac76872a",
167
+ "multiformat/src/bin/pdf_probe.rs": "37f65b766c21e5be8298b1f40f08ef48dcf53ea2e9187ec265f1ab5d1dad8f92",
168
+ "multiformat/src/bin/scan.rs": "66a2476d11e25e2c9de39dc89f98033637d1caf614d83079556b22cd79f260fe",
169
+ "multiformat/src/binarization.rs": "f76f699782f0281cb2b374c88bc65b75c74f29cd2681edf2744c927519a0195c",
170
+ "multiformat/src/component_geometry.rs": "1dc761a26c8ae7f02f99992ff0f03e8b7206ac8d445f917e7a92bb6c5a0f26ca",
171
+ "multiformat/src/databar.rs": "e3ad35e28983ba5be48c66f0f6e448f861968b7b80c86754c0b440d31aa64ebe",
172
+ "multiformat/src/datamatrix.rs": "82667d9e6f400e08fb73c2d11edbc326d14685341a4928f49cafb89f9be36294",
173
+ "multiformat/src/dm_detect.rs": "894b311d80d3a133f08eba5c3fc2fdfb39a6c16557551d021855c397a12fe9e3",
174
+ "multiformat/src/encoding.rs": "3ef802254b637c2b62df99171a540d6cb04ff2c8a0b233b1a18eb3b48ae2e192",
175
+ "multiformat/src/encoding_tables.rs": "17162b094e106b6f175d021e74de97daa64fc6b0fcef26f74195af58ffcdce5a",
176
+ "multiformat/src/expanded.rs": "75749adff31553818a1e8458e8da8ba809eadca4d39dd85e5a1cfeffbb4bf9fd",
177
+ "multiformat/src/lib.rs": "cbcd465150b30e295916efc680a317ddeca3ae524c64751bf5a57c9a28f335de",
178
+ "multiformat/src/linear.rs": "7eb68cfa1e6681f2e161259c9266b425237b0c821405206ecbd99a2f7477ffb8",
179
+ "multiformat/src/linear_geometry.rs": "fc22d47e5c8bbf9c72c5f23ee00ffb9cacd5f0504699c226622a8123c2d6660b",
180
+ "multiformat/src/maxicode.rs": "ea033b3e75db3b61b19ab9c3cf3f7019e7adbce99eb8d57979eb9d4f90825c15",
181
+ "multiformat/src/maxicode_detect.rs": "eecd4c109a58d84956570b35668b319de41e7e31a91425fde8453c22d4227d47",
182
+ "multiformat/src/maxicode_tables.rs": "41a539bce7e5731a343f5a582d323bd3dc320fdb17150b638a422fc58899ea0d",
183
+ "multiformat/src/numeric.rs": "eae0ecb1290b9f08aa6aef9e147d85ffa2a69b79aa9d31269b4a9e9c3a82eec8",
184
+ "multiformat/src/pdf417.rs": "a2df2217f5cc461fe2e47723d88085e77993ba6f2d03b6cc85517d0eda4deaa0",
185
+ "multiformat/src/pdf417_tables.rs": "692e75fc7563d5dae6c1691d3112b2928f900a0c97a091f6db2b969fd914d737",
186
+ "multiformat/src/pdf_localize.rs": "8b718bb445ae1b7740ee62604e496bffff7a80965b9b7f51872447fde11d5a3a",
187
+ "multiformat/src/qr.rs": "c4fb2b55936b7c6d42f550b3ee902c66628a0224a1c8f82329eb74aa7797cb9f",
188
+ "multiformat/src/qr_detect.rs": "7a23cdf55ae022ed99d3d556422a9479b1cfe173f0cc774ad27afe6159aae7a5",
189
+ "multiformat/src/qr_detect/curved.rs": "046820f490d19b7735e89ee5a3b3db7e1450c7e9462e9227665595b684e6c1b2",
190
+ "multiformat/src/qr_detect/finder_index.rs": "4e0807d84a6c9a58c56d0910b6ed9830e1dbd27bc703eb4c4b89396dda48ca8a",
191
+ "multiformat/src/qr_detect/partial.rs": "ebc5fa95b0f85aa4a6bcf14bf645971b5b66f143f1790b2069fdb68992f176ef",
192
+ "multiformat/src/qr_detect/ring.rs": "72d8af532c8ca3dc6365aa731a6432293f1d22595cfc0bf3f28231c8375cabee",
193
+ "multiformat/src/qr_detect/single.rs": "8505b41b38c06531a082ca5401678743672b3745ae76ba8a7960920ad2842f86",
194
+ "multiformat/src/qr_enhance.rs": "4c8c61f309c61aa45929be12eea9ba605e9a7989892aa4aa631feff942ba841f",
195
+ "multiformat/src/qr_tables.rs": "50cb91143498ac7b06aae9eb60ac85ce3144ab8a19f8c38d32805b8434c3407b",
196
+ "multiformat/src/rectify.rs": "619d8302452db8224e48b23ec80e344e96787edea6b96aa2b217e8ad18eee49a",
197
+ "multiformat/src/reed_binary.rs": "f45f5925b646b554f881294800fc31f8b59d3caa80ef89170c2df8f01dceafe7",
198
+ "multiformat/src/reed_prime.rs": "df5a08883e0e186c3458174e2c3c2b84f20985dafeb99118a5c179a4be3eda5a",
199
+ "multiformat/src/reed_solomon.rs": "a024d683b542308d475f1c6ef6b32977e987079b05444cb940cfab361fb1991f",
200
+ "multiformat/src/regions.rs": "e00a40a616b4ab813e4cacbe9f5f8c9c79a20ff45fd3833215a5061d5a6dfe22",
201
+ "multiformat/src/retail_gray.rs": "186c34273643914a2947b79220c6b63cf25cf8ac1446fa959a1346cb8dc65c9e",
202
+ "multiformat/src/retail_profile.rs": "af85e22f4828802bab84f33256cc07ecba841f2a9435406de20225274082051c",
203
+ "scripts/build.py": "e16fe0ffdbf68c590a1b03d22562aa40b075bedc82570b886d670d9ea0de7475",
204
+ "scripts/build_turbo.py": "cdf932e08ad2e401fd64d950eb522cb5d8692c5673cf631ffba4aeaf0285d4f8",
205
+ "scripts/build_wasm.py": "3b129ebd69ea05e05d4642bde43881b16ccc50ed36d0b55c3025be2afb49738e",
206
+ "scripts/prepare_rust.py": "0a102eec86e2ed58a4dd7b9e884526828936cba4b65aa55b4db138c8799db907",
207
+ "scripts/wasm_rustc.py": "2a775dbb3cdc5d886f510dfc2f60a8035932aace6503758ad17b196d5714f335",
208
+ "tools/package-source/Cargo.lock": "b869f3edae87ac8e4652d1ef1d01a70c8d6694c80c03cf82f8f52a21c12847cf",
209
+ "tools/package-source/Cargo.toml": "565ad3a7ce72b4cea33a0468de1192efff8e1b3c0b5a632d17d1c4faedfd3ed1",
210
+ "tools/package-source/src/main.rs": "e41bcb2e036a6b754bc84a483c72497ed2e22cee338d9f813bc63ab7120419d5"
211
+ },
212
+ "files": {
213
+ "experimental-turbo16.wasm": {
214
+ "mode": "low",
215
+ "preset": 16,
216
+ "environment": {
217
+ "TAPIRSCAN_EXPERIMENTAL_TURBO": "1",
218
+ "TAPIRSCAN_TURBO_TIER": "16",
219
+ "TAPIRSCAN_TURBO_LEGACY_OUTLINES": "1",
220
+ "TAPIRSCAN_TURBO_BAND_OUTLINES": "1",
221
+ "TAPIRSCAN_EXPERIMENT_TILE_CACHE": "1",
222
+ "TAPIRSCAN_TURBO_FINITE_EXTREMA": "1",
223
+ "TAPIRSCAN_TURBO_DIRECT_SAMPLE": "1"
224
+ },
225
+ "sha256": "5a3ee3af81ed164df64deb763dce042d82df1ab80aa5ea4a802e4608b618bf04",
226
+ "bytes": 1789882
227
+ },
228
+ "experimental-turbo2.wasm": {
229
+ "mode": "low",
230
+ "preset": 2,
231
+ "environment": {
232
+ "TAPIRSCAN_EXPERIMENTAL_TURBO": "1",
233
+ "TAPIRSCAN_TURBO_TIER": "2",
234
+ "TAPIRSCAN_TURBO_LEGACY_OUTLINES": "1",
235
+ "TAPIRSCAN_TURBO_BAND_OUTLINES": "1",
236
+ "TAPIRSCAN_EXPERIMENT_TILE_CACHE": "1",
237
+ "TAPIRSCAN_TURBO_FINITE_EXTREMA": "1",
238
+ "TAPIRSCAN_TURBO_SELECTIVE_OUTLINES": "1"
239
+ },
240
+ "sha256": "ac2f79fd382172b14ce3a60234f25ed36f929942d81b747ba1149ce5c1ed4198",
241
+ "bytes": 1801556
242
+ },
243
+ "experimental-turbo4.wasm": {
244
+ "mode": "low",
245
+ "preset": 4,
246
+ "environment": {
247
+ "TAPIRSCAN_EXPERIMENTAL_TURBO": "1",
248
+ "TAPIRSCAN_TURBO_TIER": "4",
249
+ "TAPIRSCAN_TURBO_LEGACY_OUTLINES": "1",
250
+ "TAPIRSCAN_TURBO_BAND_OUTLINES": "1",
251
+ "TAPIRSCAN_EXPERIMENT_TILE_CACHE": "1",
252
+ "TAPIRSCAN_TURBO_FINITE_EXTREMA": "1",
253
+ "TAPIRSCAN_TURBO_SELECTIVE_OUTLINES": "1"
254
+ },
255
+ "sha256": "18c939330be27b8f363fe9c60a3971cdbff5fb7210f52618187c133b3d93229d",
256
+ "bytes": 1796481
257
+ },
258
+ "experimental-turbo8.wasm": {
259
+ "mode": "low",
260
+ "preset": 8,
261
+ "environment": {
262
+ "TAPIRSCAN_EXPERIMENTAL_TURBO": "1",
263
+ "TAPIRSCAN_TURBO_TIER": "8",
264
+ "TAPIRSCAN_TURBO_LEGACY_OUTLINES": "1",
265
+ "TAPIRSCAN_TURBO_BAND_OUTLINES": "1",
266
+ "TAPIRSCAN_EXPERIMENT_TILE_CACHE": "1",
267
+ "TAPIRSCAN_TURBO_FINITE_EXTREMA": "1",
268
+ "TAPIRSCAN_TURBO_SELECTIVE_OUTLINES": "1",
269
+ "TAPIRSCAN_TURBO_PROFILE_CAP": "576"
270
+ },
271
+ "sha256": "d05a0a454bb8921261b60d413d1d6cac0e67a438d797438d33cc02def4705a6b",
272
+ "bytes": 1794556
273
+ },
274
+ "high.wasm": {
275
+ "mode": "high",
276
+ "sha256": "0eb910a865e2fd526fd235f94d58c7df7701a9c583f2a3f938e8d77a93349313",
277
+ "bytes": 2414659
278
+ },
279
+ "low.wasm": {
280
+ "mode": "low",
281
+ "sha256": "57d6bc21ddacd4d47feddc44aeaae1e58e269069eb5eaa746020e6eec49c64b2",
282
+ "bytes": 1841468
283
+ },
284
+ "medium.wasm": {
285
+ "mode": "medium",
286
+ "sha256": "537c49059c2289f7e07d25cb9bc3c290dee1a3510d2f2b9c031c4c46a582f0d3",
287
+ "bytes": 2450297
288
+ },
289
+ "very-high.wasm": {
290
+ "mode": "very-high",
291
+ "sha256": "8dc4622da970c340e6b7d815083c253ba10d7f56437721b086a38caaca922b39",
292
+ "bytes": 2501485
293
+ }
294
+ }
295
+ }
Binary file
Binary file
Binary file
Binary file
package/wasm/high.wasm ADDED
Binary file
package/wasm/low.wasm ADDED
Binary file
Binary file
Binary file
@@ -1,20 +0,0 @@
1
- // Serve this directory alongside ../dist and ../wasm, or adapt the import for your bundler.
2
- import { Scanner } from "../dist/index.js";
3
-
4
- let scanner;
5
- self.onmessage = async ({ data: { id, type, options, image } }) => {
6
- try {
7
- if (type === "init") {
8
- if (scanner) throw Error("Scanner already initialized");
9
- scanner = await Scanner.create(options);
10
- self.postMessage({ id });
11
- } else if (type === "scan") {
12
- if (!scanner) throw Error("Scanner not initialized");
13
- self.postMessage({ id, result: scanner.scan(image, options) });
14
- } else {
15
- throw Error(`Unknown worker request: ${type}`);
16
- }
17
- } catch (error) {
18
- self.postMessage({ id, error: { message: error.message, code: error.code } });
19
- }
20
- };
@@ -1,63 +0,0 @@
1
- /** Initialize once. scan() transfers ownership of the supplied pixel buffer.
2
- * Await each scan before capturing the next frame; dispose() stops the worker.
3
- * Structured cloning yields independent mutable results on the receiving side.
4
- */
5
- export async function createScannerWorker(options = {}) {
6
- const worker = new Worker(new URL("./scan-worker.mjs", import.meta.url), { type: "module" });
7
- let pending;
8
- let nextId = 0;
9
- let closed = false;
10
- function dispose(reason = Error("Scanner worker disposed")) {
11
- if (closed) return;
12
- closed = true;
13
- worker.terminate();
14
- pending?.reject(reason);
15
- pending = undefined;
16
- }
17
- worker.onerror = (event) => dispose(Error(event.message || "Scanner worker failed"));
18
- worker.onmessageerror = () => dispose(Error("Could not deserialize scanner result"));
19
- worker.onmessage = ({ data }) => {
20
- if (!pending || pending.id !== data.id) return;
21
- const { resolve, reject } = pending;
22
- pending = undefined;
23
- if (data.error) reject(Object.assign(Error(data.error.message), { code: data.error.code }));
24
- else resolve(data.result);
25
- };
26
- function request(type, message, transfer = []) {
27
- if (closed) return Promise.reject(Error("Scanner worker disposed"));
28
- if (pending)
29
- return Promise.reject(Error("Await the previous scan before sending another frame"));
30
- return new Promise((resolve, reject) => {
31
- const id = nextId++;
32
- pending = { id, resolve, reject };
33
- try {
34
- worker.postMessage({ id, type, ...message }, transfer);
35
- } catch (error) {
36
- pending = undefined;
37
- reject(error);
38
- }
39
- });
40
- }
41
- try {
42
- await request("init", { options });
43
- } catch (error) {
44
- dispose(error);
45
- throw error;
46
- }
47
- return {
48
- scan(image, options = {}) {
49
- // Send explicit storage settings; ImageData's prototype is not required in the worker.
50
- const pixels = {
51
- data: image.data,
52
- width: image.width,
53
- height: image.height,
54
- channels: image.channels ?? 4,
55
- stride: image.stride,
56
- };
57
- return request("scan", { image: pixels, options }, [image.data.buffer]);
58
- },
59
- dispose() {
60
- dispose();
61
- },
62
- };
63
- }