Skip to content

Commit e937183

Browse files
committed
Fix decoding WebSocket JSON messages
1 parent 04d9125 commit e937183

File tree

3 files changed

+24
-11
lines changed

3 files changed

+24
-11
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- Make `fetch::JsonError` public.
88
- Adapted to Rust 1.61.0.
99
- Make Seed compile with `wasm_bindgen >= v0.2.81`
10+
- Decoding WebSocket JSON messages
1011

1112
## v0.9.1
1213

Makefile.toml

+5
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ description = "Run headless Seed's tests with Firefox."
160160
extend = "test"
161161
args = ["test", "--headless", "--firefox"]
162162

163+
[tasks.test_h_firefox_serde_wasm_bindgen]
164+
description = "Run headless Seed's tests with Firefox."
165+
extend = "test"
166+
args = ["test", "--headless", "--firefox", "--features", "serde-wasm-bindgen"]
167+
163168
[tasks.test_h_release]
164169
extend = "test_h"
165170
description = "Run headless Seed's tests in release mode. Ex: 'cargo make test_h firefox'. Test envs: [chrome, firefox, safari]"

src/browser/web_socket/message.rs

+18-11
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,15 @@ impl WebSocketMessage {
3636
where
3737
T: DeserializeOwned + 'static,
3838
{
39-
json::from_js_value(&self.data).map_err(WebSocketError::JsonError)
39+
if self.data.has_type::<js_sys::JsString>() {
40+
let json_string = self.data.as_string().ok_or(WebSocketError::TextError(
41+
"value is not a valid utf-8 string",
42+
))?;
43+
json::from_str(&json_string)
44+
} else {
45+
json::from_js_value(&self.data)
46+
}
47+
.map_err(WebSocketError::JsonError)
4048
}
4149

4250
/// Return message data as `Vec<u8>`.
@@ -124,7 +132,6 @@ pub mod tests {
124132
use wasm_bindgen_test::*;
125133
wasm_bindgen_test_configure!(run_in_browser);
126134

127-
128135
#[wasm_bindgen_test]
129136
async fn get_bytes_from_message() {
130137
let bytes = "some test message".as_bytes();
@@ -138,8 +145,8 @@ pub mod tests {
138145
assert_eq!(bytes, &*result_bytes);
139146
}
140147

148+
use serde::{Deserialize, Serialize};
141149
use wasm_bindgen::JsValue;
142-
use serde::{Serialize, Deserialize};
143150

144151
#[derive(Serialize, Deserialize)]
145152
pub struct Test {
@@ -148,21 +155,21 @@ pub mod tests {
148155
}
149156

150157
#[wasm_bindgen_test]
151-
async fn convert_message_to_struct() {
158+
async fn convert_json_string_message_to_struct() {
152159
let test = Test { a: 1, b: 2 };
153-
let text = serde_json::to_string(&test).unwrap();
154-
155-
let message_event = web_sys::MessageEvent::new("test").unwrap();
160+
let json_string = serde_json::to_string(&test).unwrap();
161+
let js_string = JsValue::from_str(&json_string);
162+
let message_event = web_sys::MessageEvent::new("test-event").unwrap();
156163
let ws_msg = WebSocketMessage {
157-
data: JsValue::from_str(&text),
164+
data: js_string,
158165
message_event,
159166
};
160167

161168
let result_bytes = ws_msg.bytes().await.unwrap();
162-
assert_eq!(text.as_bytes(), &*result_bytes);
163-
assert_eq!(text, ws_msg.text().unwrap());
169+
assert_eq!(json_string.as_bytes(), &*result_bytes);
170+
assert_eq!(json_string, ws_msg.text().unwrap());
164171

165-
let result = ws_msg.json::<Test>().unwrap();
172+
let result = ws_msg.json::<Test>().unwrap();
166173

167174
assert_eq!(result.a, 1);
168175
assert_eq!(result.b, 2);

0 commit comments

Comments
 (0)