@scanly/core 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/barcode/contracts.d.ts +44 -0
- package/dist/barcode/contracts.d.ts.map +1 -0
- package/dist/barcode/contracts.js +33 -0
- package/dist/barcode/contracts.js.map +1 -0
- package/dist/barcode/format-selection.d.ts +12 -0
- package/dist/barcode/format-selection.d.ts.map +1 -0
- package/dist/barcode/format-selection.js +32 -0
- package/dist/barcode/format-selection.js.map +1 -0
- package/dist/barcode/format.d.ts +7 -0
- package/dist/barcode/format.d.ts.map +1 -0
- package/dist/barcode/format.js +20 -0
- package/dist/barcode/format.js.map +1 -0
- package/dist/barcode/index.d.ts +5 -0
- package/dist/barcode/index.d.ts.map +1 -0
- package/dist/barcode/index.js +5 -0
- package/dist/barcode/index.js.map +1 -0
- package/dist/barcode/retail.d.ts +16 -0
- package/dist/barcode/retail.d.ts.map +1 -0
- package/dist/barcode/retail.js +95 -0
- package/dist/barcode/retail.js.map +1 -0
- package/dist/contracts/engine.d.ts +84 -0
- package/dist/contracts/engine.d.ts.map +1 -0
- package/dist/contracts/engine.js +2 -0
- package/dist/contracts/engine.js.map +1 -0
- package/dist/contracts/errors.d.ts +17 -0
- package/dist/contracts/errors.d.ts.map +1 -0
- package/dist/contracts/errors.js +31 -0
- package/dist/contracts/errors.js.map +1 -0
- package/dist/contracts/frame.d.ts +37 -0
- package/dist/contracts/frame.d.ts.map +1 -0
- package/dist/contracts/frame.js +77 -0
- package/dist/contracts/frame.js.map +1 -0
- package/dist/contracts/operator.d.ts +46 -0
- package/dist/contracts/operator.d.ts.map +1 -0
- package/dist/contracts/operator.js +14 -0
- package/dist/contracts/operator.js.map +1 -0
- package/dist/contracts/result.d.ts +135 -0
- package/dist/contracts/result.d.ts.map +1 -0
- package/dist/contracts/result.js +2 -0
- package/dist/contracts/result.js.map +1 -0
- package/dist/contracts/validator.d.ts +15 -0
- package/dist/contracts/validator.d.ts.map +1 -0
- package/dist/contracts/validator.js +2 -0
- package/dist/contracts/validator.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/industrial/candidate-region.d.ts +15 -0
- package/dist/industrial/candidate-region.d.ts.map +1 -0
- package/dist/industrial/candidate-region.js +108 -0
- package/dist/industrial/candidate-region.js.map +1 -0
- package/dist/industrial/coordinate-transform.d.ts +9 -0
- package/dist/industrial/coordinate-transform.d.ts.map +1 -0
- package/dist/industrial/coordinate-transform.js +42 -0
- package/dist/industrial/coordinate-transform.js.map +1 -0
- package/dist/industrial/decode-candidate-conflict.d.ts +8 -0
- package/dist/industrial/decode-candidate-conflict.d.ts.map +1 -0
- package/dist/industrial/decode-candidate-conflict.js +97 -0
- package/dist/industrial/decode-candidate-conflict.js.map +1 -0
- package/dist/industrial/difficulty-diagnosis.d.ts +15 -0
- package/dist/industrial/difficulty-diagnosis.d.ts.map +1 -0
- package/dist/industrial/difficulty-diagnosis.js +291 -0
- package/dist/industrial/difficulty-diagnosis.js.map +1 -0
- package/dist/industrial/index.d.ts +13 -0
- package/dist/industrial/index.d.ts.map +1 -0
- package/dist/industrial/index.js +13 -0
- package/dist/industrial/index.js.map +1 -0
- package/dist/industrial/memory.d.ts +28 -0
- package/dist/industrial/memory.d.ts.map +1 -0
- package/dist/industrial/memory.js +65 -0
- package/dist/industrial/memory.js.map +1 -0
- package/dist/industrial/pixels.d.ts +44 -0
- package/dist/industrial/pixels.d.ts.map +1 -0
- package/dist/industrial/pixels.js +295 -0
- package/dist/industrial/pixels.js.map +1 -0
- package/dist/industrial/recovery-pipeline.d.ts +26 -0
- package/dist/industrial/recovery-pipeline.d.ts.map +1 -0
- package/dist/industrial/recovery-pipeline.js +149 -0
- package/dist/industrial/recovery-pipeline.js.map +1 -0
- package/dist/industrial/recovery-planner.d.ts +10 -0
- package/dist/industrial/recovery-planner.d.ts.map +1 -0
- package/dist/industrial/recovery-planner.js +107 -0
- package/dist/industrial/recovery-planner.js.map +1 -0
- package/dist/industrial/recovery-route-registry.d.ts +12 -0
- package/dist/industrial/recovery-route-registry.d.ts.map +1 -0
- package/dist/industrial/recovery-route-registry.js +15 -0
- package/dist/industrial/recovery-route-registry.js.map +1 -0
- package/dist/industrial/recovery-routes.d.ts +89 -0
- package/dist/industrial/recovery-routes.d.ts.map +1 -0
- package/dist/industrial/recovery-routes.js +280 -0
- package/dist/industrial/recovery-routes.js.map +1 -0
- package/dist/industrial/scan-evidence.d.ts +5 -0
- package/dist/industrial/scan-evidence.d.ts.map +1 -0
- package/dist/industrial/scan-evidence.js +63 -0
- package/dist/industrial/scan-evidence.js.map +1 -0
- package/dist/industrial/scanner-diagnostics.d.ts +19 -0
- package/dist/industrial/scanner-diagnostics.d.ts.map +1 -0
- package/dist/industrial/scanner-diagnostics.js +35 -0
- package/dist/industrial/scanner-diagnostics.js.map +1 -0
- package/dist/industrial/types.d.ts +189 -0
- package/dist/industrial/types.d.ts.map +1 -0
- package/dist/industrial/types.js +2 -0
- package/dist/industrial/types.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +2 -0
- package/dist/node.js.map +1 -0
- package/dist/qr/candidate-dedupe.d.ts +6 -0
- package/dist/qr/candidate-dedupe.d.ts.map +1 -0
- package/dist/qr/candidate-dedupe.js +27 -0
- package/dist/qr/candidate-dedupe.js.map +1 -0
- package/dist/qr/candidate-generation.d.ts +46 -0
- package/dist/qr/candidate-generation.d.ts.map +1 -0
- package/dist/qr/candidate-generation.js +277 -0
- package/dist/qr/candidate-generation.js.map +1 -0
- package/dist/qr/decode-pipeline.d.ts +14 -0
- package/dist/qr/decode-pipeline.d.ts.map +1 -0
- package/dist/qr/decode-pipeline.js +615 -0
- package/dist/qr/decode-pipeline.js.map +1 -0
- package/dist/qr/geometry.d.ts +24 -0
- package/dist/qr/geometry.d.ts.map +1 -0
- package/dist/qr/geometry.js +64 -0
- package/dist/qr/geometry.js.map +1 -0
- package/dist/qr/grayscale.d.ts +13 -0
- package/dist/qr/grayscale.d.ts.map +1 -0
- package/dist/qr/grayscale.js +46 -0
- package/dist/qr/grayscale.js.map +1 -0
- package/dist/qr/image-loader-node.d.ts +4 -0
- package/dist/qr/image-loader-node.d.ts.map +1 -0
- package/dist/qr/image-loader-node.js +26 -0
- package/dist/qr/image-loader-node.js.map +1 -0
- package/dist/qr/index.d.ts +15 -0
- package/dist/qr/index.d.ts.map +1 -0
- package/dist/qr/index.js +15 -0
- package/dist/qr/index.js.map +1 -0
- package/dist/qr/jsqr-decoder.d.ts +10 -0
- package/dist/qr/jsqr-decoder.d.ts.map +1 -0
- package/dist/qr/jsqr-decoder.js +18 -0
- package/dist/qr/jsqr-decoder.js.map +1 -0
- package/dist/qr/preprocess.d.ts +18 -0
- package/dist/qr/preprocess.d.ts.map +1 -0
- package/dist/qr/preprocess.js +165 -0
- package/dist/qr/preprocess.js.map +1 -0
- package/dist/qr/region-detection.d.ts +25 -0
- package/dist/qr/region-detection.d.ts.map +1 -0
- package/dist/qr/region-detection.js +129 -0
- package/dist/qr/region-detection.js.map +1 -0
- package/dist/qr/result-normalizer.d.ts +9 -0
- package/dist/qr/result-normalizer.d.ts.map +1 -0
- package/dist/qr/result-normalizer.js +70 -0
- package/dist/qr/result-normalizer.js.map +1 -0
- package/dist/qr/rotate.d.ts +5 -0
- package/dist/qr/rotate.d.ts.map +1 -0
- package/dist/qr/rotate.js +51 -0
- package/dist/qr/rotate.js.map +1 -0
- package/dist/qr/types.d.ts +186 -0
- package/dist/qr/types.d.ts.map +1 -0
- package/dist/qr/types.js +67 -0
- package/dist/qr/types.js.map +1 -0
- package/dist/qr/zxing-decoder.d.ts +8 -0
- package/dist/qr/zxing-decoder.d.ts.map +1 -0
- package/dist/qr/zxing-decoder.js +33 -0
- package/dist/qr/zxing-decoder.js.map +1 -0
- package/dist/runtime/artifacts.d.ts +16 -0
- package/dist/runtime/artifacts.d.ts.map +1 -0
- package/dist/runtime/artifacts.js +52 -0
- package/dist/runtime/artifacts.js.map +1 -0
- package/dist/runtime/builtin-operators.d.ts +12 -0
- package/dist/runtime/builtin-operators.d.ts.map +1 -0
- package/dist/runtime/builtin-operators.js +487 -0
- package/dist/runtime/builtin-operators.js.map +1 -0
- package/dist/runtime/capabilities.d.ts +32 -0
- package/dist/runtime/capabilities.d.ts.map +1 -0
- package/dist/runtime/capabilities.js +18 -0
- package/dist/runtime/capabilities.js.map +1 -0
- package/dist/runtime/engine-registry.d.ts +19 -0
- package/dist/runtime/engine-registry.d.ts.map +1 -0
- package/dist/runtime/engine-registry.js +136 -0
- package/dist/runtime/engine-registry.js.map +1 -0
- package/dist/runtime/execution-budget.d.ts +25 -0
- package/dist/runtime/execution-budget.d.ts.map +1 -0
- package/dist/runtime/execution-budget.js +41 -0
- package/dist/runtime/execution-budget.js.map +1 -0
- package/dist/runtime/frame-lease.d.ts +10 -0
- package/dist/runtime/frame-lease.d.ts.map +1 -0
- package/dist/runtime/frame-lease.js +17 -0
- package/dist/runtime/frame-lease.js.map +1 -0
- package/dist/runtime/frame-normalization.d.ts +13 -0
- package/dist/runtime/frame-normalization.d.ts.map +1 -0
- package/dist/runtime/frame-normalization.js +21 -0
- package/dist/runtime/frame-normalization.js.map +1 -0
- package/dist/runtime/memory-budget.d.ts +32 -0
- package/dist/runtime/memory-budget.d.ts.map +1 -0
- package/dist/runtime/memory-budget.js +109 -0
- package/dist/runtime/memory-budget.js.map +1 -0
- package/dist/runtime/operator-registry.d.ts +11 -0
- package/dist/runtime/operator-registry.d.ts.map +1 -0
- package/dist/runtime/operator-registry.js +19 -0
- package/dist/runtime/operator-registry.js.map +1 -0
- package/dist/runtime/result-policies.d.ts +21 -0
- package/dist/runtime/result-policies.d.ts.map +1 -0
- package/dist/runtime/result-policies.js +62 -0
- package/dist/runtime/result-policies.js.map +1 -0
- package/dist/runtime/router.d.ts +45 -0
- package/dist/runtime/router.d.ts.map +1 -0
- package/dist/runtime/router.js +202 -0
- package/dist/runtime/router.js.map +1 -0
- package/dist/runtime/scenario-compiler.d.ts +32 -0
- package/dist/runtime/scenario-compiler.d.ts.map +1 -0
- package/dist/runtime/scenario-compiler.js +131 -0
- package/dist/runtime/scenario-compiler.js.map +1 -0
- package/dist/runtime/scenario-runtime.d.ts +4 -0
- package/dist/runtime/scenario-runtime.d.ts.map +1 -0
- package/dist/runtime/scenario-runtime.js +32 -0
- package/dist/runtime/scenario-runtime.js.map +1 -0
- package/dist/runtime/session.d.ts +40 -0
- package/dist/runtime/session.d.ts.map +1 -0
- package/dist/runtime/session.js +117 -0
- package/dist/runtime/session.js.map +1 -0
- package/dist/runtime/validator-registry.d.ts +11 -0
- package/dist/runtime/validator-registry.d.ts.map +1 -0
- package/dist/runtime/validator-registry.js +16 -0
- package/dist/runtime/validator-registry.js.map +1 -0
- package/package.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# @scanly/core
|
|
2
|
+
|
|
3
|
+
Framework-independent SDK v2 preview contracts, bounded capture router, deterministic session lifecycle, and the migrated QR pipeline. It has no React or Next.js dependency. The default QR path currently supports QR Code Model 2 through jsQR and ZXing JavaScript; other format identifiers are capability vocabulary, not support claims.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { BarcodeFormat, BarcodeFormatClass } from "@scanly/scenario-schema";
|
|
2
|
+
import type { CornerPoint, ScanResult } from "../contracts/result.js";
|
|
3
|
+
import type { RetailBarcodeMetadata } from "./retail.js";
|
|
4
|
+
export interface Gs1Metadata {
|
|
5
|
+
applicationIdentifiers: readonly string[];
|
|
6
|
+
rawFnc1?: boolean;
|
|
7
|
+
parseWarnings?: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
export interface BarcodeMetadata {
|
|
10
|
+
retail?: RetailBarcodeMetadata;
|
|
11
|
+
gs1?: Gs1Metadata;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface StructuredAppendMetadata {
|
|
15
|
+
index: number;
|
|
16
|
+
total: number;
|
|
17
|
+
parity?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface DecodedBarcode {
|
|
20
|
+
text: string;
|
|
21
|
+
rawBytes?: Uint8Array;
|
|
22
|
+
format: BarcodeFormat;
|
|
23
|
+
formatClass: BarcodeFormatClass;
|
|
24
|
+
symbologyIdentifier?: string;
|
|
25
|
+
isGs1?: boolean;
|
|
26
|
+
cornerPoints?: readonly CornerPoint[];
|
|
27
|
+
orientation?: number;
|
|
28
|
+
engineId: string;
|
|
29
|
+
engineVersion?: string;
|
|
30
|
+
engineMetadata?: Record<string, unknown>;
|
|
31
|
+
structuredAppend?: StructuredAppendMetadata;
|
|
32
|
+
metadata?: BarcodeMetadata;
|
|
33
|
+
}
|
|
34
|
+
export declare class UnsupportedBarcodeFormatError extends Error {
|
|
35
|
+
readonly code: "unsupported_format";
|
|
36
|
+
constructor(message: string);
|
|
37
|
+
}
|
|
38
|
+
export declare class InvalidBarcodeChecksumError extends Error {
|
|
39
|
+
readonly code: "invalid_barcode_checksum";
|
|
40
|
+
constructor(message: string);
|
|
41
|
+
}
|
|
42
|
+
/** Convert the legacy Alpha.4 result shape to the generic Alpha.5 contract. */
|
|
43
|
+
export declare function toDecodedBarcode(result: ScanResult): DecodedBarcode;
|
|
44
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/barcode/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,MAAM,WAAW,WAAW;IAC1B,sBAAsB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,kBAAkB,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,QAAQ,CAAC,IAAI,EAAG,0BAA0B,CAAU;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,CAenE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { barcodeFormatClass } from "./format.js";
|
|
2
|
+
export class UnsupportedBarcodeFormatError extends Error {
|
|
3
|
+
code = "unsupported_format";
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "UnsupportedBarcodeFormatError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class InvalidBarcodeChecksumError extends Error {
|
|
10
|
+
code = "invalid_barcode_checksum";
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "InvalidBarcodeChecksumError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Convert the legacy Alpha.4 result shape to the generic Alpha.5 contract. */
|
|
17
|
+
export function toDecodedBarcode(result) {
|
|
18
|
+
return {
|
|
19
|
+
text: result.rawText,
|
|
20
|
+
...(result.rawBytes ? { rawBytes: result.rawBytes } : {}),
|
|
21
|
+
format: result.format,
|
|
22
|
+
formatClass: result.formatClass ?? barcodeFormatClass(result.format),
|
|
23
|
+
...(result.symbologyIdentifier ? { symbologyIdentifier: result.symbologyIdentifier } : {}),
|
|
24
|
+
...(result.isGs1 !== undefined ? { isGs1: result.isGs1 } : {}),
|
|
25
|
+
...(result.cornerPoints ? { cornerPoints: result.cornerPoints } : {}),
|
|
26
|
+
...(result.orientation !== undefined ? { orientation: result.orientation } : {}),
|
|
27
|
+
engineId: result.engine.id,
|
|
28
|
+
engineVersion: result.engine.version,
|
|
29
|
+
engineMetadata: result.engine,
|
|
30
|
+
...(result.metadata ? { metadata: result.metadata } : {}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/barcode/contracts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAoCjD,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IAC7C,IAAI,GAAG,oBAA6B,CAAC;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAC3C,IAAI,GAAG,0BAAmC,CAAC;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,OAAO;QACpB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;QAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QACpC,cAAc,EAAE,MAAM,CAAC,MAAM;QAC7B,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BarcodeFormat } from "@scanly/scenario-schema";
|
|
2
|
+
export interface FormatSelection {
|
|
3
|
+
formats: readonly BarcodeFormat[];
|
|
4
|
+
strict?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface NormalizedFormatSelection {
|
|
7
|
+
readonly formats: readonly BarcodeFormat[];
|
|
8
|
+
readonly strict: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function normalizeFormatSelection(selection?: FormatSelection | readonly BarcodeFormat[]): NormalizedFormatSelection;
|
|
11
|
+
export declare function assertFormatsSupported(requested: readonly BarcodeFormat[], supported: readonly BarcodeFormat[], engineId: string): void;
|
|
12
|
+
//# sourceMappingURL=format-selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-selection.d.ts","sourceRoot":"","sources":["../../src/barcode/format-selection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAID,wBAAgB,wBAAwB,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,SAAS,aAAa,EAAE,GAAG,yBAAyB,CAqB1H;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,aAAa,EAAE,EAAE,SAAS,EAAE,SAAS,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAKvI"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SdkException, sdkError } from "../contracts/errors.js";
|
|
2
|
+
import { isPublicBarcodeFormat, PUBLIC_BARCODE_FORMATS } from "./format.js";
|
|
3
|
+
const MAX_REQUESTED_FORMATS = PUBLIC_BARCODE_FORMATS.length;
|
|
4
|
+
export function normalizeFormatSelection(selection) {
|
|
5
|
+
const formats = Array.isArray(selection) ? selection : selection?.formats;
|
|
6
|
+
const strict = Array.isArray(selection) || !selection ? true : selection.strict ?? true;
|
|
7
|
+
if (!formats || formats.length === 0) {
|
|
8
|
+
throw new SdkException(sdkError("unsupported_format", "At least one barcode format must be requested."));
|
|
9
|
+
}
|
|
10
|
+
const unique = [];
|
|
11
|
+
const seen = new Set();
|
|
12
|
+
for (const format of formats) {
|
|
13
|
+
if (!isPublicBarcodeFormat(format)) {
|
|
14
|
+
throw new SdkException(sdkError("unsupported_format", `Unsupported barcode format '${String(format)}'.`, { format: String(format) }));
|
|
15
|
+
}
|
|
16
|
+
if (!seen.has(format)) {
|
|
17
|
+
seen.add(format);
|
|
18
|
+
unique.push(format);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (unique.length > MAX_REQUESTED_FORMATS) {
|
|
22
|
+
throw new SdkException(sdkError("resource_limit_exceeded", `At most ${MAX_REQUESTED_FORMATS} barcode formats may be requested.`));
|
|
23
|
+
}
|
|
24
|
+
return Object.freeze({ formats: Object.freeze(unique), strict });
|
|
25
|
+
}
|
|
26
|
+
export function assertFormatsSupported(requested, supported, engineId) {
|
|
27
|
+
const missing = requested.filter((format) => !supported.includes(format));
|
|
28
|
+
if (missing.length) {
|
|
29
|
+
throw new SdkException(sdkError("unsupported_format", `Engine '${engineId}' does not support: ${missing.join(", ")}.`, { engineId, formats: missing.join(",") }));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=format-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-selection.js","sourceRoot":"","sources":["../../src/barcode/format-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAY5E,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,MAAM,CAAC;AAE5D,MAAM,UAAU,wBAAwB,CAAC,SAAsD;IAC7F,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,SAAyC,EAAE,OAAO,CAAC;IAC3G,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,SAA6B,CAAC,MAAM,IAAI,IAAI,CAAC;IAC7G,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,oBAAoB,EAAE,gDAAgD,CAAC,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,oBAAoB,EAAE,+BAA+B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACxI,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;QAC1C,MAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,yBAAyB,EAAE,WAAW,qBAAqB,oCAAoC,CAAC,CAAC,CAAC;IACpI,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAmC,EAAE,SAAmC,EAAE,QAAgB;IAC/H,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,oBAAoB,EAAE,WAAW,QAAQ,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACpK,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BarcodeFormat, BarcodeFormatClass } from "@scanly/scenario-schema";
|
|
2
|
+
export type { BarcodeFormat, BarcodeFormatClass } from "@scanly/scenario-schema";
|
|
3
|
+
export declare const PUBLIC_BARCODE_FORMATS: readonly BarcodeFormat[];
|
|
4
|
+
export declare const BARCODE_FORMAT_CLASS: Readonly<Record<BarcodeFormat, BarcodeFormatClass>>;
|
|
5
|
+
export declare function barcodeFormatClass(format: BarcodeFormat): BarcodeFormatClass;
|
|
6
|
+
export declare function isPublicBarcodeFormat(value: unknown): value is BarcodeFormat;
|
|
7
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/barcode/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,eAAO,MAAM,sBAAsB,EAAE,SAAS,aAAa,EAEzD,CAAC;AAEH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,CASnF,CAAC;AAEH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB,CAE5E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAE5E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const PUBLIC_BARCODE_FORMATS = Object.freeze([
|
|
2
|
+
"qr_code", "data_matrix", "pdf417", "code_128", "ean_13", "ean_8", "upc_a", "upc_e",
|
|
3
|
+
]);
|
|
4
|
+
export const BARCODE_FORMAT_CLASS = Object.freeze({
|
|
5
|
+
qr_code: "matrix",
|
|
6
|
+
data_matrix: "matrix",
|
|
7
|
+
pdf417: "stacked",
|
|
8
|
+
code_128: "linear",
|
|
9
|
+
ean_13: "linear",
|
|
10
|
+
ean_8: "linear",
|
|
11
|
+
upc_a: "linear",
|
|
12
|
+
upc_e: "linear",
|
|
13
|
+
});
|
|
14
|
+
export function barcodeFormatClass(format) {
|
|
15
|
+
return BARCODE_FORMAT_CLASS[format];
|
|
16
|
+
}
|
|
17
|
+
export function isPublicBarcodeFormat(value) {
|
|
18
|
+
return typeof value === "string" && PUBLIC_BARCODE_FORMATS.includes(value);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/barcode/format.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,sBAAsB,GAA6B,MAAM,CAAC,MAAM,CAAC;IAC5E,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;CACpF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAwD,MAAM,CAAC,MAAM,CAAC;IACrG,OAAO,EAAE,QAAQ;IACjB,WAAW,EAAE,QAAQ;IACrB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;CAChB,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,sBAA4C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/barcode/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/barcode/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BarcodeFormat } from "@scanly/scenario-schema";
|
|
2
|
+
export interface RetailBarcodeMetadata {
|
|
3
|
+
gtin?: string;
|
|
4
|
+
checkDigitValid: boolean;
|
|
5
|
+
normalizedGtin14?: string;
|
|
6
|
+
expandedUpcA?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Restore the public UPC representation emitted by the physical symbol. */
|
|
9
|
+
export declare function canonicalizeRetailText(format: BarcodeFormat, value: string): string;
|
|
10
|
+
export declare function isValidRetailChecksum(value: string): boolean;
|
|
11
|
+
export declare function normalizeRetailBarcode(format: BarcodeFormat, value: string): RetailBarcodeMetadata | null;
|
|
12
|
+
/** Expand a valid number-system-0 UPC-E payload without replacing the original text. */
|
|
13
|
+
export declare function expandUpcE(value: string): string | null;
|
|
14
|
+
/** Compress UPC-A only when an exact, checksum-valid UPC-E round trip exists. */
|
|
15
|
+
export declare function compressUpcA(value: string): string | null;
|
|
16
|
+
//# sourceMappingURL=retail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retail.d.ts","sourceRoot":"","sources":["../../src/barcode/retail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUnF;AAMD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAQ5D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAmBzG;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBvD;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAczD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/** Restore the public UPC representation emitted by the physical symbol. */
|
|
2
|
+
export function canonicalizeRetailText(format, value) {
|
|
3
|
+
if (format === "upc_a" && validDigits(value, 13) && value.startsWith("0")) {
|
|
4
|
+
const upcA = value.slice(1);
|
|
5
|
+
return isValidRetailChecksum(upcA) ? upcA : value;
|
|
6
|
+
}
|
|
7
|
+
if (format === "upc_e") {
|
|
8
|
+
const upcA = validDigits(value, 13) && value.startsWith("0") ? value.slice(1) : value;
|
|
9
|
+
return compressUpcA(upcA) ?? value;
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function validDigits(value, length) {
|
|
14
|
+
return new RegExp(`^\\d{${length}}$`).test(value);
|
|
15
|
+
}
|
|
16
|
+
export function isValidRetailChecksum(value) {
|
|
17
|
+
if (!/^\d+$/.test(value) || value.length < 2)
|
|
18
|
+
return false;
|
|
19
|
+
let sum = 0;
|
|
20
|
+
const check = Number(value[value.length - 1]);
|
|
21
|
+
for (let index = value.length - 2, position = 0; index >= 0; index -= 1, position += 1) {
|
|
22
|
+
sum += Number(value[index]) * (position % 2 === 0 ? 3 : 1);
|
|
23
|
+
}
|
|
24
|
+
return (10 - (sum % 10)) % 10 === check;
|
|
25
|
+
}
|
|
26
|
+
export function normalizeRetailBarcode(format, value) {
|
|
27
|
+
if (format === "ean_13" && validDigits(value, 13)) {
|
|
28
|
+
const valid = isValidRetailChecksum(value);
|
|
29
|
+
return { gtin: value, checkDigitValid: valid, normalizedGtin14: `0${value}` };
|
|
30
|
+
}
|
|
31
|
+
if (format === "ean_8" && validDigits(value, 8)) {
|
|
32
|
+
const valid = isValidRetailChecksum(value);
|
|
33
|
+
return { gtin: value, checkDigitValid: valid, normalizedGtin14: `000000${value}` };
|
|
34
|
+
}
|
|
35
|
+
if (format === "upc_a" && validDigits(value, 12)) {
|
|
36
|
+
const valid = isValidRetailChecksum(value);
|
|
37
|
+
return { gtin: value, checkDigitValid: valid, normalizedGtin14: `00${value}` };
|
|
38
|
+
}
|
|
39
|
+
if (format === "upc_e" && validDigits(value, 8)) {
|
|
40
|
+
const expandedUpcA = expandUpcE(value) ?? undefined;
|
|
41
|
+
const valid = Boolean(expandedUpcA);
|
|
42
|
+
return { gtin: value, checkDigitValid: valid, ...(expandedUpcA ? { normalizedGtin14: `00${expandedUpcA}` } : {}), ...(expandedUpcA ? { expandedUpcA } : {}) };
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/** Expand a valid number-system-0 UPC-E payload without replacing the original text. */
|
|
47
|
+
export function expandUpcE(value) {
|
|
48
|
+
if (!validDigits(value, 8))
|
|
49
|
+
return null;
|
|
50
|
+
const numberSystem = value[0];
|
|
51
|
+
if (numberSystem !== "0" && numberSystem !== "1")
|
|
52
|
+
return null;
|
|
53
|
+
const body = value.slice(1, 7);
|
|
54
|
+
const check = value[7];
|
|
55
|
+
const last = body[5];
|
|
56
|
+
let manufacturer;
|
|
57
|
+
let product;
|
|
58
|
+
if ("012".includes(last)) {
|
|
59
|
+
manufacturer = `${body.slice(0, 2)}${last}00`;
|
|
60
|
+
product = `00${body.slice(2, 5)}`;
|
|
61
|
+
}
|
|
62
|
+
else if (last === "3") {
|
|
63
|
+
manufacturer = `${body.slice(0, 3)}00`;
|
|
64
|
+
product = `000${body.slice(3, 5)}`;
|
|
65
|
+
}
|
|
66
|
+
else if (last === "4") {
|
|
67
|
+
manufacturer = `${body.slice(0, 4)}0`;
|
|
68
|
+
product = `0000${body[4]}`;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
manufacturer = body.slice(0, 5);
|
|
72
|
+
product = `0000${last}`;
|
|
73
|
+
}
|
|
74
|
+
const upc = `${numberSystem}${manufacturer}${product}${check}`;
|
|
75
|
+
return validDigits(upc, 12) && isValidRetailChecksum(upc) ? upc : null;
|
|
76
|
+
}
|
|
77
|
+
/** Compress UPC-A only when an exact, checksum-valid UPC-E round trip exists. */
|
|
78
|
+
export function compressUpcA(value) {
|
|
79
|
+
if (!validDigits(value, 12) || !isValidRetailChecksum(value))
|
|
80
|
+
return null;
|
|
81
|
+
const numberSystem = value[0];
|
|
82
|
+
if (numberSystem !== "0" && numberSystem !== "1")
|
|
83
|
+
return null;
|
|
84
|
+
const manufacturer = value.slice(1, 6);
|
|
85
|
+
const product = value.slice(6, 11);
|
|
86
|
+
const check = value[11];
|
|
87
|
+
const candidates = [
|
|
88
|
+
`${numberSystem}${manufacturer.slice(0, 2)}${product.slice(2)}${manufacturer[2]}${check}`,
|
|
89
|
+
`${numberSystem}${manufacturer.slice(0, 3)}${product.slice(3)}3${check}`,
|
|
90
|
+
`${numberSystem}${manufacturer.slice(0, 4)}${product[4]}4${check}`,
|
|
91
|
+
`${numberSystem}${manufacturer}${product[4]}${check}`,
|
|
92
|
+
];
|
|
93
|
+
return candidates.find((candidate) => expandUpcE(candidate) === value) ?? null;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=retail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retail.js","sourceRoot":"","sources":["../../src/barcode/retail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { BarcodeFormat, BarcodeFormatClass } from "@scanly/scenario-schema";
|
|
2
|
+
import type { NormalizedFrame } from "./frame.js";
|
|
3
|
+
import type { CornerPoint } from "./result.js";
|
|
4
|
+
export interface EngineCapabilities {
|
|
5
|
+
formats: readonly BarcodeFormat[];
|
|
6
|
+
formatClasses?: readonly BarcodeFormatClass[];
|
|
7
|
+
supportsMultiple: boolean;
|
|
8
|
+
returnsRawBytes: boolean;
|
|
9
|
+
/** Alpha.5 spelling retained alongside the Alpha.4 returnsRawBytes field. */
|
|
10
|
+
supportsRawBytes?: boolean;
|
|
11
|
+
returnsCornerPoints: boolean;
|
|
12
|
+
threadSafe: boolean;
|
|
13
|
+
estimatedScratchBytesPerPixel?: number;
|
|
14
|
+
copiesInputBuffer?: boolean;
|
|
15
|
+
runtimeKinds?: readonly ("browser" | "worker" | "node")[];
|
|
16
|
+
supportsInversion?: boolean;
|
|
17
|
+
supportsStructuredAppend?: boolean;
|
|
18
|
+
supportsGs1?: boolean;
|
|
19
|
+
supportsOrientation?: boolean;
|
|
20
|
+
initializationMode?: "lazy" | "explicit";
|
|
21
|
+
executionModel?: "javascript" | "wasm" | "native";
|
|
22
|
+
}
|
|
23
|
+
export type EngineFailureCategory = "not-found" | "unsupported-format" | "invalid-input" | "initialization" | "execution" | "cancelled" | "timeout";
|
|
24
|
+
export type EngineFailureCode = "asset_not_found" | "asset_integrity_failed" | "wasm_compile_failed" | "wasm_instantiate_failed" | "unsupported_runtime" | "unsupported_simd" | "initialization_timeout" | "native_decode_failed" | "invalid_native_result" | "out_of_memory" | "cancelled" | "disposed";
|
|
25
|
+
export interface EngineExecutionMetadata {
|
|
26
|
+
variant?: string;
|
|
27
|
+
executionModel?: "javascript" | "wasm" | "native";
|
|
28
|
+
initializationMs?: number;
|
|
29
|
+
wasmLinearMemoryBytes?: number;
|
|
30
|
+
requestedFormats?: readonly BarcodeFormat[];
|
|
31
|
+
nativeFormat?: string;
|
|
32
|
+
detectedFormat?: BarcodeFormat;
|
|
33
|
+
}
|
|
34
|
+
export interface EngineDecodeResult {
|
|
35
|
+
text: string;
|
|
36
|
+
rawBytes?: Uint8Array;
|
|
37
|
+
format: BarcodeFormat;
|
|
38
|
+
cornerPoints?: CornerPoint[];
|
|
39
|
+
orientation?: number;
|
|
40
|
+
symbologyIdentifier?: string;
|
|
41
|
+
isGs1?: boolean;
|
|
42
|
+
metadata?: Record<string, unknown>;
|
|
43
|
+
engineMetadata?: EngineExecutionMetadata;
|
|
44
|
+
elapsedMs: number;
|
|
45
|
+
}
|
|
46
|
+
export type EngineOutcome = {
|
|
47
|
+
ok: true;
|
|
48
|
+
results: [EngineDecodeResult, ...EngineDecodeResult[]];
|
|
49
|
+
} | {
|
|
50
|
+
ok: false;
|
|
51
|
+
category: EngineFailureCategory;
|
|
52
|
+
message: string;
|
|
53
|
+
elapsedMs: number;
|
|
54
|
+
code?: EngineFailureCode;
|
|
55
|
+
};
|
|
56
|
+
export interface EngineDecodeOptions {
|
|
57
|
+
formats: readonly BarcodeFormat[];
|
|
58
|
+
findMultiple: boolean;
|
|
59
|
+
signal?: AbortSignal;
|
|
60
|
+
/** Whether upstream preprocessing already inverted the candidate. */
|
|
61
|
+
inversion?: "unknown" | "original" | "inverted";
|
|
62
|
+
}
|
|
63
|
+
export interface DecoderEngine {
|
|
64
|
+
readonly id: string;
|
|
65
|
+
readonly version: string;
|
|
66
|
+
readonly capabilities: EngineCapabilities;
|
|
67
|
+
initialize?(): Promise<void>;
|
|
68
|
+
decode(frame: NormalizedFrame, options: EngineDecodeOptions): Promise<EngineOutcome>;
|
|
69
|
+
dispose?(): void | Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
export interface EngineRegistrationOptions {
|
|
72
|
+
/** Duplicate ids are rejected unless replacement is explicit. */
|
|
73
|
+
replace?: boolean;
|
|
74
|
+
}
|
|
75
|
+
export interface EngineRegistryContract {
|
|
76
|
+
register(engine: DecoderEngine, options?: EngineRegistrationOptions): void;
|
|
77
|
+
unregister(id: string): void;
|
|
78
|
+
get(id: string): DecoderEngine | undefined;
|
|
79
|
+
list(): readonly DecoderEngine[];
|
|
80
|
+
resolve(formats: readonly BarcodeFormat[]): readonly DecoderEngine[];
|
|
81
|
+
initializeAll(): Promise<void>;
|
|
82
|
+
disposeAll(): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/contracts/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/contracts/engine.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const SDK_ERROR_CODES: readonly ["no_symbol_found", "unsupported_format", "invalid_image", "resource_limit_exceeded", "timeout", "cancelled", "worker_initialization_failure", "engine_initialization_failure", "engine_execution_failure", "camera_permission_denied", "camera_not_found", "camera_busy", "camera_constraint_failed", "camera_track_ended", "camera_capability_unsupported", "camera_recovery_failed", "browser_background_suspended", "camera_unavailable", "source_disconnected", "unsupported_browser_capability", "malformed_scenario", "invalid_configuration", "internal_invariant_failure", "session_not_running", "session_disposed", "concurrent_call_rejected"];
|
|
2
|
+
export type SdkErrorCode = (typeof SDK_ERROR_CODES)[number];
|
|
3
|
+
export type SdkErrorCategory = "input" | "resource" | "lifecycle" | "engine" | "source" | "configuration" | "internal";
|
|
4
|
+
export interface SdkError {
|
|
5
|
+
code: SdkErrorCode;
|
|
6
|
+
category: SdkErrorCategory;
|
|
7
|
+
message: string;
|
|
8
|
+
retryable: boolean;
|
|
9
|
+
details?: Readonly<Record<string, string | number | boolean | null>>;
|
|
10
|
+
cause?: unknown;
|
|
11
|
+
}
|
|
12
|
+
export declare class SdkException extends Error {
|
|
13
|
+
readonly error: SdkError;
|
|
14
|
+
constructor(error: SdkError);
|
|
15
|
+
}
|
|
16
|
+
export declare function sdkError(code: SdkErrorCode, message: string, details?: SdkError["details"], cause?: unknown): SdkError;
|
|
17
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/contracts/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,qoBAQlB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,GAAG,UAAU,CAAC;AAEvH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;IACrE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;gBACb,KAAK,EAAE,QAAQ;CAK5B;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAatH"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const SDK_ERROR_CODES = [
|
|
2
|
+
"no_symbol_found", "unsupported_format", "invalid_image", "resource_limit_exceeded", "timeout",
|
|
3
|
+
"cancelled", "worker_initialization_failure", "engine_initialization_failure", "engine_execution_failure",
|
|
4
|
+
"camera_permission_denied", "camera_not_found", "camera_busy", "camera_constraint_failed",
|
|
5
|
+
"camera_track_ended", "camera_capability_unsupported", "camera_recovery_failed",
|
|
6
|
+
"browser_background_suspended", "camera_unavailable", "source_disconnected", "unsupported_browser_capability",
|
|
7
|
+
"malformed_scenario", "invalid_configuration", "internal_invariant_failure", "session_not_running",
|
|
8
|
+
"session_disposed", "concurrent_call_rejected",
|
|
9
|
+
];
|
|
10
|
+
export class SdkException extends Error {
|
|
11
|
+
error;
|
|
12
|
+
constructor(error) {
|
|
13
|
+
super(error.message);
|
|
14
|
+
this.name = "SdkException";
|
|
15
|
+
this.error = error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function sdkError(code, message, details, cause) {
|
|
19
|
+
const category = code === "invalid_image" || code === "unsupported_format" || code === "no_symbol_found" ? "input" :
|
|
20
|
+
code === "resource_limit_exceeded" || code === "timeout" ? "resource" :
|
|
21
|
+
code.includes("engine") || code.includes("worker") ? "engine" :
|
|
22
|
+
code.includes("camera") || code === "source_disconnected" || code === "unsupported_browser_capability" ? "source" :
|
|
23
|
+
code.includes("scenario") || code === "invalid_configuration" ? "configuration" :
|
|
24
|
+
code === "internal_invariant_failure" ? "internal" : "lifecycle";
|
|
25
|
+
const retryable = ![
|
|
26
|
+
"unsupported_format", "malformed_scenario", "invalid_configuration", "session_disposed",
|
|
27
|
+
"camera_permission_denied", "camera_not_found", "camera_capability_unsupported", "unsupported_browser_capability",
|
|
28
|
+
].includes(code);
|
|
29
|
+
return { code, category, message, retryable, details, ...(cause === undefined ? {} : { cause }) };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/contracts/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,EAAE,yBAAyB,EAAE,SAAS;IAC9F,WAAW,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,0BAA0B;IACzG,0BAA0B,EAAE,kBAAkB,EAAE,aAAa,EAAE,0BAA0B;IACzF,oBAAoB,EAAE,+BAA+B,EAAE,wBAAwB;IAC/E,8BAA8B,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,gCAAgC;IAC7G,oBAAoB,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,qBAAqB;IAClG,kBAAkB,EAAE,0BAA0B;CACtC,CAAC;AAcX,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,KAAK,CAAW;IACzB,YAAY,KAAe;QACzB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,MAAM,UAAU,QAAQ,CAAC,IAAkB,EAAE,OAAe,EAAE,OAA6B,EAAE,KAAe;IAC1G,MAAM,QAAQ,GACZ,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,oBAAoB,IAAI,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACnG,IAAI,KAAK,yBAAyB,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACvE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC/D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,gCAAgC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBACnH,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,KAAK,uBAAuB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;wBACjF,IAAI,KAAK,4BAA4B,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IACnE,MAAM,SAAS,GAAG,CAAC;QACjB,oBAAoB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,kBAAkB;QACvF,0BAA0B,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,gCAAgC;KAClH,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type FramePixelFormat = "rgba8888" | "rgb888" | "gray8" | "yuv420";
|
|
2
|
+
export type FrameSourceType = "camera" | "upload" | "pixel-buffer" | "video-frame" | "hardware-scanner";
|
|
3
|
+
export type FrameBufferOwnership = "borrowed" | "transferred" | "owned";
|
|
4
|
+
export type FrameOrientation = 0 | 90 | 180 | 270;
|
|
5
|
+
export interface FrameDeviceMetadata {
|
|
6
|
+
deviceId?: string;
|
|
7
|
+
label?: string;
|
|
8
|
+
facingMode?: "user" | "environment" | "left" | "right";
|
|
9
|
+
platform?: string;
|
|
10
|
+
torchActive?: boolean;
|
|
11
|
+
zoom?: number;
|
|
12
|
+
hardwareScannerId?: string;
|
|
13
|
+
[key: string]: string | number | boolean | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface NormalizedFrame {
|
|
16
|
+
id: string;
|
|
17
|
+
timestampMs: number;
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
rowStride: number;
|
|
21
|
+
pixelFormat: FramePixelFormat;
|
|
22
|
+
/** Clockwise rotation required to display source-buffer pixels upright. */
|
|
23
|
+
orientation: FrameOrientation;
|
|
24
|
+
sourceType: FrameSourceType;
|
|
25
|
+
data: Uint8Array | Uint8ClampedArray;
|
|
26
|
+
ownership: FrameBufferOwnership;
|
|
27
|
+
device?: FrameDeviceMetadata;
|
|
28
|
+
dispose?: () => void;
|
|
29
|
+
}
|
|
30
|
+
export interface FrameValidationIssue {
|
|
31
|
+
path: string;
|
|
32
|
+
message: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function bytesPerPixel(format: FramePixelFormat): number | null;
|
|
35
|
+
export declare function validateFrame(frame: unknown): FrameValidationIssue[];
|
|
36
|
+
export declare function createRgbaFrame(data: Uint8ClampedArray, width: number, height: number, options?: Partial<Omit<NormalizedFrame, "data" | "width" | "height" | "pixelFormat" | "rowStride">>): NormalizedFrame;
|
|
37
|
+
//# sourceMappingURL=frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/contracts/frame.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,aAAa,GAAG,kBAAkB,CAAC;AACxG,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,CAAC;AACxE,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,2EAA2E;IAC3E,WAAW,EAAE,gBAAgB,CAAC;IAC9B,UAAU,EAAE,eAAe,CAAC;IAC5B,IAAI,EAAE,UAAU,GAAG,iBAAiB,CAAC;IACrC,SAAS,EAAE,oBAAoB,CAAC;IAChC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAKrE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,EAAE,CAsCpE;AAID,wBAAgB,eAAe,CAC7B,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,aAAa,GAAG,WAAW,CAAC,CAAM,GACtG,eAAe,CAejB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export function bytesPerPixel(format) {
|
|
2
|
+
if (format === "rgba8888")
|
|
3
|
+
return 4;
|
|
4
|
+
if (format === "rgb888")
|
|
5
|
+
return 3;
|
|
6
|
+
if (format === "gray8")
|
|
7
|
+
return 1;
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
export function validateFrame(frame) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
if (!frame || typeof frame !== "object" || Array.isArray(frame)) {
|
|
13
|
+
return [{ path: "$", message: "Frame must be an object." }];
|
|
14
|
+
}
|
|
15
|
+
const value = frame;
|
|
16
|
+
if (typeof value.id !== "string" || value.id.length === 0)
|
|
17
|
+
issues.push({ path: "id", message: "Frame id is required." });
|
|
18
|
+
if (typeof value.timestampMs !== "number" || !Number.isFinite(value.timestampMs) || value.timestampMs < 0)
|
|
19
|
+
issues.push({ path: "timestampMs", message: "Timestamp must be a non-negative finite number." });
|
|
20
|
+
if (!Number.isSafeInteger(value.width) || (value.width ?? 0) < 1)
|
|
21
|
+
issues.push({ path: "width", message: "Width must be a positive safe integer." });
|
|
22
|
+
if (!Number.isSafeInteger(value.height) || (value.height ?? 0) < 1)
|
|
23
|
+
issues.push({ path: "height", message: "Height must be a positive safe integer." });
|
|
24
|
+
const pixelFormats = ["rgba8888", "rgb888", "gray8", "yuv420"];
|
|
25
|
+
const validPixelFormat = pixelFormats.includes(value.pixelFormat);
|
|
26
|
+
if (!validPixelFormat)
|
|
27
|
+
issues.push({ path: "pixelFormat", message: "Pixel format must be rgba8888, rgb888, gray8, or yuv420." });
|
|
28
|
+
if (![0, 90, 180, 270].includes(value.orientation))
|
|
29
|
+
issues.push({ path: "orientation", message: "Orientation must be 0, 90, 180, or 270." });
|
|
30
|
+
const sourceTypes = ["camera", "upload", "pixel-buffer", "video-frame", "hardware-scanner"];
|
|
31
|
+
if (!sourceTypes.includes(value.sourceType))
|
|
32
|
+
issues.push({ path: "sourceType", message: "Frame source type is invalid." });
|
|
33
|
+
const ownershipValues = ["borrowed", "transferred", "owned"];
|
|
34
|
+
if (!ownershipValues.includes(value.ownership))
|
|
35
|
+
issues.push({ path: "ownership", message: "Frame ownership must be borrowed, transferred, or owned." });
|
|
36
|
+
const validData = value.data instanceof Uint8Array || value.data instanceof Uint8ClampedArray;
|
|
37
|
+
const data = validData ? value.data : null;
|
|
38
|
+
if (!validData)
|
|
39
|
+
issues.push({ path: "data", message: "Frame data must be a Uint8Array or Uint8ClampedArray." });
|
|
40
|
+
if (value.dispose !== undefined && typeof value.dispose !== "function")
|
|
41
|
+
issues.push({ path: "dispose", message: "Frame dispose must be a function when provided." });
|
|
42
|
+
if (validPixelFormat && Number.isSafeInteger(value.width) && (value.width ?? 0) > 0 && Number.isSafeInteger(value.height) && (value.height ?? 0) > 0) {
|
|
43
|
+
const bpp = bytesPerPixel(value.pixelFormat);
|
|
44
|
+
const minimumStride = value.width * (bpp ?? 1);
|
|
45
|
+
if (!Number.isSafeInteger(value.rowStride) || (value.rowStride ?? 0) < minimumStride) {
|
|
46
|
+
issues.push({ path: "rowStride", message: `Row stride must be at least ${minimumStride} bytes for ${value.pixelFormat}.` });
|
|
47
|
+
}
|
|
48
|
+
else if (data) {
|
|
49
|
+
const requiredBytes = value.rowStride * value.height;
|
|
50
|
+
if (!Number.isSafeInteger(requiredBytes)) {
|
|
51
|
+
issues.push({ path: "data", message: "Frame dimensions and stride exceed the safe buffer-size range." });
|
|
52
|
+
}
|
|
53
|
+
else if (data.byteLength < requiredBytes) {
|
|
54
|
+
issues.push({ path: "data", message: `Frame buffer has ${data.byteLength} bytes; ${requiredBytes} are required by dimensions and stride.` });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return issues;
|
|
59
|
+
}
|
|
60
|
+
let frameSequence = 0;
|
|
61
|
+
export function createRgbaFrame(data, width, height, options = {}) {
|
|
62
|
+
return {
|
|
63
|
+
id: options.id ?? `frame-${Date.now()}-${++frameSequence}`,
|
|
64
|
+
timestampMs: options.timestampMs ?? Date.now(),
|
|
65
|
+
width,
|
|
66
|
+
height,
|
|
67
|
+
rowStride: width * 4,
|
|
68
|
+
pixelFormat: "rgba8888",
|
|
69
|
+
orientation: options.orientation ?? 0,
|
|
70
|
+
sourceType: options.sourceType ?? "pixel-buffer",
|
|
71
|
+
data,
|
|
72
|
+
ownership: options.ownership ?? "borrowed",
|
|
73
|
+
device: options.device,
|
|
74
|
+
dispose: options.dispose,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=frame.js.map
|