Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

util: harden more built-in classes against prototype pollution #56225

Merged
merged 3 commits into from
Dec 16, 2024

Conversation

aduh95
Copy link
Contributor

@aduh95 aduh95 commented Dec 11, 2024

For an arbitrary list of classes, we can protect against userland mutation of the constructor prototype property, and speed up the inspect call by avoiding a ObjectGetOwnPropertyDescriptor call. I tried to come up with a list of classes that are the most likely to be often inspected, though I haven't used any rigorous method, I just came up with it, and I'm certainly open to add/remove some.

Refs: #56188 (comment)

@nodejs-github-bot nodejs-github-bot added buffer Issues and PRs related to the buffer subsystem. needs-ci PRs that need a full CI run. util Issues and PRs related to the built-in util module. labels Dec 11, 2024
Copy link

codecov bot commented Dec 11, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 88.53%. Comparing base (4a91507) to head (c4081e0).
Report is 40 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff            @@
##             main   #56225    +/-   ##
========================================
  Coverage   88.53%   88.53%            
========================================
  Files         657      657            
  Lines      189880   190225   +345     
  Branches    36453    36529    +76     
========================================
+ Hits       168104   168420   +316     
+ Misses      14988    14985     -3     
- Partials     6788     6820    +32     
Files with missing lines Coverage Δ
lib/buffer.js 100.00% <100.00%> (ø)
lib/internal/util/inspect.js 99.91% <100.00%> (+<0.01%) ⬆️

... and 51 files with indirect coverage changes

