UNPKG

@push.rocks/smartjimp

Version:

A TypeScript library for image processing combining both sharp and jimp libraries.

143 lines 12.4 kB
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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