Skip to content

Commit fe1036f

Browse files
authored
deserialize Blob to Vec<u8> (#9)
1 parent 7866f5e commit fe1036f

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

src/websocket/futures.rs

+19-5
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ use std::rc::Rc;
4444
use std::task::{Context, Poll, Waker};
4545
use wasm_bindgen::prelude::*;
4646
use wasm_bindgen::JsCast;
47-
use web_sys::MessageEvent;
47+
use wasm_bindgen_futures::JsFuture;
48+
use web_sys::{Blob, MessageEvent};
4849

4950
/// Wrapper around browser's WebSocket API.
5051
#[allow(missing_debug_implementations)]
@@ -97,9 +98,8 @@ impl WebSocket {
9798
Closure::wrap(Box::new(move |e: MessageEvent| {
9899
let sender = sender.clone();
99100
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;
103103
})
104104
}) as Box<dyn FnMut(MessageEvent)>)
105105
};
@@ -208,17 +208,31 @@ enum StreamMessage {
208208
ConnectionClose,
209209
}
210210

211-
fn parse_message(event: MessageEvent) -> Message {
211+
async fn parse_message(event: MessageEvent) -> Message {
212212
if let Ok(array_buffer) = event.data().dyn_into::<js_sys::ArrayBuffer>() {
213213
let array = js_sys::Uint8Array::new(&array_buffer);
214214
Message::Bytes(array.to_vec())
215215
} else if let Ok(txt) = event.data().dyn_into::<js_sys::JsString>() {
216216
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)
217220
} else {
218221
unreachable!("message event, received Unknown: {:?}", event.data());
219222
}
220223
}
221224

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+
222236
impl Sink<Message> for WebSocket {
223237
type Error = WebSocketError;
224238

0 commit comments

Comments
 (0)