persagy-vant 0.0.53 → 0.0.54

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 (46) hide show
  1. package/es/index.d.ts +1 -1
  2. package/es/index.mjs +1 -1
  3. package/es/locale/lang/en-US.d.ts +9 -0
  4. package/es/locale/lang/en-US.mjs +9 -0
  5. package/es/locale/lang/zh-CN.d.ts +9 -0
  6. package/es/locale/lang/zh-CN.mjs +9 -0
  7. package/es/locale/lang/zh-TW.d.ts +9 -0
  8. package/es/locale/lang/zh-TW.mjs +9 -0
  9. package/es/qr-scanner/QrScanner.d.ts +18 -1
  10. package/es/qr-scanner/QrScanner.mjs +141 -18
  11. package/es/qr-scanner/decoder.d.ts +3 -3
  12. package/es/qr-scanner/decoder.mjs +99 -27
  13. package/es/qr-scanner/function-call.d.ts +13 -1
  14. package/es/qr-scanner/function-call.mjs +5 -0
  15. package/es/qr-scanner/index.d.ts +1 -1
  16. package/es/qr-scanner/startup.d.ts +3 -0
  17. package/es/qr-scanner/startup.mjs +33 -0
  18. package/es/qr-scanner/types.d.ts +16 -1
  19. package/lib/{decoder-8f5b00db.js → decoder-03a4b162.js} +112 -34
  20. package/lib/{decoder-a36ba9ae.mjs → decoder-9637718d.mjs} +112 -34
  21. package/lib/index-d68a26ab.mjs +22968 -0
  22. package/lib/index-ea574b22.js +22967 -0
  23. package/lib/index.d.ts +1 -1
  24. package/lib/index.js +1 -1
  25. package/lib/locale/lang/en-US.d.ts +9 -0
  26. package/lib/locale/lang/en-US.js +9 -0
  27. package/lib/locale/lang/zh-CN.d.ts +9 -0
  28. package/lib/locale/lang/zh-CN.js +9 -0
  29. package/lib/locale/lang/zh-TW.d.ts +9 -0
  30. package/lib/locale/lang/zh-TW.js +9 -0
  31. package/lib/qr-scanner/QrScanner.d.ts +18 -1
  32. package/lib/qr-scanner/QrScanner.js +141 -18
  33. package/lib/qr-scanner/decoder.d.ts +3 -3
  34. package/lib/qr-scanner/decoder.js +94 -26
  35. package/lib/qr-scanner/function-call.d.ts +13 -1
  36. package/lib/qr-scanner/function-call.js +5 -0
  37. package/lib/qr-scanner/index.d.ts +1 -1
  38. package/lib/qr-scanner/startup.d.ts +3 -0
  39. package/lib/qr-scanner/startup.js +52 -0
  40. package/lib/qr-scanner/types.d.ts +16 -1
  41. package/lib/vant.cjs.js +131 -22802
  42. package/lib/vant.es.js +131 -22802
  43. package/lib/vant.js +372 -137
  44. package/lib/vant.min.js +1 -1
  45. package/lib/web-types.json +1 -1
  46. package/package.json +1 -1
@@ -17,6 +17,11 @@ declare const QrScanner: {
17
17
  type: import("vue").PropType<string>;
18
18
  default: string;
19
19
  };
20
+ startupTimeout: {
21
+ type: (NumberConstructor | StringConstructor)[];
22
+ default: number;
23
+ };
24
+ startupTexts: import("vue").PropType<Partial<Record<"camera" | "preview" | "decoder", string>>>;
20
25
  formats: {
21
26
  type: import("vue").PropType<import("./types").QrScannerFormat[]>;
22
27
  default: () => never[];
@@ -68,7 +73,7 @@ declare const QrScanner: {
68
73
  type: BooleanConstructor;
69
74
  default: true;
70
75
  };
71
- }, () => JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("close" | "error" | "closed" | "update:show" | "cancel" | "scan" | "ready")[], "close" | "error" | "closed" | "update:show" | "cancel" | "scan" | "ready", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
76
+ }, () => JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("close" | "error" | "closed" | "update:show" | "cancel" | "scan" | "ready" | "stageChange")[], "close" | "error" | "closed" | "update:show" | "cancel" | "scan" | "ready" | "stageChange", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
72
77
  show: BooleanConstructor;
