Skip to content

Node.js streams: Fork points#92252

Merged
timneutkens merged 40 commits into
canaryfrom
03-27-node.js_streams_fork_points
Apr 8, 2026
Merged

Node.js streams: Fork points#92252
timneutkens merged 40 commits into
canaryfrom
03-27-node.js_streams_fork_points

Conversation

@timneutkens
Copy link
Copy Markdown
Contributor

@timneutkens timneutkens commented Apr 2, 2026

What?

Implements native Node.js stream support for the RSC / HTML rendering. This first step does not include cacheComponents / static generation.

Instead of converting between Node.js Readable streams and Web ReadableStreams at every boundary, the rendering pipeline now uses native Node.js Transform/PassThrough/Readable streams end-to-end when the useNodeStreams experimental flag is enabled.

Why?

The current rendering pipeline has a bottleneck on Web Streams. Each step adds overhead: buffering, scheduling mismatches, and unnecessary memory copies. Node.js streams are the native I/O primitive on the server. Using them directly eliminates these conversion and scheduling/promise costs.

This is the foundational plumbing needed to run the full app render pipeline on native Node.js streams, which improves server-side rendering throughput.

How?

Stream transform reimplementation (stream-ops.node.ts):

All web TransformStream-based transforms have been reimplemented as Node.js Transform streams:

  • createBufferedTransformStream — coalesces chunks written in the same microtask into a single Uint8Array
  • createFlightDataInjectionTransform — interleaves RSC flight data chunks with the HTML stream
  • createHeadInsertionTransform — inserts server-generated HTML (polyfills, scripts) before </head>
  • createMetadataTransform — finds and replaces the «nxt-icon» meta mark
  • createDeferredSuffixTransform — appends the document suffix after the first HTML chunk
  • createMoveSuffixTransform — moves </body></html> to the end of the stream
  • createHtmlDataDplIdTransform — inserts a data-dpl-id attribute on the opening <html> tag
  • createRootLayoutValidatorTransform — validates <html> and <body> tags are present (dev only)

ReplayableNodeStream (app-render-prerender-utils.ts):

New class that buffers all chunks from a source Readable and allows creating multiple independent replay streams via createReplayStream(). This replaces the web stream tee() operation for ReactServerResult when using Node.js streams. Uses pull-based delivery (_read()) to avoid AsyncLocalStorage context issues — chunks are only delivered when the consumer reads, keeping them inside the correct ALS scope during Fizz's performWork. Includes 392 lines of unit tests covering buffering, live replay, error propagation, multiple independent replays, subscriber cleanup, and dispose behavior.

Native rendering functions:

  • renderToNodeFlightStream — calls React's renderToPipeableStream directly, pipes to a PassThrough
  • renderToNodeFizzStream — calls renderToPipeableStream for HTML rendering without the web stream wrapper
  • createNodeInlinedDataStream — wraps RSC flight data in <script> tags using Buffer operations and isUtf8() for encoding detection

continueFizzStream rewritten for Node.js:

Instead of converting to web streams and delegating to webContinueFizzStream, the Node.js path pipes through a chain of native Transform streams directly: buffer → dpl-id → metadata → deferred suffix → flight data injection → root layout validator → move suffix → head insertion.

API renames for clarity:

  • renderToFlightStreamrenderToWebFlightStream / renderToNodeFlightStream
  • renderToFizzStreamrenderToWebFizzStream / renderToNodeFizzStream
  • createInlinedDataStreamcreateWebInlinedDataStream / createNodeInlinedDataStream
  • createDebugChannelcreateWebDebugChannel / createNodeDebugChannel

app-render.tsx fork points:

The main render function now branches on process.env.__NEXT_USE_NODE_STREAMS at two key points:

  1. RSC rendering — uses renderToNodeFlightStream + createNodeDebugChannel
  2. HTML rendering — uses renderToNodeFizzStream + native continueFizzStream with createNodeInlinedDataStream

All pre-render, cache components, and dev staged-render paths continue to use web streams.

CI updates (.github/workflows/build_and_test.yml):

The use-node-streams test jobs now run without __NEXT_CACHE_COMPONENTS / __NEXT_EXPERIMENTAL_CACHED_NAVIGATIONS / __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER to isolate the Node.js streams path.

@nextjs-bot nextjs-bot added created-by: Turbopack team PRs by the Turbopack team. type: next labels Apr 2, 2026
Base automatically changed from 02-24-node.js_streams_first_pass to canary April 2, 2026 11:13
@timneutkens timneutkens force-pushed the 03-27-node.js_streams_fork_points branch from 3d332db to d555ab2 Compare April 2, 2026 11:14
Comment thread packages/next/src/server/app-render/stream-ops.node.ts Outdated
@nextjs-bot
Copy link
Copy Markdown
Contributor

