Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
9446caf
meta: flip mcollina emails in .mailmap
mcollina May 30, 2026
17e4196
src: remove TOCTOU race condition when encoding SAB-backed `Buffer`s
aduh95 May 30, 2026
80e5174
doc: remove duplicated sentences in large-pull-requests.md
joyeecheung May 30, 2026
b9e2346
tools: refine `v8.nix` source definition
aduh95 May 30, 2026
8b88e2c
build: remove duplicated node_use_sqlite and node_use_ffi conditions
legendecas May 30, 2026
040c51c
stream: settle pending broadcast reads on return
trivikr May 31, 2026
9b7e761
crypto: coerce -0 to +0 before native calls
panva May 25, 2026
9413368
dns: coerce -0 to +0 in lookup and resolver inputs
panva May 25, 2026
1ee129d
fs: coerce -0 to +0 in mode flags and watch intervals
panva May 25, 2026
8bab410
net: coerce -0 to +0 in BlockList prefixes
panva May 25, 2026
9e58d9d
zlib: coerce -0 to +0 for crc32 seeds
panva May 25, 2026
0fe48b6
quic: add listEndpoints API
jasnell May 24, 2026
aa444b2
lib: apply minor dtls cleanups
jasnell May 24, 2026
6813080
src: add Latin1 fast path in StringBytes::Encode utf8
mertcanaltin Jun 1, 2026
5f96180
http2: error for incomplete reads on RST, auto-drain, deprecate aborted
pimterry Jun 1, 2026
6d02b36
2026-06-01, Version 26.3.0 (Current)
aduh95 May 30, 2026
39b481b
build: enable maglev by default on Linux ppc64le
richardlau Jun 1, 2026
c126cbf
stream: handle sync writev completion in pipeTo
trivikr Jun 1, 2026
bb3f7e8
test: update WPT for WebCryptoAPI to 0c413fb56b
nodejs-github-bot Jun 1, 2026
f30139e
debugger: add more logs to probe mode
joyeecheung Jun 1, 2026
7af433b
benchmark: remove old alias usage in ffi benchmarks
addaleax Jun 1, 2026
37779fd
stream: handle falsy push writer fail reasons
trivikr Jun 1, 2026
330f44f
tools: update nixpkgs-unstable to e9a7635a57597d9754eccebdfc7045e6c86
nodejs-github-bot Jun 2, 2026
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
2 changes: 1 addition & 1 deletion .mailmap
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ Mathias Buus <mathiasbuus@gmail.com> <m@ge.tt>
Mathias Pettersson <mape@mape.me>
Matt Lang <matt@mediasuite.co.nz>
Matt Reed <matthewreed26@gmail.com>
Matteo Collina <matteo.collina@gmail.com> <hello@matteocollina.com>
Matteo Collina <hello@matteocollina.com> <matteo.collina@gmail.com>
Matthew Lye <muddletoes@hotmail.com>
Matthew Turner <matty_t47@hotmail.com> <ramesius@users.noreply.github.com>
Matthias Bastian <dev@matthias-bastian.de> <piepmatz@users.noreply.github.com>
Expand Down
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ release.
</tr>
<tr>
<td valign="top">
<b><a href="doc/changelogs/CHANGELOG_V26.md#26.2.0">26.2.0</a></b><br/>
<b><a href="doc/changelogs/CHANGELOG_V26.md#26.3.0">26.3.0</a></b><br/>
<a href="doc/changelogs/CHANGELOG_V26.md#26.2.0">26.2.0</a><br/>
<a href="doc/changelogs/CHANGELOG_V26.md#26.1.0">26.1.0</a><br/>
<a href="doc/changelogs/CHANGELOG_V26.md#26.0.0">26.0.0</a><br/>
</td>
Expand Down
53 changes: 53 additions & 0 deletions benchmark/buffers/buffer-tostring-utf8-latin1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
'use strict';

const common = require('../common.js');

const bench = common.createBenchmark(main, {
size: [64, 1024, 16384, 262144, 4194304],
content: ['ascii', 'latin1', 'utf8_mixed', 'latin1_then_cjk'],
n: [1e4],
});

function buildBuffer(kind, size) {
if (kind === 'ascii') {
return Buffer.alloc(size, 0x61);
}
if (kind === 'latin1') {
const pair = Buffer.from([0xC3, 0xA9]);
const buf = Buffer.alloc(size);
for (let i = 0; i + 2 <= size; i += 2) pair.copy(buf, i);
return buf;
}
if (kind === 'utf8_mixed') {
const cjk = Buffer.from([0xE4, 0xB8, 0xAD]);
const buf = Buffer.alloc(size);
let i = 0;
while (i + 4 <= size) {
buf[i++] = 0x61;
cjk.copy(buf, i);
i += 3;
}
return buf;
}
if (kind === 'latin1_then_cjk') {
const pair = Buffer.from([0xC3, 0xA9]);
const cjk = Buffer.from([0xE4, 0xB8, 0xAD]);
const buf = Buffer.alloc(size);
const mid = (size >> 1) & ~1;
for (let i = 0; i + 2 <= mid; i += 2) pair.copy(buf, i);
cjk.copy(buf, mid);
for (let i = mid + 3; i + 2 <= size; i += 2) pair.copy(buf, i);
return buf;
}
throw new Error('unknown content: ' + kind);
}

