avoid emitting unhandled rejections on DecompressionStream#6108
Merged
Conversation
jasnell
reviewed
Feb 18, 2026
jasnell
reviewed
Feb 18, 2026
jasnell
reviewed
Feb 18, 2026
85a080d to
f2e4375
Compare
jasnell
reviewed
Feb 18, 2026
jasnell
reviewed
Feb 18, 2026
jasnell
approved these changes
Feb 18, 2026
f2e4375 to
b8f3e1c
Compare
This comment has been minimized.
This comment has been minimized.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #6061
DecompressionStream (and more broadly, any pipeThrough + async iteration pattern) generates spurious unhandledrejection events even when the caller properly catches errors. This was caused by three sites creating rejected promises that were never marked as handled:
(1) the pipeThrough error handler in readable.c++ unnecessarily re-wrapped rejections via js.rejectedPromise(), creating a transient unhandled promise before V8's microtask chain could adopt it — fixed by removing the redundant .then() and marking the pipe promise as handled directly;
(2) the async iterator's pushCurrent in iterator.h re-rejected in its error handler, orphaning a promise whose error was already propagated through nextImpl — fixed by swallowing the rejection with .catch_() since pushCurrent is purely bookkeeping;
(3) the async iterator's returnFunction in readable.c++ called reader->cancel() on an already-errored stream without catching the resulting rejection. Fixed by using .catch_() to swallow the expected error during teardown.