diff --git a/Cargo.toml b/Cargo.toml index d554922..8815e68 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -129,9 +129,9 @@ winreg = "0.7" # wasm [target.'cfg(target_arch = "wasm32")'.dependencies] -js-sys = "0.3.28" -wasm-bindgen = { version = "0.2.51", features = ["serde-serialize"] } -wasm-bindgen-futures = "0.4.1" +js-sys = "0.3.45" +wasm-bindgen = { version = "0.2.68", features = ["serde-serialize"] } +wasm-bindgen-futures = "0.4.18" [target.'cfg(target_arch = "wasm32")'.dependencies.web-sys] version = "0.3.25" @@ -145,6 +145,7 @@ features = [ "FormData", "Blob", "BlobPropertyBag", + "ServiceWorkerGlobalScope", ] [[example]] diff --git a/src/wasm/client.rs b/src/wasm/client.rs index 8f8d634..2dca78b 100644 --- a/src/wasm/client.rs +++ b/src/wasm/client.rs @@ -13,6 +13,22 @@ extern "C" { fn fetch_with_request(input: &web_sys::Request) -> Promise; } +fn js_fetch(req: &web_sys::Request) -> Promise { + use wasm_bindgen::{JsCast, JsValue}; + let global = js_sys::global(); + + if let Some(true) = + js_sys::Reflect::has(&global, &JsValue::from_str("ServiceWorkerGlobalScope")).ok() + { + global + .unchecked_into::() + .fetch_with_request(req) + } else { + // browser + fetch_with_request(req) + } +} + /// dox #[derive(Clone, Debug)] pub struct Client(()); @@ -168,7 +184,7 @@ async fn fetch(req: Request) -> crate::Result { .map_err(crate::error::builder)?; // Await the fetch() promise - let p = fetch_with_request(&js_req); + let p = js_fetch(&js_req); let js_resp = super::promise::(p) .await .map_err(crate::error::request)?;