]> Untitled Git - bdk/commitdiff
Make async esplora futures Send
authorLLFourn <lloyd.fourn@gmail.com>
Fri, 10 Mar 2023 01:12:00 +0000 (12:12 +1100)
committerLLFourn <lloyd.fourn@gmail.com>
Fri, 10 Mar 2023 01:19:54 +0000 (12:19 +1100)
crates/esplora/src/async_ext.rs

index 7796050f9a8ea0338d816846a4c6a7d23e433534..fe5a82dcace82bbbe2f6d0aa532777f1e19ea13f 100644 (file)
@@ -12,7 +12,9 @@ use futures::stream::{FuturesOrdered, TryStreamExt};
 
 use crate::map_confirmation_time;
 
-#[async_trait(?Send)]
+#[cfg(feature = "async")]
+#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
+#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
 pub trait EsploraAsyncExt {
     /// Scan the blockchain (via esplora) for the data specified and returns a [`KeychainScan`].
     ///
@@ -28,12 +30,15 @@ pub trait EsploraAsyncExt {
     ///
     /// [`ChainPosition`]: bdk_chain::sparse_chain::ChainPosition
     #[allow(clippy::result_large_err)] // FIXME
-    async fn scan<K: Ord + Clone>(
+    async fn scan<K: Ord + Clone + Send>(
         &self,
         local_chain: &BTreeMap<u32, BlockHash>,
-        keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
-        txids: impl IntoIterator<Item = Txid>,
-        outpoints: impl IntoIterator<Item = OutPoint>,
+        keychain_spks: BTreeMap<
+            K,
+            impl IntoIterator<IntoIter = impl Iterator<Item = (u32, Script)> + Send> + Send,
+        >,
+        txids: impl IntoIterator<IntoIter = impl Iterator<Item = Txid> + Send> + Send,
+        outpoints: impl IntoIterator<IntoIter = impl Iterator<Item = OutPoint> + Send> + Send,
         stop_gap: usize,
         parallel_requests: usize,
     ) -> Result<KeychainScan<K, ConfirmationTime>, Error>;
@@ -45,9 +50,9 @@ pub trait EsploraAsyncExt {
     async fn scan_without_keychain(
         &self,
         local_chain: &BTreeMap<u32, BlockHash>,
-        misc_spks: impl IntoIterator<Item = Script>,
-        txids: impl IntoIterator<Item = Txid>,
-        outpoints: impl IntoIterator<Item = OutPoint>,
+        misc_spks: impl IntoIterator<IntoIter = impl Iterator<Item = Script> + Send> + Send,
+        txids: impl IntoIterator<IntoIter = impl Iterator<Item = Txid> + Send> + Send,
+        outpoints: impl IntoIterator<IntoIter = impl Iterator<Item = OutPoint> + Send> + Send,
         parallel_requests: usize,
     ) -> Result<ChainGraph<ConfirmationTime>, Error> {
         let wallet_scan = self
@@ -72,17 +77,25 @@ pub trait EsploraAsyncExt {
     }
 }
 
-#[async_trait(?Send)]
+#[cfg(feature = "async")]
+#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
+#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
 impl EsploraAsyncExt for esplora_client::AsyncClient {
-    async fn scan<K: Ord + Clone>(
+    #[allow(clippy::result_large_err)] // FIXME
+    async fn scan<K: Ord + Clone + Send>(
         &self,
         local_chain: &BTreeMap<u32, BlockHash>,
-        keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
-        txids: impl IntoIterator<Item = Txid>,
-        outpoints: impl IntoIterator<Item = OutPoint>,
+        keychain_spks: BTreeMap<
+            K,
+            impl IntoIterator<IntoIter = impl Iterator<Item = (u32, Script)> + Send> + Send,
+        >,
+        txids: impl IntoIterator<IntoIter = impl Iterator<Item = Txid> + Send> + Send,
+        outpoints: impl IntoIterator<IntoIter = impl Iterator<Item = OutPoint> + Send> + Send,
         stop_gap: usize,
         parallel_requests: usize,
     ) -> Result<KeychainScan<K, ConfirmationTime>, Error> {
+        let txids = txids.into_iter();
+        let outpoints = outpoints.into_iter();
         let parallel_requests = parallel_requests.max(1);
         let mut scan = KeychainScan::default();
         let update = &mut scan.update;
@@ -204,7 +217,7 @@ impl EsploraAsyncExt for esplora_client::AsyncClient {
             }
         }
 
-        for txid in txids.into_iter() {
+        for txid in txids {
             let (tx, tx_status) =
                 match (self.get_tx(&txid).await?, self.get_tx_status(&txid).await?) {
                     (Some(tx), Some(tx_status)) => (tx, tx_status),
@@ -227,7 +240,7 @@ impl EsploraAsyncExt for esplora_client::AsyncClient {
             }
         }
 
-        for op in outpoints.into_iter() {
+        for op in outpoints {
             let mut op_txs = Vec::with_capacity(2);
             if let (Some(tx), Some(tx_status)) = (
                 self.get_tx(&op.txid).await?,