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}