@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
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { buildScanEvidence, geometryEvidence } from "./scan-evidence.js";
|
|
2
|
+
export class DecodeCandidateResolver {
|
|
3
|
+
resolve(candidates, options = {}) {
|
|
4
|
+
const valid = candidates.filter((candidate) => candidate.validation.decoderValidation && candidate.validation.formatStructuralValidity !== false);
|
|
5
|
+
let rejectedCount = candidates.length - valid.length;
|
|
6
|
+
const clusters = spatialClusters(valid);
|
|
7
|
+
const confirmedCandidates = [];
|
|
8
|
+
const conflicts = [];
|
|
9
|
+
for (const cluster of clusters) {
|
|
10
|
+
const groups = groupByPayload(cluster);
|
|
11
|
+
if (groups.length === 1) {
|
|
12
|
+
if (sufficientSingleGroupEvidence(groups[0], options.temporalObservations))
|
|
13
|
+
confirmedCandidates.push(best(groups[0], options.temporalObservations));
|
|
14
|
+
else
|
|
15
|
+
rejectedCount += groups[0].length;
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const ranked = groups.map((group) => ({ group, candidate: best(group, options.temporalObservations), score: priority(group, options.temporalObservations) })).sort((left, right) => right.score - left.score);
|
|
19
|
+
const winner = ranked[0];
|
|
20
|
+
const runnerUp = ranked[1];
|
|
21
|
+
const winnerChecksum = winner.group.some((candidate) => candidate.validation.checksumValidated === true);
|
|
22
|
+
const runnerChecksum = runnerUp.group.some((candidate) => candidate.validation.checksumValidated === true);
|
|
23
|
+
const winnerRoutes = new Set(winner.group.map((candidate) => candidate.route)).size;
|
|
24
|
+
if ((winnerChecksum && !runnerChecksum && winner.score - runnerUp.score >= 20) || (winnerRoutes >= 2 && winner.score - runnerUp.score >= 25)) {
|
|
25
|
+
confirmedCandidates.push(winner.candidate);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
const key = cluster.map(candidateKey).sort().join("|");
|
|
29
|
+
const conflict = { key, candidates: cluster, reason: "conflicting payload/format candidates lack decisive independent evidence" };
|
|
30
|
+
conflicts.push(conflict);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
candidates: [...candidates],
|
|
35
|
+
...(confirmedCandidates[0] ? { confirmed: confirmedCandidates[0] } : {}),
|
|
36
|
+
confirmedCandidates,
|
|
37
|
+
conflicts,
|
|
38
|
+
rejectedCount,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function spatialClusters(candidates) {
|
|
43
|
+
const clusters = [];
|
|
44
|
+
for (const candidate of candidates) {
|
|
45
|
+
const cluster = clusters.find((current) => current.some((entry) => overlaps(entry, candidate)));
|
|
46
|
+
if (cluster)
|
|
47
|
+
cluster.push(candidate);
|
|
48
|
+
else
|
|
49
|
+
clusters.push([candidate]);
|
|
50
|
+
}
|
|
51
|
+
return clusters;
|
|
52
|
+
}
|
|
53
|
+
function overlaps(left, right) {
|
|
54
|
+
const a = bounds(left.geometry);
|
|
55
|
+
const b = bounds(right.geometry);
|
|
56
|
+
if (!a || !b)
|
|
57
|
+
return true;
|
|
58
|
+
const intersection = Math.max(0, Math.min(a.right, b.right) - Math.max(a.left, b.left)) * Math.max(0, Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top));
|
|
59
|
+
const smaller = Math.min((a.right - a.left) * (a.bottom - a.top), (b.right - b.left) * (b.bottom - b.top));
|
|
60
|
+
return smaller <= 0 || intersection / smaller >= 0.25;
|
|
61
|
+
}
|
|
62
|
+
function bounds(points) {
|
|
63
|
+
if (!points?.length)
|
|
64
|
+
return undefined;
|
|
65
|
+
const xs = points.map((point) => point.x);
|
|
66
|
+
const ys = points.map((point) => point.y);
|
|
67
|
+
return { left: Math.min(...xs), top: Math.min(...ys), right: Math.max(...xs), bottom: Math.max(...ys) };
|
|
68
|
+
}
|
|
69
|
+
function groupByPayload(candidates) {
|
|
70
|
+
const groups = new Map();
|
|
71
|
+
for (const candidate of candidates) {
|
|
72
|
+
const key = candidateKey(candidate);
|
|
73
|
+
const group = groups.get(key) ?? [];
|
|
74
|
+
group.push(candidate);
|
|
75
|
+
groups.set(key, group);
|
|
76
|
+
}
|
|
77
|
+
return [...groups.values()];
|
|
78
|
+
}
|
|
79
|
+
function candidateKey(candidate) { return `${candidate.format}\u0000${candidate.payload}`; }
|
|
80
|
+
function sufficientSingleGroupEvidence(group, temporalObservations = 1) {
|
|
81
|
+
const primary = group[0];
|
|
82
|
+
const routeAgreement = new Set(group.map((candidate) => candidate.route)).size;
|
|
83
|
+
if (["qr_code", "data_matrix", "pdf417"].includes(primary.format))
|
|
84
|
+
return true;
|
|
85
|
+
return routeAgreement >= 2 || temporalObservations >= 2;
|
|
86
|
+
}
|
|
87
|
+
function best(group, temporalObservations = 1) { return [...group].sort((left, right) => candidatePriority(right, temporalObservations) - candidatePriority(left, temporalObservations))[0]; }
|
|
88
|
+
function priority(group, temporalObservations = 1) { return candidatePriority(best(group, temporalObservations), temporalObservations) + buildScanEvidence(group, temporalObservations).independentRouteAgreement * 12; }
|
|
89
|
+
function candidatePriority(candidate, temporalObservations = 1) {
|
|
90
|
+
return (candidate.validation.checksumValidated === true ? 100 : 0)
|
|
91
|
+
+ (candidate.validation.formatStructuralValidity !== false ? 30 : 0)
|
|
92
|
+
+ (candidate.validation.decoderValidation ? 30 : 0)
|
|
93
|
+
+ Math.min(20, temporalObservations * 4)
|
|
94
|
+
+ geometryEvidence(candidate) * 20
|
|
95
|
+
+ (candidate.validation.errorCorrectionEvidence ?? 0) * 20;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=decode-candidate-conflict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode-candidate-conflict.js","sourceRoot":"","sources":["../../src/industrial/decode-candidate-conflict.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NormalizedFrame } from "../contracts/frame.js";
|
|
2
|
+
import type { BarcodeDifficultyDiagnosis, RecoveryQualityEvidence } from "./types.js";
|
|
3
|
+
export interface BarcodeDifficultyAnalyzerOptions {
|
|
4
|
+
sampleTarget?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Bounded, deterministic routing analysis. The output is heuristic evidence,
|
|
8
|
+
* not a Ground Truth annotation and not a claim that any route will decode.
|
|
9
|
+
*/
|
|
10
|
+
export declare class BarcodeDifficultyAnalyzer {
|
|
11
|
+
private readonly options;
|
|
12
|
+
constructor(options?: BarcodeDifficultyAnalyzerOptions);
|
|
13
|
+
analyze(frame: NormalizedFrame, runtime?: RecoveryQualityEvidence): BarcodeDifficultyDiagnosis;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=difficulty-diagnosis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"difficulty-diagnosis.d.ts","sourceRoot":"","sources":["../../src/industrial/difficulty-diagnosis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,0BAA0B,EAE1B,uBAAuB,EAExB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gCAAgC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,GAAE,gCAAqC;IAE3E,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,GAAE,uBAA4B,GAAG,0BAA0B;CAkJnG"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded, deterministic routing analysis. The output is heuristic evidence,
|
|
3
|
+
* not a Ground Truth annotation and not a claim that any route will decode.
|
|
4
|
+
*/
|
|
5
|
+
export class BarcodeDifficultyAnalyzer {
|
|
6
|
+
options;
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
analyze(frame, runtime = {}) {
|
|
11
|
+
const target = clampInteger(this.options.sampleTarget ?? 2_048, 256, 4_096);
|
|
12
|
+
const step = Math.max(1, Math.floor(Math.sqrt((frame.width * frame.height) / target)));
|
|
13
|
+
const columns = Math.max(1, Math.ceil(frame.width / step));
|
|
14
|
+
const rows = Math.max(1, Math.ceil(frame.height / step));
|
|
15
|
+
const values = new Float64Array(columns * rows);
|
|
16
|
+
let sum = 0;
|
|
17
|
+
let sumSquares = 0;
|
|
18
|
+
let clippedHigh = 0;
|
|
19
|
+
let clippedLow = 0;
|
|
20
|
+
let horizontalGradient = 0;
|
|
21
|
+
let verticalGradient = 0;
|
|
22
|
+
let gradientSquares = 0;
|
|
23
|
+
let transitionCount = 0;
|
|
24
|
+
let isolatedEdges = 0;
|
|
25
|
+
let diagonalGradient = 0;
|
|
26
|
+
let chromaSum = 0;
|
|
27
|
+
let inkCount = 0;
|
|
28
|
+
let inkLeft = columns;
|
|
29
|
+
let inkRight = 0;
|
|
30
|
+
let inkTop = rows;
|
|
31
|
+
let inkBottom = 0;
|
|
32
|
+
let horizontalBorderInk = 0;
|
|
33
|
+
let horizontalBorderSamples = 0;
|
|
34
|
+
let verticalBorderInk = 0;
|
|
35
|
+
let verticalBorderSamples = 0;
|
|
36
|
+
const rowInkLeft = new Int32Array(rows);
|
|
37
|
+
rowInkLeft.fill(columns);
|
|
38
|
+
const rowInkRight = new Int32Array(rows);
|
|
39
|
+
rowInkRight.fill(-1);
|
|
40
|
+
for (let row = 0; row < rows; row += 1) {
|
|
41
|
+
const y = Math.min(frame.height - 1, row * step);
|
|
42
|
+
for (let column = 0; column < columns; column += 1) {
|
|
43
|
+
const x = Math.min(frame.width - 1, column * step);
|
|
44
|
+
const color = rgb(frame, x, y);
|
|
45
|
+
const value = color.red * 0.2126 + color.green * 0.7152 + color.blue * 0.0722;
|
|
46
|
+
chromaSum += (Math.max(color.red, color.green, color.blue) - Math.min(color.red, color.green, color.blue)) / 255;
|
|
47
|
+
const index = row * columns + column;
|
|
48
|
+
values[index] = value;
|
|
49
|
+
sum += value;
|
|
50
|
+
sumSquares += value * value;
|
|
51
|
+
if (value >= 248)
|
|
52
|
+
clippedHigh += 1;
|
|
53
|
+
if (value <= 7)
|
|
54
|
+
clippedLow += 1;
|
|
55
|
+
if (row === 0 || row === rows - 1) {
|
|
56
|
+
horizontalBorderSamples += 1;
|
|
57
|
+
if (value < 180)
|
|
58
|
+
horizontalBorderInk += 1;
|
|
59
|
+
}
|
|
60
|
+
if (column === 0 || column === columns - 1) {
|
|
61
|
+
verticalBorderSamples += 1;
|
|
62
|
+
if (value < 180)
|
|
63
|
+
verticalBorderInk += 1;
|
|
64
|
+
}
|
|
65
|
+
if (value < 180) {
|
|
66
|
+
inkCount += 1;
|
|
67
|
+
inkLeft = Math.min(inkLeft, column);
|
|
68
|
+
inkRight = Math.max(inkRight, column);
|
|
69
|
+
inkTop = Math.min(inkTop, row);
|
|
70
|
+
inkBottom = Math.max(inkBottom, row);
|
|
71
|
+
rowInkLeft[row] = Math.min(rowInkLeft[row], column);
|
|
72
|
+
rowInkRight[row] = Math.max(rowInkRight[row], column);
|
|
73
|
+
}
|
|
74
|
+
if (column > 0) {
|
|
75
|
+
const gradient = Math.abs(value - values[index - 1]);
|
|
76
|
+
horizontalGradient += gradient;
|
|
77
|
+
gradientSquares += gradient * gradient;
|
|
78
|
+
if (gradient >= 34)
|
|
79
|
+
transitionCount += 1;
|
|
80
|
+
if (gradient >= 70)
|
|
81
|
+
isolatedEdges += 1;
|
|
82
|
+
}
|
|
83
|
+
if (row > 0) {
|
|
84
|
+
const gradient = Math.abs(value - values[index - columns]);
|
|
85
|
+
verticalGradient += gradient;
|
|
86
|
+
gradientSquares += gradient * gradient;
|
|
87
|
+
if (gradient >= 34)
|
|
88
|
+
transitionCount += 1;
|
|
89
|
+
if (gradient >= 70)
|
|
90
|
+
isolatedEdges += 1;
|
|
91
|
+
}
|
|
92
|
+
if (row > 0 && column > 0)
|
|
93
|
+
diagonalGradient += Math.abs(value - values[index - columns - 1]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const count = Math.max(1, values.length);
|
|
97
|
+
const mean = sum / count;
|
|
98
|
+
const standardDeviation = Math.sqrt(Math.max(0, sumSquares / count - mean * mean));
|
|
99
|
+
const adjacencyCount = Math.max(1, rows * Math.max(0, columns - 1) + columns * Math.max(0, rows - 1));
|
|
100
|
+
const gradientMean = (horizontalGradient + verticalGradient) / adjacencyCount;
|
|
101
|
+
const gradientEnergy = Math.sqrt(gradientSquares / adjacencyCount) / 255;
|
|
102
|
+
const transitionRatio = transitionCount / adjacencyCount;
|
|
103
|
+
const anisotropy = Math.abs(horizontalGradient - verticalGradient) / Math.max(1, horizontalGradient + verticalGradient);
|
|
104
|
+
let specularEdges = 0;
|
|
105
|
+
for (let row = 1; row < rows - 1; row += 1)
|
|
106
|
+
for (let column = 1; column < columns - 1; column += 1) {
|
|
107
|
+
const index = row * columns + column;
|
|
108
|
+
if (values[index] >= 248 && [values[index - 1], values[index + 1], values[index - columns], values[index + columns]].some((value) => value > 30 && value < 225))
|
|
109
|
+
specularEdges += 1;
|
|
110
|
+
}
|
|
111
|
+
const glareRatio = runtime.glareRatio ?? Math.min(clippedHigh / count, specularEdges / count * 3);
|
|
112
|
+
const brightness = runtime.brightness ?? mean / 255;
|
|
113
|
+
const globalContrast = Math.min(1, standardDeviation / 96);
|
|
114
|
+
const edgeDensity = runtime.edgeDensity ?? Math.min(1, gradientMean / 64);
|
|
115
|
+
const blurSignal = runtime.blurScore === undefined ? gradientEnergy : runtime.blurScore;
|
|
116
|
+
const local = localDistribution(values, columns, rows);
|
|
117
|
+
const contrast = runtime.contrast ?? Math.min(globalContrast, Math.min(1, local.localDeviation / 128));
|
|
118
|
+
const diagonalSkew = Math.abs(diagonalGradient / Math.max(1, (rows - 1) * (columns - 1)) - gradientMean) / 96;
|
|
119
|
+
const envelope = perspectiveEnvelope(rowInkLeft, rowInkRight, columns);
|
|
120
|
+
const perspectiveScore = Math.min(1, Math.max(local.horizontalImbalance, local.verticalImbalance) * 1.35 + diagonalSkew * 0.8 + envelope.centerRange * 2.5 + envelope.widthVariation * 4);
|
|
121
|
+
const curvatureScore = Math.min(1, Math.abs(local.centerEdgeRatio - 1) * 0.9 + local.columnVariation * 0.4);
|
|
122
|
+
const estimatedPixelsPerModule = transitionRatio <= 0.01 ? 32 : Math.max(0.5, step / transitionRatio / 20);
|
|
123
|
+
const inkAreaRatio = inkCount < 4 ? 1 : ((inkRight - inkLeft + 1) * (inkBottom - inkTop + 1)) / Math.max(1, columns * rows);
|
|
124
|
+
const damageScore = Math.min(1, (isolatedEdges / adjacencyCount) * 0.7 + local.flatBlockRatio * 0.18 + local.blockVariation * 0.12);
|
|
125
|
+
const occlusionScore = Math.min(1, local.flatBlockRatio * Math.min(1, edgeDensity * 2.5));
|
|
126
|
+
const colorFringe = chromaSum / count;
|
|
127
|
+
const screenScore = Math.min(1, colorFringe * 2.8 + Math.max(0, local.periodicity - 0.72) * Math.max(0, transitionRatio - 0.2) * 2);
|
|
128
|
+
const dpmLikelihood = clamp01((1 - contrast) * 0.35 + glareRatio * 0.25 + edgeDensity * 0.25 + damageScore * 0.15);
|
|
129
|
+
const horizontalBorderInkRatio = horizontalBorderInk / Math.max(1, horizontalBorderSamples);
|
|
130
|
+
const verticalBorderInkRatio = verticalBorderInk / Math.max(1, verticalBorderSamples);
|
|
131
|
+
const busyBorderRatio = frame.width / Math.max(1, frame.height) >= 2 ? verticalBorderInkRatio : Math.max(horizontalBorderInkRatio, verticalBorderInkRatio);
|
|
132
|
+
const blur = levelFromHighBad(blurSignal, [0.28, 0.16, 0.08]);
|
|
133
|
+
const motionBlur = (runtime.motionEstimate ?? 0) > 0.12 || (transitionRatio > 0.025 && anisotropy > 0.38)
|
|
134
|
+
? levelFromScore(Math.max(runtime.motionEstimate ?? 0, anisotropy), [0.12, 0.28, 0.48])
|
|
135
|
+
: "none";
|
|
136
|
+
const underexposure = levelFromScore(1 - brightness, [0.78, 0.88, 0.95]);
|
|
137
|
+
const overexposure = levelFromScore(brightness, [0.86, 0.93, 0.975]);
|
|
138
|
+
const glare = levelFromScore(glareRatio, [0.025, 0.1, 0.24]);
|
|
139
|
+
const lowContrast = levelFromScore(1 - contrast, [0.68, 0.82, 0.92]);
|
|
140
|
+
const perspectiveDistortion = levelFromScore(perspectiveScore, [0.16, 0.34, 0.58]);
|
|
141
|
+
const curvature = levelFromScore(curvatureScore, [0.06, 0.16, 0.32]);
|
|
142
|
+
const smallModule = levelFromScore(Math.max(1 / Math.max(0.25, estimatedPixelsPerModule), inkCount >= 4 ? Math.max(0, 0.32 - inkAreaRatio) * 3 : 0), [0.22, 0.38, 0.7]);
|
|
143
|
+
const printingDamage = levelFromScore(damageScore, [0.18, 0.38, 0.62]);
|
|
144
|
+
const occlusion = levelFromScore(occlusionScore, [0.12, 0.3, 0.55]);
|
|
145
|
+
const screenMoiré = levelFromScore(screenScore, [0.18, 0.4, 0.66]);
|
|
146
|
+
const routeScores = [
|
|
147
|
+
["low-contrast", severity(lowContrast) * 4 + severity(underexposure) * 0.35 + severity(overexposure) * 0.2],
|
|
148
|
+
["illumination", local.illuminationVariation * 20 + severity(underexposure) * 0.2],
|
|
149
|
+
["glare", severity(glare)],
|
|
150
|
+
["blur", Math.max(severity(blur), severity(motionBlur))],
|
|
151
|
+
["perspective", severity(perspectiveDistortion)],
|
|
152
|
+
["curved", severity(curvature)],
|
|
153
|
+
["small-module", severity(smallModule)],
|
|
154
|
+
["damaged", severity(printingDamage) + severity(occlusion) * 0.35],
|
|
155
|
+
["quiet-zone", busyBorderRatio * 3],
|
|
156
|
+
["screen", severity(screenMoiré)],
|
|
157
|
+
["dpm", dpmLikelihood * 3],
|
|
158
|
+
];
|
|
159
|
+
const recommendedRoutes = routeScores
|
|
160
|
+
.filter(([, score]) => score >= 0.75)
|
|
161
|
+
.sort((left, right) => right[1] - left[1])
|
|
162
|
+
.map(([route]) => route);
|
|
163
|
+
return {
|
|
164
|
+
blur, motionBlur, underexposure, overexposure, glare, lowContrast,
|
|
165
|
+
perspectiveDistortion, curvature, smallModule, printingDamage, occlusion,
|
|
166
|
+
screenMoiré, dpmLikelihood, recommendedRoutes,
|
|
167
|
+
evidence: {
|
|
168
|
+
brightness, contrast, glareRatio, edgeDensity, gradientEnergy,
|
|
169
|
+
transitionRatio, anisotropy, perspectiveScore, curvatureScore,
|
|
170
|
+
estimatedPixelsPerModule, inkAreaRatio, damageScore, occlusionScore, screenScore, colorFringe, diagonalSkew,
|
|
171
|
+
perspectiveEnvelopeCenterRange: envelope.centerRange, perspectiveEnvelopeWidthVariation: envelope.widthVariation,
|
|
172
|
+
illuminationVariation: local.illuminationVariation,
|
|
173
|
+
busyBorderRatio,
|
|
174
|
+
horizontalBorderInkRatio,
|
|
175
|
+
verticalBorderInkRatio,
|
|
176
|
+
blockBusyBorderRatio: local.busyBorderRatio,
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function localDistribution(values, columns, rows) {
|
|
182
|
+
const blockColumns = Math.min(8, columns);
|
|
183
|
+
const blockRows = Math.min(8, rows);
|
|
184
|
+
const means = [];
|
|
185
|
+
const deviations = [];
|
|
186
|
+
let flatBlocks = 0;
|
|
187
|
+
let borderBusy = 0;
|
|
188
|
+
let borderBlocks = 0;
|
|
189
|
+
const columnMeans = new Array(columns).fill(0);
|
|
190
|
+
for (let column = 0; column < columns; column += 1) {
|
|
191
|
+
for (let row = 0; row < rows; row += 1)
|
|
192
|
+
columnMeans[column] += values[row * columns + column];
|
|
193
|
+
columnMeans[column] /= Math.max(1, rows);
|
|
194
|
+
}
|
|
195
|
+
for (let by = 0; by < blockRows; by += 1) {
|
|
196
|
+
for (let bx = 0; bx < blockColumns; bx += 1) {
|
|
197
|
+
const x0 = Math.floor((bx * columns) / blockColumns);
|
|
198
|
+
const x1 = Math.max(x0 + 1, Math.floor(((bx + 1) * columns) / blockColumns));
|
|
199
|
+
const y0 = Math.floor((by * rows) / blockRows);
|
|
200
|
+
const y1 = Math.max(y0 + 1, Math.floor(((by + 1) * rows) / blockRows));
|
|
201
|
+
let sum = 0;
|
|
202
|
+
let squares = 0;
|
|
203
|
+
let count = 0;
|
|
204
|
+
for (let y = y0; y < y1 && y < rows; y += 1)
|
|
205
|
+
for (let x = x0; x < x1 && x < columns; x += 1) {
|
|
206
|
+
const value = values[y * columns + x];
|
|
207
|
+
sum += value;
|
|
208
|
+
squares += value * value;
|
|
209
|
+
count += 1;
|
|
210
|
+
}
|
|
211
|
+
const mean = sum / Math.max(1, count);
|
|
212
|
+
const deviation = Math.sqrt(Math.max(0, squares / Math.max(1, count) - mean * mean));
|
|
213
|
+
means.push(mean);
|
|
214
|
+
deviations.push(deviation);
|
|
215
|
+
if (deviation < 5)
|
|
216
|
+
flatBlocks += 1;
|
|
217
|
+
if (bx === 0 || by === 0 || bx === blockColumns - 1 || by === blockRows - 1) {
|
|
218
|
+
borderBlocks += 1;
|
|
219
|
+
if (deviation > 28)
|
|
220
|
+
borderBusy += 1;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const mean = means.reduce((sum, value) => sum + value, 0) / Math.max(1, means.length);
|
|
225
|
+
const variation = Math.sqrt(means.reduce((sum, value) => sum + (value - mean) ** 2, 0) / Math.max(1, means.length)) / 128;
|
|
226
|
+
const left = average(columnMeans.slice(0, Math.max(1, Math.floor(columns / 3))));
|
|
227
|
+
const center = average(columnMeans.slice(Math.floor(columns / 3), Math.max(Math.floor(columns / 3) + 1, Math.ceil(columns * 2 / 3))));
|
|
228
|
+
const right = average(columnMeans.slice(Math.ceil(columns * 2 / 3)));
|
|
229
|
+
const top = average([...values.slice(0, Math.max(columns, Math.floor(values.length / 3)))]);
|
|
230
|
+
const bottom = average([...values.slice(Math.floor(values.length * 2 / 3))]);
|
|
231
|
+
let alternating = 0;
|
|
232
|
+
for (let index = 2; index < columnMeans.length; index += 1) {
|
|
233
|
+
if ((columnMeans[index] - columnMeans[index - 1]) * (columnMeans[index - 1] - columnMeans[index - 2]) < 0)
|
|
234
|
+
alternating += 1;
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
horizontalImbalance: Math.abs(left - right) / 255,
|
|
238
|
+
verticalImbalance: Math.abs(top - bottom) / 255,
|
|
239
|
+
centerEdgeRatio: center / Math.max(1, (left + right) / 2),
|
|
240
|
+
columnVariation: standardDeviation(columnMeans) / 128,
|
|
241
|
+
blockVariation: variation,
|
|
242
|
+
localDeviation: Math.max(0, ...deviations),
|
|
243
|
+
illuminationVariation: Math.min(1, Math.max(Math.abs(left - right) / 255, Math.abs(top - bottom) / 255, Math.abs(center / Math.max(1, (left + right) / 2) - 1) * 0.25)),
|
|
244
|
+
flatBlockRatio: flatBlocks / Math.max(1, means.length),
|
|
245
|
+
busyBorderRatio: borderBusy / Math.max(1, borderBlocks),
|
|
246
|
+
periodicity: alternating / Math.max(1, columnMeans.length - 2),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function rgb(frame, x, y) {
|
|
250
|
+
const row = y * frame.rowStride;
|
|
251
|
+
if (frame.pixelFormat === "gray8" || frame.pixelFormat === "yuv420") {
|
|
252
|
+
const value = frame.data[row + x] ?? 0;
|
|
253
|
+
return { red: value, green: value, blue: value };
|
|
254
|
+
}
|
|
255
|
+
const channels = frame.pixelFormat === "rgba8888" ? 4 : 3;
|
|
256
|
+
const offset = row + x * channels;
|
|
257
|
+
return { red: frame.data[offset] ?? 0, green: frame.data[offset + 1] ?? 0, blue: frame.data[offset + 2] ?? 0 };
|
|
258
|
+
}
|
|
259
|
+
function levelFromScore(score, thresholds) {
|
|
260
|
+
if (score >= thresholds[2])
|
|
261
|
+
return "high";
|
|
262
|
+
if (score >= thresholds[1])
|
|
263
|
+
return "medium";
|
|
264
|
+
if (score >= thresholds[0])
|
|
265
|
+
return "low";
|
|
266
|
+
return "none";
|
|
267
|
+
}
|
|
268
|
+
function levelFromHighBad(score, thresholds) {
|
|
269
|
+
if (score <= thresholds[2])
|
|
270
|
+
return "high";
|
|
271
|
+
if (score <= thresholds[1])
|
|
272
|
+
return "medium";
|
|
273
|
+
if (score <= thresholds[0])
|
|
274
|
+
return "low";
|
|
275
|
+
return "none";
|
|
276
|
+
}
|
|
277
|
+
function severity(level) { return level === "high" ? 3 : level === "medium" ? 2 : level === "low" ? 1 : 0; }
|
|
278
|
+
function clamp01(value) { return Math.max(0, Math.min(1, value)); }
|
|
279
|
+
function clampInteger(value, minimum, maximum) { return Math.max(minimum, Math.min(maximum, Math.floor(value))); }
|
|
280
|
+
function average(values) { return values.reduce((sum, value) => sum + value, 0) / Math.max(1, values.length); }
|
|
281
|
+
function standardDeviation(values) {
|
|
282
|
+
const mean = average(values);
|
|
283
|
+
return Math.sqrt(values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / Math.max(1, values.length));
|
|
284
|
+
}
|
|
285
|
+
function perspectiveEnvelope(left, right, columns) { const centers = []; const widths = []; for (let row = 0; row < left.length; row += 1)
|
|
286
|
+
if (right[row] >= left[row]) {
|
|
287
|
+
centers.push((left[row] + right[row]) / 2);
|
|
288
|
+
widths.push(right[row] - left[row] + 1);
|
|
289
|
+
} if (centers.length < 3)
|
|
290
|
+
return { centerRange: 0, widthVariation: 0 }; return { centerRange: (Math.max(...centers) - Math.min(...centers)) / Math.max(1, columns), widthVariation: standardDeviation(widths) / Math.max(1, columns) }; }
|
|
291
|
+
//# sourceMappingURL=difficulty-diagnosis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"difficulty-diagnosis.js","sourceRoot":"","sources":["../../src/industrial/difficulty-diagnosis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./memory.js";
|
|
3
|
+
export * from "./coordinate-transform.js";
|
|
4
|
+
export * from "./difficulty-diagnosis.js";
|
|
5
|
+
export * from "./candidate-region.js";
|
|
6
|
+
export * from "./recovery-route-registry.js";
|
|
7
|
+
export * from "./recovery-planner.js";
|
|
8
|
+
export * from "./recovery-routes.js";
|
|
9
|
+
export * from "./scan-evidence.js";
|
|
10
|
+
export * from "./decode-candidate-conflict.js";
|
|
11
|
+
export * from "./recovery-pipeline.js";
|
|
12
|
+
export * from "./scanner-diagnostics.js";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/industrial/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./memory.js";
|
|
3
|
+
export * from "./coordinate-transform.js";
|
|
4
|
+
export * from "./difficulty-diagnosis.js";
|
|
5
|
+
export * from "./candidate-region.js";
|
|
6
|
+
export * from "./recovery-route-registry.js";
|
|
7
|
+
export * from "./recovery-planner.js";
|
|
8
|
+
export * from "./recovery-routes.js";
|
|
9
|
+
export * from "./scan-evidence.js";
|
|
10
|
+
export * from "./decode-candidate-conflict.js";
|
|
11
|
+
export * from "./recovery-pipeline.js";
|
|
12
|
+
export * from "./scanner-diagnostics.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/industrial/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type RecoveryBufferKind = "candidate" | "normalized" | "rectified" | "warp" | "grayscale" | "binary";
|
|
2
|
+
export interface RecoveryMemoryObservation {
|
|
3
|
+
currentBytes: number;
|
|
4
|
+
peakBytes: number;
|
|
5
|
+
activeBuffers: number;
|
|
6
|
+
peakBuffers: number;
|
|
7
|
+
byKind: Readonly<Record<RecoveryBufferKind, number>>;
|
|
8
|
+
}
|
|
9
|
+
export interface RecoveryMemoryLease {
|
|
10
|
+
readonly bytes: number;
|
|
11
|
+
readonly kind: RecoveryBufferKind;
|
|
12
|
+
readonly released: boolean;
|
|
13
|
+
release(): void;
|
|
14
|
+
}
|
|
15
|
+
export declare class RecoveryMemoryAccountant {
|
|
16
|
+
readonly maximumBytes: number;
|
|
17
|
+
private currentBytes;
|
|
18
|
+
private peakBytes;
|
|
19
|
+
private peakBuffers;
|
|
20
|
+
private readonly leases;
|
|
21
|
+
private readonly byKind;
|
|
22
|
+
constructor(maximumBytes: number);
|
|
23
|
+
reserve(bytes: number, kind: RecoveryBufferKind): RecoveryMemoryLease;
|
|
24
|
+
releaseAll(): void;
|
|
25
|
+
get activeBufferCount(): number;
|
|
26
|
+
get observation(): RecoveryMemoryObservation;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/industrial/memory.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5G,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qBAAa,wBAAwB;IASvB,QAAQ,CAAC,YAAY,EAAE,MAAM;IARzC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;gBAEmB,YAAY,EAAE,MAAM;IAIzC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,mBAAmB;IAqBrE,UAAU,IAAI,IAAI;IAClB,IAAI,iBAAiB,IAAI,MAAM,CAA6B;IAC5D,IAAI,WAAW,IAAI,yBAAyB,CAQ3C;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export class RecoveryMemoryAccountant {
|
|
2
|
+
maximumBytes;
|
|
3
|
+
currentBytes = 0;
|
|
4
|
+
peakBytes = 0;
|
|
5
|
+
peakBuffers = 0;
|
|
6
|
+
leases = new Set();
|
|
7
|
+
byKind = {
|
|
8
|
+
candidate: 0, normalized: 0, rectified: 0, warp: 0, grayscale: 0, binary: 0,
|
|
9
|
+
};
|
|
10
|
+
constructor(maximumBytes) {
|
|
11
|
+
this.maximumBytes = maximumBytes;
|
|
12
|
+
if (!Number.isSafeInteger(maximumBytes) || maximumBytes < 1)
|
|
13
|
+
throw new RangeError("Recovery memory limit must be a positive integer.");
|
|
14
|
+
}
|
|
15
|
+
reserve(bytes, kind) {
|
|
16
|
+
const normalized = Math.max(0, Math.ceil(bytes));
|
|
17
|
+
if (!Number.isSafeInteger(normalized) || this.currentBytes + normalized > this.maximumBytes) {
|
|
18
|
+
throw Object.assign(new Error(`Recovery memory budget exceeded for ${kind}.`), {
|
|
19
|
+
code: "resource_limit_exceeded", requestedBytes: normalized,
|
|
20
|
+
currentBytes: this.currentBytes, maximumBytes: this.maximumBytes,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const lease = new Lease(normalized, kind, () => {
|
|
24
|
+
if (!this.leases.delete(lease))
|
|
25
|
+
return;
|
|
26
|
+
this.currentBytes -= lease.bytes;
|
|
27
|
+
this.byKind[lease.kind] -= lease.bytes;
|
|
28
|
+
});
|
|
29
|
+
this.leases.add(lease);
|
|
30
|
+
this.currentBytes += normalized;
|
|
31
|
+
this.byKind[kind] += normalized;
|
|
32
|
+
this.peakBytes = Math.max(this.peakBytes, this.currentBytes);
|
|
33
|
+
this.peakBuffers = Math.max(this.peakBuffers, this.leases.size);
|
|
34
|
+
return lease;
|
|
35
|
+
}
|
|
36
|
+
releaseAll() { for (const lease of [...this.leases])
|
|
37
|
+
lease.release(); }
|
|
38
|
+
get activeBufferCount() { return this.leases.size; }
|
|
39
|
+
get observation() {
|
|
40
|
+
return {
|
|
41
|
+
currentBytes: this.currentBytes,
|
|
42
|
+
peakBytes: this.peakBytes,
|
|
43
|
+
activeBuffers: this.leases.size,
|
|
44
|
+
peakBuffers: this.peakBuffers,
|
|
45
|
+
byKind: { ...this.byKind },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
class Lease {
|
|
50
|
+
bytes;
|
|
51
|
+
kind;
|
|
52
|
+
onRelease;
|
|
53
|
+
done = false;
|
|
54
|
+
constructor(bytes, kind, onRelease) {
|
|
55
|
+
this.bytes = bytes;
|
|
56
|
+
this.kind = kind;
|
|
57
|
+
this.onRelease = onRelease;
|
|
58
|
+
}
|
|
59
|
+
get released() { return this.done; }
|
|
60
|
+
release() { if (!this.done) {
|
|
61
|
+
this.done = true;
|
|
62
|
+
this.onRelease();
|
|
63
|
+
} }
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/industrial/memory.ts"],"names":[],"mappings":"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"}
|