import fs from "node:fs" import path from "node:path" import { fileTypeFromBuffer } from "file-type" import readChunk from "@shared-utils/readChunk" import Sharp from "sharp" const thresholds = { size: 10 * 1024 * 1024, } const sharpConfigs = { png: { compressionLevel: 6, //quality: 80, }, jpeg: { quality: 80, mozjpeg: true, }, default: { quality: 80, }, } export default async ({ filePath, workPath, onProgress }) => { const stat = await fs.promises.stat(filePath) const firstBuffer = await readChunk(filePath, { length: 4100, }) const fileType = await fileTypeFromBuffer(firstBuffer) // first check if size over threshold if (stat.size < thresholds.size) { return { outputFile: filePath, } } // get the type of the file mime const type = fileType.mime.split("/")[0] switch (type) { case "image": { let image = Sharp(filePath) const metadata = await image.metadata() const config = sharpConfigs[metadata.format] ?? sharpConfigs.default image = await image[metadata.format](config).withMetadata() filePath = path.resolve(workPath, `${path.basename(filePath)}_ff`) await image.toFile(filePath) } } return { outputFile: filePath, } }