lesavka/client/src/app/input_streams.rs

103 lines
4.2 KiB
Rust

impl LesavkaClientApp {
/*──────────────── paste loop ───────────────*/
#[cfg(not(coverage))]
fn paste_loop(
ep: Channel,
mut rx: mpsc::UnboundedReceiver<String>,
) -> tokio::task::JoinHandle<()> {
tokio::spawn(async move {
let mut cli = RelayClient::new(ep.clone());
while let Some(text) = rx.recv().await {
match paste::build_paste_request(&text) {
Ok(req) => match cli.paste_text(Request::new(req)).await {
Ok(resp) => {
let reply = resp.get_ref();
if !reply.ok {
warn!("📋 paste rejected: {}", reply.error);
} else {
debug!("📋 paste delivered");
}
}
Err(e) => {
warn!("📋 paste failed: {e}");
cli = RelayClient::new(ep.clone());
}
},
Err(e) => {
warn!("📋 paste build failed: {e}");
}
}
}
})
}
/*──────────────── keyboard stream ───────────────*/
#[cfg(not(coverage))]
async fn stream_loop_keyboard(&self, ep: Channel) {
loop {
info!("⌨️🤙 Keyboard dial {}", self.server_addr);
let mut cli = RelayClient::new(ep.clone());
let capture_enabled = Arc::clone(&self.remote_capture_enabled);
let mut remote_capture_was_enabled = capture_enabled.load(Ordering::Relaxed);
let outbound =
BroadcastStream::new(self.kbd_tx.subscribe()).filter_map(move |report| {
let remote_capture_enabled = capture_enabled.load(Ordering::Relaxed);
keyboard_stream_report(
report,
remote_capture_enabled,
&mut remote_capture_was_enabled,
)
});
match cli.stream_keyboard(Request::new(outbound)).await {
Ok(mut resp) => {
while let Some(msg) = resp.get_mut().message().await.transpose() {
if let Err(e) = msg {
warn!("⌨️ server err: {e}");
break;
}
}
}
Err(e) => warn!("❌⌨️ connect failed: {e}"),
}
tokio::time::sleep(Duration::from_secs(1)).await; // retry
}
}
/*──────────────── mouse stream ──────────────────*/
#[cfg(not(coverage))]
async fn stream_loop_mouse(&self, ep: Channel) {
loop {
info!("🖱️🤙 Mouse dial {}", self.server_addr);
let mut cli = RelayClient::new(ep.clone());
let capture_enabled = Arc::clone(&self.remote_capture_enabled);
let mut remote_capture_was_enabled = capture_enabled.load(Ordering::Relaxed);
let outbound =
BroadcastStream::new(self.mou_tx.subscribe()).filter_map(move |report| {
let remote_capture_enabled = capture_enabled.load(Ordering::Relaxed);
mouse_stream_report(
report,
remote_capture_enabled,
&mut remote_capture_was_enabled,
)
});
match cli.stream_mouse(Request::new(outbound)).await {
Ok(mut resp) => {
while let Some(msg) = resp.get_mut().message().await.transpose() {
if let Err(e) = msg {
warn!("🖱️ server err: {e}");
break;
}
}
}
Err(e) => warn!("❌🖱️ connect failed: {e}"),
}
tokio::time::sleep(Duration::from_secs(1)).await;
}
}
}