From a8cf23b053879e46fc5f38853e5be0c4c8501eaf Mon Sep 17 00:00:00 2001 From: Mattias Buelens Date: Tue, 8 Nov 2022 20:59:34 +0100 Subject: [PATCH 1/3] Stop calling byobRequest.respond(0) on cancel --- src/readable/into_underlying_byte_source.rs | 34 ++------------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/src/readable/into_underlying_byte_source.rs b/src/readable/into_underlying_byte_source.rs index 2ceb141..12483dc 100644 --- a/src/readable/into_underlying_byte_source.rs +++ b/src/readable/into_underlying_byte_source.rs @@ -78,10 +78,6 @@ impl Drop for IntoUnderlyingByteSource { if let Some(handle) = self.pull_handle.take() { handle.abort(); } - // Close the pending BYOB request, if any. This is necessary for cancellation. - if let Some(request) = self.controller.take().and_then(|c| c.byob_request()) { - request.respond(0); - } } } @@ -106,9 +102,9 @@ impl Inner { // after the stream has closed or encountered an error. let async_read = self.async_read.as_mut().unwrap_throw(); // We set autoAllocateChunkSize, so there should always be a BYOB request. - let mut request = ByobRequestGuard::new(controller.byob_request().unwrap_throw()); + let request = controller.byob_request().unwrap_throw(); // Resize the buffer to fit the BYOB request. - let request_view = request.view(); + let request_view = request.view().unwrap_throw(); let request_len = clamp_to_usize(request_view.byte_length()); if self.buffer.len() < request_len { self.buffer.resize(request_len, 0); @@ -148,29 +144,3 @@ impl Inner { self.buffer = Vec::new(); } } - -#[derive(Debug)] -struct ByobRequestGuard(Option); - -impl ByobRequestGuard { - fn new(request: sys::ReadableStreamBYOBRequest) -> Self { - Self(Some(request)) - } - - fn view(&mut self) -> sys::ArrayBufferView { - self.0.as_mut().unwrap_throw().view().unwrap_throw() - } - - fn respond(mut self, bytes_read: u32) { - self.0.take().unwrap_throw().respond(bytes_read); - } -} - -impl Drop for ByobRequestGuard { - fn drop(&mut self) { - // Close the BYOB request, if still pending. This is necessary for cancellation. - if let Some(request) = self.0.take() { - request.respond(0); - } - } -} From d4a59fe76f60da85ce21be8b69f4a9a57c17b157 Mon Sep 17 00:00:00 2001 From: Mattias Buelens Date: Tue, 8 Nov 2022 21:08:47 +0100 Subject: [PATCH 2/3] Forward errors from controller and BYOB request methods --- src/readable/into_underlying_byte_source.rs | 6 ++--- src/readable/into_underlying_source.rs | 4 +-- src/readable/sys.rs | 30 ++++++++++++--------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/readable/into_underlying_byte_source.rs b/src/readable/into_underlying_byte_source.rs index 12483dc..0a77ca2 100644 --- a/src/readable/into_underlying_byte_source.rs +++ b/src/readable/into_underlying_byte_source.rs @@ -113,8 +113,8 @@ impl Inner { Ok(0) => { // The stream has closed, drop it. self.discard(); - controller.close(); - request.respond(0); + controller.close()?; + request.respond(0)?; } Ok(bytes_read) => { // Copy read bytes from buffer to BYOB request view @@ -127,7 +127,7 @@ impl Inner { ); dest.copy_from(&self.buffer[0..bytes_read]); // Respond to BYOB request - request.respond(bytes_read_u32); + request.respond(bytes_read_u32)?; } Err(err) => { // The stream encountered an error, drop it. diff --git a/src/readable/into_underlying_source.rs b/src/readable/into_underlying_source.rs index 5635aba..75747da 100644 --- a/src/readable/into_underlying_source.rs +++ b/src/readable/into_underlying_source.rs @@ -82,11 +82,11 @@ impl Inner { // after the stream has closed or encountered an error. let stream = self.stream.as_mut().unwrap_throw(); match stream.try_next().await { - Ok(Some(chunk)) => controller.enqueue(&chunk), + Ok(Some(chunk)) => controller.enqueue(&chunk)?, Ok(None) => { // The stream has closed, drop it. self.stream = None; - controller.close(); + controller.close()?; } Err(err) => { // The stream encountered an error, drop it. diff --git a/src/readable/sys.rs b/src/readable/sys.rs index 13a5a00..4051c96 100644 --- a/src/readable/sys.rs +++ b/src/readable/sys.rs @@ -72,11 +72,11 @@ extern "C" { #[wasm_bindgen(method, getter, js_name = desiredSize)] pub fn desired_size(this: &ReadableStreamDefaultController) -> Option; - #[wasm_bindgen(method, js_name = close)] - pub fn close(this: &ReadableStreamDefaultController); + #[wasm_bindgen(method, catch, js_name = close)] + pub fn close(this: &ReadableStreamDefaultController) -> Result<(), JsValue>; - #[wasm_bindgen(method, js_name = enqueue)] - pub fn enqueue(this: &ReadableStreamDefaultController, chunk: &JsValue); + #[wasm_bindgen(method, catch, js_name = enqueue)] + pub fn enqueue(this: &ReadableStreamDefaultController, chunk: &JsValue) -> Result<(), JsValue>; #[wasm_bindgen(method, js_name = error)] pub fn error(this: &ReadableStreamDefaultController, error: &JsValue); @@ -94,11 +94,14 @@ extern "C" { #[wasm_bindgen(method, getter, js_name = desiredSize)] pub fn desired_size(this: &ReadableByteStreamController) -> Option; - #[wasm_bindgen(method, js_name = close)] - pub fn close(this: &ReadableByteStreamController); + #[wasm_bindgen(method, catch, js_name = close)] + pub fn close(this: &ReadableByteStreamController) -> Result<(), JsValue>; - #[wasm_bindgen(method, js_name = enqueue)] - pub fn enqueue(this: &ReadableByteStreamController, chunk: &ArrayBufferView); + #[wasm_bindgen(method, catch, js_name = enqueue)] + pub fn enqueue( + this: &ReadableByteStreamController, + chunk: &ArrayBufferView, + ) -> Result<(), JsValue>; #[wasm_bindgen(method, js_name = error)] pub fn error(this: &ReadableByteStreamController, error: &JsValue); @@ -113,11 +116,14 @@ extern "C" { #[wasm_bindgen(method, getter, js_name = view)] pub fn view(this: &ReadableStreamBYOBRequest) -> Option; - #[wasm_bindgen(method, js_name = respond)] - pub fn respond(this: &ReadableStreamBYOBRequest, bytes_written: u32); + #[wasm_bindgen(method, catch, js_name = respond)] + pub fn respond(this: &ReadableStreamBYOBRequest, bytes_written: u32) -> Result<(), JsValue>; - #[wasm_bindgen(method, js_name = respondWithNewView)] - pub fn respond_with_new_view(this: &ReadableStreamBYOBRequest, view: &ArrayBufferView); + #[wasm_bindgen(method, catch, js_name = respondWithNewView)] + pub fn respond_with_new_view( + this: &ReadableStreamBYOBRequest, + view: &ArrayBufferView, + ) -> Result<(), JsValue>; } #[wasm_bindgen] From 18e48a3a7e8bb3d684bd51bcbf01e8d243d0097c Mon Sep 17 00:00:00 2001 From: Mattias Buelens Date: Tue, 8 Nov 2022 21:33:04 +0100 Subject: [PATCH 3/3] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77db314..ff7e05b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +* Stop calling `byobRequest.respond(0)` on cancel ([#16](https://github.com/MattiasBuelens/wasm-streams/pull/16)) + ## v0.3.0 (2022-10-16) * Added support for web workers, by removing usage of [JavaScript snippets](https://rustwasm.github.io/docs/wasm-bindgen/reference/js-snippets.html). ([#13](https://github.com/MattiasBuelens/wasm-streams/issues/13), [#14](https://github.com/MattiasBuelens/wasm-streams/pull/14))