use core::net::Ipv4Addr;
#[cfg(any(
feature = "bitcoind",
feature = "utreexod",
feature = "electrs",
feature = "electrumx"
))]
use std::io::{BufRead, BufReader, Read};
use std::net::TcpListener;
use std::path::PathBuf;
use std::time::Duration;
pub use serde_json;
use tempfile::TempDir;
#[cfg(any(
feature = "bitcoind",
feature = "utreexod",
feature = "electrs",
feature = "electrumx"
))]
use tracing::info;
#[allow(unused)]
#[cfg(feature = "bitcoind")]
pub(crate) use bitcoind::BitcoinD;
#[allow(unused)]
#[cfg(feature = "electrs")]
pub(crate) use electrsd::ElectrsD;
#[allow(unused)]
#[cfg(feature = "electrumx")]
pub(crate) use electrumxd::ElectrumxD;
#[allow(unused)]
#[cfg(feature = "utreexod")]
pub(crate) use utreexod::UtreexoD;
pub use crate::error::Error;
#[cfg(feature = "bitcoind")]
pub mod bitcoind;
#[cfg(feature = "electrs")]
pub mod electrsd;
#[cfg(feature = "electrumx")]
pub mod electrumxd;
pub mod error;
pub mod node;
#[cfg(feature = "utreexod")]
pub mod utreexod;
const IPV4_LOCALHOST: Ipv4Addr = Ipv4Addr::new(127, 0, 0, 1);
pub const SPAWN_ATTEMPTS: u8 = 5;
pub const SPAWN_INTERVAL: Duration = Duration::from_millis(500);
pub const POLL_INTERVAL: Duration = Duration::from_millis(100);
pub const WAIT_TIMEOUT: Duration = Duration::from_secs(10);
pub const CONNECTION_INTERVAL: Duration = Duration::from_millis(150);
pub const CONNECTION_TIMEOUT: Duration = Duration::from_secs(5);
#[inline]
pub fn get_available_port() -> u16 {
TcpListener::bind((IPV4_LOCALHOST, 0))
.unwrap()
.local_addr()
.unwrap()
.port()
}
#[cfg(any(
feature = "bitcoind",
feature = "utreexod",
feature = "electrs",
feature = "electrumx"
))]
pub(crate) fn pipe_to_tracing<R: Read + Send + 'static>(reader: R, source: &'static str) {
std::thread::spawn(move || {
let mut lines = BufReader::new(reader).lines();
while let Some(Ok(line)) = lines.next() {
if !line.trim().is_empty() {
info!("{source}: {line}");
}
}
});
}
#[derive(Debug)]
pub enum DataDir {
Persistent(PathBuf),
Temporary(TempDir),
}
impl DataDir {
pub fn path(&self) -> PathBuf {
match self {
Self::Persistent(path) => path.to_owned(),
Self::Temporary(tmp_dir) => tmp_dir.path().to_path_buf(),
}
}
}