Hace tiempo puse un post sobre como comprimir contenido, más específicamente json
con el método deflate
para enviarlo de regreso con AWS Lambda.
Ahora comparto la misma idea pero utilizando Brotli como método de compresión. Las ventajas es que es más rápido, y con mejor compresión, ofreciendo menor tamaño final, el secreto para utilizarlo en Lambda con Node.js, es configurarlo correctamente y no utilizar los parámetros preconfigurados.
const {
brotliCompressSync,
constants: { BROTLI_PARAM_QUALITY, BROTLI_PARAM_SIZE_HINT, BROTLI_PARAM_MODE, BROTLI_MODE_TEXT },
} = require("zlib");
exports.handler = async (event) => {
const json = { hello: "world" };
const string = JSON.stringify(json);
try {
const compressed = brotliCompressSync(string, {
params: {
[BROTLI_PARAM_QUALITY]: 5,
[BROTLI_PARAM_MODE]: BROTLI_MODE_TEXT,
[BROTLI_PARAM_SIZE_HINT]: string.length,
},
});
return {
statusCode: 200,
headers: {
"Content-Encoding": "br",
"Content-Type": "application/json",
"Content-Length": compressed.length,
},
body: compressed.toString("base64"),
isBase64Encoded: true,
};
} catch (err) {
return {
statusCode: 500,
body: JSON.stringify(err),
};
}
};
BROTLI_PARAM_QUALITY
), contamos con 11 niveles, siendo 0 el nivel más rápido con menor compresión y 11 el nivel mas lento pero con mejores resultados de compresión. En mi caso creo que entre 4 y 5 se tiene un balance entre tiempo resultado.BROTLI_PARAM_MODE
), en este caso como es texto UTF8 el modo BROTLI_MODE_TEXT
beneficia a la velocidad.BROTLI_PARAM_SIZE_HINT
) que vamos a comprimir, es por eso que convertimos json
a string
en una variable/constante para poder obtener este dato.Content-Encoding
como br
.Fuente: Zlib | Node.js v16