@@ -36,7 +36,15 @@ impl WebSocketMessage {
36
36
where
37
37
T : DeserializeOwned + ' static ,
38
38
{
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 )
40
48
}
41
49
42
50
/// Return message data as `Vec<u8>`.
@@ -124,7 +132,6 @@ pub mod tests {
124
132
use wasm_bindgen_test:: * ;
125
133
wasm_bindgen_test_configure ! ( run_in_browser) ;
126
134
127
-
128
135
#[ wasm_bindgen_test]
129
136
async fn get_bytes_from_message ( ) {
130
137
let bytes = "some test message" . as_bytes ( ) ;
@@ -138,8 +145,8 @@ pub mod tests {
138
145
assert_eq ! ( bytes, & * result_bytes) ;
139
146
}
140
147
148
+ use serde:: { Deserialize , Serialize } ;
141
149
use wasm_bindgen:: JsValue ;
142
- use serde:: { Serialize , Deserialize } ;
143
150
144
151
#[ derive( Serialize , Deserialize ) ]
145
152
pub struct Test {
@@ -148,21 +155,21 @@ pub mod tests {
148
155
}
149
156
150
157
#[ wasm_bindgen_test]
151
- async fn convert_message_to_struct ( ) {
158
+ async fn convert_json_string_message_to_struct ( ) {
152
159
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 ( ) ;
156
163
let ws_msg = WebSocketMessage {
157
- data : JsValue :: from_str ( & text ) ,
164
+ data : js_string ,
158
165
message_event,
159
166
} ;
160
167
161
168
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( ) ) ;
164
171
165
- let result = ws_msg. json :: < Test > ( ) . unwrap ( ) ;
172
+ let result = ws_msg. json :: < Test > ( ) . unwrap ( ) ;
166
173
167
174
assert_eq ! ( result. a, 1 ) ;
168
175
assert_eq ! ( result. b, 2 ) ;
0 commit comments