# Compress _Path: en/lua/data/compress_ ## Table of Contents - Compression ## Content # Compression Compress and decompress data using gzip, deflate, zlib, brotli, and zstd algorithms. ## Loading ```lua local compress = require("compress") ``` ## GZIP Most widely supported format (RFC 1952). ### Compress {id="gzip-compress"} ```lua -- Compress for HTTP response local body = json.encode(large_response) local compressed, err = compress.gzip.encode(body) if err then return nil, err end -- Set Content-Encoding header res:set_header("Content-Encoding", "gzip") res:write(compressed) -- Maximum compression for storage local archived = compress.gzip.encode(data, {level = 9}) -- Fast compression for real-time local fast = compress.gzip.encode(data, {level = 1}) ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | Data to compress | | `options` | table? | Optional encoding options | #### Options {id="gzip-compress-options"} | Field | Type | Description | |-------|------|-------------| | `level` | integer | Compression level 1-9 (default: 6) | **Returns:** `string, error` ### Decompress {id="gzip-decompress"} ```lua -- Decompress HTTP request 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 -- Decompress with size limit (prevent 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 ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | GZIP compressed data | | `options` | table? | Optional decoding options | #### Options {id="gzip-decompress-options"} | Field | Type | Description | |-------|------|-------------| | `max_size` | integer | Max decompressed size in bytes (default: 128MB, max: 1GB) | **Returns:** `string, error` ## Brotli Best compression ratio for text (RFC 7932). ### Compress {id="brotli-compress"} ```lua -- Best for static assets and text content local compressed = compress.brotli.encode(html_content, {level = 11}) -- Cache compressed assets cache:set("static:" .. hash, compressed) -- Moderate compression for API responses local compressed = compress.brotli.encode(json_data, {level = 4}) ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | Data to compress | | `options` | table? | Optional encoding options | #### Options {id="brotli-compress-options"} | Field | Type | Description | |-------|------|-------------| | `level` | integer | Compression level 0-11 (default: 6) | **Returns:** `string, error` ### Decompress {id="brotli-decompress"} ```lua local decompressed, err = compress.brotli.decode(compressed_data) if err then return nil, err end -- With size limit local decompressed = compress.brotli.decode(data, {max_size = 50 * 1024 * 1024}) ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | Brotli compressed data | | `options` | table? | Optional decoding options | #### Options {id="brotli-decompress-options"} | Field | Type | Description | |-------|------|-------------| | `max_size` | integer | Max decompressed size in bytes (default: 128MB, max: 1GB) | **Returns:** `string, error` ## Zstandard Fast compression with good ratios (RFC 8878). ### Compress {id="zstd-compress"} ```lua -- Good balance of speed and ratio local compressed = compress.zstd.encode(binary_data) -- Higher compression for archival local archived = compress.zstd.encode(data, {level = 19}) -- Fast mode for real-time streaming local fast = compress.zstd.encode(data, {level = 1}) ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | Data to compress | | `options` | table? | Optional encoding options | #### Options {id="zstd-compress-options"} | Field | Type | Description | |-------|------|-------------| | `level` | integer | Compression level 1-22 (default: 3) | **Returns:** `string, error` ### Decompress {id="zstd-decompress"} ```lua local decompressed, err = compress.zstd.decode(compressed_data) if err then return nil, err end ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | Zstandard compressed data | | `options` | table? | Optional decoding options | #### Options {id="zstd-decompress-options"} | Field | Type | Description | |-------|------|-------------| | `max_size` | integer | Max decompressed size in bytes (default: 128MB, max: 1GB) | **Returns:** `string, error` ## Deflate Raw DEFLATE compression (RFC 1951). Used internally by other formats. ### Compress {id="deflate-compress"} ```lua local compressed = compress.deflate.encode(data, {level = 6}) ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | Data to compress | | `options` | table? | Optional encoding options | #### Options {id="deflate-compress-options"} | Field | Type | Description | |-------|------|-------------| | `level` | integer | Compression level 1-9 (default: 6) | **Returns:** `string, error` ### Decompress {id="deflate-decompress"} ```lua local decompressed = compress.deflate.decode(compressed) ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | DEFLATE compressed data | | `options` | table? | Optional decoding options | #### Options {id="deflate-decompress-options"} | Field | Type | Description | |-------|------|-------------| | `max_size` | integer | Max decompressed size in bytes (default: 128MB, max: 1GB) | **Returns:** `string, error` ## Zlib DEFLATE with header and checksum (RFC 1950). ### Compress {id="zlib-compress"} ```lua local compressed = compress.zlib.encode(data, {level = 6}) ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | Data to compress | | `options` | table? | Optional encoding options | #### Options {id="zlib-compress-options"} | Field | Type | Description | |-------|------|-------------| | `level` | integer | Compression level 1-9 (default: 6) | **Returns:** `string, error` ### Decompress {id="zlib-decompress"} ```lua local decompressed = compress.zlib.decode(compressed) ``` | Parameter | Type | Description | |-----------|------|-------------| | `data` | string | Zlib compressed data | | `options` | table? | Optional decoding options | #### Options {id="zlib-decompress-options"} | Field | Type | Description | |-------|------|-------------| | `max_size` | integer | Max decompressed size in bytes (default: 128MB, max: 1GB) | **Returns:** `string, error` ## Choosing an Algorithm | Algorithm | Best For | Speed | Ratio | Level Range | |-----------|----------|-------|-------|-------------| | gzip | HTTP, wide compatibility | Medium | Good | 1-9 | | brotli | Static assets, text | Slow | Best | 0-11 | | zstd | Large files, streaming | Fast | Good | 1-22 | | deflate/zlib | Low-level, specific protocols | Medium | Good | 1-9 | ```lua -- HTTP response based on 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 ``` ## Errors | Condition | Kind | Retryable | |-----------|------|-----------| | Empty input | `errors.INVALID` | no | | Level out of range | `errors.INVALID` | no | | Invalid compressed data | `errors.INVALID` | no | | Decompressed size exceeds limit | `errors.INTERNAL` | no | See [Error Handling](lua/core/errors.md) for working with errors. ## Navigation Previous: Base64 (lua/data/base64) Next: Payload (lua/data/payload)