1use std::io::{Read, Write};
5
6use serde::{Deserialize, Serialize};
8use uuid::Uuid;
10
11use crate::error::{Error, Result};
13use crate::raft::{Envelope, Request, Response};
15
16const BINCODE: bincode::config::Configuration = bincode::config::standard();
18
19#[derive(Clone, Debug, Serialize, Deserialize)]
23pub enum WireMsg {
25 Raft(Envelope),
27 Client { id: Uuid, request: Request },
29 ClientReply { id: Uuid, response: std::result::Result<Response, Error> },
31}
33
34pub fn encode(msg: &WireMsg) -> Result<Vec<u8>> {
36 let body = bincode::serde::encode_to_vec(msg, BINCODE)
38 .map_err(|e| Error::InvalidData(e.to_string()))?;
40 let mut out = Vec::with_capacity(4 + body.len());
42 out.extend_from_slice(&(body.len() as u32).to_le_bytes());
44 out.extend_from_slice(&body);
46 Ok(out)
48}
50
51pub fn decode(bytes: &[u8]) -> Result<WireMsg> {
53 Ok(bincode::serde::borrow_decode_from_slice(bytes, BINCODE)
55 .map_err(|e| Error::InvalidData(e.to_string()))?
57 .0)
59}
61
62pub fn write_msg(w: &mut impl Write, msg: &WireMsg) -> Result<()> {
64 let frame = encode(msg)?;
66 w.write_all(&frame).map_err(|e| Error::IO(e.to_string()))?;
68 w.flush().map_err(|e| Error::IO(e.to_string()))?;
70 Ok(())
72}
74
75pub fn read_msg(r: &mut impl Read) -> Result<WireMsg> {
77 let mut len_buf = [0u8; 4];
79 r.read_exact(&mut len_buf).map_err(|e| Error::IO(e.to_string()))?;
81 let len = u32::from_le_bytes(len_buf) as usize;
83 if len > 64 * 1024 * 1024 {
85 return Err(Error::InvalidData(format!("frame too large: {len}")));
87 }
89 let mut body = vec![0u8; len];
91 r.read_exact(&mut body).map_err(|e| Error::IO(e.to_string()))?;
93 decode(&body)
95}