From 23ba2054f3a356d600f7ff8041cbe57c5cd4c1a0 Mon Sep 17 00:00:00 2001 From: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> Date: Wed, 4 Mar 2026 15:26:01 +0100 Subject: [PATCH 1/5] doc: fix markdown for `expectFailure` values PR-URL: https://github.com/nodejs/node/pull/62100 Reviewed-By: Antoine du Hamel Reviewed-By: Colin Ihrig Reviewed-By: Ethan Arrowood --- doc/api/test.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/doc/api/test.md b/doc/api/test.md index 76ffe2f215af90..c526aec69735d9 100644 --- a/doc/api/test.md +++ b/doc/api/test.md @@ -287,11 +287,7 @@ it('should do the thing', { expectFailure: 'feature not implemented' }, () => { }); ``` -If the value of `expectFailure` is a -[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) | -[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function) | -[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) | -[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error), +If the value of `expectFailure` is a {RegExp|Function|Object|Error} the tests will pass only if they throw a matching value. See [`assert.throws`][] for how each value type is handled. @@ -1734,11 +1730,7 @@ changes: **Default:** `false`. * `expectFailure` {boolean|string|RegExp|Function|Object|Error} If truthy, the test is expected to fail. If a non-empty string is provided, that string is displayed - in the test results as the reason why the test is expected to fail. If a - [](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp), - [](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function), - [](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object), or - [](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) + in the test results as the reason why the test is expected to fail. If a {RegExp|Function|Object|Error} is provided directly (without wrapping in `{ match: … }`), the test passes only if the thrown error matches, following the behavior of [`assert.throws`][]. To provide both a reason and validation, pass an object From ef0f0b086522243e4c7276a6bfa8575e0e1cd861 Mon Sep 17 00:00:00 2001 From: Mike McCready <66998419+MikeMcC399@users.noreply.github.com> Date: Wed, 4 Mar 2026 15:44:55 +0100 Subject: [PATCH 2/5] doc: update supported Windows SDK version to 11 PR-URL: https://github.com/nodejs/node/pull/61973 Refs: https://github.com/nodejs/node/pull/61864 Reviewed-By: Stefan Stojanovic Reviewed-By: Matteo Collina Reviewed-By: Colin Ihrig Reviewed-By: Chengzhong Wu --- BUILDING.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 9e6ec9908c58eb..7e02b260ca77c3 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -154,11 +154,11 @@ platforms. This is true regardless of entries in the table below. Depending on the host platform, the selection of toolchains may vary. -| Operating System | Compiler Versions | -| ---------------- | ------------------------------------------------------------------------- | -| Linux | GCC >= 12.2 or Clang >= 19.1 | -| Windows | Visual Studio 2022 or 2026 with the Windows 10 or 11 SDK on a 64-bit host | -| macOS | Xcode >= 16.4 (Apple LLVM >= 19) | +| Operating System | Compiler Versions | +| ---------------- | ------------------------------------------------------------------- | +| Linux | GCC >= 12.2 or Clang >= 19.1 | +| Windows | Visual Studio 2022 or 2026 with the Windows 11 SDK on a 64-bit host | +| macOS | Xcode >= 16.4 (Apple LLVM >= 19) | ### Official binary platforms and toolchains From 16472884aa39450b12ade247a733b1640e7fcb9a Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 4 Mar 2026 17:02:27 +0100 Subject: [PATCH 3/5] stream: fix TransformStream race on cancel with pending write Signed-off-by: marcopiraccini PR-URL: https://github.com/nodejs/node/pull/62040 Fixes: https://github.com/nodejs/node/issues/62036 Reviewed-By: Matteo Collina Reviewed-By: Paolo Insogna Reviewed-By: Mattias Buelens --- lib/internal/webstreams/transformstream.js | 8 ++- ...hatwg-transformstream-cancel-write-race.js | 51 +++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 test/parallel/test-whatwg-transformstream-cancel-write-race.js diff --git a/lib/internal/webstreams/transformstream.js b/lib/internal/webstreams/transformstream.js index 371b597dc681d6..e2d15c05bca249 100644 --- a/lib/internal/webstreams/transformstream.js +++ b/lib/internal/webstreams/transformstream.js @@ -72,7 +72,6 @@ const { const assert = require('internal/assert'); const kSkipThrow = Symbol('kSkipThrow'); - const getNonWritablePropertyDescriptor = (value) => { return { __proto__: null, @@ -524,7 +523,12 @@ function transformStreamDefaultControllerError(controller, error) { async function transformStreamDefaultControllerPerformTransform(controller, chunk) { try { - return await controller[kState].transformAlgorithm(chunk, controller); + const transformAlgorithm = controller[kState].transformAlgorithm; + if (transformAlgorithm === undefined) { + // Algorithms were cleared by a concurrent cancel/abort/close. + return; + } + return await transformAlgorithm(chunk, controller); } catch (error) { transformStreamError(controller[kState].stream, error); throw error; diff --git a/test/parallel/test-whatwg-transformstream-cancel-write-race.js b/test/parallel/test-whatwg-transformstream-cancel-write-race.js new file mode 100644 index 00000000000000..5c32a25b9246f9 --- /dev/null +++ b/test/parallel/test-whatwg-transformstream-cancel-write-race.js @@ -0,0 +1,51 @@ +'use strict'; + +require('../common'); +const { test } = require('node:test'); +const assert = require('node:assert'); +const { TransformStream } = require('stream/web'); +const { setTimeout } = require('timers/promises'); + +// https://github.com/nodejs/node/issues/62036 + +test('Late write racing with reader.cancel() should not throw an internal TypeError', async () => { + const stream = new TransformStream({ + transform(chunk, controller) { + controller.enqueue(chunk); + }, + }); + + await setTimeout(0); + + const reader = stream.readable.getReader(); + const writer = stream.writable.getWriter(); + + // Release backpressure. + const pendingRead = reader.read(); + + // Simulate client disconnect / shutdown. + const pendingCancel = reader.cancel(new Error('client disconnected')); + + // Late write racing with cancel. + const pendingLateWrite = writer.write('late-write'); + + const [ + readResult, + cancelResult, + lateWriteResult, + ] = await Promise.allSettled([ + pendingRead, + pendingCancel, + pendingLateWrite, + ]); + + assert.strictEqual(readResult.status, 'fulfilled'); + assert.strictEqual(cancelResult.status, 'fulfilled'); + if (lateWriteResult.status === 'rejected') { + const err = lateWriteResult.reason; + const isNotAFunction = err instanceof TypeError && + /transformAlgorithm is not a function/.test(err.message); + assert.ok(!isNotAFunction, + `Internal implementation error leaked: ${err.message}`); + } +}); From 7c4dc34c28a4ff95058c945c9db2c98fe73a9919 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Wed, 4 Mar 2026 16:43:14 +0000 Subject: [PATCH 4/5] tools: fix example in release proposal linter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `changelog-maker` writes 10 character length short form SHA's. Explicitly set the `git log format` in the example to match. PR-URL: https://github.com/nodejs/node/pull/62074 Reviewed-By: Tierney Cyren Reviewed-By: Luigi Pinca Reviewed-By: Ulises Gascón Reviewed-By: Stewart X Addison Reviewed-By: Colin Ihrig --- tools/actions/lint-release-proposal-commit-list.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/actions/lint-release-proposal-commit-list.mjs b/tools/actions/lint-release-proposal-commit-list.mjs index 9bbc7159fbf17a..a51f0c590026cf 100755 --- a/tools/actions/lint-release-proposal-commit-list.mjs +++ b/tools/actions/lint-release-proposal-commit-list.mjs @@ -6,6 +6,7 @@ // Example: // $ git log upstream/vXX.x...upstream/vX.X.X-proposal \ // --reverse --format='{"prURL":"%(trailers:key=PR-URL,valueonly,separator=)","title":"%s","smallSha":"%h"}' \ +// --abbrev=10 \ // | sed 's/,"title":"Revert "\([^"]\+\)""/,"title":"Revert \\"\1\\""/g' \ // | ./lint-release-proposal-commit-list.mjs "path/to/CHANGELOG.md" "$(git rev-parse upstream/vX.X.X-proposal)" From 55363254cc8d6fd105f34b30ceae572dfb2e4210 Mon Sep 17 00:00:00 2001 From: Filip Skokan Date: Wed, 4 Mar 2026 18:25:42 +0100 Subject: [PATCH 5/5] tools: fix daily wpt workflow nighly release version lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/62076 Reviewed-By: Richard Lau Reviewed-By: Antoine du Hamel Reviewed-By: Colin Ihrig Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca --- .github/workflows/daily-wpt-fyi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/daily-wpt-fyi.yml b/.github/workflows/daily-wpt-fyi.yml index 4f721e03d0feae..2cc430223a3425 100644 --- a/.github/workflows/daily-wpt-fyi.yml +++ b/.github/workflows/daily-wpt-fyi.yml @@ -49,7 +49,7 @@ jobs: # install a version and checkout - name: Get latest nightly if: matrix.node-version == 'latest-nightly' - run: echo "NIGHTLY=$(curl -s https://nodejs.org/download/nightly/index.json | jq -r '[.[] | select(.files[] | contains("linux-x64"))][0].version')" >> $GITHUB_ENV + run: echo "NIGHTLY=$(curl -s https://nodejs.org/download/nightly/index.json | jq -r '[.[] | select(.files[] | contains("linux-arm64"))][0].version')" >> $GITHUB_ENV - name: Install Node.js id: setup-node uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0