Abe Estrada

AWS Lambda Node.js Brotli

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),
    };
  }
};
  • Primero necesitamos configurar la calidad (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.
  • Luego necesitamos definir el tipo de contenido que estamos comprimiendo (BROTLI_PARAM_MODE), en este caso como es texto UTF8 el modo BROTLI_MODE_TEXT beneficia a la velocidad.
  • Y para ayudar un poco con los cálculos, definimos la cantidad de contenido (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.
  • Por último hay que definir el Content-Encoding como br.

Fuente: Zlib | Node.js v16