Changelog

denoland/deno · · 36 commits

Deno lands big Node compat and perf push

A heavy day of Node.js compatibility fixes, plus worker/message passing performance work and a few broader runtime bug fixes.

Worker and MessagePort messaging gets faster (bartlomieju81790b0)

Deno adds raw post-message ops and synchronous drain loops to cut serde and async round-trip overhead for the common case. This should noticeably improve worker and MessagePort throughput, especially for chatty ping-pong patterns.

Node worker_threads parentPort is isolated from globalThis (bartlomieju3d766d5)

parentPort is now a separate delegate object instead of an alias of the worker global, which avoids recursion and double-delivery bugs when libraries monkey-patch postMessage or mix Node-style and web-style handlers. That brings Deno closer to Node's worker semantics and fixes tricky Emscripten/z3-solver cases.

HTTP/2 compatibility fills in multiple protocol gaps

A cluster of commits tightened Deno's node:http2 behavior around headers, ALPN fallback, push streams, invalid frame limits, GOAWAY payloads, and socket lifecycle handling. These fixes unlock several compat tests and close real interoperability/security-adjacent gaps like response splitting and header validation. (divybotefa25f5, divybot79d3405, divybot6568c65, divybotfb7be9c, divybot52a849d, divybot987c1e8, divybot79df2ac, divybotcaf98c5, divybot44cd971, divybot3818362, divybotdcc8fb7, divybot3c8c5cf)

Node fs and child_process behavior gets closer to Node

fs.mkdtempDisposable*, fs.readdir encoding shorthand, child_process.spawn() stdio piping, and reusePort listen flags were all aligned with Node's behavior. The Windows writeFileSync fix is particularly important: it prevents a misleading EEXIST error and avoids data loss when truncation happens before CRT fd creation succeeds. (nathanwhitbot98e65bc, nathanwhitbotf47b48b, bartlomiejubf216e0, bartlomieju92661f2, bartlomiejua1468b2)

TLS/socket flow control and close handling are corrected

TLS readStop now truly stops delivery, buffers pending plaintext/EOF, and flushes it on the next readStart, fixing backpressure and lifecycle edge cases. There were also socket-write/shutdown fixes for HTTP/2 and X.509v1 cert acceptance updates that improve real-world TLS interop. (bartlomieju9e9a919, divybotdcc8fb7, divybot4b78e6f, divybotfb7be9c)

fs.Utf8Stream lands (divybotdde034d)

Deno adds fs.Utf8Stream, a new internal stream helper needed for Node compat coverage. The implementation is large and suggests a new supported behavior surface rather than a small internal tweak.

Task filtering now matches workspace directory names (fibibot3ed99fd)

deno task --filter now matches on workspace directory names, fixing a real usability bug for monorepos with directory-based workspace layouts. This makes task selection behave more intuitively in common workspace setups.

Coverage no longer counts injected helper code (fibibot52eb81d)

deno coverage now excludes SWC-injected decorator helpers from reported results, preventing artificial drops in coverage percentages. This is a correctness fix for reporting, not user code execution.

Import wildcard matching and bundle diagnostics improved

npm package import resolution now handles single-character wildcard segments, and Deno.bundle reports a clearer error when invoked from a compiled binary. These are useful edge-case fixes, but narrower in scope than the main runtime work. (fibibot2ea8741, fibibot48f0300)

Other misc changes

  • Node compat test enrollments/ignores and config updates across multiple HTTP/2, timers, worker, and child_process cases
  • Small internal alignment fixes in ext/node process/module, timers, HTTP server, and fetch client option handling
  • Bundle/CSS fragment URL handling tweak
  • Dependency/Cargo lock bumps
  • Minor test fixture additions and expected-output updates