Pular para o conteúdo

Compressao

Comprima e descomprima dados usando algoritmos gzip, deflate, zlib, brotli e zstd.

local compress = require("compress")

Formato mais amplamente suportado (RFC 1952).

-- Comprimir para resposta HTTP
local body = json.encode(large_response)
local compressed, err = compress.gzip.encode(body)
if err then
return nil, err
end
-- Definir header Content-Encoding
res:set_header("Content-Encoding", "gzip")
res:write(compressed)
-- Compressao maxima para armazenamento
local archived = compress.gzip.encode(data, {level = 9})
-- Compressao rapida para tempo real
local fast = compress.gzip.encode(data, {level = 1})
ParâmetroTipoDescrição
datastringDados para comprimir
optionstable?Opções de codificação opcionais
CampoTipoDescrição
levelintegerNivel de compressao 1-9 (padrão: 6)

Retorna: string, error

-- Descomprimir requisição 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 com limite de tamanho (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âmetroTipoDescrição
datastringDados comprimidos GZIP
optionstable?Opções de decodificação opcionais
CampoTipoDescrição
max_sizeintegerTamanho maximo descomprimido em bytes (padrão: 128MB, max: 1GB)

Retorna: string, error

Melhor taxa de compressao para texto (RFC 7932).

-- Melhor para assets estaticos e conteudo de texto
local compressed = compress.brotli.encode(html_content, {level = 11})
-- Cachear assets comprimidos
cache:set("static:" .. hash, compressed)
-- Compressao moderada para respostas de API
local compressed = compress.brotli.encode(json_data, {level = 4})
ParâmetroTipoDescrição
datastringDados para comprimir
optionstable?Opções de codificação opcionais
CampoTipoDescrição
levelintegerNivel de compressao 0-11 (padrão: 6)

Retorna: string, error

local decompressed, err = compress.brotli.decode(compressed_data)
if err then
return nil, err
end
-- Com limite de tamanho
local decompressed = compress.brotli.decode(data, {max_size = 50 * 1024 * 1024})
ParâmetroTipoDescrição
datastringDados comprimidos Brotli
optionstable?Opções de decodificação opcionais
CampoTipoDescrição
max_sizeintegerTamanho maximo descomprimido em bytes (padrão: 128MB, max: 1GB)

Retorna: string, error

Compressao rapida com boas taxas (RFC 8878).

-- Bom equilibrio de velocidade e taxa
local compressed = compress.zstd.encode(binary_data)
-- Compressao maior para arquivamento
local archived = compress.zstd.encode(data, {level = 19})
-- Modo rapido para streaming em tempo real
local fast = compress.zstd.encode(data, {level = 1})
ParâmetroTipoDescrição
datastringDados para comprimir
optionstable?Opções de codificação opcionais
CampoTipoDescrição
levelintegerNivel de compressao 1-22 (padrão: 3)
dictstring?Bytes do dicionário Zstd de train_dict (padrão: nenhum)

Retorna: string, error

local decompressed, err = compress.zstd.decode(compressed_data)
if err then
return nil, err
end
ParâmetroTipoDescrição
datastringDados comprimidos Zstandard
optionstable?Opções de decodificação opcionais
CampoTipoDescrição
max_sizeintegerTamanho maximo descomprimido em bytes (padrão: 128MB, max: 1GB)
dictstring?Bytes do dicionário Zstd (deve corresponder ao dict usado para codificar)

Retorna: string, error

Treine um dicionário a partir de dados de amostra para melhorar a compressão de muitos payloads pequenos e similares. Passe o dicionário treinado como a opção dict para encode/decode — o mesmo dicionário deve ser usado 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âmetroTipoDescrição
samplesstring[]Amostras de treinamento (pelo menos uma >= 8 bytes)
optionstable?size (integer, bytes alvo do dict, 256-1048576, padrão 114688), id (integer, padrão 0), level (integer, 1-22)

Retorna: string, error (os bytes do dicionário)

ParâmetroTipoDescrição
dictstringBytes do dicionário

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

Compressao DEFLATE raw (RFC 1951). Usado internamente por outros formatos.

local compressed = compress.deflate.encode(data, {level = 6})
ParâmetroTipoDescrição
datastringDados para comprimir
optionstable?Opções de codificação opcionais
CampoTipoDescrição
levelintegerNivel de compressao 1-9 (padrão: 6)

Retorna: string, error

local decompressed = compress.deflate.decode(compressed)
ParâmetroTipoDescrição
datastringDados comprimidos DEFLATE
optionstable?Opções de decodificação opcionais
CampoTipoDescrição
max_sizeintegerTamanho maximo descomprimido em bytes (padrão: 128MB, max: 1GB)

Retorna: string, error

DEFLATE com header e checksum (RFC 1950).

local compressed = compress.zlib.encode(data, {level = 6})
ParâmetroTipoDescrição
datastringDados para comprimir
optionstable?Opções de codificação opcionais
CampoTipoDescrição
levelintegerNivel de compressao 1-9 (padrão: 6)

Retorna: string, error

local decompressed = compress.zlib.decode(compressed)
ParâmetroTipoDescrição
datastringDados comprimidos Zlib
optionstable?Opções de decodificação opcionais
CampoTipoDescrição
max_sizeintegerTamanho maximo descomprimido em bytes (padrão: 128MB, max: 1GB)

Retorna: string, error

AlgoritmoMelhor ParaVelocidadeTaxaFaixa de Nivel
gzipHTTP, ampla compatibilidadeMediaBoa1-9
brotliAssets estaticos, textoLentaMelhor0-11
zstdArquivos grandes, streamingRapidaBoa1-22
deflate/zlibBaixo nivel, protocolos especificosMediaBoa1-9
-- Resposta HTTP baseada em 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
CondiçãoTipoRetentável
Entrada vaziaerrors.INVALIDnão
Nivel fora da faixaerrors.INVALIDnão
Dados comprimidos inválidoserrors.INVALIDnão
Tamanho descomprimido excede limiteerrors.INTERNALnão

Veja Error Handling para trabalhar com erros.