Module: NatsWork::Compression

Defined in:
lib/natswork/compression.rb

Constant Summary collapse

COMPRESSION_THRESHOLD =

10KB

10_240

Class Method Summary collapse

Class Method Details

.compress(data) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/natswork/compression.rb', line 11

def compress(data)
  json = data.is_a?(String) ? data : data.to_json

  # Only compress if data is large enough
  return { compressed: false, data: data } if json.bytesize < COMPRESSION_THRESHOLD

  compressed = Zlib::Deflate.deflate(json, Zlib::BEST_COMPRESSION)
  encoded = Base64.strict_encode64(compressed)

  # Only use compression if it actually reduces size
  if encoded.bytesize < json.bytesize * 0.9
    {
      compressed: true,
      data: encoded,
      original_size: json.bytesize,
      compressed_size: encoded.bytesize
    }
  else
    { compressed: false, data: data }
  end
rescue StandardError => e
  # If compression fails, return original data
  { compressed: false, data: data, error: e.message }
end

.compression_ratio(original_size, compressed_size) ⇒ Object



51
52
53
54
55
# File 'lib/natswork/compression.rb', line 51

def compression_ratio(original_size, compressed_size)
  return 0 if original_size.zero?

  ((1 - (compressed_size.to_f / original_size)) * 100).round(2)
end

.decompress(payload) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/natswork/compression.rb', line 36

def decompress(payload)
  return payload unless payload.is_a?(Hash) && payload[:compressed]

  decoded = Base64.strict_decode64(payload[:data])
  json = Zlib::Inflate.inflate(decoded)
  JSON.parse(json, symbolize_names: true)
rescue StandardError => e
  raise InvalidMessageError, "Failed to decompress data: #{e.message}"
end

.should_compress?(data) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
# File 'lib/natswork/compression.rb', line 46

def should_compress?(data)
  json = data.is_a?(String) ? data : data.to_json
  json.bytesize >= COMPRESSION_THRESHOLD
end