Skip to main content

pollen_transport/
message.rs

1//! Message types for cluster communication.
2
3use bytes::Bytes;
4use pollen_types::{Member, MemberState, NodeId, TaskId};
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7
8/// Membership update message.
9#[derive(Clone, Debug, Serialize, Deserialize)]
10pub struct MembershipUpdateMsg {
11    /// Members being updated.
12    pub members: Vec<MemberInfo>,
13}
14
15/// Simplified member info for wire transfer.
16#[derive(Clone, Debug, Serialize, Deserialize)]
17pub struct MemberInfo {
18    pub id: NodeId,
19    pub addr: String,
20    pub state: MemberState,
21    pub metadata: HashMap<String, String>,
22    pub incarnation: u64,
23}
24
25impl From<&Member> for MemberInfo {
26    fn from(m: &Member) -> Self {
27        Self {
28            id: m.id,
29            addr: m.addr.to_string(),
30            state: m.state,
31            metadata: m.metadata.clone(),
32            incarnation: 0,
33        }
34    }
35}
36
37/// CRDT delta message.
38#[derive(Clone, Debug, Serialize, Deserialize)]
39pub struct CrdtDeltaMsg {
40    /// Key being updated.
41    pub key: String,
42    /// CRDT type.
43    pub crdt_type: String,
44    /// Serialized delta.
45    pub delta: Bytes,
46    /// HLC timestamp.
47    pub timestamp: u64,
48}
49
50/// CRDT full sync request.
51#[derive(Clone, Debug, Serialize, Deserialize)]
52pub struct CrdtSyncRequestMsg {
53    /// Keys to sync.
54    pub keys: Vec<String>,
55}
56
57/// CRDT full sync response.
58#[derive(Clone, Debug, Serialize, Deserialize)]
59pub struct CrdtFullSyncMsg {
60    /// Key-value pairs.
61    pub entries: Vec<CrdtEntry>,
62}
63
64/// A single CRDT entry.
65#[derive(Clone, Debug, Serialize, Deserialize)]
66pub struct CrdtEntry {
67    pub key: String,
68    pub crdt_type: String,
69    pub data: Bytes,
70    pub timestamp: u64,
71}
72
73/// Merkle tree request for anti-entropy.
74#[derive(Clone, Debug, Serialize, Deserialize)]
75pub struct MerkleTreeRequestMsg {
76    /// Depth of tree to request.
77    pub depth: u32,
78    /// Prefix to request (for partial sync).
79    pub prefix: Option<String>,
80}
81
82/// Merkle tree response.
83#[derive(Clone, Debug, Serialize, Deserialize)]
84pub struct MerkleTreeResponseMsg {
85    /// Tree nodes (hash -> children hashes).
86    pub nodes: Vec<MerkleNode>,
87    /// Root hash.
88    pub root_hash: Bytes,
89}
90
91/// A node in the Merkle tree.
92#[derive(Clone, Debug, Serialize, Deserialize)]
93pub struct MerkleNode {
94    pub hash: Bytes,
95    pub range_start: String,
96    pub range_end: String,
97    pub children: Vec<Bytes>,
98}
99
100/// Data range request for syncing differences.
101#[derive(Clone, Debug, Serialize, Deserialize)]
102pub struct DataRangeRequestMsg {
103    /// Start key (inclusive).
104    pub start: String,
105    /// End key (exclusive).
106    pub end: String,
107}
108
109/// Data range response.
110#[derive(Clone, Debug, Serialize, Deserialize)]
111pub struct DataRangeResponseMsg {
112    /// Entries in the range.
113    pub entries: Vec<CrdtEntry>,
114}
115
116/// Task claim message.
117#[derive(Clone, Debug, Serialize, Deserialize)]
118pub struct TaskClaimMsg {
119    /// Task being claimed.
120    pub task_id: TaskId,
121    /// Instance being claimed.
122    pub instance_id: String,
123    /// Version for optimistic locking.
124    pub version: u64,
125}
126
127/// Task claim acknowledgment.
128#[derive(Clone, Debug, Serialize, Deserialize)]
129pub struct TaskClaimAckMsg {
130    /// Whether the claim was successful.
131    pub success: bool,
132    /// Instance ID.
133    pub instance_id: String,
134    /// New version if successful.
135    pub version: u64,
136}
137
138/// Task completion notification.
139#[derive(Clone, Debug, Serialize, Deserialize)]
140pub struct TaskCompleteMsg {
141    /// Instance ID.
142    pub instance_id: String,
143    /// Whether execution was successful.
144    pub success: bool,
145    /// Error message if failed.
146    pub error: Option<String>,
147}