use std::cell::RefCell; use zstd::block::{Compressor, Decompressor}; thread_local! { static COMPRESSOR: RefCell = RefCell::new(Compressor::new()); static DECOMPRESSOR: RefCell = RefCell::new(Decompressor::new()); } /// The library supports regular compression levels from 1 up to ZSTD_maxCLevel(), /// which is currently 22. Levels >= 20 /// Default level is ZSTD_CLEVEL_DEFAULT==3. /// value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT pub fn compress(data: &[u8], level: i32) -> Vec { let mut out = Vec::new(); COMPRESSOR.with(|c| { if let Ok(mut c) = c.try_borrow_mut() { match c.compress(data, level) { Ok(res) => out = res, Err(err) => { crate::log::debug!("Failed to compress: {}", err); } } } }); out } pub fn decompress(data: &[u8]) -> Vec { let mut out = Vec::new(); DECOMPRESSOR.with(|d| { if let Ok(mut d) = d.try_borrow_mut() { const MAX: usize = 1024 * 1024 * 64; const MIN: usize = 1024 * 1024; let mut n = 30 * data.len(); if n > MAX { n = MAX; } if n < MIN { n = MIN; } match d.decompress(data, n) { Ok(res) => out = res, Err(err) => { crate::log::debug!("Failed to decompress: {}", err); } } } }); out }