diff --git a/CHANGELOG.md b/CHANGELOG.md index 11fb86c1..07eb685a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +* Fix panic in web worker environments in `ic-agent`. * Update `ic-management-canister-types` to 0.5.0 ## [0.44.3] - 2025-10-31 diff --git a/ic-agent/src/util.rs b/ic-agent/src/util.rs index 232b2eca..7b002540 100644 --- a/ic-agent/src/util.rs +++ b/ic-agent/src/util.rs @@ -8,11 +8,17 @@ pub async fn sleep(d: Duration) { tokio::time::sleep(d).await; #[cfg(all(target_family = "wasm", feature = "wasm-bindgen"))] wasm_bindgen_futures::JsFuture::from(js_sys::Promise::new(&mut |rs, rj| { - if let Err(e) = web_sys::window() - .expect("global window unavailable") - .set_timeout_with_callback_and_timeout_and_arguments_0(&rs, d.as_millis() as _) - { - use wasm_bindgen::UnwrapThrowExt; + use wasm_bindgen::{JsCast, UnwrapThrowExt}; + + let global = js_sys::global(); + let res = if let Some(window) = global.dyn_ref::() { + window.set_timeout_with_callback_and_timeout_and_arguments_0(&rs, d.as_millis() as _) + } else if let Some(worker) = global.dyn_ref::() { + worker.set_timeout_with_callback_and_timeout_and_arguments_0(&rs, d.as_millis() as _) + } else { + panic!("global window or worker unavailable"); + }; + if let Err(e) = res { rj.call1(&rj, &e).unwrap_throw(); } }))