#[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 for ReadableStreamUnderlyingSource
impl PartialEq 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 Freeze for ReadableStreamUnderlyingSource
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> Filterable for T
impl<T> Filterable for T
source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
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>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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