Skip to main content

commonware_collector/
lib.rs

1//! Collect responses to [Committable] requests.
2//!
3//! # Status
4//!
5//! Stability varies by primitive. See [README](https://github.com/commonwarexyz/monorepo#stability) for details.
6
7#![doc(
8    html_logo_url = "https://commonware.xyz/imgs/rustdoc_logo.svg",
9    html_favicon_url = "https://commonware.xyz/favicon.ico"
10)]
11
12commonware_macros::stability_scope!(ALPHA {
13    use commonware_codec::Codec;
14    use commonware_cryptography::{Committable, Digestible, PublicKey};
15    use commonware_p2p::Recipients;
16    use commonware_utils::channel::oneshot;
17    use std::future::Future;
18    use thiserror::Error;
19
20    pub mod p2p;
21
22    /// Errors that can occur when interacting with a [Originator].
23    #[derive(Error, Debug)]
24    pub enum Error {
25        #[error("send failed: {0}")]
26        SendFailed(anyhow::Error),
27        #[error("canceled")]
28        Canceled,
29    }
30
31    /// An [Originator] sends requests out to a set of [Handler]s and collects replies.
32    pub trait Originator: Clone + Send + 'static {
33        /// The [PublicKey] of a recipient.
34        type PublicKey: PublicKey;
35
36        /// The type of request to send.
37        type Request: Committable + Digestible + Codec;
38
39        /// Sends a `Request` to a set of [Recipients], returning the list of handlers that we
40        /// tried to send to.
41        fn send(
42            &mut self,
43            recipients: Recipients<Self::PublicKey>,
44            request: Self::Request,
45        ) -> impl Future<Output = Result<Vec<Self::PublicKey>, Error>> + Send;
46
47        /// Cancel a request by `commitment`, ignoring any future responses.
48        ///
49        /// Tracked commitments are not removed until explicitly cancelled.
50        fn cancel(
51            &mut self,
52            commitment: <Self::Request as Committable>::Commitment,
53        ) -> impl Future<Output = ()> + Send;
54    }
55
56    /// A [Handler] receives requests and (optionally) sends replies.
57    pub trait Handler: Clone + Send + 'static {
58        /// The [PublicKey] of the [Originator].
59        type PublicKey: PublicKey;
60
61        /// The type of request received.
62        type Request: Committable + Digestible + Codec;
63
64        /// The type of response to send.
65        type Response: Committable<Commitment = <Self::Request as Committable>::Commitment>
66            + Digestible<Digest = <Self::Request as Digestible>::Digest>
67            + Codec;
68
69        /// Processes a `request` from an [Originator] and (optionally) send a response.
70        ///
71        /// If no response is needed, the `responder` should be dropped.
72        fn process(
73            &mut self,
74            origin: Self::PublicKey,
75            request: Self::Request,
76            response: oneshot::Sender<Self::Response>,
77        ) -> impl Future<Output = ()> + Send;
78    }
79
80    /// A [Monitor] collects responses from [Handler]s.
81    pub trait Monitor: Clone + Send + 'static {
82        /// The [PublicKey] of the [Handler].
83        type PublicKey: PublicKey;
84
85        /// The type of response collected.
86        type Response: Committable + Digestible + Codec;
87
88        /// Called for each response collected with the number of responses collected so far for
89        /// the same commitment.
90        ///
91        /// [Monitor::collected] is only called once per `handler`.
92        fn collected(
93            &mut self,
94            handler: Self::PublicKey,
95            response: Self::Response,
96            count: usize,
97        ) -> impl Future<Output = ()> + Send;
98    }
99});