micro-image-manager
Version:
Manage images in your microservices
109 lines (90 loc) • 2.49 kB
JavaScript
;
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
const sharp = require('sharp');
const os = require('os');
const crypto = require("crypto");
const path = require("path");
const FORMATS = {
png: [{
format: 'png',
rank: 3
}, {
format: 'webp',
rank: 1
}],
jpg: [{
format: 'jpeg',
rank: 2
}, {
format: 'webp',
rank: 1
}],
jpeg: [{
format: 'jpeg',
rank: 2
}, {
format: 'webp',
rank: 1
}],
gif: [{
format: 'gif',
rank: 4
}, {
format: 'webp',
rank: 1
}]
};
const buildImageRecords = async (imageFile, profiles) => {
const records = [];
const suggestedFormats = await suggestConvertingFormats(imageFile);
for (let profile of profiles) {
for (let suggestedFormat of suggestedFormats) {
const resizedImage = await resizeImage(imageFile, profile, suggestedFormat.format, suggestedFormat.originalFormat);
records.push({
image: resizedImage,
profile,
format: suggestedFormat.format,
originalFormat: suggestedFormat.originalFormat,
formatPriority: suggestedFormat.formatPriority
});
}
}
return records;
};
const suggestConvertingFormats = async file => {
const meta = await sharp(file).metadata();
const formats = FORMATS[meta.format];
if (!formats) {
throw new Error(`Format ${meta.format} is not supported`);
}
return formats.map(format => _extends({
originalFormat: meta.format
}, format));
};
const resizeImage = async (file, profile, format, originalFormat) => {
const process = sharp(file).resize(profile.width, profile.height);
switch (format) {
case 'png':
process.png();
break;
case 'webp':
process.webp({
lossless: originalFormat == 'png' || originalFormat == 'gif'
});
break;
case 'jpeg':
process.webp();
break;
case 'gif':
process.webp({
lossless: originalFormat == 'png' || originalFormat == 'gif'
});
break;
}
const tempFile = path.join(os.tmpdir(), crypto.randomBytes(16).toString('hex') + '.' + format);
await process.toFile(tempFile);
return tempFile;
};
module.exports = {
buildImageRecords
};