mrmBot-Matrix/utils/image-runner.js

44 lines
1.4 KiB
JavaScript

const magick = require("../build/Release/image.node");
const { promisify } = require("util");
const { isMainThread, parentPort, workerData } = require("worker_threads");
exports.run = async object => {
return new Promise(async (resolve, reject) => {
// If the image has a path, it must also have a type
if (object.path) {
if (object.type !== "image/gif" && object.onlyGIF) resolve({
buffer: Buffer.alloc(0),
fileExtension: "nogif"
});
}
// 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";
const objectWithFixedType = Object.assign({}, object, {type: fileExtension});
try {
const data = await promisify(magick[object.cmd])(objectWithFixedType);
const returnObject = {
buffer: data,
fileExtension
};
resolve(returnObject);
} catch (e) {
reject(e);
}
});
};
if (!isMainThread) {
this.run(workerData)
// eslint-disable-next-line promise/always-return
.then(returnObject => {
parentPort.postMessage(returnObject);
process.exit();
})
.catch(err => {
// turn promise rejection into normal error
throw err;
});
}