use serde::{de::DeserializeOwned, Serialize};
use std::io::{self, Read, Write};
pub const MAX_FRAME_SIZE: usize = 1024 * 1024;
pub fn write_frame<W: Write, T: Serialize>(writer: &mut W, value: &T) -> io::Result<()> {
let payload = serde_json::to_vec(value)
.map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err.to_string()))?;
if payload.len() > MAX_FRAME_SIZE {
return Err(io::Error::new(
io::ErrorKind::InvalidData,
"frame too large",
));
}
let len = payload.len() as u32;
writer.write_all(&len.to_le_bytes())?;
writer.write_all(&payload)?;
writer.flush()?;
Ok(())
}
pub fn read_frame<R: Read, T: DeserializeOwned>(reader: &mut R) -> io::Result<T> {
let mut len_buf = [0u8; 4];
reader.read_exact(&mut len_buf)?;
let len = u32::from_le_bytes(len_buf) as usize;
if len > MAX_FRAME_SIZE {
return Err(io::Error::new(
io::ErrorKind::InvalidData,
"frame too large",
));
}
let mut payload = vec![0u8; len];
reader.read_exact(&mut payload)?;
serde_json::from_slice(&payload)
.map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err.to_string()))
}