73
78
  title: {
74
79
  type: import("vue").PropType<string>;
@@ -82,6 +87,11 @@ declare const QrScanner: {
82
87
  type: import("vue").PropType<string>;
83
88
  default: string;
84
89
  };
90
+ startupTimeout: {
91
+ type: (NumberConstructor | StringConstructor)[];
92
+ default: number;
93
+ };
94
+ startupTexts: import("vue").PropType<Partial<Record<"camera" | "preview" | "decoder", string>>>;
85
95
  formats: {
86
96
  type: import("vue").PropType<import("./types").QrScannerFormat[]>;
87
97
  default: () => never[];
@@ -141,6 +151,7 @@ declare const QrScanner: {
141
151
  onCancel?: ((...args: any[]) => any) | undefined;
142
152
  onScan?: ((...args: any[]) => any) | undefined;
143
153
  onReady?: ((...args: any[]) => any) | undefined;
154
+ onStageChange?: ((...args: any[]) => any) | undefined;
144
155
  }, {
145
156
  title: string;
146
157
  show: boolean;
@@ -149,6 +160,7 @@ declare const QrScanner: {
149
160
  closeOnPopstate: boolean;
150
161
  tip: string;
151
162
  processingText: string;
163
+ startupTimeout: string | number;
152
164
  formats: import("./types").QrScannerFormat[];
153
165
  facingMode: "environment" | "user";
154
166
  showAlbum: boolean;
@@ -3,11 +3,14 @@ import { extend, inBrowser, withInstall } from "../utils/index.mjs";
3
3
  import { mountComponent, usePopupState } from "../utils/mount-component.mjs";
4
4
  import { useExpose } from "../composables/use-expose.mjs";
5
5
  import VanQrScanner from "./QrScanner.mjs";
6
+ import { DEFAULT_STARTUP_TIMEOUT } from "./startup.mjs";
6
7
  let instance;
7
8
  const defaultOptions = {
8
9
  title: "\u626B\u63CF\u8BBE\u5907\u4E8C\u7EF4\u7801",
9
10
  tip: "\u5C06\u8BBE\u5907\u4E8C\u7EF4\u7801\u7F6E\u4E8E\u53D6\u666F\u6846\u5185\uFF0C\u5373\u53EF\u81EA\u52A8\u8BC6\u522B",
10
11
  processingText: "\u6B63\u5728\u5904\u7406\u626B\u7801\u7ED3\u679C...",
12
+ startupTimeout: DEFAULT_STARTUP_TIMEOUT,
13
+ startupTexts: void 0,
11
14
  formats: ["QRCode"],
12
15
  facingMode: "environment",
13
16
  showAlbum: true,
@@ -26,6 +29,8 @@ const defaultOptions = {
26
29
  closeOnPopstate: true,
27
30
  onScan: void 0,
28
31
  onError: void 0,
32
+ onStageChange: void 0,
33
+ onReady: void 0,
29
34
  onCancel: void 0,
30
35
  onClose: void 0
31
36
  };
@@ -2,7 +2,7 @@ import { QrScanner } from './function-call';
2
2
  export default QrScanner;
3
3
  export { QrScanner };
4
4
  export type { QrScannerProps } from './QrScanner';
5
- export type { QrScannerBeforeConfirm, QrScannerError, QrScannerErrorCode, QrScannerExpose, QrScannerFormat, QrScannerInstance, QrScannerNativeScan, QrScannerOptions, QrScannerResult, } from './types';
5
+ export type { QrScannerBeforeConfirm, QrScannerError, QrScannerErrorCode, QrScannerExpose, QrScannerFormat, QrScannerInstance, QrScannerNativeScan, QrScannerOptions, QrScannerResult, QrScannerStageChange, QrScannerStartupStage, QrScannerStartupTexts, } from './types';
6
6
  declare module 'vue' {
7
7
  interface GlobalComponents {
8
8
  VanQrScanner: typeof QrScanner.Component;
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_STARTUP_TIMEOUT = 15000;
2
+ export declare function abortError(): Error;
3
+ export declare function waitForAbort<T>(task: Promise<T>, signal?: AbortSignal): Promise<T>;
@@ -0,0 +1,33 @@
1
+ const DEFAULT_STARTUP_TIMEOUT = 15e3;
2
+ function abortError() {
3
+ const error = new Error("Scanner startup cancelled");
4
+ error.name = "AbortError";
5
+ return error;
6
+ }
7
+ function waitForAbort(task, signal) {
8
+ return new Promise((resolve, reject) => {
9
+ const onAbort = () => {
10
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
11
+ reject(abortError());
12
+ };
13
+ if (signal == null ? void 0 : signal.aborted)
14
+ onAbort();
15
+ else
16
+ signal == null ? void 0 : signal.addEventListener("abort", onAbort, { once: true });
17
+ task.then(
18
+ (value) => {
19
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
20
+ resolve(value);
21
+ },
22
+ (error) => {
23
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
24
+ reject(error);
25
+ }
26
+ );
27
+ });
28
+ }
29
+ export {
30
+ DEFAULT_STARTUP_TIMEOUT,
31
+ abortError,
32
+ waitForAbort
33
+ };
@@ -6,11 +6,20 @@ export declare type QrScannerResult = {
6
6
  format: string;
7
7
  source: 'camera' | 'image' | 'native';
8
8
  };
9
- export declare type QrScannerErrorCode = 'INSECURE_CONTEXT' | 'CAMERA_UNSUPPORTED' | 'CAMERA_PERMISSION_DENIED' | 'CAMERA_NOT_FOUND' | 'CAMERA_UNAVAILABLE' | 'DECODER_LOAD_FAILED' | 'DECODE_FAILED' | 'IMAGE_TOO_LARGE' | 'IMAGE_NOT_FOUND' | 'CONFIRM_FAILED' | 'NATIVE_SCAN_FAILED' | 'TORCH_UNAVAILABLE';
9
+ export declare type QrScannerStartupStage = 'camera' | 'preview' | 'decoder' | 'ready';
10
+ export declare type QrScannerStartupTexts = Partial<Record<Exclude<QrScannerStartupStage, 'ready'>, string>>;
11
+ export declare type QrScannerStageChange = {
12
+ stage: QrScannerStartupStage;
13
+ /** Milliseconds since this H5 startup attempt began. */
14
+ elapsedMs: number;
15
+ };
16
+ export declare type QrScannerErrorCode = 'INSECURE_CONTEXT' | 'CAMERA_UNSUPPORTED' | 'CAMERA_PERMISSION_DENIED' | 'CAMERA_NOT_FOUND' | 'CAMERA_UNAVAILABLE' | 'PREVIEW_FAILED' | 'STARTUP_TIMEOUT' | 'DECODER_LOAD_FAILED' | 'DECODE_FAILED' | 'IMAGE_TOO_LARGE' | 'IMAGE_NOT_FOUND' | 'CONFIRM_FAILED' | 'NATIVE_SCAN_FAILED' | 'TORCH_UNAVAILABLE';
10
17
  export declare type QrScannerError = {
11
18
  code: QrScannerErrorCode;
12
19
  message: string;
13
20
  cause?: unknown;
21
+ stage?: QrScannerStartupStage;
22
+ elapsedMs?: number;
14
23
  };
15
24
  export declare type QrScannerBeforeConfirm = (result: QrScannerResult) => boolean | void | Promise<boolean | void>;
16
25
  export declare type QrScannerNativeScan = (options: {
@@ -24,6 +33,8 @@ export declare type QrScannerOptions = {
24
33
  title?: string;
25
34
  tip?: string;
26
35
  processingText?: string;
36
+ startupTimeout?: number | string;
37
+ startupTexts?: QrScannerStartupTexts;
27
38
  formats?: QrScannerFormat[];
28
39
  facingMode?: 'environment' | 'user';
29
40
  showAlbum?: boolean;
@@ -42,6 +53,10 @@ export declare type QrScannerOptions = {
42
53
  closeOnPopstate?: boolean;
43
54
  onScan?: (result: QrScannerResult) => void;
44
55
  onError?: (error: QrScannerError) => void;
56
+ onStageChange?: (info: QrScannerStageChange) => void;
57
+ onReady?: (info: {
58
+ torch: boolean;
59
+ }) => void;
45
60
  onCancel?: () => void;
46
61
  onClose?: () => void;
47
62
  };
@@ -1,5 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const index = require("./index-ea574b22.js");
4
+ require("vue");
5
+ require("@vant/use");
6
+ require("@vant/popperjs");
7
+ require("plyr");
3
8
  var e = [
4
9
  [
5
10
  "All",
@@ -548,6 +553,9 @@ function J(e2) {
548
553
  }
549
554
  (c == null ? n(a, s) : c) || K.set(e2, [s]);
550
555
  }
556
+ function Y(e2) {
557
+ K.delete(e2);
558
+ }
551
559
  async function X(e2, t2) {
552
560
  let n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : I, r = {
553
561
  ...I,
@@ -644,12 +652,12 @@ async function b() {
644
652
  var e3;
645
653
  if (!(y2 != null && (e3 = y2.buffer) != null && e3.resizable)) {
646
654
  var t3 = te();
647
- y2 = new Int8Array(t3), Ht = new Int16Array(t3), i.HEAPU8 = I2 = new Uint8Array(t3), Y = new Uint16Array(t3), Ut = new Int32Array(t3), E2 = new Uint32Array(t3), Lt = new Float32Array(t3), Rt = new Float64Array(t3);
655
+ y2 = new Int8Array(t3), Ht = new Int16Array(t3), i.HEAPU8 = I2 = new Uint8Array(t3), Y2 = new Uint16Array(t3), Ut = new Int32Array(t3), E2 = new Uint32Array(t3), Lt = new Float32Array(t3), Rt = new Float64Array(t3);
648
656
  }
649
657
  }
650
658
  function re() {
651
659
  var e3 = i.preRun;
652
- e3 && (typeof e3 == "function" && (e3 = [e3]), ge.push(...e3)), b2(ge);
660
+ e3 && (typeof e3 == "function" && (e3 = [e3]), ge2.push(...e3)), b2(ge2);
653
661
  }
654
662
  function ie() {
655
663
  Rr.ra();
@@ -723,7 +731,7 @@ async function b() {
723
731
  var y2, b2 = (e3) => {
724
732
  for (; e3.length > 0; )
725
733
  e3.shift()(i);
726
- }, x2 = [], ge = [], _e = true, S = (e3) => Yn(e3), C2 = () => Zn(), ve = [], w2 = (e3) => {
734
+ }, x2 = [], ge2 = [], _e = true, S = (e3) => Yn(e3), C2 = () => Zn(), ve = [], w2 = (e3) => {
727
735
  var t3 = ve[e3];
728
736
  return t3 || (ve[e3] = t3 = rr.get(e3)), t3;
729
737
  }, ye = (e3, t3) => w2(e3)(t3), T = [], be = 0, E2;
@@ -1364,12 +1372,12 @@ async function b() {
1364
1372
  var r3 = [n3[0], null].concat(n3.slice(1));
1365
1373
  return _t(e3, Ot(e3, r3, null, i2, a2, o2), t3 - 1), [];
1366
1374
  });
1367
- }, Ht, Y, Ut, Wt = (e3, t3, n2) => {
1375
+ }, Ht, Y2, Ut, Wt = (e3, t3, n2) => {
1368
1376
  switch (t3) {
1369
1377
  case 1:
1370
1378
  return n2 ? (e4) => y2[e4] : (e4) => I2[e4];
1371
1379
  case 2:
1372
- return n2 ? (e4) => Ht[e4 >> 1] : (e4) => Y[e4 >> 1];
1380
+ return n2 ? (e4) => Ht[e4 >> 1] : (e4) => Y2[e4 >> 1];
1373
1381
  case 4:
1374
1382
  return n2 ? (e4) => Ut[e4 >> 2] : (e4) => E2[e4 >> 2];
1375
1383
  default:
@@ -1526,11 +1534,11 @@ async function b() {
1526
1534
  }
1527
1535
  });
1528
1536
  }, on = globalThis.TextDecoder ? new TextDecoder("utf-16le") : void 0, sn = (e3, t3, n2) => {
1529
- var r2 = e3 >> 1, i2 = tn(Y, r2, t3 / 2, n2);
1537
+ var r2 = e3 >> 1, i2 = tn(Y2, r2, t3 / 2, n2);
1530
1538
  if (i2 - r2 > 16 && on)
1531
- return on.decode(Y.subarray(r2, i2));
1539
+ return on.decode(Y2.subarray(r2, i2));
1532
1540
  for (var a2 = "", o2 = r2; o2 < i2; ++o2) {
1533
- var s2 = Y[o2];
1541
+ var s2 = Y2[o2];
1534
1542
  a2 += String.fromCharCode(s2);
1535
1543
  }
1536
1544
  return a2;
@@ -2112,6 +2120,9 @@ async function b() {
2112
2120
  function x(e2) {
2113
2121
  return J(b, e2);
2114
2122
  }
2123
+ function ge() {
2124
+ return Y(b);
2125
+ }
2115
2126
  async function C(e2, t2) {
2116
2127
  return X(b, e2, t2);
2117
2128
  }
@@ -2135,47 +2146,114 @@ var __async = (__this, __arguments, generator) => {
2135
2146
  step((generator = generator.apply(__this, __arguments)).next());
2136
2147
  });
2137
2148
  };
2138
- let ready;
2139
- let activeWasmUrl;
2140
- function prepareDecoder(wasmUrl) {
2141
- return __async(this, null, function* () {
2149
+ let preparation;
2150
+ function invalidate(entry) {
2151
+ if (preparation === entry) {
2152
+ preparation = void 0;
2153
+ ge();
2154
+ }
2155
+ }
2156
+ function createPreparation(wasmUrl) {
2157
+ const controller = new AbortController();
2158
+ const entry = {
2159
+ wasmUrl,
2160
+ pending: true,
2161
+ controller,
2162
+ consumers: /* @__PURE__ */ new Set(),
2163
+ promise: void 0
2164
+ };
2165
+ const initialize = () => __async(this, null, function* () {
2142
2166
  const url = wasmUrl || (yield Promise.resolve().then(() => require("./zxing_reader-d6a2742e.js"))).default;
2143
- if (!ready || url !== activeWasmUrl) {
2144
- activeWasmUrl = url;
2145
- ready = Promise.resolve(
2146
- x({
2147
- overrides: { locateFile: () => url },
2148
- fireImmediately: true
2149
- })
2150
- ).catch((error) => {
2151
- ready = void 0;
2152
- throw error;
2153
- });
2167
+ if (controller.signal.aborted || preparation !== entry)
2168
+ throw index.abortError();
2169
+ yield x({
2170
+ overrides: { locateFile: () => url },
2171
+ fireImmediately: true
2172
+ });
2173
+ });
2174
+ entry.promise = index.waitForAbort(
2175
+ Promise.resolve().then(initialize),
2176
+ controller.signal
2177
+ ).then(
2178
+ () => {
2179
+ entry.pending = false;
2180
+ },
2181
+ (error) => {
2182
+ entry.pending = false;
2183
+ invalidate(entry);
2184
+ throw error;
2185
+ }
2186
+ );
2187
+ return entry;
2188
+ }
2189
+ function prepareDecoder(wasmUrl, signal) {
2190
+ return __async(this, null, function* () {
2191
+ if (signal == null ? void 0 : signal.aborted)
2192
+ throw index.abortError();
2193
+ if (!preparation || preparation.wasmUrl !== wasmUrl) {
2194
+ preparation = createPreparation(wasmUrl);
2195
+ }
2196
+ const entry = preparation;
2197
+ const consumer = Symbol("decoder-consumer");
2198
+ entry.consumers.add(consumer);
2199
+ const releaseConsumer = () => {
2200
+ entry.consumers.delete(consumer);
2201
+ if (entry.pending && !entry.consumers.size) {
2202
+ invalidate(entry);
2203
+ entry.controller.abort();
2204
+ }
2205
+ };
2206
+ signal == null ? void 0 : signal.addEventListener("abort", releaseConsumer, { once: true });
2207
+ try {
2208
+ yield index.waitForAbort(entry.promise, signal);
2209
+ } finally {
2210
+ signal == null ? void 0 : signal.removeEventListener("abort", releaseConsumer);
2211
+ releaseConsumer();
2154
2212
  }
2155
- yield ready;
2156
2213
  });
2157
2214
  }
2158
- function decode(image, formats, wasmUrl) {
2215
+ function decode(image, formats, wasmUrl, signal) {
2159
2216
  return __async(this, null, function* () {
2160
- yield prepareDecoder(wasmUrl);
2161
- const results = yield C(image, {
2162
- formats: formats.length ? formats : ["QRCode"],
2163
- tryHarder: true,
2164
- maxNumberOfSymbols: 1
2165
- });
2217
+ yield prepareDecoder(wasmUrl, signal);
2218
+ if (signal == null ? void 0 : signal.aborted)
2219
+ throw index.abortError();
2220
+ const results = yield index.waitForAbort(
2221
+ C(image, {
2222
+ formats: formats.length ? formats : ["QRCode"],
2223
+ tryHarder: true,
2224
+ maxNumberOfSymbols: 1
2225
+ }),
2226
+ signal
2227
+ );
2166
2228
  return results.find((result) => result.isValid && result.text.length > 0);
2167
2229
  });
2168
2230
  }
2169
- function loadImage(file) {
2231
+ function loadImage(file, signal) {
2170
2232
  return new Promise((resolve, reject) => {
2233
+ if (signal == null ? void 0 : signal.aborted) {
2234
+ reject(index.abortError());
2235
+ return;
2236
+ }
2171
2237
  const url = URL.createObjectURL(file);
2172
2238
  const image = new Image();
2173
- image.onload = () => {
2239
+ const cleanup = () => {
2174
2240
  URL.revokeObjectURL(url);
2241
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
2242
+ image.onload = null;
2243
+ image.onerror = null;
2244
+ };
2245
+ const onAbort = () => {
2246
+ cleanup();
2247
+ image.src = "";
2248
+ reject(index.abortError());
2249
+ };
2250
+ signal == null ? void 0 : signal.addEventListener("abort", onAbort, { once: true });
2251
+ image.onload = () => {
2252
+ cleanup();
2175
2253
  resolve(image);
2176
2254
  };
2177
2255
  image.onerror = () => {
2178
- URL.revokeObjectURL(url);
2256
+ cleanup();
2179
2257
  reject(new Error("无法读取图片,请选择 JPG、PNG 等浏览器支持的图片"));
2180
2258
  };
2181
2259
  image.src = url;
@@ -1,3 +1,8 @@
1
+ import { a as abortError, w as waitForAbort } from "./index-d68a26ab.mjs";
2
+ import "vue";
3
+ import "@vant/use";
4
+ import "@vant/popperjs";
5
+ import "plyr";
1
6
  var e = [
2
7
  [
3
8
  "All",
@@ -546,6 +551,9 @@ function J(e2) {
546
551
  }
547
552
  (c == null ? n(a, s) : c) || K.set(e2, [s]);
548
553
  }
554
+ function Y(e2) {
555
+ K.delete(e2);
556
+ }
549
557
  async function X(e2, t2) {
550
558
  let n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : I, r = {
551
559
  ...I,
@@ -642,12 +650,12 @@ async function b() {
642
650
  var e3;
643
651
  if (!(y2 != null && (e3 = y2.buffer) != null && e3.resizable)) {
644
652
  var t3 = te();
645
- y2 = new Int8Array(t3), Ht = new Int16Array(t3), i.HEAPU8 = I2 = new Uint8Array(t3), Y = new Uint16Array(t3), Ut = new Int32Array(t3), E2 = new Uint32Array(t3), Lt = new Float32Array(t3), Rt = new Float64Array(t3);
653
+ y2 = new Int8Array(t3), Ht = new Int16Array(t3), i.HEAPU8 = I2 = new Uint8Array(t3), Y2 = new Uint16Array(t3), Ut = new Int32Array(t3), E2 = new Uint32Array(t3), Lt = new Float32Array(t3), Rt = new Float64Array(t3);
646
654
  }
647
655
  }
648
656
  function re() {
649
657
  var e3 = i.preRun;
650
- e3 && (typeof e3 == "function" && (e3 = [e3]), ge.push(...e3)), b2(ge);
658
+ e3 && (typeof e3 == "function" && (e3 = [e3]), ge2.push(...e3)), b2(ge2);
651
659
  }
652
660
  function ie() {
653
661
  Rr.ra();
@@ -721,7 +729,7 @@ async function b() {
721
729
  var y2, b2 = (e3) => {
722
730
  for (; e3.length > 0; )
723
731
  e3.shift()(i);
724
- }, x2 = [], ge = [], _e = true, S = (e3) => Yn(e3), C2 = () => Zn(), ve = [], w2 = (e3) => {
732
+ }, x2 = [], ge2 = [], _e = true, S = (e3) => Yn(e3), C2 = () => Zn(), ve = [], w2 = (e3) => {
725
733
  var t3 = ve[e3];
726
734
  return t3 || (ve[e3] = t3 = rr.get(e3)), t3;
727
735
  }, ye = (e3, t3) => w2(e3)(t3), T = [], be = 0, E2;
@@ -1362,12 +1370,12 @@ async function b() {
1362
1370
  var r3 = [n3[0], null].concat(n3.slice(1));
1363
1371
  return _t(e3, Ot(e3, r3, null, i2, a2, o2), t3 - 1), [];
1364
1372
  });
1365
- }, Ht, Y, Ut, Wt = (e3, t3, n2) => {
1373
+ }, Ht, Y2, Ut, Wt = (e3, t3, n2) => {
1366
1374
  switch (t3) {
1367
1375
  case 1:
1368
1376
  return n2 ? (e4) => y2[e4] : (e4) => I2[e4];
1369
1377
  case 2:
1370
- return n2 ? (e4) => Ht[e4 >> 1] : (e4) => Y[e4 >> 1];
1378
+ return n2 ? (e4) => Ht[e4 >> 1] : (e4) => Y2[e4 >> 1];
1371
1379
  case 4:
1372
1380
  return n2 ? (e4) => Ut[e4 >> 2] : (e4) => E2[e4 >> 2];
1373
1381
  default:
@@ -1524,11 +1532,11 @@ async function b() {
1524
1532
  }
1525
1533
  });
1526
1534
  }, on = globalThis.TextDecoder ? new TextDecoder("utf-16le") : void 0, sn = (e3, t3, n2) => {
1527
- var r2 = e3 >> 1, i2 = tn(Y, r2, t3 / 2, n2);
1535
+ var r2 = e3 >> 1, i2 = tn(Y2, r2, t3 / 2, n2);
1528
1536
  if (i2 - r2 > 16 && on)
1529
- return on.decode(Y.subarray(r2, i2));
1537
+ return on.decode(Y2.subarray(r2, i2));
1530
1538
  for (var a2 = "", o2 = r2; o2 < i2; ++o2) {
1531
- var s2 = Y[o2];
1539
+ var s2 = Y2[o2];
1532
1540
  a2 += String.fromCharCode(s2);
1533
1541
  }
1534
1542
  return a2;
@@ -2110,6 +2118,9 @@ async function b() {
2110
2118
  function x(e2) {
2111
2119
  return J(b, e2);
2112
2120
  }
2121
+ function ge() {
2122
+ return Y(b);
2123
+ }
2113
2124
  async function C(e2, t2) {
2114
2125
  return X(b, e2, t2);
2115
2126
  }
@@ -2133,47 +2144,114 @@ var __async = (__this, __arguments, generator) => {
2133
2144
  step((generator = generator.apply(__this, __arguments)).next());
2134
2145
  });
2135
2146
  };
2136
- let ready;
2137
- let activeWasmUrl;
2138
- function prepareDecoder(wasmUrl) {
2139
- return __async(this, null, function* () {
2147
+ let preparation;
2148
+ function invalidate(entry) {
2149
+ if (preparation === entry) {
2150
+ preparation = void 0;
2151
+ ge();
2152
+ }
2153
+ }
2154
+ function createPreparation(wasmUrl) {
2155
+ const controller = new AbortController();
2156
+ const entry = {
2157
+ wasmUrl,
2158
+ pending: true,
2159
+ controller,
2160
+ consumers: /* @__PURE__ */ new Set(),
2161
+ promise: void 0
2162
+ };
2163
+ const initialize = () => __async(this, null, function* () {
2140
2164
  const url = wasmUrl || (yield import("./zxing_reader-075835e4.mjs")).default;
2141
- if (!ready || url !== activeWasmUrl) {
2142
- activeWasmUrl = url;
2143
- ready = Promise.resolve(
2144
- x({
2145
- overrides: { locateFile: () => url },
2146
- fireImmediately: true
2147
- })
2148
- ).catch((error) => {
2149
- ready = void 0;
2150
- throw error;
2151
- });
2165
+ if (controller.signal.aborted || preparation !== entry)
2166
+ throw abortError();
2167
+ yield x({
2168
+ overrides: { locateFile: () => url },
2169
+ fireImmediately: true
2170
+ });
2171
+ });
2172
+ entry.promise = waitForAbort(
2173
+ Promise.resolve().then(initialize),
2174
+ controller.signal
2175
+ ).then(
2176
+ () => {
2177
+ entry.pending = false;
2178
+ },
2179
+ (error) => {
2180
+ entry.pending = false;
2181
+ invalidate(entry);
2182
+ throw error;
2183
+ }
2184
+ );
2185
+ return entry;
2186
+ }
2187
+ function prepareDecoder(wasmUrl, signal) {
2188
+ return __async(this, null, function* () {
2189
+ if (signal == null ? void 0 : signal.aborted)
2190
+ throw abortError();
2191
+ if (!preparation || preparation.wasmUrl !== wasmUrl) {
2192
+ preparation = createPreparation(wasmUrl);
2193
+ }
2194
+ const entry = preparation;
2195
+ const consumer = Symbol("decoder-consumer");
2196
+ entry.consumers.add(consumer);
2197
+ const releaseConsumer = () => {
2198
+ entry.consumers.delete(consumer);
2199
+ if (entry.pending && !entry.consumers.size) {
2200
+ invalidate(entry);
2201
+ entry.controller.abort();
2202
+ }
2203
+ };
2204
+ signal == null ? void 0 : signal.addEventListener("abort", releaseConsumer, { once: true });
2205
+ try {
2206
+ yield waitForAbort(entry.promise, signal);
2207
+ } finally {
2208
+ signal == null ? void 0 : signal.removeEventListener("abort", releaseConsumer);
2209
+ releaseConsumer();
2152
2210
  }
2153
- yield ready;
2154
2211
  });
2155
2212
  }
2156
- function decode(image, formats, wasmUrl) {
2213
+ function decode(image, formats, wasmUrl, signal) {
2157
2214
  return __async(this, null, function* () {
2158
- yield prepareDecoder(wasmUrl);
2159
- const results = yield C(image, {
2160
- formats: formats.length ? formats : ["QRCode"],
2161
- tryHarder: true,
2162
- maxNumberOfSymbols: 1
2163
- });
2215
+ yield prepareDecoder(wasmUrl, signal);
2216
+ if (signal == null ? void 0 : signal.aborted)
2217
+ throw abortError();
2218
+ const results = yield waitForAbort(
2219
+ C(image, {
2220
+ formats: formats.length ? formats : ["QRCode"],
2221
+ tryHarder: true,
2222
+ maxNumberOfSymbols: 1
2223
+ }),
2224
+ signal
2225
+ );
2164
2226
  return results.find((result) => result.isValid && result.text.length > 0);
2165
2227
  });
2166
2228
  }
2167
- function loadImage(file) {
2229
+ function loadImage(file, signal) {
2168
2230
  return new Promise((resolve, reject) => {
2231
+ if (signal == null ? void 0 : signal.aborted) {
2232
+ reject(abortError());
2233
+ return;
2234
+ }
2169
2235
  const url = URL.createObjectURL(file);
2170
2236
  const image = new Image();
2171
- image.onload = () => {
2237
+ const cleanup = () => {
2172
2238
  URL.revokeObjectURL(url);
2239
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
2240
+ image.onload = null;
2241
+ image.onerror = null;
2242
+ };
2243
+ const onAbort = () => {
2244
+ cleanup();
2245
+ image.src = "";
2246
+ reject(abortError());
2247
+ };
2248
+ signal == null ? void 0 : signal.addEventListener("abort", onAbort, { once: true });
2249
+ image.onload = () => {
2250
+ cleanup();
2173
2251
  resolve(image);
2174
2252
  };
2175
2253
  image.onerror = () => {
2176
- URL.revokeObjectURL(url);
2254
+ cleanup();
2177
2255
  reject(new Error("无法读取图片,请选择 JPG、PNG 等浏览器支持的图片"));
2178
2256
  };
2179
2257
  image.src = url;