use std::{fmt::Debug, time::Duration};
use futures_util::{Stream, StreamExt};
use crate::Timing;
pub const WINDOW: Duration = Duration::from_secs(3);
pub fn fast() -> Timing {
Timing {
ping_interval: Some(Duration::from_millis(50)),
stale_after: Duration::from_millis(300),
initial_backoff: Duration::from_millis(10),
max_backoff: Duration::from_millis(20),
..Timing::default()
}
}
pub async fn next_item<S: Stream + Unpin>(stream: &mut S) -> S::Item {
let deadline = tokio::time::sleep(WINDOW);
tokio::pin!(deadline);
tokio::select! {
biased;
() = &mut deadline => panic!("no item within {WINDOW:?}"),
item = stream.next() => item.expect("the stream ended"),
}
}
pub async fn next_event<S, T, E>(stream: &mut S) -> T
where
S: Stream<Item = Result<T, E>> + Unpin,
E: Debug,
{
next_item(stream).await.expect("an event, not an error")
}
pub async fn drain<S: Stream + Unpin>(mut stream: S) {
while stream.next().await.is_some() {}
}