Merge bitcoindevkit/bdk#831: Don't default to use async/await on wasm32

32912eaa05fd3bb4fa1577ca413dcedf909544d9 Don't default to use `async`/`await` on `wasm32` (Elias Rohrer)

Pull request description:

  ### Description

  We don't automatically want to make the interface `async` based on the used architecture, but now require the user to explicitly set the `async-interface` feature.

  #### All Submissions:

  * [x] I've signed all my commits
  * [x] I followed the [contribution guidelines](https://github.com/bitcoindevkit/bdk/blob/master/CONTRIBUTING.md)
  * [x] I ran `cargo fmt` and `cargo clippy` before committing

ACKs for top commit:
  notmandatory:
    ACK 32912eaa05fd3bb4fa1577ca413dcedf909544d9

Tree-SHA512: 41a8f3ab29508a359a8c0d96994e4fa97e52c15e8b8003c1988bcfe036cafa81d6210d446ed825672ce52aff684ebb328dc61b8ae3d25cda6f51a3cae838de58
This commit is contained in:
Steve Myers 2023-01-30 13:09:46 -06:00
commit 41dc7f7d0d
No known key found for this signature in database
GPG Key ID: 8105A46B22C2D051
4 changed files with 18 additions and 21 deletions

View File

@ -154,7 +154,7 @@ jobs:
- name: Update toolchain - name: Update toolchain
run: rustup update run: rustup update
- name: Check - name: Check
run: cargo check --target wasm32-unknown-unknown --features use-esplora-async,dev-getrandom-wasm --no-default-features run: cargo check --target wasm32-unknown-unknown --features async-interface,use-esplora-async,dev-getrandom-wasm --no-default-features
fmt: fmt:
name: Rust fmt name: Rust fmt

View File

@ -19,7 +19,7 @@ use syn::{parse, ImplItemMethod, ItemImpl, ItemTrait, Token};
fn add_async_trait(mut parsed: ItemTrait) -> TokenStream { fn add_async_trait(mut parsed: ItemTrait) -> TokenStream {
let output = quote! { let output = quote! {
#[cfg(all(not(target_arch = "wasm32"), not(feature = "async-interface")))] #[cfg(not(feature = "async-interface"))]
#parsed #parsed
}; };
@ -32,7 +32,7 @@ fn add_async_trait(mut parsed: ItemTrait) -> TokenStream {
let output = quote! { let output = quote! {
#output #output
#[cfg(any(target_arch = "wasm32", feature = "async-interface"))] #[cfg(feature = "async-interface")]
#[async_trait(?Send)] #[async_trait(?Send)]
#parsed #parsed
}; };
@ -42,7 +42,7 @@ fn add_async_trait(mut parsed: ItemTrait) -> TokenStream {
fn add_async_method(mut parsed: ImplItemMethod) -> TokenStream { fn add_async_method(mut parsed: ImplItemMethod) -> TokenStream {
let output = quote! { let output = quote! {
#[cfg(all(not(target_arch = "wasm32"), not(feature = "async-interface")))] #[cfg(not(feature = "async-interface"))]
#parsed #parsed
}; };
@ -51,7 +51,7 @@ fn add_async_method(mut parsed: ImplItemMethod) -> TokenStream {
let output = quote! { let output = quote! {
#output #output
#[cfg(any(target_arch = "wasm32", feature = "async-interface"))] #[cfg(feature = "async-interface")]
#parsed #parsed
}; };
@ -60,7 +60,7 @@ fn add_async_method(mut parsed: ImplItemMethod) -> TokenStream {
fn add_async_impl_trait(mut parsed: ItemImpl) -> TokenStream { fn add_async_impl_trait(mut parsed: ItemImpl) -> TokenStream {
let output = quote! { let output = quote! {
#[cfg(all(not(target_arch = "wasm32"), not(feature = "async-interface")))] #[cfg(not(feature = "async-interface"))]
#parsed #parsed
}; };
@ -73,7 +73,7 @@ fn add_async_impl_trait(mut parsed: ItemImpl) -> TokenStream {
let output = quote! { let output = quote! {
#output #output
#[cfg(any(target_arch = "wasm32", feature = "async-interface"))] #[cfg(feature = "async-interface")]
#[async_trait(?Send)] #[async_trait(?Send)]
#parsed #parsed
}; };
@ -81,7 +81,7 @@ fn add_async_impl_trait(mut parsed: ItemImpl) -> TokenStream {
output.into() output.into()
} }
/// Makes a method or every method of a trait "async" only if the target_arch is "wasm32" /// Makes a method or every method of a trait `async`, if the `async-interface` feature is enabled.
/// ///
/// Requires the `async-trait` crate as a dependency whenever this attribute is used on a trait /// Requires the `async-trait` crate as a dependency whenever this attribute is used on a trait
/// definition or trait implementation. /// definition or trait implementation.
@ -101,18 +101,18 @@ pub fn maybe_async(_attr: TokenStream, item: TokenStream) -> TokenStream {
} }
} }
/// Awaits if target_arch is "wasm32", does nothing otherwise /// Awaits, if the `async-interface` feature is enabled.
#[proc_macro] #[proc_macro]
pub fn maybe_await(expr: TokenStream) -> TokenStream { pub fn maybe_await(expr: TokenStream) -> TokenStream {
let expr: proc_macro2::TokenStream = expr.into(); let expr: proc_macro2::TokenStream = expr.into();
let quoted = quote! { let quoted = quote! {
{ {
#[cfg(all(not(target_arch = "wasm32"), not(feature = "async-interface")))] #[cfg(not(feature = "async-interface"))]
{ {
#expr #expr
} }
#[cfg(any(target_arch = "wasm32", feature = "async-interface"))] #[cfg(feature = "async-interface")]
{ {
#expr.await #expr.await
} }
@ -122,20 +122,20 @@ pub fn maybe_await(expr: TokenStream) -> TokenStream {
quoted.into() quoted.into()
} }
/// Awaits if target_arch is "wasm32", uses `tokio::Runtime::block_on()` otherwise /// Awaits, if the `async-interface` feature is enabled, uses `tokio::Runtime::block_on()` otherwise
/// ///
/// Requires the `tokio` crate as a dependecy with `rt-core` or `rt-threaded` to build on non-wasm32 platforms. /// Requires the `tokio` crate as a dependecy with `rt-core` or `rt-threaded` to build.
#[proc_macro] #[proc_macro]
pub fn await_or_block(expr: TokenStream) -> TokenStream { pub fn await_or_block(expr: TokenStream) -> TokenStream {
let expr: proc_macro2::TokenStream = expr.into(); let expr: proc_macro2::TokenStream = expr.into();
let quoted = quote! { let quoted = quote! {
{ {
#[cfg(all(not(target_arch = "wasm32"), not(feature = "async-interface")))] #[cfg(not(feature = "async-interface"))]
{ {
tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap().block_on(#expr) tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap().block_on(#expr)
} }
#[cfg(any(target_arch = "wasm32", feature = "async-interface"))] #[cfg(feature = "async-interface")]
{ {
#expr.await #expr.await
} }

View File

@ -249,11 +249,8 @@ pub trait BlockchainFactory {
/// operations to build a blockchain for a given wallet, so if a wallet needs to be synced /// operations to build a blockchain for a given wallet, so if a wallet needs to be synced
/// often it's recommended to use [`BlockchainFactory::build_for_wallet`] to reuse the same /// often it's recommended to use [`BlockchainFactory::build_for_wallet`] to reuse the same
/// blockchain multiple times. /// blockchain multiple times.
#[cfg(not(any(target_arch = "wasm32", feature = "async-interface")))] #[cfg(not(feature = "async-interface"))]
#[cfg_attr( #[cfg_attr(docsrs, doc(cfg(not(feature = "async-interface"))))]
docsrs,
doc(cfg(not(any(target_arch = "wasm32", feature = "async-interface"))))
)]
fn sync_wallet<D: BatchDatabase>( fn sync_wallet<D: BatchDatabase>(
&self, &self,
wallet: &Wallet<D>, wallet: &Wallet<D>,

View File

@ -227,7 +227,7 @@ compile_error!(
#[cfg(feature = "keys-bip39")] #[cfg(feature = "keys-bip39")]
extern crate bip39; extern crate bip39;
#[cfg(any(target_arch = "wasm32", feature = "async-interface"))] #[cfg(feature = "async-interface")]
#[macro_use] #[macro_use]
extern crate async_trait; extern crate async_trait;
#[macro_use] #[macro_use]