Skip to main content

faf_radio_rust/
types.rs

1use serde::{Deserialize, Serialize};
2
3/// Client connection state
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum ConnectionState {
6    Disconnected,
7    Connecting,
8    Connected,
9    Reconnecting,
10}
11
12/// Client action sent to server
13#[derive(Debug, Clone, Serialize, Deserialize)]
14#[serde(tag = "action", rename_all = "lowercase")]
15pub enum ClientAction {
16    /// Tune to frequencies
17    Tune { frequencies: Vec<String> },
18    /// Untune from frequencies
19    Untune { frequencies: Vec<String> },
20    /// Ping for heartbeat
21    Ping,
22    /// Broadcast an event on a frequency
23    Broadcast {
24        frequency: String,
25        event: serde_json::Value,
26    },
27}
28
29/// Server message received from server
30#[derive(Debug, Clone, Serialize, Deserialize)]
31#[serde(tag = "type", rename_all = "lowercase")]
32pub enum ServerMessage {
33    /// Connection established
34    Connected {
35        #[serde(rename = "clientId")]
36        client_id: String,
37        message: String,
38        frequencies: serde_json::Value,
39    },
40    /// Successfully tuned to frequencies
41    Tuned {
42        frequencies: Vec<String>,
43        message: String,
44    },
45    /// Broadcast received
46    Broadcast {
47        frequency: String,
48        event: serde_json::Value,
49        timestamp: String,
50    },
51    /// Heartbeat response
52    Pong,
53    /// Error message
54    Error { message: String },
55}
56
57/// Radio Protocol client configuration
58#[derive(Debug, Clone)]
59pub struct RadioConfig {
60    /// WebSocket server URL
61    pub url: String,
62    /// Auto-reconnect on disconnect
63    pub auto_reconnect: bool,
64    /// Maximum reconnection attempts (0 = unlimited)
65    pub max_reconnect_attempts: u32,
66    /// Initial reconnection delay (milliseconds)
67    pub reconnect_delay_ms: u64,
68    /// Maximum reconnection delay (milliseconds)
69    pub max_reconnect_delay_ms: u64,
70    /// Heartbeat interval (milliseconds)
71    pub heartbeat_interval_ms: u64,
72}
73
74impl Default for RadioConfig {
75    fn default() -> Self {
76        Self {
77            url: String::new(),
78            auto_reconnect: true,
79            max_reconnect_attempts: 5,
80            reconnect_delay_ms: 1000,      // 1 second
81            max_reconnect_delay_ms: 16000, // 16 seconds
82            heartbeat_interval_ms: 30000,  // 30 seconds
83        }
84    }
85}
86
87impl RadioConfig {
88    /// Create new config with URL
89    pub fn new(url: impl Into<String>) -> Self {
90        Self {
91            url: url.into(),
92            ..Default::default()
93        }
94    }
95
96    /// Preset config for Grok inference frequency
97    pub fn grok() -> Self {
98        Self::new("wss://faf-beacon.wolfejam2020.workers.dev/radio")
99    }
100}