44 lines
1.3 KiB
Rust
44 lines
1.3 KiB
Rust
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<Result<HidReport, Status>>;
|
|
|
|
async fn stream(
|
|
&self,
|
|
request: Request<tonic::Streaming<HidReport>>,
|
|
) -> Result<Response<Self::StreamStream>, 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(())
|
|
}
|