bevy_rtc 0.3.1

A client-server library designed over WebRTC for Bevy
Documentation
use crate::{events::SocketRecvEvent, protocol::Protocol};
use bevy::prelude::*;
use std::collections::VecDeque;

#[derive(Default, Debug, Resource)]
pub struct IncomingMessages<M: Protocol> {
    pub bound: usize,
    pub messages: VecDeque<M>,
}

impl<M: Protocol> IncomingMessages<M> {
    pub fn receive_payloads(mut incoming: ResMut<Self>, mut events: EventReader<SocketRecvEvent>) {
        let bound = incoming.bound;
        let packets: Vec<_> = events
            .read()
            .map(|&SocketRecvEvent((_peer_id, ref packet))| packet)
            .filter_map(M::from_packet)
            .enumerate()
            .take_while(|(read, _)| *read <= bound)
            .map(|(_, packet)| packet)
            .collect();
        trace!("Read {} {} packets", packets.len(), M::reflect_name());
        for packet in packets.into_iter() {
            incoming.messages.push_back(packet);
        }
        if incoming.messages.len() > bound {
            warn!(
                "The `{}` protocol is overflowing its bounded buffer ({bound}) and dropping packets! Is it being read?",
                M::reflect_name()
            );
            while incoming.messages.len() > bound {
                incoming.messages.pop_front();
            }
        }
    }
}