pub struct WaitingList { /* private fields */ }Expand description
Coordination layer for pub-sub message delivery.
Combines persistent storage (EntryRepository) with in-memory waiter channels. Supports two patterns:
- Inbox: producer stores, consumer polls or long-polls for message
- Link: producer stores, waits for ACK; consumer fetches and ACKs
Memory is bounded by repository’s max_entries and per-entry waiter limits.
Implementations§
Source§impl WaitingList
impl WaitingList
Sourcepub fn new(repository: EntryRepository) -> Self
pub fn new(repository: EntryRepository) -> Self
Creates a WaitingList with the given repository.
Sourcepub fn store(
&mut self,
id: String,
message: Message,
ttl: Duration,
) -> Result<()>
pub fn store( &mut self, id: String, message: Message, ttl: Duration, ) -> Result<()>
Stores a message, immediately notifying any long-polling subscribers.
On overwrite: message_waiters receive the new message; stale ack_waiters
(from previous message) are dropped (their receivers get RecvError).
Returns an error if persistence fails. Waiters are notified regardless of persistence success (message is delivered but may not survive restart).
Sourcepub fn ack(&mut self, id: &str) -> bool
pub fn ack(&mut self, id: &str) -> bool
Marks entry as acknowledged, clearing message payload and notifying waiters.
Returns false if entry missing or expired (caller should return 404).
Sourcepub fn is_acked(&self, id: &str) -> Option<bool>
pub fn is_acked(&self, id: &str) -> Option<bool>
Returns whether an entry has been acknowledged.
Returns None if entry doesn’t exist or is expired, Some(bool) otherwise.
Sourcepub fn subscribe_ack(
&mut self,
id: &str,
) -> Result<Receiver<()>, SubscribeError>
pub fn subscribe_ack( &mut self, id: &str, ) -> Result<Receiver<()>, SubscribeError>
Subscribes to receive notification when this entry is ACKed.
Returns Err(SubscribeError::NotFound) if entry missing/expired,
Err(SubscribeError::WaiterLimitReached) if waiter limit reached.
Sourcepub fn get_or_subscribe(
&mut self,
id: &str,
) -> Result<GetOrSubscribeResult, SubscribeError>
pub fn get_or_subscribe( &mut self, id: &str, ) -> Result<GetOrSubscribeResult, SubscribeError>
Atomically checks for message and subscribes if not present.
Prevents TOCTOU race: without this, a separate “check then subscribe” would miss messages arriving between the two operations.
Creates a waiter entry if no message exists, allowing waiters to register before any message is stored (consumer arrives before producer).
Sourcepub fn cleanup_expired(&mut self) -> usize
pub fn cleanup_expired(&mut self) -> usize
Removes expired entries and cleans up stale waiters.
Auto Trait Implementations§
impl !Freeze for WaitingList
impl !RefUnwindSafe for WaitingList
impl Send for WaitingList
impl Sync for WaitingList
impl Unpin for WaitingList
impl UnsafeUnpin for WaitingList
impl !UnwindSafe for WaitingList
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more