diff --git a/src/lib.rs b/src/lib.rs index 19954ce..8fef16f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,7 +26,9 @@ use js::{Coin, CoinSpend, CoinState, EveProof, Proof, ServerCoin}; use napi::bindgen_prelude::*; use napi::Result; use native_tls::TlsConnector; +use std::collections::HashMap; use std::{net::SocketAddr, sync::Arc}; +use tokio::sync::mpsc::UnboundedSender; use tokio::sync::Mutex; use wallet::{ PossibleLaunchersResponse as RustPossibleLaunchersResponse, @@ -449,6 +451,7 @@ impl Tls { pub struct Peer { inner: Arc, peak: Arc>>, + coin_listeners: Arc>>>, } #[napi] @@ -479,8 +482,10 @@ impl Peer { let inner = Arc::new(peer); let peak = Arc::new(Mutex::new(None)); + let coin_listeners = Arc::new(Mutex::new(HashMap::new())); let peak_clone = peak.clone(); + let coin_listeners_clone = coin_listeners.clone(); tokio::spawn(async move { while let Some(message) = receiver.recv().await { if message.msg_type == ProtocolMessageTypes::NewPeakWallet { @@ -492,7 +497,11 @@ impl Peer { } }); - Ok(Self { inner, peak }) + Ok(Self { + inner, + peak, + coin_listeners, + }) } #[napi] diff --git a/src/wallet.rs b/src/wallet.rs index b9b6e8a..3880593 100644 --- a/src/wallet.rs +++ b/src/wallet.rs @@ -1176,3 +1176,33 @@ pub async fn look_up_possible_launchers( .collect(), }) } + +pub async fn subscribe_to_coin_states( + peer: &Peer, + coin_id: Bytes32, + previous_height: Option, + previous_header_hash: Bytes32, +) -> Result, WalletError> { + let response = peer + .request_coin_state(vec![coin_id], previous_height, previous_header_hash, true) + .await + .map_err(WalletError::Client)? + .map_err(|_| WalletError::RejectCoinState)?; + + if let Some(coin_state) = response.coin_states.first() { + return Ok(coin_state.spent_height); + } + + Err(WalletError::UnknownCoin) +} + +pub async fn unsubscribe_from_coin_states( + peer: &Peer, + coin_id: Bytes32, +) -> Result<(), WalletError> { + peer.remove_coin_subscriptions(Some(vec![coin_id])) + .await + .map_err(WalletError::Client)?; + + Ok(()) +}