@gueshbzh-perso/scanner 0.11.0 → 0.11.1

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
@@ -147,9 +147,12 @@ overlay (ROI mask, highlights, torch / camera buttons) · beep · vibration
147
147
  strategies (laser engraving, shadows, light-on-dark codes…), a safety net
148
148
  that costs a little CPU and battery. Off by default. Its codes get the
149
149
  same multi-frame confirmation and de-duplication. It is used only when it
150
- supports every requested format (`micro_qr`, which it lacks, is read by
151
- the fallback; without it, listing `micro_qr` in `formats` keeps the
152
- engine), and dropped for the engine alone if it ever fails.
150
+ reads the formats it has; the ones it lacks (`micro_qr` always, others
151
+ depending on the browser) are read only with `engineFallback`. With the
152
+ default `formats` list they are accepted as unread; with an explicit list,
153
+ one of them keeps the engine (a requested format is never dropped
154
+ silently). UPC-A is covered through EAN-13 where the native decoder has no
155
+ `upc_a` (Safari). It is dropped for the engine alone if it ever fails.
153
156
  Detection is by feature, not by browser: any browser that ships the API
154
157
  gets it, but a JavaScript polyfill of `BarcodeDetector` is ignored (it
155
158
  would only be a slower engine on the main thread). Safari, Firefox and
