Skip to main content

firecloud_net/
messaging.rs

1//! Direct peer-to-peer messaging protocol
2//!
3//! Implements friend requests and private messaging using libp2p request-response
4
5use serde::{Deserialize, Serialize};
6
7/// Protocol identifier for FireCloud messaging
8pub const MESSAGING_PROTOCOL: &str = "/firecloud/message/1.0.0";
9
10/// Message request types for direct peer communication
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub enum MessageRequest {
13    /// Send a friend request to another peer
14    FriendRequest {
15        /// Optional friendly name to identify this peer
16        name: Option<String>,
17    },
18    
19    /// Accept a previously received friend request
20    FriendAccept,
21    
22    /// Reject a friend request
23    FriendReject,
24    
25    /// Remove an existing friend connection
26    FriendRemove,
27    
28    /// Send a direct private message to a friend
29    /// 
30    /// NOTE: Content is already padded to 1024 bytes by the CLI
31    /// This ensures ALL messages on the network are identical size
32    DirectMessage {
33        /// Encrypted + padded message content (exactly 1024 bytes)
34        content: Vec<u8>,
35        /// Unique message identifier (UUID)
36        message_id: String,
37        /// Unix timestamp when message was sent
38        timestamp: i64,
39    },
40    
41    /// Confirm that a message was delivered
42    MessageDelivered {
43        message_id: String,
44    },
45    
46    /// Confirm that a message was read
47    MessageRead {
48        message_id: String,
49    },
50    
51    /// Query if peer is online
52    Ping,
53}
54
55/// Message response types
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub enum MessageResponse {
58    /// Friend request was received and stored
59    FriendRequestReceived {
60        /// Whether this peer also sent a request (auto-friends!)
61        mutual: bool,
62    },
63    
64    /// Friend request was accepted
65    FriendAccepted,
66    
67    /// Friend request was rejected
68    FriendRejected,
69    
70    /// Friend was removed
71    FriendRemoved,
72    
73    /// Message was received and stored
74    MessageReceived {
75        message_id: String,
76        /// Unix timestamp when received
77        received_at: i64,
78    },
79    
80    /// Delivery confirmation acknowledged
81    DeliveryConfirmed {
82        message_id: String,
83    },
84    
85    /// Read receipt acknowledged
86    ReadConfirmed {
87        message_id: String,
88    },
89    
90    /// Pong response
91    Pong {
92        /// Timestamp when ping was received
93        timestamp: i64,
94    },
95    
96    /// An error occurred processing the request
97    Error {
98        message: String,
99    },
100}
101
102#[cfg(test)]
103mod tests {
104    use super::*;
105    
106    #[test]
107    fn test_message_serialization() {
108        let request = MessageRequest::DirectMessage {
109            content: vec![0u8; 1024],
110            message_id: "test-123".to_string(),
111            timestamp: 1234567890,
112        };
113        
114        let serialized = bincode::serialize(&request).unwrap();
115        let deserialized: MessageRequest = bincode::deserialize(&serialized).unwrap();
116        
117        match deserialized {
118            MessageRequest::DirectMessage { content, .. } => {
119                assert_eq!(content.len(), 1024);
120            }
121            _ => panic!("Wrong variant"),
122        }
123    }
124    
125    #[test]
126    fn test_friend_request() {
127        let request = MessageRequest::FriendRequest {
128            name: Some("Alice".to_string()),
129        };
130        
131        let serialized = bincode::serialize(&request).unwrap();
132        let _deserialized: MessageRequest = bincode::deserialize(&serialized).unwrap();
133    }
134}