rapace_core/
control.rs

1//! Control channel payloads.
2
3use facet::Facet;
4
5/// Reasons for closing a channel.
6#[derive(Debug, Clone, PartialEq, Eq, Facet)]
7#[repr(u8)]
8pub enum CloseReason {
9    /// Normal completion.
10    Normal,
11    /// Error occurred.
12    Error(String),
13}
14
15/// Reasons for cancelling a channel.
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Facet)]
17#[repr(u8)]
18pub enum CancelReason {
19    /// Client requested cancellation.
20    ClientCancel,
21    /// Deadline exceeded.
22    DeadlineExceeded,
23    /// Resource exhausted.
24    ResourceExhausted,
25}
26
27/// Control channel payloads (channel 0).
28///
29/// The `method_id` in MsgDescHot indicates the verb:
30/// - 1: OpenChannel
31/// - 2: CloseChannel
32/// - 3: CancelChannel
33/// - 4: GrantCredits
34/// - 5: Ping
35/// - 6: Pong
36#[derive(Debug, Clone, Facet)]
37#[repr(u8)]
38pub enum ControlPayload {
39    /// Open a new data channel.
40    OpenChannel {
41        channel_id: u32,
42        service_name: String,
43        method_name: String,
44        metadata: Vec<(String, Vec<u8>)>,
45    },
46    /// Close a channel gracefully.
47    CloseChannel {
48        channel_id: u32,
49        reason: CloseReason,
50    },
51    /// Cancel a channel.
52    CancelChannel {
53        channel_id: u32,
54        reason: CancelReason,
55    },
56    /// Grant flow control credits.
57    GrantCredits { channel_id: u32, bytes: u32 },
58    /// Liveness probe.
59    Ping { payload: [u8; 8] },
60    /// Response to Ping.
61    Pong { payload: [u8; 8] },
62}
63
64/// Control method IDs.
65pub mod control_method {
66    pub const OPEN_CHANNEL: u32 = 1;
67    pub const CLOSE_CHANNEL: u32 = 2;
68    pub const CANCEL_CHANNEL: u32 = 3;
69    pub const GRANT_CREDITS: u32 = 4;
70    pub const PING: u32 = 5;
71    pub const PONG: u32 = 6;
72}