#![cfg(target_family = "wasm")]
pub mod sys;
pub fn get_reader(
    readable_stream: web_sys::ReadableStream,
) -> web_sys::ReadableStreamDefaultReader {
    let reader: wasm_bindgen::JsValue = readable_stream.get_reader().into();
    reader.into()
}
pub fn get_reader_byob(
    readable_stream: web_sys::ReadableStream,
) -> web_sys::ReadableStreamByobReader {
    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.buffer()));
    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(())
}