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/06_streams.js | |
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/06_streams.js')
-rw-r--r-- | ext/web/06_streams.js | 22 |
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 { |