Changelog

nodejs/node · · 30 commits

URL, streams, compile cache get upgrades

Node.js added URL parsing and histogram performance work, compile cache read-only mode, QUIC and stream fixes, plus several API tweaks.

WHATWG URL parsing gets a faster fast path (anonrig130fe36) Node.js now parses one-byte ASCII inputs in place, reuses the original V8 string when the href is unchanged, and delays URLContext allocation until parsing succeeds. This trims allocations and copies on common URL workloads, with new coverage for the fast path.

perf_hooks histograms gain statistical comparison APIs (jasnell524dee4) Recordable histograms now support EWMA-based tracking plus effect-size and hypothesis-testing helpers such as Cohen's d, Cliff's delta, Welch's t-test, and Mann-Whitney U. That makes in-process benchmark analysis and regression detection possible without external tools.

Compile cache can now be mounted read-only (codebytere65f518c) module.enableCompileCache() and NODE_COMPILE_CACHE_READONLY=1 add a mode that only reads preexisting cache entries and never writes or creates the directory. This is aimed at packaged or integrity-checked apps that want the startup win without mutating the cache.

fs stat-style operations can be aborted cleanly (mertcanaltin00c80a8) stat, lstat, and fstat-style promise/callback paths now accept signal so in-flight filesystem stats can be canceled. The change propagates through lib/fs.js, lib/internal/fs/promises.js, docs, and targeted tests.

HTTP/3 now rejects unconsumed streams with a protocol code (trivenayda7b94e) When a QUIC session receives a request stream but no consumer is registered, Node now resets it with H3_REQUEST_REJECTED for HTTP/3 sessions instead of always tearing it down generically. That gives peers a standards-compliant signal that the request was not processed.

Stream iteration broadcast/end handling is now more robust (trivikrc28857e) The broadcast writer now waits for buffered data to drain before completing end(), and the API docs clarify that endSync() may return -1 when asynchronous draining is required. This fixes backpressured writes getting stuck pending and aligns the semantics with the actual behavior.

Broadcasted stream sharing no longer drains the source too early (trivikrf96dccc) stream.iter.share() now waits for buffer space after dropping a newest item instead of immediately pulling again. That avoids one consumer starving the source or looping forever when a slower consumer keeps the buffer full.

QUIC rejects unread request streams with the right reset code (trivenayda7b94e) The QUIC stack now exposes a per-application "request rejected" code and uses it when an incoming request stream is dropped before application processing. HTTP/3 maps this to H3_REQUEST_REJECTED, while other applications keep the previous no-error behavior.

Other misc changes

  • Removed the --no-experimental-websocket CLI flag (aduh95057e591)
  • HTTP connection list refactor to intrusive lists for performance (mcollina0449521)
  • Heap embedder graph deduplication fix (IlyasShabi857e438)
  • os.networkInterfaces() docs typo/property name fix (hanityxfbea5c3)
  • REPL history merge fix for entries added during async load (mhayk453f47a)
  • TTY raw-vt/io raw mode support (samuel-williams-shopify0b89f8f)
  • Default coverage exclusion now matches dotfiles (semimikoh22e99dc)
  • Glob traversal sibling-skipping bug fix (webdevelopersrinu0ea2c86)
  • Duplicate endReadableNT scheduling fix in readable streams (mcollina82babee)
  • Dgram bind error callback behavior fix (armanmikoyan97c7e32)
  • Readability/test maintenance and minor doc/CI updates across remaining commits