Skip to main content

synapse_pingora/tunnel/
types.rs

1//! Tunnel protocol types for Signal Horizon tunnel client.
2
3use serde::{Deserialize, Serialize};
4
5/// Connection state for the tunnel client.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
7#[serde(rename_all = "lowercase")]
8pub enum ConnectionState {
9    Disconnected,
10    Connecting,
11    Authenticating,
12    Connected,
13    Reconnecting,
14    Error,
15}
16
17/// Supported tunnel channels.
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
19#[serde(rename_all = "lowercase")]
20pub enum TunnelChannel {
21    Shell,
22    Logs,
23    Diag,
24    Control,
25    Files,
26    Update,
27}
28
29impl TunnelChannel {
30    pub const ALL: [TunnelChannel; 6] = [
31        TunnelChannel::Shell,
32        TunnelChannel::Logs,
33        TunnelChannel::Diag,
34        TunnelChannel::Control,
35        TunnelChannel::Files,
36        TunnelChannel::Update,
37    ];
38
39    pub const fn as_str(self) -> &'static str {
40        match self {
41            TunnelChannel::Shell => "shell",
42            TunnelChannel::Logs => "logs",
43            TunnelChannel::Diag => "diag",
44            TunnelChannel::Control => "control",
45            TunnelChannel::Files => "files",
46            TunnelChannel::Update => "update",
47        }
48    }
49}
50
51/// Metadata included during tunnel authentication.
52#[derive(Debug, Clone, Serialize, Deserialize, Default)]
53pub struct TunnelAuthMetadata {
54    pub hostname: Option<String>,
55    pub version: Option<String>,
56    pub platform: Option<String>,
57}
58
59/// Authentication payload for the tunnel client.
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct TunnelAuthPayload {
62    #[serde(rename = "sensorId")]
63    pub sensor_id: String,
64    #[serde(rename = "apiKey")]
65    pub api_key: String,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub capabilities: Option<Vec<String>>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub metadata: Option<TunnelAuthMetadata>,
70}
71
72/// Tunnel authentication message.
73#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct TunnelAuthMessage {
75    #[serde(rename = "type")]
76    pub message_type: String,
77    pub payload: TunnelAuthPayload,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub timestamp: Option<String>,
80}
81
82/// Envelope for channel-based messages.
83#[derive(Debug, Clone)]
84pub struct TunnelEnvelope {
85    pub channel: TunnelChannel,
86    pub session_id: Option<String>,
87    pub sequence_id: Option<u64>,
88    pub timestamp: Option<i64>,
89    pub raw: serde_json::Value,
90}
91
92/// Legacy tunnel message structure.
93#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct LegacyTunnelMessage {
95    #[serde(rename = "type")]
96    pub message_type: String,
97    #[serde(default, rename = "sessionId")]
98    pub session_id: Option<String>,
99    #[serde(default, rename = "requestId")]
100    pub request_id: Option<String>,
101    #[serde(default)]
102    pub payload: serde_json::Value,
103    #[serde(default)]
104    pub timestamp: Option<String>,
105}