Compresion

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

Carga

local compress = require("compress")

GZIP

Formato mas ampliamente soportado (RFC 1952).

Comprimir {id="gzip-compress"}

-- 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ámetro Tipo Descripción
data string Datos a comprimir
options table? Opciones de codificacion opcionales

Opciones {id="gzip-compress-options"}

Campo Tipo Descripción
level integer Nivel de compresion 1-9 (por defecto: 6)

Devuelve: string, error

Descomprimir {id="gzip-decompress"}

-- 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ámetro Tipo Descripción
data string Datos comprimidos GZIP
options table? Opciones de decodificacion opcionales

Opciones {id="gzip-decompress-options"}

Campo Tipo Descripción
max_size integer Tamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)

Devuelve: string, error

Brotli

Mejor ratio de compresion para texto (RFC 7932).

Comprimir {id="brotli-compress"}

-- 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ámetro Tipo Descripción
data string Datos a comprimir
options table? Opciones de codificacion opcionales

Opciones {id="brotli-compress-options"}

Campo Tipo Descripción
level integer Nivel de compresion 0-11 (por defecto: 6)

Devuelve: string, error

Descomprimir {id="brotli-decompress"}

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ámetro Tipo Descripción
data string Datos comprimidos Brotli
options table? Opciones de decodificacion opcionales

Opciones {id="brotli-decompress-options"}

Campo Tipo Descripción
max_size integer Tamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)

Devuelve: string, error

Zstandard

Compresion rapida con buenos ratios (RFC 8878).

Comprimir {id="zstd-compress"}

-- 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ámetro Tipo Descripción
data string Datos a comprimir
options table? Opciones de codificacion opcionales

Opciones {id="zstd-compress-options"}

Campo Tipo Descripción
level integer Nivel de compresion 1-22 (por defecto: 3)

Devuelve: string, error

Descomprimir {id="zstd-decompress"}

local decompressed, err = compress.zstd.decode(compressed_data)
if err then
    return nil, err
end
Parámetro Tipo Descripción
data string Datos comprimidos Zstandard
options table? Opciones de decodificacion opcionales

Opciones {id="zstd-decompress-options"}

Campo Tipo Descripción
max_size integer Tamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)

Devuelve: string, error

Deflate

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

Comprimir {id="deflate-compress"}

local compressed = compress.deflate.encode(data, {level = 6})
Parámetro Tipo Descripción
data string Datos a comprimir
options table? Opciones de codificacion opcionales

Opciones {id="deflate-compress-options"}

Campo Tipo Descripción
level integer Nivel de compresion 1-9 (por defecto: 6)

Devuelve: string, error

Descomprimir {id="deflate-decompress"}

local decompressed = compress.deflate.decode(compressed)
Parámetro Tipo Descripción
data string Datos comprimidos DEFLATE
options table? Opciones de decodificacion opcionales

Opciones {id="deflate-decompress-options"}

Campo Tipo Descripción
max_size integer Tamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)

Devuelve: string, error

Zlib

DEFLATE con cabecera y checksum (RFC 1950).

Comprimir {id="zlib-compress"}

local compressed = compress.zlib.encode(data, {level = 6})
Parámetro Tipo Descripción
data string Datos a comprimir
options table? Opciones de codificacion opcionales

Opciones {id="zlib-compress-options"}

Campo Tipo Descripción
level integer Nivel de compresion 1-9 (por defecto: 6)

Devuelve: string, error

Descomprimir {id="zlib-decompress"}

local decompressed = compress.zlib.decode(compressed)
Parámetro Tipo Descripción
data string Datos comprimidos Zlib
options table? Opciones de decodificacion opcionales

Opciones {id="zlib-decompress-options"}

Campo Tipo Descripción
max_size integer Tamano descomprimido max en bytes (por defecto: 128MB, max: 1GB)

Devuelve: string, error

Elegir un Algoritmo

Algoritmo Mejor Para Velocidad Ratio Rango de Nivel
gzip HTTP, amplia compatibilidad Media Bueno 1-9
brotli Assets estaticos, texto Lenta Mejor 0-11
zstd Archivos grandes, streaming Rapida Bueno 1-22
deflate/zlib Bajo nivel, protocolos especificos Media Bueno 1-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

Errores

Condición Tipo Reintentable
Entrada vacia errors.INVALID no
Nivel fuera de rango errors.INVALID no
Datos comprimidos invalidos errors.INVALID no
Tamano descomprimido excede limite errors.INTERNAL no

Consulte Manejo de Errores para trabajar con errores.