From 4edb4d479155ade6a95149a29d815564010afbd2 Mon Sep 17 00:00:00 2001 From: rupansh Date: Fri, 4 Jul 2025 00:01:58 +0530 Subject: [PATCH 1/2] fix(ic-agent): add support for wasm workers in sleep util fixes panic in a web worker environment --- ic-agent/src/util.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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(); } })) From 374d4c7ecba098380bf25f221e22ba74a3b58412 Mon Sep 17 00:00:00 2001 From: rupansh Date: Fri, 4 Jul 2025 00:06:09 +0530 Subject: [PATCH 2/2] chore: update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10fe76ac..dedab11b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +* Fix panic in web worker environments in `ic-agent`. + ## [0.40.1] - 2025-05-15 * Add `read_state_canister_controllers` and `read_state_canister_module_hash` functions.