1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum ConnectionState {
6 Disconnected,
7 Connecting,
8 Connected,
9 Reconnecting,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
14#[serde(tag = "action", rename_all = "lowercase")]
15pub enum ClientAction {
16 Tune { frequencies: Vec<String> },
18 Untune { frequencies: Vec<String> },
20 Ping,
22 Broadcast {
24 frequency: String,
25 event: serde_json::Value,
26 },
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
31#[serde(tag = "type", rename_all = "lowercase")]
32pub enum ServerMessage {
33 Connected {
35 #[serde(rename = "clientId")]
36 client_id: String,
37 message: String,
38 frequencies: serde_json::Value,
39 },
40 Tuned {
42 frequencies: Vec<String>,
43 message: String,
44 },
45 Broadcast {
47 frequency: String,
48 event: serde_json::Value,
49 timestamp: String,
50 },
51 Pong,
53 Error { message: String },
55}
56
57#[derive(Debug, Clone)]
59pub struct RadioConfig {
60 pub url: String,
62 pub auto_reconnect: bool,
64 pub max_reconnect_attempts: u32,
66 pub reconnect_delay_ms: u64,
68 pub max_reconnect_delay_ms: u64,
70 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, max_reconnect_delay_ms: 16000, heartbeat_interval_ms: 30000, }
84 }
85}
86
87impl RadioConfig {
88 pub fn new(url: impl Into<String>) -> Self {
90 Self {
91 url: url.into(),
92 ..Default::default()
93 }
94 }
95
96 pub fn grok() -> Self {
98 Self::new("wss://faf-beacon.wolfejam2020.workers.dev/radio")
99 }
100}