Skip to main content

mocra_core/queue/
compression.rs

1use flate2::read::GzDecoder;
2use std::borrow::Cow;
3use std::io::Read;
4
5pub fn compress_payload(data: &[u8], threshold: usize) -> Vec<u8> {
6    if data.len() > threshold {
7        match zstd::stream::encode_all(data, 3) {
8            Ok(compressed) => compressed,
9            Err(_) => data.to_vec(),
10        }
11    } else {
12        data.to_vec()
13    }
14}
15
16pub fn compress_payload_owned(data: Vec<u8>, threshold: usize) -> Vec<u8> {
17    if data.len() > threshold {
18        match zstd::stream::encode_all(data.as_slice(), 3) {
19            Ok(compressed) => compressed,
20            Err(_) => data,
21        }
22    } else {
23        data
24    }
25}
26
27pub fn decompress_payload<'a>(payload: &'a [u8]) -> Cow<'a, [u8]> {
28    // Try Zstd first (magic: 0x28 0xB5 0x2F 0xFD)
29    if payload.len() > 4
30        && payload[0] == 0x28
31        && payload[1] == 0xB5
32        && payload[2] == 0x2F
33        && payload[3] == 0xFD
34    {
35        match zstd::stream::decode_all(payload) {
36            Ok(decoded) => Cow::Owned(decoded),
37            Err(_) => Cow::Borrowed(payload),
38        }
39    } else if payload.len() > 2 && payload[0] == 0x1f && payload[1] == 0x8b {
40        // Fallback to Gzip
41        let mut decoder = GzDecoder::new(payload);
42        let mut s = Vec::new();
43        if decoder.read_to_end(&mut s).is_ok() {
44            Cow::Owned(s)
45        } else {
46            Cow::Borrowed(payload)
47        }
48    } else {
49        Cow::Borrowed(payload)
50    }
51}