@push.rocks/smartjimp
Version:
A TypeScript library for image processing combining both sharp and jimp libraries.
143 lines • 12.4 kB
JavaScript
import * as plugins from './plugins.js';
import * as pluginsTyped from './plugins.typed.js';
export class SmartJimp {
constructor(optionsArg) {
this.levelCache = new plugins.levelcache.LevelCache({
cacheId: 'mastercache',
maxMemoryStorageInMB: 100,
maxDiskStorageInMB: 5000,
});
this.options = optionsArg;
}
/**
* get a key that is unique for a wanted asset variation
*/
getCacheKey(sourceTypeArg, sourceIdArg, assetVariationArg) {
return `${sourceTypeArg}_${sourceIdArg}_${assetVariationArg
? `${assetVariationArg.width || 'auto'}x${assetVariationArg.height || 'auto'}`
: 'original'}`;
}
async getSharpMod() {
if (!this.sharpMod) {
this.sharpMod = (await import('sharp')).default;
}
return this.sharpMod;
}
async getJimpMod() {
if (!this.jimpMod) {
this.jimpMod = await import('jimp');
}
return this.jimpMod;
}
async computeAssetVariation(assetBufferArg, assetVariationArg) {
if (this.options.mode === 'sharp') {
const sharp = await this.getSharpMod();
if (!assetVariationArg) {
return assetBufferArg;
}
let sharpImage = sharp(assetBufferArg);
sharpImage = sharpImage.resize(assetVariationArg.width, assetVariationArg.height);
const resultResize = sharpImage.resize(assetVariationArg.width, assetVariationArg.height);
if (assetVariationArg.invert) {
// TODO: implement invert
}
switch (assetVariationArg.format) {
case 'avif':
const avifOptions = {};
if (assetVariationArg.quality !== undefined) {
avifOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.avif(avifOptions);
break;
case 'webp':
const webpOptions = {};
if (assetVariationArg.quality !== undefined) {
webpOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.webp(webpOptions);
break;
case 'png':
const pngOptions = {};
if (assetVariationArg.quality !== undefined) {
pngOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.png(pngOptions);
break;
case 'jpeg':
const jpegOptions = {
progressive: assetVariationArg.progressive || false
};
if (assetVariationArg.quality !== undefined) {
jpegOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.jpeg(jpegOptions);
break;
default:
// Default to JPEG
const defaultJpegOptions = {
progressive: assetVariationArg.progressive || false
};
if (assetVariationArg.quality !== undefined) {
defaultJpegOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.jpeg(defaultJpegOptions);
}
return sharpImage.toBuffer();
}
else if (this.options.mode === 'jimp') {
const jimpMod = await this.getJimpMod();
let jimpImage = await jimpMod.Jimp.read(assetBufferArg);
if (assetVariationArg.width || assetVariationArg.height) {
const resizeOptions = {};
if (assetVariationArg.width)
resizeOptions.w = assetVariationArg.width;
if (assetVariationArg.height)
resizeOptions.h = assetVariationArg.height;
jimpImage.resize(resizeOptions);
}
if (assetVariationArg.invert) {
jimpImage.invert();
}
// Note: Jimp does not support progressive JPEG encoding
// Progressive option is ignored in jimp mode
const jpegOptions = {};
if (assetVariationArg.quality !== undefined) {
jpegOptions.quality = assetVariationArg.quality;
}
switch (assetVariationArg.format) {
case 'png':
return await jimpImage.getBuffer("image/png");
case 'webp':
case 'avif':
console.log(`Jimp doesn't support ${assetVariationArg.format}, falling back to JPEG`);
// Fall through to JPEG
case 'jpeg':
default:
// Default to JPEG
return await jimpImage.getBuffer("image/jpeg", jpegOptions);
}
}
}
async getFromSmartfile(smartfileArg, wantedDimensionsArg) {
const cacheKey = this.getCacheKey('smartfile', await smartfileArg.getHash(), wantedDimensionsArg);
const existingCacheEntry = await this.levelCache.retrieveCacheEntryByKey(cacheKey);
if (existingCacheEntry) {
return existingCacheEntry.contents;
}
else {
const computedAssetBuffer = await this.computeAssetVariation(smartfileArg.contentBuffer, wantedDimensionsArg);
this.levelCache.storeCacheEntryByKey(cacheKey, new plugins.levelcache.CacheEntry({
contents: computedAssetBuffer,
ttl: 600000,
}));
return computedAssetBuffer;
}
}
async createAvifImageFromBuffer(bufferArg) {
const sharp = await this.getSharpMod();
const sharpImage = sharp(bufferArg);
const result = await sharpImage.avif().toBuffer();
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRqaW1wLmNsYXNzZXMuc21hcnRqaW1wLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRqaW1wLmNsYXNzZXMuc21hcnRqaW1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFlbkQsTUFBTSxPQUFPLFNBQVM7SUFRcEIsWUFBWSxVQUE2QjtRQVBsQyxlQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUNwRCxPQUFPLEVBQUUsYUFBYTtZQUN0QixvQkFBb0IsRUFBRSxHQUFHO1lBQ3pCLGtCQUFrQixFQUFFLElBQUk7U0FDekIsQ0FBQyxDQUFDO1FBSUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUNqQixhQUF5QyxFQUN6QyxXQUFtQixFQUNuQixpQkFBbUM7UUFFbkMsT0FBTyxHQUFHLGFBQWEsSUFBSSxXQUFXLElBQ3BDLGlCQUFpQjtZQUNmLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLEtBQUssSUFBSSxNQUFNLElBQUksaUJBQWlCLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRTtZQUM5RSxDQUFDLENBQUMsVUFDTixFQUFFLENBQUM7SUFDTCxDQUFDO0lBR00sS0FBSyxDQUFDLFdBQVc7UUFHdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbEQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBR00sS0FBSyxDQUFDLFVBQVU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFP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