nextjs-bot commented Apr 2, 2026

Tests Passed

@nextjs-bot
Copy link
Copy Markdown
Contributor

nextjs-bot commented Apr 2, 2026

Stats from current PR

🔴 1 regression

Metric Canary PR Change Trend
node_modules Size 488 MB 489 MB 🔴 +1.34 MB (+0%) █████
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 456ms 456ms ▁█▅▅▅
Cold (Ready in log) 449ms 445ms ▁▂▅▇▄
Cold (First Request) 1.119s 1.107s ▆▁▁▂▂
Warm (Listen) 456ms 456ms █▁██▁
Warm (Ready in log) 444ms 450ms ▂▂▇█▁
Warm (First Request) 340ms 344ms ▃▄▇█▄
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 455ms 455ms ▁▁▅▁▅
Cold (Ready in log) 439ms 440ms ▁▃▆▂▂
Cold (First Request) 1.960s 1.972s ▇▇▇▆▁
Warm (Listen) 456ms 456ms ▁▁▁▁▁
Warm (Ready in log) 439ms 440ms ▁▂▅▁▂
Warm (First Request) 1.972s 1.990s ▆▇█▆▁

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 3.808s 3.894s ▇▆██▁
Cached Build 3.881s 3.896s ▄███▄
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 14.500s 14.515s ▁▂▅▂▂
Cached Build 14.704s 14.674s ▁▂▇▃▄
node_modules Size 488 MB 489 MB 🔴 +1.34 MB (+0%) █████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
01zz1z_sccief.js gzip 155 B N/A -
02fkg8wfh0iju.js gzip 9.19 kB N/A -
030plil3tn3n7.js gzip 70.8 kB N/A -
050zwt5xh_0tx.js gzip 10.4 kB N/A -
087fzjd-gvlzv.js gzip 450 B N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0dsty6kq2hert.js gzip 155 B N/A -
0l26a3spazyyn.js gzip 151 B N/A -
0ppxcl_z43mad.js gzip 8.52 kB N/A -
0yzgvfimihkd2.js gzip 157 B N/A -
0ziljd71kuixt.js gzip 157 B N/A -
19oha6-znmkcv.js gzip 8.55 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1pciyc-0_znyg.js gzip 155 B N/A -
2_5rjb7lqxntf.js gzip 221 B 221 B
2035t1-zcnaw3.js gzip 65.7 kB N/A -
219prxwxgaalc.js gzip 7.61 kB N/A -
26elcgxnn9zjd.js gzip 8.52 kB N/A -
2900hudr6gvm0.js gzip 2.28 kB N/A -
29sfmxk0tawpd.js gzip 156 B N/A -
2lv2js3kmdeho.js gzip 8.48 kB N/A -
2myt_shpnyhzu.js gzip 156 B N/A -
2rehygrd36hqv.js gzip 8.58 kB N/A -
2s6nyomvmvh9r.js gzip 155 B N/A -
2srwswih0m9_h.js gzip 13.3 kB N/A -
2w-zjp8tyfrur.js gzip 159 B N/A -
3-jz00s4w-r6h.js gzip 13 kB N/A -
3-p9p9mheqhzx.js gzip 8.55 kB N/A -
31030bryqpolg.js gzip 8.53 kB N/A -
31dx5nmrzzuy7.js gzip 225 B N/A -
33sgz0bml7vgv.js gzip 155 B N/A -
3925v09gtu-5k.js gzip 49 kB N/A -
39x4zj5mjb4d_.js gzip 9.77 kB N/A -
3ii1q6weo9fxz.js gzip 162 B N/A -
3k-48b78ys_vy.js gzip 10.1 kB N/A -
3m7-5rfj0avoz.js gzip 12.9 kB N/A -
3uqce_6sa526g.js gzip 8.47 kB N/A -
3yurjqk-sjs3y.js gzip 1.46 kB N/A -
3z62yfdtiw-rc.js gzip 168 B N/A -
40ybjx9c192n0.js gzip 13.8 kB N/A -
421vzwdt9j1b_.js gzip 5.62 kB N/A -
turbopack-0a..gg-u.js gzip 4.19 kB N/A -
turbopack-0j..4h2c.js gzip 4.18 kB N/A -
turbopack-1b..7qjv.js gzip 4.18 kB N/A -
turbopack-1c..yhu3.js gzip 4.18 kB N/A -
turbopack-1d..d769.js gzip 4.18 kB N/A -
turbopack-1u..hrqd.js gzip 4.18 kB N/A -
turbopack-20..21vq.js gzip 4.17 kB N/A -
turbopack-21..e4ra.js gzip 4.18 kB N/A -
turbopack-2p..t2ge.js gzip 4.18 kB N/A -
turbopack-2s..og4f.js gzip 4.18 kB N/A -
turbopack-2t..h5wq.js gzip 4.18 kB N/A -
turbopack-2u..rcf4.js gzip 4.18 kB N/A -
turbopack-3e..1qn1.js gzip 4.18 kB N/A -
turbopack-3k..lhww.js gzip 4.16 kB N/A -
03dgzoo-qf3sm.js gzip N/A 9.19 kB -
05tx5f25dlivn.js gzip N/A 8.53 kB -
0c7ez6p2qc57f.js gzip N/A 5.62 kB -
0duvj3qk5pvgn.js gzip N/A 13.8 kB -
0h6hofq3h6-42.js gzip N/A 158 B -
0ir6-1duadm2z.js gzip N/A 158 B -
0lm29e2y9kx_b.js gzip N/A 153 B -
0m-34rm9w_wpm.js gzip N/A 7.6 kB -
0m21op30uewwb.js gzip N/A 156 B -
0qnwuk92m8i7o.js gzip N/A 10.4 kB -
0r4wrn6n0ue2m.js gzip N/A 8.55 kB -
0rp0fodtbt_6m.js gzip N/A 8.52 kB -
0sfck-km4dl1k.js gzip N/A 8.47 kB -
0x0xuhmxzwkp8.js gzip N/A 8.47 kB -
1_ziiz--jvfsp.js gzip N/A 158 B -
1-wdvgxnzicj7.js gzip N/A 1.46 kB -
11u6nxujb2eg4.js gzip N/A 450 B -
1dyfoo24ajqxm.js gzip N/A 162 B -
1jv-o1_s-zmua.js gzip N/A 49 kB -
1me96x5vwv1sy.js gzip N/A 65.7 kB -
1zc-k7aaakb6o.js gzip N/A 159 B -
29dt6m7d89-j7.js gzip N/A 157 B -
2d6k-a9uznmvb.js gzip N/A 156 B -
2e2z-03lx4fjc.js gzip N/A 13 kB -
2h70zbiqaf4bf.js gzip N/A 158 B -
2k9ax08cjl2id.js gzip N/A 12.9 kB -
2lms6k76q5-6m.js gzip N/A 13.3 kB -
2qx4twi9i3xus.js gzip N/A 2.28 kB -
2srnqic6tvxxd.js gzip N/A 8.52 kB -
2wrq5zps69nfq.js gzip N/A 70.8 kB -
3-34t1k915rbt.js gzip N/A 170 B -
30l7m4nayp73a.js gzip N/A 8.55 kB -
3h_ecpiaatwgc.js gzip N/A 10.1 kB -
3ity0aahajapd.js gzip N/A 225 B -
3nm_i02apa655.js gzip N/A 160 B -
3oa4b8uiuh01x.js gzip N/A 157 B -
3wrhpuc-j1aw9.js gzip N/A 9.77 kB -
43mlw9dy_8f02.js gzip N/A 8.58 kB -
turbopack-02..fq93.js gzip N/A 4.19 kB -
turbopack-0c.._bts.js gzip N/A 4.18 kB -
turbopack-0f..3b6y.js gzip N/A 4.16 kB -
turbopack-0k..1pc7.js gzip N/A 4.18 kB -
turbopack-13..a-km.js gzip N/A 4.18 kB -
turbopack-2_..2dke.js gzip N/A 4.18 kB -
turbopack-23..lkou.js gzip N/A 4.18 kB -
turbopack-24..jdhb.js gzip N/A 4.18 kB -
turbopack-2a..y2ca.js gzip N/A 4.18 kB -
turbopack-2q..7av9.js gzip N/A 4.18 kB -
turbopack-2w..zlx4.js gzip N/A 4.18 kB -
turbopack-37..786c.js gzip N/A 4.18 kB -
turbopack-3f..ivxr.js gzip N/A 4.18 kB -
turbopack-3g..kcks.js gzip N/A 4.18 kB -
Total 464 kB 464 kB ⚠️ +25 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 718 B 716 B
Total 718 B 716 B ✅ -2 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 430 B 435 B 🔴 +5 B (+1%)
Total 430 B 435 B ⚠️ +5 B

