use crate::peer_connection::RTCPeerConnection;
use crate::peer_connection::message::RTCMessage;
use bytes::BytesMut;
use interceptor::{Interceptor, NoopInterceptor};
use sansio::Protocol;
use shared::error::{Error, Result};
pub(crate) mod init;
pub(crate) mod internal;
pub(crate) mod message;
pub(crate) mod parameters;
pub(crate) mod state;
pub type RTCDataChannelId = u16;
pub use init::RTCDataChannelInit;
pub use message::RTCDataChannelMessage;
pub use state::RTCDataChannelState;
pub struct RTCDataChannel<'a, I = NoopInterceptor>
where
I: Interceptor,
{
pub(crate) id: RTCDataChannelId,
pub(crate) peer_connection: &'a mut RTCPeerConnection<I>,
}
impl<I> RTCDataChannel<'_, I>
where
I: Interceptor,
{
pub fn label(&self) -> &str {
self.peer_connection
.data_channels
.get(&self.id)
.unwrap()
.label
.as_str()
}
pub fn ordered(&self) -> bool {
self.peer_connection
.data_channels
.get(&self.id)
.unwrap()
.ordered
}
pub fn max_packet_life_time(&self) -> Option<u16> {
self.peer_connection
.data_channels
.get(&self.id)
.unwrap()
.max_packet_life_time
}
pub fn max_retransmits(&self) -> Option<u16> {
self.peer_connection
.data_channels
.get(&self.id)
.unwrap()
.max_retransmits
}
pub fn protocol(&self) -> &str {
self.peer_connection
.data_channels
.get(&self.id)
.unwrap()
.protocol
.as_str()
}
pub fn negotiated(&self) -> bool {
self.peer_connection
.data_channels
.get(&self.id)
.unwrap()
.negotiated
}
pub fn id(&self) -> RTCDataChannelId {
self.id
}
pub fn ready_state(&self) -> RTCDataChannelState {
self.peer_connection
.data_channels
.get(&self.id)
.unwrap()
.ready_state
}
pub fn buffered_amount_high_threshold(&self) -> u32 {
self.peer_connection
.data_channels
.get(&self.id)
.unwrap()
.buffered_amount_high_threshold
}
pub fn set_buffered_amount_high_threshold(&mut self, threshold: u32) {
let dc = self
.peer_connection
.data_channels
.get_mut(&self.id)
.unwrap();
dc.buffered_amount_high_threshold = threshold;
if let Some(data_channel) = dc.data_channel.as_mut() {
let _ = data_channel.set_buffered_amount_high_threshold(threshold);
}
}
pub fn buffered_amount_low_threshold(&self) -> u32 {
self.peer_connection
.data_channels
.get(&self.id)
.unwrap()
.buffered_amount_low_threshold
}
pub fn set_buffered_amount_low_threshold(&mut self, threshold: u32) {
let dc = self
.peer_connection
.data_channels
.get_mut(&self.id)
.unwrap();
dc.buffered_amount_low_threshold = threshold;
if let Some(data_channel) = dc.data_channel.as_mut() {
let _ = data_channel.set_buffered_amount_low_threshold(threshold);
}
}
pub fn send(&mut self, data: BytesMut) -> Result<()> {
if self.peer_connection.data_channels.contains_key(&self.id) {
self.peer_connection
.handle_write(RTCMessage::DataChannelMessage(
self.id,
RTCDataChannelMessage {
is_string: false,
data,
},
))
} else {
Err(Error::ErrDataChannelClosed)
}
}
pub fn send_text(&mut self, s: impl Into<String>) -> Result<()> {
if self.peer_connection.data_channels.contains_key(&self.id) {
self.peer_connection
.handle_write(RTCMessage::DataChannelMessage(
self.id,
RTCDataChannelMessage {
is_string: true,
data: BytesMut::from(s.into().as_str()),
},
))
} else {
Err(Error::ErrDataChannelClosed)
}
}
pub fn close(&mut self) -> Result<()> {
if let Some(dc) = self.peer_connection.data_channels.get_mut(&self.id) {
if dc.ready_state == RTCDataChannelState::Closed {
return Ok(());
}
dc.ready_state = RTCDataChannelState::Closing;
dc.close()
} else {
Err(Error::ErrDataChannelClosed)
}
}
}