1use wasm_bindgen::prelude::*;
2use wasm_bindgen_futures::JsFuture;
3use web_sys::{WritableStream, WritableStreamDefaultWriter};
4
5use crate::{Error, PromiseExt};
6
7pub struct Writer {
9 inner: WritableStreamDefaultWriter,
10}
11
12impl Writer {
13 pub fn new(stream: &WritableStream) -> Result<Self, Error> {
14 let inner = stream.get_writer()?.unchecked_into();
15 Ok(Self { inner })
16 }
17
18 pub async fn write(&mut self, v: &JsValue) -> Result<(), Error> {
19 JsFuture::from(self.inner.write_with_chunk(v)).await?;
20 Ok(())
21 }
22
23 pub fn close(&mut self) {
24 self.inner.close().ignore();
25 }
26
27 pub fn abort(&mut self, reason: &str) {
28 let str = JsValue::from_str(reason);
29 self.inner.abort_with_reason(&str).ignore();
30 }
31
32 pub async fn closed(&self) -> Result<(), Error> {
33 JsFuture::from(self.inner.closed()).await?;
34 Ok(())
35 }
36}
37
38impl Drop for Writer {
39 fn drop(&mut self) {
40 self.inner.release_lock();
41 }
42}