📦 Webpack

Client

Main Bundles
Canary PR Change
5528-HASH.js gzip 5.54 kB N/A -
6280-HASH.js gzip 60.7 kB N/A -
6335.HASH.js gzip 169 B N/A -
912-HASH.js gzip 4.59 kB N/A -
e8aec2e4-HASH.js gzip 62.8 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 256 B 255 B
main-HASH.js gzip 39.4 kB 39.3 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
262-HASH.js gzip N/A 4.59 kB -
2889.HASH.js gzip N/A 169 B -
5602-HASH.js gzip N/A 5.55 kB -
6948ada0-HASH.js gzip N/A 62.8 kB -
9544-HASH.js gzip N/A 61.4 kB -
Total 235 kB 235 kB ⚠️ +580 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 194 B
_error-HASH.js gzip 183 B 180 B 🟢 3 B (-2%)
css-HASH.js gzip 331 B 330 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 256 B 256 B
head-HASH.js gzip 351 B 352 B
hooks-HASH.js gzip 384 B 383 B
image-HASH.js gzip 580 B 581 B
index-HASH.js gzip 260 B 260 B
link-HASH.js gzip 2.51 kB 2.51 kB
routerDirect..HASH.js gzip 320 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.98 kB 7.98 kB ✅ -1 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 125 kB 126 kB
page.js gzip 273 kB 273 kB
Total 398 kB 399 kB ⚠️ +388 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 616 B 615 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 44.2 kB 44.1 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 45.8 kB 45.7 kB ✅ -137 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 715 B 718 B
Total 715 B 718 B ⚠️ +3 B
Build Cache
Canary PR Change
0.pack gzip 4.37 MB 4.37 MB 🟢 7.97 kB (0%)
index.pack gzip 116 kB 112 kB 🟢 4.03 kB (-3%)
index.pack.old gzip 114 kB 114 kB
Total 4.6 MB 4.59 MB ✅ -12.1 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 342 kB 345 kB 🔴 +3.37 kB (+1%)
app-page-exp..prod.js gzip 189 kB 191 kB 🔴 +1.92 kB (+1%)
app-page-tur...dev.js gzip 341 kB 345 kB 🔴 +3.34 kB (+1%)
app-page-tur..prod.js gzip 189 kB 191 kB 🔴 +1.9 kB (+1%)
app-page-tur...dev.js gzip 338 kB 341 kB 🔴 +3.35 kB (+1%)
app-page-tur..prod.js gzip 187 kB 189 kB 🔴 +1.88 kB (+1%)
app-page.run...dev.js gzip 338 kB 342 kB 🔴 +3.34 kB (+1%)
app-page.run..prod.js gzip 187 kB 189 kB 🔴 +1.91 kB (+1%)
app-route-ex...dev.js gzip 76.9 kB 76.9 kB
app-route-ex..prod.js gzip 52.5 kB 52.5 kB
app-route-tu...dev.js gzip 76.9 kB 76.9 kB
app-route-tu..prod.js gzip 52.5 kB 52.5 kB
app-route-tu...dev.js gzip 76.5 kB 76.5 kB
app-route-tu..prod.js gzip 52.2 kB 52.2 kB
app-route.ru...dev.js gzip 76.5 kB 76.5 kB
app-route.ru..prod.js gzip 52.2 kB 52.2 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 43.9 kB 43.9 kB
pages-api-tu..prod.js gzip 33.4 kB 33.4 kB
pages-api.ru...dev.js gzip 43.8 kB 43.8 kB
pages-api.ru..prod.js gzip 33.4 kB 33.4 kB
pages-turbo....dev.js gzip 53.2 kB 53.2 kB
pages-turbo...prod.js gzip 39 kB 39 kB
pages.runtim...dev.js gzip 53.2 kB 53.2 kB
pages.runtim..prod.js gzip 39 kB 39 kB
server.runti..prod.js gzip 62.8 kB 62.8 kB
Total 3.03 MB 3.05 MB ⚠️ +21 kB
📝 Changed Files (8 files)

