2025-06-02 20:41:36 -05:00
|
|
|
//! navka-server — receive HidReport and write to /dev/hidg0
|
2025-06-16 21:47:01 -05:00
|
|
|
// sever/src/main.rs
|
2025-06-01 16:04:00 -05:00
|
|
|
#![forbid(unsafe_code)]
|
2025-06-01 13:31:22 -05:00
|
|
|
|
2025-06-16 19:42:26 -05:00
|
|
|
use std::{pin::Pin, sync::Arc, panic::AssertUnwindSafe};
|
2025-06-12 01:59:17 -05:00
|
|
|
use tokio::{fs::{File, OpenOptions}, io::AsyncWriteExt, sync::Mutex};
|
2025-06-02 20:41:36 -05:00
|
|
|
use tokio_stream::{wrappers::ReceiverStream, Stream, StreamExt};
|
|
|
|
|
use tonic::{transport::Server, Request, Response, Status};
|
2025-06-16 19:22:40 -05:00
|
|
|
use tracing::{error, info, trace, warn, debug};
|
2025-06-15 22:15:50 -05:00
|
|
|
use tracing_subscriber::{fmt, EnvFilter};
|
2025-06-16 19:42:26 -05:00
|
|
|
use futures_util::FutureExt;
|
2025-06-01 21:26:57 -05:00
|
|
|
|
2025-06-01 16:04:00 -05:00
|
|
|
use navka_common::navka::{
|
2025-06-01 21:26:57 -05:00
|
|
|
relay_server::{Relay, RelayServer},
|
2025-06-17 20:54:31 -05:00
|
|
|
KeyboardReport, MouseReport,
|
2025-06-01 16:04:00 -05:00
|
|
|
};
|
2025-06-02 20:24:00 -05:00
|
|
|
|
2025-06-02 20:41:36 -05:00
|
|
|
struct Handler {
|
2025-06-17 20:54:31 -05:00
|
|
|
kb: Arc<Mutex<tokio::fs::File>>,
|
|
|
|
|
ms: Arc<Mutex<tokio::fs::File>>,
|
2025-06-01 16:04:00 -05:00
|
|
|
}
|
2025-06-01 13:31:22 -05:00
|
|
|
|
2025-06-02 20:41:36 -05:00
|
|
|
#[tonic::async_trait]
|
2025-06-16 22:14:52 -05:00
|
|
|
impl Relay for Handler {
|
2025-06-17 08:17:23 -05:00
|
|
|
type StreamKeyboardStream = ReceiverStream<Result<KeyboardReport, Status>>;
|
|
|
|
|
type StreamMouseStream = ReceiverStream<Result<MouseReport, Status>>;
|
2025-06-01 13:31:22 -05:00
|
|
|
|
2025-06-17 08:17:23 -05:00
|
|
|
async fn stream_keyboard(
|
2025-06-01 13:31:22 -05:00
|
|
|
&self,
|
2025-06-17 08:17:23 -05:00
|
|
|
req: Request<tonic::Streaming<KeyboardReport>>,
|
|
|
|
|
) -> Result<Response<Self::StreamKeyboardStream>, Status> {
|
|
|
|
|
let (tx, rx) = tokio::sync::mpsc::channel(32);
|
2025-06-12 01:57:08 -05:00
|
|
|
let kb = self.kb.clone();
|
2025-06-02 20:41:36 -05:00
|
|
|
|
|
|
|
|
tokio::spawn(async move {
|
2025-06-17 08:17:23 -05:00
|
|
|
let mut s = req.into_inner();
|
2025-06-17 20:54:31 -05:00
|
|
|
while let Some(pkt) = s.next().await.transpose()? {
|
|
|
|
|
kb.lock().await.write_all(&pkt.data).await?;
|
|
|
|
|
tx.send(Ok(pkt)).await;//.ok(); // best-effort echo
|
2025-06-17 08:17:23 -05:00
|
|
|
}
|
|
|
|
|
Ok::<(), Status>(())
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Ok(Response::new(ReceiverStream::new(rx)))
|
|
|
|
|
}
|
2025-06-16 19:19:14 -05:00
|
|
|
|
2025-06-17 08:17:23 -05:00
|
|
|
async fn stream_mouse(
|
|
|
|
|
&self,
|
|
|
|
|
req: Request<tonic::Streaming<MouseReport>>,
|
|
|
|
|
) -> Result<Response<Self::StreamMouseStream>, Status> {
|
2025-06-17 22:36:23 -05:00
|
|
|
let (tx, rx) = tokio::sync::mpsc::channel(4096); // higher burst
|
2025-06-17 08:17:23 -05:00
|
|
|
let ms = self.ms.clone();
|
2025-06-16 19:19:14 -05:00
|
|
|
|
2025-06-17 08:17:23 -05:00
|
|
|
tokio::spawn(async move {
|
|
|
|
|
let mut s = req.into_inner();
|
2025-06-17 20:54:31 -05:00
|
|
|
while let Some(pkt) = s.next().await.transpose()? {
|
|
|
|
|
ms.lock().await.write_all(&pkt.data).await?;
|
|
|
|
|
tx.send(Ok(pkt)).await;//.ok();
|
2025-06-01 13:31:22 -05:00
|
|
|
}
|
2025-06-17 08:17:23 -05:00
|
|
|
Ok::<(), Status>(())
|
2025-06-01 13:31:22 -05:00
|
|
|
});
|
|
|
|
|
|
2025-06-17 08:17:23 -05:00
|
|
|
Ok(Response::new(ReceiverStream::new(rx)))
|
2025-06-01 13:31:22 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tokio::main]
|
2025-06-02 20:41:36 -05:00
|
|
|
async fn main() -> anyhow::Result<()> {
|
2025-06-16 00:10:03 -05:00
|
|
|
fmt().with_env_filter(
|
2025-06-16 00:05:39 -05:00
|
|
|
// honour RUST_LOG but fall back to very chatty defaults
|
2025-06-17 20:54:31 -05:00
|
|
|
EnvFilter::try_from_default_env().unwrap_or_else(|_| //{
|
2025-06-16 00:05:39 -05:00
|
|
|
EnvFilter::new(
|
2025-06-17 20:54:31 -05:00
|
|
|
// "navka_client=trace,\
|
|
|
|
|
// navka_server=trace,\
|
|
|
|
|
// tonic=debug,\
|
|
|
|
|
// h2=debug,\
|
|
|
|
|
// tower=debug",
|
|
|
|
|
"navka_server=info"
|
2025-06-16 00:05:39 -05:00
|
|
|
)
|
2025-06-17 20:54:31 -05:00
|
|
|
//}
|
|
|
|
|
),
|
2025-06-16 00:05:39 -05:00
|
|
|
)
|
2025-06-17 20:54:31 -05:00
|
|
|
// .with_target(true)
|
|
|
|
|
// .with_thread_ids(true)
|
|
|
|
|
// .with_file(true)
|
2025-06-16 00:05:39 -05:00
|
|
|
.init();
|
2025-06-05 22:44:27 -05:00
|
|
|
|
2025-06-12 01:57:08 -05:00
|
|
|
let kb = OpenOptions::new()
|
2025-06-02 20:41:36 -05:00
|
|
|
.write(true)
|
2025-06-17 20:54:31 -05:00
|
|
|
// .read(true)
|
2025-06-06 00:04:55 -05:00
|
|
|
.custom_flags(libc::O_NONBLOCK)
|
2025-06-02 20:41:36 -05:00
|
|
|
.open("/dev/hidg0")
|
|
|
|
|
.await?;
|
2025-06-12 01:57:08 -05:00
|
|
|
|
|
|
|
|
let ms = OpenOptions::new()
|
|
|
|
|
.write(true)
|
2025-06-17 20:54:31 -05:00
|
|
|
// .read(true)
|
2025-06-12 01:57:08 -05:00
|
|
|
.custom_flags(libc::O_NONBLOCK)
|
|
|
|
|
.open("/dev/hidg1")
|
|
|
|
|
.await?;
|
|
|
|
|
|
|
|
|
|
let handler = Handler {
|
|
|
|
|
kb: Arc::new(Mutex::new(kb)),
|
|
|
|
|
ms: Arc::new(Mutex::new(ms)),
|
|
|
|
|
};
|
2025-06-01 16:04:00 -05:00
|
|
|
|
2025-06-02 20:41:36 -05:00
|
|
|
println!("🌐 navka-server listening on 0.0.0.0:50051");
|
2025-06-01 13:31:22 -05:00
|
|
|
Server::builder()
|
2025-06-02 20:41:36 -05:00
|
|
|
.add_service(RelayServer::new(handler))
|
|
|
|
|
.serve(([0, 0, 0, 0], 50051).into())
|
2025-06-01 13:31:22 -05:00
|
|
|
.await?;
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|