@sekyro/web 0.1.0-rc.5 → 0.1.0-rc.7
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/CHANGELOG.md +37 -0
- package/LICENSE +3 -3
- package/README.md +4 -4
- package/dist/chunk-B45J4KC3.js +1 -0
- package/dist/chunk-BMA36W2W.js +1 -0
- package/dist/chunk-FPXL63KZ.js +1 -0
- package/dist/chunk-IYUOYINS.js +1 -0
- package/dist/chunk-P7ECRN47.js +1 -0
- package/dist/chunk-SXZCL5NO.js +1 -0
- package/dist/chunk-YOB4ZTYN.js +1 -0
- package/dist/chunk-YQBK6OIM.js +1 -0
- package/dist/client/index.cjs +1 -357
- package/dist/client/index.d.cts +2 -2
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +1 -15
- package/dist/core/index.cjs +1 -1639
- package/dist/core/index.js +1 -139
- package/dist/core/v3/detect-worker.cjs +1 -392
- package/dist/core/v3/detect-worker.js +1 -13
- package/dist/{create-verification-CA-3szPI.d.cts → create-verification-C2JhOO6Y.d.cts} +100 -15
- package/dist/{create-verification-c98uAxbl.d.ts → create-verification-CGazwtAh.d.ts} +100 -15
- package/dist/detector-scanic-VQFFXKTL.js +1 -0
- package/dist/{hosted-client-DWzCRYJK.d.ts → hosted-client-kBeq-mnJ.d.cts} +188 -7
- package/dist/{hosted-client-DWzCRYJK.d.cts → hosted-client-kBeq-mnJ.d.ts} +188 -7
- package/dist/index.cjs +1 -3020
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -85
- package/dist/internal/index.cjs +1 -4429
- package/dist/internal/index.d.cts +10 -7
- package/dist/internal/index.d.ts +10 -7
- package/dist/internal/index.js +1 -657
- package/dist/popup/index.cjs +1 -76
- package/dist/popup/index.js +1 -11
- package/dist/scanic-ml-stub-KW7IZHUT.js +1 -0
- package/package.json +5 -8
- package/sbom.cdx.json +195 -0
- package/dist/chunk-MWNFSNMP.js +0 -52
- package/dist/chunk-MWNFSNMP.js.map +0 -1
- package/dist/chunk-NILNKLK6.js +0 -50
- package/dist/chunk-NILNKLK6.js.map +0 -1
- package/dist/chunk-NWF46H7K.js +0 -359
- package/dist/chunk-NWF46H7K.js.map +0 -1
- package/dist/chunk-SGDXLAXR.js +0 -1163
- package/dist/chunk-SGDXLAXR.js.map +0 -1
- package/dist/chunk-TG5IE552.js +0 -1128
- package/dist/chunk-TG5IE552.js.map +0 -1
- package/dist/chunk-WY6U7AIK.js +0 -193
- package/dist/chunk-WY6U7AIK.js.map +0 -1
- package/dist/chunk-YVFF4Q4G.js +0 -327
- package/dist/chunk-YVFF4Q4G.js.map +0 -1
- package/dist/client/index.cjs.map +0 -1
- package/dist/client/index.js.map +0 -1
- package/dist/core/index.cjs.map +0 -1
- package/dist/core/index.js.map +0 -1
- package/dist/core/v3/detect-worker.cjs.map +0 -1
- package/dist/core/v3/detect-worker.js.map +0 -1
- package/dist/detector-scanic-4C6IEW2K.js +0 -787
- package/dist/detector-scanic-4C6IEW2K.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal/index.cjs.map +0 -1
- package/dist/internal/index.js.map +0 -1
- package/dist/popup/index.cjs.map +0 -1
- package/dist/popup/index.js.map +0 -1
- package/dist/scanic-ml-stub-S2OZ6HEF.js +0 -10
- package/dist/scanic-ml-stub-S2OZ6HEF.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { b as Detector } from './detect-worker-CKXHlXx9.cjs';
|
|
2
2
|
import { i as CaptureState$1, f as CaptureSessionV3Events, g as CaptureSessionV3Options, c as CaptureErrorKind$1 } from './capture-session-v3-UQU_WjO2.cjs';
|
|
3
|
-
import { C as CheckReason,
|
|
3
|
+
import { C as CheckReason, S as SessionFailureReason, j as MethodChoiceView, I as IdentityMethod, i as HostedVoiceView, f as HostedSessionView, o as HostedClient, p as AttestationInput, q as SessionView, b as CheckType } from './hosted-client-kBeq-mnJ.cjs';
|
|
4
4
|
|
|
5
5
|
/** Gate guidance code. `'hold'` is emitted while the clip records. */
|
|
6
6
|
type GateHint = "center" | "closer" | "farther" | "light" | "still" | "hold";
|
|
@@ -165,11 +165,24 @@ interface LivenessCaptureOptions {
|
|
|
165
165
|
* - `nni_unbound` — `population_registry` is the frontier but the session was
|
|
166
166
|
* minted WITHOUT a server-bound NNI (`POST /sessions` `input.nni`), so the
|
|
167
167
|
* SDK cannot submit it. Mint the session with the NNI (or complete the
|
|
168
|
-
* population step yourself) before starting the capture
|
|
168
|
+
* population step yourself) before starting the capture;
|
|
169
|
+
* - `method_required` — the session waits on the identity-method choice
|
|
170
|
+
* (profile v2 step 3; `on('method')` fired). Ask the person, call
|
|
171
|
+
* {@link Verification.selectMethod}, then capture again;
|
|
172
|
+
* - `inference_unavailable` — the model service stayed busy through the
|
|
173
|
+
* automatic retries (profile v2 step 4; `on('busy')` fired for each). No
|
|
174
|
+
* attempt was used and nothing was billed: let the person try again in a
|
|
175
|
+
* moment.
|
|
176
|
+
*
|
|
177
|
+
* A liveness step that needs a phone (`HostedStepView.requiresMobile`) on a
|
|
178
|
+
* desktop browser ends with the reason `mobile_required` (status
|
|
179
|
+
* `unavailable`): send the person to their phone. The SDK stops before any
|
|
180
|
+
* upload when the view says so; otherwise the backend answers the submit with
|
|
181
|
+
* a request-level `409 mobile_required` (no attempt used, nothing billed).
|
|
169
182
|
*/
|
|
170
|
-
type SdkFailureReason = "no_recorder" | "attestation" | "network" | "nni_unbound";
|
|
183
|
+
type SdkFailureReason = "no_recorder" | "attestation" | "network" | "nni_unbound" | "method_required" | "inference_unavailable";
|
|
171
184
|
/** Backend reason taxonomy ∪ the SDK-side failure reasons. */
|
|
172
|
-
type ReasonCode = CheckReason | SdkFailureReason;
|
|
185
|
+
type ReasonCode = CheckReason | SessionFailureReason | SdkFailureReason;
|
|
173
186
|
/**
|
|
174
187
|
* - `approved` / `rejected` / `review` — the session's verdict;
|
|
175
188
|
* - `retry` — a retryable reason with attempts remaining (`autoRetry` on); the
|
|
@@ -182,13 +195,27 @@ type VerificationStatus = "approved" | "rejected" | "review" | "retry" | "unavai
|
|
|
182
195
|
interface VerificationResult {
|
|
183
196
|
sessionId: string;
|
|
184
197
|
status: VerificationStatus;
|
|
185
|
-
/** Backend reason, or
|
|
198
|
+
/** Backend check or session-policy reason, or SDK-side reason for `unavailable`. */
|
|
186
199
|
reason?: ReasonCode;
|
|
187
200
|
/**
|
|
188
201
|
* `retry` (and a `rejected` on a still-parked step): submissions left for
|
|
189
202
|
* the parked check after this one, for the host's coaching copy.
|
|
190
203
|
*/
|
|
191
204
|
attemptsRemaining?: number;
|
|
205
|
+
/**
|
|
206
|
+
* ISO-8601 time from which this device may verify again — set on a
|
|
207
|
+
* `rejected` result with reason `device_cooldown` (profile v2 step 4).
|
|
208
|
+
*/
|
|
209
|
+
retryAfter?: string;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* `on('busy')` payload: the model service answered
|
|
213
|
+
* `503 inference_unavailable` and the SDK waits `retryAfterSeconds` before
|
|
214
|
+
* retry number `attempt` (1-based, at most 3). Show "busy, trying again" copy.
|
|
215
|
+
*/
|
|
216
|
+
interface VerificationBusy {
|
|
217
|
+
attempt: number;
|
|
218
|
+
retryAfterSeconds: number;
|
|
192
219
|
}
|
|
193
220
|
/** Consent locale picklist (mirrors the backend HostedConsentSchema). */
|
|
194
221
|
type VerificationLocale = "ar" | "fr" | "en";
|
|
@@ -218,19 +245,63 @@ interface VerificationEvents {
|
|
|
218
245
|
result: VerificationResult;
|
|
219
246
|
/** Every hosted-view update the SDK observes (bootstrap, consent, submits). */
|
|
220
247
|
view: HostedSessionView;
|
|
248
|
+
/**
|
|
249
|
+
* The session waits on the identity-method choice (profile v2 step 3) and
|
|
250
|
+
* the SDK stopped before submitting anything: show the options and call
|
|
251
|
+
* {@link Verification.selectMethod}.
|
|
252
|
+
*/
|
|
253
|
+
method: MethodChoiceView;
|
|
254
|
+
/**
|
|
255
|
+
* The model service is briefly unavailable and the SDK retries by itself
|
|
256
|
+
* (profile v2 step 4). A `result` follows: the verdict, or
|
|
257
|
+
* `unavailable / inference_unavailable` once the retries are spent.
|
|
258
|
+
*/
|
|
259
|
+
busy: VerificationBusy;
|
|
221
260
|
}
|
|
222
261
|
/** One session's verification, from {@link createVerification}. */
|
|
223
262
|
interface Verification {
|
|
224
263
|
/** Record consent once (no-op when the session already has it). */
|
|
225
264
|
consent(): Promise<void>;
|
|
226
265
|
/**
|
|
227
|
-
* Submit `population_registry` early with
|
|
228
|
-
*
|
|
229
|
-
*
|
|
266
|
+
* Submit `population_registry` early with an empty input when it is the
|
|
267
|
+
* pending frontier and the backend holds the NNI: the SERVER-bound one, or
|
|
268
|
+
* the one the document step read (`nniFromDocument`). Retries once on
|
|
269
|
+
* `registry_unavailable`. Never rejects — failures surface through
|
|
270
|
+
* `result`. Idempotent.
|
|
230
271
|
*/
|
|
231
272
|
startRegistry(): Promise<void>;
|
|
273
|
+
/**
|
|
274
|
+
* The identity-method choice the session waits on (profile v2 step 3),
|
|
275
|
+
* bootstrapping the hosted view when needed; `null` when there is no
|
|
276
|
+
* pending choice, the bootstrap fails, or the verification was destroyed.
|
|
277
|
+
* Never rejects.
|
|
278
|
+
*/
|
|
279
|
+
methodChoice(): Promise<MethodChoiceView | null>;
|
|
280
|
+
/**
|
|
281
|
+
* Send the person's identity method (`POST /hosted/method`) and continue
|
|
282
|
+
* from the returned view. Rejects with the typed `HostedApiError` (e.g.
|
|
283
|
+
* 409 `method_locked`).
|
|
284
|
+
*/
|
|
285
|
+
selectMethod(method: IdentityMethod): Promise<void>;
|
|
286
|
+
/**
|
|
287
|
+
* The session's pending liveness step must be captured on a phone
|
|
288
|
+
* (`HostedStepView.requiresMobile`, profile v2 step 4 automatic decisions)
|
|
289
|
+
* and this browser is not one: show "continue on your phone" instead of
|
|
290
|
+
* starting the camera. Bootstraps the hosted view when needed; `false` when
|
|
291
|
+
* the bootstrap fails or the verification was destroyed. Never rejects.
|
|
292
|
+
* Optional so custom / older `Verification` implementations stay valid —
|
|
293
|
+
* treat an absent member as "no phone requirement".
|
|
294
|
+
*/
|
|
295
|
+
mobileRequired?(): Promise<boolean>;
|
|
232
296
|
/** Start a liveness capture bound to this verification; the SDK uploads + submits on `captured`. */
|
|
233
297
|
liveness(options: LivenessCaptureOptions): LivenessCaptureHandle;
|
|
298
|
+
/**
|
|
299
|
+
* The session's Sekyro AI-hosted voice clips (`view.voice`), bootstrapping the
|
|
300
|
+
* hosted view when it has not been fetched yet. Resolves `null` when the
|
|
301
|
+
* session has no active clip set, the API predates the field, the bootstrap
|
|
302
|
+
* fails, or the verification was destroyed. Never rejects.
|
|
303
|
+
*/
|
|
304
|
+
voiceClips(): Promise<HostedVoiceView | null>;
|
|
234
305
|
/** Subscribe; returns the unsubscribe function. */
|
|
235
306
|
on<K extends keyof VerificationEvents>(event: K, handler: (payload: VerificationEvents[K]) => void): () => void;
|
|
236
307
|
/** Destroy the active capture and drop all listeners. */
|
|
@@ -251,7 +322,7 @@ interface CaptureEngine {
|
|
|
251
322
|
/** Device-profile chrome hint (LOW class → `'reduced'`); absent on doubles. */
|
|
252
323
|
readonly animations?: "full" | "reduced";
|
|
253
324
|
}
|
|
254
|
-
/** Internal construction seams (tests; Sekyro's own hosted page). */
|
|
325
|
+
/** Internal construction seams (tests; Sekyro AI's own hosted page). */
|
|
255
326
|
interface LivenessCaptureInternals {
|
|
256
327
|
/** Replace the engine constructor (default: `new CaptureSessionV3(options)`). */
|
|
257
328
|
createEngine?: (options: CaptureSessionV3Options) => CaptureEngine;
|
|
@@ -331,12 +402,21 @@ declare function releaseLivenessAssets(assetBaseUrl?: string): void;
|
|
|
331
402
|
declare function preloadedDetectorFactory(assetBaseUrl?: string): (() => Promise<Detector>) | undefined;
|
|
332
403
|
|
|
333
404
|
/** The client surface the flow needs — `HostedClient` or a test fake. */
|
|
334
|
-
type HostedClientLike = Pick<HostedClient, "getSession" | "recordConsent" | "presign" | "uploadToSpaces" | "completeMedia" | "submitCheck">;
|
|
405
|
+
type HostedClientLike = Pick<HostedClient, "getSession" | "recordConsent" | "selectMethod" | "presign" | "uploadToSpaces" | "completeMedia" | "submitCheck">;
|
|
335
406
|
/** The presign policy allowlist for `kind: 'clip'` (media.policy.ts mirror). */
|
|
336
407
|
declare const CLIP_MIME_ALLOWLIST: readonly string[];
|
|
337
408
|
/** Same-key transport replays AFTER the first try, and the pause between them. */
|
|
338
409
|
declare const TRANSPORT_REPLAY_ATTEMPTS = 2;
|
|
339
410
|
declare const TRANSPORT_REPLAY_DELAY_MS = 1000;
|
|
411
|
+
/**
|
|
412
|
+
* `503 inference_unavailable` (profile v2 step 4 — request-level: no state
|
|
413
|
+
* change, no attempt used, not billed): retries after `retryAfterSeconds`
|
|
414
|
+
* (default {@link INFERENCE_RETRY_DEFAULT_S}, capped at 30 s), at most
|
|
415
|
+
* {@link INFERENCE_RETRY_ATTEMPTS} times, each under a FRESH key (each retry
|
|
416
|
+
* is its own logical attempt; the backend never caches a 5xx envelope).
|
|
417
|
+
*/
|
|
418
|
+
declare const INFERENCE_RETRY_ATTEMPTS = 3;
|
|
419
|
+
declare const INFERENCE_RETRY_DEFAULT_S = 10;
|
|
340
420
|
/** A Turnstile challenge failed client-side (load / render / error-callback / timeout). */
|
|
341
421
|
declare class AttestationError extends Error {
|
|
342
422
|
constructor(message: string);
|
|
@@ -351,6 +431,8 @@ interface SubmitRuntime {
|
|
|
351
431
|
}): Promise<void>;
|
|
352
432
|
sleep(ms: number): Promise<void>;
|
|
353
433
|
uuid(): string;
|
|
434
|
+
/** An `inference_unavailable` retry is about to wait (the `busy` event). */
|
|
435
|
+
onBusy?(info: VerificationBusy): void;
|
|
354
436
|
}
|
|
355
437
|
/**
|
|
356
438
|
* Run one logical submission (ported use-submit semantics):
|
|
@@ -362,7 +444,10 @@ interface SubmitRuntime {
|
|
|
362
444
|
* FRESH key (the 409 envelope is idempotency-cached under the old one);
|
|
363
445
|
* - ONE attestation retry (client-side Turnstile failure or a server
|
|
364
446
|
* `attestation_invalid`): `onAttestationInvalid` drops the cached token and
|
|
365
|
-
* the executor re-runs under a fresh key
|
|
447
|
+
* the executor re-runs under a fresh key;
|
|
448
|
+
* - up to {@link INFERENCE_RETRY_ATTEMPTS} `inference_unavailable` retries
|
|
449
|
+
* after `retryAfterSeconds`, each under a FRESH key and with a fresh
|
|
450
|
+
* attestation (`onAttestationInvalid` — the Turnstile token was spent).
|
|
366
451
|
* Throws the final error otherwise.
|
|
367
452
|
*/
|
|
368
453
|
declare function runSubmission(rt: SubmitRuntime, executor: SubmitExecutor, hooks?: {
|
|
@@ -389,7 +474,7 @@ type LivenessFlowOutcome = {
|
|
|
389
474
|
kind: "resync";
|
|
390
475
|
} | {
|
|
391
476
|
kind: "unavailable";
|
|
392
|
-
reason: SdkFailureReason;
|
|
477
|
+
reason: SdkFailureReason | "mobile_required";
|
|
393
478
|
} | {
|
|
394
479
|
kind: "cancelled";
|
|
395
480
|
};
|
|
@@ -417,7 +502,7 @@ declare const REGISTRY_RETRY_DELAY_MS = 5000;
|
|
|
417
502
|
declare const PROCESSING_POLL_DELAY_MS = 1500;
|
|
418
503
|
declare const PROCESSING_POLL_MAX = 10;
|
|
419
504
|
/**
|
|
420
|
-
* Construction seams — tests and Sekyro's own hosted page (`@sekyro/web/internal`).
|
|
505
|
+
* Construction seams — tests and Sekyro AI's own hosted page (`@sekyro/web/internal`).
|
|
421
506
|
* Not part of the partner contract.
|
|
422
507
|
*/
|
|
423
508
|
interface VerificationInternals {
|
|
@@ -442,7 +527,7 @@ declare function randomUuid(): string;
|
|
|
442
527
|
* `consent()` → `startRegistry()` → `liveness({video})` → `on('result')`.
|
|
443
528
|
*/
|
|
444
529
|
declare function createVerification(options: VerificationOptions): Verification;
|
|
445
|
-
/** {@link createVerification} with construction seams (tests / Sekyro-internal hosts). */
|
|
530
|
+
/** {@link createVerification} with construction seams (tests / Sekyro AI-internal hosts). */
|
|
446
531
|
declare function createVerificationInternal(options: VerificationOptions, internals: VerificationInternals): Verification;
|
|
447
532
|
|
|
448
|
-
export {
|
|
533
|
+
export { mapEngineState as $, AttestationError as A, type LivenessCaptureInternalHandle as B, type CameraFacing as C, DEFAULT_API_ORIGIN as D, type LivenessCaptureInternals as E, type LivenessFlowDeps as F, type GateHint as G, type HostedClientLike as H, INFERENCE_RETRY_ATTEMPTS as I, type LivenessFlowOutcome as J, PRELOAD_BLAZE_INIT_TIMEOUT_MS as K, type LivenessAssetsStatus as L, PRELOAD_BUDGET_MS as M, PROCESSING_POLL_DELAY_MS as N, PROCESSING_POLL_MAX as O, type PreloadLivenessAssetsOptions as P, REGISTRY_RETRY_DELAY_MS as Q, type ReasonCode as R, type SdkFailureReason as S, type SubmitExecutor as T, type SubmitRuntime as U, type Verification as V, TRANSPORT_REPLAY_ATTEMPTS as W, TRANSPORT_REPLAY_DELAY_MS as X, type VerificationInternals as Y, createLivenessCaptureInternal as Z, createVerificationInternal as _, type CaptureChannel as a, mapErrorKind as a0, mapGuidanceHint as a1, preloadedDetectorFactory as a2, randomUuid as a3, resetLivenessAssetsForTests as a4, runLivenessFlow as a5, runSubmission as a6, setPreloadLoaderForTests as a7, type CaptureEngineId as b, type CaptureError as c, type CaptureErrorKind as d, type CaptureState as e, type CapturedArtifacts as f, type GateUpdate as g, type LivenessCaptureEvents as h, type LivenessCaptureHandle as i, type LivenessCaptureOptions as j, type LivenessStartOptions as k, type VerificationBusy as l, type VerificationEvents as m, type VerificationLocale as n, type VerificationOptions as o, type VerificationResult as p, type VerificationStatus as q, createLivenessCapture as r, createVerification as s, getLivenessAssetsStatus as t, preloadLivenessAssets as u, releaseLivenessAssets as v, subscribeLivenessAssets as w, CLIP_MIME_ALLOWLIST as x, type CaptureEngine as y, INFERENCE_RETRY_DEFAULT_S as z };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { b as Detector } from './detect-worker-CKXHlXx9.js';
|
|
2
2
|
import { i as CaptureState$1, f as CaptureSessionV3Events, g as CaptureSessionV3Options, c as CaptureErrorKind$1 } from './capture-session-v3-Okq0EQHG.js';
|
|
3
|
-
import { C as CheckReason,
|
|
3
|
+
import { C as CheckReason, S as SessionFailureReason, j as MethodChoiceView, I as IdentityMethod, i as HostedVoiceView, f as HostedSessionView, o as HostedClient, p as AttestationInput, q as SessionView, b as CheckType } from './hosted-client-kBeq-mnJ.js';
|
|
4
4
|
|
|
5
5
|
/** Gate guidance code. `'hold'` is emitted while the clip records. */
|
|
6
6
|
type GateHint = "center" | "closer" | "farther" | "light" | "still" | "hold";
|
|
@@ -165,11 +165,24 @@ interface LivenessCaptureOptions {
|
|
|
165
165
|
* - `nni_unbound` — `population_registry` is the frontier but the session was
|
|
166
166
|
* minted WITHOUT a server-bound NNI (`POST /sessions` `input.nni`), so the
|
|
167
167
|
* SDK cannot submit it. Mint the session with the NNI (or complete the
|
|
168
|
-
* population step yourself) before starting the capture
|
|
168
|
+
* population step yourself) before starting the capture;
|
|
169
|
+
* - `method_required` — the session waits on the identity-method choice
|
|
170
|
+
* (profile v2 step 3; `on('method')` fired). Ask the person, call
|
|
171
|
+
* {@link Verification.selectMethod}, then capture again;
|
|
172
|
+
* - `inference_unavailable` — the model service stayed busy through the
|
|
173
|
+
* automatic retries (profile v2 step 4; `on('busy')` fired for each). No
|
|
174
|
+
* attempt was used and nothing was billed: let the person try again in a
|
|
175
|
+
* moment.
|
|
176
|
+
*
|
|
177
|
+
* A liveness step that needs a phone (`HostedStepView.requiresMobile`) on a
|
|
178
|
+
* desktop browser ends with the reason `mobile_required` (status
|
|
179
|
+
* `unavailable`): send the person to their phone. The SDK stops before any
|
|
180
|
+
* upload when the view says so; otherwise the backend answers the submit with
|
|
181
|
+
* a request-level `409 mobile_required` (no attempt used, nothing billed).
|
|
169
182
|
*/
|
|
170
|
-
type SdkFailureReason = "no_recorder" | "attestation" | "network" | "nni_unbound";
|
|
183
|
+
type SdkFailureReason = "no_recorder" | "attestation" | "network" | "nni_unbound" | "method_required" | "inference_unavailable";
|
|
171
184
|
/** Backend reason taxonomy ∪ the SDK-side failure reasons. */
|
|
172
|
-
type ReasonCode = CheckReason | SdkFailureReason;
|
|
185
|
+
type ReasonCode = CheckReason | SessionFailureReason | SdkFailureReason;
|
|
173
186
|
/**
|
|
174
187
|
* - `approved` / `rejected` / `review` — the session's verdict;
|
|
175
188
|
* - `retry` — a retryable reason with attempts remaining (`autoRetry` on); the
|
|
@@ -182,13 +195,27 @@ type VerificationStatus = "approved" | "rejected" | "review" | "retry" | "unavai
|
|
|
182
195
|
interface VerificationResult {
|
|
183
196
|
sessionId: string;
|
|
184
197
|
status: VerificationStatus;
|
|
185
|
-
/** Backend reason, or
|
|
198
|
+
/** Backend check or session-policy reason, or SDK-side reason for `unavailable`. */
|
|
186
199
|
reason?: ReasonCode;
|
|
187
200
|
/**
|
|
188
201
|
* `retry` (and a `rejected` on a still-parked step): submissions left for
|
|
189
202
|
* the parked check after this one, for the host's coaching copy.
|
|
190
203
|
*/
|
|
191
204
|
attemptsRemaining?: number;
|
|
205
|
+
/**
|
|
206
|
+
* ISO-8601 time from which this device may verify again — set on a
|
|
207
|
+
* `rejected` result with reason `device_cooldown` (profile v2 step 4).
|
|
208
|
+
*/
|
|
209
|
+
retryAfter?: string;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* `on('busy')` payload: the model service answered
|
|
213
|
+
* `503 inference_unavailable` and the SDK waits `retryAfterSeconds` before
|
|
214
|
+
* retry number `attempt` (1-based, at most 3). Show "busy, trying again" copy.
|
|
215
|
+
*/
|
|
216
|
+
interface VerificationBusy {
|
|
217
|
+
attempt: number;
|
|
218
|
+
retryAfterSeconds: number;
|
|
192
219
|
}
|
|
193
220
|
/** Consent locale picklist (mirrors the backend HostedConsentSchema). */
|
|
194
221
|
type VerificationLocale = "ar" | "fr" | "en";
|
|
@@ -218,19 +245,63 @@ interface VerificationEvents {
|
|
|
218
245
|
result: VerificationResult;
|
|
219
246
|
/** Every hosted-view update the SDK observes (bootstrap, consent, submits). */
|
|
220
247
|
view: HostedSessionView;
|
|
248
|
+
/**
|
|
249
|
+
* The session waits on the identity-method choice (profile v2 step 3) and
|
|
250
|
+
* the SDK stopped before submitting anything: show the options and call
|
|
251
|
+
* {@link Verification.selectMethod}.
|
|
252
|
+
*/
|
|
253
|
+
method: MethodChoiceView;
|
|
254
|
+
/**
|
|
255
|
+
* The model service is briefly unavailable and the SDK retries by itself
|
|
256
|
+
* (profile v2 step 4). A `result` follows: the verdict, or
|
|
257
|
+
* `unavailable / inference_unavailable` once the retries are spent.
|
|
258
|
+
*/
|
|
259
|
+
busy: VerificationBusy;
|
|
221
260
|
}
|
|
222
261
|
/** One session's verification, from {@link createVerification}. */
|
|
223
262
|
interface Verification {
|
|
224
263
|
/** Record consent once (no-op when the session already has it). */
|
|
225
264
|
consent(): Promise<void>;
|
|
226
265
|
/**
|
|
227
|
-
* Submit `population_registry` early with
|
|
228
|
-
*
|
|
229
|
-
*
|
|
266
|
+
* Submit `population_registry` early with an empty input when it is the
|
|
267
|
+
* pending frontier and the backend holds the NNI: the SERVER-bound one, or
|
|
268
|
+
* the one the document step read (`nniFromDocument`). Retries once on
|
|
269
|
+
* `registry_unavailable`. Never rejects — failures surface through
|
|
270
|
+
* `result`. Idempotent.
|
|
230
271
|
*/
|
|
231
272
|
startRegistry(): Promise<void>;
|
|
273
|
+
/**
|
|
274
|
+
* The identity-method choice the session waits on (profile v2 step 3),
|
|
275
|
+
* bootstrapping the hosted view when needed; `null` when there is no
|
|
276
|
+
* pending choice, the bootstrap fails, or the verification was destroyed.
|
|
277
|
+
* Never rejects.
|
|
278
|
+
*/
|
|
279
|
+
methodChoice(): Promise<MethodChoiceView | null>;
|
|
280
|
+
/**
|
|
281
|
+
* Send the person's identity method (`POST /hosted/method`) and continue
|
|
282
|
+
* from the returned view. Rejects with the typed `HostedApiError` (e.g.
|
|
283
|
+
* 409 `method_locked`).
|
|
284
|
+
*/
|
|
285
|
+
selectMethod(method: IdentityMethod): Promise<void>;
|
|
286
|
+
/**
|
|
287
|
+
* The session's pending liveness step must be captured on a phone
|
|
288
|
+
* (`HostedStepView.requiresMobile`, profile v2 step 4 automatic decisions)
|
|
289
|
+
* and this browser is not one: show "continue on your phone" instead of
|
|
290
|
+
* starting the camera. Bootstraps the hosted view when needed; `false` when
|
|
291
|
+
* the bootstrap fails or the verification was destroyed. Never rejects.
|
|
292
|
+
* Optional so custom / older `Verification` implementations stay valid —
|
|
293
|
+
* treat an absent member as "no phone requirement".
|
|
294
|
+
*/
|
|
295
|
+
mobileRequired?(): Promise<boolean>;
|
|
232
296
|
/** Start a liveness capture bound to this verification; the SDK uploads + submits on `captured`. */
|
|
233
297
|
liveness(options: LivenessCaptureOptions): LivenessCaptureHandle;
|
|
298
|
+
/**
|
|
299
|
+
* The session's Sekyro AI-hosted voice clips (`view.voice`), bootstrapping the
|
|
300
|
+
* hosted view when it has not been fetched yet. Resolves `null` when the
|
|
301
|
+
* session has no active clip set, the API predates the field, the bootstrap
|
|
302
|
+
* fails, or the verification was destroyed. Never rejects.
|
|
303
|
+
*/
|
|
304
|
+
voiceClips(): Promise<HostedVoiceView | null>;
|
|
234
305
|
/** Subscribe; returns the unsubscribe function. */
|
|
235
306
|
on<K extends keyof VerificationEvents>(event: K, handler: (payload: VerificationEvents[K]) => void): () => void;
|
|
236
307
|
/** Destroy the active capture and drop all listeners. */
|
|
@@ -251,7 +322,7 @@ interface CaptureEngine {
|
|
|
251
322
|
/** Device-profile chrome hint (LOW class → `'reduced'`); absent on doubles. */
|
|
252
323
|
readonly animations?: "full" | "reduced";
|
|
253
324
|
}
|
|
254
|
-
/** Internal construction seams (tests; Sekyro's own hosted page). */
|
|
325
|
+
/** Internal construction seams (tests; Sekyro AI's own hosted page). */
|
|
255
326
|
interface LivenessCaptureInternals {
|
|
256
327
|
/** Replace the engine constructor (default: `new CaptureSessionV3(options)`). */
|
|
257
328
|
createEngine?: (options: CaptureSessionV3Options) => CaptureEngine;
|
|
@@ -331,12 +402,21 @@ declare function releaseLivenessAssets(assetBaseUrl?: string): void;
|
|
|
331
402
|
declare function preloadedDetectorFactory(assetBaseUrl?: string): (() => Promise<Detector>) | undefined;
|
|
332
403
|
|
|
333
404
|
/** The client surface the flow needs — `HostedClient` or a test fake. */
|
|
334
|
-
type HostedClientLike = Pick<HostedClient, "getSession" | "recordConsent" | "presign" | "uploadToSpaces" | "completeMedia" | "submitCheck">;
|
|
405
|
+
type HostedClientLike = Pick<HostedClient, "getSession" | "recordConsent" | "selectMethod" | "presign" | "uploadToSpaces" | "completeMedia" | "submitCheck">;
|
|
335
406
|
/** The presign policy allowlist for `kind: 'clip'` (media.policy.ts mirror). */
|
|
336
407
|
declare const CLIP_MIME_ALLOWLIST: readonly string[];
|
|
337
408
|
/** Same-key transport replays AFTER the first try, and the pause between them. */
|
|
338
409
|
declare const TRANSPORT_REPLAY_ATTEMPTS = 2;
|
|
339
410
|
declare const TRANSPORT_REPLAY_DELAY_MS = 1000;
|
|
411
|
+
/**
|
|
412
|
+
* `503 inference_unavailable` (profile v2 step 4 — request-level: no state
|
|
413
|
+
* change, no attempt used, not billed): retries after `retryAfterSeconds`
|
|
414
|
+
* (default {@link INFERENCE_RETRY_DEFAULT_S}, capped at 30 s), at most
|
|
415
|
+
* {@link INFERENCE_RETRY_ATTEMPTS} times, each under a FRESH key (each retry
|
|
416
|
+
* is its own logical attempt; the backend never caches a 5xx envelope).
|
|
417
|
+
*/
|
|
418
|
+
declare const INFERENCE_RETRY_ATTEMPTS = 3;
|
|
419
|
+
declare const INFERENCE_RETRY_DEFAULT_S = 10;
|
|
340
420
|
/** A Turnstile challenge failed client-side (load / render / error-callback / timeout). */
|
|
341
421
|
declare class AttestationError extends Error {
|
|
342
422
|
constructor(message: string);
|
|
@@ -351,6 +431,8 @@ interface SubmitRuntime {
|
|
|
351
431
|
}): Promise<void>;
|
|
352
432
|
sleep(ms: number): Promise<void>;
|
|
353
433
|
uuid(): string;
|
|
434
|
+
/** An `inference_unavailable` retry is about to wait (the `busy` event). */
|
|
435
|
+
onBusy?(info: VerificationBusy): void;
|
|
354
436
|
}
|
|
355
437
|
/**
|
|
356
438
|
* Run one logical submission (ported use-submit semantics):
|
|
@@ -362,7 +444,10 @@ interface SubmitRuntime {
|
|
|
362
444
|
* FRESH key (the 409 envelope is idempotency-cached under the old one);
|
|
363
445
|
* - ONE attestation retry (client-side Turnstile failure or a server
|
|
364
446
|
* `attestation_invalid`): `onAttestationInvalid` drops the cached token and
|
|
365
|
-
* the executor re-runs under a fresh key
|
|
447
|
+
* the executor re-runs under a fresh key;
|
|
448
|
+
* - up to {@link INFERENCE_RETRY_ATTEMPTS} `inference_unavailable` retries
|
|
449
|
+
* after `retryAfterSeconds`, each under a FRESH key and with a fresh
|
|
450
|
+
* attestation (`onAttestationInvalid` — the Turnstile token was spent).
|
|
366
451
|
* Throws the final error otherwise.
|
|
367
452
|
*/
|
|
368
453
|
declare function runSubmission(rt: SubmitRuntime, executor: SubmitExecutor, hooks?: {
|
|
@@ -389,7 +474,7 @@ type LivenessFlowOutcome = {
|
|
|
389
474
|
kind: "resync";
|
|
390
475
|
} | {
|
|
391
476
|
kind: "unavailable";
|
|
392
|
-
reason: SdkFailureReason;
|
|
477
|
+
reason: SdkFailureReason | "mobile_required";
|
|
393
478
|
} | {
|
|
394
479
|
kind: "cancelled";
|
|
395
480
|
};
|
|
@@ -417,7 +502,7 @@ declare const REGISTRY_RETRY_DELAY_MS = 5000;
|
|
|
417
502
|
declare const PROCESSING_POLL_DELAY_MS = 1500;
|
|
418
503
|
declare const PROCESSING_POLL_MAX = 10;
|
|
419
504
|
/**
|
|
420
|
-
* Construction seams — tests and Sekyro's own hosted page (`@sekyro/web/internal`).
|
|
505
|
+
* Construction seams — tests and Sekyro AI's own hosted page (`@sekyro/web/internal`).
|
|
421
506
|
* Not part of the partner contract.
|
|
422
507
|
*/
|
|
423
508
|
interface VerificationInternals {
|
|
@@ -442,7 +527,7 @@ declare function randomUuid(): string;
|
|
|
442
527
|
* `consent()` → `startRegistry()` → `liveness({video})` → `on('result')`.
|
|
443
528
|
*/
|
|
444
529
|
declare function createVerification(options: VerificationOptions): Verification;
|
|
445
|
-
/** {@link createVerification} with construction seams (tests / Sekyro-internal hosts). */
|
|
530
|
+
/** {@link createVerification} with construction seams (tests / Sekyro AI-internal hosts). */
|
|
446
531
|
declare function createVerificationInternal(options: VerificationOptions, internals: VerificationInternals): Verification;
|
|
447
532
|
|
|
448
|
-
export {
|
|
533
|
+
export { mapEngineState as $, AttestationError as A, type LivenessCaptureInternalHandle as B, type CameraFacing as C, DEFAULT_API_ORIGIN as D, type LivenessCaptureInternals as E, type LivenessFlowDeps as F, type GateHint as G, type HostedClientLike as H, INFERENCE_RETRY_ATTEMPTS as I, type LivenessFlowOutcome as J, PRELOAD_BLAZE_INIT_TIMEOUT_MS as K, type LivenessAssetsStatus as L, PRELOAD_BUDGET_MS as M, PROCESSING_POLL_DELAY_MS as N, PROCESSING_POLL_MAX as O, type PreloadLivenessAssetsOptions as P, REGISTRY_RETRY_DELAY_MS as Q, type ReasonCode as R, type SdkFailureReason as S, type SubmitExecutor as T, type SubmitRuntime as U, type Verification as V, TRANSPORT_REPLAY_ATTEMPTS as W, TRANSPORT_REPLAY_DELAY_MS as X, type VerificationInternals as Y, createLivenessCaptureInternal as Z, createVerificationInternal as _, type CaptureChannel as a, mapErrorKind as a0, mapGuidanceHint as a1, preloadedDetectorFactory as a2, randomUuid as a3, resetLivenessAssetsForTests as a4, runLivenessFlow as a5, runSubmission as a6, setPreloadLoaderForTests as a7, type CaptureEngineId as b, type CaptureError as c, type CaptureErrorKind as d, type CaptureState as e, type CapturedArtifacts as f, type GateUpdate as g, type LivenessCaptureEvents as h, type LivenessCaptureHandle as i, type LivenessCaptureOptions as j, type LivenessStartOptions as k, type VerificationBusy as l, type VerificationEvents as m, type VerificationLocale as n, type VerificationOptions as o, type VerificationResult as p, type VerificationStatus as q, createLivenessCapture as r, createVerification as s, getLivenessAssetsStatus as t, preloadLivenessAssets as u, releaseLivenessAssets as v, subscribeLivenessAssets as w, CLIP_MIME_ALLOWLIST as x, type CaptureEngine as y, INFERENCE_RETRY_DEFAULT_S as z };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as NA}from"./chunk-B45J4KC3.js";import"./chunk-FPXL63KZ.js";var W,UA=1e3,HA=10;function YA(I,A={}){let E=A.width||Math.sqrt(I.length),e=A.height||I.length/E,Q=A.mode!==void 0?A.mode:1,g=A.method!==void 0?A.method:2,C=A.minArea||UA,t=E+2,n=e+2,i=new Int32Array(t*n);for(let s=0;s<e;s++)for(let o=0;o<E;o++)I[s*E+o]>0&&(i[(s+1)*t+(o+1)]=1);let c=[],h=2;for(let s=1;s<=e;s++)for(let o=1;o<=E;o++){let r=i[s*t+o],w=i[s*t+(o-1)],B=null,l=!1,f=-1;if(r===1&&w===0?(l=!0,B={x:o,y:s},f=2):r===0&&w>=1&&w!==-1&&w===1&&(l=!1,B={x:o-1,y:s},f=6),B){if(Q===0&&!l){i[B.y*t+B.x]=-1;continue}let d=h++,G=qA(i,t,n,B,f,d);if(G&&G.length>0){let k=G;g===2&&(k=vA(G));let y=k.map(u=>({x:u.x-1,y:u.y-1}));if(y.length>=(g===2?4:HA)){let u={id:d,points:y,isOuter:l};c.push(u)}}else i[B.y*t+B.x]===1&&(i[B.y*t+B.x]=d)}}c.forEach(s=>{s.area=(function(o){let r=0,w=o.length;if(w<3)return 0;for(let B=0;B<w;B++){let l=(B+1)%w;r+=o[B].x*o[l].y,r-=o[l].x*o[B].y}return Math.abs(r)/2})(s.points),s.boundingBox=(function(o){if(o.length===0)return{minX:0,minY:0,maxX:0,maxY:0};let r=o[0].x,w=o[0].y,B=o[0].x,l=o[0].y;for(let f=1;f<o.length;f++){let d=o[f];r=Math.min(r,d.x),w=Math.min(w,d.y),B=Math.max(B,d.x),l=Math.max(l,d.y)}return{minX:r,minY:w,maxX:B,maxY:l}})(s.points)});let a=c.filter(s=>s.area>=C);return a.sort((s,o)=>o.area-s.area),A.debug&&(A.debug.labels=i,A.debug.rawContours=c,A.debug.finalContours=a),a}function qA(I,A,E,e,Q,g){let C=[],t=new Set,n=e.x,i=e.y,c=n,h=i,a=-1;I[h*A+c]=g;let s=0,o=A*E,r=[0,1,1,1,0,-1,-1,-1],w=[-1,-1,0,1,1,1,0,-1];for(;s++<o;){let B;if(a===-1){let k=!1;for(let y=0;y<8;y++){B=Q+y&7;let u=n+r[B],S=i+w[B];if(u>=0&&u<A&&S>=0&&S<E&&I[S*A+u]>0){k=!0;break}}if(!k)return null}else B=a+2&7;let l=-1,f=-1;for(let k=0;k<8;k++){let y=B+k&7,u=n+r[y],S=i+w[y];if(u>=0&&u<A&&S>=0&&S<E&&I[S*A+u]>0){l=u,f=S,a=y+4&7;break}}if(l===-1){C.length===0&&C.push({x:n,y:i});break}let d=i*A+n;if(t.has(d))return C;C.push({x:n,y:i}),t.add(d);let G=f*A+l;if(I[G]===1&&(I[G]=g),n=l,i=f,n===c&&i===h)break}return s>=o?null:C}function vA(I){let A=I.length;if(A<=2)return I;let E=[],e=I[A-1],Q=I[0],g=e,C=Q,t=I[1],n=C.x-g.x,i=C.y-g.y,c=t.x-C.x,h=t.y-C.y;n*h!==i*c&&E.push(C);for(let a=1;a<A-1;a++)g=I[a-1],C=I[a],t=I[a+1],n=C.x-g.x,i=C.y-g.y,c=t.x-C.x,h=t.y-C.y,n*h!==i*c&&E.push(C);if(g=I[A-2],C=e,t=Q,n=C.x-g.x,i=C.y-g.y,c=t.x-C.x,h=t.y-C.y,n*h!==i*c&&E.push(C),E.length===0){if(A===1)return[I[0]];if(A===2)return I;let a=0,s=1,o=Q.x,r=Q.y;for(let w=1;w<A;w++){let B=I[w],l=B.x-o,f=B.y-r,d=l*l+f*f;d>a&&(a=d,s=w)}return[Q,I[s]]}return E}function uA(I,A=1){if(I.length<=2)return I;let E=0,e=0,Q=I[0],g=I[I.length-1];for(let C=1;C<I.length-1;C++){let t=KA(I[C],Q,g);t>E&&(E=t,e=C)}if(E>A){let C=uA(I.slice(0,e+1),A),t=uA(I.slice(e),A);return C.slice(0,-1).concat(t)}return[Q,g]}function KA(I,A,E){let e=E.x-A.x,Q=E.y-A.y,g=e*e+Q*Q;if(g===0)return Math.sqrt(Math.pow(I.x-A.x,2)+Math.pow(I.y-A.y,2));let C=((I.x-A.x)*e+(I.y-A.y)*Q)/g,t,n;C<0?(t=A.x,n=A.y):C>1?(t=E.x,n=E.y):(t=A.x+C*e,n=A.y+C*Q);let i=I.x-t,c=I.y-n;return Math.sqrt(i*i+c*c)}function SA(I,A=.02){return uA(I,A*(function(E){let e=0,Q=E.length;if(Q<2)return 0;for(let g=0;g<Q;g++){let C=(g+1)%Q,t=E[g].x-E[C].x,n=E[g].y-E[C].y;e+=Math.sqrt(t*t+n*n)}return e})(I))}function mA(I,A){return Math.hypot(A.x-I.x,A.y-I.y)}function RA(I){let A=0,E=0;for(let e of I)A+=e.x,E+=e.y;return{x:A/I.length,y:E/I.length}}function TA(I,A={}){if(!I||!I.points||I.points.length<4)return null;let E=A.epsilon||.02,e=(function(g,C){if(!g||g.length<4)return null;let t=[C,1.3*C,1.6*C,2*C],n=new Set;for(let i of t){let c=Math.min(.12,i),h=c.toFixed(4);if(n.has(h))continue;n.add(h);let a=WA(SA(g,c));if(a&&a.length===4)return a}return null})(I.points,E),Q;return e&&e.length===4?Q=(function(g){if(g.length!==4)return null;let C=RA(g),t=[...g].sort((h,a)=>Math.atan2(h.y-C.y,h.x-C.x)-Math.atan2(a.y-C.y,a.x-C.x)),n=1/0,i=0;for(let h=0;h<4;h++){let a=t[h].x+t[h].y;a<n&&(n=a,i=h)}let c=[t[i],t[(i+1)%4],t[(i+2)%4],t[(i+3)%4]];return{topLeft:c[0],topRight:c[1],bottomRight:c[2],bottomLeft:c[3]}})(e):(Q=(function(g){if(!g||g.length<4)return null;let C=RA(g),t=null,n=null,i=null,c=null,h=0,a=0,s=0,o=0;for(let r of g){let w=mA(r,C);r.x<C.x&&r.y<C.y?w>h&&(t=r,h=w):r.x>C.x&&r.y<C.y?w>a&&(n=r,a=w):r.x>C.x&&r.y>C.y?w>s&&(i=r,s=w):r.x<C.x&&r.y>C.y&&w>o&&(c=r,o=w)}return t&&n&&i&&c?{topLeft:t,topRight:n,bottomRight:i,bottomLeft:c}:null})(I.points),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft||(Q=(function(g){if(!g||g.length===0)return null;let C=g[0],t=g[0],n=g[0],i=g[0],c=C.x+C.y,h=t.x-t.y,a=n.x+n.y,s=i.x-i.y;for(let o=1;o<g.length;o++){let r=g[o],w=r.x+r.y,B=r.x-r.y;w<c&&(c=w,C=r),w>a&&(a=w,n=r),B>h&&(h=B,t=r),B<s&&(s=B,i=r)}return{topLeft:C,topRight:t,bottomRight:n,bottomLeft:i}})(I.points))),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft?Q:null}function WA(I){if(!I||I.length<4)return null;if(I.length===4)return I;if(I.length>8)return null;let A=(function(E,e){if(!E||E.length===0)return[];let Q=[];for(let g of E)(Q.length===0||mA(g,Q[Q.length-1])>e)&&Q.push(g);return Q.length>2&&mA(Q[0],Q[Q.length-1])<=e&&Q.pop(),Q})(I,6);return A.length===4?A:(A.length,null)}var iA=null;function MA(){return iA!==null&&iA.byteLength!==0||(iA=new Uint8Array(W.memory.buffer)),iA}var IA=0;function dA(I,A){let E=A(1*I.length,1)>>>0;return MA().set(I,E/1),IA=I.length,E}function cA(I,A){return I>>>=0,MA().subarray(I/1,I/1+A)}var eA=null;function bA(){return eA!==null&&eA.byteLength!==0||(eA=new Float32Array(W.memory.buffer)),eA}function PA(I,A,E,e,Q){let g=(function(i,c){let h=c(4*i.length,4)>>>0;return bA().set(i,h/4),IA=i.length,h})(I,W.__wbindgen_malloc),C=IA,t=W.hysteresis_thresholding(g,C,A,E,e,Q);var n=cA(t[0],t[1]).slice();return W.__wbindgen_free(t[0],1*t[1],1),n}var EA=null;function pA(I,A){let E=A(2*I.length,2)>>>0;return(EA!==null&&EA.byteLength!==0||(EA=new Uint16Array(W.memory.buffer)),EA).set(I,E/2),IA=I.length,E}function ZA(I,A,E,e,Q){let g=pA(I,W.__wbindgen_malloc),C=IA,t=pA(A,W.__wbindgen_malloc),n=IA,i=W.non_maximum_suppression(g,C,t,n,E,e,Q);var c,h,a=(c=i[0],h=i[1],c>>>=0,bA().subarray(c/4,c/4+h)).slice();return W.__wbindgen_free(i[0],4*i[1],4),a}async function LA(I){if(W!==void 0)return W;if(I!==void 0&&Object.getPrototypeOf(I)===Object.prototype&&({module_or_path:I}=I),I===void 0)throw new Error("scanic: WASM module bytes must be passed to init().");let A=(function(){let Q={wbg:{}};return Q.wbg.__wbindgen_init_externref_table=function(){let g=W.__wbindgen_export_0,C=g.grow(4);g.set(0,void 0),g.set(C+0,void 0),g.set(C+1,null),g.set(C+2,!0),g.set(C+3,!1)},Q})();(typeof I=="string"||typeof Request=="function"&&I instanceof Request||typeof URL=="function"&&I instanceof URL)&&(I=fetch(I));let{instance:E,module:e}=await(async function(Q,g){if(typeof Response=="function"&&Q instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(Q,g)}catch(t){if(Q.headers.get("Content-Type")=="application/wasm")throw t}let C=await Q.arrayBuffer();return await WebAssembly.instantiate(C,g)}{let C=await WebAssembly.instantiate(Q,g);return C instanceof WebAssembly.Instance?{instance:C,module:Q}:C}})(await I,A);return(function(Q,g){return W=Q.exports,LA.__wbindgen_wasm_module=g,eA=null,EA=null,iA=null,W.__wbindgen_start(),W})(E,e)}var sA=null,FA=!1,fA=null;function XA(I){if(typeof atob=="function"){let A=atob(I),E=new Uint8Array(A.length);for(let e=0;e<A.length;e++)E[e]=A.charCodeAt(e);return E}return Uint8Array.from(Buffer.from(I,"base64"))}async function VA(){if(!(function(){if(fA!==null)return fA;let I=!1;if(typeof WebAssembly=="object"&&typeof WebAssembly.validate=="function"){let A=new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]),E=new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,111,3,2,1,0,10,6,1,4,0,208,111,11]);try{I=WebAssembly.validate(A)&&WebAssembly.validate(E)}catch{I=!1}}return fA=I,I})())throw new Error("scanic: WebAssembly features required by the WASM module (reference-types, SIMD) are unavailable in this engine; using the JavaScript fallback.");return await LA({module_or_path:XA("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JAAgAiABIAJqIgFLBEBBAEEAEC0ACyADQQRqIAAoAgAiAiAAKAIEQQggASACQQF0IgIgASACSxsiASABQQhNGyIBQQFBARARIAMoAgRBAUYEQCADKAIIIAMoAgwQLQALIAMoAgghAiAAIAE2AgAgACACNgIEIANBEGokAAt5AQF/IwBBIGsiAiQAAn8gACgCAEGAgICAeEcEQCABIAAoAgQgACgCCBAwDAELIAJBEGogACgCDCgCACIAQQhqKQIANwMAIAJBGGogAEEQaikCADcDACACIAApAgA3AwggASgCACABKAIEIAJBCGoQBwsgAkEgaiQAC2kBA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBEEEIAJBAXQiAiACQQRNGyICQQRBBBARIAEoAgRBAUYEQCABKAIIIAEoAgwQLQALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtpAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgRBBCACQQF0IgIgAkEETRsiAkEEQQgQESABKAIEQQFGBEAgASgCCCABKAIMEC0ACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALaQEDfyMAQRBrIgEkACABQQRqIAAoAgAiAiAAKAIEQQQgAkEBdCICIAJBBE0bIgJBAkECEBEgASgCBEEBRgRAIAEoAgggASgCDBAtAAsgASgCCCEDIAAgAjYCACAAIAM2AgQgAUEQaiQACxIAIwBBMGsiACQAIABBMGokAAtoAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0Hkl8AANgIIIANCAjcCFCADQoCAgIAwIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhAmAAtHAQF/IAAoAgAgACgCCCIDayACSQRAIAAgAyACEBIgACgCCCEDCyACBEAgACgCBCADaiABIAL8CgAACyAAIAIgA2o2AghBAAtEAQJ/IAEoAgQhAiABKAIAIQNBCEEEEDUiAUUEQEEEQQgQOQALIAEgAjYCBCABIAM2AgAgAEHcksAANgIEIAAgATYCAAvGAgACQCAAIAJNBEAgACABTSABIAJLcg0BIwBBMGsiAiQAIAIgATYCBCACIAA2AgAgAkECNgIMIAJB2JbAADYCCCACQgI3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IAAAABwAEAAMAAAAEgAAABcAAAAcABAADAAAABcAAAAZAAAAHAAQAAwAAAAUAAAAGQAAABwAEAAMAAAAUQAAAB4AAAAcABAADAAAAFIAAAAeAAAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAA8CBAAKgAAAEgBEABaAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAgAgQAA4AAABIARAAWgAAAHoCAAANAAAAfP2LMlfmV/kC30S/40jnr21dy9YsUOtjeEGmV3Ebi7ltZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAADICBAAFQAAAN0IEAANAAAALwEQABgAAABkAQAACQAAAAQAAAAMAAAABAAAAAUAAAAGAAAABwAAAAAAAAAIAAAABAAAAAgAAAAJAAAACgAAAAsAAAAMAAAAEAAAAAQAAAANAAAADgAAAA8AAAAQAAAAAAAAAAgAAAAEAAAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAAAQBEAAqAAAAsQQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAAAEARAAKgAAALcEAAANAAAABAAAAAwAAAAEAAAAEgAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/AkQABEAAADjABAAIAAAABwAAAAFAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlyYW5nZSBlbmQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIAAA8AoQABAAAAAACxAAIgAAAHNsaWNlIGluZGV4IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgADQLEAAWAAAASgsQAA0AAAByYW5nZSBzdGFydCBpbmRleCAAAGgLEAASAAAAAAsQACIAAABhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvAAAAjAsQABkAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAsAsQACAAAADQCxAAEgAAAAAAAD8AAAC/AEGUmMAACwEBAHwJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjkyLjAgKGRlZDVjMDZjZiAyMDI1LTEyLTA4KQZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbhMwLjIuMTAwICgyNDA1ZWMyYjQpAHQPdGFyZ2V0X2ZlYXR1cmVzBysPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50KwdzaW1kMTI4KwtidWxrLW1lbW9yeSsIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==")})}function tA(){return sA||(sA=VA().catch(I=>{throw sA=null,I})),sA}function jA(I,A,E,e=5,Q=0){Q===0&&(Q=.3*(.5*(e-1)-1)+.8);let g=Math.floor(e/2),C=(function(i,c){let h=new Float32Array(i),a=Math.floor(i/2),s=0;for(let o=0;o<i;o++){let r=o-a;h[o]=Math.exp(-r*r/(2*c*c)),s+=h[o]}for(let o=0;o<i;o++)h[o]/=s;return h})(e,Q),t=new Uint8ClampedArray(A*E),n=new Uint8ClampedArray(A*E);for(let i=0;i<E;i++){let c=i*A;for(let h=0;h<A;h++){let a=0;for(let s=-g;s<=g;s++)a+=I[c+Math.min(A-1,Math.max(0,h+s))]*C[g+s];t[c+h]=a}}for(let i=0;i<A;i++)for(let c=0;c<E;c++){let h=0;for(let a=-g;a<=g;a++)h+=t[Math.min(E-1,Math.max(0,c+a))*A+i]*C[g+a];n[c*A+i]=Math.round(h)}return n}function JA(I,A,E,e,Q){let g=new Uint8Array(A*E),C=[];for(let i=1;i<E-1;i++)for(let c=1;c<A-1;c++){let h=i*A+c,a=I[h];a>=Q?(g[h]=2,C.push({x:c,y:i})):g[h]=a>=e?0:1}for(let i=0;i<A;i++)g[i]=1,g[(E-1)*A+i]=1;for(let i=1;i<E-1;i++)g[i*A]=1,g[i*A+A-1]=1;let t=[-1,0,1,-1,1,-1,0,1],n=[-1,-1,-1,0,0,1,1,1];for(;C.length>0;){let{x:i,y:c}=C.pop();for(let h=0;h<8;h++){let a=i+t[h],s=c+n[h],o=s*A+a;g[o]===0&&(g[o]=2,C.push({x:a,y:s}))}}return g}async function OA(I,A={}){let E=!(!A.debug||A.debug._timingsOnly),e=[],Q=performance.now(),g,C,t;if(A.skipGrayscale)g=A.width,C=A.height,t=I,E&&(A.debug.grayscale=t);else{g=I.width,C=I.height;let H=performance.now();t=(function(p){let{width:Y,height:v,data:b}=p,L=new Uint8ClampedArray(Y*v);for(let m=0,R=0;m<b.length;m+=4,R++)L[R]=54*b[m]+183*b[m+1]+19*b[m+2]>>8;return L})(I);let D=performance.now();e.push({step:"Grayscale",ms:(D-H).toFixed(2)}),E&&(A.debug.grayscale=t)}let n=A.lowThreshold!==void 0?A.lowThreshold:null,i=A.highThreshold!==void 0?A.highThreshold:null;if(n===null||i===null){let D=new Uint32Array(1024),p=0;for(let L=1;L<C-1;L++)for(let m=1;m<g-1;m++){let R=L*g+m,J=-t[R-g-1]+t[R-g+1]-2*t[R-1]+2*t[R+1]-t[R+g-1]+t[R+g+1],x=-t[R-g-1]-2*t[R-g]-t[R-g+1]+t[R+g-1]+2*t[R+g]+t[R+g+1],N=Math.abs(J)+Math.abs(x);N>=1024&&(N=1023),N>0&&(D[N]++,p++)}let Y=Math.round(.7*p),v=0,b=75;for(let L=1;L<1024;L++)if(v+=D[L],v>=Y){b=L;break}n===null&&(n=Math.max(5,Math.round(.5*b))),i===null&&(i=Math.min(500,Math.round(1.5*b)))}let c=A.kernelSize||5,h=A.sigma||0,a=A.L2gradient!==void 0&&A.L2gradient,s=A.applyDilation===void 0||A.applyDilation,o=A.dilationKernelSize||5,r=A.useWasmHysteresis!==void 0&&A.useWasmHysteresis,w=A.useWasmFullCanny!==void 0&&A.useWasmFullCanny;if(n>=i&&([n,i]=[i,n]),w)try{await tA();let H=performance.now(),D=new Uint8ClampedArray((function(v,b,L,m,R,J,x,N,F,M){let U=dA(v,W.__wbindgen_malloc),q=IA,K=W.canny_edge_detector_full(U,q,b,L,m,R,J,x,N,F,M);var T=cA(K[0],K[1]).slice();return W.__wbindgen_free(K[0],1*K[1],1),T})(t,g,C,n,i,c,h,a,s,o)),p=(performance.now()-H).toFixed(2);e.push({step:"Edge Processing (WASM)",ms:p}),E&&(A.debug.finalEdges=D),A.debug?A.debug.timings=e:A.debug={timings:e};let Y=performance.now();return e.unshift({step:"Edge Detection Total",ms:(Y-Q).toFixed(2)}),D}catch(H){FA||(FA=!0,H instanceof Error?H.message:String(H))}let B,l,f,d,G,k;B=performance.now();try{await tA(),f=(function(H,D,p,Y,v){let b=dA(H,W.__wbindgen_malloc),L=IA,m=W.blur(b,L,D,p,Y,v);var R=cA(m[0],m[1]).slice();return W.__wbindgen_free(m[0],1*m[1],1),R})(t,g,C,c,h)}catch{f=jA(t,g,C,c,h)}l=performance.now(),e.push({step:"Gaussian Blur",ms:(l-B).toFixed(2)}),E&&(A.debug.blurred=f),B=performance.now();{let H=(function(D,p,Y){let v=new Int16Array(p*Y),b=new Int16Array(p*Y);for(let L=1;L<Y-1;L++){let m=L*p,R=(L-1)*p,J=(L+1)*p;for(let x=1;x<p-1;x++){let N=m+x,F=D[R+x-1],M=D[R+x],U=D[R+x+1],q=D[m+x-1],K=D[m+x+1],T=D[J+x-1],V=D[J+x],X=D[J+x+1],z=U-F+2*(K-q)+(X-T),_=T+2*V+X-(F+2*M+U);v[N]=z,b[N]=_}}return{dx:v,dy:b}})(f,g,C);d=H.dx,G=H.dy}l=performance.now(),e.push({step:"Gradients",ms:(l-B).toFixed(2)}),B=performance.now();try{await tA(),k=await ZA(d,G,g,C,a)}catch{k=(function(H,D,p,Y,v){let b=new Float32Array(p*Y),L=new Float32Array(p*Y);for(let m=0;m<H.length;m++){let R=H[m],J=D[m];b[m]=v?Math.sqrt(R*R+J*J):Math.abs(R)+Math.abs(J)}for(let m=1;m<Y-1;m++)for(let R=1;R<p-1;R++){let J=m*p+R,x=b[J];if(x===0){L[J]=0;continue}let N=H[J],F=D[J],M=0,U=0,q=Math.abs(N),K=Math.abs(F);if(K>2.4142*q)M=b[J-p],U=b[J+p];else if(q>2.4142*K)M=b[J-1],U=b[J+1];else{let T=(N^F)<0?-1:1;F>0?(M=b[(m-1)*p+(R-T)],U=b[(m+1)*p+(R+T)]):(M=b[(m+1)*p+(R-T)],U=b[(m-1)*p+(R+T)]),N>0&&F>0||N<0&&F<0?(M=b[(m-1)*p+(R+1)],U=b[(m+1)*p+(R-1)]):(M=b[(m-1)*p+(R-1)],U=b[(m+1)*p+(R+1)])}L[J]=x>=M&&x>=U?x:0}return L})(d,G,g,C,a)}l=performance.now(),e.push({step:"Non-Max Suppression",ms:(l-B).toFixed(2)}),B=performance.now();let y=a?n*n:n,u=a?i*i:i,S;if(r)try{await tA(),S=PA(k,g,C,y,u)}catch{S=JA(k,g,C,y,u)}else S=JA(k,g,C,y,u);l=performance.now(),e.push({step:"Hysteresis",ms:(l-B).toFixed(2)}),B=performance.now();let Z=new Uint8ClampedArray(g*C);for(let H=0;H<S.length;H++)Z[H]=S[H]===2?255:0;l=performance.now(),e.push({step:"Binary Image",ms:(l-B).toFixed(2)}),B=performance.now();let P=Z;if(s)try{await tA(),P=(function(H,D,p,Y){let v=dA(H,W.__wbindgen_malloc),b=IA,L=W.dilate(v,b,D,p,Y);var m=cA(L[0],L[1]).slice();return W.__wbindgen_free(L[0],1*L[1],1),m})(Z,g,C,o)}catch{P=(function(H,D,p,Y=5){let v=Math.floor(Y/2),b=new Uint8ClampedArray(D*p),L=new Uint8ClampedArray(D*p);for(let m=0;m<p;m++){let R=m*D;for(let J=0;J<D;J++){let x=0;for(let N=-v;N<=v;N++){let F=J+N;if(F>=0&&F<D){let M=H[R+F];M>x&&(x=M)}}b[R+J]=x}}for(let m=0;m<D;m++)for(let R=0;R<p;R++){let J=0;for(let x=-v;x<=v;x++){let N=R+x;if(N>=0&&N<p){let F=b[N*D+m];F>J&&(J=F)}}L[R*D+m]=J}return L})(Z,g,C,o)}if(l=performance.now(),e.push({step:"Dilation",ms:(l-B).toFixed(2)}),E){A.debug.dx=d,A.debug.dy=G;let H=new Float32Array(g*C);for(let D=0;D<d.length;D++){let p=d[D],Y=G[D];H[D]=a?Math.sqrt(p*p+Y*Y):Math.abs(p)+Math.abs(Y)}A.debug.magnitude=H,A.debug.suppressed=k,A.debug.edgeMap=S,A.debug.cannyEdges=Z,A.debug.finalEdges=P}A.debug?A.debug.timings=e:A.debug||(A.debug={timings:e});let j=performance.now();return e.unshift({step:"Edge Detection Total",ms:(j-Q).toFixed(2)}),P}function oA(I){return I<=0?0:I>=1?1:I}function nA(I,A){return Math.hypot(I.x-A.x,I.y-A.y)}function GA(I){return[nA(I.topLeft,I.topRight),nA(I.topRight,I.bottomRight),nA(I.bottomRight,I.bottomLeft),nA(I.bottomLeft,I.topLeft)]}function zA(I){let A=(function(e){let Q=[e.topLeft,e.topRight,e.bottomRight,e.bottomLeft],g=[];for(let C=0;C<Q.length;C++){let t=Q[(C+Q.length-1)%Q.length],n=Q[C],i=Q[(C+1)%Q.length],c=t.x-n.x,h=t.y-n.y,a=i.x-n.x,s=i.y-n.y,o=c*a+h*s,r=Math.max(1e-6,Math.hypot(c,h)*Math.hypot(a,s)),w=Math.max(-1,Math.min(1,o/r));g.push(180*Math.acos(w)/Math.PI)}return g})(I),E=0;for(let e of A)E+=oA(1-Math.abs(e-90)/55);return E/Math.max(1,A.length)}function kA(I,A){let E=Number(A.isValid)-Number(I.isValid);if(E!==0)return E;let e=A.confidence-I.confidence;if(!(Math.abs(e)<.015)&&e!==0)return e;let Q=Math.abs((I.approxCount??99)-4)-Math.abs((A.approxCount??99)-4);if(Q!==0)return Q;let g=(A.rightAngleScore??0)-(I.rightAngleScore??0);if(Math.abs(g)>1e-6)return g;let C=Math.abs(1-(I.contourFitRatio??1))-Math.abs(1-(A.contourFitRatio??1));return Math.abs(C)>1e-6?C:e||A.score-I.score||A.coverageRatio-I.coverageRatio||A.area-I.area}function _A(I,A,E,e,Q={}){let g=Q.epsilon||.02,C=SA(I.points,g).length,t=TA(I,{epsilon:g});if(!t)return{contour:I,corners:null,score:0,confidence:0,isValid:!1,area:I.area||0,fillRatio:0,coverageRatio:0,cornersArea:0,approxCount:C,convex:!1,edgeSupport:0,aspectRatio:1/0,minSide:0,rightAngleScore:0,oppositeSideConsistency:0,contourFitRatio:0,contourFitScore:0};let n=E*e,i=I.area||0,c=I.boundingBox||{minX:0,minY:0,maxX:0,maxY:0},h=i/Math.max(1,(c.maxX-c.minX+1)*(c.maxY-c.minY+1)),a=(function(N){if(!N)return 0;let F=[N.topLeft,N.topRight,N.bottomRight,N.bottomLeft],M=0;for(let U=0;U<F.length;U++){let q=(U+1)%F.length;M+=F[U].x*F[q].y-F[q].x*F[U].y}return Math.abs(M)/2})(t),s=a/Math.max(1,n),o=GA(t),r=Math.min(...o),w=(o[0]+o[2])/2,B=(o[1]+o[3])/2,l=w>B?w/Math.max(1e-6,B):B/Math.max(1e-6,w),f=(function(N){let F=[N.topLeft,N.topRight,N.bottomRight,N.bottomLeft],M=[];for(let q=0;q<F.length;q++){let K=F[q],T=F[(q+1)%F.length],V=F[(q+2)%F.length],X=(T.x-K.x)*(V.y-T.y)-(T.y-K.y)*(V.x-T.x);Math.abs(X)<1e-6||M.push(Math.sign(X))}if(M.length<3)return!1;let U=M[0];return M.every(q=>q===U)})(t),d=(function(N,F,M,U){if(!N?.points||N.points.length===0)return 0;let q=Math.max(1,Math.floor(N.points.length/240)),K=0,T=0;for(let V=0;V<N.points.length;V+=q){let X=N.points[V],z=Math.max(0,Math.min(M-1,0|X.x)),_=Math.max(0,Math.min(U-1,0|X.y));K++;let gA=!1;for(let $=-1;$<=1&&!gA;$++){let AA=_+$;if(!(AA<0||AA>=U))for(let BA=-1;BA<=1;BA++){let CA=z+BA;if(!(CA<0||CA>=M)&&F[AA*M+CA]>0){gA=!0;break}}}gA&&T++}return K===0?0:T/K})(I,A,E,e),G=zA(t),k=(function(N){let F=GA(N);return(Math.min(F[0],F[2])/Math.max(1e-6,Math.max(F[0],F[2]))+Math.min(F[1],F[3])/Math.max(1e-6,Math.max(F[1],F[3])))/2})(t),y=i/Math.max(1,a),u=oA(1-Math.abs(y-1)/.55),S=C===4?1:C===5?.9:C===6?.7:C<=8?.5:.28,Z=oA(i/Math.max(1,.4*n)),P=oA((h-.08)/.72),j=oA((s-.03)/.82),H=Q.minDocumentSideRatio!==void 0?Q.minDocumentSideRatio:.06,D=Q.minDocumentCoverageRatio!==void 0?Q.minDocumentCoverageRatio:.04,p=Q.maxDocumentAspectRatio!==void 0?Q.maxDocumentAspectRatio:8,Y=Q.minDocumentFillRatio!==void 0?Q.minDocumentFillRatio:.07,v=Q.minContourFitRatio!==void 0?Q.minContourFitRatio:.11,b=Q.maxContourFitRatio!==void 0?Q.maxContourFitRatio:1.2,L=Q.minRightAngleScore!==void 0?Q.minRightAngleScore:.42,m=Q.minOppositeSideConsistency!==void 0?Q.minOppositeSideConsistency:.3,R=Math.min(E,e)*H,J=(function(N,F=6){let M=[N?.topLeft,N?.topRight,N?.bottomRight,N?.bottomLeft];if(M.some(U=>!U||!Number.isFinite(U.x)||!Number.isFinite(U.y)))return!1;for(let U=0;U<M.length;U++)for(let q=U+1;q<M.length;q++)if(nA(M[U],M[q])<F)return!1;return!0})(t)&&f&&r>=R&&s>=D&&l<=p&&h>=Y&&y>=v&&y<=b&&G>=L&&k>=m,x=.22*Z+.14*P+.15*S+.08*(f?1:0)+.08*d+.13*j+.1*G+.05*k+.05*u;return{contour:I,corners:t,score:x,confidence:J?x:.33*x,isValid:J,area:i,fillRatio:h,coverageRatio:s,cornersArea:a,approxCount:C,convex:f,edgeSupport:d,aspectRatio:l,minSide:r,rightAngleScore:G,oppositeSideConsistency:k,contourFitRatio:y,contourFitScore:u}}async function $A(I,A,E,e,Q={}){let g=Q.debug?{}:{_timingsOnly:!0},C=[];g&&!g._timingsOnly&&(g.preprocessing={scaledDimensions:{width:A,height:E},scaleFactor:e,maxProcessingDimension:Q.maxProcessingDimension||800});let t=(function(B={}){let l=B.dilationKernelSize||3,f=B.dilationIterations||1,d=B.applyDilation===void 0||B.applyDilation,G=[{name:"default",lowThreshold:B.lowThreshold,highThreshold:B.highThreshold,dilationKernelSize:l,dilationIterations:f,applyDilation:d}];if(B.enableDetectionCascade===!1)return G;G.push({name:"connect-edges",lowThreshold:B.lowThreshold,highThreshold:B.highThreshold,dilationKernelSize:Math.max(l,5),dilationIterations:Math.max(f,2),applyDilation:!0}),G.push({name:"no-dilation",lowThreshold:B.lowThreshold,highThreshold:B.highThreshold,dilationKernelSize:l,dilationIterations:f,applyDilation:!1}),B.lowThreshold===void 0&&B.highThreshold===void 0&&G.push({name:"fixed-mid-thresholds",lowThreshold:60,highThreshold:180,dilationKernelSize:l,dilationIterations:f,applyDilation:d});let k=[],y=new Set;for(let u of G){let S=[u.lowThreshold,u.highThreshold,u.dilationKernelSize,u.dilationIterations,u.applyDilation].join(":");y.has(S)||(y.add(S),k.push(u))}return k})(Q),n=[],i=async(B,l)=>{let f=B.name||`pass-${l+1}`,d=l===0?"":` (${f})`,G=Q.debug?{}:{_timingsOnly:!0},k=await OA(I,{width:A,height:E,lowThreshold:B.lowThreshold,highThreshold:B.highThreshold,dilationKernelSize:B.dilationKernelSize,dilationIterations:B.dilationIterations,applyDilation:B.applyDilation,debug:G,skipGrayscale:!0,useWasmBlur:!0,useWasmHysteresis:Q.useWasmHysteresis,useWasmFullCanny:Q.useWasmFullCanny});G.timings&&G.timings.forEach(P=>{P.step!=="Edge Detection Total"&&C.push({step:`${P.step}${d}`,ms:P.ms})});let y=performance.now(),u=YA(k,{minArea:(Q.minArea||1e3)/(e*e),width:A,height:E});C.push({step:`Find Contours${d}`,ms:(performance.now()-y).toFixed(2)}),y=performance.now();let{best:S,candidates:Z}=(function(P,j,H,D,p={}){let Y=p.maxCandidateContours||12,v=P.slice(0,Y).map((b,L)=>({rankByArea:L,..._A(b,j,H,D,p)})).sort(kA);return{best:v[0]||null,candidates:v}})(u,k,A,E,Q);return C.push({step:`Corner Detection${d}`,ms:(performance.now()-y).toFixed(2)}),{name:f,params:{lowThreshold:B.lowThreshold,highThreshold:B.highThreshold,dilationKernelSize:B.dilationKernelSize,dilationIterations:B.dilationIterations,applyDilation:B.applyDilation},contours:u,best:S,candidates:Z}},c=await i(t[0],0);if(n.push(c),(function(B,l={}){if(l.enableDetectionCascade===!1)return!1;if(!B||!B.corners)return!0;let f=l.minCascadeTriggerConfidence!==void 0?l.minCascadeTriggerConfidence:.68;return!B.isValid||B.confidence<f||B.approxCount>5||B.rightAngleScore<.55||B.contourFitRatio<.14})(c.best,Q))for(let B=1;B<t.length;B++)n.push(await i(t[B],B));let h=[];for(let B of n)for(let l of B.candidates)h.push({...l,passName:B.name,passParams:B.params});h.sort(kA);let a=h[0]||null,s=h;if(!a||!a.corners)return{success:!1,message:"No document detected",debug:g._timingsOnly?null:g,timings:C};g&&!g._timingsOnly&&(g.passes=n.map(B=>({name:B.name,params:B.params,contourCount:B.contours.length,bestCandidate:B.best?{score:B.best.score,confidence:B.best.confidence,isValid:B.best.isValid,approxCount:B.best.approxCount,coverageRatio:B.best.coverageRatio,fillRatio:B.best.fillRatio,rightAngleScore:B.best.rightAngleScore,contourFitRatio:B.best.contourFitRatio}:null})),g.candidates=s.map(B=>({passName:B.passName,rankByArea:B.rankByArea,area:B.area,fillRatio:B.fillRatio,coverageRatio:B.coverageRatio,cornersArea:B.cornersArea,approxCount:B.approxCount,convex:B.convex,edgeSupport:B.edgeSupport,aspectRatio:B.aspectRatio,minSide:B.minSide,rightAngleScore:B.rightAngleScore,oppositeSideConsistency:B.oppositeSideConsistency,contourFitRatio:B.contourFitRatio,contourFitScore:B.contourFitScore,score:B.score,confidence:B.confidence,isValid:B.isValid})),g.selectedCandidate=s[0]?{passName:s[0].passName,rankByArea:s[0].rankByArea,area:s[0].area,fillRatio:s[0].fillRatio,coverageRatio:s[0].coverageRatio,approxCount:s[0].approxCount,edgeSupport:s[0].edgeSupport,aspectRatio:s[0].aspectRatio,minSide:s[0].minSide,rightAngleScore:s[0].rightAngleScore,oppositeSideConsistency:s[0].oppositeSideConsistency,contourFitRatio:s[0].contourFitRatio,score:s[0].score,confidence:s[0].confidence,isValid:s[0].isValid}:null);let o=a.corners,r=a.contour,w=o;return e!==1&&(w={topLeft:{x:o.topLeft.x*e,y:o.topLeft.y*e},topRight:{x:o.topRight.x*e,y:o.topRight.y*e},bottomRight:{x:o.bottomRight.x*e,y:o.bottomRight.y*e},bottomLeft:{x:o.bottomLeft.x*e,y:o.bottomLeft.y*e}}),{success:!0,contour:r,corners:w,confidence:a.confidence,debug:g._timingsOnly?null:g,timings:C}}function AI(I,A,E){let{topLeft:e,topRight:Q,bottomRight:g,bottomLeft:C}=E,t=Math.hypot(g.x-C.x,g.y-C.y),n=Math.hypot(Q.x-e.x,Q.y-e.y),i=Math.round(Math.max(t,n)),c=Math.hypot(Q.x-g.x,Q.y-g.y),h=Math.hypot(e.x-C.x,e.y-C.y),a=Math.round(Math.max(c,h));I.canvas.width=i,I.canvas.height=a,(function(s,o,r,w,B){let l=o&&typeof o.width=="number"&&typeof o.height=="number"&&o.data,f=o.width||o.naturalWidth,d=o.height||o.naturalHeight,G=document.createElement("canvas");G.width=f,G.height=d;let k=G.getContext("2d",{willReadFrequently:!0});l?k.putImageData(o,0,0):k.drawImage(o,0,0,f,d);let y=k.getImageData(0,0,f,d).data,u=(function(J){let x=J[0][0],N=J[0][1],F=J[0][2],M=J[1][0],U=J[1][1],q=J[1][2],K=J[2][0],T=J[2][1],V=J[2][2],X=U*V-q*T,z=-(M*V-q*K),_=M*T-U*K,gA=-(N*V-F*T),$=x*V-F*K,AA=-(x*T-N*K),BA=N*q-F*U,CA=-(x*q-F*M),QA=x*U-N*M,O=x*X+N*z+F*_;if(O===0)throw new Error("Singular matrix");return[[X/O,gA/O,BA/O],[z/O,$/O,CA/O],[_/O,AA/O,QA/O]]})(r),S=u[0][0],Z=u[0][1],P=u[0][2],j=u[1][0],H=u[1][1],D=u[1][2],p=u[2][0],Y=u[2][1],v=u[2][2],b=s.createImageData(w,B),L=b.data,m=f-1,R=d-1;for(let J=0;J<B;J++){let x=Z*J+P,N=H*J+D,F=Y*J+v;for(let M=0;M<w;M++){let U=1/(p*M+F),q=(S*M+x)*U,K=(j*M+N)*U,T=q<0?0:q>m?m:q,V=K<0?0:K>R?R:K,X=0|T,z=0|V,_=X<m?X+1:X,gA=z<R?z+1:z,$=T-X,AA=V-z,BA=1-$,CA=1-AA,QA=BA*CA,O=$*CA,rA=BA*AA,hA=$*AA,lA=z*f+X<<2,yA=z*f+_<<2,DA=gA*f+X<<2,wA=gA*f+_<<2,aA=J*w+M<<2;L[aA]=y[lA]*QA+y[yA]*O+y[DA]*rA+y[wA]*hA+.5|0,L[aA+1]=y[lA+1]*QA+y[yA+1]*O+y[DA+1]*rA+y[wA+1]*hA+.5|0,L[aA+2]=y[lA+2]*QA+y[yA+2]*O+y[DA+2]*rA+y[wA+2]*hA+.5|0,L[aA+3]=255}}s.putImageData(b,0,0)})(I,A,(function(s,o){let r=(function(w,B){let l=w.length,f=w[0].length,d=w.map(y=>y.slice()),G=B.slice();for(let y=0;y<f;y++){let u=y;for(let S=y+1;S<l;S++)Math.abs(d[S][y])>Math.abs(d[u][y])&&(u=S);[d[y],d[u]]=[d[u],d[y]],[G[y],G[u]]=[G[u],G[y]];for(let S=y+1;S<l;S++){let Z=d[S][y]/d[y][y];for(let P=y;P<f;P++)d[S][P]-=Z*d[y][P];G[S]-=Z*G[y]}}let k=new Array(f);for(let y=f-1;y>=0;y--){let u=G[y];for(let S=y+1;S<f;S++)u-=d[y][S]*k[S];k[y]=u/d[y][y]}return k})((function(w){let B=[];for(let l=0;l<4;l++){let[f,d]=w[l];B.push([f,d,1,0,0,0,-f*o[l][0],-d*o[l][0]]),B.push([0,0,0,f,d,1,-f*o[l][1],-d*o[l][1]])}return B})(s),[o[0][0],o[0][1],o[1][0],o[1][1],o[2][0],o[2][1],o[3][0],o[3][1]]);return[[r[0],r[1],r[2]],[r[3],r[4],r[5]],[r[6],r[7],1]]})([[e.x,e.y],[Q.x,Q.y],[g.x,g.y],[C.x,C.y]],[[0,0],[i-1,0],[i-1,a-1],[0,a-1]]),i,a)}async function xA(I,A={}){let E=[],e=performance.now(),Q=A.mode||"detect",g=A.output||"canvas",C=A.maxProcessingDimension||800,t,n,i,c;if((A.detector||"classical")==="ml"){n=performance.now();let{detectDocumentMl:a}=await import("./scanic-ml-stub-KW7IZHUT.js");t=await a(I,A.ml||{}),E.push({step:"ML Detection Total",ms:(performance.now()-n).toFixed(2)}),t.timings&&t.timings.forEach(s=>E.push(s))}else{n=performance.now();let{grayscaleData:a,scaleFactor:s,scaledDimensions:o}=await(async function(r,w=800){let B,l,f=r&&typeof r.width=="number"&&typeof r.height=="number"&&r.data;if(f)B=r.width,l=r.height;else{if(!r)throw new Error("No image provided");B=r.width||r.naturalWidth,l=r.height||r.naturalHeight}let d=Math.max(B,l),G,k,y;if(d<=w)G=B,k=l,y=1;else{let D=w/d;G=Math.round(B*D),k=Math.round(l*D),y=1/D}let u=typeof OffscreenCanvas<"u",S=u?new OffscreenCanvas(G,k):document.createElement("canvas");u||(S.width=G,S.height=k);let Z=S.getContext("2d",{willReadFrequently:!0});if(Z.imageSmoothingEnabled=!0,Z.imageSmoothingQuality="medium",f){let D=u?new OffscreenCanvas(B,l):document.createElement("canvas");u||(D.width=B,D.height=l),D.getContext("2d").putImageData(r,0,0),Z.drawImage(D,0,0,B,l,0,0,G,k)}else Z.drawImage(r,0,0,B,l,0,0,G,k);let P=Z.getImageData(0,0,G,k),j=P.data,H=new Uint8ClampedArray(G*k);for(let D=0,p=0;D<j.length;D+=4,p++){let Y=54*j[D]+183*j[D+1]+19*j[D+2]>>8;H[p]=Y,j[D]=j[D+1]=j[D+2]=Y}return{grayscaleData:H,imageData:P,scaleFactor:y,originalDimensions:{width:B,height:l},scaledDimensions:{width:G,height:k}}})(I,C);E.push({step:"Image Prep + Scale + Gray",ms:(performance.now()-n).toFixed(2)}),t=await $A(a,o.width,o.height,s,A),t.timings&&t.timings.forEach(r=>E.push(r))}if(!t.success){let a=performance.now();return E.unshift({step:"Total",ms:(a-e).toFixed(2)}),{output:null,corners:null,contour:null,confidence:t.confidence||null,score:t.score??null,debug:t.debug,success:!1,message:t.message||"No document detected",timings:E}}Q==="detect"?c=null:Q==="extract"&&(n=performance.now(),i=document.createElement("canvas"),AI(i.getContext("2d"),I,t.corners),E.push({step:"Perspective Transform",ms:(performance.now()-n).toFixed(2)})),Q!=="detect"&&i&&(n=performance.now(),c=g==="canvas"?i:g==="imagedata"?i.getContext("2d").getImageData(0,0,i.width,i.height):g==="dataurl"?i.toDataURL():i,E.push({step:"Output Conversion",ms:(performance.now()-n).toFixed(2)}));let h=performance.now();return E.unshift({step:"Total",ms:(h-e).toFixed(2)}),{output:c,corners:t.corners,contour:t.contour??null,confidence:t.confidence||null,score:t.score??null,debug:t.debug,success:!0,message:"Document detected",timings:E}}var QI="1.5.0";var II=.35;async function tI(I){let A=await xA(I,{mode:"detect",detector:"classical",maxProcessingDimension:NA});return!A.success||A.corners===null||typeof A.confidence=="number"&&A.confidence<II?null:A.corners}export{II as DOC_DETECT_MIN_CONFIDENCE,NA as DOC_DETECT_WIDTH,QI as SCANIC_VERSION,tI as detectQuad};
|