use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConnectionState {
Disconnected,
Connecting,
Connected,
Reconnecting,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "action", rename_all = "lowercase")]
pub enum ClientAction {
Tune { frequencies: Vec<String> },
Untune { frequencies: Vec<String> },
Ping,
Broadcast {
frequency: String,
event: serde_json::Value,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum ServerMessage {
Connected {
#[serde(rename = "clientId")]
client_id: String,
message: String,
frequencies: serde_json::Value,
},
Tuned {
frequencies: Vec<String>,
message: String,
},
Broadcast {
frequency: String,
event: serde_json::Value,
timestamp: String,
},
Pong,
Error { message: String },
}
#[derive(Debug, Clone)]
pub struct RadioConfig {
pub url: String,
pub auto_reconnect: bool,
pub max_reconnect_attempts: u32,
pub reconnect_delay_ms: u64,
pub max_reconnect_delay_ms: u64,
pub heartbeat_interval_ms: u64,
}
impl Default for RadioConfig {
fn default() -> Self {
Self {
url: String::new(),
auto_reconnect: true,
max_reconnect_attempts: 5,
reconnect_delay_ms: 1000, max_reconnect_delay_ms: 16000, heartbeat_interval_ms: 30000, }
}
}
impl RadioConfig {
pub fn new(url: impl Into<String>) -> Self {
Self {
url: url.into(),
..Default::default()
}
}
pub fn grok() -> Self {
Self::new("wss://faf-beacon.wolfejam2020.workers.dev/radio")
}
}