use {super::MAX_IDL_BUFFER_BYTES, flate2::read::ZlibDecoder, std::io::Read};
const ZLIB_HEADER: u8 = 0x78;
pub(super) fn decompress_all_streams(compressed_data: &[u8]) -> Vec<Vec<u8>> {
let mut streams = Vec::new();
let mut cursor = compressed_data;
while cursor.first() == Some(&ZLIB_HEADER) {
let mut decoder = ZlibDecoder::new(cursor);
let mut out = Vec::new();
let read_result = decoder
.by_ref()
.take(MAX_IDL_BUFFER_BYTES as u64 + 1)
.read_to_end(&mut out);
match read_result {
Ok(_) => {
if out.len() > MAX_IDL_BUFFER_BYTES {
break;
}
let consumed = decoder.total_in() as usize;
if is_complete_idl_json(&out) {
streams.push(out);
}
if consumed == 0 || consumed > cursor.len() {
break;
}
cursor = &cursor[consumed..];
}
Err(_) => break,
}
}
streams
}
fn is_complete_idl_json(data: &[u8]) -> bool {
serde_json::from_slice::<serde_json::Value>(data).is_ok()
}