This commit is contained in:
victor 2025-09-17 23:25:31 +02:00
parent 79bc2958ef
commit e5ffe31ca7
10 changed files with 222 additions and 94 deletions

196
native_client/Cargo.lock generated
View File

@ -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"

View File

@ -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"

View File

@ -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<BackendMessage>,
sender: Sender<FrontendMessage>,
fr_sender: Sender<FrontendMessage>,
ws_sender: Sender<ClientMessage>,
wallet_manager: WalletManager<FileStorage>,
}
impl WalletService {
pub fn new(
receiver: Receiver<BackendMessage>,
sender: Sender<FrontendMessage>,
fr_sender: Sender<FrontendMessage>,
ws_sender: Sender<ClientMessage>,
) -> 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;
}
}
}

View File

@ -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<BackendMessage>, mut rx: Receiver<ClientMessage>) -> 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::<WsClientResponse, _>(&mes_bytes, bincode_config)?;
match msg {
WsClientResponse::Pong => {}
}
}
_ => {}
}
},
Err(e) => {}
}
}
}
}
}
}

View File

@ -22,7 +22,6 @@ const TX_FIELDS: &[&str] = &[
"Amount:",
];
impl DisplayPage for TransactionPage {
fn show(&mut self, tx: &Sender<BackendMessage>, ctx: &egui::Context) {
ctx.input(|input| {

View File

@ -24,6 +24,7 @@ pub mod messages {
pub mod frontend;
pub mod backend;
pub mod error;
pub mod client;
}
pub mod backend {

View File

@ -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<FrontendMessage>,
@ -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::<FrontendMessage>();
let (back_tx, back_rx) = mpsc::channel::<BackendMessage>();
#[tokio::main]
async fn main() -> Result<(), std::io::Error> {
let (front_tx, front_rx) = mpsc::channel::<FrontendMessage>(100);
let (back_tx, back_rx) = mpsc::channel::<BackendMessage>(100);
let (client_tx, client_rx) = mpsc::channel::<ClientMessage>(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(())

View File

@ -0,0 +1,3 @@
pub enum ClientMessage {
Shutdown,
}

View File

@ -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),
}