52 lines
1.8 KiB
JavaScript
52 lines
1.8 KiB
JavaScript
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.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.type ? object.type.split("/")[1] : "png";
|
|
promise.then(buf => {
|
|
object.data = buf;
|
|
const objectWithFixedType = Object.assign({}, object, {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();
|
|
return;
|
|
})
|
|
.catch(err => {
|
|
// turn promise rejection into normal error
|
|
throw err;
|
|
});
|
|
}
|