mod reader;
use bytes::Bytes;
pub use reader::*;
mod writer;
use std::io;
use qbase::{
error::Error,
frame::{DatagramFrame, io::ReceiveFrame},
net::tx::{ArcSendWakers, Signals},
packet::Package,
};
pub use writer::*;
#[derive(Debug, Clone)]
pub struct DatagramFlow {
incoming: DatagramIncoming,
outgoing: DatagramOutgoing,
}
impl DatagramFlow {
#[inline]
pub fn new(local_max_datagram_frame_size: u64, tx_wakers: ArcSendWakers) -> Self {
Self {
incoming: DatagramIncoming::new(local_max_datagram_frame_size as _),
outgoing: DatagramOutgoing::new(tx_wakers),
}
}
pub fn try_load_data_into<P>(&self, packet: &mut P) -> Result<(), Signals>
where
P: bytes::BufMut + ?Sized,
(DatagramFrame, Bytes): Package<P>,
{
self.outgoing.try_load_data_into(packet)
}
#[inline]
pub fn reader(&self) -> io::Result<DatagramReader> {
self.incoming.new_reader()
}
#[inline]
pub fn writer(&self, max_datagram_frame_size: u64) -> io::Result<DatagramWriter> {
self.outgoing.new_writer(max_datagram_frame_size)
}
#[inline]
pub fn on_conn_error(&self, error: &Error) {
self.incoming.on_conn_error(error);
self.outgoing.on_conn_error(error);
}
}
impl ReceiveFrame<(DatagramFrame, Bytes)> for DatagramFlow {
type Output = ();
#[inline]
fn recv_frame(&self, (frame, body): &(DatagramFrame, Bytes)) -> Result<Self::Output, Error> {
self.incoming.recv_datagram(frame, body.clone())
}
}