@syngrisi/syngrisi
Version:
Syngrisi - Visual Testing Tool
91 lines (88 loc) • 3 kB
JavaScript
// src/server/lib/comparison/imageDiffWorker.ts
import { parentPort, workerData } from "worker_threads";
// src/server/lib/comparison/compareImagesNode.ts
import resemble from "@syngrisi/node-resemble.js";
async function streamToBuffer(stream) {
return new Promise((resolve, reject) => {
const data = [];
stream.on("data", (chunk) => {
data.push(chunk);
});
stream.on("end", () => {
resolve(Buffer.concat(data));
});
stream.on("error", (err) => {
reject(err);
});
});
}
function compareImages(image1, image2, options) {
return new Promise((resolve, reject) => {
try {
const ignoreTransform = {
antialiasing: "ignoreAntialiasing",
colors: "ignoreColors",
nothing: "ignoreNothing"
};
const ignoreMethod = ignoreTransform[options.ignore] ? ignoreTransform[options.ignore] : "ignoreNothing";
const outputOpts = options.output;
resemble.outputSettings(outputOpts);
let ignoredRect;
if (options.ignoreRectangles) {
ignoredRect = options.ignoreRectangles.map((it) => {
delete it.name;
return [it.left, it.top, it.right - it.left, it.bottom - it.top];
});
}
resemble(image1).compareTo(image2)[ignoreMethod]().ignoreRectangles(ignoredRect).onComplete(async (data) => {
console.log(data);
const stream = await data.getDiffImage();
const buffer = await streamToBuffer(stream.pack());
data.getBuffer = function() {
return buffer;
};
resolve(data);
});
} catch (e) {
reject(e);
}
});
}
// src/server/utils/imageUtils.ts
var getPngDimensions = (buffer) => {
if (buffer.length < 24) {
throw new Error("Buffer too small to be a PNG");
}
if (buffer.readUInt32BE(0) !== 2303741511 || buffer.readUInt32BE(4) !== 218765834) {
throw new Error("Invalid PNG signature");
}
const width = buffer.readUInt32BE(16);
const height = buffer.readUInt32BE(20);
return { width, height };
};
// src/server/lib/comparison/imageDiffWorker.ts
var run = async () => {
const { baselineOrigin, actualOrigin, options } = workerData;
try {
const compareResult = await compareImages(baselineOrigin, actualOrigin, options);
const resultBuffer = typeof compareResult?.getBuffer === "function" ? await compareResult.getBuffer() : null;
const plainResult = Object.fromEntries(Object.entries(compareResult || {}).filter(([_, v]) => typeof v !== "function"));
try {
plainResult.baselineDimensions = getPngDimensions(baselineOrigin);
plainResult.actualDimensions = getPngDimensions(actualOrigin);
} catch (e) {
}
parentPort?.postMessage({
ok: true,
result: plainResult,
diffBuffer: resultBuffer
});
} catch (error) {
parentPort?.postMessage({
ok: false,
error: error instanceof Error ? error.message : String(error)
});
}
};
void run();
//# sourceMappingURL=imageDiffWorker.js.map