use wasm_bindgen::prelude::*;
use super::node_conf::NodeConf;
use crate::{
block_header::{BlockHeader, BlockId},
error_conversion::to_js,
nipopow::NipopowProof,
transaction::TxId,
};
use bounded_vec::NonEmptyVec;
use std::time::Duration;
#[wasm_bindgen]
pub fn get_info(node: &NodeConf) -> js_sys::Promise {
#[allow(clippy::clone_on_copy)]
let node_cloned = node.0.clone();
wasm_bindgen_futures::future_to_promise(async move {
let info = ergo_lib::ergo_rest::api::node::get_info(node_cloned)
.await
.map_err(to_js)
.map(super::node_info::NodeInfo::from)?;
Ok(wasm_bindgen::JsValue::from(info))
})
}
#[wasm_bindgen]
pub fn get_header(node: &NodeConf, header_id: &BlockId) -> js_sys::Promise {
let header_id_cloned = header_id.0.clone();
#[allow(clippy::clone_on_copy)]
let node_cloned = node.0.clone();
wasm_bindgen_futures::future_to_promise(async move {
let header = ergo_lib::ergo_rest::api::node::get_header(node_cloned, header_id_cloned)
.await
.map_err(to_js)
.map(BlockHeader::from)?;
Ok(wasm_bindgen::JsValue::from(header))
})
}
#[wasm_bindgen]
pub fn get_nipopow_proof_by_header_id(
node: &NodeConf,
min_chain_length: u32,
suffix_len: u32,
header_id: &BlockId,
) -> js_sys::Promise {
let header_id_cloned = header_id.0.clone();
#[allow(clippy::clone_on_copy)]
let node_cloned = node.0.clone();
wasm_bindgen_futures::future_to_promise(async move {
let proof = ergo_lib::ergo_rest::api::node::get_nipopow_proof_by_header_id(
node_cloned,
min_chain_length,
suffix_len,
header_id_cloned,
)
.await
.map_err(to_js)
.map(NipopowProof::from)?;
Ok(wasm_bindgen::JsValue::from(proof))
})
}
#[wasm_bindgen]
pub fn get_blocks_header_id_proof_for_tx_id(
node: &NodeConf,
header_id: &BlockId,
tx_id: &TxId,
) -> js_sys::Promise {
let header_id_cloned = header_id.0.clone();
let tx_id_cloned = tx_id.0.clone();
#[allow(clippy::clone_on_copy)]
let node_cloned = node.0.clone();
wasm_bindgen_futures::future_to_promise(async move {
let merkle_proof = ergo_lib::ergo_rest::api::node::get_blocks_header_id_proof_for_tx_id(
node_cloned,
header_id_cloned,
tx_id_cloned,
)
.await
.map_err(to_js)
.map(|m| m.map(crate::merkleproof::MerkleProof))?;
Ok(wasm_bindgen::JsValue::from(merkle_proof))
})
}
#[wasm_bindgen]
pub struct PeerUrls(pub(crate) Vec<web_sys::Url>);
#[wasm_bindgen]
impl PeerUrls {
pub fn len(&self) -> usize {
self.0.len()
}
pub fn get(&self, index: usize) -> web_sys::Url {
self.0[index].clone()
}
}
#[wasm_bindgen]
pub async fn peer_discovery(
seeds: Box<[web_sys::Url]>,
max_parallel_requests: u16,
timeout_sec: u32,
is_chrome: bool,
) -> Result<PeerUrls, JsValue> {
if is_chrome {
peer_discovery_chrome(seeds, max_parallel_requests, timeout_sec).await
} else {
peer_discovery_non_chrome(seeds, max_parallel_requests, timeout_sec).await
}
}
async fn peer_discovery_non_chrome(
seeds: Box<[web_sys::Url]>,
max_parallel_requests: u16,
timeout_sec: u32,
) -> Result<PeerUrls, JsValue> {
let mut converted_seeds = vec![];
for seed in &*seeds {
let str: String = seed.to_string().into();
converted_seeds.push(url::Url::parse(&str).map_err(to_js)?);
}
let seeds = NonEmptyVec::from_vec(converted_seeds).map_err(to_js)?;
let n = u16::max(max_parallel_requests, 1);
#[allow(clippy::unwrap_used)]
let max_parallel_requests = bounded_integer::BoundedU16::new(n).unwrap();
let timeout = Duration::from_secs(timeout_sec as u64);
let res = ergo_lib::ergo_rest::api::node::peer_discovery(seeds, max_parallel_requests, timeout)
.await
.map_err(to_js)?;
let mut peer_urls = vec![];
for mut url in res {
#[allow(clippy::unwrap_used)]
url.set_port(Some(9053)).unwrap();
peer_urls.push(web_sys::Url::new(url.as_str())?);
}
Ok(PeerUrls(peer_urls))
}
async fn peer_discovery_chrome(
seeds: Box<[web_sys::Url]>,
max_parallel_requests: u16,
timeout_sec: u32,
) -> Result<PeerUrls, JsValue> {
let mut converted_seeds = vec![];
for seed in &*seeds {
let str: String = seed.to_string().into();
converted_seeds.push(url::Url::parse(&str).map_err(to_js)?);
}
let seeds = NonEmptyVec::from_vec(converted_seeds).map_err(to_js)?;
let n = u16::max(max_parallel_requests, 1);
#[allow(clippy::unwrap_used)]
let max_parallel_requests = bounded_integer::BoundedU16::new(n).unwrap();
let timeout = Duration::from_secs(timeout_sec as u64);
let res = ergo_lib::ergo_rest::api::node::peer_discovery_chrome(
seeds,
max_parallel_requests,
timeout,
)
.await
.map_err(to_js)?;
let mut peer_urls = vec![];
for mut url in res {
#[allow(clippy::unwrap_used)]
url.set_port(Some(9053)).unwrap();
peer_urls.push(web_sys::Url::new(url.as_str())?);
}
Ok(PeerUrls(peer_urls))
}
#[wasm_bindgen]
pub fn incremental_peer_discovery_chrome(
scan: &super::chrome_peer_discovery_scan::ChromePeerDiscoveryScan,
max_parallel_requests: u16,
timeout_sec: u32,
) -> js_sys::Promise {
let scan_cloned = scan.clone();
wasm_bindgen_futures::future_to_promise(async move {
let n = u16::max(max_parallel_requests, 1);
#[allow(clippy::unwrap_used)]
let max_parallel_requests = bounded_integer::BoundedU16::new(n).unwrap();
let timeout = Duration::from_secs(timeout_sec as u64);
let updated_scan = ergo_lib::ergo_rest::api::node::incremental_peer_discovery_chrome(
scan_cloned.0,
max_parallel_requests,
timeout,
)
.await
.map_err(to_js)
.map(super::chrome_peer_discovery_scan::ChromePeerDiscoveryScan::from)?;
Ok(wasm_bindgen::JsValue::from(updated_scan))
})
}