diff --git a/client/demo.js b/client/demo.js index b469edc..ba8aa03 100644 --- a/client/demo.js +++ b/client/demo.js @@ -270,7 +270,7 @@ import initEpoxy, { EpoxyClient, EpoxyClientOptions, EpoxyHandlers, info as epox console.time(); let resp = await epoxy_client.fetch("https://www.example.com/"); console.timeEnd(); - console.log(resp, Object.fromEntries(resp.headers)); + console.log(resp, resp.rawHeaders); log(await resp.text()); } log("done"); diff --git a/client/src/lib.rs b/client/src/lib.rs index d8bc4b8..a19efe0 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -23,9 +23,7 @@ use send_wrapper::SendWrapper; use stream_provider::{StreamProvider, StreamProviderService}; use thiserror::Error; use utils::{ - asyncread_to_readablestream_stream, convert_body, entries_of_object, is_null_body, is_redirect, - object_get, object_set, object_truthy, IncomingBody, UriExt, WasmExecutor, WispTransportRead, - WispTransportWrite, + asyncread_to_readablestream_stream, convert_body, entries_of_object, from_entries, is_null_body, is_redirect, object_get, object_set, object_truthy, IncomingBody, UriExt, WasmExecutor, WispTransportRead, WispTransportWrite }; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::JsFuture; @@ -556,7 +554,7 @@ impl EpoxyClient { let headers = object_truthy(object_get(&options, "headers")).and_then(|val| { if web_sys::Headers::instanceof(&val) { - Some(entries_of_object(&Object::from_entries(&val).ok()?)) + Some(entries_of_object(&from_entries(&val).ok()?)) } else if val.is_truthy() { Some(entries_of_object(&Object::from(val))) } else { @@ -621,7 +619,7 @@ impl EpoxyClient { )) }) .collect(); - let response_headers = Object::from_entries(&response_headers) + let response_headers = from_entries(&response_headers) .map_err(|_| EpoxyError::ResponseHeadersFromEntriesFailed)?; let response_headers_raw = response.headers().clone(); diff --git a/client/src/utils.rs b/client/src/utils.rs index 8d53ce4..ac37545 100644 --- a/client/src/utils.rs +++ b/client/src/utils.rs @@ -339,6 +339,12 @@ export function ws_key() { crypto.getRandomValues(key); return btoa(Array.from(key).map(String.fromCharCode).join('')); } + +export function from_entries(entries){ + var ret = {}; + for(var i = 0; i < entries.length; i++) ret[entries[i][0]] = entries[i][1]; + return ret; +} "#)] extern "C" { pub fn object_get(obj: &Object, key: &str) -> JsValue; @@ -350,6 +356,9 @@ extern "C" { fn entries_of_object_inner(obj: &Object) -> Vec; pub fn define_property(obj: &Object, key: &str, val: JsValue); pub fn ws_key() -> String; + + #[wasm_bindgen(catch)] + pub fn from_entries(iterable: &JsValue) -> Result; } pub async fn convert_body(val: JsValue) -> Result<(Uint8Array, Option), JsValue> { diff --git a/client/src/websocket.rs b/client/src/websocket.rs index a35fedc..fd930b4 100644 --- a/client/src/websocket.rs +++ b/client/src/websocket.rs @@ -16,14 +16,14 @@ use hyper::{ body::Incoming, upgrade::{self, Upgraded}, }; -use js_sys::{ArrayBuffer, Function, Object, Uint8Array}; +use js_sys::{ArrayBuffer, Function, Uint8Array}; use tokio::io::WriteHalf; use wasm_bindgen::{prelude::*, JsError, JsValue}; use wasm_bindgen_futures::spawn_local; use crate::{ tokioio::TokioIo, - utils::{entries_of_object, ws_key}, + utils::{entries_of_object, from_entries, ws_key}, EpoxyClient, EpoxyError, EpoxyHandlers, HttpBody, }; @@ -69,7 +69,7 @@ impl EpoxyWebSocket { } if web_sys::Headers::instanceof(&headers) - && let Ok(entries) = Object::from_entries(&headers) + && let Ok(entries) = from_entries(&headers) { for header in entries_of_object(&entries) { request = request.header(&header[0], &header[1]);