use std::io; use serde::{Serialize, de::DeserializeOwned}; use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt}; const MAX_FRAME_SIZE: usize = 1024 * 1024; pub async fn write_frame(writer: &mut W, value: &T) -> io::Result<()> where W: AsyncWrite + Unpin, T: Serialize, { let payload = serde_json::to_vec(value) .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e.to_string()))?; if payload.len() > MAX_FRAME_SIZE { return Err(io::Error::new( io::ErrorKind::InvalidInput, "frame exceeds max size", )); } writer.write_u32(payload.len() as u32).await?; writer.write_all(&payload).await?; writer.flush().await } pub async fn read_frame(reader: &mut R) -> io::Result where R: AsyncRead + Unpin, T: DeserializeOwned, { let len = reader.read_u32().await? 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).await?; serde_json::from_slice(&payload) .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e.to_string())) }