32 lines
1.1 KiB
TypeScript
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;
|
|
};
|