function main({ n, size, content }) {
const buf = buildBuffer(content, size);

bench.start();
for (let i = 0; i < n; i++) {
buf.toString('utf8');
}
bench.end(n);
}
2 changes: 1 addition & 1 deletion benchmark/ffi/add-f64.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const bench = common.createBenchmark(main, {
ensureFixtureLibrary();

const { lib, functions } = ffi.dlopen(libraryPath, {
add_f64: { result: 'f64', parameters: ['f64', 'f64'] },
add_f64: { return: 'f64', arguments: ['f64', 'f64'] },
});

const add = functions.add_f64;
Expand Down
2 changes: 1 addition & 1 deletion benchmark/ffi/add-i32.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const bench = common.createBenchmark(main, {
ensureFixtureLibrary();

const { lib, functions } = ffi.dlopen(libraryPath, {
add_i32: { result: 'i32', parameters: ['i32', 'i32'] },
add_i32: { return: 'i32', arguments: ['i32', 'i32'] },
});

const add = functions.add_i32;
Expand Down
2 changes: 1 addition & 1 deletion benchmark/ffi/getpid.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const bench = common.createBenchmark(main, {
});

const { lib, functions } = ffi.dlopen(null, {
uv_os_getpid: { result: 'i32', parameters: [] },
uv_os_getpid: { return: 'i32', arguments: [] },
});

const getpid = functions.uv_os_getpid;
Expand Down
2 changes: 1 addition & 1 deletion benchmark/ffi/many-args.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const bench = common.createBenchmark(main, {
ensureFixtureLibrary();

const { lib, functions } = ffi.dlopen(libraryPath, {
sum_6_i32: { result: 'i32', parameters: ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'] },
sum_6_i32: { return: 'i32', arguments: ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'] },
});

const fn = functions.sum_6_i32;
Expand Down
2 changes: 1 addition & 1 deletion benchmark/ffi/pointer-bigint.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const bench = common.createBenchmark(main, {
ensureFixtureLibrary();

const { lib, functions } = ffi.dlopen(libraryPath, {
pointer_to_usize: { result: 'u64', parameters: ['pointer'] },
pointer_to_usize: { return: 'u64', arguments: ['pointer'] },
});

const fn = functions.pointer_to_usize;
Expand Down
2 changes: 1 addition & 1 deletion benchmark/ffi/sum-buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const bench = common.createBenchmark(main, {
ensureFixtureLibrary();

const { lib, functions } = ffi.dlopen(libraryPath, {
sum_buffer: { result: 'u64', parameters: ['pointer', 'u64'] },
sum_buffer: { return: 'u64', arguments: ['pointer', 'u64'] },
});

function main({ n, size }) {
Expand Down
4 changes: 2 additions & 2 deletions configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
valid_mips_float_abi = ('soft', 'hard')
valid_intl_modes = ('none', 'small-icu', 'full-icu', 'system-icu')
icu_versions = json.loads((tools_path / 'icu' / 'icu_versions.json').read_text(encoding='utf-8'))
maglev_enabled_architectures = ('x64', 'arm', 'arm64', 's390x')
maglev_enabled_architectures = ('x64', 'arm', 'arm64', 'ppc64', 's390x')

# builtins may be removed later if they have been disabled by options
shareable_builtins = {'undici/undici': 'deps/undici/undici.js',
Expand Down Expand Up @@ -2175,7 +2175,7 @@ def configure_v8(o, configs):
o['variables']['v8_promise_internal_field_count'] = 1 # Add internal field to promises for async hooks.
o['variables']['v8_use_siphash'] = 0 if options.without_siphash else 1
o['variables']['v8_enable_maglev'] = B(not options.v8_disable_maglev and
flavor != 'zos' and
flavor not in ('aix', 'os400', 'zos') and
o['variables']['target_arch'] in maglev_enabled_architectures)
o['variables']['v8_enable_pointer_compression'] = 1 if options.enable_pointer_compression else 0
# Using the sandbox requires always allocating array buffer backing stores in the sandbox.
Expand Down
2 changes: 1 addition & 1 deletion doc/api/buffer.md
Original file line number Diff line number Diff line change
Expand Up @@ -1514,7 +1514,7 @@ console.log(Buffer.isEncoding(''));
<!-- YAML
added: v0.11.3
changes:
- version: REPLACEME
- version: v26.3.0
pr-url: https://github.com/nodejs/node/pull/63597
description: Default raised from 8192 to 65536.
-->
Expand Down
2 changes: 1 addition & 1 deletion doc/api/debugger.md
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ added:
- v26.1.0
- v24.16.0
changes:
- version: REPLACEME
- version: v26.3.0
pr-url: https://github.com/nodejs/node/pull/63437
description: Add `probe_failure` terminal `error` event for inspector-side mid-session
failures, and `error.details` for additional context on per-hit and terminal errors.
Expand Down
55 changes: 55 additions & 0 deletions doc/api/deprecations.md
Original file line number Diff line number Diff line change
Expand Up @@ -4574,7 +4574,62 @@ throwing an error. This behavior is inconsistent with `hash.digest()` and
may lead to subtle bugs. Calling `hmac.digest()` on a finalized `Hmac` instance
will throw an error in a future version.

### DEP0207: `.aborted` property and `'aborted'` event in `http2`

<!-- YAML
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/63249
description: Documentation-only deprecation.
-->

Type: Documentation-only

Use standard stream events and state checks instead. Read-side aborts
(peer cancelled before sending `END_STREAM`) now surface as `'error'`
with code `ERR_HTTP2_STREAM_ABORTED` (clean peer reset code) or
`ERR_HTTP2_STREAM_ERROR` (non-clean code). Write-side aborts (peer
cancelled while we still had writes in flight) are detectable from
`'close'` by checking `writableFinished`. Parallels [DEP0156][] for
`http`.

```cjs
// Deprecated
server.on('stream', (stream) => {
stream.on('aborted', () => {
// Stream was closed while the writable was still open.
});
});
```

```cjs
// Use this instead
server.on('stream', (stream) => {
// Read-side abort: peer cancelled before sending END_STREAM.
stream.on('error', (err) => {
if (err.code === 'ERR_HTTP2_STREAM_ABORTED' ||
err.code === 'ERR_HTTP2_STREAM_ERROR') {
// Peer cancelled the request mid-stream.
}
});
// Write-side abort: our response didn't fully send before close.
stream.on('close', () => {
if (!stream.writableFinished) {
// Writes were aborted (peer cancel, local destroy, etc.).
}
});
});
```

The same patterns apply to the compatibility API (`req` / `res` on
`http2.createServer((req, res) => …)`). On the read-side, errors on the
underlying stream are emitted from `req`. On the write-side you can use
`res.on('close', …)` to hear about client aborts by checking
`res.writableFinished` to confirm whether the response was written
successfully before the response closed.

[DEP0142]: #dep0142-repl_builtinlibs
[DEP0156]: #dep0156-aborted-property-and-abort-aborted-event-in-http
[NIST SP 800-38D]: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf
[RFC 6066]: https://tools.ietf.org/html/rfc6066#section-3
[RFC 8247 Section 2.4]: https://www.rfc-editor.org/rfc/rfc8247#section-2.4
Expand Down
9 changes: 9 additions & 0 deletions doc/api/errors.md
Original file line number Diff line number Diff line change
Expand Up @@ -1718,6 +1718,15 @@ Use of the `101` Informational status code is forbidden in HTTP/2.
An invalid HTTP status code has been specified. Status codes must be an integer
between `100` and `599` (inclusive).

<a id="ERR_HTTP2_STREAM_ABORTED"></a>

### `ERR_HTTP2_STREAM_ABORTED`

The peer reset the `Http2Stream` with a clean error code (`NGHTTP2_NO_ERROR`
or `NGHTTP2_CANCEL`) before sending `END_STREAM`, so the readable side will
not be fully delivered. Mirrors HTTP/1's `ECONNRESET` for a peer-side
`socket.destroy()`.

<a id="ERR_HTTP2_STREAM_CANCEL"></a>

### `ERR_HTTP2_STREAM_CANCEL`
Expand Down
4 changes: 2 additions & 2 deletions doc/api/http.md
Original file line number Diff line number Diff line change
Expand Up @@ -3680,7 +3680,7 @@ Found'`.
<!-- YAML
added: v0.1.13
changes:
- version: REPLACEME
- version: v26.3.0
pr-url: https://github.com/nodejs/node/pull/61597
description: The `httpValidation` option is supported now.
- version:
Expand Down Expand Up @@ -4005,7 +4005,7 @@ This can be overridden for servers and client requests by passing the
<!-- YAML
added: v0.3.6
changes:
- version: REPLACEME
- version: v26.3.0
pr-url: https://github.com/nodejs/node/pull/61597
description: The `httpValidation` option is supported now.
- version:
Expand Down
Loading