Skip to content

Commit cd9a52e

Browse files
authored
Merge branch 'nodejs:main' into fix-http-inspector-request-body
2 parents c758658 + 1f371fc commit cd9a52e

150 files changed

Lines changed: 5484 additions & 2282 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

BUILDING.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ and libc version. The table below lists the support tier for each supported
9898
combination. A list of [supported compile toolchains](#supported-toolchains) is
9999
also supplied for tier 1 platforms.
100100

101-
**For production applications, run Node.js on supported platforms only.**
101+
**For production applications, run Node.js on supported platforms only (Tier 1 or 2).**
102102

103103
Node.js does not support a platform version if a vendor has expired support
104104
for it. In other words, Node.js does not support running on End-of-Life (EoL)
@@ -752,7 +752,7 @@ Refs:
752752
To install it, select the following two optional components:
753753
* C++ Clang Compiler for Windows (Microsoft.VisualStudio.Component.VC.Llvm.Clang)
754754
* MSBuild support for LLVM (clang-cl) toolset (Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset)
755-
* As an alternative to Visual Studio 2026, download Visual Studio 2022 Current channel Version 17.4 from the
755+
* As an alternative to Visual Studio 2026, download Visual Studio 2022 Current channel Version 17.14 from the
756756
[Evergreen bootstrappers](https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-history#evergreen-bootstrappers)
757757
table and install using the same workload and optional component selection as described above.
758758
* Basic Unix tools required for some tests,

CHANGELOG.md

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
Select a Node.js version below to view the changelog history:
44

55
* [Node.js 26](doc/changelogs/CHANGELOG_V26.md) **Current**
6-
* [Node.js 25](doc/changelogs/CHANGELOG_V25.md) **Current**
6+
* [Node.js 25](doc/changelogs/CHANGELOG_V25.md) Current
77
* [Node.js 24](doc/changelogs/CHANGELOG_V24.md) **Long Term Support**
88
* [Node.js 23](doc/changelogs/CHANGELOG_V23.md) End-of-Life
99
* [Node.js 22](doc/changelogs/CHANGELOG_V22.md) Long Term Support
1010
* [Node.js 21](doc/changelogs/CHANGELOG_V21.md) End-of-Life
11-
* [Node.js 20](doc/changelogs/CHANGELOG_V20.md) Long Term Support
11+
* [Node.js 20](doc/changelogs/CHANGELOG_V20.md) End-of-Life
1212
* [Node.js 19](doc/changelogs/CHANGELOG_V19.md) End-of-Life
1313
* [Node.js 18](doc/changelogs/CHANGELOG_V18.md) End-of-Life
1414
* [Node.js 17](doc/changelogs/CHANGELOG_V17.md) End-of-Life
@@ -39,7 +39,6 @@ release.
3939
<th title="Current"><a href="doc/changelogs/CHANGELOG_V25.md">25</a> (Current)</th>
4040
<th title="LTS Until 2028-04"><a href="doc/changelogs/CHANGELOG_V24.md">24</a> (LTS)</th>
4141
<th title="LTS Until 2027-04"><a href="doc/changelogs/CHANGELOG_V22.md">22</a> (LTS)</th>
42-
<th title="LTS Until 2026-04"><a href="doc/changelogs/CHANGELOG_V20.md">20</a> (LTS)</th>
4342
</tr>
4443
<tr>
4544
<td valign="top">
@@ -87,21 +86,6 @@ release.
8786
<a href="doc/changelogs/CHANGELOG_V24.md#24.0.0">24.0.0</a><br/>
8887
</td>
8988
<td valign="top">
90-
<b><a href="doc/changelogs/CHANGELOG_V23.md#23.11.0">23.11.0</a></b><br/>
91-
<a href="doc/changelogs/CHANGELOG_V23.md#23.10.0">23.10.0</a><br/>
92-
<a href="doc/changelogs/CHANGELOG_V23.md#23.9.0">23.9.0</a><br/>
93-
<a href="doc/changelogs/CHANGELOG_V23.md#23.8.0">23.8.0</a><br/>
94-
<a href="doc/changelogs/CHANGELOG_V23.md#23.7.0">23.7.0</a><br/>
95-
<a href="doc/changelogs/CHANGELOG_V23.md#23.6.1">23.6.1</a><br/>
96-
<a href="doc/changelogs/CHANGELOG_V23.md#23.6.0">23.6.0</a><br/>
97-
<a href="doc/changelogs/CHANGELOG_V23.md#23.5.0">23.5.0</a><br/>
98-
<a href="doc/changelogs/CHANGELOG_V23.md#23.4.0">23.4.0</a><br/>
99-
<a href="doc/changelogs/CHANGELOG_V23.md#23.3.0">23.3.0</a><br/>
100-
<a href="doc/changelogs/CHANGELOG_V23.md#23.2.0">23.2.0</a><br/>
101-
<a href="doc/changelogs/CHANGELOG_V23.md#23.1.0">23.1.0</a><br/>
102-
<a href="doc/changelogs/CHANGELOG_V23.md#23.0.0">23.0.0</a><br/>
103-
</td>
104-
<td valign="top">
10589
<b><a href="doc/changelogs/CHANGELOG_V22.md#22.22.3">22.22.3</a></b><br/>
10690
<a href="doc/changelogs/CHANGELOG_V22.md#22.22.2">22.22.2</a><br/>
10791
<a href="doc/changelogs/CHANGELOG_V22.md#22.22.1">22.22.1</a><br/>
@@ -135,49 +119,6 @@ release.
135119
<a href="doc/changelogs/CHANGELOG_V22.md#22.1.0">22.1.0</a><br/>
136120
<a href="doc/changelogs/CHANGELOG_V22.md#22.0.0">22.0.0</a><br/>
137121
</td>
138-
<td valign="top">
139-
<b><a href="doc/changelogs/CHANGELOG_V20.md#20.20.2">20.20.2</a></b><br/>
140-
<a href="doc/changelogs/CHANGELOG_V20.md#20.20.1">20.20.1</a><br/>
141-
<a href="doc/changelogs/CHANGELOG_V20.md#20.20.0">20.20.0</a><br/>
142-
<a href="doc/changelogs/CHANGELOG_V20.md#20.19.6">20.19.6</a><br/>
143-
<a href="doc/changelogs/CHANGELOG_V20.md#20.19.5">20.19.5</a><br/>
144-
<a href="doc/changelogs/CHANGELOG_V20.md#20.19.4">20.19.4</a><br/>
145-
<a href="doc/changelogs/CHANGELOG_V20.md#20.19.3">20.19.3</a><br/>
146-
<a href="doc/changelogs/CHANGELOG_V20.md#20.19.2">20.19.2</a><br/>
147-
<a href="doc/changelogs/CHANGELOG_V20.md#20.19.1">20.19.1</a><br/>
148-
<a href="doc/changelogs/CHANGELOG_V20.md#20.19.0">20.19.0</a><br/>
149-
<a href="doc/changelogs/CHANGELOG_V20.md#20.18.3">20.18.3</a><br/>
150-
<a href="doc/changelogs/CHANGELOG_V20.md#20.18.2">20.18.2</a><br/>
151-
<a href="doc/changelogs/CHANGELOG_V20.md#20.18.1">20.18.1</a><br/>
152-
<a href="doc/changelogs/CHANGELOG_V20.md#20.18.0">20.18.0</a><br/>
153-
<a href="doc/changelogs/CHANGELOG_V20.md#20.17.0">20.17.0</a><br/>
154-
<a href="doc/changelogs/CHANGELOG_V20.md#20.16.0">20.16.0</a><br/>
155-
<a href="doc/changelogs/CHANGELOG_V20.md#20.15.1">20.15.1</a><br/>
156-
<a href="doc/changelogs/CHANGELOG_V20.md#20.15.0">20.15.0</a><br/>
157-
<a href="doc/changelogs/CHANGELOG_V20.md#20.14.0">20.14.0</a><br/>
158-
<a href="doc/changelogs/CHANGELOG_V20.md#20.13.1">20.13.1</a><br/>
159-
<a href="doc/changelogs/CHANGELOG_V20.md#20.13.0">20.13.0</a><br/>
160-
<a href="doc/changelogs/CHANGELOG_V20.md#20.12.2">20.12.2</a><br/>
161-
<a href="doc/changelogs/CHANGELOG_V20.md#20.12.1">20.12.1</a><br/>
162-
<a href="doc/changelogs/CHANGELOG_V20.md#20.12.0">20.12.0</a><br/>
163-
<a href="doc/changelogs/CHANGELOG_V20.md#20.11.1">20.11.1</a><br/>
164-
<a href="doc/changelogs/CHANGELOG_V20.md#20.11.0">20.11.0</a><br/>
165-
<a href="doc/changelogs/CHANGELOG_V20.md#20.10.0">20.10.0</a><br/>
166-
<a href="doc/changelogs/CHANGELOG_V20.md#20.9.0">20.9.0</a><br/>
167-
<a href="doc/changelogs/CHANGELOG_V20.md#20.8.1">20.8.1</a><br/>
168-
<a href="doc/changelogs/CHANGELOG_V20.md#20.8.0">20.8.0</a><br/>
169-
<a href="doc/changelogs/CHANGELOG_V20.md#20.7.0">20.7.0</a><br/>
170-
<a href="doc/changelogs/CHANGELOG_V20.md#20.6.1">20.6.1</a><br/>
171-
<a href="doc/changelogs/CHANGELOG_V20.md#20.6.0">20.6.0</a><br/>
172-
<a href="doc/changelogs/CHANGELOG_V20.md#20.5.1">20.5.1</a><br/>
173-
<a href="doc/changelogs/CHANGELOG_V20.md#20.5.0">20.5.0</a><br/>
174-
<a href="doc/changelogs/CHANGELOG_V20.md#20.4.0">20.4.0</a><br/>
175-
<a href="doc/changelogs/CHANGELOG_V20.md#20.3.1">20.3.1</a><br/>
176-
<a href="doc/changelogs/CHANGELOG_V20.md#20.3.0">20.3.0</a><br/>
177-
<a href="doc/changelogs/CHANGELOG_V20.md#20.2.0">20.2.0</a><br/>
178-
<a href="doc/changelogs/CHANGELOG_V20.md#20.1.0">20.1.0</a><br/>
179-
<a href="doc/changelogs/CHANGELOG_V20.md#20.0.0">20.0.0</a><br/>
180-
</td>
181122
</tr>
182123
</table>
183124

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ test-all-suites: | clear-stalled test-build bench-addons-build doc-only ## Run a
603603
$(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) test/*
604604

605605
JS_SUITES ?= default
606-
NATIVE_SUITES ?= addons js-native-api node-api embedding
606+
NATIVE_SUITES ?= addons ffi js-native-api node-api embedding
607607
# CI_* variables should be kept synchronized with the ones in vcbuild.bat
608608
CI_NATIVE_SUITES ?= $(NATIVE_SUITES) benchmark
609609
CI_JS_SUITES ?= $(JS_SUITES) pummel

README.md

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -745,38 +745,24 @@ maintaining the Node.js project.
745745

746746
* [1ilsang](https://github.com/1ilsang) -
747747
**Sangchul Lee** <<1ilsang.dev@gmail.com>> (he/him)
748-
* [atlowChemi](https://github.com/atlowChemi) -
749-
**Chemi Atlow** <<chemi@atlow.co.il>> (he/him)
750748
* [bjohansebas](https://github.com/bjohansebas) -
751749
**Sebastian Beltran** <<bjohansebas@gmail.com>>
752750
* [bmuenzenmeyer](https://github.com/bmuenzenmeyer) -
753751
**Brian Muenzenmeyer** <<brian.muenzenmeyer@gmail.com>> (he/him)
754-
* [CanadaHonk](https://github.com/CanadaHonk) -
755-
**Oliver Medhurst** <<honk@goose.icu>> (they/them)
756-
* [daeyeon](https://github.com/daeyeon) -
757-
**Daeyeon Jeong** <<daeyeon.dev@gmail.com>> (he/him)
758752
* [efekrskl](https://github.com/efekrskl) -
759753
**Efe Karasakal** <<hi@efe.dev>> (he/him)
760754
* [gireeshpunathil](https://github.com/gireeshpunathil) -
761755
**Gireesh Punathil** <<gpunathi@in.ibm.com>> (he/him)
762-
* [gurgunday](https://github.com/gurgunday) -
763-
**Gürgün Dayıoğlu** <<hey@gurgun.day>>
764756
* [haramj](https://github.com/haramj) -
765757
**Haram Jeong** <<haramj.dev@gmail.com>>
766758
* [HBSPS](https://github.com/HBSPS) -
767759
**Wiyeong Seo** <<hbsps.dev@gmail.com>>
768760
* [iam-frankqiu](https://github.com/iam-frankqiu) -
769761
**Frank Qiu** <<iam.frankqiu@gmail.com>> (he/him)
770-
* [KevinEady](https://github.com/KevinEady) -
771-
**Kevin Eady** <<kevin.c.eady@gmail.com>> (he/him)
772-
* [marsonya](https://github.com/marsonya) -
773-
**Akhil Marsonya** <<akhil.marsonya27@gmail.com>> (he/him)
774762
* [milesguicent](https://github.com/milesguicent) -
775763
**Miles Guicent** <<guicent@pm.me>> (he/him)
776764
* [preveen-stack](https://github.com/preveen-stack) -
777765
**Preveen Padmanabhan** <<wide4head@gmail.com>> (he/him)
778-
* [RaisinTen](https://github.com/RaisinTen) -
779-
**Darshan Sen** <<raisinten@gmail.com>> (he/him)
780766

781767
Triagers follow the [Triage Guide](./doc/contributing/issues.md#triaging-a-bug-report) when
782768
responding to new issues.

benchmark/crypto/create-keyobject.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ const keyFixtures = {
2626

2727
if (hasOpenSSL(3, 5)) {
2828
keyFixtures['ml-dsa-44'] = readKeyPair('ml_dsa_44_public', 'ml_dsa_44_private');
29+
} else if (process.features.openssl_is_boringssl) {
30+
keyFixtures['ml-dsa-44'] = readKeyPair('ml_dsa_44_public', 'ml_dsa_44_private_seed_only');
2931
}
3032

3133
const bench = common.createBenchmark(main, {

benchmark/crypto/kem.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ if (hasOpenSSL(3, 5)) {
2424
keyFixtures['ml-kem-512'] = readKeyPair('ml_kem_512_public', 'ml_kem_512_private');
2525
keyFixtures['ml-kem-768'] = readKeyPair('ml_kem_768_public', 'ml_kem_768_private');
2626
keyFixtures['ml-kem-1024'] = readKeyPair('ml_kem_1024_public', 'ml_kem_1024_private');
27+
} else if (process.features.openssl_is_boringssl) {
28+
keyFixtures['ml-kem-768'] = readKeyPair('ml_kem_768_public', 'ml_kem_768_private_seed_only');
29+
keyFixtures['ml-kem-1024'] = readKeyPair('ml_kem_1024_public', 'ml_kem_1024_private_seed_only');
2730
}
2831
if (hasOpenSSL(3, 2)) {
2932
keyFixtures['p-256'] = readKeyPair('ec_p256_public', 'ec_p256_private');

benchmark/crypto/oneshot-sign.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ const keyFixtures = {
1919

2020
if (hasOpenSSL(3, 5)) {
2121
keyFixtures['ml-dsa-44'] = readKey('ml_dsa_44_private');
22+
} else if (process.features.openssl_is_boringssl) {
23+
keyFixtures['ml-dsa-44'] = readKey('ml_dsa_44_private_seed_only');
2224
}
2325

2426
const data = crypto.randomBytes(256);

benchmark/crypto/oneshot-verify.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ const keyFixtures = {
2626

2727
if (hasOpenSSL(3, 5)) {
2828
keyFixtures['ml-dsa-44'] = readKeyPair('ml_dsa_44_public', 'ml_dsa_44_private');
29+
} else if (process.features.openssl_is_boringssl) {
30+
keyFixtures['ml-dsa-44'] = readKeyPair('ml_dsa_44_public', 'ml_dsa_44_private_seed_only');
2931
}
3032

3133
const data = crypto.randomBytes(256);
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// Measures batching behavior for stream/iter from() and fromSync()
2+
// with plain synchronous Uint8Array iterables.
3+
'use strict';
4+
5+
const common = require('../common.js');
6+
const { closeSync, openSync, writeSync, writevSync } = require('fs');
7+
const { devNull } = require('os');
8+
9+
const bench = common.createBenchmark(main, {
10+
method: ['from-first-batch', 'from-sync-writev'],
11+
chunks: [256, 4096, 16384],
12+
chunkSize: [16],
13+
n: [100, 1000],
14+
}, {
15+
flags: ['--experimental-stream-iter'],
16+
combinationFilter({ method, chunks, n }) {
17+
if (n === 1) {
18+
return true;
19+
}
20+
if (method === 'from-first-batch') {
21+
return n === 1000;
22+
}
23+
return n === 100 && chunks !== 16384;
24+
},
25+
test: {
26+
chunks: 256,
27+
chunkSize: 16,
28+
n: 1,
29+
},
30+
});
31+
32+
function main({ method, chunks, chunkSize, n }) {
33+
switch (method) {
34+
case 'from-first-batch':
35+
return benchFromFirstBatch(chunks, chunkSize, n);
36+
case 'from-sync-writev':
37+
return benchFromSyncWritev(chunks, chunkSize, n);
38+
}
39+
}
40+
41+
function* source(chunks, chunk) {
42+
for (let i = 0; i < chunks; i++) {
43+
yield chunk;
44+
}
45+
}
46+
47+
function benchFromFirstBatch(chunks, chunkSize, n) {
48+
const { from } = require('stream/iter');
49+
const chunk = new Uint8Array(chunkSize);
50+
let seen = 0;
51+
52+
(async () => {
53+
bench.start();
54+
for (let i = 0; i < n; i++) {
55+
const iterator = from(source(chunks, chunk))[Symbol.asyncIterator]();
56+
const { value, done } = await iterator.next();
57+
if (done || value.length === 0) {
58+
throw new Error('expected a batch');
59+
}
60+
seen += value.length;
61+
}
62+
bench.end(n);
63+
if (seen === 0) {
64+
throw new Error('expected chunks');
65+
}
66+
})();
67+
}
68+
69+
function benchFromSyncWritev(chunks, chunkSize, n) {
70+
const { pipeToSync } = require('stream/iter');
71+
const chunk = new Uint8Array(chunkSize);
72+
const expected = chunks * chunkSize * n;
73+
let seen = 0;
74+
let total = 0;
75+
const fd = openSync(devNull, 'w');
76+
const writer = {
77+
writeSync(chunk) {
78+
writeSync(fd, chunk);
79+
seen++;
80+
},
81+
writevSync(batch) {
82+
writevSync(fd, batch);
83+
seen += batch.length;
84+
},
85+
};
86+
87+
try {
88+
bench.start();
89+
for (let i = 0; i < n; i++) {
90+
total += pipeToSync(source(chunks, chunk), writer);
91+
}
92+
bench.end(chunks * n);
93+
} finally {
94+
closeSync(fd);
95+
}
96+
97+
if (total !== expected || seen !== chunks * n) {
98+
throw new Error('unexpected chunk count');
99+
}
100+
}

benchmark/streams/iter-throughput-pipeto.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const common = require('../common.js');
66
const { Readable, Writable, pipeline } = require('stream');
77

88
const bench = common.createBenchmark(main, {
9-
api: ['classic', 'webstream', 'iter', 'iter-sync'],
9+
api: ['classic', 'webstream', 'iter', 'iter-sync-source', 'iter-sync'],
1010
datasize: [1024 * 1024, 16 * 1024 * 1024, 64 * 1024 * 1024],
1111
n: [5],
1212
}, {
@@ -26,6 +26,8 @@ function main({ api, datasize, n }) {
2626
return benchWebStream(chunk, datasize, n, totalOps);
2727
case 'iter':
2828
return benchIter(chunk, datasize, n, totalOps);
29+
case 'iter-sync-source':
30+
return benchIterSyncSource(chunk, datasize, n, totalOps);
2931
case 'iter-sync':
3032
return benchIterSync(chunk, datasize, n, totalOps);
3133
}
@@ -101,6 +103,29 @@ function benchIter(chunk, datasize, n, totalOps) {
101103
})();
102104
}
103105

106+
function benchIterSyncSource(chunk, datasize, n, totalOps) {
107+
const { pipeTo } = require('stream/iter');
108+
109+
async function run() {
110+
let remaining = datasize;
111+
function* source() {
112+
while (remaining > 0) {
113+
const size = Math.min(remaining, chunk.length);
114+
remaining -= size;
115+
yield size === chunk.length ? chunk : chunk.subarray(0, size);
116+
}
117+
}
118+
const writer = { write() {}, writeSync() { return true; } };
119+
await pipeTo(source(), writer);
120+
}
121+
122+
(async () => {
123+
bench.start();
124+
for (let i = 0; i < n; i++) await run();
125+
bench.end(totalOps);
126+
})();
127+
}
128+
104129
function benchIterSync(chunk, datasize, n, totalOps) {
105130
const { pipeToSync } = require('stream/iter');
106131

0 commit comments

Comments
 (0)