agent: config.rs — CLI args (server, session, fps, quality, display, audio, heartbeat, reconnect)
This commit is contained in:
parent
56f6e88389
commit
5a26c7c60e
90
agent/src/config.rs
Normal file
90
agent/src/config.rs
Normal file
@ -0,0 +1,90 @@
|
||||
//! Agent configuration parsed from CLI arguments and environment variables.
|
||||
|
||||
use clap::Parser;
|
||||
use std::time::Duration;
|
||||
|
||||
/// Butterfly Desktop Agent — captures display from this machine and streams
|
||||
/// it to a Butterfly server. Also receives and executes HUD commands (mouse,
|
||||
/// keyboard) from remote viewers for full remote control.
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(name = "butterfly-agent", version, about)]
|
||||
pub struct AgentConfig {
|
||||
/// WebSocket URL of the Butterfly server.
|
||||
///
|
||||
/// Example: ws://192.168.1.100:8080
|
||||
/// The agent will connect to ws://<server>/ws/<session_id>?client_type=agent
|
||||
#[arg(long, default_value = "ws://localhost:8080", env = "BUTTERFLY_SERVER")]
|
||||
pub server: String,
|
||||
|
||||
/// Session ID to connect to. If not provided, the agent will request the
|
||||
/// server to create a new session via REST API first.
|
||||
#[arg(long, env = "BUTTERFLY_SESSION_ID")]
|
||||
pub session_id: Option<String>,
|
||||
|
||||
/// Target capture frame rate (frames per second).
|
||||
#[arg(long, default_value_t = 30, env = "BUTTERFLY_FPS")]
|
||||
pub fps: u32,
|
||||
|
||||
/// JPEG encoding quality (1–100). Lower = smaller frames, less quality.
|
||||
#[arg(long, default_value_t = 60, env = "BUTTERFLY_QUALITY")]
|
||||
pub quality: u8,
|
||||
|
||||
/// Index of the display to capture (0 = primary, 1 = second, etc.).
|
||||
#[arg(long, default_value_t = 0, env = "BUTTERFLY_DISPLAY")]
|
||||
pub display: usize,
|
||||
|
||||
/// Enable audio capture and streaming.
|
||||
#[arg(long, default_value_t = false, env = "BUTTERFLY_AUDIO")]
|
||||
pub audio: bool,
|
||||
|
||||
/// Heartbeat interval in seconds.
|
||||
#[arg(long, default_value_t = 15, env = "BUTTERFLY_HEARTBEAT")]
|
||||
pub heartbeat_secs: u64,
|
||||
|
||||
/// Reconnection delay in seconds (0 = no reconnect).
|
||||
#[arg(long, default_value_t = 3, env = "BUTTERFLY_RECONNECT_DELAY")]
|
||||
pub reconnect_delay_secs: u64,
|
||||
|
||||
/// Maximum reconnection attempts (0 = infinite).
|
||||
#[arg(long, default_value_t = 0, env = "BUTTERFLY_MAX_RECONNECT")]
|
||||
pub max_reconnect: u32,
|
||||
}
|
||||
|
||||
impl AgentConfig {
|
||||
/// Parse configuration from CLI arguments.
|
||||
pub fn parse_args() -> Self {
|
||||
Self::parse()
|
||||
}
|
||||
|
||||
/// Duration between captured frames.
|
||||
pub fn frame_interval(&self) -> Duration {
|
||||
Duration::from_secs_f64(1.0 / self.fps as f64)
|
||||
}
|
||||
|
||||
/// Duration between heartbeat messages.
|
||||
pub fn heartbeat_interval(&self) -> Duration {
|
||||
Duration::from_secs(self.heartbeat_secs)
|
||||
}
|
||||
|
||||
/// Duration to wait before reconnecting.
|
||||
pub fn reconnect_delay(&self) -> Duration {
|
||||
Duration::from_secs(self.reconnect_delay_secs)
|
||||
}
|
||||
|
||||
/// Build the full WebSocket URL for a given session ID.
|
||||
pub fn ws_url(&self, session_id: &str) -> String {
|
||||
format!(
|
||||
"{}/ws/{}?client_type=agent",
|
||||
self.server.trim_end_matches('/'),
|
||||
session_id
|
||||
)
|
||||
}
|
||||
|
||||
/// Build the REST API base URL.
|
||||
pub fn api_base(&self) -> String {
|
||||
format!(
|
||||
"{}/api",
|
||||
self.server.replace("ws://", "http://").replace("wss://", "https://")
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user