Files with changes:

  • app-page-exp..ntime.dev.js
  • app-page-exp..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page.runtime.dev.js
  • app-page.runtime.prod.js
View diffs
app-page-exp..ntime.dev.js
failed to diff
app-page-exp..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page.runtime.dev.js
failed to diff
app-page.runtime.prod.js
failed to diff
📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/7f98bbe5036902d93fca13ad1ed0d12f06f96bd5/next

Copy link
Copy Markdown
Contributor

@gnoff gnoff left a comment

Choose a reason for hiding this comment

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

nits and a few suggestions. we can land though so just lmk if you want me to rereview if you end up changing anything significant

Comment on lines +213 to +215
if (delayDataUntilFirstHtmlChunk) {
startOrContinuePulling(this)
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this conditional isn't necessary and maybe it is safer to unconditionally call this. atm it won't change anything but since we're making a mutually exclusive condition with the start on line 232 it might be safer to just rely on the idemopotency

iconMarkLength += 2
} else {
iconMarkLength++
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

not sure if the original was commented but this kind of thing should be explained since it is pretty opaque

if (chunkIndex === 0) {
closedHeadIndex = indexOfUint8Array(chunk, ENCODED_TAGS.CLOSED.HEAD)
if (iconMarkIndex < closedHeadIndex) {
const replaced = Buffer.allocUnsafe(chunk.length - iconMarkLength)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

if we ever had a mistake in our memory sets that follow this we'd be creating an exfil vuln. Not sure it's worth avoiding the zeroing of alloc

? nodeReadableToWebReadableStream(opts.inlinedDataStream)
: undefined,
{
suffix,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

seems like suffix is unused so we can delete it as an option and delete the associated transforms for both node and web

// Flight data injection – interleaves RSC data chunks with the HTML stream
if (inlinedDataStream) {
const flightInjection = createFlightDataInjectionTransform(
webToReadable(inlinedDataStream),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ideally the typing would know that the incoming streams must be Readable already. but I think we can land this way. I assume it was originally to allow for a single API mirrored in both impls but now that we have a separate API for node vs web we should just type the stream args as their expected types

Comment on lines +473 to +477
// ---------------------------------------------------------------------------
// data-dpl-id insertion – Node.js Transform that inserts a `data-dpl-id`
// attribute on the opening <html tag for deployment identification.
// ---------------------------------------------------------------------------

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this is sort of an aside but why aren't we using a meta tag for this and just rendering it?

Comment thread packages/next/errors.json
Comment on lines +1155 to +1156
"1154": "not implemented",
"1155": "Not implemented",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should fix the version without the capital

@timneutkens timneutkens merged commit de7ce39 into canary Apr 8, 2026
172 checks passed
@timneutkens timneutkens deleted the 03-27-node.js_streams_fork_points branch April 8, 2026 17:45
@timneutkens
Copy link
Copy Markdown
Contributor Author

Will add a follow-up PR to address the comments

timneutkens added a commit that referenced this pull request Apr 8, 2026
timneutkens added a commit that referenced this pull request Apr 9, 2026
timneutkens added a commit that referenced this pull request Apr 10, 2026
## What?

Building on top of the changes in #92252. This PR implements similar
fork points for the path when cacheComponents is enabled. Both the
development and production path are implemented.
timneutkens added a commit that referenced this pull request Apr 12, 2026
## What?

Building on top of the changes in
#92252. This PR implements similar
fork points for the `catch` path.
timneutkens added a commit that referenced this pull request Apr 12, 2026
timneutkens added a commit that referenced this pull request Apr 14, 2026
## What?

Building on top of the changes in #92252. This PR implements similar
fork points for continueDynamicHTMLResume
timneutkens added a commit that referenced this pull request Apr 14, 2026
…92474)

## What?

Building on top of the changes in #92252. This PR implements similar
fork points for generateDynamicFlightRenderResult
timneutkens added a commit that referenced this pull request Apr 14, 2026
…esult (#92509)

## What?

Building on top of the changes in #92252. This PR implements similar
fork points for generateStagedDynamicFlightRenderResult
timneutkens added a commit that referenced this pull request Apr 15, 2026
…92510)

## What?

Building on top of the changes in #92252. This PR implements similar
fork points for logMessagesAndSendErrorsToBrowser
timneutkens added a commit that referenced this pull request Apr 15, 2026
## What?

Building on top of the changes in #92252. This PR implements similar
fork points for createCombinedPayloadStream
timneutkens added a commit that referenced this pull request Apr 15, 2026
…dation (#92512)

## What?

Building on top of the changes in #92252. This PR implements similar
fork points for renderWithRestartOnCacheMissInValidation
timneutkens added a commit that referenced this pull request Apr 15, 2026
## What?

Building on top of the changes in #92252. This PR implements similar
fork points for prerenderToStream
timneutkens added a commit that referenced this pull request Apr 15, 2026
@github-actions github-actions Bot locked as resolved and limited conversation to collaborators Apr 24, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants