use navka_common::navka::{relay_server::{Relay, RelayServer}, HidReport}; use tokio::{fs::OpenOptions, io::AsyncWriteExt, sync::mpsc}; use tokio_stream::wrappers::ReceiverStream; use tonic::{transport::Server, Request, Response, Status}; const HID_DEV: &str = "/dev/hidg0"; #[derive(Default)] struct RelaySvc; #[tonic::async_trait] impl Relay for RelaySvc { type StreamStream = ReceiverStream>; async fn stream( &self, request: Request>, ) -> Result, Status> { let mut inbound = request.into_inner(); let (tx, rx) = mpsc::channel(8); // writer task: client → hidg0 tokio::spawn(async move { let mut hid = OpenOptions::new().write(true).open(HID_DEV).await.unwrap(); while let Some(Ok(report)) = inbound.message().await { hid.write_all(&report.data).await.unwrap(); } }); // nothing to send back yet Ok(Response::new(ReceiverStream::new(rx))) } } #[tokio::main] async fn main() -> anyhow::Result<()> { let addr = "0.0.0.0:4000".parse()?; Server::builder() .add_service(RelayServer::new(RelaySvc::default())) .serve(addr) .await?; Ok(()) }