Skip to content

stream: fix unhandled rejection for errored pipeTo writes#64580

Open
dushyant-hada-90 wants to merge 1 commit into
nodejs:mainfrom
dushyant-hada-90:fix-pipeto-unhandled-rejection
Open

stream: fix unhandled rejection for errored pipeTo writes#64580
dushyant-hada-90 wants to merge 1 commit into
nodejs:mainfrom
dushyant-hada-90:fix-pipeto-unhandled-rejection

Conversation

@dushyant-hada-90

@dushyant-hada-90 dushyant-hada-90 commented Jul 18, 2026

Copy link
Copy Markdown

Fixes a v26.4.0 regression where ReadableStream.pipeTo() could crash the
process with an unhandled rejection even when the pipeTo() promise
rejection was already caught.

In #63572, per-chunk setPromiseHandled() was replaced with
markPromiseAsHandled(). That is safe for pending write promises, but when
a later chunk is written after the destination has already errored,
writableStreamDefaultWriterWrite() returns an already-rejected promise.
Marking that promise handled afterwards does not cancel V8's pending
unhandled-rejection notification.

This keeps markPromiseAsHandled() on the writable fast path and falls
back to setPromiseHandled() when the destination is no longer writable
(or close is queued/in flight).

No documentation changes; behavior is restored to match Node.js ≤ v26.3.1,
Deno, Bun, and browsers.

Checklist
  • make -j4 test (UNIX) or vcbuild test (Windows) passes / CI will validate
  • tests and/or benchmarks are included
  • documentation is changed or added
  • commit message follows commit guidelines

Fixes: #64561
Refs: #63572

markPromiseAsHandled does not cancel V8's unhandled-rejection
notification when the write promise is already rejected. Fall back
to setPromiseHandled when the destination is no longer writable.

Fixes: nodejs#64561
Refs: nodejs#63572
Signed-off-by: dushyant <dushyanthada90@gmail.com>
@nodejs-github-bot nodejs-github-bot added needs-ci PRs that need a full CI run. web streams labels Jul 18, 2026
@codecov

codecov Bot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.24%. Comparing base (fb5d01f) to head (3cfa60c).
⚠️ Report is 10 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #64580      +/-   ##
==========================================
- Coverage   90.24%   90.24%   -0.01%     
==========================================
  Files         739      739              
  Lines      241772   241787      +15     
  Branches    45561    45571      +10     
==========================================
- Hits       218194   218192       -2     
- Misses      15111    15120       +9     
- Partials     8467     8475       +8     
Files with missing lines Coverage Δ
lib/internal/webstreams/readablestream.js 98.19% <100.00%> (+<0.01%) ⬆️

... and 30 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@avivkeller

Copy link
Copy Markdown
Member

@nodejs/streams

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-ci PRs that need a full CI run. web streams

Projects

None yet

Development

Successfully merging this pull request may close these issues.

TransformStream error during pipeTo crashes the process despite being caught (v26.4.0 regression)

3 participants