Skip to content
This repository was archived by the owner on Aug 21, 2025. It is now read-only.

Commit 77de328

Browse files
committed
keep window but make sure to call it WebSleeper
1 parent 6c2bd73 commit 77de328

File tree

2 files changed

+20
-23
lines changed

2 files changed

+20
-23
lines changed

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ wasm-bindgen-futures = { version = "0.4.50", optional = true }
3434
anyhow = { version = "1.0.98", default-features = false }
3535
serde = { version = "1.0.219", default-features = false, features = ["derive"] }
3636
serde-wasm-bindgen = "0.6.5"
37-
web-sys = { version = "0.3.77", default-features = false }
37+
web-sys = { version = "0.3.77", default-features = false, features = [
38+
"Window",
39+
] }
3840

3941
# Compatibility to compile to WASM
4042
getrandom = { version = "0.2.16", features = ["js"] }

src/bitcoin/esplora_client.rs

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ use bdk_wallet::{
88
};
99
use wasm_bindgen::{
1010
prelude::{wasm_bindgen, Closure},
11-
JsCast, JsError, JsValue,
11+
JsCast, JsValue,
1212
};
1313
use wasm_bindgen_futures::JsFuture;
14-
use web_sys::js_sys::{global, Function, Promise, Reflect};
14+
use web_sys::js_sys::{Function, Promise};
1515

1616
use crate::{
1717
result::JsResult,
@@ -28,7 +28,7 @@ use bdk_esplora::esplora_client::Sleeper;
2828

2929
#[wasm_bindgen]
3030
pub struct EsploraClient {
31-
client: AsyncClient<WasmSleeper>,
31+
client: AsyncClient<WebSleeper>,
3232
}
3333

3434
#[wasm_bindgen]
@@ -37,7 +37,7 @@ impl EsploraClient {
3737
pub fn new(url: &str, max_retries: usize) -> JsResult<EsploraClient> {
3838
let client = Builder::new(url)
3939
.max_retries(max_retries)
40-
.build_async_with_sleeper::<WasmSleeper>()?;
40+
.build_async_with_sleeper::<WebSleeper>()?;
4141
Ok(EsploraClient { client })
4242
}
4343

@@ -74,9 +74,9 @@ impl EsploraClient {
7474
}
7575
}
7676

77-
struct WasmSleep(JsFuture);
77+
struct WebSleep(JsFuture);
7878

79-
impl Future for WasmSleep {
79+
impl Future for WebSleep {
8080
type Output = ();
8181
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {
8282
// delegate to the inner JsFuture
@@ -85,28 +85,23 @@ impl Future for WasmSleep {
8585
}
8686

8787
// SAFETY: Wasm is single-threaded; the value is never accessed concurrently.
88-
unsafe impl Send for WasmSleep {}
88+
unsafe impl Send for WebSleep {}
8989

9090
#[derive(Clone, Copy)]
91-
struct WasmSleeper;
91+
struct WebSleeper;
9292

93-
impl Sleeper for WasmSleeper {
94-
type Sleep = WasmSleep;
93+
impl Sleeper for WebSleeper {
94+
type Sleep = WebSleep;
9595

9696
fn sleep(dur: Duration) -> Self::Sleep {
97-
let ms = dur.as_millis();
97+
let ms = dur.as_millis() as i32;
9898
let promise = Promise::new(&mut |resolve, _reject| {
99-
let cb = Closure::once_into_js(move || resolve.call0(&JsValue::NULL).unwrap()).unchecked_into::<Function>();
100-
101-
// globalThis.setTimeout(cb, ms);
102-
let g = global();
103-
let set_timeout = Reflect::get(&g, &JsValue::from_str("setTimeout"))
104-
.unwrap_or_else(|_| JsError::new("setTimeout not found").into())
105-
.unchecked_into::<Function>();
106-
107-
set_timeout.call2(&g, &cb, &JsValue::from_f64(ms as f64)).unwrap();
99+
let cb = Closure::once_into_js(move || resolve.call0(&JsValue::NULL).unwrap());
100+
web_sys::window()
101+
.unwrap()
102+
.set_timeout_with_callback_and_timeout_and_arguments_0(cb.unchecked_ref::<Function>(), ms)
103+
.unwrap();
108104
});
109-
110-
WasmSleep(JsFuture::from(promise))
105+
WebSleep(JsFuture::from(promise))
111106
}
112107
}

0 commit comments

Comments
 (0)