Skip to content

perry

v0.5.1158 Breaking

This release includes 2 breaking changes for platform teams planning a safe upgrade.

Published 4d Build & Package
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

android compile harmonyos ios llvm macos
+5 more
native smc typescript watchos windows

Affected surfaces

auth rbac rce_ssrf deps breaking_upgrade crypto_tls

ReleasePort's take

Moderate signal
editorial:auto 4d

Node.js v0.5.1158 introduces multiple breaking changes affecting core APIs such as child_process, AsyncLocalStorage, DNS/Datagram I/O, Atomics synchronization, Streams BYOB handling, cluster worker port sharing, and adds new Intl.Segmenter functionality.

Why it matters: All eight listed breaking changes (severity 70) alter fundamental behavior; code using exec/execFile, async context propagation, dns/dgram stubs, Atomics.wait/notify, Streams BYOB, or cluster listening must be updated before upgrading to v0.5.1158.

Summary

AI summary

Broad release touches Highlights, runtime, hir, and http.

Changes in this release

Breaking High

`stub` flag now populated; stubbed APIs warn on first call.

`stub` flag now populated; stubbed APIs warn on first call.

Source: llm_adapter@2026-06-11

Confidence: high

Breaking High

`child_process.exec` and `execFile` are now truly asynchronous with real ChildProcess handles.

`child_process.exec` and `execFile` are now truly asynchronous with real ChildProcess handles.

Source: llm_adapter@2026-06-11

Confidence: high

Breaking High

`AsyncLocalStorage` and `async_hooks` now propagate context across await, microtasks, timers, and `process.nextTick`.

`AsyncLocalStorage` and `async_hooks` now propagate context across await, microtasks, timers, and `process.nextTick`.

Source: llm_adapter@2026-06-11

Confidence: high

Breaking High

`node:dns` and `node:dgram` perform real network I/O instead of stub behavior.

`node:dns` and `node:dgram` perform real network I/O instead of stub behavior.

Source: llm_adapter@2026-06-11

Confidence: high

Breaking High

`Atomics.wait`, `notify`, and `waitAsync` now block and wake across agents using a shared `SharedArrayBuffer`.

`Atomics.wait`, `notify`, and `waitAsync` now block and wake across agents using a shared `SharedArrayBuffer`.

Source: llm_adapter@2026-06-11

Confidence: high

Breaking High

Streams now support BYOB readers and real `ByteLengthQueuingStrategy` accounting.

Streams now support BYOB readers and real `ByteLengthQueuingStrategy` accounting.

Source: llm_adapter@2026-06-11

Confidence: high

Breaking High

`cluster` workers share a listening port using SO_REUSEPORT and IPC round‑trip.

`cluster` workers share a listening port using SO_REUSEPORT and IPC round‑trip.

Source: llm_adapter@2026-06-11

Confidence: high

Feature Medium

`fetch()` now sends dynamically‑built request headers correctly.

`fetch()` now sends dynamically‑built request headers correctly.

Source: llm_adapter@2026-06-11

Confidence: high

Feature Medium

`v8.writeHeapSnapshot` emits a real heap snapshot from a GC walk.

`v8.writeHeapSnapshot` emits a real heap snapshot from a GC walk.

Source: llm_adapter@2026-06-11

Confidence: high

Feature Medium

Implemented `Intl.Segmenter` for grapheme, word, and sentence segmentation.

Implemented `Intl.Segmenter` for grapheme, word, and sentence segmentation.

Source: llm_adapter@2026-06-11

Confidence: high

Full changelog

