diff --git a/plugins/websocket/guest-js/index.ts b/plugins/websocket/guest-js/index.ts index ef34e6f3..4967b837 100644 --- a/plugins/websocket/guest-js/index.ts +++ b/plugins/websocket/guest-js/index.ts @@ -6,7 +6,7 @@ export interface ConnectionConfig { maxMessageSize?: number; maxFrameSize?: number; acceptUnmaskedFrames?: boolean; - headers?: Record; + headers?: HeadersInit; } export interface MessageKind { @@ -44,6 +44,10 @@ export default class WebSocket { listeners.forEach((l) => l(message)); }; + if (config?.headers) { + config.headers = Array.from(new Headers(config.headers).entries()); + } + return await invoke("plugin:websocket|connect", { url, callbackFunction: transformCallback(handler), diff --git a/plugins/websocket/src/lib.rs b/plugins/websocket/src/lib.rs index 03552aac..ad692d60 100644 --- a/plugins/websocket/src/lib.rs +++ b/plugins/websocket/src/lib.rs @@ -58,8 +58,7 @@ pub struct ConnectionConfig { pub max_frame_size: Option, #[serde(default)] pub accept_unmasked_frames: bool, - #[serde(default)] - pub headers: HashMap, + pub headers: Option>, } impl From for WebSocketConfig { @@ -105,14 +104,12 @@ async fn connect( let id = rand::random(); let mut request = url.into_client_request()?; - if let Some(ref config) = config { - let config_headers = config.headers.iter().map(|(k, v)| { + if let Some(headers) = config.as_ref().and_then(|c| c.headers.as_ref()) { + for (k, v) in headers { let header_name = HeaderName::from_str(k.as_str())?; let header_value = HeaderValue::from_str(v.as_str())?; - Ok((header_name, header_value)) - }); - - request.headers_mut().extend(config_headers.filter_map(Result::ok)); + request.headers_mut().insert(header_name, header_value); + } } let (ws_stream, _) = connect_async_with_config(request, config.map(Into::into), false).await?; diff --git a/tsconfig.base.json b/tsconfig.base.json index 1eebbeb6..629a7c96 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -2,7 +2,7 @@ "compilerOptions": { "allowSyntheticDefaultImports": true, "esModuleInterop": true, - "lib": ["ES2019", "ES2020.Promise", "ES2020.String", "DOM"], + "lib": ["ES2019", "ES2020.Promise", "ES2020.String", "DOM", "DOM.Iterable"], "module": "ESNext", "moduleResolution": "node", "noEmit": true,