UNPKG

@syngrisi/syngrisi

Version:
91 lines (88 loc) 3 kB
// 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