Highlights

  • Stub-elimination epic (#4919) substantially landed. The manifest stub flag is now actually populated, stubbed APIs warn on first call, and PERRY_STRICT_STUBS=1 turns any stub hit into a hard error (#4929). On top of that floor, formerly-fake APIs became real: node:dns/node:dgram do real network I/O (#4911), child_process.exec/execFile are truly async with real ChildProcess handle semantics (#4912, #2130/#1934), Atomics.wait/notify/waitAsync block and wake for real across perry/thread agents over a shared SharedArrayBuffer (#4913), streams gained BYOB readers + real ByteLengthQueuingStrategy accounting (#4915), and v8.writeHeapSnapshot emits a real snapshot from a GC heap walk (#4916).
  • Real AsyncLocalStorage + async_hooks context propagation (#788/#789) — context tracked across await, microtasks, timers, and process.nextTick, with Node-v26-exact run/exit/enterWith semantics.
  • React render-time walls cleared (#4950) — JSX createElement mode gated on react import, nested-function branch-var hoisting, timers/AbortController as values, surrogate-range regex classes; plus export default class bodies lower correctly (#4976) and synthesized capture ctors on derived classes call super() (#4972).
  • node:http/https parity batch (#4903–#4910) — deferred 'listening' emit, constructable Agent/ClientRequest/IncomingMessage/ServerResponse, server/socket lifecycle methods, client TLS options honored (rejectUnauthorized/ca/checkServerIdentity), ERR_*-coded argument/header validation, write/end callbacks + backpressure + real client timeouts, tls.connect Node overloads.
  • cluster workers share a listening port (#4914) — SO_REUSEPORT + fork-IPC 'listening' round-trip + lifecycle events.
  • test262 parity gains across the board — Temporal → 98.3%, built-ins/Function → 93.7%, Promise async-resolution/capability, Array iteration/mutation v4+v5, Object v3, class/expression/statement language-semantics remnants, Date setters/parse, BigInt ++/--.
  • Intl.Segmenter (grapheme/word/sentence, #4882), regex d flag/hasIndices (#4930), \p{RGI_Emoji} & friends (#4889).
  • GC/codegen hardening — unregistered box-pointer rejection fixes the react-reconciler SIGBUS-on-import (#4898), boxed slots are entry-initialized so skipped-Let paths can't leak undef pointers (#4926), closure side-table GC deadlock fixed (#4956), automated write-barrier store-site audit (#4886).
  • fetch() sends dynamically-built request headers (#4932) — headers from variables, spreads, Object.assign, or new Headers no longer silently dropped.

Fixes

  • test(codegen): unbreak typed_shape_descriptors after #4957 bulk-fill lowering (#4984)
  • fix(net,ext-http): tls.connect Node overloads + https idle-connection close path (#4971) (#4983)
  • fix(hir): lower inline export default class bodies — methods/fields survive (#4976) (#4981)
  • fix(hir): synthesized capture ctor on a derived class must call super() (#4972) (#4980)
  • feat(diagnostics): real v8 heap snapshot from GC heap walk + inspector/repl honesty (#4916) (#4979)
  • fix(http): falsy ClientRequest method defaults to GET instead of throwing (#4970) (#4978)
  • fix(hir,codegen,runtime): clear the #4950 React render-time walls (#4969)
  • feat(runtime): real child_process spawn/exec ChildProcess handle semantics (#2130/#1934) (#4968)
  • feat(runtime): real AsyncLocalStorage + async_hooks context propagation (#788/#789) (#4967)
  • feat(streams): BYOB readers + real ByteLengthQueuingStrategy accounting (#4915) (#4966)
  • fix(http): client write/end callbacks + backpressure, real client timeouts, dynamic listener registration (#4909) (#4964)
  • feat(cluster): workers share a listening port — SO_REUSEPORT + IPC 'listening' round-trip (#4914) (#4963)
  • fix(compile): support package createRequire interop (#4960)
  • perf(runtime): optimize numeric array raw payload helpers (#4957)
  • fix(hir): self-named native member base no longer OOM-loops codegen (#4908) (#4955)
  • fix(http): wire res.write/res.end callbacks + backpressure boolean into static dispatch (#4909) (#4954)
  • feat(atomics): real cross-agent Atomics.wait/notify/waitAsync over a shared SAB (#4913) (#4952)
  • fix(runtime): expose prototype for class expression values (#4953)
  • fix(http): TimeoutOverflowWarning on req.setTimeout overflow + pid-canonical parity (#4910) (#4951)
  • fix(gc): avoid closure side-table GC deadlock (#4956)
  • fix(http,assert): node:http argument/header/URL validation throws ERR_* (#4907) (#4948)
  • fix(cjs_wrap): flat-emit module.exports = <Class> that closes over a top-level binding (#4933) (#4947)
  • fix(child_process): make exec/execFile async — off-thread, callback on a later tick (#4912) (#4941)
  • fix: Discord BigInt and root import reducers (#4946)
  • fix(runtime): hide private names from Reflect.has/in inherited probe (#4945)
  • fix(runtime): built-ins/Array mutation/iterator/array-like test262 parity (v5) (#4944)
  • fix(hir): non-class language-semantics remnant test262 parity (#4943)
  • fix(runtime): built-ins/Promise async-resolution + capability test262 parity (#4942)
  • feat(runtime): real node:dns + node:dgram network I/O (#4911) (#4940)
  • fix(fetch): send dynamically-built request headers (#4932) (#4939)
  • fix(http,net,hir): server/timer/socket lifecycle methods (#4905) (#4938)
  • fix(http): make Agent/ClientRequest/IncomingMessage/ServerResponse constructable via new (#4904) (#4936)
  • feat(runtime): implement regex d flag (hasIndices) (#4930)
  • fix(https): honor client TLS options + accept v1 server certs (#4906) (#4935)
  • test: process stdio write regression (#4934)
  • fix(codegen,runtime): entry-initialize boxed slots — eliminate undef box-pointer operands (#4926) (#4931)
  • feat(stubs): stub-elimination keystone — manifest stub flag, warn on first call, PERRY_STRICT_STUBS (#4918/#4919) (#4929)
  • fix(ext-http-server): defer 'listening' emit + listen callback to event-loop tick (#4903) (#4924)
  • chore(runtime): split date.rs under the 2000-line CI cap (#4925)
  • fix(runtime): Temporal PlainDate/YearMonth/MonthDay/Time/Instant/Now tail → 98.3% (#4923)
  • fix(hir,runtime): non-class expression-semantics remnant test262 parity (#4922)
  • fix(hir): non-class statement-semantics test262 remnant (#4920)
  • fix(runtime,codegen): built-ins tails v2 — TypedArray toString, String 0-arg methods, JSON array cycles, Proxy symbol args (#4900)
  • fix(runtime): reject unregistered box pointers in js_box_set/get (#4898) (#4902)
  • fix(runtime): small built-ins tails — Date setters/parse, BigInt ++/-- (#4901)
  • refactor(runtime): centralize handle-vs-pointer address classification (#4899)
  • fix(runtime): route string primitives through real String iterator (#4892) (#4893)
  • feat(ui-windows-winui): real Windows App SDK bootstrap probe (#4680 step 2) (#4896)
  • fix(runtime): built-ins/Array callback-iteration methods test262 parity (v4) (#4895)
  • fix(runtime): Temporal ZonedDateTime/PlainDateTime/Duration tail → ~96.7% (#4894)
  • fix(regex): expand \p{RGI_Emoji} & friends to supported emoji primitives (#4889) (#4891)
  • fix(hir): class test262 remnant — eval-in-class early errors, ctor return-override, static-field this (#4888)
  • fix(regex): rewrite \p{Surrogate} to a never-matching class (#4884) (#4887)
  • feat(gc): automate write-barrier store-site audit; barrier structuredClone object fields (#4886)
  • fix(compile): resolve barrel/type-only default-import link wall (nestjs) (#4872) (#4885)
  • fix(runtime): keep js_promise_report_unhandled_rejections alive through auto-optimize LTO (#4876) (#4883)
  • feat(intl): implement Intl.Segmenter — grapheme/word/sentence (#4882)
  • fix(codegen): provenance-based transitive disqualification for integer locals (#4785 bug class) (#4881)
  • fix(hir): route global new MessageChannel()/BroadcastChannel() to runtime constructors (#4873) (#4875)
  • fix(compile): namespace import of CJS default re-export resolves member value (#4841) (#4874)
  • fix(runtime,hir): built-ins/Function test262 parity (v2) — 67.4% → 93.7% (#4868)
  • feat: install.sh download/extraction progress + per-distro toolchain docs (#4869)
  • deps: bump indicatif 0.17.11 → 0.18.4 (#4865); cargo minor/patch group (#4864)
  • fix(runtime): built-ins/Object test262 parity (v3) (#4863)
  • fix(hir): statement-semantics test262 tail (v2) (#4861)
  • fix(ci): make npm-publish idempotent — skip already-published versions (#4870)
  • fix(ci): raise perf-gate noise floors to match observed runner variance (#4867)
  • chore(release): v0.5.1158 — roll-up changelog + version bump (#4990)

Full Changelog: https://github.com/PerryTS/perry/compare/v0.5.1151...v0.5.1158

Breaking Changes

  • The manifest `stub` flag is now populated; stubbed APIs warn on first call and `PERRY_STRICT_STUBS=1` turns any stub hit into a hard error.
  • Formerly-fake Node built‑ins (`node:dns`, `node:dgram`, `child_process.exec/execFile`, `Atomics.wait/notify/waitAsync`, streams BYOB readers, `v8.writeHeapSnapshot`) now perform real I/O or operations.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track perry

Get notified when new releases ship.

Sign up free

About perry

A native TypeScript compiler written in Rust. Compiles TypeScript directly to executables using SWC and LLVM.

All releases →

Related context

Related tools

Beta — feedback welcome: [email protected]