@@ -44,7 +44,8 @@ use std::rc::Rc;
44
44
use std:: task:: { Context , Poll , Waker } ;
45
45
use wasm_bindgen:: prelude:: * ;
46
46
use wasm_bindgen:: JsCast ;
47
- use web_sys:: MessageEvent ;
47
+ use wasm_bindgen_futures:: JsFuture ;
48
+ use web_sys:: { Blob , MessageEvent } ;
48
49
49
50
/// Wrapper around browser's WebSocket API.
50
51
#[ allow( missing_debug_implementations) ]
@@ -97,9 +98,8 @@ impl WebSocket {
97
98
Closure :: wrap ( Box :: new ( move |e : MessageEvent | {
98
99
let sender = sender. clone ( ) ;
99
100
wasm_bindgen_futures:: spawn_local ( async move {
100
- let _ = sender
101
- . broadcast ( StreamMessage :: Message ( parse_message ( e) ) )
102
- . await ;
101
+ let msg = parse_message ( e) . await ;
102
+ let _ = sender. broadcast ( StreamMessage :: Message ( msg) ) . await ;
103
103
} )
104
104
} ) as Box < dyn FnMut ( MessageEvent ) > )
105
105
} ;
@@ -208,17 +208,31 @@ enum StreamMessage {
208
208
ConnectionClose ,
209
209
}
210
210
211
- fn parse_message ( event : MessageEvent ) -> Message {
211
+ async fn parse_message ( event : MessageEvent ) -> Message {
212
212
if let Ok ( array_buffer) = event. data ( ) . dyn_into :: < js_sys:: ArrayBuffer > ( ) {
213
213
let array = js_sys:: Uint8Array :: new ( & array_buffer) ;
214
214
Message :: Bytes ( array. to_vec ( ) )
215
215
} else if let Ok ( txt) = event. data ( ) . dyn_into :: < js_sys:: JsString > ( ) {
216
216
Message :: Text ( String :: from ( & txt) )
217
+ } else if let Ok ( blob) = event. data ( ) . dyn_into :: < web_sys:: Blob > ( ) {
218
+ let vec = blob_into_bytes ( blob) . await ;
219
+ Message :: Bytes ( vec)
217
220
} else {
218
221
unreachable ! ( "message event, received Unknown: {:?}" , event. data( ) ) ;
219
222
}
220
223
}
221
224
225
+ // copied verbatim from https://github.com/rustwasm/wasm-bindgen/issues/2551
226
+ async fn blob_into_bytes ( blob : Blob ) -> Vec < u8 > {
227
+ let array_buffer_promise: JsFuture = blob. array_buffer ( ) . into ( ) ;
228
+
229
+ let array_buffer: JsValue = array_buffer_promise
230
+ . await
231
+ . expect ( "Could not get ArrayBuffer from file" ) ;
232
+
233
+ js_sys:: Uint8Array :: new ( & array_buffer) . to_vec ( )
234
+ }
235
+
222
236
impl Sink < Message > for WebSocket {
223
237
type Error = WebSocketError ;
224
238
0 commit comments