From e5ffe31ca77b251ed11b92441a374f8c2f57fccf Mon Sep 17 00:00:00 2001 From: victor Date: Wed, 17 Sep 2025 23:25:31 +0200 Subject: [PATCH] bless --- native_client/Cargo.lock | 196 +++++++++++++------- native_client/Cargo.toml | 5 +- native_client/src/backend/wallet.rs | 30 ++- native_client/src/backend/ws_client.rs | 45 ++++- native_client/src/frontend/message.rs | 0 native_client/src/frontend/pages/tx_page.rs | 1 - native_client/src/lib.rs | 1 + native_client/src/main.rs | 23 ++- native_client/src/messages/client.rs | 3 + native_client/src/messages/error.rs | 12 ++ 10 files changed, 222 insertions(+), 94 deletions(-) delete mode 100644 native_client/src/frontend/message.rs create mode 100644 native_client/src/messages/client.rs diff --git a/native_client/Cargo.lock b/native_client/Cargo.lock index e640b55..2881cfc 100644 --- a/native_client/Cargo.lock +++ b/native_client/Cargo.lock @@ -28,6 +28,15 @@ dependencies = [ "serde", ] +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + [[package]] name = "adler2" version = "2.0.1" @@ -238,6 +247,21 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + [[package]] name = "base16ct" version = "0.2.0" @@ -1361,6 +1385,12 @@ dependencies = [ "wasi 0.14.5+wasi-0.2.4", ] +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + [[package]] name = "gl_generator" version = "0.14.0" @@ -1774,6 +1804,17 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + [[package]] name = "io_tee" version = "0.1.1" @@ -1993,6 +2034,17 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + [[package]] name = "moxcms" version = "0.7.5" @@ -2034,10 +2086,13 @@ dependencies = [ "bincode", "eframe", "egui", + "futures-util", "hex", "serde", "shared", - "tungstenite", + "thiserror 2.0.16", + "tokio", + "tokio-tungstenite", "vlogger", "watchlet", ] @@ -2391,6 +2446,15 @@ dependencies = [ "objc2-foundation 0.2.2", ] +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -2774,20 +2838,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - [[package]] name = "ron" version = "0.10.1" @@ -2856,6 +2906,12 @@ dependencies = [ "walkdir", ] +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2903,36 +2959,6 @@ dependencies = [ "windows-sys 0.61.0", ] -[[package]] -name = "rustls" -version = "0.23.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" -dependencies = [ - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" - -[[package]] -name = "rustls-webpki" -version = "0.103.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - [[package]] name = "rustversion" version = "1.0.22" @@ -3115,6 +3141,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -3197,6 +3232,16 @@ dependencies = [ "serde", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "spki" version = "0.7.3" @@ -3348,6 +3393,49 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + [[package]] name = "toml" version = "0.5.11" @@ -3408,12 +3496,9 @@ dependencies = [ "httparse", "log", "rand 0.9.2", - "rustls", - "rustls-pki-types", "sha1", "thiserror 2.0.16", "utf-8", - "webpki-roots", ] [[package]] @@ -3478,12 +3563,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - [[package]] name = "unty" version = "0.0.4" @@ -3810,15 +3889,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "webpki-roots" -version = "0.26.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "weezl" version = "0.1.10" diff --git a/native_client/Cargo.toml b/native_client/Cargo.toml index 65be67b..77eb27d 100644 --- a/native_client/Cargo.toml +++ b/native_client/Cargo.toml @@ -17,6 +17,9 @@ serde = { version = "1.0.219", features = ["derive"] } watchlet = { path = "../watchlet" } hex = "0.4.3" vlogger = { path = "../vlogger" } -tungstenite = { version = "0.27.0", features = ["rustls-tls-webpki-roots"] } bincode = { version = "2.0.1", features = ["serde"] } shared = { path = "../shared" } +tokio = { version = "1.47.1", features = ["full", "rt-multi-thread"] } +tokio-tungstenite = "0.27.0" +thiserror = "2.0.16" +futures-util = "0.3.31" diff --git a/native_client/src/backend/wallet.rs b/native_client/src/backend/wallet.rs index b66b19a..cad9623 100644 --- a/native_client/src/backend/wallet.rs +++ b/native_client/src/backend/wallet.rs @@ -1,9 +1,10 @@ -use std::sync::mpsc::{Receiver, RecvTimeoutError, Sender}; -use std::time::Duration; +use shared::WsClientRequest; +use tokio::sync::mpsc::{Receiver, Sender}; use vlogger::*; use watchlet::{FileStorage, Wallet, WalletManager}; +use crate::messages::client::ClientMessage; use crate::messages::error::SystemError; use crate::messages::frontend::FrontendMessage; use crate::messages::backend::BackendMessage; @@ -20,14 +21,16 @@ pub struct WalletState { pub struct WalletService { exit: bool, receiver: Receiver, - sender: Sender, + fr_sender: Sender, + ws_sender: Sender, wallet_manager: WalletManager, } impl WalletService { pub fn new( receiver: Receiver, - sender: Sender, + fr_sender: Sender, + ws_sender: Sender, ) -> Self { let wallet_path = path::PathBuf::from(format!("{}/wallet/wallet.age", DATA_DIR_PATH)); let storage = FileStorage::new(wallet_path.into()); @@ -36,7 +39,8 @@ impl WalletService { Self { exit: false, receiver, - sender, + fr_sender, + ws_sender, wallet_manager } } @@ -59,7 +63,7 @@ impl WalletService { } } - pub fn handle_cmd(&mut self, cmd: BackendMessage) { + pub async fn handle_cmd(&mut self, cmd: BackendMessage) { log!(DEBUG, "Received Command: {:#?}", cmd); match cmd { BackendMessage::StateRequest => { @@ -67,7 +71,7 @@ impl WalletService { Some(state) => FrontendMessage::StateResponse(state), None => FrontendMessage::Error(SystemError::WalletNotLoaded), }; - if let Err(e) = self.sender.send(msg) { + if let Err(e) = self.sender.send(msg).await { log!(ERROR, "Failed to send FrontendMessage: {e}"); } }, @@ -77,16 +81,10 @@ impl WalletService { } } - pub fn run(&mut self) { + pub async fn run(&mut self) { while !self.exit { - match self.receiver.recv_timeout(Duration::from_secs(30)) { - Ok(cmd) => self.handle_cmd(cmd), - Err(e) => match e { - RecvTimeoutError::Timeout => { - self.update() - }, - RecvTimeoutError::Disconnected => {}, - } + if let Some(cmd) = self.receiver.recv().await { + self.handle_cmd(cmd).await; } } } diff --git a/native_client/src/backend/ws_client.rs b/native_client/src/backend/ws_client.rs index 2317386..88d951f 100644 --- a/native_client/src/backend/ws_client.rs +++ b/native_client/src/backend/ws_client.rs @@ -1,12 +1,47 @@ -use shared::WsClientRequest; +use tokio::sync::mpsc::{Receiver, Sender}; +use futures_util::{SinkExt, StreamExt}; +use tokio_tungstenite::tungstenite::Message; -pub fn run_client() { - let (mut stream, _response) = tungstenite::connect("ws://localhost:9001").unwrap(); +use shared::{ WsClientRequest, WsClientResponse }; + +use crate::messages::{backend::BackendMessage, client::ClientMessage }; +use crate::messages::error::WsClientError; + +pub async fn run_client(tx: Sender, mut rx: Receiver) -> Result<(), WsClientError> { + let (mut socket, _response) = tokio_tungstenite::connect_async("ws://localhost:9001").await?; let msg = bincode::encode_to_vec(WsClientRequest::Ping, bincode::config::standard()).unwrap(); - stream.send(msg.into()).unwrap(); + socket.send(msg.into()); + + let bincode_config = bincode::config::standard(); loop { - println!("{:#?}", stream.read()) + tokio::select! { + cl_msg_res = rx.recv() => { + if let Some(cmd) = cl_msg_res { + } + } + ws_msg_res = socket.next() => { + if let Some(cmd) = ws_msg_res { + match cmd { + Ok(msg) => { + match msg { + Message::Text(b) => { + + } + Message::Binary(mes_bytes) => { + let (msg, _) = bincode::decode_from_slice::(&mes_bytes, bincode_config)?; + match msg { + WsClientResponse::Pong => {} + } + } + _ => {} + } + }, + Err(e) => {} + } + } + } + } } } diff --git a/native_client/src/frontend/message.rs b/native_client/src/frontend/message.rs deleted file mode 100644 index e69de29..0000000 diff --git a/native_client/src/frontend/pages/tx_page.rs b/native_client/src/frontend/pages/tx_page.rs index 6a12ee5..f57fb04 100644 --- a/native_client/src/frontend/pages/tx_page.rs +++ b/native_client/src/frontend/pages/tx_page.rs @@ -22,7 +22,6 @@ const TX_FIELDS: &[&str] = &[ "Amount:", ]; - impl DisplayPage for TransactionPage { fn show(&mut self, tx: &Sender, ctx: &egui::Context) { ctx.input(|input| { diff --git a/native_client/src/lib.rs b/native_client/src/lib.rs index c091f7c..7ff2939 100644 --- a/native_client/src/lib.rs +++ b/native_client/src/lib.rs @@ -24,6 +24,7 @@ pub mod messages { pub mod frontend; pub mod backend; pub mod error; + pub mod client; } pub mod backend { diff --git a/native_client/src/main.rs b/native_client/src/main.rs index ac6f03a..5d8abd1 100644 --- a/native_client/src/main.rs +++ b/native_client/src/main.rs @@ -1,8 +1,8 @@ #![warn(clippy::all, rust_2018_idioms)] #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -use native_client::{backend::{wallet::WalletService, ws_client::run_client}, frontend, messages::{backend::BackendMessage, frontend::FrontendMessage}}; -use std::sync::mpsc::{self, Receiver, Sender}; +use native_client::{backend::{wallet::WalletService, ws_client}, frontend, messages::{backend::BackendMessage, client::ClientMessage, frontend::FrontendMessage}}; +use tokio::sync::mpsc::{self, Receiver, Sender}; fn dispatch_frontend( receiver: Receiver, @@ -14,6 +14,7 @@ fn dispatch_frontend( .with_min_inner_size([300.0, 220.0]), ..Default::default() }; + eframe::run_native( "eframe template", native_options, @@ -21,17 +22,23 @@ fn dispatch_frontend( ) } -fn main() -> Result<(), std::io::Error> { - let (front_tx, front_rx) = mpsc::channel::(); - let (back_tx, back_rx) = mpsc::channel::(); +#[tokio::main] +async fn main() -> Result<(), std::io::Error> { + let (front_tx, front_rx) = mpsc::channel::(100); + let (back_tx, back_rx) = mpsc::channel::(100); + let (client_tx, client_rx) = mpsc::channel::(100); - - let backend_handle = std::thread::spawn( || { + let backend_handle = std::thread::spawn(|| { let mut wallet_service = WalletService::new(back_rx, front_tx); wallet_service.run(); }); - let _ = dispatch_frontend(front_rx, back_tx); + let ws_client_handle = std::thread::spawn({ + let tx = back_tx.clone(); + || ws_client::run_client(tx, client_rx) + }); + + let _res = dispatch_frontend(front_rx, back_tx); backend_handle.join().unwrap(); Ok(()) diff --git a/native_client/src/messages/client.rs b/native_client/src/messages/client.rs new file mode 100644 index 0000000..fffb4db --- /dev/null +++ b/native_client/src/messages/client.rs @@ -0,0 +1,3 @@ +pub enum ClientMessage { + Shutdown, +} diff --git a/native_client/src/messages/error.rs b/native_client/src/messages/error.rs index 27ca5fc..4c2d519 100644 --- a/native_client/src/messages/error.rs +++ b/native_client/src/messages/error.rs @@ -1,4 +1,16 @@ +use thiserror::Error; + #[derive(Debug)] pub enum SystemError { WalletNotLoaded } + +#[derive(Debug, Error)] +pub enum WsClientError { + #[error("WS Error: {0}")] + WsError(#[from] tokio_tungstenite::tungstenite::Error), + #[error("Decode Error: {0}")] + DecodeError(#[from] bincode::error::DecodeError), + #[error("Encode Error: {0}")] + EncodeError(#[from] bincode::error::EncodeError), +}