gloo_worker/
codec.rs

1use js_sys::Uint8Array;
2use serde::{Deserialize, Serialize};
3use wasm_bindgen::JsValue;
4
5/// Message Encoding and Decoding Format
6pub trait Codec {
7    /// Encode an input to JsValue
8    fn encode<I>(input: I) -> JsValue
9    where
10        I: Serialize;
11
12    /// Decode a message to a type
13    fn decode<O>(input: JsValue) -> O
14    where
15        O: for<'de> Deserialize<'de>;
16}
17
18/// Default message encoding with [bincode].
19#[derive(Debug)]
20pub struct Bincode;
21
22impl Codec for Bincode {
23    fn encode<I>(input: I) -> JsValue
24    where
25        I: Serialize,
26    {
27        let buf = bincode::serialize(&input).expect("can't serialize an worker message");
28        Uint8Array::from(buf.as_slice()).into()
29    }
30
31    fn decode<O>(input: JsValue) -> O
32    where
33        O: for<'de> Deserialize<'de>,
34    {
35        let data = Uint8Array::from(input).to_vec();
36        bincode::deserialize(&data).expect("can't deserialize an worker message")
37    }
38}