summaryrefslogtreecommitdiff
path: root/ext/web/06_streams.js
diff options
context:
space:
mode:
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 {