import { createRequire } from "module"; import { isMainThread, parentPort, workerData } from "worker_threads"; import fetch from "node-fetch"; const nodeRequire = createRequire(import.meta.url); const magick = nodeRequire(`../build/${process.env.DEBUG && process.env.DEBUG === "true" ? "Debug" : "Release"}/image.node`); function run(object) { return new Promise((resolve, reject) => { // If the image has a path, it must also have a type let promise = new Promise((resolveTest) => { resolveTest(); }); // no-op if (object.path) { if (object.params.type !== "image/gif" && object.onlyGIF) resolve({ buffer: Buffer.alloc(0), fileExtension: "nogif" }); promise = fetch(object.path).then(res => res.arrayBuffer()).then(buf => { return Buffer.from(buf); }); } // Convert from a MIME type (e.g. "image/png") to something ImageMagick understands (e.g. "png"). // Don't set `type` directly on the object we are passed as it will be read afterwards. // If no image type is given (say, the command generates its own image), make it a PNG. const fileExtension = object.params.type ? object.params.type.split("/")[1] : "png"; promise.then(buf => { object.params.data = buf; const objectWithFixedType = Object.assign({}, object.params, {type: fileExtension}); try { const result = magick[object.cmd](objectWithFixedType); const returnObject = { buffer: result.data, fileExtension: result.type }; resolve(returnObject); } catch (e) { reject(e); } }); }); } if (!isMainThread) { run(workerData) .then(returnObject => { parentPort.postMessage(returnObject); process.exit(); }) .catch(err => { // turn promise rejection into normal error throw err; }); }