wasm_extra 0.1.6

Extra utilities for WASM.
Documentation
use wasm_bindgen::prelude::*;
use web_sys::ReadableStream;

#[wasm_bindgen]
#[cfg(all(
    feature = "ReadableStreamDefaultReader",
    feature = "ReadableStreamDefaultController"
))]
extern "C" {
    #[wasm_bindgen(js_name = ReadableStream, extends = ReadableStream)]
    type ReadableStreamClass;

    #[wasm_bindgen(constructor, js_class = "ReadableStream")]
    fn new(source: &JsValue) -> ReadableStreamClass;
}

pub trait ReadableStreamExt {
    #[cfg(all(
        feature = "ReadableStreamDefaultReader",
        feature = "ReadableStreamDefaultController"
    ))]
    fn from_u8_vec(vec: Vec<u8>) -> Result<web_sys::ReadableStream, JsValue>;
}

impl ReadableStreamExt for web_sys::ReadableStream {
    #[cfg(all(
        feature = "ReadableStreamDefaultReader",
        feature = "ReadableStreamDefaultController"
    ))]
    fn from_u8_vec(vec: Vec<u8>) -> Result<web_sys::ReadableStream, JsValue> {
        let source = js_sys::Object::new();
        {
            let f = Closure::<dyn Fn(JsValue)>::new(move |controller: JsValue| {
                let controller = controller
                    .dyn_into::<web_sys::ReadableStreamDefaultController>()
                    .unwrap();
                let arr = js_sys::Uint8Array::from(vec.as_slice());
                controller.enqueue_with_chunk(&arr).unwrap();
                controller.close().unwrap();
            });
            js_sys::Reflect::set(
                &source,
                &JsValue::from_str("pull"),
                f.as_ref().unchecked_ref(),
            )
            .unwrap();

            f.forget();
        }
        Ok(ReadableStreamClass::new(&source).into())
    }
}