import * as plugins from './smartjimp.plugins.js'; export interface IDimensions { width?: number; height?: number; } export class SmartJimp { public levelCache = new plugins.levelcache.LevelCache({ cacheId: 'mastercache', maxMemoryStorageInMB: 100, maxDiskStorageInMB: 5000, }); /** * get a key that is unique for a wanted asset variation */ private getCacheKey( sourceTypeArg: 'streamfile' | 'smartfile', sourceIdArg: string, wantedDimensionsArg?: IDimensions ) { return `${sourceTypeArg}_${sourceIdArg}_${ wantedDimensionsArg ? `${wantedDimensionsArg.width || 'auto' }x${wantedDimensionsArg.height || 'auto'}` : 'original' }`; } private async computeAssetVariation(assetBuffer: Buffer, wantedDimensions?: IDimensions) { if (!wantedDimensions) { return assetBuffer; } let sharpImage = plugins.sharp(assetBuffer); sharpImage = sharpImage.resize(wantedDimensions.width, wantedDimensions.height); const result = await sharpImage.resize(wantedDimensions.width, wantedDimensions.height).avif().toBuffer(); return result; } public async getFromSmartfile( smartfileArg: plugins.smartfile.SmartFile, wantedDimensionsArg?: IDimensions ) { 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; } } public async createAvifImageFromBuffer(bufferArg: Buffer) { const sharpImage = plugins.sharp(bufferArg); const result = await sharpImage.avif().toBuffer(); return result; } }