summaryrefslogtreecommitdiff
path: root/ext/web/06_streams.js
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2023-08-22 16:16:34 -0600
committerGitHub <noreply@github.com>2023-08-22 16:16:34 -0600
commit9b0130770467ef11f4c0d4acbb42a9f0cf4bfe7f (patch)
treed011b4d1e5d06da86e3c02e83aa12fd965611db5 /ext/web/06_streams.js
parentc37b9655b6a6ccff1cedc6e43d245fd55415d76f (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/06_streams.js')
-rw-r--r--ext/web/06_streams.js22
1 files changed, 15 insertions, 7 deletions
diff --git a/ext/web/06_streams.js b/ext/web/06_streams.js
index 0849d221d..9dde03b7f 100644
--- a/ext/web/06_streams.js
+++ b/ext/web/06_streams.js
@@ -724,7 +724,7 @@ function resourceForReadableStream(stream) {
PromisePrototypeCatch(
PromisePrototypeThen(
op_readable_stream_resource_await_close(rid),
- () => reader.cancel(),
+ () => reader.cancel("resource closed"),
),
() => {},
);
@@ -745,17 +745,25 @@ function resourceForReadableStream(stream) {
break;
}
} catch (err) {
- const message = err.message;
- if (message) {
- await op_readable_stream_resource_write_error(sink, err.message);
- } else {
- await op_readable_stream_resource_write_error(sink, String(err));
+ const message = err?.message;
+ const success = (message && (typeof message == "string"))
+ ? await op_readable_stream_resource_write_error(sink, message)
+ : await op_readable_stream_resource_write_error(
+ sink,
+ String(err),
+ );
+ // We don't cancel the reader if there was an error reading. We'll let the downstream
+ // consumer close the resource after it receives the error.
+ if (!success) {
+ reader.cancel("resource closed");
}
break;
}
// If the chunk has non-zero length, write it
if (value.length > 0) {
- await op_readable_stream_resource_write_buf(sink, value);
+ if (!await op_readable_stream_resource_write_buf(sink, value)) {
+ reader.cancel("resource closed");
+ }
}
}
} finally {