package/dist/native.d.ts CHANGED
@@ -20,19 +20,31 @@ export interface BarcodeDetectorClass {
20
20
  /** Native decoder serving one reader configuration. */
21
21
  export declare class NativeDetector {
22
22
  private detector;
23
- /** Formats the detector looks for. */
23
+ /** Requested formats the detector reads. */
24
24
  readonly formats: readonly BarcodeFormat[];
25
+ /**
26
+ * Requested formats the native decoder cannot read. They are read only
27
+ * with `processing.engineFallback`.
28
+ */
29
+ readonly missing: readonly BarcodeFormat[];
30
+ /** UPC-A codes come back as EAN-13 and are converted (see `create`). */
31
+ private upcFromEan;
25
32
  private constructor();
26
33
  /**
27
- * A detector for `formats` (default: all), or `undefined` when the native
28
- * decoder cannot replace the engine's fast path: API absent, or one of the
29
- * requested formats not supported natively (codes of that format would
30
- * then be read by the slow fallbacks at best).
34
+ * A detector for `formats` (default: all), or `undefined` when the engine
35
+ * must keep the job: API absent, no requested format readable natively, or
36
+ * an **explicit** list naming a format the native decoder lacks while
37
+ * `engineFallback` is off (a format the application asked for must not be
38
+ * dropped silently). With the default list, missing formats (always
39
+ * `micro_qr`, sometimes others) are accepted: the native decoder reads the
40
+ * rest, and the missing ones are read only with `engineFallback`. The
41
+ * engine fallback never turns itself on: it costs CPU and battery, that is
42
+ * the application's call.
31
43
  *
32
- * `micro_qr`, absent from the native API: with `engineFallback` the
33
- * fallbacks read it. Without, a list that names it explicitly keeps the
34
- * engine (the application asked for it, it must not be lost silently),
35
- * while the default list (every format) accepts not reading it.
44
+ * UPC-A is EAN-13 with a leading `0` (GTIN-12 inside GTIN-13), so a native
45
+ * decoder without `upc_a` but with `ean_13` covers it: it is asked for
46
+ * EAN-13 and those codes are reported as UPC-A, as this SDK's engine (and
47
+ * ZXing) do when UPC-A is requested.
36
48
  */
37
49
  static create(formats: readonly BarcodeFormat[] | undefined, api?: BarcodeDetectorClass | undefined, engineFallback?: boolean): Promise<NativeDetector | undefined>;
38
50
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIlE,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,YAAY,EAAE,SAAS,KAAK,EAAE,CAAC;CAChC;AAED,UAAU,uBAAuB;IAC/B,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC7D;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,KAAK,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,uBAAuB,CAAC;IAChE,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC1C;AAwBD,uDAAuD;AACvD,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ;IAChB,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE;IAH5C,OAAO;IAMP;;;;;;;;;;OAUG;WACU,MAAM,CACjB,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,EAC7C,GAAG,GAAE,oBAAoB,GAAG,SAAuB,EACnD,cAAc,UAAQ,GACrB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAqBtC;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAW1E;AAiBD,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE7C"}
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIlE,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,YAAY,EAAE,SAAS,KAAK,EAAE,CAAC;CAChC;AAED,UAAU,uBAAuB;IAC/B,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC7D;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,KAAK,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,uBAAuB,CAAC;IAChE,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC1C;AAwBD,uDAAuD;AACvD,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ;IAChB,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE;IAC1C;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE;IAC1C,wEAAwE;IACxE,OAAO,CAAC,UAAU;IAVpB,OAAO;IAaP;;;;;;;;;;;;;;;OAeG;WACU,MAAM,CACjB,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,EAC7C,GAAG,GAAE,oBAAoB,GAAG,SAAuB,EACnD,cAAc,UAAQ,GACrB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IA2BtC;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAgB1E;AAiBD,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE7C"}
package/dist/native.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * Formats of this SDK, all spelled like the native ones (`qr_code`, `ean_13`…)
3
- * except `micro_qr`, which the native API does not have. With the engine
4
- * fallback it is still read by the fallback strategies (`Hard` decodes the
5
- * raw frame with every format); without it, see `NativeDetector.create`.
2
+ * Every format of this SDK. The native API spells them the same way
3
+ * (`qr_code`, `ean_13`…) but has no `micro_qr`, and a given browser may lack
4
+ * others (Safari, built on Apple's Vision framework, has no `upc_a`).
6
5
  */
7
- const NATIVE_FORMATS = [
6
+ const ALL_FORMATS = [
8
7
  'qr_code',
8
+ 'micro_qr',
9
9
  'data_matrix',
10
10
  'aztec',
11
11
  'pdf417',
@@ -22,27 +22,39 @@ const NATIVE_FORMATS = [
22
22
  /** Native decoder serving one reader configuration. */
23
23
  export class NativeDetector {
24
24
  constructor(detector,
25
- /** Formats the detector looks for. */
26
- formats) {
25
+ /** Requested formats the detector reads. */
26
+ formats,
27
+ /**
28
+ * Requested formats the native decoder cannot read. They are read only
29
+ * with `processing.engineFallback`.
30
+ */
31
+ missing,
32
+ /** UPC-A codes come back as EAN-13 and are converted (see `create`). */
33
+ upcFromEan) {
27
34
  this.detector = detector;
28
35
  this.formats = formats;
36
+ this.missing = missing;
37
+ this.upcFromEan = upcFromEan;
29
38
  }
30
39
  /**
31
- * A detector for `formats` (default: all), or `undefined` when the native
32
- * decoder cannot replace the engine's fast path: API absent, or one of the
33
- * requested formats not supported natively (codes of that format would
34
- * then be read by the slow fallbacks at best).
40
+ * A detector for `formats` (default: all), or `undefined` when the engine
41
+ * must keep the job: API absent, no requested format readable natively, or
42
+ * an **explicit** list naming a format the native decoder lacks while
43
+ * `engineFallback` is off (a format the application asked for must not be
44
+ * dropped silently). With the default list, missing formats (always
45
+ * `micro_qr`, sometimes others) are accepted: the native decoder reads the
46
+ * rest, and the missing ones are read only with `engineFallback`. The
47
+ * engine fallback never turns itself on: it costs CPU and battery, that is
48
+ * the application's call.
35
49
  *
36
- * `micro_qr`, absent from the native API: with `engineFallback` the
37
- * fallbacks read it. Without, a list that names it explicitly keeps the
38
- * engine (the application asked for it, it must not be lost silently),
39
- * while the default list (every format) accepts not reading it.
50
+ * UPC-A is EAN-13 with a leading `0` (GTIN-12 inside GTIN-13), so a native
51
+ * decoder without `upc_a` but with `ean_13` covers it: it is asked for
52
+ * EAN-13 and those codes are reported as UPC-A, as this SDK's engine (and
53
+ * ZXing) do when UPC-A is requested.
40
54
  */
41
55
  static async create(formats, api = nativeApi(), engineFallback = false) {
42
56
  if (!api)
43
57
  return undefined;
44
- if (!engineFallback && formats?.includes('micro_qr'))
45
- return undefined;
46
58
  let supported;
47
59
  try {
48
60
  supported = await api.getSupportedFormats();
@@ -50,14 +62,20 @@ export class NativeDetector {
50
62
  catch {
51
63
  return undefined;
52
64
  }
65
+ const explicit = formats !== undefined && formats.length > 0;
66
+ const requested = explicit ? formats : ALL_FORMATS;
67
+ const upcFromEan = requested.includes('upc_a') && !supported.includes('upc_a') && supported.includes('ean_13');
68
+ const covered = (f) => supported.includes(f) || (f === 'upc_a' && upcFromEan);
69
+ const readable = requested.filter(covered);
70
+ const missing = requested.filter((f) => !covered(f));
53
71
  // On Android the list is empty until Google Play Services has downloaded
54
72
  // its barcode module (first use on the device, in the background): the
55
73
  // detector is unavailable *for now*, the engine does the whole job.
56
- const wanted = (formats?.length ? formats : NATIVE_FORMATS).filter((f) => f !== 'micro_qr');
57
- if (wanted.length === 0 || !wanted.every((f) => supported.includes(f)))
74
+ if (readable.length === 0 || (explicit && missing.length > 0 && !engineFallback))
58
75
  return undefined;
76
+ const native = readable.map((f) => (f === 'upc_a' && upcFromEan ? 'ean_13' : f));
59
77
  try {
60
- return new NativeDetector(new api({ formats: [...wanted] }), wanted);
78
+ return new NativeDetector(new api({ formats: [...new Set(native)] }), readable, missing, upcFromEan);
61
79
  }
62
80
  catch {
63
81
  return undefined;
@@ -72,13 +90,18 @@ export class NativeDetector {
72
90
  const found = await this.detector.detect(source);
73
91
  const timestamp = Date.now();
74
92
  return found.flatMap((code) => {
75
- const format = code.format;
93
+ let format = code.format;
94
+ let text = code.rawValue;
95
+ if (this.upcFromEan && format === 'ean_13' && /^0\d{12}$/.test(text)) {
96
+ format = 'upc_a';
97
+ text = text.slice(1);
98
+ }
76
99
  if (!this.formats.includes(format) || code.cornerPoints.length === 0)
77
100
  return [];
78
101
  if (!contains(rect, center(code.cornerPoints)))
79
102
  return [];
80
103
  const points = code.cornerPoints.map((p) => ({ x: p.x, y: p.y }));
81
- return [{ text: code.rawValue, format, points, timestamp }];
104
+ return [{ text, format, points, timestamp }];
82
105
  });
83
106
  }
84
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -109,22 +109,25 @@ export interface ProcessingOptions {
109
109
  backend?: 'auto' | 'webgl' | 'canvas';
110
110
  /**
111
111
  * Use the browser's native `BarcodeDetector` (Chrome on Android, macOS and
112
- * ChromeOS) as the fast pass, when it supports every requested format
113
- * (`micro_qr` excepted). The engine's fallback strategies keep running on
114
- * the frames it finds nothing in: hard codes (laser engraving, shadows…)
115
- * are still read. Codes get the same confirmation and de-duplication.
116
- * It reads codes whatever their orientation. Elsewhere (Safari, Firefox,
117
- * Chrome on Windows / Linux), or if it fails, the engine does everything.
118
- * `'off'`: always the engine alone. Default: `'auto'`.
112
+ * ChromeOS; Safari when its Shape Detection API is enabled): it reads codes
113
+ * whatever their orientation, and the engine's workers stay idle. Codes get
114
+ * the same confirmation and de-duplication.
115
+ *
116
+ * Formats it lacks (`micro_qr` always, others depending on the browser)
117
+ * are read only with `engineFallback`. With the default `formats` list
118
+ * they are accepted as unread; with an explicit list, one of them keeps
119
+ * the engine instead (a requested format is never dropped silently).
120
+ * Elsewhere (Safari without the API, Firefox, Chrome on Windows / Linux),
121
+ * or if it fails, the engine does everything. `'off'`: always the engine
122
+ * alone. Default: `'auto'`.
119
123
  */
120
124
  nativeDetector?: 'auto' | 'off';
121
125
  /**
122
126
  * With the native detector: while it finds nothing, also hand a frame to
123
127
  * the engine's fallback strategies from time to time (~3 per second), a
124
- * safety net for codes the native decoder may miss (laser engraving,
125
- * shadows, light-on-dark codes, `micro_qr`). Costs a little CPU and
126
- * battery. Without it, `micro_qr` listed in `formats` keeps the engine
127
- * instead of the native detector. Default: `false`.
128
+ * safety net for codes it misses (laser engraving, shadows, light-on-dark
129
+ * codes) and for the formats it lacks. Costs a little CPU and battery, so
130
+ * it is never turned on implicitly. Default: `false`.
128
131
  */
129
132
  engineFallback?: boolean;
130
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gueshbzh-perso/scanner",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "description": "Fast QR code & barcode scanning for the web: camera, WebGL frame pipeline, Web Worker and Rust/WebAssembly decoder.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/native.ts CHANGED
@@ -31,13 +31,13 @@ export interface BarcodeDetectorClass {
31
31
  }
32
32
 
33
33
  /**
34
- * Formats of this SDK, all spelled like the native ones (`qr_code`, `ean_13`…)
35
- * except `micro_qr`, which the native API does not have. With the engine
36
- * fallback it is still read by the fallback strategies (`Hard` decodes the
37
- * raw frame with every format); without it, see `NativeDetector.create`.
34
+ * Every format of this SDK. The native API spells them the same way
35
+ * (`qr_code`, `ean_13`…) but has no `micro_qr`, and a given browser may lack
36
+ * others (Safari, built on Apple's Vision framework, has no `upc_a`).
38
37
  */
39
- const NATIVE_FORMATS: readonly BarcodeFormat[] = [
38
+ const ALL_FORMATS: readonly BarcodeFormat[] = [
40
39
  'qr_code',
40
+ 'micro_qr',
41
41
  'data_matrix',
42
42
  'aztec',
43
43
  'pdf417',
@@ -56,20 +56,32 @@ const NATIVE_FORMATS: readonly BarcodeFormat[] = [
56
56
  export class NativeDetector {
57
57
  private constructor(
58
58
  private detector: BarcodeDetectorInstance,
59
- /** Formats the detector looks for. */
59
+ /** Requested formats the detector reads. */
60
60
  readonly formats: readonly BarcodeFormat[],
61
+ /**
62
+ * Requested formats the native decoder cannot read. They are read only
63
+ * with `processing.engineFallback`.
64
+ */
65
+ readonly missing: readonly BarcodeFormat[],
66
+ /** UPC-A codes come back as EAN-13 and are converted (see `create`). */
67
+ private upcFromEan: boolean,
61
68
  ) {}
62
69
 
63
70
  /**
64
- * A detector for `formats` (default: all), or `undefined` when the native
65
- * decoder cannot replace the engine's fast path: API absent, or one of the
66
- * requested formats not supported natively (codes of that format would
67
- * then be read by the slow fallbacks at best).
71
+ * A detector for `formats` (default: all), or `undefined` when the engine
72
+ * must keep the job: API absent, no requested format readable natively, or
73
+ * an **explicit** list naming a format the native decoder lacks while
74
+ * `engineFallback` is off (a format the application asked for must not be
75
+ * dropped silently). With the default list, missing formats (always
76
+ * `micro_qr`, sometimes others) are accepted: the native decoder reads the
77
+ * rest, and the missing ones are read only with `engineFallback`. The
78
+ * engine fallback never turns itself on: it costs CPU and battery, that is
79
+ * the application's call.
68
80
  *
69
- * `micro_qr`, absent from the native API: with `engineFallback` the
70
- * fallbacks read it. Without, a list that names it explicitly keeps the
71
- * engine (the application asked for it, it must not be lost silently),
72
- * while the default list (every format) accepts not reading it.
81
+ * UPC-A is EAN-13 with a leading `0` (GTIN-12 inside GTIN-13), so a native
82
+ * decoder without `upc_a` but with `ean_13` covers it: it is asked for
83
+ * EAN-13 and those codes are reported as UPC-A, as this SDK's engine (and
84
+ * ZXing) do when UPC-A is requested.
73
85
  */
74
86
  static async create(
75
87
  formats: readonly BarcodeFormat[] | undefined,
@@ -77,20 +89,26 @@ export class NativeDetector {
77
89
  engineFallback = false,
78
90
  ): Promise<NativeDetector | undefined> {
79
91
  if (!api) return undefined;
80
- if (!engineFallback && formats?.includes('micro_qr')) return undefined;
81
92
  let supported: string[];
82
93
  try {
83
94
  supported = await api.getSupportedFormats();
84
95
  } catch {
85
96
  return undefined;
86
97
  }
98
+ const explicit = formats !== undefined && formats.length > 0;
99
+ const requested = explicit ? formats : ALL_FORMATS;
100
+ const upcFromEan =
101
+ requested.includes('upc_a') && !supported.includes('upc_a') && supported.includes('ean_13');
102
+ const covered = (f: BarcodeFormat) => supported.includes(f) || (f === 'upc_a' && upcFromEan);
103
+ const readable = requested.filter(covered);
104
+ const missing = requested.filter((f) => !covered(f));
87
105
  // On Android the list is empty until Google Play Services has downloaded
88
106
  // its barcode module (first use on the device, in the background): the
89
107
  // detector is unavailable *for now*, the engine does the whole job.
90
- const wanted = (formats?.length ? formats : NATIVE_FORMATS).filter((f) => f !== 'micro_qr');
91
- if (wanted.length === 0 || !wanted.every((f) => supported.includes(f))) return undefined;
108
+ if (readable.length === 0 || (explicit && missing.length > 0 && !engineFallback)) return undefined;
109
+ const native = readable.map((f) => (f === 'upc_a' && upcFromEan ? 'ean_13' : f));
92
110
  try {
93
- return new NativeDetector(new api({ formats: [...wanted] }), wanted);
111
+ return new NativeDetector(new api({ formats: [...new Set(native)] }), readable, missing, upcFromEan);
94
112
  } catch {
95
113
  return undefined;
96
114
  }
@@ -105,11 +123,16 @@ export class NativeDetector {
105
123
  const found = await this.detector.detect(source);
106
124
  const timestamp = Date.now();
107
125
  return found.flatMap((code) => {
108
- const format = code.format as BarcodeFormat;
126
+ let format = code.format as BarcodeFormat;
127
+ let text = code.rawValue;
128
+ if (this.upcFromEan && format === 'ean_13' && /^0\d{12}$/.test(text)) {
129
+ format = 'upc_a';
130
+ text = text.slice(1);
131
+ }
109
132
  if (!this.formats.includes(format) || code.cornerPoints.length === 0) return [];
110
133
  if (!contains(rect, center(code.cornerPoints))) return [];
111
134
  const points = code.cornerPoints.map((p) => ({ x: p.x, y: p.y }));
112
- return [{ text: code.rawValue, format, points, timestamp }];
135
+ return [{ text, format, points, timestamp }];
113
136
  });
114
137
  }
115
138
  }
package/src/types.ts CHANGED
@@ -120,22 +120,25 @@ export interface ProcessingOptions {
120
120
  backend?: 'auto' | 'webgl' | 'canvas';
121
121
  /**
122
122
  * Use the browser's native `BarcodeDetector` (Chrome on Android, macOS and
123
- * ChromeOS) as the fast pass, when it supports every requested format
124
- * (`micro_qr` excepted). The engine's fallback strategies keep running on
125
- * the frames it finds nothing in: hard codes (laser engraving, shadows…)
126
- * are still read. Codes get the same confirmation and de-duplication.
127
- * It reads codes whatever their orientation. Elsewhere (Safari, Firefox,
128
- * Chrome on Windows / Linux), or if it fails, the engine does everything.
129
- * `'off'`: always the engine alone. Default: `'auto'`.
123
+ * ChromeOS; Safari when its Shape Detection API is enabled): it reads codes
124
+ * whatever their orientation, and the engine's workers stay idle. Codes get
125
+ * the same confirmation and de-duplication.
126
+ *
127
+ * Formats it lacks (`micro_qr` always, others depending on the browser)
128
+ * are read only with `engineFallback`. With the default `formats` list
129
+ * they are accepted as unread; with an explicit list, one of them keeps
130
+ * the engine instead (a requested format is never dropped silently).
131
+ * Elsewhere (Safari without the API, Firefox, Chrome on Windows / Linux),
132
+ * or if it fails, the engine does everything. `'off'`: always the engine
133
+ * alone. Default: `'auto'`.
130
134
  */
131
135
  nativeDetector?: 'auto' | 'off';
132
136
  /**
133
137
  * With the native detector: while it finds nothing, also hand a frame to
134
138
  * the engine's fallback strategies from time to time (~3 per second), a
135
- * safety net for codes the native decoder may miss (laser engraving,
136
- * shadows, light-on-dark codes, `micro_qr`). Costs a little CPU and
137
- * battery. Without it, `micro_qr` listed in `formats` keeps the engine
138
- * instead of the native detector. Default: `false`.
139
+ * safety net for codes it misses (laser engraving, shadows, light-on-dark
140
+ * codes) and for the formats it lacks. Costs a little CPU and battery, so
141
+ * it is never turned on implicitly. Default: `false`.
139
142
  */
140
143
  engineFallback?: boolean;
141
144
  }