wasm_streams/readable/
sys.rs

1//! Raw bindings to JavaScript objects used
2//! by a [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream).
3use js_sys::{Array, ArrayBuffer, Error, Promise, Uint8Array};
4use wasm_bindgen::prelude::*;
5use web_sys::AbortSignal;
6
7// For backwards compatibility
8pub use ReadableStreamDefaultReadResult as ReadableStreamReadResult;
9
10use crate::queuing_strategy::QueuingStrategy;
11use crate::writable::sys::WritableStream;
12
13use super::into_underlying_byte_source::IntoUnderlyingByteSource;
14use super::into_underlying_source::IntoUnderlyingSource;
15
16#[wasm_bindgen]
17extern "C" {
18    /// A raw [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream).
19    ///
20    /// This represents the same JavaScript objects as [`web_sys::ReadableStream`].
21    /// If you're using an API that returns such an object, you can cast it to this type using
22    /// [`unchecked_into`][wasm_bindgen::JsCast::unchecked_into].
23    #[wasm_bindgen(js_name = ReadableStream, typescript_type = "ReadableStream")]
24    #[derive(Clone, Debug)]
25    pub type ReadableStream;
26
27    #[wasm_bindgen(constructor)]
28    pub fn new() -> ReadableStream;
29
30    #[wasm_bindgen(constructor)]
31    pub(crate) fn new_with_source(
32        source: IntoUnderlyingSource,
33        strategy: QueuingStrategy,
34    ) -> ReadableStream;
35
36    #[wasm_bindgen(constructor, catch)]
37    pub(crate) fn new_with_byte_source(
38        source: IntoUnderlyingByteSource,
39    ) -> Result<ReadableStream, Error>;
40
41    #[wasm_bindgen(method, getter, js_name = locked)]
42    pub fn is_locked(this: &ReadableStream) -> bool;
43
44    #[wasm_bindgen(method, js_name = cancel)]
45    pub fn cancel(this: &ReadableStream) -> Promise;
46
47    #[wasm_bindgen(method, js_name = cancel)]
48    pub fn cancel_with_reason(this: &ReadableStream, reason: &JsValue) -> Promise;
49
50    #[wasm_bindgen(method, catch, js_name = getReader)]
51    pub fn get_reader(this: &ReadableStream) -> Result<ReadableStreamDefaultReader, Error>;
52
53    #[wasm_bindgen(method, catch, js_name = getReader)]
54    pub fn get_reader_with_options(
55        this: &ReadableStream,
56        opts: ReadableStreamGetReaderOptions,
57    ) -> Result<ReadableStreamBYOBReader, Error>;
58
59    #[wasm_bindgen(method, js_name = pipeTo)]
60    pub fn pipe_to(this: &ReadableStream, dest: &WritableStream, opts: PipeOptions) -> Promise;
61
62    #[wasm_bindgen(method, catch, js_name = tee)]
63    pub fn tee(this: &ReadableStream) -> Result<Array, Error>;
64}
65
66#[wasm_bindgen]
67extern "C" {
68    /// A raw [`ReadableStreamDefaultController`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultController).
69    #[derive(Clone, Debug)]
70    pub type ReadableStreamDefaultController;
71
72    #[wasm_bindgen(method, getter, js_name = desiredSize)]
73    pub fn desired_size(this: &ReadableStreamDefaultController) -> Option<f64>;
74
75    #[wasm_bindgen(method, js_name = close)]
76    pub fn close(this: &ReadableStreamDefaultController);
77
78    #[wasm_bindgen(method, js_name = enqueue)]
79    pub fn enqueue(this: &ReadableStreamDefaultController, chunk: &JsValue);
80
81    #[wasm_bindgen(method, js_name = error)]
82    pub fn error(this: &ReadableStreamDefaultController, error: &JsValue);
83}
84
85#[wasm_bindgen]
86extern "C" {
87    /// A raw [`ReadableByteStreamController`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableByteStreamController).
88    #[derive(Clone, Debug)]
89    pub type ReadableByteStreamController;
90
91    #[wasm_bindgen(method, getter, js_name = byobRequest)]
92    pub fn byob_request(this: &ReadableByteStreamController) -> Option<ReadableStreamBYOBRequest>;
93
94    #[wasm_bindgen(method, getter, js_name = desiredSize)]
95    pub fn desired_size(this: &ReadableByteStreamController) -> Option<f64>;
96
97    #[wasm_bindgen(method, js_name = close)]
98    pub fn close(this: &ReadableByteStreamController);
99
100    #[wasm_bindgen(method, js_name = enqueue)]
101    pub fn enqueue(this: &ReadableByteStreamController, chunk: &ArrayBufferView);
102
103    #[wasm_bindgen(method, js_name = error)]
104    pub fn error(this: &ReadableByteStreamController, error: &JsValue);
105}
106
107#[wasm_bindgen]
108extern "C" {
109    /// A raw [`ReadableStreamBYOBRequest`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBRequest).
110    #[derive(Clone, Debug)]
111    pub type ReadableStreamBYOBRequest;
112
113    #[wasm_bindgen(method, getter, js_name = view)]
114    pub fn view(this: &ReadableStreamBYOBRequest) -> Option<ArrayBufferView>;
115
116    #[wasm_bindgen(method, js_name = respond)]
117    pub fn respond(this: &ReadableStreamBYOBRequest, bytes_written: u32);
118
119    #[wasm_bindgen(method, js_name = respondWithNewView)]
120    pub fn respond_with_new_view(this: &ReadableStreamBYOBRequest, view: &ArrayBufferView);
121}
122
123#[wasm_bindgen]
124extern "C" {
125    /// An [`ArrayBufferView`](https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView).
126    #[derive(Clone, Debug)]
127    pub type ArrayBufferView;
128
129    #[wasm_bindgen(method, getter, js_name = buffer)]
130    pub fn buffer(this: &ArrayBufferView) -> ArrayBuffer;
131
132    #[wasm_bindgen(method, getter, js_name = byteOffset)]
133    pub fn byte_offset(this: &ArrayBufferView) -> u32;
134
135    #[wasm_bindgen(method, getter, js_name = byteLength)]
136    pub fn byte_length(this: &ArrayBufferView) -> u32;
137}
138
139#[wasm_bindgen]
140extern "C" {
141    /// A raw [`ReadableStreamGenericReader`](https://streams.spec.whatwg.org/#readablestreamgenericreader).
142    #[derive(Clone, Debug)]
143    pub type ReadableStreamGenericReader;
144
145    #[wasm_bindgen(method, getter, js_name = closed)]
146    pub fn closed(this: &ReadableStreamGenericReader) -> Promise;
147
148    #[wasm_bindgen(method, js_name = cancel)]
149    pub fn cancel(this: &ReadableStreamGenericReader) -> Promise;
150
151    #[wasm_bindgen(method, js_name = cancel)]
152    pub fn cancel_with_reason(this: &ReadableStreamGenericReader, reason: &JsValue) -> Promise;
153
154    #[wasm_bindgen(method, catch, js_name = releaseLock)]
155    pub fn release_lock(this: &ReadableStreamGenericReader) -> Result<(), Error>;
156}
157
158#[wasm_bindgen]
159extern "C" {
160    /// A raw [`ReadableStreamDefaultReader`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader).
161    #[wasm_bindgen(extends = ReadableStreamGenericReader)]
162    #[derive(Clone, Debug)]
163    pub type ReadableStreamDefaultReader;
164
165    #[wasm_bindgen(method, js_name = read)]
166    pub fn read(this: &ReadableStreamDefaultReader) -> Promise;
167}
168
169#[wasm_bindgen]
170extern "C" {
171    /// A result returned by [`ReadableStreamDefaultReader.read`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader/read).
172    #[derive(Clone, Debug)]
173    pub type ReadableStreamDefaultReadResult;
174
175    #[wasm_bindgen(method, getter, js_name = done)]
176    pub fn is_done(this: &ReadableStreamDefaultReadResult) -> bool;
177
178    #[wasm_bindgen(method, getter, js_name = value)]
179    pub fn value(this: &ReadableStreamDefaultReadResult) -> JsValue;
180}
181
182#[wasm_bindgen]
183extern "C" {
184    /// A raw [`ReadableStreamBYOBReader`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader).
185    #[wasm_bindgen(extends = ReadableStreamGenericReader)]
186    #[derive(Clone, Debug)]
187    pub type ReadableStreamBYOBReader;
188
189    #[wasm_bindgen(method, js_name = read)]
190    pub fn read(this: &ReadableStreamBYOBReader, view: &ArrayBufferView) -> Promise;
191}
192
193#[wasm_bindgen]
194extern "C" {
195    /// A result returned by [`ReadableStreamBYOBReader.read`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/read).
196    #[derive(Clone, Debug)]
197    pub type ReadableStreamBYOBReadResult;
198
199    #[wasm_bindgen(method, getter, js_name = done)]
200    pub fn is_done(this: &ReadableStreamBYOBReadResult) -> bool;
201
202    #[wasm_bindgen(method, getter, js_name = value)]
203    pub fn value(this: &ReadableStreamBYOBReadResult) -> Option<Uint8Array>;
204}
205
206#[wasm_bindgen]
207#[derive(Clone, Copy, Debug, Eq, PartialEq)]
208pub enum ReadableStreamReaderMode {
209    BYOB = "byob",
210}
211
212/// Raw options for [`getReader()`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader).
213#[wasm_bindgen]
214#[derive(Clone, Debug)]
215pub struct ReadableStreamGetReaderOptions {
216    mode: ReadableStreamReaderMode,
217}
218
219impl ReadableStreamGetReaderOptions {
220    pub fn new(mode: ReadableStreamReaderMode) -> Self {
221        Self { mode }
222    }
223}
224
225#[wasm_bindgen]
226impl ReadableStreamGetReaderOptions {
227    #[wasm_bindgen(getter, js_name = mode)]
228    pub fn mode(&self) -> ReadableStreamReaderMode {
229        self.mode
230    }
231}
232
233/// Raw options for [`pipeTo()`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/pipeTo).
234#[wasm_bindgen]
235#[derive(Clone, Debug, Default)]
236pub struct PipeOptions {
237    prevent_close: bool,
238    prevent_cancel: bool,
239    prevent_abort: bool,
240    signal: Option<AbortSignal>,
241}
242
243impl PipeOptions {
244    pub fn new(
245        prevent_close: bool,
246        prevent_cancel: bool,
247        prevent_abort: bool,
248        signal: Option<AbortSignal>,
249    ) -> Self {
250        Self {
251            prevent_close,
252            prevent_cancel,
253            prevent_abort,
254            signal,
255        }
256    }
257}
258
259#[wasm_bindgen]
260impl PipeOptions {
261    #[wasm_bindgen(getter, js_name = preventClose)]
262    pub fn prevent_close(&self) -> bool {
263        self.prevent_close
264    }
265
266    #[wasm_bindgen(getter, js_name = preventCancel)]
267    pub fn prevent_cancel(&self) -> bool {
268        self.prevent_cancel
269    }
270
271    #[wasm_bindgen(getter, js_name = preventAbort)]
272    pub fn prevent_abort(&self) -> bool {
273        self.prevent_abort
274    }
275
276    #[wasm_bindgen(getter, js_name = signal)]
277    pub fn signal(&self) -> Option<AbortSignal> {
278        self.signal.clone()
279    }
280}