substrate_data/wire/io/
framing.rs1use std::io::{self, Read, Write};
4
5use crate::Schema;
6
7pub type Len = u32;
9pub const MAX_FRAME: usize = 256 << 20;
11
12pub fn write_frame<T: Schema>(w: &mut impl Write, message: &T) -> io::Result<()> {
18 write_frame_bytes(w, &crate::to_bytes(message))
19}
20
21pub fn write_frame_bytes(w: &mut impl Write, bytes: &[u8]) -> io::Result<()> {
27 let len = frame_len(bytes.len())?;
28 let mut frame = Vec::with_capacity(size_of::<Len>() + bytes.len());
30 frame.extend_from_slice(&len.to_le_bytes());
31 frame.extend_from_slice(bytes);
32 w.write_all(&frame)?;
33 w.flush()
34}
35
36pub fn read_frame_bytes(r: &mut impl Read) -> io::Result<Option<Vec<u8>>> {
44 let Some(len) = read_len(r)? else {
45 return Ok(None);
46 };
47 let len = body_len(len)?;
48 let mut bytes = vec![0; len];
49 r.read_exact(&mut bytes)?;
50 Ok(Some(bytes))
51}
52
53pub fn read_frame<T: Schema>(r: &mut impl Read) -> io::Result<Option<T>> {
59 let Some(bytes) = read_frame_bytes(r)? else {
60 return Ok(None);
61 };
62 decode_frame(&bytes).map(Some)
63}
64
65pub(super) fn body_len(len: Len) -> io::Result<usize> {
68 let len = len as usize;
69 if len > MAX_FRAME {
70 return Err(io::Error::new(io::ErrorKind::InvalidData, "frame too long"));
71 }
72 Ok(len)
73}
74
75pub(super) fn frame_len(len: usize) -> io::Result<Len> {
77 Len::try_from(len)
78 .ok()
79 .filter(|_| len <= MAX_FRAME)
80 .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, "frame too long"))
81}
82
83pub(super) fn decode_frame<T: Schema>(bytes: &[u8]) -> io::Result<T> {
85 crate::read_bytes(bytes)
86 .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, crate::Errors(e)))
87}
88
89pub(super) fn read_len(r: &mut impl Read) -> io::Result<Option<Len>> {
92 let mut len = [0; size_of::<Len>()];
93 loop {
94 match r.read(&mut len[..1]) {
95 Ok(0) => return Ok(None),
96 Ok(_) => break,
97 Err(e) if e.kind() == io::ErrorKind::Interrupted => {}
98 Err(e) => return Err(e),
99 }
100 }
101 r.read_exact(&mut len[1..])?;
102 Ok(Some(Len::from_le_bytes(len)))
103}