Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions lib/internal/webstreams/readablestream.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
kState,
kType,
lazyTransfer,
markPromiseAsHandled,
nonOpCancel,
nonOpPull,
nonOpStart,
Expand Down Expand Up @@ -387,7 +388,11 @@
!!preventAbort,
!!preventCancel,
signal);
setPromiseHandled(promise);
// The pipeTo promise's rejection is also propagated through the
// destination stream's state, which the returned readable side
// observes via its own error path. markAsHandled silences the
// unhandled-rejection event without allocating a no-op .then chain.
markPromiseAsHandled(promise);

return readable;
}
Expand Down Expand Up @@ -1617,7 +1622,14 @@
disposable = addAbortListener(signal, abortAlgorithm);
}

setPromiseHandled(run());
// run() rejects when step() throws — i.e. when a write or a

Check failure on line 1625 in lib/internal/webstreams/readablestream.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

Non-ASCII character '—' detected. Consider replacing with: -
// writer.ready/closed await fails. Those same errors reach pipeTo via
// watchErrored on writer.closed / reader.closed (registered just below),
// which calls shutdownWithAnAction and ultimately resolves pipeTo's outer
// promise. The run() promise itself is otherwise unobserved, so a
// markAsHandled is sufficient to silence the unhandled-rejection event
// without allocating a no-op .then chain.
markPromiseAsHandled(run());

watchErrored(source, reader[kState].close.promise, (error) => {
if (!preventAbort) {
Expand Down
12 changes: 9 additions & 3 deletions lib/internal/webstreams/transfer.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const {

const {
kState,
setPromiseHandled,
markPromiseAsHandled,
} = require('internal/webstreams/util');

const {
Expand Down Expand Up @@ -279,7 +279,10 @@ function newCrossRealmReadableStream(writable, port) {

const promise = readableStreamPipeTo(readable, writable, false, false, false);

setPromiseHandled(promise);
// pipeTo's rejection here flows back via the MessagePort and the wrapped
// source/sink; nothing else observes this internal promise. markAsHandled
// silences the unhandled-rejection event without allocating .then chain.
markPromiseAsHandled(promise);

return {
readable,
Expand All @@ -295,7 +298,10 @@ function newCrossRealmWritableSink(readable, port) {

const promise = readableStreamPipeTo(readable, writable, false, false, false);

setPromiseHandled(promise);
// pipeTo's rejection here flows back via the MessagePort and the wrapped
// source/sink; nothing else observes this internal promise. markAsHandled
// silences the unhandled-rejection event without allocating .then chain.
markPromiseAsHandled(promise);

return {
writable,
Expand Down
2 changes: 2 additions & 0 deletions lib/internal/webstreams/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const {
kPending,
},
getPromiseDetails,
markPromiseAsHandled,
} = internalBinding('util');

const assert = require('internal/assert');
Expand Down Expand Up @@ -225,6 +226,7 @@ module.exports = {
kState,
kType,
lazyTransfer,
markPromiseAsHandled,
nonOpCancel,
nonOpFlush,
nonOpPull,
Expand Down
Loading