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`); const enumMap = { "forget":0, "northwest":1, "north":2, "northeast":3, "west":4, "center":5, "east":6, "southwest":7, "south":8, "southeast":9 } export default function run(object) { return new Promise((resolve, reject) => { // If the image has a path, it must also have a type let promise = Promise.resolve(); 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 => 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}); if (objectWithFixedType.gravity) { if (isNaN(Number(objectWithFixedType.gravity))){ objectWithFixedType.gravity=enumMap[objectWithFixedType.gravity]; } } 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; }); }