wip: Tauri event system

This commit is contained in:
binarybaron 2024-08-11 23:55:52 +02:00
parent 3135e58187
commit 9b369a042c
No known key found for this signature in database
GPG Key ID: 99B75D3E1476A26E
3 changed files with 142 additions and 148 deletions

View File

@ -11,7 +11,7 @@ use swap::{
},
cli::command::{Bitcoin, Monero},
};
use tauri::{Manager, RunEvent, State};
use tauri::{Emitter, Manager, State};
trait ToStringResult<T> {
fn to_string_result(self) -> Result<T, String>;
@ -89,8 +89,8 @@ fn setup<'a>(app: &'a mut tauri::App) -> Result<(), Box<dyn std::error::Error>>
true,
None,
)
.await
.unwrap();
.await?
.with_tauri_handle(app.app_handle().to_owned());
app.manage(Arc::new(context));
});
@ -107,16 +107,6 @@ pub fn run() {
withdraw_btc
])
.setup(setup)
.build(tauri::generate_context!())
.expect("error while building tauri application")
.run(|app, event| match event {
RunEvent::Exit | RunEvent::ExitRequested { .. } => {
let context = app.state::<Arc<Context>>().inner();
if let Err(err) = context.cleanup() {
println!("Cleanup failed {}", err);
}
}
_ => {}
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

View File

@ -1,7 +1,7 @@
[package]
name = "swap"
version = "0.13.2"
authors = [ "The COMIT guys <hello@comit.network>" ]
authors = ["The COMIT guys <hello@comit.network>"]
edition = "2021"
description = "XMR/BTC trustless atomic swaps."
@ -9,118 +9,7 @@ description = "XMR/BTC trustless atomic swaps."
name = "swap"
[dependencies]
anyhow = "1"
async-compression = { version = "0.3", features = [ "bzip2", "tokio" ] }
async-trait = "0.1"
atty = "0.2"
backoff = { version = "0.4", features = [ "tokio" ] }
base64 = "0.22"
bdk = "0.28"
big-bytes = "1"
bitcoin = { version = "0.29", features = [ "rand", "serde" ] }
bmrng = "0.5"
comfy-table = "7.1"
config = { version = "0.14", default-features = false, features = [ "toml" ] }
conquer-once = "0.4"
curve25519-dalek = { package = "curve25519-dalek-ng", version = "4" }
data-encoding = "2.6"
dialoguer = "0.11"
digest = "0.10.7"
directories-next = "2"
ecdsa_fun = { version = "0.10", default-features = false, features = [
"libsecp_compat",
"serde",
"adaptor",
] }
ed25519-dalek = "1"
erased-serde = "0.4.5"
futures = { version = "0.3", default-features = false }
hex = "0.4"
hyper = "0.14.20"
itertools = "0.13"
jsonrpsee = { version = "0.16.2", features = [ "server" ] }
jsonrpsee-core = "0.16.2"
libp2p = { version = "0.42.2", default-features = false, features = [
"tcp-tokio",
"yamux",
"mplex",
"dns-tokio",
"noise",
"request-response",
"websocket",
"ping",
"rendezvous",
"identify",
] }
monero = { version = "0.12", features = [ "serde_support" ] }
monero-rpc = { path = "../monero-rpc" }
pem = "3.0"
proptest = "1"
qrcode = "0.14"
rand = "0.8"
rand_chacha = "0.3"
reqwest = { version = "0.12", features = [
"http2",
"rustls-tls",
"stream",
"socks",
], default-features = false }
rust_decimal = { version = "1", features = [ "serde-float" ] }
rust_decimal_macros = "1"
serde = { version = "1", features = [ "derive" ] }
serde_cbor = "0.11"
serde_json = "1"
serde_with = { version = "1", features = [ "macros" ] }
sha2 = "0.10"
sigma_fun = { version = "0.7", default-features = false, features = [
"ed25519",
"serde",
"secp256k1",
"alloc",
] }
sqlx = { version = "0.6.3", features = [
"sqlite",
"runtime-tokio-rustls",
"offline",
] }
structopt = "0.3"
strum = { version = "0.26", features = [ "derive" ] }
thiserror = "1"
time = "0.3"
tokio = { version = "1", features = [
"rt-multi-thread",
"time",
"macros",
"sync",
"process",
"fs",
"net",
"parking_lot",
] }
tokio-socks = "0.5"
tokio-tungstenite = { version = "0.15", features = [ "rustls-tls" ] }
tokio-util = { version = "0.7", features = [ "io", "codec" ] }
toml = "0.8"
torut = { version = "0.2", default-features = false, features = [
"v3",
"control",
] }
tower = { version = "0.4.13", features = [ "full" ] }
tower-http = { version = "0.3.4", features = [ "full" ] }
tracing = { version = "0.1", features = [ "attributes" ] }
tracing-appender = "0.2"
tracing-futures = { version = "0.2", features = [ "std-future", "futures-03" ] }
tracing-subscriber = { version = "0.3", default-features = false, features = [
"fmt",
"ansi",
"env-filter",
"time",
"tracing-log",
"json",
] }
url = { version = "2", features = [ "serde" ] }
uuid = { version = "1.9", features = [ "serde", "v4" ] }
void = "1"
tauri = { version = "2.0.0-rc.1" }
[target.'cfg(not(windows))'.dependencies]
tokio-tar = "0.3"
@ -132,7 +21,7 @@ zip = "0.5"
bitcoin-harness = { git = "https://github.com/delta1/bitcoin-harness-rs.git", rev = "80cc8d05db2610d8531011be505b7bee2b5cdf9f" }
get-port = "3"
hyper = "1.3"
jsonrpsee = { version = "0.16.2", features = [ "ws-client" ] }
jsonrpsee = { version = "0.16.2", features = ["ws-client"] }
mockito = "1.4"
monero-harness = { path = "../monero-harness" }
port_check = "0.2"
@ -150,3 +39,114 @@ vergen = { version = "8.3", default-features = false, features = [
"git",
"git2",
] }
async-compression = { version = "0.3", features = ["bzip2", "tokio"] }
async-trait = "0.1"
atty = "0.2"
backoff = { version = "0.4", features = ["tokio"] }
base64 = "0.22"
bdk = "0.28"
big-bytes = "1"
bitcoin = { version = "0.29", features = ["rand", "serde"] }
bmrng = "0.5"
comfy-table = "7.1"
config = { version = "0.14", default-features = false, features = ["toml"] }
conquer-once = "0.4"
curve25519-dalek = { package = "curve25519-dalek-ng", version = "4" }
data-encoding = "2.6"
dialoguer = "0.11"
digest = "0.10.7"
directories-next = "2"
ecdsa_fun = { version = "0.10", default-features = false, features = [
"libsecp_compat",
"serde",
"adaptor",
] }
ed25519-dalek = "1"
erased-serde = "0.4.5"
futures = { version = "0.3", default-features = false }
hex = "0.4"
hyper = "0.14.20"
itertools = "0.13"
jsonrpsee = { version = "0.16.2", features = ["server"] }
jsonrpsee-core = "0.16.2"
libp2p = { version = "0.42.2", default-features = false, features = [
"tcp-tokio",
"yamux",
"mplex",
"dns-tokio",
"noise",
"request-response",
"websocket",
"ping",
"rendezvous",
"identify",
] }
monero = { version = "0.12", features = ["serde_support"] }
monero-rpc = { path = "../monero-rpc" }
pem = "3.0"
proptest = "1"
qrcode = "0.14"
rand = "0.8"
rand_chacha = "0.3"
reqwest = { version = "0.12", features = [
"http2",
"rustls-tls",
"stream",
"socks",
], default-features = false }
rust_decimal = { version = "1", features = ["serde-float"] }
rust_decimal_macros = "1"
serde = { version = "1", features = ["derive"] }
serde_cbor = "0.11"
serde_json = "1"
serde_with = { version = "1", features = ["macros"] }
sha2 = "0.10"
sigma_fun = { version = "0.7", default-features = false, features = [
"ed25519",
"serde",
"secp256k1",
"alloc",
] }
sqlx = { version = "0.6.3", features = [
"sqlite",
"runtime-tokio-rustls",
"offline",
] }
structopt = "0.3"
strum = { version = "0.26", features = ["derive"] }
thiserror = "1"
time = "0.3"
tokio = { version = "1", features = [
"rt-multi-thread",
"time",
"macros",
"sync",
"process",
"fs",
"net",
"parking_lot",
] }
tokio-socks = "0.5"
tokio-tungstenite = { version = "0.15", features = ["rustls-tls"] }
tokio-util = { version = "0.7", features = ["io", "codec"] }
toml = "0.8"
torut = { version = "0.2", default-features = false, features = [
"v3",
"control",
] }
tower = { version = "0.4.13", features = ["full"] }
tower-http = { version = "0.3.4", features = ["full"] }
tracing = { version = "0.1", features = ["attributes"] }
tracing-appender = "0.2"
tracing-futures = { version = "0.2", features = ["std-future", "futures-03"] }
tracing-subscriber = { version = "0.3", default-features = false, features = [
"fmt",
"ansi",
"env-filter",
"time",
"tracing-log",
"json",
] }
url = { version = "2", features = ["serde"] }
uuid = { version = "1.9", features = ["serde", "v4"] }
void = "1"

View File

@ -7,14 +7,15 @@ use crate::network::rendezvous::XmrBtcNamespace;
use crate::protocol::Database;
use crate::seed::Seed;
use crate::{bitcoin, cli, monero};
use anyhow::{anyhow, bail, Context as AnyContext, Error, Result};
use anyhow::{bail, Context as AnyContext, Error, Result};
use futures::future::try_join_all;
use std::fmt;
use std::future::Future;
use std::net::SocketAddr;
use std::path::PathBuf;
use std::sync::{Arc, Mutex, Once};
use tokio::sync::{broadcast, broadcast::Sender, Mutex as TokioMutex, RwLock};
use std::sync::{Arc, Once};
use tauri::AppHandle;
use tokio::sync::{broadcast, broadcast::Sender, Mutex, RwLock};
use tokio::task::JoinHandle;
use url::Url;
@ -36,7 +37,7 @@ pub struct Config {
use uuid::Uuid;
#[derive(Default)]
pub struct PendingTaskList(TokioMutex<Vec<JoinHandle<()>>>);
pub struct PendingTaskList(Mutex<Vec<JoinHandle<()>>>);
impl PendingTaskList {
pub async fn spawn<F, T>(&self, future: F)
@ -164,10 +165,11 @@ pub struct Context {
pub db: Arc<dyn Database + Send + Sync>,
bitcoin_wallet: Option<Arc<bitcoin::Wallet>>,
monero_wallet: Option<Arc<monero::Wallet>>,
monero_rpc_process: Option<Arc<Mutex<monero::WalletRpcProcess>>>,
monero_rpc_process: Option<Arc<monero::WalletRpcProcess>>,
pub swap_lock: Arc<SwapLock>,
pub config: Config,
pub tasks: Arc<PendingTaskList>,
tauri_handle: Option<Arc<AppHandle>>,
}
#[allow(clippy::too_many_arguments)]
@ -228,7 +230,7 @@ impl Context {
db: open_db(data_dir.join("sqlite")).await?,
bitcoin_wallet,
monero_wallet,
monero_rpc_process: monero_rpc_process.map(|prc| Arc::new(Mutex::new(prc))),
monero_rpc_process: monero_rpc_process.map(Arc::new),
config: Config {
tor_socks5_port,
namespace: XmrBtcNamespace::from_is_testnet(is_testnet),
@ -242,11 +244,25 @@ impl Context {
},
swap_lock: Arc::new(SwapLock::new()),
tasks: Arc::new(PendingTaskList::default()),
tauri_handle: None,
};
Ok(context)
}
pub fn with_tauri_handle(mut self, tauri_handle: Arc<AppHandle>) -> Self {
self.tauri_handle = Some(tauri_handle);
self
}
pub fn emit_tauri_event<S: Serialize + Clone>(mut self, event: &str, payload: S) -> Result<()> {
self.tauri_handle
.ok_or_else(|| anyhow!("Tauri handle not set"))?
.emit(event, payload)?;
Ok(())
}
pub async fn for_harness(
seed: Seed,
env_config: EnvConfig,
@ -266,21 +282,9 @@ impl Context {
monero_rpc_process: None,
swap_lock: Arc::new(SwapLock::new()),
tasks: Arc::new(PendingTaskList::default()),
tauri_handle: None,
}
}
pub fn cleanup(&self) -> Result<()> {
if let Some(ref monero_rpc_process) = self.monero_rpc_process {
let mut process = monero_rpc_process
.lock()
.map_err(|_| anyhow!("Failed to lock monero_rpc_process for cleanup"))?;
process.kill()?;
println!("Killed monero-wallet-rpc process");
}
Ok(())
}
}
impl fmt::Debug for Context {