use std::collections::VecDeque;
use bytes::Bytes;
use crossbeam_channel::Receiver;
use crate::channel::senders::fragment_sender::FragmentSender;
use crate::channel::senders::ChannelSend;
use crate::packet::message::{FragmentData, MessageAck, MessageId, SingleData};
use crate::shared::ping::manager::PingManager;
use crate::shared::tick_manager::TickManager;
use crate::shared::time_manager::TimeManager;
pub struct UnorderedUnreliableSender {
single_messages_to_send: VecDeque<SingleData>,
fragmented_messages_to_send: VecDeque<FragmentData>,
next_send_fragmented_message_id: MessageId,
fragment_sender: FragmentSender,
}
impl UnorderedUnreliableSender {
pub(crate) fn new() -> Self {
Self {
single_messages_to_send: VecDeque::new(),
fragmented_messages_to_send: VecDeque::new(),
next_send_fragmented_message_id: MessageId::default(),
fragment_sender: FragmentSender::new(),
}
}
}
impl ChannelSend for UnorderedUnreliableSender {
fn update(&mut self, _: &TimeManager, _: &PingManager, _: &TickManager) {}
fn buffer_send(&mut self, message: Bytes) -> Option<MessageId> {
if message.len() > self.fragment_sender.fragment_size {
for fragment in self.fragment_sender.build_fragments(
self.next_send_fragmented_message_id,
None,
message,
) {
self.fragmented_messages_to_send.push_back(fragment);
}
self.next_send_fragmented_message_id += 1;
Some(self.next_send_fragmented_message_id - 1)
} else {
let single_data = SingleData::new(None, message);
self.single_messages_to_send.push_back(single_data);
None
}
}
fn send_packet(&mut self) -> (VecDeque<SingleData>, VecDeque<FragmentData>) {
(
std::mem::take(&mut self.single_messages_to_send),
std::mem::take(&mut self.fragmented_messages_to_send),
)
}
fn collect_messages_to_send(&mut self) {}
fn notify_message_delivered(&mut self, _: &MessageAck) {}
fn has_messages_to_send(&self) -> bool {
!self.single_messages_to_send.is_empty() || !self.fragmented_messages_to_send.is_empty()
}
fn subscribe_acks(&mut self) -> Receiver<MessageId> {
unreachable!()
}
}
#[cfg(test)]
mod tests {
}