use crate::{
clock::Timer,
msg,
stream::{
recv::application::{Inner, LocalState, Reader},
runtime,
shared::ArcShared,
socket,
},
};
use core::mem::ManuallyDrop;
use s2n_quic_core::endpoint;
pub struct Builder {
endpoint: endpoint::Type,
runtime: runtime::ArcHandle,
}
impl Builder {
#[inline]
pub fn new(endpoint: endpoint::Type, runtime: runtime::ArcHandle) -> Self {
Self { endpoint, runtime }
}
}
impl Builder {
#[inline]
pub fn build(self, shared: ArcShared, sockets: socket::ArcApplication) -> Reader {
let Self { endpoint, runtime } = self;
let remote_addr = shared.read_remote_addr();
let is_reliable = sockets.read_application().features().is_reliable();
let timer = if is_reliable {
None
} else {
Some(Timer::new(&shared.clock))
};
let gso = shared.gso.clone();
let send_buffer = msg::send::Message::new(remote_addr, gso);
let read_mode = Default::default();
let ack_mode = Default::default();
let local_state = match endpoint {
endpoint::Type::Client if is_reliable => LocalState::Ready,
endpoint::Type::Client => LocalState::Reading,
endpoint::Type::Server => LocalState::Reading,
};
Reader(ManuallyDrop::new(Box::new(Inner {
shared,
sockets,
send_buffer,
read_mode,
ack_mode,
timer,
local_state,
runtime,
})))
}
}