#[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 ==
.impl StructuralPartialEq for ReadableStreamUnderlyingSource
Auto Trait Implementations§
impl RefUnwindSafe for ReadableStreamUnderlyingSource
impl !Send for ReadableStreamUnderlyingSource
impl !Sync for ReadableStreamUnderlyingSource
impl Unpin for ReadableStreamUnderlyingSource
impl UnwindSafe for ReadableStreamUnderlyingSource
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>where
F: FnOnce(&Self) -> bool,
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>where F: FnOnce(&Self) -> bool,
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more