Skip to main content

WaitingList

Struct WaitingList 

Source
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:

  1. Inbox: producer stores, consumer polls or long-polls for message
  2. 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

Source

pub fn new(repository: EntryRepository) -> Self

Creates a WaitingList with the given repository.

Source

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).

Source

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).

Source

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.

Source

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.

Source

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).

Source

pub fn cleanup_expired(&mut self) -> usize

Removes expired entries and cleans up stale waiters.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more