siphon_protocol/
messages.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
5#[serde(rename_all = "snake_case")]
6pub enum TunnelType {
7 Http,
9 Tcp,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
15#[serde(tag = "type", rename_all = "snake_case")]
16pub enum ClientMessage {
17 RequestTunnel {
19 subdomain: Option<String>,
21 tunnel_type: TunnelType,
23 local_port: u16,
25 },
26
27 HttpResponse {
29 stream_id: u64,
31 status: u16,
33 headers: Vec<(String, String)>,
35 body: Vec<u8>,
37 },
38
39 TcpData {
41 stream_id: u64,
43 data: Vec<u8>,
45 },
46
47 TcpClose {
49 stream_id: u64,
51 },
52
53 Ping {
55 timestamp: u64,
57 },
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
62#[serde(tag = "type", rename_all = "snake_case")]
63pub enum ServerMessage {
64 TunnelEstablished {
66 subdomain: String,
68 url: String,
70 port: Option<u16>,
72 },
73
74 TunnelDenied {
76 reason: String,
78 },
79
80 HttpRequest {
82 stream_id: u64,
84 method: String,
86 uri: String,
88 headers: Vec<(String, String)>,
90 body: Vec<u8>,
92 },
93
94 TcpConnect {
96 stream_id: u64,
98 },
99
100 TcpData {
102 stream_id: u64,
104 data: Vec<u8>,
106 },
107
108 TcpClose {
110 stream_id: u64,
112 },
113
114 Pong {
116 timestamp: u64,
118 },
119}
120
121#[cfg(test)]
122mod tests {
123 use super::*;
124
125 #[test]
126 fn test_client_message_serialization() {
127 let msg = ClientMessage::RequestTunnel {
128 subdomain: Some("myapp".to_string()),
129 tunnel_type: TunnelType::Http,
130 local_port: 3000,
131 };
132 let json = serde_json::to_string(&msg).unwrap();
133 let parsed: ClientMessage = serde_json::from_str(&json).unwrap();
134
135 match parsed {
136 ClientMessage::RequestTunnel {
137 subdomain,
138 tunnel_type,
139 local_port,
140 } => {
141 assert_eq!(subdomain, Some("myapp".to_string()));
142 assert_eq!(tunnel_type, TunnelType::Http);
143 assert_eq!(local_port, 3000);
144 }
145 _ => panic!("Wrong variant"),
146 }
147 }
148
149 #[test]
150 fn test_server_message_serialization() {
151 let msg = ServerMessage::TunnelEstablished {
152 subdomain: "myapp".to_string(),
153 url: "https://myapp.tunnel.example.com".to_string(),
154 port: None,
155 };
156 let json = serde_json::to_string(&msg).unwrap();
157 let parsed: ServerMessage = serde_json::from_str(&json).unwrap();
158
159 match parsed {
160 ServerMessage::TunnelEstablished {
161 subdomain,
162 url,
163 port,
164 } => {
165 assert_eq!(subdomain, "myapp");
166 assert_eq!(url, "https://myapp.tunnel.example.com");
167 assert_eq!(port, None);
168 }
169 _ => panic!("Wrong variant"),
170 }
171 }
172}