From 971f873c0dfdebe6820cdedc0fc4d84af3102f2f Mon Sep 17 00:00:00 2001 From: ben little Date: Wed, 17 Jul 2024 14:21:37 -0600 Subject: [PATCH 1/2] add case for node global.fetch --- Cargo.lock | 31 +++++++++++++++++++++---------- crates/net/src/http/request.rs | 12 +++++++++++- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 114c8d0b..9cbde3d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -598,7 +598,7 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils 0.1.7", - "http", + "http 0.2.11", "js-sys", "pin-project", "serde", @@ -619,7 +619,7 @@ dependencies = [ "futures-io", "futures-sink", "gloo-utils 0.2.0", - "http 1.0.0", + "http 1.1.0", "js-sys", "once_cell", "pin-project", @@ -785,7 +785,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.11", "indexmap 2.1.0", "slab", "tokio", @@ -814,7 +814,7 @@ dependencies = [ "base64", "bytes", "headers-core", - "http", + "http 0.2.11", "httpdate", "mime", "sha1", @@ -826,7 +826,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" dependencies = [ - "http", + "http 0.2.11", ] [[package]] @@ -852,6 +852,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -859,7 +870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.11", "pin-project-lite", ] @@ -886,7 +897,7 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", + "http 0.2.11", "http-body", "httparse", "httpdate", @@ -1049,7 +1060,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http", + "http 0.2.11", "httparse", "log", "memchr", @@ -1699,7 +1710,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 0.2.11", "httparse", "log", "rand", @@ -1787,7 +1798,7 @@ dependencies = [ "futures-channel", "futures-util", "headers", - "http", + "http 0.2.11", "hyper", "log", "mime", diff --git a/crates/net/src/http/request.rs b/crates/net/src/http/request.rs index 537fc264..c79a04c7 100644 --- a/crates/net/src/http/request.rs +++ b/crates/net/src/http/request.rs @@ -5,6 +5,7 @@ use js_sys::{ArrayBuffer, Reflect, Uint8Array}; use std::convert::{From, TryFrom, TryInto}; use std::fmt; use std::str::FromStr; +use wasm_bindgen::convert::{FromWasmAbi, ReturnWasmAbi}; use wasm_bindgen::{JsCast, JsValue}; use wasm_bindgen_futures::JsFuture; use web_sys::{ @@ -333,7 +334,16 @@ impl Request { let worker = global.dyn_into::().unwrap(); worker.fetch_with_request(&request) } else { - panic!("Unsupported JavaScript global context"); + let maybe_fetch = + js_sys::Reflect::get(&global, &JsValue::from_str("fetch")).unwrap(); + if maybe_fetch.is_undefined() { + panic!("no global fetch()") + } + let fetch = maybe_fetch.dyn_into::().unwrap(); + let promise = fetch + .call1(&global, &unsafe { JsValue::from_abi(request.return_abi()) }) + .map_err(js_to_error)?; + promise.dyn_into::().unwrap() } }; From 725663fb09acc893d2e92fca5b6637fdc5add863 Mon Sep 17 00:00:00 2001 From: ben little Date: Wed, 17 Jul 2024 19:56:18 -0600 Subject: [PATCH 2/2] refactor and improve panic message --- crates/net/src/http/request.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/net/src/http/request.rs b/crates/net/src/http/request.rs index c79a04c7..3119849b 100644 --- a/crates/net/src/http/request.rs +++ b/crates/net/src/http/request.rs @@ -337,13 +337,15 @@ impl Request { let maybe_fetch = js_sys::Reflect::get(&global, &JsValue::from_str("fetch")).unwrap(); if maybe_fetch.is_undefined() { - panic!("no global fetch()") + panic!("no supported fetch api") } - let fetch = maybe_fetch.dyn_into::().unwrap(); - let promise = fetch + maybe_fetch + .dyn_into::() + .unwrap() .call1(&global, &unsafe { JsValue::from_abi(request.return_abi()) }) - .map_err(js_to_error)?; - promise.dyn_into::().unwrap() + .map_err(js_to_error)? + .dyn_into::() + .unwrap() } };