diff options
author | Matt Mastracci <matthew@mastracci.com> | 2023-08-22 16:16:34 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-22 16:16:34 -0600 |
commit | 9b0130770467ef11f4c0d4acbb42a9f0cf4bfe7f (patch) | |
tree | d011b4d1e5d06da86e3c02e83aa12fd965611db5 /ext/web/stream_resource.rs | |
parent | c37b9655b6a6ccff1cedc6e43d245fd55415d76f (diff) |
fix(ext/web): better handling of errors in resourceForReadableStream (#20238)
Improves error handling when the Resource is closed in various phases of
the ReadableStream. Ensure that we send a consistent `cancel` reason.
Diffstat (limited to 'ext/web/stream_resource.rs')
-rw-r--r-- | ext/web/stream_resource.rs | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/ext/web/stream_resource.rs b/ext/web/stream_resource.rs index 4c2a75648..0c483eccc 100644 --- a/ext/web/stream_resource.rs +++ b/ext/web/stream_resource.rs @@ -111,6 +111,10 @@ impl Resource for ReadableStreamResource { fn read(self: Rc<Self>, limit: usize) -> AsyncResult<BufView> { Box::pin(ReadableStreamResource::read(self, limit)) } + + fn close(self: Rc<Self>) { + self.cancel_handle.cancel(); + } } // TODO(mmastrac): Move this to deno_core @@ -155,10 +159,6 @@ impl Future for CompletionHandle { } } -fn sender_closed() -> Error { - type_error("sender closed") -} - /// Allocate a resource that wraps a ReadableStream. #[op2(fast)] #[smi] @@ -210,15 +210,13 @@ fn drop_sender(sender: *const c_void) { pub fn op_readable_stream_resource_write_buf( sender: *const c_void, #[buffer] buffer: JsBuffer, -) -> impl Future<Output = Result<(), Error>> { +) -> impl Future<Output = bool> { let sender = get_sender(sender); async move { - let sender = sender.ok_or_else(sender_closed)?; - sender - .send(Ok(buffer.into())) - .await - .map_err(|_| sender_closed())?; - Ok(()) + let Some(sender) = sender else { + return false; + }; + sender.send(Ok(buffer.into())).await.ok().is_some() } } @@ -226,15 +224,17 @@ pub fn op_readable_stream_resource_write_buf( pub fn op_readable_stream_resource_write_error( sender: *const c_void, #[string] error: String, -) -> impl Future<Output = Result<(), Error>> { +) -> impl Future<Output = bool> { let sender = get_sender(sender); async move { - let sender = sender.ok_or_else(sender_closed)?; + let Some(sender) = sender else { + return false; + }; sender .send(Err(type_error(Cow::Owned(error)))) .await - .map_err(|_| sender_closed())?; - Ok(()) + .ok() + .is_some() } } |