@scanly/node 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/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/package.json +30 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CaptureRouter, EngineRegistry, type CaptureRouterOptions, type IndustrialRecoveryOptions, type IndustrialRecoveryResult, type NormalizedFrame, type ScenarioDefinition } from "@scanly/core";
|
|
2
|
+
import { type DecodeOutcome, type DecodePipelineOptions, type PipelineEngineExecutor, type PixelBuffer } from "@scanly/core/qr";
|
|
3
|
+
import { type ZxingCppWasmEngineOptions } from "@scanly/engine-zxing-cpp-wasm";
|
|
4
|
+
export declare function loadPixelBufferFromPath(filePath: string): Promise<PixelBuffer>;
|
|
5
|
+
export declare function loadNormalizedFrameFromPath(filePath: string, id?: string): Promise<NormalizedFrame>;
|
|
6
|
+
export interface NodeCaptureRouterOptions extends Omit<CaptureRouterOptions, "engines"> {
|
|
7
|
+
zxingCppWasm?: ZxingCppWasmEngineOptions | false;
|
|
8
|
+
}
|
|
9
|
+
export declare function createNodeCaptureRouter(options?: NodeCaptureRouterOptions): CaptureRouter;
|
|
10
|
+
export declare function createNodeEngineRegistry(options?: {
|
|
11
|
+
zxingCppWasm?: ZxingCppWasmEngineOptions | false;
|
|
12
|
+
}): EngineRegistry;
|
|
13
|
+
export declare function createNodePipelineEngineExecutor(engines?: EngineRegistry): PipelineEngineExecutor;
|
|
14
|
+
/** Lower-level algorithm adapter; canonical SDK benchmarks should use CaptureRouter. */
|
|
15
|
+
export declare function decodePixelBufferWithNodeEngines(image: PixelBuffer, options?: DecodePipelineOptions): Promise<DecodeOutcome>;
|
|
16
|
+
export interface NodeIndustrialScanOptions extends IndustrialRecoveryOptions {
|
|
17
|
+
scenario?: ScenarioDefinition;
|
|
18
|
+
}
|
|
19
|
+
/** Explicit Node industrial decode path; normal CaptureRouter behavior remains unchanged. */
|
|
20
|
+
export declare function scanWithNodeIndustrialRecovery(router: CaptureRouter, frame: NormalizedFrame, options?: NodeIndustrialScanOptions): Promise<IndustrialRecoveryResult>;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,cAAc,EAKd,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EAA+D,KAAK,aAAa,EAAE,KAAK,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG7L,OAAO,EAA4B,KAAK,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAEzG,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CASpF;AAED,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAGzG;AAED,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC;IACrF,YAAY,CAAC,EAAE,yBAAyB,GAAG,KAAK,CAAC;CAClD;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,wBAA6B,GAAG,aAAa,CAI7F;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,yBAAyB,GAAG,KAAK,CAAA;CAAO,GAAG,cAAc,CAM3H;AAED,wBAAgB,gCAAgC,CAAC,OAAO,GAAE,cAA2C,GAAG,sBAAsB,CAM7H;AAED,wFAAwF;AACxF,wBAAsB,gCAAgC,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,aAAa,CAAC,CAWtI;AAED,MAAM,WAAW,yBAA0B,SAAQ,yBAAyB;IAC1E,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED,6FAA6F;AAC7F,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CAQnC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import sharp from "sharp";
|
|
2
|
+
import { CaptureRouter, EngineRegistry, IndustrialRecoveryPipeline, createRecoveryProbeScenario, createRgbaFrame, getBuiltinScenario, } from "@scanly/core";
|
|
3
|
+
import { createPixelBuffer, decodePixelBuffer, flattenAlphaOntoWhite } from "@scanly/core/qr";
|
|
4
|
+
import { JsQrEngine } from "@scanly/engine-jsqr";
|
|
5
|
+
import { ZxingJsEngine } from "@scanly/engine-zxing-js";
|
|
6
|
+
import { createZxingCppWasmEngine } from "@scanly/engine-zxing-cpp-wasm";
|
|
7
|
+
export async function loadPixelBufferFromPath(filePath) {
|
|
8
|
+
try {
|
|
9
|
+
const { data, info } = await sharp(filePath).rotate().ensureAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
10
|
+
if (info.width < 1 || info.height < 1)
|
|
11
|
+
throw Object.assign(new Error("Image has no pixel data."), { code: "empty_image" });
|
|
12
|
+
return flattenAlphaOntoWhite(createPixelBuffer(new Uint8ClampedArray(data.buffer, data.byteOffset, data.byteLength), info.width, info.height));
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error && typeof error === "object" && "code" in error)
|
|
16
|
+
throw error;
|
|
17
|
+
throw Object.assign(new Error("Unsupported or corrupted image."), { code: "unsupported_image", cause: error });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function loadNormalizedFrameFromPath(filePath, id) {
|
|
21
|
+
const pixels = await loadPixelBufferFromPath(filePath);
|
|
22
|
+
return createRgbaFrame(pixels.data, pixels.width, pixels.height, { id, sourceType: "upload", ownership: "owned" });
|
|
23
|
+
}
|
|
24
|
+
export function createNodeCaptureRouter(options = {}) {
|
|
25
|
+
const { zxingCppWasm, ...routerOptions } = options;
|
|
26
|
+
const engines = createNodeEngineRegistry({ zxingCppWasm });
|
|
27
|
+
return new CaptureRouter({ ...routerOptions, engines });
|
|
28
|
+
}
|
|
29
|
+
export function createNodeEngineRegistry(options = {}) {
|
|
30
|
+
const engines = new EngineRegistry();
|
|
31
|
+
engines.register(new JsQrEngine());
|
|
32
|
+
if (options.zxingCppWasm !== false)
|
|
33
|
+
engines.register(createZxingCppWasmEngine(options.zxingCppWasm));
|
|
34
|
+
engines.register(new ZxingJsEngine());
|
|
35
|
+
return engines;
|
|
36
|
+
}
|
|
37
|
+
export function createNodePipelineEngineExecutor(engines = createNodeEngineRegistry()) {
|
|
38
|
+
return {
|
|
39
|
+
engineIds: engines.list().map((engine) => engine.id),
|
|
40
|
+
versions: Object.fromEntries(engines.list().map((engine) => [engine.id, engine.version])),
|
|
41
|
+
decode: (engineId, image, options) => engines.decode(engineId, createRgbaFrame(image.data, image.width, image.height), { formats: options.formats, findMultiple: options.findMultiple, signal: options.signal, inversion: options.inversion }),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Lower-level algorithm adapter; canonical SDK benchmarks should use CaptureRouter. */
|
|
45
|
+
export async function decodePixelBufferWithNodeEngines(image, options = {}) {
|
|
46
|
+
const engines = createNodeEngineRegistry();
|
|
47
|
+
try {
|
|
48
|
+
return await decodePixelBuffer(image, {
|
|
49
|
+
...options,
|
|
50
|
+
engineExecutor: createNodePipelineEngineExecutor(engines),
|
|
51
|
+
config: { ...options.config, decoders: options.config?.decoders ?? { order: ["jsqr", "zxing-cpp-wasm", "zxing-js"], execution: "sequential" } },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await engines.disposeAll();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Explicit Node industrial decode path; normal CaptureRouter behavior remains unchanged. */
|
|
59
|
+
export async function scanWithNodeIndustrialRecovery(router, frame, options = {}) {
|
|
60
|
+
const profile = options.profile ?? "industrial";
|
|
61
|
+
const scenario = options.scenario ?? getBuiltinScenario(normalProfile(profile));
|
|
62
|
+
const pipeline = new IndustrialRecoveryPipeline();
|
|
63
|
+
return pipeline.run(frame, (candidate, request) => router.scan({ ...candidate, ownership: "borrowed", dispose: undefined }, { signal: request.signal, scenario: request.routeId === "general" ? scenario : createRecoveryProbeScenario(scenario, request.routeId) }), { ...options, profile, sourceMode: "static" });
|
|
64
|
+
}
|
|
65
|
+
function normalProfile(profile) {
|
|
66
|
+
if (profile === "fast" || profile === "balanced" || profile === "robust")
|
|
67
|
+
return profile;
|
|
68
|
+
return "robust";
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@scanly/node",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Node-only Scanly image loading and configured capture runtime",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc -p tsconfig.build.json"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@scanly/core": "2.0.0",
|
|
25
|
+
"@scanly/engine-jsqr": "2.0.0",
|
|
26
|
+
"@scanly/engine-zxing-cpp-wasm": "2.0.0",
|
|
27
|
+
"@scanly/engine-zxing-js": "2.0.0",
|
|
28
|
+
"sharp": "^0.35.3"
|
|
29
|
+
}
|
|
30
|
+
}
|