Files
SkyArtShop/backend/middleware/compression.js

52 lines
1.4 KiB
JavaScript
Raw Normal View History

2026-01-01 22:24:30 -06:00
/**
* Response Compression Middleware
2026-01-04 17:52:37 -06:00
* High-performance compression with Brotli support
2026-01-01 22:24:30 -06:00
*/
const compression = require("compression");
2026-01-04 17:52:37 -06:00
const zlib = require("zlib");
2026-01-01 22:24:30 -06:00
const compressionMiddleware = compression({
2026-01-04 17:52:37 -06:00
// Only compress responses larger than 512 bytes (lower threshold)
threshold: 512,
// Level 6 for gzip (balance between speed and ratio)
2026-01-01 22:24:30 -06:00
level: 6,
2026-01-04 17:52:37 -06:00
// Memory level
memLevel: 8,
// Use Brotli when available (better compression than gzip)
brotli: {
enabled: true,
zlib: {
[zlib.constants.BROTLI_PARAM_QUALITY]: 4, // 0-11, 4 is fast with good compression
[zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,
},
},
2026-01-01 22:24:30 -06:00
// Filter function - don't compress already compressed formats
filter: (req, res) => {
if (req.headers["x-no-compression"]) {
return false;
}
2026-01-04 17:52:37 -06:00
2026-01-01 22:24:30 -06:00
const contentType = res.getHeader("Content-Type");
if (!contentType) return compression.filter(req, res);
// Don't compress images, videos, or already compressed formats
2026-01-04 17:52:37 -06:00
const skipTypes = [
"image/",
"video/",
"application/zip",
"application/pdf",
"application/octet-stream",
"application/wasm",
"font/",
];
if (skipTypes.some((type) => contentType.includes(type))) {
2026-01-01 22:24:30 -06:00
return false;
}
return compression.filter(req, res);
},
});
module.exports = compressionMiddleware;