rml_rtmp/messages/types/
set_chunk_size.rs1use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
2use bytes::Bytes;
3use std::io::Cursor;
4
5use messages::RtmpMessage;
6use messages::{MessageDeserializationError, MessageSerializationError};
7
8const MAX_SIZE: u32 = 0x80000000 - 1;
9
10pub fn serialize(size: u32) -> Result<Bytes, MessageSerializationError> {
11    if size > MAX_SIZE {
12        return Err(MessageSerializationError::InvalidChunkSize);
13    }
14
15    let mut cursor = Cursor::new(Vec::new());
16    cursor.write_u32::<BigEndian>(size)?;
17
18    let bytes = Bytes::from(cursor.into_inner());
19    Ok(bytes)
20}
21
22pub fn deserialize(data: Bytes) -> Result<RtmpMessage, MessageDeserializationError> {
23    let mut cursor = Cursor::new(data);
24    let size = cursor.read_u32::<BigEndian>()?;
25
26    if size > MAX_SIZE {
27        return Err(MessageDeserializationError::InvalidMessageFormat);
28    }
29
30    Ok(RtmpMessage::SetChunkSize { size })
31}
32
33#[cfg(test)]
34mod tests {
35    use super::{deserialize, serialize};
36    use byteorder::{BigEndian, WriteBytesExt};
37    use bytes::Bytes;
38    use std::io::Cursor;
39
40    use messages::RtmpMessage;
41
42    #[test]
43    fn can_serialize_message() {
44        let size = 523;
45
46        let mut cursor = Cursor::new(Vec::new());
47        cursor.write_u32::<BigEndian>(size).unwrap();
48        let expected = cursor.into_inner();
49
50        let raw_message = serialize(size).unwrap();
51
52        assert_eq!(&raw_message[..], &expected[..]);
53    }
54
55    #[test]
56    fn can_deserialize_message() {
57        let size = 532;
58        let mut cursor = Cursor::new(Vec::new());
59        cursor.write_u32::<BigEndian>(size).unwrap();
60
61        let bytes = Bytes::from(cursor.into_inner());
62        let result = deserialize(bytes).unwrap();
63        let expected = RtmpMessage::SetChunkSize { size };
64        assert_eq!(result, expected);
65    }
66}