use std::sync::Arc;
use super::bus::{DisconnectReason, Inner};
use super::queue::QueueReceiver;
pub struct EventDispatcher {
inner: Arc<Inner>,
receiver: QueueReceiver,
}
impl EventDispatcher {
pub(super) fn new(inner: Arc<Inner>, receiver: QueueReceiver) -> Self {
Self { inner, receiver }
}
pub async fn run(mut self) {
loop {
tokio::select! {
biased;
event = self.receiver.recv() => {
let Some(event) = event else { break };
self.handle_overflow();
self.inner.deliver(&event);
}
() = self.inner.overflow_notified() => self.handle_overflow(),
}
}
self.handle_overflow();
}
fn handle_overflow(&self) {
if let Some(record) = self.inner.take_overflow() {
self.inner.disconnect_affected(&record);
}
}
}
impl Drop for EventDispatcher {
fn drop(&mut self) {
self.inner.close_publishing();
self.inner.disconnect_all(DisconnectReason::Shutdown);
}
}