Skip to content

Commit 805bdc9

Browse files
authored
Merge branch 'main' into dependabot/npm_and_yarn/sharp-0.34.5
2 parents ac98e26 + 2f76672 commit 805bdc9

7 files changed

Lines changed: 1013 additions & 2479 deletions

File tree

package-lock.json

Lines changed: 882 additions & 2407 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,24 @@
2626
"@eslint/js": "~9.36",
2727
"@types/brotli": "^1.3.4",
2828
"@types/eslint__js": "~9.14",
29-
"@types/node": "~24",
30-
"@typescript-eslint/parser": "~8.44",
31-
"@vitest/coverage-v8": "^3.2.4",
32-
"@vitest/eslint-plugin": "~1.3",
29+
"@types/node": "~25",
30+
"@typescript-eslint/parser": "~8.55",
31+
"@vitest/coverage-v8": "^4.0.18",
32+
"@vitest/eslint-plugin": "~1.6",
3333
"eslint": "^9.38.0",
3434
"eslint-config-prettier": "~10.1",
35-
"globals": "~16.4",
35+
"globals": "~17.3",
3636
"grpc_tools_node_protoc": "^1.0.0",
3737
"grpc-tools": "^1.13.0",
38-
"prettier": "~3.6",
39-
"rimraf": "~6.0",
40-
"ts-api-utils": "~2.1",
38+
"prettier": "~3.8",
39+
"rimraf": "~6.1",
40+
"ts-api-utils": "~2.4",
4141
"ts-proto": "^2.7.7",
4242
"typed-emitter": "^2.1.0",
4343
"typedoc": "^0.28.12",
4444
"typescript": "~5.9",
45-
"typescript-eslint": "~8.46",
46-
"vitest": "^3.2.4"
45+
"typescript-eslint": "~8.55",
46+
"vitest": "^4.0.18"
4747
},
4848
"scripts": {
4949
"start": "node build/src/main.js",
@@ -75,10 +75,11 @@
7575
"@grpc/proto-loader": "^0.8.0",
7676
"brotli": "^1.3.3",
7777
"jwt-decode": "^4.0.0",
78+
"opencv-wasm": "^4.3.0-10",
7879
"openid-client": "^6.8.1",
7980
"protobufjs": "^7.5.4",
8081
"rxjs": "^7.8.2",
81-
"sharp": "^0.34.4",
82+
"sharp": "^0.34.5",
8283
"tslib": "~2.8"
8384
},
8485
"volta": {

samples/hash-server/package-lock.json

Lines changed: 42 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/hash-server/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"description": "",
1717
"dependencies": {
1818
"@crispthinking/athena-classifier-sdk": "file:../../",
19-
"express": "^4.19.2",
19+
"express": "^4.22.1",
2020
"multer": "^2.0.2"
2121
},
2222
"devDependencies": {

src/hashing.ts

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Readable } from 'stream';
2+
import { createRequire } from 'module';
23
import crypto from 'crypto';
34
import sharp from 'sharp';
45
import {
@@ -9,6 +10,9 @@ import {
910
import brotli from 'brotli';
1011
import { buffer } from 'stream/consumers';
1112

13+
const require_ = createRequire(import.meta.url);
14+
const { cv } = require_('opencv-wasm');
15+
1216
/**
1317
* Computes MD5 and SHA1 hashes from a readable stream and resizes any image data.
1418
* @param stream Node.js readable stream (e.g., fs.createReadStream)
@@ -54,16 +58,29 @@ export async function computeHashesFromStream(
5458
}
5559

5660
if (resize) {
57-
const resizer = sharp().resize(448, 448).raw({ depth: 'char' });
58-
stream.pipe(resizer);
59-
const rgbData = await resizer.toBuffer();
60-
// Sharp outputs RGB format, but Athena expects BGR - swap R and B channels
61-
data = Buffer.alloc(rgbData.length);
62-
for (let i = 0; i < rgbData.length; i += 3) {
63-
data[i] = rgbData[i + 2]; // B <- R
64-
data[i + 1] = rgbData[i + 1]; // G <- G
65-
data[i + 2] = rgbData[i]; // R <- B
66-
}
61+
const rawBuffer = await buffer(stream);
62+
63+
const decoded = await sharp(rawBuffer)
64+
.removeAlpha()
65+
.raw({ depth: 'uchar' })
66+
.toBuffer({ resolveWithObject: true });
67+
68+
const { data: rgbPixels, info } = decoded;
69+
70+
const srcMat = new cv.Mat(info.height, info.width, cv.CV_8UC3);
71+
srcMat.data.set(rgbPixels);
72+
73+
const dstMat = new cv.Mat(448, 448, cv.CV_8UC3);
74+
cv.resize(srcMat, dstMat, new cv.Size(448, 448), 0, 0, cv.INTER_LINEAR);
75+
srcMat.delete();
76+
77+
const bgrMat = new cv.Mat(448, 448, cv.CV_8UC3);
78+
cv.cvtColor(dstMat, bgrMat, cv.COLOR_RGB2BGR);
79+
dstMat.delete();
80+
81+
data = Buffer.from(bgrMat.data);
82+
bgrMat.delete();
83+
6784
imageFormat = ImageFormat.IMAGE_FORMAT_RAW_UINT8_BGR;
6885
} else {
6986
data = await buffer(stream);

src/types/opencv-wasm.d.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
declare module 'opencv-wasm' {
2+
export interface Mat {
3+
data: Uint8Array;
4+
rows: number;
5+
cols: number;
6+
channels(): number;
7+
delete(): void;
8+
}
9+
10+
export const cv: {
11+
Mat: new (rows: number, cols: number, type: number) => Mat;
12+
Size: new (width: number, height: number) => unknown;
13+
CV_8UC3: number;
14+
INTER_LINEAR: number;
15+
COLOR_RGB2BGR: number;
16+
resize(
17+
src: Mat,
18+
dst: Mat,
19+
size: unknown,
20+
fx: number,
21+
fy: number,
22+
interpolation: number,
23+
): void;
24+
cvtColor(src: Mat, dst: Mat, code: number): void;
25+
};
26+
}

0 commit comments

Comments
 (0)