mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Stream implement pipeThrough (#36977)
Part of https://github.com/servo/servo/issues/34676 https://github.com/servo/servo/pull/36905 needs to be merged first. --------- Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com>
This commit is contained in:
parent
d8294fa423
commit
5b2305784a
16 changed files with 129 additions and 227 deletions
|
@ -24,7 +24,7 @@ use js::typedarray::ArrayBufferViewU8;
|
|||
use crate::dom::bindings::codegen::Bindings::QueuingStrategyBinding::QueuingStrategy;
|
||||
use crate::dom::bindings::codegen::Bindings::ReadableStreamBinding::{
|
||||
ReadableStreamGetReaderOptions, ReadableStreamMethods, ReadableStreamReaderMode,
|
||||
StreamPipeOptions,
|
||||
ReadableWritablePair, StreamPipeOptions,
|
||||
};
|
||||
use script_bindings::str::DOMString;
|
||||
|
||||
|
@ -2006,6 +2006,50 @@ impl ReadableStreamMethods<crate::DomTypeHolder> for ReadableStream {
|
|||
can_gc,
|
||||
)
|
||||
}
|
||||
|
||||
/// <https://streams.spec.whatwg.org/#rs-pipe-through>
|
||||
fn PipeThrough(
|
||||
&self,
|
||||
transform: &ReadableWritablePair,
|
||||
options: &StreamPipeOptions,
|
||||
realm: InRealm,
|
||||
can_gc: CanGc,
|
||||
) -> Fallible<DomRoot<ReadableStream>> {
|
||||
let global = self.global();
|
||||
let cx = GlobalScope::get_cx();
|
||||
|
||||
// If ! IsReadableStreamLocked(this) is true, throw a TypeError exception.
|
||||
if self.is_locked() {
|
||||
return Err(Error::Type("Source stream is locked".to_owned()));
|
||||
}
|
||||
|
||||
// If ! IsWritableStreamLocked(transform["writable"]) is true, throw a TypeError exception.
|
||||
if transform.writable.is_locked() {
|
||||
return Err(Error::Type("Destination stream is locked".to_owned()));
|
||||
}
|
||||
|
||||
// Let signal be options["signal"] if it exists, or undefined otherwise.
|
||||
// TODO: implement AbortSignal.
|
||||
|
||||
// Let promise be ! ReadableStreamPipeTo(this, transform["writable"],
|
||||
// options["preventClose"], options["preventAbort"], options["preventCancel"], signal).
|
||||
let promise = self.pipe_to(
|
||||
cx,
|
||||
&global,
|
||||
&transform.writable,
|
||||
options.preventAbort,
|
||||
options.preventCancel,
|
||||
options.preventClose,
|
||||
realm,
|
||||
can_gc,
|
||||
);
|
||||
|
||||
// Set promise.[[PromiseIsHandled]] to true.
|
||||
promise.set_promise_is_handled();
|
||||
|
||||
// Return transform["readable"].
|
||||
Ok(transform.readable.clone())
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unsafe_code)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue