Current section

Files

Jump to
btrz_ex_webhooks_emitter lib compression.ex
Raw

lib/compression.ex

defmodule BtrzWebhooksEmitter.Compression do
@moduledoc """
Compresses the webhook message `data` field for SQS.
Supports gzip (via :zlib) and zstd (via :ezstd).
"""
@valid_algos MapSet.new(["zstd", "gzip"])
@doc """
Returns the compression algorithm from WEBHOOK_COMPRESS env, or nil.
Valid values: "zstd", "gzip" (case-insensitive). Any other value or missing -> nil.
"""
@spec get_compress_algo() :: nil | binary
def get_compress_algo do
case System.get_env("WEBHOOK_COMPRESS") do
nil ->
nil
v when is_binary(v) ->
normalized = String.downcase(String.trim(v))
if MapSet.member?(@valid_algos, normalized), do: normalized, else: nil
end
end
@doc """
Compresses `data_map` (map) with the given algorithm ("zstd" or "gzip").
Returns base64-encoded string.
"""
@spec compress(map, binary) :: binary
def compress(data_map, algo) when algo in ["zstd", "gzip"] do
json = Poison.encode!(data_map)
raw = compress_raw(json, algo)
Base.encode64(raw)
end
defp compress_raw(payload, "gzip"), do: :zlib.gzip(payload)
defp compress_raw(payload, "zstd"), do: :ezstd.compress(payload)
end