Skip to main content

rtc_datachannel/message/
mod.rs

1#[cfg(test)]
2mod message_test;
3
4/// The `DATA_CHANNEL_ACK` message, which confirms a channel was opened.
5pub mod message_channel_ack;
6/// An internal close notification (not a DCEP message).
7pub mod message_channel_close;
8/// The `DATA_CHANNEL_OPEN` message and the channel parameters it carries.
9pub mod message_channel_open;
10/// Internal buffered-amount threshold notifications.
11pub mod message_channel_threshold;
12/// The one-byte message type that prefixes every DCEP message.
13pub mod message_type;
14
15use bytes::{Buf, BufMut};
16use message_channel_ack::*;
17use message_channel_close::*;
18use message_channel_open::*;
19use message_channel_threshold::*;
20use message_type::*;
21use shared::error::{Error, Result};
22use shared::marshal::*;
23
24/// A parsed DataChannel message
25#[derive(Eq, PartialEq, Clone, Debug)]
26pub enum Message {
27    /// A buffered-amount threshold crossing. Internal to this crate — not a DCEP message.
28    DataChannelThreshold(DataChannelThreshold), // internal usage only
29    /// A channel close notification. Internal to this crate — not a DCEP message.
30    DataChannelClose(DataChannelClose), // internal usage only
31    /// `DATA_CHANNEL_ACK`, sent by the peer to confirm it accepted a `DATA_CHANNEL_OPEN`.
32    DataChannelAck(DataChannelAck),
33    /// `DATA_CHANNEL_OPEN`, which opens a channel and carries its label, protocol and
34    /// reliability parameters.
35    DataChannelOpen(DataChannelOpen),
36}
37
38impl MarshalSize for Message {
39    fn marshal_size(&self) -> usize {
40        match self {
41            Message::DataChannelThreshold(m) => m.marshal_size() + MESSAGE_TYPE_LEN, // internal usage only
42            Message::DataChannelClose(m) => m.marshal_size() + MESSAGE_TYPE_LEN, // internal usage only
43            Message::DataChannelAck(m) => m.marshal_size() + MESSAGE_TYPE_LEN,
44            Message::DataChannelOpen(m) => m.marshal_size() + MESSAGE_TYPE_LEN,
45        }
46    }
47}
48
49impl Marshal for Message {
50    fn marshal_to(&self, mut buf: &mut [u8]) -> Result<usize> {
51        let mut bytes_written = 0;
52        let n = self.message_type().marshal_to(buf)?;
53        buf = &mut buf[n..];
54        bytes_written += n;
55        bytes_written += match self {
56            Message::DataChannelThreshold(threshold) => threshold.marshal_to(buf)?, // internal usage only
57            Message::DataChannelClose(_) => 0, // internal usage only
58            Message::DataChannelAck(_) => 0,
59            Message::DataChannelOpen(open) => open.marshal_to(buf)?,
60        };
61        Ok(bytes_written)
62    }
63}
64
65impl Unmarshal for Message {
66    fn unmarshal<B>(buf: &mut B) -> Result<Self>
67    where
68        Self: Sized,
69        B: Buf,
70    {
71        if buf.remaining() < MESSAGE_TYPE_LEN {
72            return Err(Error::UnexpectedEndOfBuffer {
73                expected: MESSAGE_TYPE_LEN,
74                actual: buf.remaining(),
75            });
76        }
77
78        match MessageType::unmarshal(buf)? {
79            MessageType::DataChannelThreshold => Ok(Self::DataChannelThreshold(
80                DataChannelThreshold::unmarshal(buf)?,
81            )), // internal usage only
82            MessageType::DataChannelClose => Ok(Self::DataChannelClose(DataChannelClose {})), // internal usage only
83            MessageType::DataChannelAck => Ok(Self::DataChannelAck(DataChannelAck {})),
84            MessageType::DataChannelOpen => {
85                Ok(Self::DataChannelOpen(DataChannelOpen::unmarshal(buf)?))
86            }
87        }
88    }
89}
90
91impl Message {
92    /// The type byte that identifies this message on the wire.
93    pub fn message_type(&self) -> MessageType {
94        match self {
95            Self::DataChannelThreshold(_) => MessageType::DataChannelThreshold, // internal usage only
96            Self::DataChannelClose(_) => MessageType::DataChannelClose, // internal usage only
97            Self::DataChannelAck(_) => MessageType::DataChannelAck,
98            Self::DataChannelOpen(_) => MessageType::DataChannelOpen,
99        }
100    }
101}