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 SequencedUnreliableSender {
single_messages_to_send: VecDeque<SingleData>,
fragmented_messages_to_send: VecDeque<FragmentData>,
next_send_message_id: MessageId,
fragment_sender: FragmentSender,
}
impl SequencedUnreliableSender {
pub(crate) fn new() -> Self {
Self {
single_messages_to_send: VecDeque::new(),
fragmented_messages_to_send: VecDeque::new(),
next_send_message_id: MessageId(0),
fragment_sender: FragmentSender::new(),
}
}
}
impl ChannelSend for SequencedUnreliableSender {
fn update(&mut self, _: &TimeManager, _: &PingManager, _: &TickManager) {}
fn buffer_send(&mut self, message: Bytes) -> Option<MessageId> {
let message_id = self.next_send_message_id;
if message.len() > self.fragment_sender.fragment_size {
for fragment in self
.fragment_sender
.build_fragments(message_id, None, message)
{
self.fragmented_messages_to_send.push_back(fragment);
}
} else {
let single_data = SingleData::new(Some(message_id), message);
self.single_messages_to_send.push_back(single_data);
}
self.next_send_message_id += 1;
Some(message_id)
}
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, _message_ack: &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 {
}