mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import { compress } from "@stirling-image/image-engine";
|
|
import type { FastifyInstance } from "fastify";
|
|
import sharp from "sharp";
|
|
import { z } from "zod";
|
|
import { createToolRoute } from "../tool-factory.js";
|
|
|
|
const settingsSchema = z.object({
|
|
mode: z.enum(["quality", "targetSize"]).default("quality"),
|
|
quality: z.number().min(1).max(100).optional(),
|
|
targetSizeKb: z.number().positive().optional(),
|
|
});
|
|
|
|
export function registerCompress(app: FastifyInstance) {
|
|
createToolRoute(app, {
|
|
toolId: "compress",
|
|
settingsSchema,
|
|
process: async (inputBuffer, settings, filename) => {
|
|
const image = sharp(inputBuffer);
|
|
|
|
const compressOptions: {
|
|
quality?: number;
|
|
targetSizeBytes?: number;
|
|
} = {};
|
|
|
|
if (settings.mode === "targetSize" && settings.targetSizeKb) {
|
|
// Convert KB to bytes for the engine
|
|
compressOptions.targetSizeBytes = settings.targetSizeKb * 1024;
|
|
} else {
|
|
compressOptions.quality = settings.quality ?? 80;
|
|
}
|
|
|
|
const result = await compress(image, compressOptions);
|
|
const buffer = await result.toBuffer();
|
|
return { buffer, filename, contentType: "image/jpeg" };
|
|
},
|
|
});
|
|
}
|