diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index a718e5404e94cb..4577d791d65229 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -28,6 +28,7 @@ const { } = primordials; const { + AbortError, codes: { ERR_ILLEGAL_CONSTRUCTOR, ERR_INVALID_ARG_VALUE, @@ -1303,8 +1304,14 @@ function readableStreamPipeTo( } function abortAlgorithm() { - // Cannot use the AbortError class here. It must be a DOMException - const error = new DOMException('The operation was aborted', 'AbortError'); + let error; + if (signal.reason instanceof AbortError) { + // Cannot use the AbortError class here. It must be a DOMException. + error = new DOMException(signal.reason.message, 'AbortError'); + } else { + error = signal.reason; + } + const actions = []; if (!preventAbort) { ArrayPrototypePush( diff --git a/test/parallel/test-webstream-readablestream-pipeto.js b/test/parallel/test-webstream-readablestream-pipeto.js new file mode 100644 index 00000000000000..95929c5197a275 --- /dev/null +++ b/test/parallel/test-webstream-readablestream-pipeto.js @@ -0,0 +1,24 @@ +// Flags: --expose-internals +'use strict'; + +require('../common'); +const assert = require('node:assert'); +const { AbortError } = require('internal/errors'); + +// Purpose: pass an AbortError instance, which isn't the DOMException, as an +// abort reason. + +for (const message of [undefined, 'abc']) { + const rs = new ReadableStream(); + const ws = new WritableStream(); + const ac = new AbortController(); + const reason = new AbortError(message); + ac.abort(reason); + + assert.rejects(rs.pipeTo(ws, { signal: ac.signal }), (e) => { + assert(e instanceof DOMException); + assert.strictEqual(e.name, 'AbortError'); + assert.strictEqual(e.message, reason.message); + return true; + }); +} diff --git a/test/wpt/status/streams.json b/test/wpt/status/streams.json index 7f76e697a648a9..6f9a806a33abf1 100644 --- a/test/wpt/status/streams.json +++ b/test/wpt/status/streams.json @@ -2,15 +2,6 @@ "piping/abort.any.js": { "fail": { "expected": [ - "(reason: 'null') all the error objects should be the same object", - "(reason: 'undefined') all the error objects should be the same object", - "(reason: 'error1: error1') all the error objects should be the same object", - "(reason: 'null') abort should prevent further reads", - "(reason: 'undefined') abort should prevent further reads", - "(reason: 'error1: error1') abort should prevent further reads", - "(reason: 'null') all pending writes should complete on abort", - "(reason: 'undefined') all pending writes should complete on abort", - "(reason: 'error1: error1') all pending writes should complete on abort", "pipeTo on a teed readable byte stream should only be aborted when both branches are aborted" ] }