pi-kiosk-shared 2.2.92 → 2.2.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,7 +9,7 @@ Shared types, API contracts, and error classes for the Pi Kiosk system.
9
9
 
10
10
  ## Temporary retention
11
11
 
12
- `up-backend` keeps production `react` / `react-dom` until cold/start paths consume a Node-safe published or overlaid main barrel. Do **not** drop those deps until that consume path is proven on the version actually installed (registry tarball from `npm view`, or monorepo overlay of sibling `../shared` **2.2.91**). Same caveat as `up-backend/docs/DEPLOYMENT/DEPLOY_SEPARATE_REPOS.md`.
12
+ `up-backend` keeps production `react` / `react-dom` until cold/start paths consume a Node-safe published or overlaid main barrel. Do **not** drop those deps until that consume path is proven on the version actually installed (registry tarball from `npm view`, or monorepo overlay of sibling `../shared` **2.2.96**). Same caveat as `up-backend/docs/DEPLOYMENT/DEPLOY_SEPARATE_REPOS.md`.
13
13
 
14
14
  ## Installation
15
15
 
@@ -74,7 +74,42 @@ Frontends import React modules from `/ui`. The **target** main barrel (local ove
74
74
 
75
75
  ## Local monorepo overlay
76
76
 
77
- **Honesty (SSOT):** Live monorepo source is `shared/package.json` **2.2.91** (published on npm with the camera constraint ladder). Consumers pin `"pi-kiosk-shared": "^2.2.91"` matching that. Sibling overlay still runs when `../shared` exists. Separate-repo pin should match `shared@2.2.91`. Confirm registry with `npm view pi-kiosk-shared version` at deploy time. **Historical (not current):** older passes cited `^2.2.86` / unpublished `2.2.90` as the live pin.
77
+ **Honesty (SSOT):** Live monorepo source is `shared/package.json` **2.2.96** (ZBar WASM primary). Frontend consumers in this repo pin **`file:../shared/pi-kiosk-shared-2.2.96.tgz`** in both `package.json` and lockfile roots (Strategy A — see [Consumer lock tarball bootstrap](#consumer-lock-tarball-bootstrap)). `up-backend` pins **`^2.2.96`** from npm registry. Sibling overlay via `ensureDist.mjs` still runs when `../shared` exists (preferred local dev). App-only / Railway clones cannot bare-`npm ci` with monorepo `file:` pins — see **Registry-only / Railway** below.
78
+
79
+ ### Consumer lock tarball bootstrap (Strategy A)
80
+
81
+ Monorepo frontend `package.json` pins:
82
+
83
+ ```json
84
+ "pi-kiosk-shared": "file:../shared/pi-kiosk-shared-2.2.96.tgz"
85
+ ```
86
+
87
+ The tarball is **gitignored** (`*.tgz` in repo root `.gitignore`) and is **not** in VCS. A fresh clone has no pack file until you build it:
88
+
89
+ ```bash
90
+ cd shared
91
+ npm run publish:local # build:clean + npm pack → shared/pi-kiosk-shared-<version>.tgz
92
+ ```
93
+
94
+ **Strict `npm ci` in a consumer** (when you need lockfile-only install without relying on overlay alone):
95
+
96
+ 1. Run `publish:local` in `shared` (step above).
97
+ 2. **Stop local dev servers** on Windows if they lock `node_modules` binaries (common `npm ci` failure).
98
+ 3. From a consumer (`admin-app`, `rpapp-customer`, `rpapp-pickup`, `rpapp-kiosk`):
99
+
100
+ ```powershell
101
+ # Optional when husky prepare fails during install-only / ci proof runs:
102
+ $env:HUSKY='0'
103
+ npm ci
104
+ ```
105
+
106
+ After repacking, refresh lock integrity if the tarball bytes changed: `npm install` in the consumer (updates `package-lock.json` `integrity` for the file tarball).
107
+
108
+ **CI without sibling `shared/` source:** pipeline must run `cd shared && npm run publish:local` before consumer `npm ci`, **or** use registry `^2.2.96` pins in `package.json`/lock for app-only clones (see Railway below).
109
+
110
+ **Local dev (preferred):** sibling `../shared` + `postinstall`/`prepare` overlay via `ensureDist.mjs` — tarball optional when the monorepo layout is complete and overlay runs on install.
111
+
112
+ **Registry-only / Railway app-only clones:** monorepo frontend `package.json` pins **`file:../shared/pi-kiosk-shared-2.2.96.tgz`**, so **bare `npm ci` fails** on an app-only checkout (no sibling tarball path). Registry install is remapped by **`prebuildShared.mjs` on `predev` / `prebuild` hooks only** — not during `postinstall`. App-only deploys must either: (a) run build via `npm run prebuild` / `npm run build` so `prebuildShared` rewrites the dependency to registry **`^2.2.96`**, or (b) commit app-only `package.json`/lock with registry pins. Confirm with `npm view pi-kiosk-shared version` at deploy time.
78
113
 
79
114
  **Documented cold path (monorepo):** `npm ci` / `npm install` in each app runs lifecycle hooks → `scripts/overlaySharedIfPresent.mjs` → `shared/scripts/ensureDist.mjs` when sibling `../shared` exists:
80
115
 
@@ -111,7 +146,7 @@ npm run gate:main-barrel-node-safe
111
146
 
112
147
  From `shared/`, prove the documented cold path:
113
148
 
114
- 1. **DIAGNOSTIC** — `npm pack` a known Node-safe registry tarball (`COLD_VERSION` in `prove-pi-kiosk-shared-cold-overlay.mjs`, currently `2.2.82` — intentional historical diagnostic fixture, not the live pin) in a temp dir and assert COLD_BAD markers (never installs into a consumer with `--ignore-scripts`). Live monorepo source is `shared/package.json` **2.2.91**.
149
+ 1. **DIAGNOSTIC** — `npm pack` a known Node-safe registry tarball (`COLD_VERSION` in `prove-pi-kiosk-shared-cold-overlay.mjs`, currently `2.2.82` — intentional historical diagnostic fixture, not the live pin) in a temp dir and assert COLD_BAD markers (never installs into a consumer with `--ignore-scripts`). Live monorepo source is `shared/package.json` **2.2.96**.
115
150
  2. **PASS** — wipe that consumer’s `node_modules/pi-kiosk-shared`, then `npm install` with **scripts on** (no package args) so `prepare` / `postinstall` overlays during install; assert Node-safe barrel + `NODE_IMPORT_OK`.
116
151
 
117
152
  ```bash
@@ -1,5 +1,6 @@
1
- export { useBarcodeScanner, type UseBarcodeScannerMessages, type UseBarcodeScannerOptions, type UseBarcodeScannerReturn, type ScannerStatus, } from './hooks/useBarcodeScanner.js';
1
+ export { useBarcodeScanner, type UseBarcodeScannerMessages, type UseBarcodeScannerOptions, type UseBarcodeScannerReturn, type ScannerStatus, SCANNER_DISTANCE_ASSIST_DELAY_MS, SCANNER_DISTANCE_ZOOM_DELAY_MS, SCANNER_ZBAR_ZXING_ASSIST_DELAY_MS, } from './hooks/useBarcodeScanner.js';
2
2
  export type { ScannerEngine } from './hooks/selectEngine.js';
3
3
  export { resolveScannerFormatConfig, type BarcodeScannerFormatProfile, type ScannerFormatConfig, } from './hooks/scannerFormats.js';
4
- export { SCANNER_VIDEO_CONSTRAINTS, SCANNER_VIDEO_CONSTRAINT_FALLBACKS, openScannerMediaStream, applyScannerTrackEnhancements, } from './hooks/scannerCameraConstraints.js';
4
+ export { SCANNER_VIDEO_CONSTRAINTS, SCANNER_VIDEO_CONSTRAINT_FALLBACKS, openScannerMediaStream, applyScannerTrackEnhancements, applyScannerDistanceZoom, resolvePreferredOpticalZoom, SCANNER_OPTICAL_ZOOM_POLICY, } from './hooks/scannerCameraConstraints.js';
5
+ export { setZbarWasmUrl, isZbarWasmUrlConfigured, } from './hooks/zbarWasmEngine.js';
5
6
  //# sourceMappingURL=barcode-scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"barcode-scanner.d.ts","sourceRoot":"","sources":["../src/barcode-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,GACnB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EACL,0BAA0B,EAC1B,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,kCAAkC,EAClC,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"barcode-scanner.d.ts","sourceRoot":"","sources":["../src/barcode-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,gCAAgC,EAChC,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EACL,0BAA0B,EAC1B,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,kCAAkC,EAClC,sBAAsB,EACtB,6BAA6B,EAC7B,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,cAAc,EACd,uBAAuB,GACxB,MAAM,2BAA2B,CAAC"}
@@ -1,4 +1,5 @@
1
- export { useBarcodeScanner, } from './hooks/useBarcodeScanner.js';
1
+ export { useBarcodeScanner, SCANNER_DISTANCE_ASSIST_DELAY_MS, SCANNER_DISTANCE_ZOOM_DELAY_MS, SCANNER_ZBAR_ZXING_ASSIST_DELAY_MS, } from './hooks/useBarcodeScanner.js';
2
2
  export { resolveScannerFormatConfig, } from './hooks/scannerFormats.js';
3
- export { SCANNER_VIDEO_CONSTRAINTS, SCANNER_VIDEO_CONSTRAINT_FALLBACKS, openScannerMediaStream, applyScannerTrackEnhancements, } from './hooks/scannerCameraConstraints.js';
3
+ export { SCANNER_VIDEO_CONSTRAINTS, SCANNER_VIDEO_CONSTRAINT_FALLBACKS, openScannerMediaStream, applyScannerTrackEnhancements, applyScannerDistanceZoom, resolvePreferredOpticalZoom, SCANNER_OPTICAL_ZOOM_POLICY, } from './hooks/scannerCameraConstraints.js';
4
+ export { setZbarWasmUrl, isZbarWasmUrlConfigured, } from './hooks/zbarWasmEngine.js';
4
5
  //# sourceMappingURL=barcode-scanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"barcode-scanner.js","sourceRoot":"","sources":["../src/barcode-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAKlB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,0BAA0B,GAG3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,kCAAkC,EAClC,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"barcode-scanner.js","sourceRoot":"","sources":["../src/barcode-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAKjB,gCAAgC,EAChC,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,0BAA0B,GAG3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,kCAAkC,EAClC,sBAAsB,EACtB,6BAA6B,EAC7B,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,cAAc,EACd,uBAAuB,GACxB,MAAM,2BAA2B,CAAC"}
@@ -40,13 +40,18 @@ export declare function resolveMidOpticalZoom(min: number, maxTarget: number, st
40
40
  */
41
41
  export declare function openScannerMediaStream(getUserMedia: MediaDevices['getUserMedia']): Promise<MediaStream>;
42
42
  /**
43
- * Best-effort continuous autofocus, max optical zoom, and torch after getUserMedia.
44
- * Unsupported constraints are ignored so older devices still scan.
45
- *
46
- * Distance levers (G2/G4):
47
- * - Optical zoom targets capability max (policy SCANNER_OPTICAL_ZOOM_POLICY).
48
- * - When the zoom range is wide, applies a mid -> max stepped ladder.
49
- * - Enables torch when getCapabilities().torch is true.
43
+ * Best-effort continuous autofocus + torch after getUserMedia.
44
+ * Optical zoom is NOT applied here — max zoom on open blurs/crops close barcodes
45
+ * (camera shows a sharp code but @zxing never locks). The hook applies
46
+ * {@link applyScannerDistanceZoom} only after multi-pass has already started
47
+ * (second assist window), never at open and never at the first assist tick.
50
48
  */
51
49
  export declare function applyScannerTrackEnhancements(track: MediaStreamTrack): Promise<void>;
50
+ /**
51
+ * Delayed distance lever (G2/G4): mid → max optical zoom from capabilities.
52
+ * Hook policy: call only after SCANNER_DISTANCE_ASSIST_DELAY_MS (multi-pass first)
53
+ * plus SCANNER_DISTANCE_ZOOM_DELAY_MS — never on open and never at the first
54
+ * assist tick, so close codes with slow AF are not forced into max zoom.
55
+ */
56
+ export declare function applyScannerDistanceZoom(track: MediaStreamTrack): Promise<void>;
52
57
  //# sourceMappingURL=scannerCameraConstraints.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scannerCameraConstraints.d.ts","sourceRoot":"","sources":["../../src/hooks/scannerCameraConstraints.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,EAAE,qBAKvC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kCAAkC,EAAE,aAAa,CAAC,qBAAqB,GAAG,IAAI,CAS1F,CAAC;AAqBF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAG,KAAc,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CASR;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAWR;AAmBD;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC,GACzC,OAAO,CAAC,WAAW,CAAC,CAqBtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,6BAA6B,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4E1F"}
1
+ {"version":3,"file":"scannerCameraConstraints.d.ts","sourceRoot":"","sources":["../../src/hooks/scannerCameraConstraints.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,EAAE,qBAKvC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kCAAkC,EAAE,aAAa,CAAC,qBAAqB,GAAG,IAAI,CAS1F,CAAC;AAqBF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAG,KAAc,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CASR;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAWR;AAmBD;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC,GACzC,OAAO,CAAC,WAAW,CAAC,CAqBtB;AAED;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B1F;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDrF"}
@@ -109,13 +109,11 @@ export async function openScannerMediaStream(getUserMedia) {
109
109
  : new Error('Could not open scanner camera', { cause: lastError });
110
110
  }
111
111
  /**
112
- * Best-effort continuous autofocus, max optical zoom, and torch after getUserMedia.
113
- * Unsupported constraints are ignored so older devices still scan.
114
- *
115
- * Distance levers (G2/G4):
116
- * - Optical zoom targets capability max (policy SCANNER_OPTICAL_ZOOM_POLICY).
117
- * - When the zoom range is wide, applies a mid -> max stepped ladder.
118
- * - Enables torch when getCapabilities().torch is true.
112
+ * Best-effort continuous autofocus + torch after getUserMedia.
113
+ * Optical zoom is NOT applied here — max zoom on open blurs/crops close barcodes
114
+ * (camera shows a sharp code but @zxing never locks). The hook applies
115
+ * {@link applyScannerDistanceZoom} only after multi-pass has already started
116
+ * (second assist window), never at open and never at the first assist tick.
119
117
  */
120
118
  export async function applyScannerTrackEnhancements(track) {
121
119
  const getCapabilities = track.getCapabilities;
@@ -125,64 +123,73 @@ export async function applyScannerTrackEnhancements(track) {
125
123
  const capabilities = getCapabilities.call(track);
126
124
  const hasContinuousFocus = capabilities.focusMode?.includes('continuous') === true;
127
125
  const hasTorch = capabilities.torch === true;
128
- const zoomCap = capabilities.zoom;
129
- let zoomMin = 1;
130
- let zoomMax = 1;
131
- let zoomStep;
132
- let hasZoomRange = false;
133
- if (zoomCap !== undefined) {
134
- zoomMin = zoomCap.min ?? 1;
135
- zoomMax = zoomCap.max ?? 1;
136
- zoomStep = zoomCap.step;
137
- hasZoomRange = zoomMax > zoomMin;
138
- }
139
- if (!hasContinuousFocus && !hasTorch && !hasZoomRange) {
126
+ if (!hasContinuousFocus && !hasTorch) {
140
127
  return;
141
128
  }
142
- const preferredZoom = hasZoomRange
143
- ? resolvePreferredOpticalZoom(zoomMin, zoomMax, zoomStep)
144
- : undefined;
145
- const midZoom = preferredZoom !== undefined && preferredZoom > zoomMin
146
- ? resolveMidOpticalZoom(zoomMin, preferredZoom, zoomStep)
147
- : undefined;
148
- const useZoomLadder = midZoom !== undefined &&
149
- preferredZoom !== undefined &&
150
- midZoom > zoomMin &&
151
- midZoom < preferredZoom;
152
- const firstAdvanced = [];
129
+ const advanced = [];
153
130
  if (hasContinuousFocus) {
154
- firstAdvanced.push({ focusMode: 'continuous' });
131
+ advanced.push({ focusMode: 'continuous' });
155
132
  }
156
133
  if (hasTorch) {
157
- firstAdvanced.push({ torch: true });
134
+ advanced.push({ torch: true });
158
135
  }
159
- if (useZoomLadder) {
160
- firstAdvanced.push({ zoom: midZoom });
136
+ try {
137
+ const next = { advanced };
138
+ await track.applyConstraints(next);
139
+ }
140
+ catch {
141
+ // Device rejected advanced focus/torch — keep the stream as opened.
161
142
  }
162
- else if (preferredZoom !== undefined && preferredZoom > zoomMin) {
163
- firstAdvanced.push({ zoom: preferredZoom });
143
+ }
144
+ /**
145
+ * Delayed distance lever (G2/G4): mid → max optical zoom from capabilities.
146
+ * Hook policy: call only after SCANNER_DISTANCE_ASSIST_DELAY_MS (multi-pass first)
147
+ * plus SCANNER_DISTANCE_ZOOM_DELAY_MS — never on open and never at the first
148
+ * assist tick, so close codes with slow AF are not forced into max zoom.
149
+ */
150
+ export async function applyScannerDistanceZoom(track) {
151
+ const getCapabilities = track.getCapabilities;
152
+ if (getCapabilities === undefined) {
153
+ return;
154
+ }
155
+ const capabilities = getCapabilities.call(track);
156
+ const zoomCap = capabilities.zoom;
157
+ if (zoomCap === undefined) {
158
+ return;
159
+ }
160
+ const zoomMin = zoomCap.min ?? 1;
161
+ const zoomMax = zoomCap.max ?? 1;
162
+ const zoomStep = zoomCap.step;
163
+ if (!(zoomMax > zoomMin)) {
164
+ return;
164
165
  }
165
- if (firstAdvanced.length === 0) {
166
+ const preferredZoom = resolvePreferredOpticalZoom(zoomMin, zoomMax, zoomStep);
167
+ if (!(preferredZoom > zoomMin)) {
166
168
  return;
167
169
  }
170
+ const midZoom = resolveMidOpticalZoom(zoomMin, preferredZoom, zoomStep);
171
+ const useZoomLadder = midZoom > zoomMin && midZoom < preferredZoom;
168
172
  try {
169
- const first = { advanced: firstAdvanced };
170
- await track.applyConstraints(first);
171
- // Second lever: step optical zoom to max after focus/torch/mid settled.
172
- if (useZoomLadder && preferredZoom !== undefined) {
173
+ if (useZoomLadder) {
174
+ await track.applyConstraints({
175
+ advanced: [{ zoom: midZoom }],
176
+ });
173
177
  try {
174
- const second = {
178
+ await track.applyConstraints({
175
179
  advanced: [{ zoom: preferredZoom }],
176
- };
177
- await track.applyConstraints(second);
180
+ });
178
181
  }
179
182
  catch {
180
- // Max zoom rejected after mid - keep mid + prior enhancements.
183
+ // Max rejected after mid — keep mid.
181
184
  }
185
+ return;
182
186
  }
187
+ await track.applyConstraints({
188
+ advanced: [{ zoom: preferredZoom }],
189
+ });
183
190
  }
184
191
  catch {
185
- // Device rejected advanced focus/zoom/torch - keep the stream as opened.
192
+ // Zoom unsupported after open — keep current stream.
186
193
  }
187
194
  }
188
195
  //# sourceMappingURL=scannerCameraConstraints.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scannerCameraConstraints.js","sourceRoot":"","sources":["../../src/hooks/scannerCameraConstraints.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scannerCameraConstraints.js","sourceRoot":"","sources":["../../src/hooks/scannerCameraConstraints.ts"],"names":[],"mappings":"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"}
@@ -17,5 +17,7 @@ export interface ScanPass {
17
17
  * CPU bound: at most 10 passes (1 full + 3 center + 1 mid-band + 4 corners + 1 tight center).
18
18
  * Do not add more regions without raising this documented ceiling (~10–12 max).
19
19
  */
20
+ /** Full-frame only — cheap first pass (~1 crop per tick; G9 CPU bound). */
21
+ export declare function buildQuickScanPass(videoWidth: number, videoHeight: number): ScanPass[];
20
22
  export declare function buildMaxSensitivityScanPasses(videoWidth: number, videoHeight: number): ScanPass[];
21
23
  //# sourceMappingURL=scannerScanPasses.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scannerScanPasses.d.ts","sourceRoot":"","sources":["../../src/hooks/scannerScanPasses.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE,CA0DjG"}
1
+ {"version":3,"file":"scannerScanPasses.d.ts","sourceRoot":"","sources":["../../src/hooks/scannerScanPasses.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE,CAKtF;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE,CA0DjG"}
@@ -5,6 +5,13 @@
5
5
  * CPU bound: at most 10 passes (1 full + 3 center + 1 mid-band + 4 corners + 1 tight center).
6
6
  * Do not add more regions without raising this documented ceiling (~10–12 max).
7
7
  */
8
+ /** Full-frame only — cheap first pass (~1 crop per tick; G9 CPU bound). */
9
+ export function buildQuickScanPass(videoWidth, videoHeight) {
10
+ if (videoWidth < 2 || videoHeight < 2) {
11
+ return [];
12
+ }
13
+ return [{ sx: 0, sy: 0, sw: videoWidth, sh: videoHeight, scale: 1 }];
14
+ }
8
15
  export function buildMaxSensitivityScanPasses(videoWidth, videoHeight) {
9
16
  const vw = videoWidth;
10
17
  const vh = videoHeight;
@@ -1 +1 @@
1
- {"version":3,"file":"scannerScanPasses.js","sourceRoot":"","sources":["../../src/hooks/scannerScanPasses.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scannerScanPasses.js","sourceRoot":"","sources":["../../src/hooks/scannerScanPasses.ts"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,WAAmB;IACxE,IAAI,UAAU,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,UAAkB,EAAE,WAAmB;IACnF,MAAM,EAAE,GAAG,UAAU,CAAC;IACtB,MAAM,EAAE,GAAG,WAAW,CAAC;IACvB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,KAAa,EAAY,EAAE;QACvD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC9C,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC7B,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC7B,EAAE;YACF,EAAE;YACF,KAAK;SACN,CAAC;IACJ,CAAC,CAAC;IAEF,iFAAiF;IACjF,MAAM,MAAM,GAAG,CACb,MAAiC,EACjC,IAAY,EACZ,KAAa,EACH,EAAE;QACZ,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACjD,MAAM,OAAO,GAAa;QACxB,EAAE,EAAE,CAAC;QACL,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,CAAC;KACT,CAAC;IAEF,OAAO;QACL,gBAAgB;QAChB,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QAC1C,oBAAoB;QACpB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;QACjB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;QACjB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACf,iBAAiB;QACjB,OAAO;QACP,oDAAoD;QACpD,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;QACvB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;QACvB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;QACvB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;QACvB,4BAA4B;QAC5B,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;KAClB,CAAC;AACJ,CAAC"}
@@ -1,10 +1,12 @@
1
1
  /**
2
2
  * Decode engines used by {@link useBarcodeScanner}:
3
- * - `zxing` — pure-JS @zxing/browser (decodeFromStream + multi-pass zoom)
4
- * - `native-detector` — legacy union member; G5 no longer starts native-only
5
- * (weak path without TRY_HARDER / multi-pass). Kept for API compatibility.
3
+ * - `zbar-wasm` — ZBar C/C++ WASM (primary when boot succeeds; retail EAN/UPC + QR)
4
+ * - `zxing` — pure-JS @zxing/browser timed parallel assist (G4) when ZBar runs but
5
+ * does not decode within the assist delay; not a boot fallback
6
+ * - `native-detector` — Chromium BarcodeDetector parallel assist; never the sole engine
6
7
  *
8
+ * Boot failure (missing WASM URL / ZBar init error) → `status: 'error'`, not `@zxing`.
7
9
  * Engine selection lives only in `useBarcodeScanner`.
8
10
  */
9
- export type ScannerEngine = 'zxing' | 'native-detector';
11
+ export type ScannerEngine = 'zbar-wasm' | 'zxing' | 'native-detector';
10
12
  //# sourceMappingURL=selectEngine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selectEngine.d.ts","sourceRoot":"","sources":["../../src/hooks/selectEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,iBAAiB,CAAC"}
1
+ {"version":3,"file":"selectEngine.d.ts","sourceRoot":"","sources":["../../src/hooks/selectEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,OAAO,GAAG,iBAAiB,CAAC"}
@@ -2,6 +2,20 @@ import './scannerNativeTypes.js';
2
2
  import type { ScannerEngine } from './selectEngine.js';
3
3
  import { type BarcodeScannerFormatProfile } from './scannerFormats.js';
4
4
  export type ScannerStatus = 'idle' | 'starting' | 'running' | 'denied' | 'error';
5
+ /**
6
+ * Optical zoom on ZBar primary path (focus/torch only on open).
7
+ */
8
+ export declare const SCANNER_DISTANCE_ASSIST_DELAY_MS = 1500;
9
+ /**
10
+ * After ZBar is running with no decode, start @zxing stream + multi-pass in
11
+ * parallel (does not stop ZBar — G4 safety net for close EANs ZBar misses).
12
+ */
13
+ export declare const SCANNER_ZBAR_ZXING_ASSIST_DELAY_MS = 1500;
14
+ /**
15
+ * Extra wait after @zxing multi-pass starts before optical zoom on the rare
16
+ * legacy @zxing-only path (unused when G3 hard-fail is active).
17
+ */
18
+ export declare const SCANNER_DISTANCE_ZOOM_DELAY_MS = 1500;
5
19
  export interface UseBarcodeScannerMessages {
6
20
  permissionDenied: string;
7
21
  noCamera: string;
@@ -11,19 +25,16 @@ export interface UseBarcodeScannerMessages {
11
25
  error: string;
12
26
  scannerOff: string;
13
27
  /**
14
- * Optional — shown when the page is not a secure context (HTTP over LAN IP).
15
- * Falls back to `noCamera` when omitted.
28
+ * ZBar WASM URL missing or scanner boot failed — hard error (G3).
29
+ * Falls back to `error` when omitted.
16
30
  */
17
- insecureContext?: string;
31
+ zbarBootstrapFailed?: string;
18
32
  /**
19
- * Optional — camera busy / hardware lock (NotReadableError / AbortError after
20
- * constraint ladder exhaustion). Falls back to `error` when omitted.
33
+ * Shown while `engine === 'zbar-wasm'` (G10). Falls back to `runningZxing`.
21
34
  */
35
+ runningZbar?: string;
36
+ insecureContext?: string;
22
37
  cameraInUse?: string;
23
- /**
24
- * Optional — secure-context / Permissions-Policy block (SecurityError).
25
- * Falls back to `error` when omitted. Not treated as user permission deny.
26
- */
27
38
  policyBlocked?: string;
28
39
  }
29
40
  export interface UseBarcodeScannerOptions {
@@ -32,25 +43,22 @@ export interface UseBarcodeScannerOptions {
32
43
  onDecode: (rawValue: string) => void;
33
44
  messages: UseBarcodeScannerMessages;
34
45
  formatProfile?: BarcodeScannerFormatProfile;
35
- /**
36
- * Fired when the tab/page backgrounds and the hook releases the camera.
37
- * Parent should set `enabled` false so the CTA must be tapped again (no auto-restart).
38
- */
39
46
  onBackgroundStop?: () => void;
40
47
  }
41
48
  export interface UseBarcodeScannerReturn {
42
49
  status: ScannerStatus;
43
50
  engine: ScannerEngine | null;
51
+ /** True while G4 parallel @zxing stream or multi-pass assist is active (ZBar may still run). */
52
+ zxingAssistActive: boolean;
44
53
  errorMessage: string | null;
45
54
  }
46
55
  /**
47
56
  * Live camera barcode/QR decode.
48
57
  *
49
- * Primary: pure-JS @zxing/browser `decodeFromStream` (former working engine)
50
- * plus parallel multi-pass digital zoom + TRY_HARDER for distant / small codes.
51
- * If stream fails but a canvas exists, multi-pass alone is the sensitive path.
52
- * G5: never start native BarcodeDetector alone (no TRY_HARDER / distance assist) —
53
- * hard-fail with recovery copy when neither @zxing path can start.
58
+ * Primary: ZBar WASM multi-pass (immediate) + Chromium BarcodeDetector in parallel.
59
+ * G3: hard-fail when WASM URL unset or ZBar boot fails — no silent @zxing fallback.
60
+ * G4: after {@link SCANNER_ZBAR_ZXING_ASSIST_DELAY_MS} with no lock, @zxing assist
61
+ * runs in parallel without stopping ZBar.
54
62
  */
55
63
  export declare function useBarcodeScanner(options: UseBarcodeScannerOptions): UseBarcodeScannerReturn;
56
64
  //# sourceMappingURL=useBarcodeScanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBarcodeScanner.d.ts","sourceRoot":"","sources":["../../src/hooks/useBarcodeScanner.ts"],"names":[],"mappings":"AAGA,OAAO,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,qBAAqB,CAAC;AAU7B,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAwBD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,aAAa,CAAC,EAAE,2BAA2B,CAAC;IAC5C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAKD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,uBAAuB,CAyW5F"}
1
+ {"version":3,"file":"useBarcodeScanner.d.ts","sourceRoot":"","sources":["../../src/hooks/useBarcodeScanner.ts"],"names":[],"mappings":"AAGA,OAAO,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,qBAAqB,CAAC;AAgB7B,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,kCAAkC,OAAmC,CAAC;AAEnF;;;GAGG;AACH,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAwBD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,aAAa,CAAC,EAAE,2BAA2B,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,gGAAgG;IAChG,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAKD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,uBAAuB,CA2iB5F"}
@@ -3,8 +3,23 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
3
3
  import { DecodeHintType } from '@zxing/library';
4
4
  import './scannerNativeTypes.js';
5
5
  import { resolveScannerFormatConfig, } from './scannerFormats.js';
6
- import { applyScannerTrackEnhancements, openScannerMediaStream, } from './scannerCameraConstraints.js';
6
+ import { applyScannerDistanceZoom, applyScannerTrackEnhancements, openScannerMediaStream, } from './scannerCameraConstraints.js';
7
7
  import { createSensitiveZxingReader, decodeVideoFrameWithZxingJs, } from './zxingJsSensitiveDecode.js';
8
+ import { createConfiguredZbarScanner, decodeVideoFrameWithZbar, isZbarWasmUrlConfigured, } from './zbarWasmEngine.js';
9
+ /**
10
+ * Optical zoom on ZBar primary path (focus/torch only on open).
11
+ */
12
+ export const SCANNER_DISTANCE_ASSIST_DELAY_MS = 1500;
13
+ /**
14
+ * After ZBar is running with no decode, start @zxing stream + multi-pass in
15
+ * parallel (does not stop ZBar — G4 safety net for close EANs ZBar misses).
16
+ */
17
+ export const SCANNER_ZBAR_ZXING_ASSIST_DELAY_MS = SCANNER_DISTANCE_ASSIST_DELAY_MS;
18
+ /**
19
+ * Extra wait after @zxing multi-pass starts before optical zoom on the rare
20
+ * legacy @zxing-only path (unused when G3 hard-fail is active).
21
+ */
22
+ export const SCANNER_DISTANCE_ZOOM_DELAY_MS = 1500;
8
23
  function isInsecureCameraContext() {
9
24
  return typeof window !== 'undefined' && window.isSecureContext === false;
10
25
  }
@@ -19,21 +34,21 @@ function isCameraInUseError(err) {
19
34
  return (err instanceof DOMException &&
20
35
  (err.name === 'NotReadableError' || err.name === 'AbortError'));
21
36
  }
22
- /** Multi-pass @zxing decode budget (~20–25 attempts/s). */
23
- const ZXING_MIN_FRAME_INTERVAL_MS = 40;
37
+ /** ZBar + @zxing assist decode budget (~20–25 attempts/s). */
38
+ const DECODE_MIN_FRAME_INTERVAL_MS = 40;
24
39
  /**
25
40
  * Live camera barcode/QR decode.
26
41
  *
27
- * Primary: pure-JS @zxing/browser `decodeFromStream` (former working engine)
28
- * plus parallel multi-pass digital zoom + TRY_HARDER for distant / small codes.
29
- * If stream fails but a canvas exists, multi-pass alone is the sensitive path.
30
- * G5: never start native BarcodeDetector alone (no TRY_HARDER / distance assist) —
31
- * hard-fail with recovery copy when neither @zxing path can start.
42
+ * Primary: ZBar WASM multi-pass (immediate) + Chromium BarcodeDetector in parallel.
43
+ * G3: hard-fail when WASM URL unset or ZBar boot fails — no silent @zxing fallback.
44
+ * G4: after {@link SCANNER_ZBAR_ZXING_ASSIST_DELAY_MS} with no lock, @zxing assist
45
+ * runs in parallel without stopping ZBar.
32
46
  */
33
47
  export function useBarcodeScanner(options) {
34
48
  const { enabled, videoRef, onDecode, messages, formatProfile = 'retail', onBackgroundStop, } = options;
35
49
  const [status, setStatus] = useState('idle');
36
50
  const [engine, setEngine] = useState(null);
51
+ const [zxingAssistActive, setZxingAssistActive] = useState(false);
37
52
  const [errorMessage, setErrorMessage] = useState(null);
38
53
  const [heldOffByBackground, setHeldOffByBackground] = useState(false);
39
54
  const onDecodeRef = useRef(onDecode);
@@ -61,6 +76,7 @@ export function useBarcodeScanner(options) {
61
76
  if (!scanningEnabled) {
62
77
  setStatus('idle');
63
78
  setEngine(null);
79
+ setZxingAssistActive(false);
64
80
  setErrorMessage(null);
65
81
  }
66
82
  }
@@ -82,6 +98,7 @@ export function useBarcodeScanner(options) {
82
98
  setHeldOffByBackground(true);
83
99
  setStatus('idle');
84
100
  setEngine(null);
101
+ setZxingAssistActive(false);
85
102
  setErrorMessage(null);
86
103
  onBackgroundStopRef.current?.();
87
104
  };
@@ -108,9 +125,15 @@ export function useBarcodeScanner(options) {
108
125
  let cancelled = false;
109
126
  let stream = null;
110
127
  let zxingControls = null;
111
- let zxingFrameHandle = null;
128
+ let zbarFrameHandle = null;
129
+ let zxingMultiPassFrameHandle = null;
130
+ let nativeFrameHandle = null;
131
+ let distanceZoomTimer = null;
132
+ let zxingAssistTimer = null;
133
+ let gotDecode = false;
134
+ let zxingAssistStarted = false;
135
+ let zbarScanner = null;
112
136
  const formatConfig = resolveScannerFormatConfig(formatProfile);
113
- // G5: multi-pass needs a canvas; if creation fails, hard-fail later (never native-only).
114
137
  const decodeCanvas = (() => {
115
138
  if (typeof document === 'undefined') {
116
139
  return null;
@@ -122,7 +145,40 @@ export function useBarcodeScanner(options) {
122
145
  return null;
123
146
  }
124
147
  })();
148
+ const zbarBootstrapErrorMessage = () => messagesRef.current.zbarBootstrapFailed ?? messagesRef.current.error;
149
+ const clearAssistTimers = () => {
150
+ if (zxingAssistTimer !== null) {
151
+ clearTimeout(zxingAssistTimer);
152
+ zxingAssistTimer = null;
153
+ }
154
+ if (distanceZoomTimer !== null) {
155
+ clearTimeout(distanceZoomTimer);
156
+ distanceZoomTimer = null;
157
+ }
158
+ };
159
+ const emitDecode = (text) => {
160
+ if (cancelled || text.length === 0) {
161
+ return;
162
+ }
163
+ gotDecode = true;
164
+ clearAssistTimers();
165
+ if (!cancelled) {
166
+ setZxingAssistActive(false);
167
+ }
168
+ onDecodeRef.current(text);
169
+ };
170
+ const failZbarBootstrap = () => {
171
+ if (!cancelled) {
172
+ setStatus('error');
173
+ setEngine(null);
174
+ setZxingAssistActive(false);
175
+ setErrorMessage(zbarBootstrapErrorMessage());
176
+ }
177
+ cleanup();
178
+ };
125
179
  const cleanup = () => {
180
+ clearAssistTimers();
181
+ setZxingAssistActive(false);
126
182
  if (zxingControls !== null) {
127
183
  try {
128
184
  zxingControls.stop();
@@ -132,9 +188,26 @@ export function useBarcodeScanner(options) {
132
188
  }
133
189
  zxingControls = null;
134
190
  }
135
- if (zxingFrameHandle !== null) {
136
- cancelAnimationFrame(zxingFrameHandle);
137
- zxingFrameHandle = null;
191
+ if (zbarFrameHandle !== null) {
192
+ cancelAnimationFrame(zbarFrameHandle);
193
+ zbarFrameHandle = null;
194
+ }
195
+ if (zxingMultiPassFrameHandle !== null) {
196
+ cancelAnimationFrame(zxingMultiPassFrameHandle);
197
+ zxingMultiPassFrameHandle = null;
198
+ }
199
+ if (nativeFrameHandle !== null) {
200
+ cancelAnimationFrame(nativeFrameHandle);
201
+ nativeFrameHandle = null;
202
+ }
203
+ if (zbarScanner !== null) {
204
+ try {
205
+ zbarScanner.destroy();
206
+ }
207
+ catch {
208
+ // ignore teardown errors
209
+ }
210
+ zbarScanner = null;
138
211
  }
139
212
  if (stream !== null) {
140
213
  for (const track of stream.getTracks()) {
@@ -156,6 +229,7 @@ export function useBarcodeScanner(options) {
156
229
  void (async () => {
157
230
  setStatus('starting');
158
231
  setErrorMessage(null);
232
+ setZxingAssistActive(false);
159
233
  if (isInsecureCameraContext()) {
160
234
  if (!cancelled) {
161
235
  setStatus('error');
@@ -163,7 +237,6 @@ export function useBarcodeScanner(options) {
163
237
  }
164
238
  return;
165
239
  }
166
- // Missing MediaDevices (secure context prep for G3): prefer noCamera only.
167
240
  if (typeof navigator === 'undefined' || navigator.mediaDevices === undefined) {
168
241
  if (!cancelled) {
169
242
  setStatus('error');
@@ -179,8 +252,6 @@ export function useBarcodeScanner(options) {
179
252
  return;
180
253
  }
181
254
  if (isPermissionDeniedError(err)) {
182
- // Android Chrome often throws NotAllowedError on plain HTTP LAN URLs;
183
- // prefer the HTTPS recovery copy when the context is still insecure.
184
255
  if (isInsecureCameraContext()) {
185
256
  setStatus('error');
186
257
  setErrorMessage(messagesRef.current.insecureContext ?? messagesRef.current.noCamera);
@@ -205,7 +276,6 @@ export function useBarcodeScanner(options) {
205
276
  cleanup();
206
277
  return;
207
278
  }
208
- // G5: cancel/unmount after GUM — release before enhance/play.
209
279
  if (cancelled) {
210
280
  cleanup();
211
281
  return;
@@ -221,7 +291,6 @@ export function useBarcodeScanner(options) {
221
291
  }
222
292
  const video = videoRef.current;
223
293
  if (video === null) {
224
- // G4: successful GUM but video element gone — surface error, release tracks.
225
294
  cleanup();
226
295
  if (!cancelled) {
227
296
  setStatus('error');
@@ -242,7 +311,97 @@ export function useBarcodeScanner(options) {
242
311
  cleanup();
243
312
  return;
244
313
  }
245
- const startZxingStreamFallback = async () => {
314
+ const startNativeParallelAssist = () => {
315
+ if (typeof window === 'undefined' || window.BarcodeDetector === undefined) {
316
+ return;
317
+ }
318
+ const detector = new window.BarcodeDetector({
319
+ formats: [...formatConfig.nativeFormats],
320
+ });
321
+ const tick = async () => {
322
+ if (cancelled || gotDecode) {
323
+ return;
324
+ }
325
+ if (video.readyState >= 2) {
326
+ try {
327
+ const results = await detector.detect(video);
328
+ const first = results[0];
329
+ if (first !== undefined && first.rawValue.trim().length > 0) {
330
+ emitDecode(first.rawValue.trim());
331
+ return;
332
+ }
333
+ }
334
+ catch {
335
+ // keep scanning
336
+ }
337
+ }
338
+ if (!cancelled && !gotDecode) {
339
+ nativeFrameHandle = requestAnimationFrame(() => {
340
+ void tick();
341
+ });
342
+ }
343
+ };
344
+ nativeFrameHandle = requestAnimationFrame(() => {
345
+ void tick();
346
+ });
347
+ };
348
+ const startZbarLoop = async () => {
349
+ if (decodeCanvas === null) {
350
+ return false;
351
+ }
352
+ let scanner;
353
+ try {
354
+ scanner = await createConfiguredZbarScanner(formatProfile);
355
+ }
356
+ catch {
357
+ return false;
358
+ }
359
+ if (cancelled) {
360
+ try {
361
+ scanner.destroy();
362
+ }
363
+ catch {
364
+ // ignore
365
+ }
366
+ return false;
367
+ }
368
+ zbarScanner = scanner;
369
+ let lastAttemptMs = 0;
370
+ let busy = false;
371
+ let zbarTickCount = 0;
372
+ const tick = () => {
373
+ if (cancelled || gotDecode) {
374
+ return;
375
+ }
376
+ const now = performance.now();
377
+ if (!busy &&
378
+ video.readyState >= 2 &&
379
+ now - lastAttemptMs >= DECODE_MIN_FRAME_INTERVAL_MS) {
380
+ lastAttemptMs = now;
381
+ busy = true;
382
+ zbarTickCount += 1;
383
+ const quickOnly = zbarTickCount % 3 !== 0;
384
+ void decodeVideoFrameWithZbar(video, decodeCanvas, scanner, { quickOnly })
385
+ .then((text) => {
386
+ if (!cancelled && text !== null) {
387
+ emitDecode(text);
388
+ }
389
+ })
390
+ .catch(() => {
391
+ // keep scanning
392
+ })
393
+ .finally(() => {
394
+ busy = false;
395
+ });
396
+ }
397
+ if (!cancelled && !gotDecode) {
398
+ zbarFrameHandle = requestAnimationFrame(tick);
399
+ }
400
+ };
401
+ zbarFrameHandle = requestAnimationFrame(tick);
402
+ return true;
403
+ };
404
+ const startZxingStreamAssist = async () => {
246
405
  const hints = new Map();
247
406
  hints.set(DecodeHintType.POSSIBLE_FORMATS, [...formatConfig.zxingFormats]);
248
407
  hints.set(DecodeHintType.TRY_HARDER, true);
@@ -254,9 +413,18 @@ export function useBarcodeScanner(options) {
254
413
  return;
255
414
  }
256
415
  if (result !== undefined && result !== null) {
257
- onDecodeRef.current(result.getText());
416
+ emitDecode(result.getText());
258
417
  }
259
418
  });
419
+ if (cancelled) {
420
+ try {
421
+ zxingControls.stop();
422
+ }
423
+ catch {
424
+ // ignore teardown errors
425
+ }
426
+ zxingControls = null;
427
+ }
260
428
  return true;
261
429
  }
262
430
  catch {
@@ -272,25 +440,24 @@ export function useBarcodeScanner(options) {
272
440
  reader = createSensitiveZxingReader(formatConfig.zxingFormats);
273
441
  }
274
442
  catch {
275
- // Reader/bootstrap failure — do not pretend multi-pass started.
276
443
  return false;
277
444
  }
278
445
  let lastAttemptMs = 0;
279
446
  let busy = false;
280
447
  const tick = () => {
281
- if (cancelled) {
448
+ if (cancelled || gotDecode) {
282
449
  return;
283
450
  }
284
451
  const now = performance.now();
285
452
  if (!busy &&
286
453
  video.readyState >= 2 &&
287
- now - lastAttemptMs >= ZXING_MIN_FRAME_INTERVAL_MS) {
454
+ now - lastAttemptMs >= DECODE_MIN_FRAME_INTERVAL_MS) {
288
455
  lastAttemptMs = now;
289
456
  busy = true;
290
457
  try {
291
458
  const text = decodeVideoFrameWithZxingJs(video, decodeCanvas, reader);
292
459
  if (!cancelled && text !== null) {
293
- onDecodeRef.current(text);
460
+ emitDecode(text);
294
461
  }
295
462
  }
296
463
  catch {
@@ -300,43 +467,74 @@ export function useBarcodeScanner(options) {
300
467
  busy = false;
301
468
  }
302
469
  }
303
- if (!cancelled) {
304
- zxingFrameHandle = requestAnimationFrame(tick);
470
+ if (!cancelled && !gotDecode) {
471
+ zxingMultiPassFrameHandle = requestAnimationFrame(tick);
305
472
  }
306
473
  };
307
- zxingFrameHandle = requestAnimationFrame(tick);
474
+ zxingMultiPassFrameHandle = requestAnimationFrame(tick);
308
475
  return true;
309
476
  };
310
- // G5 engine order (max sensitivity — never native-only):
311
- // 1) @zxing decodeFromStream (+ TRY_HARDER); if OK also start multi-pass
312
- // 2) Else multi-pass canvas alone (when canvas exists)
313
- // 3) Else hard-fail — do not start weak native BarcodeDetector alone
314
- const streamOk = await startZxingStreamFallback();
315
- // G5: if cancelled after controls assigned, stop them + release stream.
316
- if (cancelled) {
317
- cleanup();
318
- return;
319
- }
320
- if (streamOk) {
321
- startZxingMultiPassLoop();
477
+ const startZxingParallelAssist = () => {
478
+ if (zxingAssistStarted || cancelled || gotDecode) {
479
+ return;
480
+ }
481
+ zxingAssistStarted = true;
322
482
  if (!cancelled) {
323
- setEngine('zxing');
324
- setStatus('running');
483
+ setZxingAssistActive(true);
325
484
  }
485
+ void (async () => {
486
+ const streamOk = await startZxingStreamAssist();
487
+ if (cancelled || gotDecode) {
488
+ return;
489
+ }
490
+ if (!streamOk) {
491
+ startZxingMultiPassLoop();
492
+ }
493
+ })();
494
+ };
495
+ const scheduleZbarDistanceZoom = () => {
496
+ const trackForAssist = primaryTrack;
497
+ if (trackForAssist === undefined) {
498
+ return;
499
+ }
500
+ distanceZoomTimer = setTimeout(() => {
501
+ distanceZoomTimer = null;
502
+ if (cancelled || gotDecode) {
503
+ return;
504
+ }
505
+ void applyScannerDistanceZoom(trackForAssist);
506
+ }, SCANNER_DISTANCE_ASSIST_DELAY_MS);
507
+ };
508
+ const scheduleZxingParallelAssist = () => {
509
+ zxingAssistTimer = setTimeout(() => {
510
+ zxingAssistTimer = null;
511
+ if (cancelled || gotDecode) {
512
+ return;
513
+ }
514
+ startZxingParallelAssist();
515
+ }, SCANNER_ZBAR_ZXING_ASSIST_DELAY_MS);
516
+ };
517
+ // G3 — ZBar required; no silent @zxing boot fallback.
518
+ if (!isZbarWasmUrlConfigured()) {
519
+ failZbarBootstrap();
326
520
  return;
327
521
  }
328
- if (startZxingMultiPassLoop()) {
329
- if (!cancelled) {
330
- setEngine('zxing');
331
- setStatus('running');
332
- }
522
+ const zbarOk = await startZbarLoop();
523
+ if (cancelled) {
524
+ cleanup();
525
+ return;
526
+ }
527
+ if (!zbarOk) {
528
+ failZbarBootstrap();
333
529
  return;
334
530
  }
531
+ startNativeParallelAssist();
532
+ scheduleZbarDistanceZoom();
533
+ scheduleZxingParallelAssist();
335
534
  if (!cancelled) {
336
- setStatus('error');
337
- setErrorMessage(messagesRef.current.error);
535
+ setEngine('zbar-wasm');
536
+ setStatus('running');
338
537
  }
339
- cleanup();
340
538
  })();
341
539
  return () => {
342
540
  cancelled = true;
@@ -344,6 +542,6 @@ export function useBarcodeScanner(options) {
344
542
  stopRef.current = null;
345
543
  };
346
544
  }, [scanningEnabled, formatProfile, stop, videoRef]);
347
- return { status, engine, errorMessage };
545
+ return { status, engine, zxingAssistActive, errorMessage };
348
546
  }
349
547
  //# sourceMappingURL=useBarcodeScanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBarcodeScanner.js","sourceRoot":"","sources":["../../src/hooks/useBarcodeScanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useBarcodeScanner.js","sourceRoot":"","sources":["../../src/hooks/useBarcodeScanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * ZBar C/C++ WASM decode — primary live camera engine for retail EAN/UPC/Code128 + QR.
3
+ * Uses @undecaf/zbar-wasm (same engine as the BarcodeDetector polyfill).
4
+ *
5
+ * Apps must call {@link setZbarWasmUrl} once at boot with a same-origin
6
+ * `zbar.wasm?url` (Vite) so CSP + bundlers resolve the binary.
7
+ */
8
+ import { ZBarScanner } from '@undecaf/zbar-wasm';
9
+ import type { BarcodeScannerFormatProfile } from './scannerFormats.js';
10
+ export interface ZbarDecodeFrameOptions {
11
+ /** When true, decode full frame only (every other ticks — G9 CPU bound). */
12
+ readonly quickOnly?: boolean;
13
+ }
14
+ /**
15
+ * CSP-safe same-origin URL for `zbar.wasm`. Call once before any scan session.
16
+ */
17
+ export declare function setZbarWasmUrl(url: string): void;
18
+ export declare function isZbarWasmUrlConfigured(): boolean;
19
+ /** Test-only — reset boot flag between Jest cases. */
20
+ export declare function resetZbarWasmUrlForTests(): void;
21
+ /**
22
+ * Build a ZBar scanner enabled only for the active format profile.
23
+ * Dense X/Y scan + inverted retry for close / low-contrast retail labels.
24
+ */
25
+ export declare function createConfiguredZbarScanner(formatProfile?: BarcodeScannerFormatProfile): Promise<ZBarScanner>;
26
+ /**
27
+ * Multi-pass digital crops → ZBar `scanImageData`.
28
+ * Returns first non-empty payload or null.
29
+ */
30
+ export declare function decodeVideoFrameWithZbar(video: HTMLVideoElement, canvas: HTMLCanvasElement, scanner: ZBarScanner, options?: ZbarDecodeFrameOptions): Promise<string | null>;
31
+ //# sourceMappingURL=zbarWasmEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zbarWasmEngine.d.ts","sourceRoot":"","sources":["../../src/hooks/zbarWasmEngine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAIL,WAAW,EAEZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAMvE,MAAM,WAAW,sBAAsB;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAchD;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,sDAAsD;AACtD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAyBD;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,aAAa,GAAE,2BAAsC,GACpD,OAAO,CAAC,WAAW,CAAC,CAuBtB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmDxB"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * ZBar C/C++ WASM decode — primary live camera engine for retail EAN/UPC/Code128 + QR.
3
+ * Uses @undecaf/zbar-wasm (same engine as the BarcodeDetector polyfill).
4
+ *
5
+ * Apps must call {@link setZbarWasmUrl} once at boot with a same-origin
6
+ * `zbar.wasm?url` (Vite) so CSP + bundlers resolve the binary.
7
+ */
8
+ import { scanImageData, setModuleArgs, ZBarConfigType, ZBarScanner, ZBarSymbolType, } from '@undecaf/zbar-wasm';
9
+ import { buildMaxSensitivityScanPasses, buildQuickScanPass, } from './scannerScanPasses.js';
10
+ let wasmUrlConfigured = false;
11
+ /**
12
+ * CSP-safe same-origin URL for `zbar.wasm`. Call once before any scan session.
13
+ */
14
+ export function setZbarWasmUrl(url) {
15
+ const trimmed = url.trim();
16
+ if (trimmed.length === 0) {
17
+ throw new Error('setZbarWasmUrl requires a non-empty same-origin WASM URL');
18
+ }
19
+ setModuleArgs({
20
+ locateFile: (filename, _directory) => {
21
+ if (filename.endsWith('.wasm')) {
22
+ return trimmed;
23
+ }
24
+ return filename;
25
+ },
26
+ });
27
+ wasmUrlConfigured = true;
28
+ }
29
+ export function isZbarWasmUrlConfigured() {
30
+ return wasmUrlConfigured;
31
+ }
32
+ /** Test-only — reset boot flag between Jest cases. */
33
+ export function resetZbarWasmUrlForTests() {
34
+ wasmUrlConfigured = false;
35
+ }
36
+ const RETAIL_SYMBOLS = [
37
+ ZBarSymbolType.ZBAR_EAN13,
38
+ ZBarSymbolType.ZBAR_EAN8,
39
+ ZBarSymbolType.ZBAR_UPCA,
40
+ ZBarSymbolType.ZBAR_UPCE,
41
+ ZBarSymbolType.ZBAR_CODE128,
42
+ ZBarSymbolType.ZBAR_CODE39,
43
+ ];
44
+ const QR_SYMBOLS = [ZBarSymbolType.ZBAR_QRCODE];
45
+ function symbolsForProfile(formatProfile) {
46
+ if (formatProfile === 'qr-only') {
47
+ return QR_SYMBOLS;
48
+ }
49
+ if (formatProfile === 'all') {
50
+ return [...RETAIL_SYMBOLS, ...QR_SYMBOLS];
51
+ }
52
+ return RETAIL_SYMBOLS;
53
+ }
54
+ /**
55
+ * Build a ZBar scanner enabled only for the active format profile.
56
+ * Dense X/Y scan + inverted retry for close / low-contrast retail labels.
57
+ */
58
+ export async function createConfiguredZbarScanner(formatProfile = 'retail') {
59
+ if (!wasmUrlConfigured) {
60
+ throw new Error('ZBar WASM URL not configured — call setZbarWasmUrl(zbar.wasm?url) at app boot');
61
+ }
62
+ const scanner = await ZBarScanner.create();
63
+ // Disable everything, then enable the profile symbologies.
64
+ scanner.setConfig(ZBarSymbolType.ZBAR_NONE, ZBarConfigType.ZBAR_CFG_ENABLE, 0);
65
+ for (const sym of symbolsForProfile(formatProfile)) {
66
+ scanner.setConfig(sym, ZBarConfigType.ZBAR_CFG_ENABLE, 1);
67
+ }
68
+ // Denser scan grid (default is often too sparse for close phone shots).
69
+ scanner.setConfig(ZBarSymbolType.ZBAR_NONE, ZBarConfigType.ZBAR_CFG_X_DENSITY, 1);
70
+ scanner.setConfig(ZBarSymbolType.ZBAR_NONE, ZBarConfigType.ZBAR_CFG_Y_DENSITY, 1);
71
+ scanner.setConfig(ZBarSymbolType.ZBAR_NONE, ZBarConfigType.ZBAR_CFG_TEST_INVERTED, 1);
72
+ scanner.enableCache(false);
73
+ return scanner;
74
+ }
75
+ /**
76
+ * Multi-pass digital crops → ZBar `scanImageData`.
77
+ * Returns first non-empty payload or null.
78
+ */
79
+ export async function decodeVideoFrameWithZbar(video, canvas, scanner, options) {
80
+ const width = video.videoWidth;
81
+ const height = video.videoHeight;
82
+ if (width < 2 || height < 2) {
83
+ return null;
84
+ }
85
+ const ctx = canvas.getContext('2d', { willReadFrequently: true });
86
+ if (ctx === null) {
87
+ return null;
88
+ }
89
+ ctx.imageSmoothingEnabled = false;
90
+ const passes = options?.quickOnly
91
+ ? buildQuickScanPass(width, height)
92
+ : buildMaxSensitivityScanPasses(width, height);
93
+ for (const pass of passes) {
94
+ const outW = Math.max(2, Math.floor(pass.sw * pass.scale));
95
+ const outH = Math.max(2, Math.floor(pass.sh * pass.scale));
96
+ if (canvas.width !== outW) {
97
+ canvas.width = outW;
98
+ }
99
+ if (canvas.height !== outH) {
100
+ canvas.height = outH;
101
+ }
102
+ ctx.clearRect(0, 0, outW, outH);
103
+ ctx.drawImage(video, pass.sx, pass.sy, pass.sw, pass.sh, 0, 0, outW, outH);
104
+ let imageData;
105
+ try {
106
+ imageData = ctx.getImageData(0, 0, outW, outH);
107
+ }
108
+ catch {
109
+ continue;
110
+ }
111
+ try {
112
+ const symbols = await scanImageData(imageData, scanner);
113
+ for (const symbol of symbols) {
114
+ const text = symbol.decode().trim();
115
+ if (text.length > 0) {
116
+ return text;
117
+ }
118
+ }
119
+ }
120
+ catch {
121
+ // keep trying next pass
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ //# sourceMappingURL=zbarWasmEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zbarWasmEngine.js","sourceRoot":"","sources":["../../src/hooks/zbarWasmEngine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAOhC,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAE9B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,aAAa,CAAC;QACZ,UAAU,EAAE,CAAC,QAAgB,EAAE,UAAkB,EAAU,EAAE;YAC3D,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;IACH,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,wBAAwB;IACtC,iBAAiB,GAAG,KAAK,CAAC;AAC5B,CAAC;AAED,MAAM,cAAc,GAA8B;IAChD,cAAc,CAAC,UAAU;IACzB,cAAc,CAAC,SAAS;IACxB,cAAc,CAAC,SAAS;IACxB,cAAc,CAAC,SAAS;IACxB,cAAc,CAAC,YAAY;IAC3B,cAAc,CAAC,WAAW;CAC3B,CAAC;AAEF,MAAM,UAAU,GAA8B,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AAE3E,SAAS,iBAAiB,CACxB,aAA0C;IAE1C,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,UAAU,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,gBAA6C,QAAQ;IAErD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;IAC3C,2DAA2D;IAC3D,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAC/E,KAAK,MAAM,GAAG,IAAI,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,wEAAwE;IACxE,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,SAAS,CACf,cAAc,CAAC,SAAS,EACxB,cAAc,CAAC,sBAAsB,EACrC,CAAC,CACF,CAAC;IACF,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAuB,EACvB,MAAyB,EACzB,OAAoB,EACpB,OAAgC;IAEhC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,qBAAqB,GAAG,KAAK,CAAC;IAElC,MAAM,MAAM,GAAG,OAAO,EAAE,SAAS;QAC/B,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC;QACnC,CAAC,CAAC,6BAA6B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE3E,IAAI,SAAoB,CAAC;QACzB,IAAI,CAAC;YACH,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;gBACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpB,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-kiosk-shared",
3
- "version": "2.2.92",
3
+ "version": "2.2.97",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "Shared types, API contracts, and error classes for Pi Kiosk system",
@@ -307,6 +307,7 @@
307
307
  }
308
308
  },
309
309
  "dependencies": {
310
+ "@undecaf/zbar-wasm": "^0.11.0",
310
311
  "tailwind-variants": "^0.3.0"
311
312
  },
312
313
  "scripts": {
@@ -336,7 +337,7 @@
336
337
  "check:inventory-contract-drift": "node scripts/check-inventory-contract-drift.mjs",
337
338
  "gate:inventory-ops-slo-drift": "node scripts/check-inventory-ops-slo-drift.mjs",
338
339
  "check:inventory-ops-slo-drift": "node scripts/check-inventory-ops-slo-drift.mjs",
339
- "publish:local": "npm run build:clean && npm pack --pack-destination ../",
340
+ "publish:local": "npm run build:clean && npm pack --pack-destination .",
340
341
  "prepublishOnly": "npm run build:clean",
341
342
  "preversion": "npm run test -- --passWithNoTests",
342
343
  "postversion": "echo 'Version updated. Run git push && git push --tags manually if needed.'",