Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@ChALkeR
Copy link
Member

@ChALkeR ChALkeR commented Dec 20, 2025

Tracking: #61041

Most data is valid utf-8, no need to wait for v8 optimizations or for simdutf implementing fast replacement.
We can just check + simdutf in fast case.

This is a 2x-10x speedup according to https://github.com/lemire/jstextdecoderbench bench (+ I added extra cases)

There is still room for improvement here (e.g. avoiding triple scans), but this change alone improves results significantly
We can improve further iteratively
This performs mallocs only for valid strings, instead of optimistically malloc-ing and decoding until error
Switching that behavior to optimistic would be a separate PR (perf needs to be checked against this, not main or #61119)

Buffer#toString() - utf8

pre-#61119:

Test Size Throughput Mean Time
Latin lipsum (ASCII) 84.902 KiB 18.21 GiB/s 0.005 ms
Arabic lipsum 79.771 KiB 0.29 GiB/s 0.266 ms
Chinese lipsum 68.203 KiB 0.34 GiB/s 0.192 ms
Arabic + 2 * ASCII 249.575 KiB 0.73 GiB/s 0.329 ms

main with #61119 (landed):

Test Size Throughput Mean Time
Latin lipsum (ASCII) 84.902 KiB 36.75 GiB/s 0.002 ms
Arabic lipsum 79.771 KiB 0.28 GiB/s 0.273 ms
Chinese lipsum 68.203 KiB 0.33 GiB/s 0.197 ms
Arabic + 2 * ASCII 249.575 KiB 0.69 GiB/s 0.344 ms

PR:

Test Size Throughput Mean Time
Latin lipsum (ASCII) 84.902 KiB 36.84 GiB/s 0.002 ms
Arabic lipsum 79.771 KiB 2.03 GiB/s 0.038 ms
Chinese lipsum 68.203 KiB 4.06 GiB/s 0.016 ms
Arabic + 2 * ASCII 249.577 KiB 3.42 GiB/s 0.072 ms

TextDecoder, loose

pre-#61119:

Test Size Throughput Mean Time
Latin lipsum (ASCII) 84.902 KiB 17.99 GiB/s 0.005 ms
Arabic lipsum 79.771 KiB 0.28 GiB/s 0.270 ms
Chinese lipsum 68.203 KiB 0.34 GiB/s 0.194 ms
Arabic + 2 * ASCII 249.577 KiB 0.71 GiB/s 0.333 ms

main with #61119 (landed):

Test Size Throughput Mean Time
Latin lipsum (ASCII) 84.902 KiB 36.59 GiB/s 0.002 ms
Arabic lipsum 79.771 KiB 0.28 GiB/s 0.271 ms
Chinese lipsum 68.203 KiB 0.34 GiB/s 0.192 ms
Arabic + 2 * ASCII 249.577 KiB 0.70 GiB/s 0.340 ms

PR:

Test Size Throughput Mean Time
Latin lipsum (ASCII) 84.902 KiB 36.78 GiB/s 0.002 ms
Arabic lipsum 79.771 KiB 2.03 GiB/s 0.038 ms
Chinese lipsum 68.203 KiB 4.01 GiB/s 0.016 ms
Arabic + 2 * ASCII 249.577 KiB 3.42 GiB/s 0.072 ms

TextDecoder, fatal

pre-#61119:

Test Size Throughput Mean Time
Latin lipsum (ASCII) 84.902 KiB 15.31 GiB/s 0.006 ms
Arabic lipsum 79.771 KiB 0.27 GiB/s 0.279 ms
Chinese lipsum 68.203 KiB 0.34 GiB/s 0.194 ms
Arabic + 2 * ASCII 249.577 KiB 0.71 GiB/s 0.338 ms

main with #61119 (landed):

Test Size Throughput Mean Time
Latin lipsum (ASCII) 84.902 KiB 36.63 GiB/s 0.002 ms
Arabic lipsum 79.771 KiB 0.28 GiB/s 0.272 ms
Chinese lipsum 68.203 KiB 0.33 GiB/s 0.197 ms
Arabic + 2 * ASCII 249.577 KiB 0.68 GiB/s 0.351 ms

PR:

Test Size Throughput Mean Time
Latin lipsum (ASCII) 84.902 KiB 36.71 GiB/s 0.002 ms
Arabic lipsum 79.771 KiB 1.70 GiB/s 0.046 ms
Chinese lipsum 68.203 KiB 2.97 GiB/s 0.022 ms
Arabic + 2 * ASCII 249.577 KiB 3.01 GiB/s 0.082 ms

cc @nodejs/performance

@nodejs-github-bot nodejs-github-bot added buffer Issues and PRs related to the buffer subsystem. c++ Issues and PRs that require attention from people who are familiar with C++. needs-ci PRs that need a full CI run. labels Dec 20, 2025
@ChALkeR ChALkeR force-pushed the chalker/non-ascii/0 branch 2 times, most recently from 5b2b040 to aee5408 Compare December 20, 2025 05:49
@RafaelGSS RafaelGSS added the performance Issues and PRs related to the performance of Node.js. label Dec 29, 2025
@RafaelGSS RafaelGSS self-requested a review December 29, 2025 20:49
@ChALkeR ChALkeR force-pushed the chalker/non-ascii/0 branch from aee5408 to 118db5f Compare January 17, 2026 11:01
@ChALkeR ChALkeR marked this pull request as ready for review January 17, 2026 11:01
@ChALkeR
Copy link
Member Author

ChALkeR commented Jan 17, 2026

As #61119 landed, this is now ready. Rebased.

@ChALkeR ChALkeR force-pushed the chalker/non-ascii/0 branch from 118db5f to f1d3a0e Compare January 17, 2026 11:06
@codecov
Copy link

codecov bot commented Jan 17, 2026

Codecov Report

❌ Patch coverage is 50.00000% with 6 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.52%. Comparing base (955d347) to head (62af4d3).
⚠️ Report is 48 commits behind head on main.

Files with missing lines Patch % Lines
src/string_bytes.cc 50.00% 4 Missing and 2 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #61131      +/-   ##
==========================================
- Coverage   88.52%   88.52%   -0.01%     
==========================================
  Files         704      704              
  Lines      208802   208983     +181     
  Branches    40318    40346      +28     
==========================================
+ Hits       184842   184994     +152     
- Misses      15947    15973      +26     
- Partials     8013     8016       +3     
Files with missing lines Coverage Δ
src/encoding_binding.cc 52.73% <ø> (ø)
src/string_bytes.cc 69.01% <50.00%> (-0.73%) ⬇️

... and 56 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@RafaelGSS RafaelGSS requested a review from lemire January 17, 2026 18:48
@ChALkeR ChALkeR force-pushed the chalker/non-ascii/0 branch from 05e960e to 7a1aaa5 Compare January 18, 2026 02:56
@ChALkeR ChALkeR force-pushed the chalker/non-ascii/0 branch from 7a1aaa5 to d4f0460 Compare January 18, 2026 03:27
@ChALkeR ChALkeR requested a review from gurgunday January 18, 2026 03:28
Copy link
Member

@gurgunday gurgunday left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@gurgunday gurgunday added the request-ci Add this label to start a Jenkins CI on a PR. label Jan 18, 2026
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jan 18, 2026
@nodejs-github-bot
Copy link
Collaborator

@gurgunday gurgunday added the author ready PRs that have at least one approval, no pending requests for changes, and a CI started. label Jan 18, 2026
@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

Copy link
Member

@mcollina mcollina left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

Copy link
Member

@mertcanaltin mertcanaltin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Member

@lemire lemire left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I love it, obviously.

Our goal long term is to make this complexity unnecessary but this is a very good design.

@lemire
Copy link
Member

lemire commented Jan 19, 2026

There is still room for improvement here (e.g. avoiding triple scans), but this change alone improves results significantly
We can improve further iteratively

Yes. We can 'easily' reduce this to 2 passes instead of three (new functions coming soon), but your design is very good and does buy a lot of performance.

Congratulations.

@ChALkeR
Copy link
Member Author

ChALkeR commented Jan 20, 2026

I added a min length check (last commit), otherwise this caused minor perf regression on very short strings
Should be fixed now

@addaleax addaleax added the request-ci Add this label to start a Jenkins CI on a PR. label Jan 21, 2026
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jan 21, 2026
@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@RafaelGSS RafaelGSS added the commit-queue Add this label to land a pull request using GitHub Actions. label Jan 21, 2026
@nodejs-github-bot nodejs-github-bot added commit-queue-failed An error occurred while landing this pull request using GitHub Actions. and removed commit-queue Add this label to land a pull request using GitHub Actions. labels Jan 21, 2026
@nodejs-github-bot
Copy link
Collaborator

Commit Queue failed
- Loading data for nodejs/node/pull/61131
✔  Done loading data for nodejs/node/pull/61131
----------------------------------- PR info ------------------------------------
Title      src: improve StringBytes::Encode perf on UTF8 (#61131)
Author     Nikita Skovoroda <[email protected]> (@ChALkeR)
Branch     ChALkeR:chalker/non-ascii/0 -> nodejs:main
Labels     buffer, c++, performance, author ready, needs-ci
Commits    2
 - src: improve StringBytes::Encode perf on UTF8
 - src: do not use simdutf path on very short input
Committers 1
 - Nikita Skovoroda <[email protected]>
PR-URL: https://github.com/nodejs/node/pull/61131
Reviewed-By: Gürgün Dayıoğlu <[email protected]>
Reviewed-By: Stephen Belanger <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Daniel Lemire <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Rafael Gonzaga <[email protected]>
------------------------------ Generated metadata ------------------------------
PR-URL: https://github.com/nodejs/node/pull/61131
Reviewed-By: Gürgün Dayıoğlu <[email protected]>
Reviewed-By: Stephen Belanger <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Daniel Lemire <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Rafael Gonzaga <[email protected]>
--------------------------------------------------------------------------------
   ℹ  This PR was created on Sat, 20 Dec 2025 00:03:59 GMT
   ✔  Approvals: 6
   ✔  - Gürgün Dayıoğlu (@gurgunday): https://github.com/nodejs/node/pull/61131#pullrequestreview-3684616319
   ✔  - Stephen Belanger (@Qard): https://github.com/nodejs/node/pull/61131#pullrequestreview-3684608531
   ✔  - Matteo Collina (@mcollina) (TSC): https://github.com/nodejs/node/pull/61131#pullrequestreview-3676632638
   ✔  - Daniel Lemire (@lemire): https://github.com/nodejs/node/pull/61131#pullrequestreview-3679613336
   ✔  - Anna Henningsen (@addaleax): https://github.com/nodejs/node/pull/61131#pullrequestreview-3687657333
   ✔  - Rafael Gonzaga (@RafaelGSS) (TSC): https://github.com/nodejs/node/pull/61131#pullrequestreview-3688417316
   ✔  Last GitHub CI successful
   ℹ  Last Full PR CI on 2026-01-21T17:11:20Z: https://ci.nodejs.org/job/node-test-pull-request/70945/
- Querying data for job/node-test-pull-request/70945/
✔  Build data downloaded
   ✔  Last Jenkins CI successful
--------------------------------------------------------------------------------
   ✔  No git cherry-pick in progress
   ✔  No git am in progress
   ✔  No git rebase in progress
--------------------------------------------------------------------------------
- Bringing origin/main up to date...
From https://github.com/nodejs/node
 * branch                  main       -> FETCH_HEAD
✔  origin/main is now up-to-date
- Downloading patch for 61131
From https://github.com/nodejs/node
 * branch                  refs/pull/61131/merge -> FETCH_HEAD
✔  Fetched commits as 853277a9e22a..62af4d31195f
--------------------------------------------------------------------------------
[main c621f43e6b] src: improve StringBytes::Encode perf on UTF8
 Author: Nikita Skovoroda <[email protected]>
 Date: Sat Dec 20 03:27:28 2025 +0400
 2 files changed, 20 insertions(+)
[main 8da869a56e] src: do not use simdutf path on very short input
 Author: Nikita Skovoroda <[email protected]>
 Date: Wed Jan 21 02:25:59 2026 +0400
 1 file changed, 2 insertions(+), 1 deletion(-)
   ✔  Patches applied
There are 2 commits in the PR. Attempting autorebase.
(node:2265) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
(Use `node --trace-deprecation ...` to show where the warning was created)
Rebasing (2/4)
Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
src: improve StringBytes::Encode perf on UTF8

Co-authored-by: Gürgün Dayıoğlu <[email protected]>
PR-URL: #61131
Reviewed-By: Gürgün Dayıoğlu <[email protected]>
Reviewed-By: Stephen Belanger <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Daniel Lemire <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Rafael Gonzaga <[email protected]>

[detached HEAD 453ecdce86] src: improve StringBytes::Encode perf on UTF8
Author: Nikita Skovoroda <[email protected]>
Date: Sat Dec 20 03:27:28 2025 +0400
2 files changed, 20 insertions(+)
Rebasing (3/4)
Rebasing (4/4)
Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
src: do not use simdutf path on very short input

PR-URL: #61131
Reviewed-By: Gürgün Dayıoğlu <[email protected]>
Reviewed-By: Stephen Belanger <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Daniel Lemire <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Rafael Gonzaga <[email protected]>

[detached HEAD 372e2c4a14] src: do not use simdutf path on very short input
Author: Nikita Skovoroda <[email protected]>
Date: Wed Jan 21 02:25:59 2026 +0400
1 file changed, 2 insertions(+), 1 deletion(-)
Successfully rebased and updated refs/heads/main.

ℹ Add commit-queue-squash label to land the PR as one commit, or commit-queue-rebase to land as separate commits.

https://github.com/nodejs/node/actions/runs/21220877378

@ChALkeR
Copy link
Member Author

ChALkeR commented Jan 21, 2026

This should be squashed with commit-queue-squash

@RafaelGSS RafaelGSS added commit-queue Add this label to land a pull request using GitHub Actions. commit-queue-squash Add this label to instruct the Commit Queue to squash all the PR commits into the first one. and removed commit-queue-failed An error occurred while landing this pull request using GitHub Actions. labels Jan 21, 2026
@nodejs-github-bot nodejs-github-bot removed the commit-queue Add this label to land a pull request using GitHub Actions. label Jan 21, 2026
@nodejs-github-bot nodejs-github-bot merged commit 77e8d44 into nodejs:main Jan 21, 2026
78 of 79 checks passed
@nodejs-github-bot
Copy link
Collaborator

Landed in 77e8d44

aduh95 pushed a commit that referenced this pull request Jan 22, 2026
Co-authored-by: Gürgün Dayıoğlu <[email protected]>
PR-URL: #61131
Reviewed-By: Gürgün Dayıoğlu <[email protected]>
Reviewed-By: Stephen Belanger <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Daniel Lemire <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Rafael Gonzaga <[email protected]>
islandryu pushed a commit to islandryu/node that referenced this pull request Jan 25, 2026
Co-authored-by: Gürgün Dayıoğlu <[email protected]>
PR-URL: nodejs#61131
Reviewed-By: Gürgün Dayıoğlu <[email protected]>
Reviewed-By: Stephen Belanger <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Daniel Lemire <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Rafael Gonzaga <[email protected]>
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jan 27, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [node](https://nodejs.org) ([source](https://github.com/nodejs/node)) | minor | `25.4.0` → `25.5.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>nodejs/node (node)</summary>

### [`v25.5.0`](https://github.com/nodejs/node/releases/tag/v25.5.0): 2026-01-26, Version 25.5.0 (Current), @&#8203;aduh95

[Compare Source](nodejs/node@v25.4.0...v25.5.0)

##### Notable Changes

- \[[`99a4e51f93`](nodejs/node@99a4e51f93)] - **crypto**: update root certificates to NSS 3.119 (Node.js GitHub Bot) [#&#8203;61419](nodejs/node#61419)
- \[[`fbe4da5725`](nodejs/node@fbe4da5725)] - **(SEMVER-MINOR)** **deps**: add LIEF as a dependency (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`0feab0f083`](nodejs/node@0feab0f083)] - **(SEMVER-MINOR)** **deps**: add tools and scripts to pull LIEF as a dependency (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`e91b296001`](nodejs/node@e91b296001)] - **(SEMVER-MINOR)** **fs**: add ignore option to fs.watch (Matteo Collina) [#&#8203;61433](nodejs/node#61433)
- \[[`b351910af1`](nodejs/node@b351910af1)] - **(SEMVER-MINOR)** **sea**: add `--build-sea` to generate SEA directly with Node.js binary (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`957292e233`](nodejs/node@957292e233)] - **(SEMVER-MINOR)** **sea**: split sea binary manipulation code (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`f289817ff8`](nodejs/node@f289817ff8)] - **(SEMVER-MINOR)** **sqlite**: enable defensive mode by default (Bart Louwers) [#&#8203;61266](nodejs/node#61266)
- \[[`069f3603e2`](nodejs/node@069f3603e2)] - **(SEMVER-MINOR)** **sqlite**: add sqlite prepare options args (Guilherme Araújo) [#&#8203;61311](nodejs/node#61311)
- \[[`5a984b9a09`](nodejs/node@5a984b9a09)] - **src**: use node- prefix on thread names (Stewart X Addison) [#&#8203;61307](nodejs/node#61307)
- \[[`75c06bc2a8`](nodejs/node@75c06bc2a8)] - **(SEMVER-MINOR)** **test**: migrate to `--build-sea` in existing SEA tests (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`cabd58f1cb`](nodejs/node@cabd58f1cb)] - **(SEMVER-MINOR)** **test**: use fixture directories for sea tests (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`ff1fcabfc9`](nodejs/node@ff1fcabfc9)] - **(SEMVER-MINOR)** **test\_runner**: support expecting a test-case to fail (Jacob Smith) [#&#8203;60669](nodejs/node#60669)

##### Commits

- \[[`778a56f3c9`](nodejs/node@778a56f3c9)] - **assert,util**: fix deep comparison for sets and maps with mixed types (Ruben Bridgewater) [#&#8203;61388](nodejs/node#61388)
- \[[`32cd18e37f`](nodejs/node@32cd18e37f)] - **async\_hooks**: enabledHooksExist shall return if hooks are enabled (Gerhard Stöbich) [#&#8203;61054](nodejs/node#61054)
- \[[`482b2568bc`](nodejs/node@482b2568bc)] - **benchmark**: add SQLite benchmarks (Guilherme Araújo) [#&#8203;61401](nodejs/node#61401)
- \[[`e9a34263bb`](nodejs/node@e9a34263bb)] - **buffer**: make methods work on Uint8Array instances (Neal Beeken) [#&#8203;56578](nodejs/node#56578)
- \[[`8255cdefcf`](nodejs/node@8255cdefcf)] - **build**: add `--shared-nbytes` configure flag (Antoine du Hamel) [#&#8203;61341](nodejs/node#61341)
- \[[`8dd379d110`](nodejs/node@8dd379d110)] - **build**: update android-patches/trap-handler.h.patch (Mo Luo) [#&#8203;60369](nodejs/node#60369)
- \[[`1b4b5eb0e4`](nodejs/node@1b4b5eb0e4)] - **build**: update devcontainer.json to use paired nix env (Joyee Cheung) [#&#8203;61414](nodejs/node#61414)
- \[[`86e2a763ad`](nodejs/node@86e2a763ad)] - **build**: infer cargo mode with gyp var build\_type directly (Chengzhong Wu) [#&#8203;61354](nodejs/node#61354)
- \[[`7e211e6942`](nodejs/node@7e211e6942)] - **build**: add embedtest into native suite (Joyee Cheung) [#&#8203;61357](nodejs/node#61357)
- \[[`637470e79f`](nodejs/node@637470e79f)] - **build**: fix misplaced comma in ldflags (hqzing) [#&#8203;61294](nodejs/node#61294)
- \[[`a1a0f77a45`](nodejs/node@a1a0f77a45)] - **build**: fix crate vendor file checksums on windows (Chengzhong Wu) [#&#8203;61329](nodejs/node#61329)
- \[[`d597b8e342`](nodejs/node@d597b8e342)] - **build,tools**: fix addon build deadlock on errors (Vladimir Morozov) [#&#8203;61321](nodejs/node#61321)
- \[[`b5cdc27ba4`](nodejs/node@b5cdc27ba4)] - **build,win**: improve logs when ClangCL is missing (Mike McCready) [#&#8203;61438](nodejs/node#61438)
- \[[`ef01f0c033`](nodejs/node@ef01f0c033)] - **build,win**: update WinGet configurations to Python 3.14 (Mike McCready) [#&#8203;61431](nodejs/node#61431)
- \[[`d8a1cdeefe`](nodejs/node@d8a1cdeefe)] - **child\_process**: treat ipc length header as unsigned uint32 (Ryuhei Shima) [#&#8203;61344](nodejs/node#61344)
- \[[`588b00fafa`](nodejs/node@588b00fafa)] - **cluster**: fix port reuse between cluster (Ryuhei Shima) [#&#8203;60141](nodejs/node#60141)
- \[[`99a4e51f93`](nodejs/node@99a4e51f93)] - **crypto**: update root certificates to NSS 3.119 (Node.js GitHub Bot) [#&#8203;61419](nodejs/node#61419)
- \[[`048f7a5c9c`](nodejs/node@048f7a5c9c)] - **deps**: upgrade npm to 11.8.0 (npm team) [#&#8203;61466](nodejs/node#61466)
- \[[`fbe4da5725`](nodejs/node@fbe4da5725)] - **(SEMVER-MINOR)** **deps**: add LIEF as a dependency (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`0feab0f083`](nodejs/node@0feab0f083)] - **(SEMVER-MINOR)** **deps**: add tools and scripts to pull LIEF as a dependency (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`4bb00d7e3c`](nodejs/node@4bb00d7e3c)] - **deps**: update googletest to [`8508785`](nodejs/node@8508785) (Node.js GitHub Bot) [#&#8203;61417](nodejs/node#61417)
- \[[`6a3c614f27`](nodejs/node@6a3c614f27)] - **deps**: update sqlite to 3.51.2 (Node.js GitHub Bot) [#&#8203;61339](nodejs/node#61339)
- \[[`13c0397d6d`](nodejs/node@13c0397d6d)] - **deps**: update icu to 78.2 (Node.js GitHub Bot) [#&#8203;60523](nodejs/node#60523)
- \[[`098ec6f196`](nodejs/node@098ec6f196)] - **deps**: update ada to v3.4.0 (Yagiz Nizipli) [#&#8203;61315](nodejs/node#61315)
- \[[`320b576125`](nodejs/node@320b576125)] - **deps**: update zlib to 1.3.1-e00f703 (Node.js GitHub Bot) [#&#8203;61135](nodejs/node#61135)
- \[[`98f5e7cf51`](nodejs/node@98f5e7cf51)] - **deps**: V8: cherry-pick [highway@`dcc0ca1`](https://github.com/highway/node/commit/dcc0ca1cd42) (Richard Lau) [#&#8203;61008](nodejs/node#61008)
- \[[`e326df79c9`](nodejs/node@e326df79c9)] - **deps**: V8: backport [`209d2db`](nodejs/node@209d2db9e24a) (Zhijin Zeng) [#&#8203;61322](nodejs/node#61322)
- \[[`ccfd9d9b30`](nodejs/node@ccfd9d9b30)] - **doc**: remove `v` prefix for version references (Mike McCready) [#&#8203;61488](nodejs/node#61488)
- \[[`b6cc5d77a1`](nodejs/node@b6cc5d77a1)] - **doc**: mention constructor comparison in assert.deepStrictEqual (Hamza Kargin) [#&#8203;60253](nodejs/node#60253)
- \[[`236d7ee635`](nodejs/node@236d7ee635)] - **doc**: add CVE delay mention (Rafael Gonzaga) [#&#8203;61465](nodejs/node#61465)
- \[[`0729fb6ee7`](nodejs/node@0729fb6ee7)] - **doc**: update previous version links in BUILDING (Mike McCready) [#&#8203;61457](nodejs/node#61457)
- \[[`0fb464252f`](nodejs/node@0fb464252f)] - **doc**: include OpenJSF handle for security stewards (Rafael Gonzaga) [#&#8203;61454](nodejs/node#61454)
- \[[`3331bdca7c`](nodejs/node@3331bdca7c)] - **doc**: clarify process.argv\[1] behavior for -e/--eval (Jeevankumar S) [#&#8203;61366](nodejs/node#61366)
- \[[`94b34c38e2`](nodejs/node@94b34c38e2)] - **doc**: remove Windows Dev Home instructions from BUILDING (Mike McCready) [#&#8203;61434](nodejs/node#61434)
- \[[`a17016ee81`](nodejs/node@a17016ee81)] - **doc**: clarify TypedArray properties on Buffer (Roman Reiss) [#&#8203;61355](nodejs/node#61355)
- \[[`214fac9d7e`](nodejs/node@214fac9d7e)] - **doc**: update Python 3.14 manual install instructions (Windows) (Mike McCready) [#&#8203;61428](nodejs/node#61428)
- \[[`6a32a685a6`](nodejs/node@6a32a685a6)] - **doc**: note resume build should not be done on node-test-commit (Stewart X Addison) [#&#8203;61373](nodejs/node#61373)
- \[[`2a8e8dfaf3`](nodejs/node@2a8e8dfaf3)] - **doc**: refine WebAssembly error documentation (sangwook) [#&#8203;61382](nodejs/node#61382)
- \[[`f3caf27f8b`](nodejs/node@f3caf27f8b)] - **doc**: add deprecation history for url.parse (Eng Zer Jun) [#&#8203;61389](nodejs/node#61389)
- \[[`5ab8057856`](nodejs/node@5ab8057856)] - **doc**: add marco and rafael in last sec release (Marco Ippolito) [#&#8203;61383](nodejs/node#61383)
- \[[`f83cb1e785`](nodejs/node@f83cb1e785)] - **doc**: packages: example of private import switch to internal (coderaiser) [#&#8203;61343](nodejs/node#61343)
- \[[`3d23bcd0e2`](nodejs/node@3d23bcd0e2)] - **doc**: add esm and cjs examples to node:v8 (Alfredo González) [#&#8203;61328](nodejs/node#61328)
- \[[`1d159550e0`](nodejs/node@1d159550e0)] - **doc**: added 'secure' event to tls.TLSSocket (ikeyan) [#&#8203;61066](nodejs/node#61066)
- \[[`90080d2892`](nodejs/node@90080d2892)] - **doc**: restore [@&#8203;watilde](https://github.com/watilde) to collaborators (Daijiro Wachi) [#&#8203;61350](nodejs/node#61350)
- \[[`a87f7a50f8`](nodejs/node@a87f7a50f8)] - **doc**: run license-builder (github-actions\[bot]) [#&#8203;61348](nodejs/node#61348)
- \[[`adf5c84701`](nodejs/node@adf5c84701)] - **doc**: clean up writing-and-running-benchmarks.md (Hardanish Singh) [#&#8203;61345](nodejs/node#61345)
- \[[`2be98add0c`](nodejs/node@2be98add0c)] - **doc**: document ALPNCallback option for TLSSocket constructor (ikeyan) [#&#8203;61331](nodejs/node#61331)
- \[[`2db4893c8d`](nodejs/node@2db4893c8d)] - **esm**: ensure watch mode restarts after syntax errors (Xavier Stouder) [#&#8203;61232](nodejs/node#61232)
- \[[`828feb2e6b`](nodejs/node@828feb2e6b)] - **events**: remove redundant todo (Gürgün Dayıoğlu) [#&#8203;60595](nodejs/node#60595)
- \[[`e91b296001`](nodejs/node@e91b296001)] - **(SEMVER-MINOR)** **fs**: add ignore option to fs.watch (Matteo Collina) [#&#8203;61433](nodejs/node#61433)
- \[[`606184fae5`](nodejs/node@606184fae5)] - **fs**: remove duplicate getValidatedPath calls (Mert Can Altin) [#&#8203;61359](nodejs/node#61359)
- \[[`434fcd7f8f`](nodejs/node@434fcd7f8f)] - **fs**: fix errorOnExist behavior for directory copy in fs.cp (Nicholas Paun) [#&#8203;60946](nodejs/node#60946)
- \[[`bacba16f5e`](nodejs/node@bacba16f5e)] - **fs**: fix ENOTDIR in globSync when file is treated as dir (sangwook) [#&#8203;61259](nodejs/node#61259)
- \[[`7697ce0310`](nodejs/node@7697ce0310)] - **fs**: remove duplicate fd validation in sync functions (Mert Can Altin) [#&#8203;61361](nodejs/node#61361)
- \[[`8abd54f597`](nodejs/node@8abd54f597)] - **gyp**: aix: change gcc version detection so CXX="ccache g++" works (Stewart X Addison) [#&#8203;61464](nodejs/node#61464)
- \[[`24033ee7ea`](nodejs/node@24033ee7ea)] - **http**: fix rawHeaders exceeding maxHeadersCount limit (Max Harari) [#&#8203;61285](nodejs/node#61285)
- \[[`cf56327939`](nodejs/node@cf56327939)] - **http2**: validate initialWindowSize per HTTP/2 spec (Matteo Collina) [#&#8203;61402](nodejs/node#61402)
- \[[`696935eeeb`](nodejs/node@696935eeeb)] - **inspector**: initial support storage inspection (Ryuhei Shima) [#&#8203;61139](nodejs/node#61139)
- \[[`3d5e718e38`](nodejs/node@3d5e718e38)] - **lib**: fix typo in `util.js` comment (Taejin Kim) [#&#8203;61365](nodejs/node#61365)
- \[[`f55a5fea00`](nodejs/node@f55a5fea00)] - **lib**: fix TypeScript support check in jitless mode (sangwook) [#&#8203;61382](nodejs/node#61382)
- \[[`b3fbc3c375`](nodejs/node@b3fbc3c375)] - **meta**: do not fast-track npm updates (Antoine du Hamel) [#&#8203;61475](nodejs/node#61475)
- \[[`2423ecdaef`](nodejs/node@2423ecdaef)] - **meta**: fix typos in issue template config (Daijiro Wachi) [#&#8203;61399](nodejs/node#61399)
- \[[`e2df85a33a`](nodejs/node@e2df85a33a)] - **meta**: label v8 module MRs (René) [#&#8203;61325](nodejs/node#61325)
- \[[`bc9e5f7d4d`](nodejs/node@bc9e5f7d4d)] - **node-api**: fix node\_api\_create\_object\_with\_properties name (Vladimir Morozov) [#&#8203;61319](nodejs/node#61319)
- \[[`4f30c21c59`](nodejs/node@4f30c21c59)] - **node-api**: use Node-API in comments (Vladimir Morozov) [#&#8203;61320](nodejs/node#61320)
- \[[`62d71eb28d`](nodejs/node@62d71eb28d)] - **quic**: copy options.certs buffer instead of detaching (Chengzhong Wu) [#&#8203;61403](nodejs/node#61403)
- \[[`4bbbe75ba1`](nodejs/node@4bbbe75ba1)] - **quic**: move quic behind compile time flag (Matteo Collina) [#&#8203;61444](nodejs/node#61444)
- \[[`b351910af1`](nodejs/node@b351910af1)] - **(SEMVER-MINOR)** **sea**: add --build-sea to generate SEA directly with Node.js binary (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`957292e233`](nodejs/node@957292e233)] - **(SEMVER-MINOR)** **sea**: split sea binary manipulation code (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`f289817ff8`](nodejs/node@f289817ff8)] - **(SEMVER-MINOR)** **sqlite**: enable defensive mode by default (Bart Louwers) [#&#8203;61266](nodejs/node#61266)
- \[[`6442229880`](nodejs/node@6442229880)] - **sqlite**: add some tests (Guilherme Araújo) [#&#8203;61410](nodejs/node#61410)
- \[[`069f3603e2`](nodejs/node@069f3603e2)] - **(SEMVER-MINOR)** **sqlite**: add sqlite prepare options args (Guilherme Araújo) [#&#8203;61311](nodejs/node#61311)
- \[[`df02d00d61`](nodejs/node@df02d00d61)] - **src**: improve StringBytes::Encode perf on UTF8 (Сковорода Никита Андреевич) [#&#8203;61131](nodejs/node#61131)
- \[[`e35814ba80`](nodejs/node@e35814ba80)] - **src**: add missing override specifier to Clean() (Tobias Nießen) [#&#8203;61429](nodejs/node#61429)
- \[[`803ff7d3de`](nodejs/node@803ff7d3de)] - **src**: cache context lookup in vectored io loops (Mert Can Altin) [#&#8203;61387](nodejs/node#61387)
- \[[`58abe99cbf`](nodejs/node@58abe99cbf)] - **src**: cache missing package.json files in the C++ package config cache (Michael Smith) [#&#8203;60425](nodejs/node#60425)
- \[[`2a542094e4`](nodejs/node@2a542094e4)] - **src**: use starts\_with instead of rfind/find (Tobias Nießen) [#&#8203;61426](nodejs/node#61426)
- \[[`77cacf6d9d`](nodejs/node@77cacf6d9d)] - **src**: use C++ nullptr in sqlite (Tobias Nießen) [#&#8203;61416](nodejs/node#61416)
- \[[`344cc629d4`](nodejs/node@344cc629d4)] - **src**: use C++ nullptr in webstorage (Tobias Nießen) [#&#8203;61407](nodejs/node#61407)
- \[[`9f25cad26c`](nodejs/node@9f25cad26c)] - **src**: fix pointer alignment (jhofstee) [#&#8203;61336](nodejs/node#61336)
- \[[`5a984b9a09`](nodejs/node@5a984b9a09)] - **src**: use node- prefix on thread names (Stewart X Addison) [#&#8203;61307](nodejs/node#61307)
- \[[`d4cf423a65`](nodejs/node@d4cf423a65)] - **stream**: export namespace object from internal end-of-stream module (René) [#&#8203;61455](nodejs/node#61455)
- \[[`7d8232e34c`](nodejs/node@7d8232e34c)] - **test**: add some validation for JSON doc output (Antoine du Hamel) [#&#8203;61413](nodejs/node#61413)
- \[[`75c06bc2a8`](nodejs/node@75c06bc2a8)] - **(SEMVER-MINOR)** **test**: migrate to --build-sea in existing SEA tests (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`cabd58f1cb`](nodejs/node@cabd58f1cb)] - **(SEMVER-MINOR)** **test**: use fixture directories for sea tests (Joyee Cheung) [#&#8203;61167](nodejs/node#61167)
- \[[`bcffca8911`](nodejs/node@bcffca8911)] - **test**: aix: mark test\_threadsafe\_function/test flaky on AIX (Stewart X Addison) [#&#8203;61452](nodejs/node#61452)
- \[[`29399501c1`](nodejs/node@29399501c1)] - **test**: add implicit test for fs dispose handling with using (Ilyas Shabi) [#&#8203;61140](nodejs/node#61140)
- \[[`3bb481571a`](nodejs/node@3bb481571a)] - **test**: reveal wpt evaluation errors in status files (Chengzhong Wu) [#&#8203;61358](nodejs/node#61358)
- \[[`a132be7f71`](nodejs/node@a132be7f71)] - **test**: check new WebCryptoAPI enum values (Filip Skokan) [#&#8203;61406](nodejs/node#61406)
- \[[`72f1463735`](nodejs/node@72f1463735)] - **test**: split test-esm-loader-hooks (Joyee Cheung) [#&#8203;61374](nodejs/node#61374)
- \[[`39105e4c5f`](nodejs/node@39105e4c5f)] - **test**: aix: mark test-emit-on-destroyed as flaky (Stewart X Addison) [#&#8203;61381](nodejs/node#61381)
- \[[`3f17acfb1c`](nodejs/node@3f17acfb1c)] - **test**: add webidl web-platform tests (Yagiz Nizipli) [#&#8203;61316](nodejs/node#61316)
- \[[`89983cf747`](nodejs/node@89983cf747)] - **test**: update url web-platform tests (Yagiz Nizipli) [#&#8203;61315](nodejs/node#61315)
- \[[`73c0a242d7`](nodejs/node@73c0a242d7)] - **test**: forbid use of named imports for fixtures (Antoine du Hamel) [#&#8203;61228](nodejs/node#61228)
- \[[`a49d54308e`](nodejs/node@a49d54308e)] - **test**: enforce better never-settling-promise detection (Antoine du Hamel) [#&#8203;60976](nodejs/node#60976)
- \[[`335cb0b5cc`](nodejs/node@335cb0b5cc)] - **test**: ensure assertions are reached on all tests (Antoine du Hamel) [#&#8203;60845](nodejs/node#60845)
- \[[`5ee02c789a`](nodejs/node@5ee02c789a)] - **test**: ensure assertions are reached on more tests (Antoine du Hamel) [#&#8203;60763](nodejs/node#60763)
- \[[`141fb82ffb`](nodejs/node@141fb82ffb)] - **test**: ensure assertions are reached on more tests (Antoine du Hamel) [#&#8203;60760](nodejs/node#60760)
- \[[`edf90ce457`](nodejs/node@edf90ce457)] - **test**: use `RegExp.escape` to improve test reliability (Antoine du Hamel) [#&#8203;60803](nodejs/node#60803)
- \[[`f5f9b2dcf6`](nodejs/node@f5f9b2dcf6)] - **test**: ensure assertions are reached on more tests (Antoine du Hamel) [#&#8203;60728](nodejs/node#60728)
- \[[`ec1cbbe0b6`](nodejs/node@ec1cbbe0b6)] - **test\_runner**: fix memory leaks in runner (Abhishek Kv. Savani) [#&#8203;60860](nodejs/node#60860)
- \[[`399ac68427`](nodejs/node@399ac68427)] - **test\_runner**: fix coverage report when a directory is named file (Heath Dutton🕴️) [#&#8203;61169](nodejs/node#61169)
- \[[`6e1beda333`](nodejs/node@6e1beda333)] - **test\_runner**: print info when test restarts (Xavier Stouder) [#&#8203;61160](nodejs/node#61160)
- \[[`f5803ccb86`](nodejs/node@f5803ccb86)] - **test\_runner**: fix rerun ambiguous test failures (Moshe Atlow) [#&#8203;61392](nodejs/node#61392)
- \[[`a5a4c3eb44`](nodejs/node@a5a4c3eb44)] - **test\_runner**: nix dead reporter code (Vas Sudanagunta) [#&#8203;59700](nodejs/node#59700)
- \[[`ff1fcabfc9`](nodejs/node@ff1fcabfc9)] - **(SEMVER-MINOR)** **test\_runner**: support expecting a test-case to fail (Jacob Smith) [#&#8203;60669](nodejs/node#60669)
- \[[`ade4fc2338`](nodejs/node@ade4fc2338)] - **tools**: copyedit Nix files (Antoine du Hamel) [#&#8203;61447](nodejs/node#61447)
- \[[`7c2242beb9`](nodejs/node@7c2242beb9)] - **tools**: validate release commit diff as part of `lint-release-proposal` (Antoine du Hamel) [#&#8203;61440](nodejs/node#61440)
- \[[`ca4ebed258`](nodejs/node@ca4ebed258)] - **tools**: use ad-hoc flag to lint Nix files (Antoine du Hamel) [#&#8203;61405](nodejs/node#61405)
- \[[`05ce2c87f3`](nodejs/node@05ce2c87f3)] - **tools**: fix vcbuild lint-js-build (Vladimir Morozov) [#&#8203;61318](nodejs/node#61318)
- \[[`41adb54a37`](nodejs/node@41adb54a37)] - **tools**: enforce trailing commas in `test/es-module` (Antoine du Hamel) [#&#8203;60891](nodejs/node#60891)
- \[[`eebd732a52`](nodejs/node@eebd732a52)] - **tools**: enforce trailing commas in `test/sequential` (Antoine du Hamel) [#&#8203;60892](nodejs/node#60892)
- \[[`8b73739e03`](nodejs/node@8b73739e03)] - **typings**: add typing for string\_decoder (Taejin Kim) [#&#8203;61368](nodejs/node#61368)
- \[[`e88dd012ad`](nodejs/node@e88dd012ad)] - **v8**: changing total\_allocated\_bytes to avoid ABI changes (Caio Lima) [#&#8203;60800](nodejs/node#60800)
- \[[`c75ad3d87d`](nodejs/node@c75ad3d87d)] - **v8**: add GCProfiler support for erm (Ilyas Shabi) [#&#8203;61191](nodejs/node#61191)
- \[[`611c179663`](nodejs/node@611c179663)] - **zlib**: validate write\_result array length (Ryuhei Shima) [#&#8203;61342](nodejs/node#61342)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45Mi4xMSIsInVwZGF0ZWRJblZlciI6IjQyLjkyLjExIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
aduh95 pushed a commit that referenced this pull request Jan 27, 2026
Co-authored-by: Gürgün Dayıoğlu <[email protected]>
PR-URL: #61131
Reviewed-By: Gürgün Dayıoğlu <[email protected]>
Reviewed-By: Stephen Belanger <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Daniel Lemire <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Rafael Gonzaga <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author ready PRs that have at least one approval, no pending requests for changes, and a CI started. buffer Issues and PRs related to the buffer subsystem. c++ Issues and PRs that require attention from people who are familiar with C++. commit-queue-squash Add this label to instruct the Commit Queue to squash all the PR commits into the first one. needs-ci PRs that need a full CI run. performance Issues and PRs related to the performance of Node.js.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants