use std::thread;
use crate::error::{FrameError, TryRecvError};
use crate::protocol::Peer;
use crate::sync::consts::EVENTS_RECV_POOLING_INTERVAL;
use crate::sync::node::{Callback, EventReceiver};
use crate::prelude::*;
#[derive(Clone, Debug)]
pub enum Event<V: MaybeVersioned> {
NewPeer(Peer),
PeerLost(Peer),
Frame(Frame<V>, Callback<V>),
Invalid(Frame<V>, FrameError, Callback<V>),
}
pub(crate) struct EventsIterator<V: MaybeVersioned> {
receiver: EventReceiver<V>,
}
impl<V: MaybeVersioned> EventsIterator<V> {
pub fn new(receiver: EventReceiver<V>) -> Self {
Self { receiver }
}
}
impl<V: MaybeVersioned> Iterator for EventsIterator<V> {
type Item = Event<V>;
fn next(&mut self) -> Option<Self::Item> {
while !self.receiver.state().is_closed() {
return match self.receiver.try_recv() {
Ok(event) => Some(event),
Err(err) => match err {
TryRecvError::Disconnected => None,
_ => {
thread::sleep(EVENTS_RECV_POOLING_INTERVAL);
continue;
}
},
};
}
self.receiver.try_recv().ok()
}
}