adding client suicide & dev mode
This commit is contained in:
parent
7156009caa
commit
7bf6d22709
@ -41,36 +41,46 @@ impl NavkaClientApp {
|
|||||||
// 3) Start reading from all keyboards in a background task
|
// 3) Start reading from all keyboards in a background task
|
||||||
let mut aggregator = KeyboardAggregator::new(tx.clone());
|
let mut aggregator = KeyboardAggregator::new(tx.clone());
|
||||||
aggregator.init_devices()?; // discover & grab
|
aggregator.init_devices()?; // discover & grab
|
||||||
let input_task = tokio::spawn(async move {
|
let kb_handle = tokio::spawn(async move {
|
||||||
if let Err(e) = aggregator.run().await {
|
if let Err(e) = aggregator.run().await {
|
||||||
tracing::error!("KeyboardAggregator failed: {e}");
|
tracing::error!("KeyboardAggregator failed: {e}");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 4) Add 30 second suicide for dev mode
|
// 4) Add 30 second suicide for dev mode
|
||||||
if self.dev_mode {
|
let suicide_fut = async {
|
||||||
// dev mode: we do a 30-second kill
|
if std::env::var_os("NAVKA_DEV_MODE").is_some() {
|
||||||
info!("NAVKA_DEV_MODE: aggregator will time out in 30 seconds");
|
tracing::info!("DEV-mode: will exit in 30 s");
|
||||||
match timeout(Duration::from_secs(30), input_task).await {
|
tokio::time::sleep(Duration::from_secs(30)).await;
|
||||||
Ok(_) => {
|
Err::<(), _>(anyhow::anyhow!("dev-mode timer expired")) // cause select! branch to win
|
||||||
info!("aggregator finished within 30s");
|
|
||||||
}
|
|
||||||
Err(_) => {
|
|
||||||
tracing::warn!("dev mode: aggregator didn’t finish in 30s -> kill navka-client");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::process::exit(0);
|
|
||||||
} else {
|
} else {
|
||||||
// normal mode: read aggregator forever
|
futures::future::pending().await
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// 5) Inbound loop: we do something with reports from the server, e.g. logging:
|
// 5) Inbound loop: we do something with reports from the server, e.g. logging:
|
||||||
|
let inbound_fut = async {
|
||||||
while let Some(report) = inbound.message().await? {
|
while let Some(report) = inbound.message().await? {
|
||||||
tracing::info!(?report.data, "echo from server");
|
tracing::debug!(?report.data, "msg from server");
|
||||||
|
}
|
||||||
|
Err::<(), _>(anyhow::anyhow!("server closed stream"))
|
||||||
|
};
|
||||||
|
|
||||||
|
// 6) Race the futures
|
||||||
|
tokio::select! {
|
||||||
|
res = inbound_fut => {
|
||||||
|
tracing::warn!("Inbound stream ended: {res:?}");
|
||||||
|
},
|
||||||
|
res = kb_handle => {
|
||||||
|
tracing::warn!("Keyboard task finished: {res:?}");
|
||||||
|
},
|
||||||
|
res = suicide_fut => {
|
||||||
|
tracing::warn!("Dev-mode shutdown: {res:?}");
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6) If inbound stream ends, stop the input task
|
// 7) If inbound stream ends, stop the input task
|
||||||
input_task.abort();
|
kb_handle.abort();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,16 +28,18 @@ install -Dm755 "$SRC/client/target/release/navka-client" "$HOME/.local/bin/navka
|
|||||||
mkdir -p "$HOME/.config/systemd/user"
|
mkdir -p "$HOME/.config/systemd/user"
|
||||||
cat >"$HOME/.config/systemd/user/navka-client.service" <<'EOF'
|
cat >"$HOME/.config/systemd/user/navka-client.service" <<'EOF'
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Navka Client (keyboard/mouse → navka-server)
|
Description=Navka Client (keyboard/mouse -> navka-server)
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
Wants=network-online.target
|
Wants=network-online.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/local/bin/navka-client
|
||||||
Environment=RUST_LOG=debug
|
Environment=RUST_LOG=debug
|
||||||
Environment=NAVKA_DEV_MODE=1
|
Environment=NAVKA_DEV_MODE=1
|
||||||
Environment=NAVKA_SERVER_ADDR=http://64.25.10.31:50051
|
Environment=NAVKA_SERVER_ADDR=http://64.25.10.31:50051
|
||||||
ExecStart=%h/.local/bin/navka-client
|
ExecStart=%h/.local/bin/navka-client
|
||||||
Restart=on-failure
|
Restart=no
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=default.target
|
WantedBy=default.target
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user