Struct mozjs::jsapi::JS::ReadableStreamUnderlyingSource
source · #[repr(C)]pub struct ReadableStreamUnderlyingSource {
pub vtable_: *const ReadableStreamUnderlyingSource__bindgen_vtable,
}
Expand description
Abstract base class for external underlying sources.
The term “underlying source” is defined in the Streams spec: https://streams.spec.whatwg.org/#underlying-source
A ReadableStreamUnderlyingSource
is an underlying source that is
implemented in C++ rather than JS. It can be passed to
JS::NewReadableExternalSourceStreamObject
to create a custom,
embedding-defined ReadableStream.
There are several API difference between this class and the standard API for underlying sources implemented in JS:
-
JS underlying sources can be either byte sources or non-byte sources. External underlying source are always byte sources.
-
The C++ API does not bother with controller objects. Instead of using controller methods, the underlying source directly calls API functions like JS::ReadableStream{UpdateDataAvailableFromSource,Close,Error}.
-
External readable streams are optimized to allow the embedding to interact with them with a minimum of overhead: chunks aren’t enqueued as individual typed arrays; instead, the embedding only updates the amount of data available using JS::ReadableStreamUpdateDataAvailableFromSource. When JS requests data from a reader, writeIntoReadRequestBuffer is invoked, asking the embedding to write data directly into the buffer we’re about to hand to JS.
-
The C++ API provides extra callbacks onClosed() and onErrored().
-
This class has a
finalize()
method, because C++ cares about lifetimes.
Additionally, ReadableStreamGetExternalUnderlyingSource can be used to get the pointer to the underlying source. This locks the stream until it is released again using JS::ReadableStreamReleaseExternalUnderlyingSource.
Embeddings can use this to optimize away the JS ReadableStream
overhead
when an embedding-defined C++ stream is passed to an embedding-defined C++
consumer. For example, consider a ServiceWorker piping a fetch
Response
body to a TextDecoder. Instead of copying chunks of data into JS typed array
buffers and creating a Promise per chunk, only to immediately resolve the
Promises and read the data out again, the embedding can directly feed the
incoming data to the TextDecoder.
Compartment safety: All methods (except finalize
) receive cx
and
stream
arguments. SpiderMonkey enters the realm of the stream object
before invoking these methods, so stream
is never a wrapper. Other
arguments may be wrappers.
Fields§
§vtable_: *const ReadableStreamUnderlyingSource__bindgen_vtable
Trait Implementations§
source§impl PartialEq<ReadableStreamUnderlyingSource> for ReadableStreamUnderlyingSource
impl PartialEq<ReadableStreamUnderlyingSource> for ReadableStreamUnderlyingSource
source§fn eq(&self, other: &ReadableStreamUnderlyingSource) -> bool
fn eq(&self, other: &ReadableStreamUnderlyingSource) -> bool
self
and other
values to be equal, and is used
by ==
.