Module: NatsWork::Compression
- Defined in:
- lib/natswork/compression.rb
Constant Summary collapse
- COMPRESSION_THRESHOLD =
10KB
10_240
Class Method Summary collapse
- .compress(data) ⇒ Object
- .compression_ratio(original_size, compressed_size) ⇒ Object
- .decompress(payload) ⇒ Object
- .should_compress?(data) ⇒ Boolean
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. } 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.}" end |
.should_compress?(data) ⇒ 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 |