diff --git a/server/src/main.rs b/server/src/main.rs index 6613abd..a761b8f 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -9,7 +9,7 @@ use tokio::{fs::{OpenOptions}, io::AsyncWriteExt, sync::Mutex}; use tokio_stream::{wrappers::ReceiverStream}; use tonic::{transport::Server, Request, Response, Status}; use anyhow::Context as _; -use tracing::{info, trace, warn}; +use tracing::{info, trace, warn, error}; use tracing_subscriber::{filter::EnvFilter, fmt, prelude::*}; use tracing_appender::non_blocking; use tracing_appender::non_blocking::WorkerGuard; @@ -50,6 +50,32 @@ fn init_tracing() -> anyhow::Result { Ok(guard) } +async fn open_with_retry( + path: &str, + retries: usize, + delay_ms: u64, +) -> anyhow::Result { + for attempt in 0..=retries { + match OpenOptions::new() + .write(true) + .custom_flags(libc::O_NONBLOCK) + .open(path) + .await + { + Ok(f) => { + info!("βœ… opened {path} on attempt #{attempt}"); + return Ok(f); + } + Err(e) if attempt < retries => { + warn!("πŸ•’ {path} not ready ({e}); retrying… #{attempt}"); // will retry + tokio::time::sleep(Duration::from_millis(delay_ms)).await; + } + Err(e) => return Err(e).with_context(|| format!("giving up on {path}")), + } + } + unreachable!() +} + /*─────────────────── tonic service ─────────────────────*/ struct Handler { kb: Arc>, @@ -63,14 +89,8 @@ impl Handler { gadget.cycle()?; tokio::time::sleep(Duration::from_secs(1)).await; - let kb = OpenOptions::new() - .write(true).custom_flags(libc::O_NONBLOCK) - .open("/dev/hidg0").await - .context("opening /dev/hidg0")?; - let ms = OpenOptions::new() - .write(true).custom_flags(libc::O_NONBLOCK) - .open("/dev/hidg1").await - .context("opening /dev/hidg1")?; + let kb = open_with_retry("/dev/hidg0", 10, 100).await?; + let ms = open_with_retry("/dev/hidg1", 10, 100).await?; Ok(Self { kb: Arc::new(Mutex::new(kb)), ms: Arc::new(Mutex::new(ms)), @@ -219,10 +239,15 @@ async fn main() -> anyhow::Result<()> { // } // }); - println!("🌐 lesavka-server listening on 0.0.0.0:50051"); - Server::builder() - .add_service(RelayServer::new(handler)) - .serve(([0, 0, 0, 0], 50051).into()) - .await?; + info!("🌐 lesavka‑server listening on 0.0.0.0:50051"); + + if let Err(e) = Server::builder() + .add_service(RelayServer::new(handler)) + .serve(([0, 0, 0, 0], 50051).into()) + .await + { + error!("πŸ’₯ gRPC server exited: {e:#}"); + std::process::exit(1); + } Ok(()) }