Ir al contenido

Compresion

Comprimir y descomprimir datos usando algoritmos gzip, deflate, zlib, brotli y zstd.

local compress = require("compress")

Formato mas ampliamente soportado (RFC 1952).

-- Comprimir para respuesta HTTP
local body = json.encode(large_response)
local compressed, err = compress.gzip.encode(body)
if err then
return nil, err
end
-- Establecer cabecera Content-Encoding
res:set_header("Content-Encoding", "gzip")
res:write(compressed)
-- Compresion maxima para almacenamiento
local archived = compress.gzip.encode(data, {level = 9})
-- Compresion rapida para tiempo real
local fast = compress.gzip.encode(data, {level = 1})
ParámetroTipoDescripción
datastringDatos a comprimir
optionstable?Opciones de codificacion opcionales
CampoTipoDescripción
levelintegerNivel de compresion 1-9 (por defecto: 6)

Devuelve: string, error

-- Descomprimir solicitud HTTP
local content_encoding = req:header("Content-Encoding")
if content_encoding == "gzip" then
local body = req:body()
local decompressed, err = compress.gzip.decode(body)
if err then
return nil, errors.new("INVALID", "Invalid gzip data")
end
body = decompressed
end
-- Descomprimir con limite de tamano (prevenir zip bombs)
local decompressed, err = compress.gzip.decode(data, {max_size = 10 * 1024 * 1024})
if err then
return nil, errors.new("INVALID", "Decompressed size exceeds 10MB limit")
end
ParámetroTipoDescripción
datastringDatos comprimidos GZIP
optionstable?Opciones de decodificacion opcionales
CampoTipoDescripción
max_sizeintegerTamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)

Devuelve: string, error

Mejor ratio de compresion para texto (RFC 7932).

-- Mejor para assets estaticos y contenido de texto
local compressed = compress.brotli.encode(html_content, {level = 11})
-- Cachear assets comprimidos
cache:set("static:" .. hash, compressed)
-- Compresion moderada para respuestas API
local compressed = compress.brotli.encode(json_data, {level = 4})
ParámetroTipoDescripción
datastringDatos a comprimir
optionstable?Opciones de codificacion opcionales
CampoTipoDescripción
levelintegerNivel de compresion 0-11 (por defecto: 6)

Devuelve: string, error

local decompressed, err = compress.brotli.decode(compressed_data)
if err then
return nil, err
end
-- Con limite de tamano
local decompressed = compress.brotli.decode(data, {max_size = 50 * 1024 * 1024})
ParámetroTipoDescripción
datastringDatos comprimidos Brotli
optionstable?Opciones de decodificacion opcionales

Opciones {id=“brotli-decompress-options”}

Sección titulada «Opciones {id=“brotli-decompress-options”}»
CampoTipoDescripción
max_sizeintegerTamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)

Devuelve: string, error

Compresion rapida con buenos ratios (RFC 8878).

-- Buen balance de velocidad y ratio
local compressed = compress.zstd.encode(binary_data)
-- Mayor compresion para archivo
local archived = compress.zstd.encode(data, {level = 19})
-- Modo rapido para streaming en tiempo real
local fast = compress.zstd.encode(data, {level = 1})
ParámetroTipoDescripción
datastringDatos a comprimir
optionstable?Opciones de codificacion opcionales
CampoTipoDescripción
levelintegerNivel de compresion 1-22 (por defecto: 3)
dictstring?Bytes de diccionario Zstd de train_dict (por defecto: ninguno)

Devuelve: string, error

local decompressed, err = compress.zstd.decode(compressed_data)
if err then
return nil, err
end
ParámetroTipoDescripción
datastringDatos comprimidos Zstandard
optionstable?Opciones de decodificacion opcionales
CampoTipoDescripción
max_sizeintegerTamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)
dictstring?Bytes de diccionario Zstd (deben coincidir con el dict usado al codificar)

Devuelve: string, error

Entrena un diccionario a partir de datos de muestra para mejorar la compresion de muchos payloads pequenos y similares. Pasa el diccionario entrenado como la opcion dict a encode/decode — debe usarse el mismo diccionario para ambos.

local dict, err = compress.zstd.train_dict(samples, { size = 112640 })
local packed = compress.zstd.encode(data, { dict = dict })
local original = compress.zstd.decode(packed, { dict = dict })
ParámetroTipoDescripción
samplesstring[]Muestras de entrenamiento (al menos una >= 8 bytes)
optionstable?size (integer, bytes objetivo del dict, 256-1048576, por defecto 114688), id (integer, por defecto 0), level (integer, 1-22)

Devuelve: string, error (los bytes del diccionario)

ParámetroTipoDescripción
dictstringBytes del diccionario

Devuelve: table, error{id: integer, content_size: integer}

Compresion DEFLATE cruda (RFC 1951). Usado internamente por otros formatos.

local compressed = compress.deflate.encode(data, {level = 6})
ParámetroTipoDescripción
datastringDatos a comprimir
optionstable?Opciones de codificacion opcionales

Opciones {id=“deflate-compress-options”}

Sección titulada «Opciones {id=“deflate-compress-options”}»
CampoTipoDescripción
levelintegerNivel de compresion 1-9 (por defecto: 6)

Devuelve: string, error

local decompressed = compress.deflate.decode(compressed)
ParámetroTipoDescripción
datastringDatos comprimidos DEFLATE
optionstable?Opciones de decodificacion opcionales

Opciones {id=“deflate-decompress-options”}

Sección titulada «Opciones {id=“deflate-decompress-options”}»
CampoTipoDescripción
max_sizeintegerTamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)

Devuelve: string, error

DEFLATE con cabecera y checksum (RFC 1950).

local compressed = compress.zlib.encode(data, {level = 6})
ParámetroTipoDescripción
datastringDatos a comprimir
optionstable?Opciones de codificacion opcionales
CampoTipoDescripción
levelintegerNivel de compresion 1-9 (por defecto: 6)

Devuelve: string, error

local decompressed = compress.zlib.decode(compressed)
ParámetroTipoDescripción
datastringDatos comprimidos Zlib
optionstable?Opciones de decodificacion opcionales
CampoTipoDescripción
max_sizeintegerTamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)

Devuelve: string, error

AlgoritmoMejor ParaVelocidadRatioRango de Nivel
gzipHTTP, amplia compatibilidadMediaBueno1-9
brotliAssets estaticos, textoLentaMejor0-11
zstdArchivos grandes, streamingRapidaBueno1-22
deflate/zlibBajo nivel, protocolos especificosMediaBueno1-9
-- Respuesta HTTP basada en Accept-Encoding
local accept = req:header("Accept-Encoding") or ""
local body = json.encode(response_data)
if accept:find("br") then
res:set_header("Content-Encoding", "br")
res:write(compress.brotli.encode(body))
elseif accept:find("gzip") then
res:set_header("Content-Encoding", "gzip")
res:write(compress.gzip.encode(body))
else
res:write(body)
end
CondiciónTipoReintentable
Entrada vaciaerrors.INVALIDno
Nivel fuera de rangoerrors.INVALIDno
Datos comprimidos invalidoserrors.INVALIDno
Tamano descomprimido excede limiteerrors.INTERNALno

Consulte Manejo de Errores para trabajar con errores.