daedalus_core/channels/
mod.rs

1use std::fmt::Debug;
2
3pub mod bounded;
4pub mod broadcast;
5pub mod newest;
6pub mod unbounded;
7
8#[cfg(feature = "async-channels")]
9pub mod async_;
10pub mod policy;
11
12pub use bounded::{BoundedReceiver, BoundedSender, bounded};
13pub use broadcast::{BroadcastReceiver, BroadcastSender, broadcast};
14pub use newest::{NewestReceiver, NewestSender, newest};
15pub use unbounded::{UnboundedReceiver, UnboundedSender, unbounded};
16
17#[cfg(feature = "metrics")]
18pub use bounded::bounded_with_metrics;
19#[cfg(feature = "metrics")]
20pub use broadcast::broadcast_with_metrics;
21#[cfg(feature = "metrics")]
22pub use newest::newest_with_metrics;
23#[cfg(feature = "metrics")]
24pub use unbounded::unbounded_with_metrics;
25
26/// Result of attempting to enqueue a message.
27///
28/// ```
29/// use daedalus_core::channels::{bounded, Backpressure, ChannelSend};
30/// let (tx, _rx) = bounded(1);
31/// assert_eq!(tx.send(1), Backpressure::Ok);
32/// ```
33#[derive(Clone, Copy, Debug, PartialEq, Eq)]
34pub enum Backpressure {
35    Ok,
36    Full,
37    Closed,
38}
39
40/// Result of attempting to receive a message.
41///
42/// ```
43/// use daedalus_core::channels::{bounded, ChannelRecv, RecvOutcome};
44/// let (_tx, rx) = bounded::<u8>(1);
45/// assert_eq!(rx.try_recv(), RecvOutcome::Empty);
46/// ```
47#[derive(Clone, Debug, PartialEq, Eq)]
48pub enum RecvOutcome<T> {
49    Data(T),
50    Empty,
51    Closed,
52}
53
54/// Common sender interface.
55///
56/// ```
57/// use daedalus_core::channels::{bounded, ChannelSend, Backpressure};
58/// let (tx, _rx) = bounded(1);
59/// assert_eq!(tx.send(42), Backpressure::Ok);
60/// ```
61pub trait ChannelSend<T>: Send + Sync {
62    fn send(&self, value: T) -> Backpressure;
63}
64
65/// Common receiver interface (non-blocking).
66///
67/// ```
68/// use daedalus_core::channels::{bounded, ChannelRecv, RecvOutcome};
69/// let (_tx, rx) = bounded::<u8>(1);
70/// assert_eq!(rx.try_recv(), RecvOutcome::Empty);
71/// ```
72pub trait ChannelRecv<T>: Send + Sync {
73    fn try_recv(&self) -> RecvOutcome<T>;
74}
75
76/// Behavior when peers drop.
77///
78/// ```
79/// use daedalus_core::channels::CloseBehavior;
80/// let behavior = CloseBehavior::FailFast;
81/// assert_eq!(behavior, CloseBehavior::FailFast);
82/// ```
83#[derive(Clone, Copy, Debug, PartialEq, Eq)]
84pub enum CloseBehavior {
85    /// Mark closed when either senders or receivers are gone (fail fast).
86    FailFast,
87    /// Keep channel open until senders are gone (receivers may drop).
88    DrainUntilSendersDone,
89}
90
91/// Snapshot stats for a channel.
92///
93/// ```
94/// use daedalus_core::channels::ChannelStats;
95/// let stats = ChannelStats::default();
96/// assert_eq!(stats.depth, 0);
97/// ```
98#[derive(Clone, Debug, Default, PartialEq, Eq)]
99pub struct ChannelStats {
100    pub enqueued: u64,
101    pub dropped: u64,
102    pub drained: u64,
103    pub depth: usize,
104    pub closed: bool,
105}