mocra_core/queue/
compression.rs1use 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 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 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}