Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
e17c737
tools: copyedit `build-tarball.yml`
aduh95 Sep 10, 2025
43e6e54
build: do not include custom ESLint rules testing in tarball
aduh95 Sep 8, 2025
f0c20cc
src: remove unnecessary `Environment::GetCurrent()` calls
iknoom Sep 11, 2025
0d23fd5
tools: skip test-internet workflow for draft PRs
targos Sep 11, 2025
b200cd8
lib,src: refactor assert to load error source from memory
legendecas Sep 2, 2025
d785929
lib: add source map support for assert messages
legendecas Sep 3, 2025
ff13d1d
lib,src: cache ModuleWrap.hasAsyncGraph
legendecas Sep 11, 2025
8a5325d
src: ensure `v8::Eternal` is empty before setting it
addaleax Sep 11, 2025
b711256
deps: update undici to 7.16.0
nodejs-github-bot Sep 11, 2025
e9cb986
doc: rephrase dynamic import() description
meteorqz6 Sep 12, 2025
e4f5716
doc: deprecate closing `fs.Dir` on garbage collection
LiviaMedeiros Sep 12, 2025
6458867
url: add type checking to urlToHttpOptions()
simon-id Sep 12, 2025
9a4bbdc
benchmark: calibrate config cluster/echo.js
meteorqz6 Sep 12, 2025
bb051c5
crypto: avoid calls to `promise.catch()`
Renegade334 Sep 9, 2025
8ed4587
crypto: use async functions for non-stub Promise-returning functions
Renegade334 Sep 9, 2025
647c332
crypto: use `return await` when returning Promises from async functions
Renegade334 Sep 9, 2025
f006a14
node-api: make napi_delete_reference use node_api_basic_env
JeetuSuthar Sep 12, 2025
03116a7
src: remove `std::array` overload of `FIXED_ONE_BYTE_STRING`
addaleax Aug 4, 2025
2bb1525
src: create strings in `FIXED_ONE_BYTE_STRING` as internalized
addaleax Aug 4, 2025
026d4e3
doc,crypto: update subtle.generateKey and subtle.importKey
panva Sep 13, 2025
0f46c1c
repl: fix cpu overhead pasting big strings to the REPL
BridgeAR Sep 14, 2025
6133a82
util: fix debuglog.enabled not being present with callback logger
BridgeAR Sep 14, 2025
3c62b38
util: inspect objects with throwing Symbol.toStringTag
BridgeAR Sep 14, 2025
9df91e5
doc: type improvement of file `http.md`
samuel871211 Sep 14, 2025
8b29bbc
url: replaced slice with at
Connormiha Sep 14, 2025
cbec4fd
benchmark: calibrate config dgram multi-buffer
brunocroh Sep 14, 2025
fed1dac
lib: update isDeepStrictEqual to support options
miguelmarcondesf Sep 14, 2025
9782ca2
zlib: implement fast path for crc32
gurgunday Sep 14, 2025
83ae610
http: optimize checkIsHttpToken for short strings
JinhyeokFang Sep 14, 2025
acada1f
inspector: ensure adequate memory allocation for `Binary::toBase64`
Renegade334 Sep 14, 2025
bd767c5
doc: add security escalation policy
UlisesGascon Sep 15, 2025
97c4e1b
typings: remove unused imports
meteorqz6 Sep 15, 2025
be48760
node-api: added SharedArrayBuffer api
mertcanaltin Sep 16, 2025
039ac19
crypto: expose signatureAlgorithm on X509Certificate
patrickrbc Sep 16, 2025
213188e
stream: use new AsyncResource instead of bind
mcollina Sep 16, 2025
abecdcb
src: replace FIXED_ONE_BYTE_STRING with Environment-cached strings
iknoom Sep 17, 2025
ac78491
src: reduce the nearest parent package JSON cache size
michaelsmithxyz Sep 17, 2025
993f05d
fs,win: do not add a second trailing slash in readdir
Flarna Sep 17, 2025
728472a
module: only put directly require-d ESM into require.cache
joyeecheung Sep 17, 2025
8f32746
test: guard write to proxy client if proxy connection is ended
joyeecheung Sep 17, 2025
d17f299
src: use DictionaryTemplate more in URLPattern
jasnell Sep 17, 2025
87bbaa2
tools: fix `tools/make-v8.sh` for clang
richardlau Sep 17, 2025
7aec53b
http: add shouldUpgradeCallback to let servers control HTTP upgrades
pimterry Sep 17, 2025
9a3e58a
sqlite: add tagged template
0hmX Sep 17, 2025
e94c573
meta: add .npmrc with ignore-scripts=true
joyeecheung Sep 17, 2025
8c85570
deps: upgrade openssl sources to openssl-3.5.3
nodejs-github-bot Sep 16, 2025
fa40d3a
deps: update archs files for openssl-3.5.3
nodejs-github-bot Sep 16, 2025
f5d3f91
tls: only do off-thread certificate loading on loading tls
joyeecheung Sep 11, 2025
6790093
tls: load bundled and extra certificates off-thread
joyeecheung Sep 11, 2025
2b2591d
esm: make hasAsyncGraph non-enumerable
joyeecheung Sep 18, 2025
b0c1e67
diagnostics_channel: fix race condition with diagnostics_channel and GC
uurien Sep 19, 2025
6e586a1
vm: expose hasTopLevelAwait on SourceTextModule
legendecas Sep 19, 2025
c5d910a
http2: fix allowHttp1+Upgrade, broken by shouldUpgradeCallback
pimterry Sep 20, 2025
86150f3
src: rename private fields to follow naming convention
iknoom Sep 20, 2025
69b5607
src: simplify is_callable by making it a concept
tniessen Sep 20, 2025
396cc8e
lib: update inspect output format for subclasses
miguelmarcondesf Sep 21, 2025
ce8435b
test: testcase demonstrating issue 59541
ericrannaud Sep 7, 2025
44ce971
vm: "afterEvaluate", evaluate() return a promise from the outer context
ericrannaud Sep 10, 2025
9347ddd
vm: explain how to share promises between contexts w/ afterEvaluate
ericrannaud Sep 19, 2025
dea5dd7
dgram: restore buffer optimization in fixBufferList
ri7116 Sep 21, 2025
a28962a
doc: update V8 fast API guidance
Renegade334 Sep 21, 2025
0b284d8
build: add the missing macro definitions for OpenHarmony
hqzing Sep 22, 2025
e330f03
src: update crypto objects to use DictionaryTemplate
jasnell Sep 22, 2025
b970c0b
zlib: reduce code duplication
jhofstee Sep 22, 2025
6695067
http,https: handle IPv6 with proxies
joyeecheung Sep 22, 2025
05e560d
deps: update googletest to 50b8600
nodejs-github-bot Sep 23, 2025
1e723f9
doc: fix typo in section on microtask order
tniessen Sep 23, 2025
49747a5
worker: add heap profile API
theanarkh Sep 23, 2025
f14ed5a
src: simplify watchdog instantiations via `std::optional`
addaleax Sep 23, 2025
0b37b59
doc: use "WebAssembly" instead of "Web Assembly"
tniessen Sep 24, 2025
0fe5337
sqlite: cleanup ERM support and export Session class
jasnell May 18, 2025
3eeb7b4
sqlite: fix crash session extension callbacks with workers
louwers Sep 23, 2025
31c6e70
2025-09-25, Version 24.9.0 (Current)
nodejs-github-bot Sep 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
28 changes: 7 additions & 21 deletions .github/workflows/build-tarball.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,14 @@ jobs:
- name: Make tarball
run: |
export DISTTYPE=nightly
export DATESTRING=`date "+%Y-%m-%d"`
export DATESTRING=$(date "+%Y-%m-%d")
export COMMIT=$(git rev-parse --short=10 "$GITHUB_SHA")
./configure && make tar -j8 SKIP_XZ=1
mkdir tarballs
mv *.tar.gz tarballs
./configure && make tar -j4 SKIP_XZ=1
- name: Upload tarball artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: tarballs
path: tarballs
path: '*.tar.gz'
compression-level: 0
test-tarball-linux:
needs: build-tarball
Expand Down Expand Up @@ -92,21 +90,9 @@ jobs:
path: tarballs
- name: Extract tarball
run: |
tar xzf tarballs/*.tar.gz -C $RUNNER_TEMP
echo "TAR_DIR=$RUNNER_TEMP/`basename tarballs/*.tar.gz .tar.gz`" >> $GITHUB_ENV
tar xzf tarballs/*.tar.gz -C "$RUNNER_TEMP"
echo "TAR_DIR=$RUNNER_TEMP/$(basename tarballs/*.tar.gz .tar.gz)" >> "$GITHUB_ENV"
- name: Build
run: |
make -C "$TAR_DIR" build-ci -j4 V=1
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
sparse-checkout: |
tools/eslint
tools/eslint-rules
- name: Move directories needed for testing
run: |
mv tools/eslint "$TAR_DIR/tools"
mv tools/eslint-rules "$TAR_DIR/tools"
run: make -C "$TAR_DIR" build-ci -j4 V=1
- name: Test
run: |
make -C "$TAR_DIR" run-ci -j4 V=1 TEST_CI_ARGS="-p dots --measure-flakiness 9"
run: make -C "$TAR_DIR" run-ci -j4 V=1 TEST_CI_ARGS="-p dots --measure-flakiness 9"
2 changes: 1 addition & 1 deletion .github/workflows/test-internet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ permissions:

jobs:
test-internet:
if: github.repository == 'nodejs/node' || github.event_name != 'schedule'
if: github.event_name == 'schedule' && github.repository == 'nodejs/node' || github.event.pull_request.draft == false
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
!.nycrc
!.yamllint.yaml
!.configurations/
!/.npmrc

# === Rules for root dir ===
/core
Expand Down
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ignore-scripts=true
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ release.
</tr>
<tr>
<td valign="top">
<b><a href="doc/changelogs/CHANGELOG_V24.md#24.8.0">24.8.0</a></b><br/>
<b><a href="doc/changelogs/CHANGELOG_V24.md#24.9.0">24.9.0</a></b><br/>
<a href="doc/changelogs/CHANGELOG_V24.md#24.8.0">24.8.0</a><br/>
<a href="doc/changelogs/CHANGELOG_V24.md#24.7.0">24.7.0</a><br/>
<a href="doc/changelogs/CHANGELOG_V24.md#24.6.0">24.6.0</a><br/>
<a href="doc/changelogs/CHANGELOG_V24.md#24.5.0">24.5.0</a><br/>
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -1227,6 +1227,7 @@ $(TARBALL): release-only doc-only
$(RM) -r $(TARNAME)/tools/cpplint.py
$(RM) -r $(TARNAME)/tools/eslint
$(RM) -r $(TARNAME)/tools/eslint-rules
$(RM) -r $(TARNAME)/test/parallel/test-eslint-*
$(RM) -r $(TARNAME)/tools/license-builder.sh
$(RM) -r $(TARNAME)/tools/eslint/node_modules
$(RM) -r $(TARNAME)/tools/osx-*
Expand Down
7 changes: 7 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ you informed of the progress being made towards a fix and full announcement,
and may ask for additional information or guidance surrounding the reported
issue.

If you do not receive an acknowledgement of your report within 6 business
days, or if you cannot find a private security contact for the project, you
may escalate to the OpenJS Foundation CNA at `security@lists.openjsf.org`.

If the project acknowledges your report but does not provide any further
response or engagement within 14 days, escalation is also appropriate.

### Node.js bug bounty program

The Node.js project engages in an official bug bounty program for security
Expand Down
2 changes: 1 addition & 1 deletion benchmark/cluster/echo.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ if (cluster.isPrimary) {
payload: ['string', 'object'],
sendsPerBroadcast: [1, 10],
serialization: ['json', 'advanced'],
n: [1e5],
n: [1e3],
});

function main({
Expand Down
14 changes: 7 additions & 7 deletions benchmark/dgram/multi-buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@ const common = require('../common.js');
const dgram = require('dgram');
const PORT = common.PORT;

// `num` is the number of send requests to queue up each time.
// `n` is the number of send requests to queue up each time.
// Keep it reasonably high (>10) otherwise you're benchmarking the speed of
// event loop cycles more than anything else.
const bench = common.createBenchmark(main, {
len: [64, 256, 1024],
num: [100],
chunks: [1, 2, 4, 8],
len: [64, 512, 1024],
n: [100],
chunks: [1, 8],
type: ['send', 'recv'],
dur: [5],
});

function main({ dur, len, num, type, chunks }) {
function main({ dur, len, n, type, chunks }) {
const chunk = [];
for (let i = 0; i < chunks; i++) {
chunk.push(Buffer.allocUnsafe(Math.round(len / chunks)));
Expand All @@ -26,11 +26,11 @@ function main({ dur, len, num, type, chunks }) {
const socket = dgram.createSocket('udp4');

function onsend() {
if (sent++ % num === 0) {
if (sent++ % n === 0) {
// The setImmediate() is necessary to have event loop progress on OSes
// that only perform synchronous I/O on nonblocking UDP sockets.
setImmediate(() => {
for (let i = 0; i < num; i++) {
for (let i = 0; i < n; i++) {
socket.send(chunk, PORT, '127.0.0.1', onsend);
}
});
Expand Down
52 changes: 52 additions & 0 deletions benchmark/dgram/send-types.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
'use strict';

const common = require('../common.js');
const dgram = require('dgram');
const { Buffer } = require('buffer');

const bench = common.createBenchmark(main, {
type: ['string', 'buffer', 'mixed', 'typedarray'],
chunks: [1, 4, 8, 16],
len: [64, 512, 1024],
n: [1000],
});

function main({ type, chunks, len, n }) {
const socket = dgram.createSocket('udp4');

let testData;
switch (type) {
case 'string':
testData = Array(chunks).fill('a'.repeat(len));
break;
case 'buffer':
testData = Array(chunks).fill(Buffer.alloc(len, 'a'));
break;
case 'mixed':
testData = [];
for (let i = 0; i < chunks; i++) {
if (i % 2 === 0) {
testData.push(Buffer.alloc(len, 'a'));
} else {
testData.push('a'.repeat(len));
}
}
break;
case 'typedarray':
testData = Array(chunks).fill(new Uint8Array(len).fill(97));
break;
}

bench.start();

for (let i = 0; i < n; i++) {
socket.send(testData, 12345, 'localhost', (err) => {
if (err && err.code !== 'ENOTCONN' && err.code !== 'ECONNREFUSED') {
throw err;
}
});
}

bench.end(n);
socket.close();
}
47 changes: 47 additions & 0 deletions benchmark/zlib/crc32.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
'use strict';

const common = require('../common.js');
const { crc32 } = require('zlib');

// Benchmark crc32 on Buffer and String inputs across sizes.
// Iteration count is scaled inversely with input length to keep runtime sane.
// Example:
// node benchmark/zlib/crc32.js type=buffer len=4096 n=4000000
// ./out/Release/node benchmark/zlib/crc32.js --test

const bench = common.createBenchmark(main, {
type: ['buffer', 'string'],
len: [32, 256, 4096, 65536],
n: [4e6],
});

function makeBuffer(size) {
const buf = Buffer.allocUnsafe(size);
for (let i = 0; i < size; i++) buf[i] = (i * 1103515245 + 12345) & 0xff;
return buf;
}

function makeAsciiString(size) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
let out = '';
for (let i = 0, j = 0; i < size; i++, j = (j + 7) % chars.length) out += chars[j];
return out;
}

function main({ type, len, n }) {
// Scale iterations so that total processed bytes roughly constant around n*4096 bytes.
const scale = 4096 / len;
const iters = Math.max(1, Math.floor(n * scale));

const data = type === 'buffer' ? makeBuffer(len) : makeAsciiString(len);

let acc = 0;
for (let i = 0; i < Math.min(iters, 10000); i++) acc ^= crc32(data, 0);

bench.start();
let sum = 0;
for (let i = 0; i < iters; i++) sum ^= crc32(data, 0);
bench.end(iters);

if (sum === acc - 1) process.stderr.write('');
}
27 changes: 17 additions & 10 deletions deps/googletest/include/gtest/internal/gtest-port.h
Original file line number Diff line number Diff line change
Expand Up @@ -1385,9 +1385,9 @@ class GTEST_API_ Mutex {
Mutex();
~Mutex();

void Lock();
void lock();

void Unlock();
void unlock();

// Does nothing if the current thread holds the mutex. Otherwise, crashes
// with high probability.
Expand Down Expand Up @@ -1424,9 +1424,9 @@ class GTEST_API_ Mutex {
// "MutexLock l(&mu)". Hence the typedef trick below.
class GTestMutexLock {
public:
explicit GTestMutexLock(Mutex* mutex) : mutex_(mutex) { mutex_->Lock(); }
explicit GTestMutexLock(Mutex* mutex) : mutex_(mutex) { mutex_->lock(); }

~GTestMutexLock() { mutex_->Unlock(); }
~GTestMutexLock() { mutex_->unlock(); }

private:
Mutex* const mutex_;
Expand Down Expand Up @@ -1641,14 +1641,14 @@ class ThreadLocal : public ThreadLocalBase {
class MutexBase {
public:
// Acquires this mutex.
void Lock() {
void lock() {
GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
owner_ = pthread_self();
has_owner_ = true;
}

// Releases this mutex.
void Unlock() {
void unlock() {
// Since the lock is being released the owner_ field should no longer be
// considered valid. We don't protect writing to has_owner_ here, as it's
// the caller's responsibility to ensure that the current thread holds the
Expand Down Expand Up @@ -1716,9 +1716,9 @@ class Mutex : public MutexBase {
// "MutexLock l(&mu)". Hence the typedef trick below.
class GTestMutexLock {
public:
explicit GTestMutexLock(MutexBase* mutex) : mutex_(mutex) { mutex_->Lock(); }
explicit GTestMutexLock(MutexBase* mutex) : mutex_(mutex) { mutex_->lock(); }

~GTestMutexLock() { mutex_->Unlock(); }
~GTestMutexLock() { mutex_->unlock(); }

private:
MutexBase* const mutex_;
Expand Down Expand Up @@ -1864,8 +1864,8 @@ class GTEST_API_ ThreadLocal {
class Mutex {
public:
Mutex() {}
void Lock() {}
void Unlock() {}
void lock() {}
void unlock() {}
void AssertHeld() const {}
};

Expand Down Expand Up @@ -2322,6 +2322,13 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val);
} // namespace internal
} // namespace testing

#if GTEST_INTERNAL_HAVE_CPP_ATTRIBUTE(clang::annotate)
#define GTEST_INTERNAL_DEPRECATE_AND_INLINE(msg) \
[[deprecated(msg), clang::annotate("inline-me")]]
#else
#define GTEST_INTERNAL_DEPRECATE_AND_INLINE(msg) [[deprecated(msg)]]
#endif

#if defined(__cpp_lib_span) || (GTEST_INTERNAL_HAS_INCLUDE(<span>) && \
GTEST_INTERNAL_CPLUSPLUS_LANG >= 202002L)
#define GTEST_INTERNAL_HAS_STD_SPAN 1
Expand Down
4 changes: 2 additions & 2 deletions deps/googletest/src/gtest-port.cc
Original file line number Diff line number Diff line change
Expand Up @@ -320,13 +320,13 @@ Mutex::~Mutex() {
}
}

void Mutex::Lock() {
void Mutex::lock() {
ThreadSafeLazyInit();
::EnterCriticalSection(critical_section_);
owner_thread_id_ = ::GetCurrentThreadId();
}

void Mutex::Unlock() {
void Mutex::unlock() {
ThreadSafeLazyInit();
// We don't protect writing to owner_thread_id_ here, as it's the
// caller's responsibility to ensure that the current thread holds the
Expand Down
25 changes: 25 additions & 0 deletions deps/ncrypto/ncrypto.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
#include <openssl/rand.h>
#include <openssl/x509v3.h>
#include <algorithm>
#include <array>
#include <cstring>
#include <string_view>
#if OPENSSL_VERSION_MAJOR >= 3
#include <openssl/core_names.h>
#include <openssl/params.h>
Expand Down Expand Up @@ -1094,6 +1096,29 @@ BIOPointer X509View::getValidTo() const {
return bio;
}

std::optional<std::string_view> X509View::getSignatureAlgorithm() const {
if (cert_ == nullptr) return std::nullopt;
int nid = X509_get_signature_nid(cert_);
if (nid == NID_undef) return std::nullopt;
const char* ln = OBJ_nid2ln(nid);
if (ln == nullptr) return std::nullopt;
return std::string_view(ln);
}

std::optional<std::string> X509View::getSignatureAlgorithmOID() const {
if (cert_ == nullptr) return std::nullopt;
const X509_ALGOR* alg = nullptr;
X509_get0_signature(nullptr, &alg, cert_);
if (alg == nullptr) return std::nullopt;
const ASN1_OBJECT* obj = nullptr;
X509_ALGOR_get0(&obj, nullptr, nullptr, alg);
if (obj == nullptr) return std::nullopt;
std::array<char, 128> buf{};
int len = OBJ_obj2txt(buf.data(), buf.size(), obj, 1);
if (len < 0 || static_cast<size_t>(len) >= buf.size()) return std::nullopt;
return std::string(buf.data(), static_cast<size_t>(len));
}

int64_t X509View::getValidToTime() const {
#ifdef OPENSSL_IS_BORINGSSL
// Boringssl does not implement ASN1_TIME_to_tm in a public way,
Expand Down
2 changes: 2 additions & 0 deletions deps/ncrypto/ncrypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -1191,6 +1191,8 @@ class X509View final {
BIOPointer getInfoAccess() const;
BIOPointer getValidFrom() const;
BIOPointer getValidTo() const;
std::optional<std::string_view> getSignatureAlgorithm() const;
std::optional<std::string> getSignatureAlgorithmOID() const;
int64_t getValidFromTime() const;
int64_t getValidToTime() const;
DataPointer getSerialNumber() const;
Expand Down
Loading
Loading