#![cfg(target_family = "wasm")]
pub mod sys;
pub fn get_reader(
readable_stream: impl Into<web_sys::ReadableStream>,
) -> web_sys::ReadableStreamDefaultReader {
let readable_stream = readable_stream.into();
let reader: wasm_bindgen::JsValue = readable_stream.get_reader().into();
reader.into()
}
pub fn get_reader_byob(
readable_stream: impl Into<web_sys::ReadableStream>,
) -> web_sys::ReadableStreamByobReader {
let readable_stream = readable_stream.into();
let mut options = web_sys::ReadableStreamGetReaderOptions::new();
options.mode(web_sys::ReadableStreamReaderMode::Byob);
let reader: wasm_bindgen::JsValue = readable_stream.get_reader_with_options(&options).into();
reader.into()
}
pub fn get_writer(
writable_stream: web_sys::WritableStream,
) -> web_sys::WritableStreamDefaultWriter {
writable_stream.get_writer().unwrap()
}
pub async fn read(
reader: &web_sys::ReadableStreamDefaultReader,
) -> Result<Option<Vec<u8>>, wasm_bindgen::JsValue> {
let fut = wasm_bindgen_futures::JsFuture::from(reader.read());
let result = fut.await?;
let result: crate::sys::ReadableStreamDefaultReaderValue = result.into();
let value = result.value();
let Some(js_buf) = value else {
if result.is_done() {
return Ok(None);
}
unreachable!("no value and we are also not done, this should be impossible");
};
Ok(Some(js_buf.to_vec()))
}
pub async fn read_byob(
reader: &web_sys::ReadableStreamByobReader,
buf: js_sys::Uint8Array,
) -> Result<Option<js_sys::Uint8Array>, wasm_bindgen::JsValue> {
let fut = wasm_bindgen_futures::JsFuture::from(reader.read_with_array_buffer_view(&buf));
let result = fut.await?;
let result: crate::sys::ReadableStreamByobReaderValue = result.into();
let value = result.value();
let Some(js_buf) = value else {
if result.is_done() {
return Ok(None);
}
unreachable!("no value and we are also not done, this should be impossible");
};
Ok(Some(js_buf))
}
pub async fn write<T>(
writer: &web_sys::WritableStreamDefaultWriter,
buf: T,
) -> Result<(), wasm_bindgen::JsValue>
where
js_sys::Uint8Array: From<T>,
{
let chunk = js_sys::Uint8Array::from(buf);
let fut = wasm_bindgen_futures::JsFuture::from(writer.write_with_chunk(chunk.as_ref()));
fut.await?;
Ok(())
}