Files
calendar/packages/lib/server/imageUtils.ts
T

32 lines
1.1 KiB
TypeScript

import sharp from "sharp";
// Maximum allowed size for SVG data (5MB)
const MAX_SVG_SIZE = 5 * 1024 * 1024;
/**
* Converts an SVG image to PNG format
* @param data Base64 encoded image data
* @returns Base64 encoded PNG data or a placeholder image if conversion fails
*/
export const convertSvgToPng = async (data: string) => {
if (data.startsWith("data:image/svg+xml;base64,")) {
try {
const base64Data = data.replace(/^data:image\/svg\+xml;base64,/, "");
const buffer = Buffer.from(base64Data, "base64");
// Check if the SVG data exceeds the size limit
if (buffer.length > MAX_SVG_SIZE) {
throw new Error("SVG data exceeds maximum allowed size");
}
const pngBuffer = await sharp(buffer).png().toBuffer();
return `data:image/png;base64,${pngBuffer.toString("base64")}`;
} catch (error) {
console.error("Error converting SVG to PNG", error);
// Return a 1x1 transparent PNG as placeholder
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
}
}
return data;
};