@@ -599,8 +608,13 @@ function isInstanceof(object, proto) {

// Special-case for some builtin prototypes in case their `constructor` property has been tampered.
const wellKnownPrototypes = new SafeMap();
Copy link
Member

@ljharb ljharb Dec 11, 2024

Choose a reason for hiding this comment

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

Suggested change
const wellKnownPrototypes = new SafeMap();
const wellKnownPrototypes = new SafeWeakMap();

not sure if this affects performance or not - since the builtins aren't expected to be collected it probably doesn't matter either way, so stick with whatever's faster.

lib/buffer.js Show resolved Hide resolved
@aduh95 aduh95 added author ready PRs that have at least one approval, no pending requests for changes, and a CI started. request-ci Add this label to start a Jenkins CI on a PR. labels Dec 13, 2024
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Dec 13, 2024
@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

Copy link
Member

@H4ad H4ad left a comment

Choose a reason for hiding this comment

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

Benchmark CI: https://ci.nodejs.org/view/Node.js%20benchmark/job/benchmark-node-micro-benchmarks/1656/

I know this is not a performance PR, but as we saw in the other PR, this approach really helped performance, so I ran this benchmark just to check for any regressions/improvements.

Results
                                                                                                            confidence improvement accuracy (*)    (**)   (***)
util/format.js type='many-%' n=1000000                                                                                     -0.22 %       ±0.73%  ±0.97%  ±1.26%
util/format.js type='no-replace-2' n=1000000                                                                               -0.93 %       ±1.74%  ±2.32%  ±3.02%
util/format.js type='no-replace' n=1000000                                                                                  0.29 %       ±1.12%  ±1.50%  ±1.95%
util/format.js type='number' n=1000000                                                                                      0.71 %       ±1.15%  ±1.53%  ±2.00%
util/format.js type='object-%s' n=1000000                                                                                  -0.05 %       ±0.33%  ±0.44%  ±0.57%
util/format.js type='object-to-string' n=1000000                                                                            0.30 %       ±1.32%  ±1.75%  ±2.28%
util/format.js type='only-objects' n=1000000                                                                                0.17 %       ±0.26%  ±0.34%  ±0.45%
util/format.js type='replace-object' n=1000000                                                                             -0.45 %       ±0.61%  ±0.81%  ±1.06%
util/format.js type='string-2' n=1000000                                                                                   -0.10 %       ±1.36%  ±1.81%  ±2.36%
util/format.js type='string' n=1000000                                                                                     -0.16 %       ±1.25%  ±1.67%  ±2.18%
util/format.js type='unknown' n=1000000                                                                                    -0.16 %       ±1.21%  ±1.61%  ±2.10%
util/get-callsite.js method='CPP' n=1000000                                                                          *     -0.39 %       ±0.37%  ±0.49%  ±0.65%
util/get-callsite.js method='ErrorCallSites' n=1000000                                                                     -0.01 %       ±0.26%  ±0.35%  ±0.46%
util/get-callsite.js method='ErrorCallSitesSerialized' n=1000000                                                            0.10 %       ±0.18%  ±0.23%  ±0.30%
util/inspect-array.js type='denseArray_showHidden' len=100 n=5000                                                    *      0.69 %       ±0.66%  ±0.88%  ±1.15%
util/inspect-array.js type='denseArray_showHidden' len=100000 n=5000                                                 *      1.22 %       ±0.99%  ±1.31%  ±1.71%
util/inspect-array.js type='denseArray' len=100 n=5000                                                                      0.10 %       ±0.64%  ±0.86%  ±1.12%
util/inspect-array.js type='denseArray' len=100000 n=5000                                                            *      1.24 %       ±0.98%  ±1.31%  ±1.70%
util/inspect-array.js type='mixedArray' len=100 n=5000                                                                      0.17 %       ±0.32%  ±0.43%  ±0.56%
util/inspect-array.js type='mixedArray' len=100000 n=5000                                                                   0.09 %       ±0.13%  ±0.18%  ±0.23%
util/inspect-array.js type='sparseArray' len=100 n=5000                                                                     3.21 %       ±4.26%  ±5.67%  ±7.38%
util/inspect-array.js type='sparseArray' len=100000 n=5000                                                                 -0.10 %       ±0.81%  ±1.08%  ±1.40%
util/inspect-proxy.js isProxy=0 showProxy=0 n=100000                                                                **     -0.70 %       ±0.50%  ±0.66%  ±0.86%
util/inspect-proxy.js isProxy=0 showProxy=1 n=100000                                                                        0.07 %       ±0.70%  ±0.93%  ±1.21%
util/inspect-proxy.js isProxy=1 showProxy=0 n=100000                                                                       -0.12 %       ±0.56%  ±0.74%  ±0.97%
util/inspect-proxy.js isProxy=1 showProxy=1 n=100000                                                                       -0.30 %       ±0.43%  ±0.57%  ±0.74%
util/inspect.js option='colors' method='Array' n=80000                                                             ***      1.83 %       ±0.46%  ±0.61%  ±0.79%
util/inspect.js option='colors' method='Date' n=80000                                                                      -0.07 %       ±1.15%  ±1.53%  ±1.99%
util/inspect.js option='colors' method='Error' n=80000                                                                     -0.59 %       ±0.77%  ±1.03%  ±1.34%
util/inspect.js option='colors' method='Number' n=80000                                                                     0.05 %       ±2.36%  ±3.14%  ±4.10%
util/inspect.js option='colors' method='Object_deep_ln' n=80000                                                            -0.01 %       ±0.27%  ±0.36%  ±0.46%
util/inspect.js option='colors' method='Object_empty' n=80000                                                               0.09 %       ±2.23%  ±2.96%  ±3.85%
util/inspect.js option='colors' method='Object' n=80000                                                                    -0.05 %       ±0.46%  ±0.61%  ±0.79%
util/inspect.js option='colors' method='Set' n=80000                                                               ***      5.38 %       ±0.87%  ±1.16%  ±1.51%
util/inspect.js option='colors' method='String_boxed' n=80000                                                               1.30 %       ±1.64%  ±2.18%  ±2.84%
util/inspect.js option='colors' method='String_complex' n=80000                                                             1.37 %       ±1.43%  ±1.91%  ±2.50%
util/inspect.js option='colors' method='String' n=80000                                                                     1.45 %       ±1.91%  ±2.56%  ±3.37%
util/inspect.js option='colors' method='TypedArray_extra' n=80000                                                           0.24 %       ±0.34%  ±0.45%  ±0.59%
util/inspect.js option='colors' method='TypedArray' n=80000                                                                 0.09 %       ±0.43%  ±0.58%  ±0.75%
util/inspect.js option='none' method='Array' n=80000                                                                        0.12 %       ±0.58%  ±0.77%  ±1.00%
util/inspect.js option='none' method='Date' n=80000                                                                        -1.05 %       ±1.61%  ±2.15%  ±2.80%
util/inspect.js option='none' method='Error' n=80000                                                                       -1.56 %       ±1.84%  ±2.46%  ±3.23%
util/inspect.js option='none' method='Number' n=80000                                                                       0.90 %       ±2.44%  ±3.26%  ±4.26%
util/inspect.js option='none' method='Object_deep_ln' n=80000                                                               0.37 %       ±0.47%  ±0.62%  ±0.81%
util/inspect.js option='none' method='Object_empty' n=80000                                                                 1.23 %       ±2.18%  ±2.90%  ±3.78%
util/inspect.js option='none' method='Object' n=80000                                                                      -0.50 %       ±0.99%  ±1.32%  ±1.71%
util/inspect.js option='none' method='Set' n=80000                                                                 ***     11.52 %       ±1.60%  ±2.13%  ±2.77%
util/inspect.js option='none' method='String_boxed' n=80000                                                                -0.11 %       ±0.54%  ±0.72%  ±0.95%
util/inspect.js option='none' method='String_complex' n=80000                                                        *      2.59 %       ±2.38%  ±3.17%  ±4.13%
util/inspect.js option='none' method='String' n=80000                                                                      -0.04 %       ±2.02%  ±2.70%  ±3.52%
util/inspect.js option='none' method='TypedArray_extra' n=80000                                                      *     -0.40 %       ±0.37%  ±0.49%  ±0.64%
util/inspect.js option='none' method='TypedArray' n=80000                                                                  -0.09 %       ±0.49%  ±0.66%  ±0.86%
util/inspect.js option='showHidden' method='Array' n=80000                                                          **      0.78 %       ±0.47%  ±0.63%  ±0.82%
util/inspect.js option='showHidden' method='Date' n=80000                                                                  -0.92 %       ±1.22%  ±1.62%  ±2.12%
util/inspect.js option='showHidden' method='Error' n=80000                                                                 -0.03 %       ±0.77%  ±1.03%  ±1.34%
util/inspect.js option='showHidden' method='Number' n=80000                                                                -0.86 %       ±3.93%  ±5.23%  ±6.81%
util/inspect.js option='showHidden' method='Object_deep_ln' n=80000                                                  *     -0.41 %       ±0.33%  ±0.44%  ±0.57%
util/inspect.js option='showHidden' method='Object_empty' n=80000                                                          -0.22 %       ±3.23%  ±4.30%  ±5.60%
util/inspect.js option='showHidden' method='Object' n=80000                                                                -0.11 %       ±0.57%  ±0.76%  ±0.99%
util/inspect.js option='showHidden' method='Set' n=80000                                                           ***     13.13 %       ±1.49%  ±1.98%  ±2.59%
util/inspect.js option='showHidden' method='String_boxed' n=80000                                                          -0.17 %       ±0.63%  ±0.84%  ±1.10%
util/inspect.js option='showHidden' method='String_complex' n=80000                                                         0.74 %       ±1.43%  ±1.90%  ±2.47%
util/inspect.js option='showHidden' method='String' n=80000                                                                -1.17 %       ±4.61%  ±6.14%  ±7.99%
util/inspect.js option='showHidden' method='TypedArray_extra' n=80000                                              ***      3.95 %       ±0.38%  ±0.51%  ±0.67%
util/inspect.js option='showHidden' method='TypedArray' n=80000                                                    ***      3.69 %       ±0.54%  ±0.71%  ±0.93%
util/normalize-encoding.js n=1000000 input=''                                                                               4.37 %       ±4.58%  ±6.10%  ±7.94%
util/normalize-encoding.js n=1000000 input='base64'                                                                         0.96 %       ±4.65%  ±6.19%  ±8.06%
util/normalize-encoding.js n=1000000 input='BASE64'                                                                        -2.61 %       ±3.73%  ±4.97%  ±6.48%
util/normalize-encoding.js n=1000000 input='binary'                                                                         0.72 %       ±3.81%  ±5.06%  ±6.60%
util/normalize-encoding.js n=1000000 input='BINARY'                                                                         0.63 %       ±2.88%  ±3.83%  ±4.98%
util/normalize-encoding.js n=1000000 input='foo'                                                                            1.20 %       ±2.51%  ±3.34%  ±4.36%
util/normalize-encoding.js n=1000000 input='group_common'                                                            *      1.60 %       ±1.41%  ±1.89%  ±2.48%
util/normalize-encoding.js n=1000000 input='group_misc'                                                                    -0.38 %       ±3.52%  ±4.69%  ±6.11%
util/normalize-encoding.js n=1000000 input='group_uncommon'                                                                -0.32 %       ±5.09%  ±6.77%  ±8.81%
util/normalize-encoding.js n=1000000 input='group_upper'                                                                   -0.84 %       ±3.19%  ±4.25%  ±5.54%
util/normalize-encoding.js n=1000000 input='hex'                                                                            0.96 %       ±5.34%  ±7.10%  ±9.24%
util/normalize-encoding.js n=1000000 input='HEX'                                                                            1.12 %       ±4.72%  ±6.28%  ±8.18%
util/normalize-encoding.js n=1000000 input='latin1'                                                                        -0.81 %       ±4.85%  ±6.49%  ±8.50%
util/normalize-encoding.js n=1000000 input='ucs2'                                                                          -2.48 %       ±4.26%  ±5.67%  ±7.39%
util/normalize-encoding.js n=1000000 input='UCS2'                                                                           1.60 %       ±4.17%  ±5.55%  ±7.23%
util/normalize-encoding.js n=1000000 input='undefined'                                                                      0.26 %       ±3.81%  ±5.07%  ±6.61%
util/normalize-encoding.js n=1000000 input='utf-8'                                                                         -3.48 %       ±3.89%  ±5.20%  ±6.83%
util/normalize-encoding.js n=1000000 input='UTF-8'                                                                          0.98 %       ±2.94%  ±3.91%  ±5.09%
util/normalize-encoding.js n=1000000 input='utf16le'                                                                       -1.13 %       ±3.51%  ±4.68%  ±6.11%
util/normalize-encoding.js n=1000000 input='UTF16LE'                                                                        0.24 %       ±5.25%  ±6.98%  ±9.10%
util/normalize-encoding.js n=1000000 input='utf8'                                                                          -0.57 %       ±4.34%  ±5.78%  ±7.52%
util/normalize-encoding.js n=1000000 input='Utf8'                                                                           0.88 %       ±1.80%  ±2.40%  ±3.12%
util/normalize-encoding.js n=1000000 input='UTF8'                                                                           3.02 %       ±5.53%  ±7.37%  ±9.61%
util/parse-env.js n=30000                                                                                                   0.25 %       ±0.49%  ±0.65%  ±0.84%
util/priority-queue.js n=100000                                                                                      *     -1.79 %       ±1.78%  ±2.39%  ±3.15%
util/splice-one.js size=10 pos='end' n=5000000                                                                              2.49 %       ±3.64%  ±4.85%  ±6.33%
util/splice-one.js size=10 pos='middle' n=5000000                                                                          -0.32 %       ±0.79%  ±1.05%  ±1.37%
util/splice-one.js size=10 pos='start' n=5000000                                                                           -0.60 %       ±0.89%  ±1.19%  ±1.54%
util/splice-one.js size=100 pos='end' n=5000000                                                                            -1.15 %       ±3.48%  ±4.64%  ±6.06%
util/splice-one.js size=100 pos='middle' n=5000000                                                                          0.29 %       ±0.56%  ±0.75%  ±0.97%
util/splice-one.js size=100 pos='start' n=5000000                                                                          -0.01 %       ±0.17%  ±0.22%  ±0.29%
util/splice-one.js size=500 pos='end' n=5000000                                                                            -0.19 %       ±4.29%  ±5.71%  ±7.43%
util/splice-one.js size=500 pos='middle' n=5000000                                                                          0.01 %       ±0.06%  ±0.08%  ±0.10%
util/splice-one.js size=500 pos='start' n=5000000                                                                          -0.01 %       ±0.02%  ±0.03%  ±0.03%
util/style-text.js n=1000 format='invalid' messageType='boolean'                                                           -3.08 %       ±3.16%  ±4.24%  ±5.60%
util/style-text.js n=1000 format='invalid' messageType='invalid'                                                           -1.20 %       ±2.55%  ±3.40%  ±4.42%
util/style-text.js n=1000 format='invalid' messageType='number'                                                             2.62 %       ±4.36%  ±5.84%  ±7.67%
util/style-text.js n=1000 format='invalid' messageType='string'                                                            -1.28 %       ±4.49%  ±5.98%  ±7.78%
util/style-text.js n=1000 format='italic' messageType='boolean'                                                            -0.17 %       ±2.61%  ±3.47%  ±4.52%
util/style-text.js n=1000 format='italic' messageType='invalid'                                                             1.65 %       ±2.13%  ±2.85%  ±3.75%
util/style-text.js n=1000 format='italic' messageType='number'                                                              0.83 %       ±2.46%  ±3.29%  ±4.31%
util/style-text.js n=1000 format='italic' messageType='string'                                                              2.10 %       ±2.57%  ±3.43%  ±4.47%
util/style-text.js n=1000 format='red' messageType='boolean'                                                                0.64 %       ±2.18%  ±2.90%  ±3.77%
util/style-text.js n=1000 format='red' messageType='invalid'                                                                0.90 %       ±3.03%  ±4.03%  ±5.24%
util/style-text.js n=1000 format='red' messageType='number'                                                          *     -2.03 %       ±1.94%  ±2.60%  ±3.40%
util/style-text.js n=1000 format='red' messageType='string'                                                                -1.05 %       ±3.00%  ±3.99%  ±5.19%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=0 encoding='iso-8859-3'                         0.08 %       ±0.83%  ±1.11%  ±1.44%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=0 encoding='utf-8'                             -1.57 %       ±1.85%  ±2.48%  ±3.25%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=0 encoding='windows-1252'                       0.60 %       ±1.81%  ±2.41%  ±3.13%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=1 encoding='iso-8859-3'                        -0.10 %       ±1.09%  ±1.44%  ±1.88%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=1 encoding='utf-8'                              0.38 %       ±1.27%  ±1.69%  ±2.20%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=1 encoding='windows-1252'                      -0.24 %       ±1.50%  ±2.00%  ±2.61%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=0 encoding='iso-8859-3'                        -0.65 %       ±1.03%  ±1.37%  ±1.78%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=0 encoding='utf-8'                              1.18 %       ±1.49%  ±1.98%  ±2.59%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=0 encoding='windows-1252'                *     -1.63 %       ±1.55%  ±2.07%  ±2.73%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=1 encoding='iso-8859-3'                         0.17 %       ±0.96%  ±1.28%  ±1.66%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=1 encoding='utf-8'                              0.51 %       ±1.82%  ±2.43%  ±3.16%
util/text-decoder.js type='ArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=1 encoding='windows-1252'                       0.69 %       ±1.62%  ±2.15%  ±2.80%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=0 encoding='iso-8859-3'                   *     -1.86 %       ±1.68%  ±2.24%  ±2.93%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=0 encoding='utf-8'                               0.01 %       ±1.81%  ±2.41%  ±3.15%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=0 encoding='windows-1252'                        0.25 %       ±1.42%  ±1.88%  ±2.45%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=1 encoding='iso-8859-3'                         -0.90 %       ±3.46%  ±4.60%  ±5.99%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=1 encoding='utf-8'                               2.24 %       ±2.40%  ±3.19%  ±4.16%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=1 encoding='windows-1252'                        0.42 %       ±1.94%  ±2.59%  ±3.37%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=0 encoding='iso-8859-3'                         -0.86 %       ±3.01%  ±4.01%  ±5.22%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=0 encoding='utf-8'                               0.03 %       ±2.49%  ±3.34%  ±4.38%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=0 encoding='windows-1252'                        0.46 %       ±2.32%  ±3.09%  ±4.03%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=1 encoding='iso-8859-3'                         -1.88 %       ±3.45%  ±4.59%  ±5.98%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=1 encoding='utf-8'                              -1.00 %       ±3.11%  ±4.15%  ±5.43%
util/text-decoder.js type='ArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=1 encoding='windows-1252'                       -0.33 %       ±1.28%  ±1.70%  ±2.21%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=0 encoding='iso-8859-3'                           -0.08 %       ±3.54%  ±4.71%  ±6.13%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=0 encoding='utf-8'                                 1.08 %       ±4.71%  ±6.28%  ±8.19%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=0 encoding='windows-1252'                          1.19 %       ±3.21%  ±4.27%  ±5.56%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=1 encoding='iso-8859-3'                            0.79 %       ±3.48%  ±4.64%  ±6.04%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=1 encoding='utf-8'                                 1.20 %       ±3.44%  ±4.58%  ±5.96%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=1 encoding='windows-1252'                          1.27 %       ±4.77%  ±6.35%  ±8.27%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=0 encoding='iso-8859-3'                           -0.32 %       ±3.41%  ±4.54%  ±5.91%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=0 encoding='utf-8'                                 0.48 %       ±4.32%  ±5.75%  ±7.49%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=0 encoding='windows-1252'                          1.60 %       ±4.47%  ±5.95%  ±7.75%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=1 encoding='iso-8859-3'                            0.03 %       ±4.11%  ±5.47%  ±7.12%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=1 encoding='utf-8'                                -4.26 %       ±5.14%  ±6.85%  ±8.95%
util/text-decoder.js type='ArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=1 encoding='windows-1252'                         -1.81 %       ±4.72%  ±6.28%  ±8.18%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=0 ignoreBOM=0 encoding='iso-8859-3'                             -0.65 %       ±2.85%  ±3.79%  ±4.93%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=0 ignoreBOM=0 encoding='utf-8'                                  -0.07 %       ±1.12%  ±1.49%  ±1.94%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=0 ignoreBOM=0 encoding='windows-1252'                           -0.35 %       ±2.09%  ±2.78%  ±3.62%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=0 ignoreBOM=1 encoding='iso-8859-3'                             -2.04 %       ±2.13%  ±2.85%  ±3.76%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=0 ignoreBOM=1 encoding='utf-8'                                   0.36 %       ±1.10%  ±1.47%  ±1.91%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=0 ignoreBOM=1 encoding='windows-1252'                            1.39 %       ±1.99%  ±2.65%  ±3.46%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=1 ignoreBOM=0 encoding='iso-8859-3'                              2.16 %       ±5.70%  ±7.58%  ±9.87%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=1 ignoreBOM=0 encoding='utf-8'                                  -0.63 %       ±4.59%  ±6.11%  ±7.96%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=1 ignoreBOM=0 encoding='windows-1252'                           -2.08 %       ±2.14%  ±2.84%  ±3.71%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=1 ignoreBOM=1 encoding='iso-8859-3'                             -4.63 %       ±5.60%  ±7.45%  ±9.71%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=1 ignoreBOM=1 encoding='utf-8'                                   2.78 %       ±4.08%  ±5.43%  ±7.07%
util/text-decoder.js type='Buffer' n=1000 len=131072 fatal=1 ignoreBOM=1 encoding='windows-1252'                            0.22 %       ±2.57%  ±3.43%  ±4.48%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=0 ignoreBOM=0 encoding='iso-8859-3'                              -2.54 %       ±7.64% ±10.17% ±13.24%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=0 ignoreBOM=0 encoding='utf-8'                                   -2.76 %       ±7.17%  ±9.54% ±12.43%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=0 ignoreBOM=0 encoding='windows-1252'                            -1.76 %       ±6.86%  ±9.12% ±11.88%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=0 ignoreBOM=1 encoding='iso-8859-3'                              -2.74 %       ±6.96%  ±9.28% ±12.11%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=0 ignoreBOM=1 encoding='utf-8'                                    2.88 %       ±7.31%  ±9.73% ±12.66%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=0 ignoreBOM=1 encoding='windows-1252'                            -3.63 %       ±5.76%  ±7.66%  ±9.97%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=1 ignoreBOM=0 encoding='iso-8859-3'                               5.55 %       ±5.73%  ±7.65% ±10.00%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=1 ignoreBOM=0 encoding='utf-8'                                    0.04 %       ±2.16%  ±2.88%  ±3.75%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=1 ignoreBOM=0 encoding='windows-1252'                             1.08 %       ±5.20%  ±6.92%  ±9.02%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=1 ignoreBOM=1 encoding='iso-8859-3'                               0.50 %       ±3.90%  ±5.19%  ±6.76%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=1 ignoreBOM=1 encoding='utf-8'                                    0.49 %       ±1.89%  ±2.53%  ±3.31%
util/text-decoder.js type='Buffer' n=1000 len=16384 fatal=1 ignoreBOM=1 encoding='windows-1252'                            -4.49 %       ±6.28%  ±8.35% ±10.88%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=0 ignoreBOM=0 encoding='iso-8859-3'                                 0.62 %       ±2.85%  ±3.80%  ±4.95%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=0 ignoreBOM=0 encoding='utf-8'                                      3.35 %       ±3.45%  ±4.59%  ±5.99%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=0 ignoreBOM=0 encoding='windows-1252'                              -0.54 %       ±2.50%  ±3.33%  ±4.33%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=0 ignoreBOM=1 encoding='iso-8859-3'                                 0.86 %       ±2.55%  ±3.39%  ±4.41%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=0 ignoreBOM=1 encoding='utf-8'                                      0.48 %       ±3.37%  ±4.49%  ±5.85%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=0 ignoreBOM=1 encoding='windows-1252'                               1.71 %       ±4.37%  ±5.81%  ±7.58%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=1 ignoreBOM=0 encoding='iso-8859-3'                                -1.36 %       ±2.64%  ±3.51%  ±4.58%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=1 ignoreBOM=0 encoding='utf-8'                                      1.31 %       ±4.04%  ±5.38%  ±7.01%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=1 ignoreBOM=0 encoding='windows-1252'                               0.23 %       ±3.43%  ±4.58%  ±5.98%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=1 ignoreBOM=1 encoding='iso-8859-3'                                -0.33 %       ±2.14%  ±2.85%  ±3.72%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=1 ignoreBOM=1 encoding='utf-8'                                     -0.89 %       ±3.53%  ±4.70%  ±6.11%
util/text-decoder.js type='Buffer' n=1000 len=256 fatal=1 ignoreBOM=1 encoding='windows-1252'                               0.66 %       ±3.61%  ±4.82%  ±6.28%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=0 encoding='iso-8859-3'           **     -1.52 %       ±0.93%  ±1.23%  ±1.60%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=0 encoding='utf-8'                       -0.60 %       ±2.23%  ±2.97%  ±3.87%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=0 encoding='windows-1252'                -0.21 %       ±2.05%  ±2.73%  ±3.56%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=1 encoding='iso-8859-3'                  -0.83 %       ±1.02%  ±1.35%  ±1.76%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=1 encoding='utf-8'                        0.38 %       ±1.71%  ±2.27%  ±2.96%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=0 ignoreBOM=1 encoding='windows-1252'                -0.48 %       ±1.56%  ±2.08%  ±2.71%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=0 encoding='iso-8859-3'            *     -1.01 %       ±0.91%  ±1.22%  ±1.58%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=0 encoding='utf-8'                       -0.19 %       ±0.99%  ±1.31%  ±1.71%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=0 encoding='windows-1252'                -1.32 %       ±1.56%  ±2.08%  ±2.72%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=1 encoding='iso-8859-3'            *     -0.92 %       ±0.84%  ±1.11%  ±1.45%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=1 encoding='utf-8'                       -0.21 %       ±1.06%  ±1.41%  ±1.83%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=131072 fatal=1 ignoreBOM=1 encoding='windows-1252'                -1.39 %       ±1.71%  ±2.28%  ±2.98%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=0 encoding='iso-8859-3'                    1.45 %       ±1.99%  ±2.66%  ±3.47%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=0 encoding='utf-8'                        -0.13 %       ±1.20%  ±1.60%  ±2.08%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=0 encoding='windows-1252'                  0.16 %       ±1.84%  ±2.45%  ±3.19%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=1 encoding='iso-8859-3'                    0.48 %       ±3.54%  ±4.72%  ±6.14%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=1 encoding='utf-8'                        -0.11 %       ±1.75%  ±2.33%  ±3.03%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=0 ignoreBOM=1 encoding='windows-1252'                  0.94 %       ±1.89%  ±2.51%  ±3.27%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=0 encoding='iso-8859-3'             *      3.83 %       ±3.34%  ±4.46%  ±5.84%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=0 encoding='utf-8'                        -0.62 %       ±1.67%  ±2.22%  ±2.89%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=0 encoding='windows-1252'                  0.01 %       ±1.56%  ±2.07%  ±2.70%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=1 encoding='iso-8859-3'                    0.89 %       ±3.55%  ±4.72%  ±6.14%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=1 encoding='utf-8'                        -1.55 %       ±1.76%  ±2.34%  ±3.05%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=16384 fatal=1 ignoreBOM=1 encoding='windows-1252'                 -2.52 %       ±2.71%  ±3.63%  ±4.77%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=0 encoding='iso-8859-3'                     -1.64 %       ±7.23%  ±9.62% ±12.53%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=0 encoding='utf-8'                           1.88 %       ±4.70%  ±6.25%  ±8.13%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=0 encoding='windows-1252'                    0.52 %       ±5.47%  ±7.28%  ±9.47%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=1 encoding='iso-8859-3'                      2.54 %       ±4.24%  ±5.64%  ±7.35%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=1 encoding='utf-8'                           3.36 %       ±5.77%  ±7.67%  ±9.99%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=0 ignoreBOM=1 encoding='windows-1252'                   -2.07 %       ±6.70%  ±8.92% ±11.61%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=0 encoding='iso-8859-3'                     -0.26 %       ±6.37%  ±8.48% ±11.04%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=0 encoding='utf-8'                          -2.52 %       ±7.16%  ±9.53% ±12.40%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=0 encoding='windows-1252'                    6.04 %       ±7.72% ±10.28% ±13.38%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=1 encoding='iso-8859-3'                     -1.99 %       ±7.26%  ±9.65% ±12.56%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=1 encoding='utf-8'                          -0.76 %       ±7.36%  ±9.79% ±12.75%
util/text-decoder.js type='SharedArrayBuffer' n=1000 len=256 fatal=1 ignoreBOM=1 encoding='windows-1252'                    4.53 %       ±7.85% ±10.45% ±13.60%
util/text-encoder.js op='encode' type='ascii' n=1000000 len=1024                                                           -0.15 %       ±0.80%  ±1.06%  ±1.38%
util/text-encoder.js op='encode' type='ascii' n=1000000 len=256                                                             0.41 %       ±2.11%  ±2.80%  ±3.65%
util/text-encoder.js op='encode' type='ascii' n=1000000 len=32                                                              0.46 %       ±0.97%  ±1.29%  ±1.68%
util/text-encoder.js op='encode' type='ascii' n=1000000 len=8192                                                            0.12 %       ±0.27%  ±0.37%  ±0.48%
util/text-encoder.js op='encode' type='one-byte-string' n=1000000 len=1024                                                 -0.01 %       ±0.78%  ±1.04%  ±1.35%
util/text-encoder.js op='encode' type='one-byte-string' n=1000000 len=256                                                  -0.29 %       ±0.74%  ±0.98%  ±1.28%
util/text-encoder.js op='encode' type='one-byte-string' n=1000000 len=32                                                    0.58 %       ±0.96%  ±1.27%  ±1.66%
util/text-encoder.js op='encode' type='one-byte-string' n=1000000 len=8192                                                  0.02 %       ±0.06%  ±0.08%  ±0.10%
util/text-encoder.js op='encode' type='two-byte-string' n=1000000 len=1024                                                  0.46 %       ±0.62%  ±0.83%  ±1.08%
util/text-encoder.js op='encode' type='two-byte-string' n=1000000 len=256                                                  -0.09 %       ±0.84%  ±1.12%  ±1.45%
util/text-encoder.js op='encode' type='two-byte-string' n=1000000 len=32                                                   -0.26 %       ±0.94%  ±1.25%  ±1.63%
util/text-encoder.js op='encode' type='two-byte-string' n=1000000 len=8192                                                  0.07 %       ±0.17%  ±0.23%  ±0.30%
util/text-encoder.js op='encodeInto' type='ascii' n=1000000 len=1024                                                        0.05 %       ±0.58%  ±0.77%  ±1.01%
util/text-encoder.js op='encodeInto' type='ascii' n=1000000 len=256                                                         0.53 %       ±0.66%  ±0.88%  ±1.15%
util/text-encoder.js op='encodeInto' type='ascii' n=1000000 len=32                                                         -0.26 %       ±1.37%  ±1.82%  ±2.37%
util/text-encoder.js op='encodeInto' type='ascii' n=1000000 len=8192                                                       -0.35 %       ±1.15%  ±1.52%  ±1.98%
util/text-encoder.js op='encodeInto' type='one-byte-string' n=1000000 len=1024                                             -0.03 %       ±0.20%  ±0.26%  ±0.35%
util/text-encoder.js op='encodeInto' type='one-byte-string' n=1000000 len=256                                               0.04 %       ±0.52%  ±0.69%  ±0.90%
util/text-encoder.js op='encodeInto' type='one-byte-string' n=1000000 len=32                                                0.60 %       ±1.05%  ±1.41%  ±1.85%
util/text-encoder.js op='encodeInto' type='one-byte-string' n=1000000 len=8192                                             -0.00 %       ±0.04%  ±0.05%  ±0.07%
util/text-encoder.js op='encodeInto' type='two-byte-string' n=1000000 len=1024                                             -0.06 %       ±0.19%  ±0.26%  ±0.34%
util/text-encoder.js op='encodeInto' type='two-byte-string' n=1000000 len=256                                               0.23 %       ±0.42%  ±0.56%  ±0.73%
util/text-encoder.js op='encodeInto' type='two-byte-string' n=1000000 len=32                                               -1.52 %       ±1.72%  ±2.30%  ±3.00%
util/text-encoder.js op='encodeInto' type='two-byte-string' n=1000000 len=8192                                              0.00 %       ±0.03%  ±0.04%  ±0.05%
util/type-check.js n=1000000 argument='false-object' version='js' type='ArrayBufferView'                                   -0.43 %       ±1.25%  ±1.67%  ±2.17%
util/type-check.js n=1000000 argument='false-object' version='js' type='TypedArray'                                        -2.76 %       ±3.93%  ±5.29%  ±7.00%
util/type-check.js n=1000000 argument='false-object' version='js' type='Uint8Array'                                         0.12 %       ±1.33%  ±1.77%  ±2.30%
util/type-check.js n=1000000 argument='false-object' version='native' type='ArrayBufferView'                         *     -1.79 %       ±1.36%  ±1.81%  ±2.36%
util/type-check.js n=1000000 argument='false-object' version='native' type='TypedArray'                                    -2.20 %       ±3.09%  ±4.16%  ±5.49%
util/type-check.js n=1000000 argument='false-object' version='native' type='Uint8Array'                                     1.78 %       ±2.20%  ±2.95%  ±3.89%
util/type-check.js n=1000000 argument='false-primitive' version='js' type='ArrayBufferView'                                -0.66 %       ±1.84%  ±2.46%  ±3.22%
util/type-check.js n=1000000 argument='false-primitive' version='js' type='TypedArray'                                     -0.89 %       ±2.98%  ±4.00%  ±5.26%
util/type-check.js n=1000000 argument='false-primitive' version='js' type='Uint8Array'                                      0.23 %       ±1.24%  ±1.65%  ±2.15%
util/type-check.js n=1000000 argument='false-primitive' version='native' type='ArrayBufferView'                            -0.20 %       ±2.26%  ±3.01%  ±3.92%
util/type-check.js n=1000000 argument='false-primitive' version='native' type='TypedArray'                                  0.12 %       ±1.22%  ±1.63%  ±2.13%
util/type-check.js n=1000000 argument='false-primitive' version='native' type='Uint8Array'                                 -0.16 %       ±1.47%  ±1.95%  ±2.54%
util/type-check.js n=1000000 argument='true' version='js' type='ArrayBufferView'                                    **     -2.66 %       ±1.64%  ±2.18%  ±2.84%
util/type-check.js n=1000000 argument='true' version='js' type='TypedArray'                                                -1.67 %       ±1.85%  ±2.48%  ±3.25%
util/type-check.js n=1000000 argument='true' version='js' type='Uint8Array'                                                 0.27 %       ±1.28%  ±1.71%  ±2.23%
util/type-check.js n=1000000 argument='true' version='native' type='ArrayBufferView'                                        1.52 %       ±3.69%  ±4.93%  ±6.44%
util/type-check.js n=1000000 argument='true' version='native' type='TypedArray'                                            -0.57 %       ±1.29%  ±1.72%  ±2.24%
util/type-check.js n=1000000 argument='true' version='native' type='Uint8Array'                                            -0.16 %       ±1.56%  ±2.07%  ±2.70%

@aduh95 aduh95 added the commit-queue Add this label to land a pull request using GitHub Actions. label Dec 16, 2024
@nodejs-github-bot nodejs-github-bot removed the commit-queue Add this label to land a pull request using GitHub Actions. label Dec 16, 2024
@nodejs-github-bot nodejs-github-bot merged commit 80e3ef3 into nodejs:main Dec 16, 2024
64 checks passed
@nodejs-github-bot
Copy link
Collaborator

Landed in 80e3ef3

@aduh95 aduh95 deleted the util-inspect-harden branch December 16, 2024 23:47
aduh95 added a commit that referenced this pull request Dec 18, 2024
PR-URL: #56225
Reviewed-By: Jordan Harband <[email protected]>
Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]>
aduh95 added a commit that referenced this pull request Dec 18, 2024
PR-URL: #56225
Reviewed-By: Jordan Harband <[email protected]>
Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]>
ruyadorno pushed a commit that referenced this pull request Dec 20, 2024
PR-URL: #56225
Reviewed-By: Jordan Harband <[email protected]>
Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]>
ruyadorno pushed a commit that referenced this pull request Dec 21, 2024
PR-URL: #56225
Reviewed-By: Jordan Harband <[email protected]>
Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]>
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Dec 21, 2024
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [node](https://nodejs.org) ([source](https://github.com/nodejs/node)) | minor | `23.4.0` -> `23.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>

### [`v23.5.0`](https://github.com/nodejs/node/releases/tag/v23.5.0): 2024-12-19, Version 23.5.0 (Current), @&#8203;aduh95

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

##### Notable Changes

##### WebCryptoAPI [`Ed25519`](nodejs/node@Ed25519) and X25519 algorithms are now stable

Following the merge of Curve25519 into the
[Web Cryptography API Editor's Draft](https://w3c.github.io/webcrypto/) the
`Ed25519` and `X25519` algorithm identifiers are now stable and will no longer
emit an ExperimentalWarning upon use.

Contributed by Filip Skokan in [#&#8203;56142](nodejs/node#56142).

##### On-thread hooks are back

This release introduces `module.registerHooks()` for registering module loader
customization hooks that are run for all modules loaded by `require()`, `import`
and functions returned by `createRequire()` in the same thread, which makes them
easier for CJS monkey-patchers to migrate to.

```mjs
import assert from 'node:assert';
import { registerHooks, createRequire } from 'node:module';
import { writeFileSync } from 'node:fs';

writeFileSync('./bar.js', 'export const id = 123;', 'utf8');

registerHooks({
  resolve(specifier, context, nextResolve) {
    const replaced = specifier.replace('foo', 'bar');
    return nextResolve(replaced, context);
  },
  load(url, context, nextLoad) {
    const result = nextLoad(url, context);
    return {
      ...result,
      source: result.source.toString().replace('123', '456'),
    };
  },
});

// Checks that it works with require.
const require = createRequire(import.meta.url);
const required = require('./foo.js');  // Redirected by resolve hook to bar.js
assert.strictEqual(required.id, 456);  // Replaced by load hook to 456

// Checks that it works with import.
const imported = await import('./foo.js');  // Redirected by resolve hook to bar.js
assert.strictEqual(imported.id, 456);  // Replaced by load hook to 456
```

This complements the `module.register()` hooks - the new hooks fit better
internally and cover all corners in the module graph; whereas
`module.register()` previously could not cover `require()` while it was
on-thread, and still cannot cover `createRequire()` after being moved
off-thread.

They are also run in the same thread as the modules being loaded and where the
hooks are registered, which means they are easier to debug (no more
`console.log()` getting lost) and do not have the many deadlock issues haunting
the `module.register()` hooks. The new API also takes functions directly so that
it's easier for intermediate loader packages to take user options from files
that the hooks can't be aware of, like many existing CJS monkey-patchers do.

Contributed by Joyee Cheung in [#&#8203;55698](nodejs/node#55698).

##### Other notable changes

-   \[[`59cae91465`](nodejs/node@59cae91465)] - **(SEMVER-MINOR)** **dgram**: support blocklist in udp (theanarkh) [#&#8203;56087](nodejs/node#56087)
-   \[[`72f79b44ed`](nodejs/node@72f79b44ed)] - **doc**: stabilize util.styleText (Rafael Gonzaga) [#&#8203;56265](nodejs/node#56265)
-   \[[`b5a2c0777d`](nodejs/node@b5a2c0777d)] - **(SEMVER-MINOR)** **module**: add prefix-only modules to `module.builtinModules` (Jordan Harband) [#&#8203;56185](nodejs/node#56185)
-   \[[`9863d27566`](nodejs/node@9863d27566)] - **(SEMVER-MINOR)** **module**: only emit require(esm) warning under --trace-require-module (Joyee Cheung) [#&#8203;56194](nodejs/node#56194)
-   \[[`8e780bc5ae`](nodejs/node@8e780bc5ae)] - **(SEMVER-MINOR)** **module**: use synchronous hooks for preparsing in import(cjs) (Joyee Cheung) [#&#8203;55698](nodejs/node#55698)
-   \[[`65bc8e847f`](nodejs/node@65bc8e847f)] - **(SEMVER-MINOR)** **report**: fix typos in report keys and bump the version (Yuan-Ming Hsu) [#&#8203;56068](nodejs/node#56068)
-   \[[`0ab36e1937`](nodejs/node@0ab36e1937)] - **(SEMVER-MINOR)** **sqlite**: aggregate constants in a single property (Edigleysson Silva (Edy)) [#&#8203;56213](nodejs/node#56213)
-   \[[`efcc5d90c5`](nodejs/node@efcc5d90c5)] - **(SEMVER-MINOR)** **src,lib**: stabilize permission model (Rafael Gonzaga) [#&#8203;56201](nodejs/node#56201)

##### Commits

-   \[[`2314e4916e`](nodejs/node@2314e4916e)] - **assert**: make Maps be partially compared in partialDeepStrictEqual (Giovanni Bucci) [#&#8203;56195](nodejs/node#56195)
-   \[[`cfbdff7b45`](nodejs/node@cfbdff7b45)] - **assert**: make partialDeepStrictEqual work with ArrayBuffers (Giovanni Bucci) [#&#8203;56098](nodejs/node#56098)
-   \[[`f264dd6d20`](nodejs/node@f264dd6d20)] - **buffer**: document concat zero-fill (Duncan) [#&#8203;55562](nodejs/node#55562)
-   \[[`4831b87d83`](nodejs/node@4831b87d83)] - **build**: set DESTCPU correctly for 'make binary' on loongarch64 (吴小白) [#&#8203;56271](nodejs/node#56271)
-   \[[`1497bb405e`](nodejs/node@1497bb405e)] - **build**: fix missing fp16 dependency in d8 builds (Joyee Cheung) [#&#8203;56266](nodejs/node#56266)
-   \[[`445c8c7489`](nodejs/node@445c8c7489)] - **build**: add major release action (Rafael Gonzaga) [#&#8203;56199](nodejs/node#56199)
-   \[[`f4faedfa69`](nodejs/node@f4faedfa69)] - **build**: fix C string encoding for `PRODUCT_DIR_ABS` (Anna Henningsen) [#&#8203;56111](nodejs/node#56111)
-   \[[`6f49c8006c`](nodejs/node@6f49c8006c)] - **build**: use variable for simdutf path (Shelley Vohr) [#&#8203;56196](nodejs/node#56196)
-   \[[`fcaa2c82a6`](nodejs/node@fcaa2c82a6)] - **build**: fix GN build on macOS (Joyee Cheung) [#&#8203;56141](nodejs/node#56141)
-   \[[`08e5309f4f`](nodejs/node@08e5309f4f)] - ***Revert*** "**build**: avoid compiling with VS v17.12" (Gerhard Stöbich) [#&#8203;56151](nodejs/node#56151)
-   \[[`c2fb38cfdf`](nodejs/node@c2fb38cfdf)] - **crypto**: graduate WebCryptoAPI [`Ed25519`](nodejs/node@Ed25519) and X25519 algorithms as stable (Filip Skokan) [#&#8203;56142](nodejs/node#56142)
-   \[[`8658833884`](nodejs/node@8658833884)] - **deps**: update nghttp3 to 1.6.0 (Node.js GitHub Bot) [#&#8203;56258](nodejs/node#56258)
-   \[[`7c941d4610`](nodejs/node@7c941d4610)] - **deps**: update simdutf to 5.6.4 (Node.js GitHub Bot) [#&#8203;56255](nodejs/node#56255)
-   \[[`4e9113eada`](nodejs/node@4e9113eada)] - **deps**: update libuv to 1.49.2 (Luigi Pinca) [#&#8203;56224](nodejs/node#56224)
-   \[[`db6aba12e4`](nodejs/node@db6aba12e4)] - **deps**: update c-ares to v1.34.4 (Node.js GitHub Bot) [#&#8203;56256](nodejs/node#56256)
-   \[[`25bb462bc2`](nodejs/node@25bb462bc2)] - **deps**: define V8\_PRESERVE_MOST as no-op on Windows (Stefan Stojanovic) [#&#8203;56238](nodejs/node#56238)
-   \[[`54308c51bb`](nodejs/node@54308c51bb)] - **deps**: update sqlite to 3.47.2 (Node.js GitHub Bot) [#&#8203;56178](nodejs/node#56178)
-   \[[`59cae91465`](nodejs/node@59cae91465)] - **(SEMVER-MINOR)** **dgram**: support blocklist in udp (theanarkh) [#&#8203;56087](nodejs/node#56087)
-   \[[`52c18e605e`](nodejs/node@52c18e605e)] - **doc**: fix color contrast issue in light mode (Rich Trott) [#&#8203;56272](nodejs/node#56272)
-   \[[`72f79b44ed`](nodejs/node@72f79b44ed)] - **doc**: stabilize util.styleText (Rafael Gonzaga) [#&#8203;56265](nodejs/node#56265)
-   \[[`0d08756d0c`](nodejs/node@0d08756d0c)] - **doc**: clarify util.aborted resource usage (Kunal Kumar) [#&#8203;55780](nodejs/node#55780)
-   \[[`f94f21080b`](nodejs/node@f94f21080b)] - **doc**: add esm examples to node:repl (Alfredo González) [#&#8203;55432](nodejs/node#55432)
-   \[[`7a10ef88d9`](nodejs/node@7a10ef88d9)] - **doc**: add esm examples to node:readline (Alfredo González) [#&#8203;55335](nodejs/node#55335)
-   \[[`cc7a7c391b`](nodejs/node@cc7a7c391b)] - **doc**: fix 'which' to 'that' and add commas (Selveter Senitro) [#&#8203;56216](nodejs/node#56216)
-   \[[`c5b086250e`](nodejs/node@c5b086250e)] - **doc**: fix winget config path (Alex Yang) [#&#8203;56233](nodejs/node#56233)
-   \[[`71c38a24d4`](nodejs/node@71c38a24d4)] - **doc**: add esm examples to node:tls (Alfredo González) [#&#8203;56229](nodejs/node#56229)
-   \[[`394fffbbde`](nodejs/node@394fffbbde)] - **doc**: add esm examples to node:perf_hooks (Alfredo González) [#&#8203;55257](nodejs/node#55257)
-   \[[`7b2a6ee61e`](nodejs/node@7b2a6ee61e)] - **doc**: `sea.getRawAsset(key)` always returns an ArrayBuffer (沈鸿飞) [#&#8203;56206](nodejs/node#56206)
-   \[[`8092dcf27e`](nodejs/node@8092dcf27e)] - **doc**: update announce documentation for releases (Rafael Gonzaga) [#&#8203;56200](nodejs/node#56200)
-   \[[`2974667815`](nodejs/node@2974667815)] - **doc**: update blog link to /vulnerability (Rafael Gonzaga) [#&#8203;56198](nodejs/node#56198)
-   \[[`f3b3ff85e0`](nodejs/node@f3b3ff85e0)] - **doc**: call out import.meta is only supported in ES modules (Anton Kastritskii) [#&#8203;56186](nodejs/node#56186)
-   \[[`a9e67280e7`](nodejs/node@a9e67280e7)] - **doc**: add ambassador message - benefits of Node.js (Michael Dawson) [#&#8203;56085](nodejs/node#56085)
-   \[[`e4922ab15f`](nodejs/node@e4922ab15f)] - **doc**: fix incorrect link to style guide (Yuan-Ming Hsu) [#&#8203;56181](nodejs/node#56181)
-   \[[`114a3e5a05`](nodejs/node@114a3e5a05)] - **doc**: fix c++ addon hello world sample (Edigleysson Silva (Edy)) [#&#8203;56172](nodejs/node#56172)
-   \[[`f1c2d2f65e`](nodejs/node@f1c2d2f65e)] - **doc**: update blog release-post link (Ruy Adorno) [#&#8203;56123](nodejs/node#56123)
-   \[[`d48b5224c0`](nodejs/node@d48b5224c0)] - **doc**: fix module.md headings (Chengzhong Wu) [#&#8203;56131](nodejs/node#56131)
-   \[[`4cc0493a0b`](nodejs/node@4cc0493a0b)] - **fs**: make mutating `options` in Callback `readdir()` not affect results (LiviaMedeiros) [#&#8203;56057](nodejs/node#56057)
-   \[[`8d485f1c09`](nodejs/node@8d485f1c09)] - **fs**: make mutating `options` in Promises `readdir()` not affect results (LiviaMedeiros) [#&#8203;56057](nodejs/node#56057)
-   \[[`595851b5ed`](nodejs/node@595851b5ed)] - **fs,win**: fix readdir for named pipe (Hüseyin Açacak) [#&#8203;56110](nodejs/node#56110)
-   \[[`075b36b7b4`](nodejs/node@075b36b7b4)] - **http**: add setDefaultHeaders option to http.request (Tim Perry) [#&#8203;56112](nodejs/node#56112)
-   \[[`febd969c46`](nodejs/node@febd969c46)] - **http2**: remove duplicate codeblock (Vitaly Aminev) [#&#8203;55915](nodejs/node#55915)
-   \[[`b0ebd23e52`](nodejs/node@b0ebd23e52)] - **http2**: support ALPNCallback option (ZYSzys) [#&#8203;56187](nodejs/node#56187)
-   \[[`f10239fde7`](nodejs/node@f10239fde7)] - **lib**: remove redundant global regexps (Gürgün Dayıoğlu) [#&#8203;56182](nodejs/node#56182)
-   \[[`fd55d3cbdd`](nodejs/node@fd55d3cbdd)] - **lib**: clean up persisted signals when they are settled (Edigleysson Silva (Edy)) [#&#8203;56001](nodejs/node#56001)
-   \[[`889094fdbc`](nodejs/node@889094fdbc)] - **lib**: handle Float16Array in node:v8 serdes (Bartek Iwańczuk) [#&#8203;55996](nodejs/node#55996)
-   \[[`5aec513207`](nodejs/node@5aec513207)] - **lib**: disable default memory leak warning for AbortSignal (Lenz Weber-Tronic) [#&#8203;55816](nodejs/node#55816)
-   \[[`b5a2c0777d`](nodejs/node@b5a2c0777d)] - **(SEMVER-MINOR)** **module**: add prefix-only modules to `module.builtinModules` (Jordan Harband) [#&#8203;56185](nodejs/node#56185)
-   \[[`9863d27566`](nodejs/node@9863d27566)] - **(SEMVER-MINOR)** **module**: only emit require(esm) warning under --trace-require-module (Joyee Cheung) [#&#8203;56194](nodejs/node#56194)
-   \[[`5665e86da6`](nodejs/node@5665e86da6)] - **module**: prevent main thread exiting before esm worker ends (Shima Ryuhei) [#&#8203;56183](nodejs/node#56183)
-   \[[`8e780bc5ae`](nodejs/node@8e780bc5ae)] - **(SEMVER-MINOR)** **module**: use synchronous hooks for preparsing in import(cjs) (Joyee Cheung) [#&#8203;55698](nodejs/node#55698)
-   \[[`e5bb6c2303`](nodejs/node@e5bb6c2303)] - **(SEMVER-MINOR)** **module**: implement module.registerHooks() (Joyee Cheung) [#&#8203;55698](nodejs/node#55698)
-   \[[`f883bedceb`](nodejs/node@f883bedceb)] - **node-api**: allow napi_delete_reference in finalizers (Chengzhong Wu) [#&#8203;55620](nodejs/node#55620)
-   \[[`65bc8e847f`](nodejs/node@65bc8e847f)] - **(SEMVER-MINOR)** **report**: fix typos in report keys and bump the version (Yuan-Ming Hsu) [#&#8203;56068](nodejs/node#56068)
-   \[[`a6f0cfa468`](nodejs/node@a6f0cfa468)] - **sea**: only assert snapshot main function for main threads (Joyee Cheung) [#&#8203;56120](nodejs/node#56120)
-   \[[`0ab36e1937`](nodejs/node@0ab36e1937)] - **(SEMVER-MINOR)** **sqlite**: aggregate constants in a single property (Edigleysson Silva (Edy)) [#&#8203;56213](nodejs/node#56213)
-   \[[`4745798225`](nodejs/node@4745798225)] - **sqlite**: add support for custom functions (Colin Ihrig) [#&#8203;55985](nodejs/node#55985)
-   \[[`53cc0cc744`](nodejs/node@53cc0cc744)] - **sqlite**: support `db.loadExtension` (Alex Yang) [#&#8203;53900](nodejs/node#53900)
-   \[[`3968599702`](nodejs/node@3968599702)] - **src**: fix outdated js2c.cc references (Chengzhong Wu) [#&#8203;56133](nodejs/node#56133)
-   \[[`efcc5d90c5`](nodejs/node@efcc5d90c5)] - **(SEMVER-MINOR)** **src,lib**: stabilize permission model (Rafael Gonzaga) [#&#8203;56201](nodejs/node#56201)
-   \[[`a4a83613cb`](nodejs/node@a4a83613cb)] - **stream**: commit pull-into descriptors after filling from queue (Mattias Buelens) [#&#8203;56072](nodejs/node#56072)
-   \[[`3298ef4891`](nodejs/node@3298ef4891)] - **test**: remove test-sqlite-statement-sync flaky designation (Luigi Pinca) [#&#8203;56051](nodejs/node#56051)
-   \[[`1d8cc6179d`](nodejs/node@1d8cc6179d)] - **test**: use --permission over --experimental-permission (Rafael Gonzaga) [#&#8203;56239](nodejs/node#56239)
-   \[[`5d252b7a67`](nodejs/node@5d252b7a67)] - **test**: remove exludes for sea tests on PPC (Michael Dawson) [#&#8203;56217](nodejs/node#56217)
-   \[[`8288f57724`](nodejs/node@8288f57724)] - **test**: fix test-abortsignal-drop-settled-signals flakiness (Edigleysson Silva (Edy)) [#&#8203;56197](nodejs/node#56197)
-   \[[`683cc15796`](nodejs/node@683cc15796)] - **test**: move localizationd data from `test-icu-env` to external file (Livia Medeiros) [#&#8203;55618](nodejs/node#55618)
-   \[[`a0c4a5f122`](nodejs/node@a0c4a5f122)] - **test**: update WPT for url to [`6fa3fe8`](nodejs/node@6fa3fe8a92) (Node.js GitHub Bot) [#&#8203;56136](nodejs/node#56136)
-   \[[`a0e3926285`](nodejs/node@a0e3926285)] - **test**: remove `hasOpenSSL3x` utils (Antoine du Hamel) [#&#8203;56164](nodejs/node#56164)
-   \[[`041a49094e`](nodejs/node@041a49094e)] - **test**: update streams wpt (Mattias Buelens) [#&#8203;56072](nodejs/node#56072)
-   \[[`ea9a675f56`](nodejs/node@ea9a675f56)] - **test_runner**: exclude test files from coverage by default (Pietro Marchini) [#&#8203;56060](nodejs/node#56060)
-   \[[`118cd9998f`](nodejs/node@118cd9998f)] - **tools**: fix `node:` enforcement for docs (Antoine du Hamel) [#&#8203;56284](nodejs/node#56284)
-   \[[`c4c56daae8`](nodejs/node@c4c56daae8)] - **tools**: update github_reporter to 1.7.2 (Node.js GitHub Bot) [#&#8203;56205](nodejs/node#56205)
-   \[[`78743b1533`](nodejs/node@78743b1533)] - **tools**: add REPLACEME check to workflow (Mert Can Altin) [#&#8203;56251](nodejs/node#56251)
-   \[[`002ee71d9b`](nodejs/node@002ee71d9b)] - **tools**: use `github.actor` instead of bot username for release proposals (Antoine du Hamel) [#&#8203;56232](nodejs/node#56232)
-   \[[`d25d16efeb`](nodejs/node@d25d16efeb)] - ***Revert*** "**tools**: disable automated libuv updates" (Luigi Pinca) [#&#8203;56223](nodejs/node#56223)
-   \[[`b395e0c8c9`](nodejs/node@b395e0c8c9)] - **tools**: update gyp-next to 0.19.1 (Anna Henningsen) [#&#8203;56111](nodejs/node#56111)
-   \[[`a5aaf31c50`](nodejs/node@a5aaf31c50)] - **tools**: fix release proposal linter to support more than 1 folk preparing (Antoine du Hamel) [#&#8203;56203](nodejs/node#56203)
-   \[[`fa667d609e`](nodejs/node@fa667d609e)] - **tools**: remove has_absl_stringify from gyp file (Michaël Zasso) [#&#8203;56157](nodejs/node#56157)
-   \[[`65b541e70e`](nodejs/node@65b541e70e)] - **tools**: enable linter for `tools/icu/**` (Livia Medeiros) [#&#8203;56176](nodejs/node#56176)
-   \[[`28a4b6ff58`](nodejs/node@28a4b6ff58)] - **tools**: use commit title as MR title when creating release proposal (Antoine du Hamel) [#&#8203;56165](nodejs/node#56165)
-   \[[`e20eef659f`](nodejs/node@e20eef659f)] - **tools**: update gyp-next to 0.19.0 (Node.js GitHub Bot) [#&#8203;56158](nodejs/node#56158)
-   \[[`efcc829085`](nodejs/node@efcc829085)] - **tools**: bump the eslint group in /tools/eslint with 4 updates (dependabot\[bot]) [#&#8203;56099](nodejs/node#56099)
-   \[[`5620b2be8a`](nodejs/node@5620b2be8a)] - **tools**: improve release proposal MR opening (Antoine du Hamel) [#&#8203;56161](nodejs/node#56161)
-   \[[`3e17a8e78e`](nodejs/node@3e17a8e78e)] - **util**: harden more built-in classes against prototype pollution (Antoine du Hamel) [#&#8203;56225](nodejs/node#56225)
-   \[[`13815417c7`](nodejs/node@13815417c7)] - **util**: fix Latin1 decoding to return string output (Mert Can Altin) [#&#8203;56222](nodejs/node#56222)
-   \[[`77397c5013`](nodejs/node@77397c5013)] - **util**: do not rely on mutable `Object` and `Function`' `constructor` prop (Antoine du Hamel) [#&#8203;56188](nodejs/node#56188)
-   \[[`84f98e0a74`](nodejs/node@84f98e0a74)] - **v8,tools**: expose experimental wasm revectorize feature (Yolanda-Chen) [#&#8203;54896](nodejs/node#54896)
-   \[[`8325fa5c04`](nodejs/node@8325fa5c04)] - **worker**: fix crash when a worker joins after exit (Stephen Belanger) [#&#8203;56191](nodejs/node#56191)

</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:eyJjcmVhdGVkSW5WZXIiOiIzOS43Ny4wIiwidXBkYXRlZEluVmVyIjoiMzkuNzcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
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. needs-ci PRs that need a full CI run. util Issues and PRs related to the built-in util module.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants