@nicholmikey/chrome-tools
Version:
MCP server for Chrome DevTools Protocol integration - control Chrome tabs, execute JavaScript, capture screenshots, and monitor network traffic
89 lines (88 loc) • 3.48 kB
JavaScript
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const sharp = require('sharp');
export async function processImage(base64Data) {
try {
// Convert base64 to buffer
const buffer = Buffer.from(base64Data, 'base64');
// Create Sharp instance and resize maintaining aspect ratio
const image = sharp(buffer).resize(900, 600, {
fit: 'inside',
withoutEnlargement: true
});
// Try WebP first with good quality
try {
const webpBuffer = await image
.webp({
quality: 80,
effort: 6, // Higher compression effort
lossless: false
})
.toBuffer();
if (webpBuffer.length <= 1024 * 1024) {
return {
data: `data:image/webp;base64,${webpBuffer.toString('base64')}`,
format: 'png', // Keep format as 'png' in interface for backward compatibility
size: webpBuffer.length
};
}
// If still too large, try WebP with more aggressive compression
const compressedWebpBuffer = await image
.webp({
quality: 60,
effort: 6,
lossless: false,
nearLossless: true
})
.toBuffer();
if (compressedWebpBuffer.length <= 1024 * 1024) {
return {
data: `data:image/webp;base64,${compressedWebpBuffer.toString('base64')}`,
format: 'png', // Keep format as 'png' in interface for backward compatibility
size: compressedWebpBuffer.length
};
}
}
catch (webpError) {
console.error('WebP processing failed, falling back to PNG:', webpError);
}
// Fallback to PNG with compression if WebP fails or is too large
const pngBuffer = await image
.png({
compressionLevel: 9,
palette: true
})
.toBuffer();
if (pngBuffer.length > 1024 * 1024) {
// If still too large, reduce dimensions further
const scaleFactor = Math.sqrt(1024 * 1024 / pngBuffer.length);
const resizedImage = sharp(buffer).resize(Math.floor(900 * scaleFactor), Math.floor(600 * scaleFactor), {
fit: 'inside',
withoutEnlargement: true
});
const compressedPngBuffer = await resizedImage
.png({
compressionLevel: 9,
palette: true,
colors: 128 // Reduce color palette for smaller size
})
.toBuffer();
if (compressedPngBuffer.length > 1024 * 1024) {
throw new Error('Image is too large even after compression');
}
return {
data: `data:image/png;base64,${compressedPngBuffer.toString('base64')}`,
format: 'png',
size: compressedPngBuffer.length
};
}
return {
data: `data:image/png;base64,${pngBuffer.toString('base64')}`,
format: 'png',
size: pngBuffer.length
};
}
catch (error) {
throw new Error(`Failed to process image: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}