use crate::compat;
#[cfg(not(target_arch = "wasm32"))]
mod native;
#[cfg(target_arch = "wasm32")]
mod wasm;
mod connection;
mod control;
mod message;
mod ping;
use connection::Status;
use control::Event;
pub use message::WebsocketEvent;
use tokio::sync::broadcast;
use bitcoin::ScriptBuf;
#[derive(Clone)]
pub struct Client {
manager: connection::Manager,
}
impl Client {
pub fn new(ws_url: String) -> Self {
Self {
manager: connection::Manager::new(ws_url),
}
}
pub async fn start(&self, wait_for_connection: bool) {
log::trace!("starting websocket");
log::trace!("spawning thread to start connection");
let mut manager = self.manager.clone();
compat::spawn(async move {
manager.start().await;
});
log::trace!("waiting for socket to finish trying to connect");
if wait_for_connection {
let mut rx = self.manager.subscribe_to_status();
loop {
let event = rx.recv().await;
if let Ok(Status::Connected | Status::Offline) = event {
log::trace!("Initial websocket connection established!");
break;
}
log::trace!("socket manager state changed to {:?}", event);
}
log::trace!("returning from socket::start");
}
}
pub async fn stop(&self, wait_for_close: bool) {
log::trace!("starting websocket");
let fut = self.manager.stop();
if wait_for_close {
log::trace!("waiting for websocket to close");
fut.await;
}
log::trace!("returning from socket::stop");
}
pub fn subscribe(&self) -> broadcast::Receiver<WebsocketEvent> {
self.manager.subscribe_to_messages()
}
pub fn track_scriptpubkeys(&self, scriptpubkeys: &[ScriptBuf]) {
log::trace!("socket track_scriptpubkeys");
self.manager.track_scriptpubkeys(scriptpubkeys.to_vec());
}
pub fn untrack_scriptpubkeys(&self, scriptpubkeys: &[ScriptBuf]) {
log::trace!("socket untrack_scriptpubkeys");
self.manager.untrack_scriptpubkeys(scriptpubkeys.to_vec());
}
}