use crate::{network::PushReceiver, resp::BulkString};
use futures_util::{Stream, StreamExt};
use std::{
pin::Pin,
task::{Context, Poll},
};
use tracing::warn;
pub struct ClientTrackingInvalidationStream {
receiver: PushReceiver,
}
impl ClientTrackingInvalidationStream {
pub(crate) fn new(receiver: PushReceiver) -> Self {
Self { receiver }
}
}
impl Stream for ClientTrackingInvalidationStream {
type Item = Vec<BulkString>;
fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
let this = self.get_mut();
loop {
let Poll::Ready(response) = this.receiver.poll_next_unpin(cx) else {
return Poll::Pending;
};
let Some(response) = response else {
return Poll::Ready(None);
};
match response {
Ok(response) => match response.to::<((), Vec<BulkString>)>() {
Ok((_invalidate, keys)) => return Poll::Ready(Some(keys)),
Err(e) => warn!("Cannot decode a client tracking invalidation: {e}"),
},
Err(e) => warn!("Error while receiving a client tracking invalidation: {e}"),
}
}
}
}