Skip to content

refactor(app-render): extract stream-ops and debug-channel modules (5/8)#89858

Merged
timneutkens merged 2 commits intocanaryfrom
feedthejim/node-stream-02-extract
Feb 23, 2026
Merged

refactor(app-render): extract stream-ops and debug-channel modules (5/8)#89858
timneutkens merged 2 commits intocanaryfrom
feedthejim/node-stream-02-extract

Conversation

@feedthejim
Copy link
Contributor

@feedthejim feedthejim commented Feb 11, 2026

Summary

Pure refactor: extract stream operations and debug-channel code from app-render.tsx into separate compile-time switchable modules. Web-only at this stage.

  • stream-ops.web.ts: extracted web stream operations (continueFizzStream, renderToFlightStream, renderToFizzStream, etc.)
  • stream-ops.ts: re-export switcher (web-only for now, conditional added in next PR)
  • debug-channel-server.web.ts: extracted web debug channel implementation
  • debug-channel-server.ts: re-export switcher
  • app-render.tsx: net reduction via imports from stream-ops/debug-channel instead of inline
  • node-web-streams-helper.ts: added createRuntimePrefetchTransformStream

Test plan

  • pnpm --filter=next types passes
  • Existing app-dir e2e tests pass (smoke test: pnpm test-dev-turbo test/e2e/app-dir/app/)
  • No runtime behavior changes: identical web stream paths

@feedthejim feedthejim changed the title refactor(app-render): extract stream-ops and debug-channel into compile-time switchable modules refactor(app-render): extract stream-ops and debug-channel modules Feb 11, 2026
@feedthejim feedthejim force-pushed the feedthejim/node-stream-01-docs-bench branch from 2b6a15e to f12d57f Compare February 11, 2026 21:41
@feedthejim feedthejim force-pushed the feedthejim/node-stream-02-extract branch from 75234d5 to 22d9b4f Compare February 11, 2026 21:41
@feedthejim feedthejim changed the base branch from feedthejim/node-stream-01-docs-bench to graphite-base/89858 February 11, 2026 21:46
@feedthejim feedthejim force-pushed the feedthejim/node-stream-02-extract branch from 22d9b4f to 6b4ea2a Compare February 11, 2026 21:46
@feedthejim feedthejim changed the base branch from graphite-base/89858 to feedthejim/node-stream-01c-fixes February 11, 2026 21:46
@feedthejim feedthejim changed the base branch from feedthejim/node-stream-01c-fixes to graphite-base/89858 February 11, 2026 21:50
@feedthejim feedthejim force-pushed the feedthejim/node-stream-02-extract branch from 6b4ea2a to 54df7a3 Compare February 11, 2026 21:50
@feedthejim feedthejim changed the base branch from graphite-base/89858 to feedthejim/node-stream-01d-cache-dce February 11, 2026 21:50
@feedthejim feedthejim force-pushed the feedthejim/node-stream-02-extract branch from 54df7a3 to c5ede11 Compare February 11, 2026 22:34
@feedthejim feedthejim force-pushed the feedthejim/node-stream-01d-cache-dce branch from b5ee83a to a174fe1 Compare February 11, 2026 22:34
@feedthejim feedthejim force-pushed the feedthejim/node-stream-02-extract branch from c5ede11 to ac9e39f Compare February 11, 2026 22:45
@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 11, 2026

Stats from current PR

🔴 1 regression

Metric Canary PR Change Trend
node_modules Size 474 MB 474 MB 🔴 +420 kB (+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) 506ms 456ms ▃▁▁▁▁
Cold (Ready in log) 462ms 458ms ▃▂▂▂▂
Cold (First Request) 906ms 945ms ▄▄▄▅▄
Warm (Listen) 458ms 459ms ▃▁▁▁▁
Warm (Ready in log) 461ms 461ms ▃▁▁▁▁
Warm (First Request) 377ms 372ms ▃▁▁▁▂
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 456ms 455ms █▁▁▁▁
Cold (Ready in log) 438ms 438ms █▃▁▄▃
Cold (First Request) 1.949s 1.958s █▂▁▂▁
Warm (Listen) 456ms 456ms █▁▁▁▁
Warm (Ready in log) 439ms 440ms █▃▁▄▃
Warm (First Request) 1.965s 1.981s █▂▁▂▂

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 4.336s 4.358s ▅▁▁▁▁
Cached Build 4.325s 4.355s ▅▁▁▁▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 14.053s 14.094s █▁▁▁▁
Cached Build 14.140s 14.155s █▁▁▁▁
node_modules Size 474 MB 474 MB 🔴 +420 kB (+0%) ▁▁███
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles: **399 kB** → **399 kB** ✅ -3 B

80 files with content-based hashes (individual files not comparable between builds)

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 764 B 759 B
Total 764 B 759 B ✅ -5 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 451 B 450 B
Total 451 B 450 B ✅ -1 B

📦 Webpack

Client

Main Bundles
Canary PR Change
5528-HASH.js gzip 5.48 kB N/A -
6280-HASH.js gzip 57.5 kB N/A -
6335.HASH.js gzip 169 B N/A -
912-HASH.js gzip 4.53 kB N/A -
e8aec2e4-HASH.js gzip 62.6 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 256 B 254 B
main-HASH.js gzip 39.1 kB 39.1 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
262-HASH.js gzip N/A 4.53 kB -
2889.HASH.js gzip N/A 169 B -
5602-HASH.js gzip N/A 5.49 kB -
6948ada0-HASH.js gzip N/A 62.6 kB -
9544-HASH.js gzip N/A 58.3 kB -
Total 231 kB 232 kB ⚠️ +747 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.5 kB 2.5 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.97 kB 7.97 kB ✅ -2 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 125 kB 125 kB
page.js gzip 253 kB 253 kB
Total 377 kB 378 kB ⚠️ +258 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 615 B 612 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 43.8 kB 43.9 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 45.4 kB 45.5 kB ⚠️ +82 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 3.95 MB 3.99 MB 🔴 +33.2 kB (+1%)
index.pack gzip 103 kB 102 kB 🟢 1.24 kB (-1%)
index.pack.old gzip 102 kB 102 kB
Total 4.16 MB 4.19 MB ⚠️ +31.7 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 318 kB 318 kB
app-page-exp..prod.js gzip 168 kB 168 kB
app-page-tur...dev.js gzip 317 kB 318 kB
app-page-tur..prod.js gzip 168 kB 168 kB
app-page-tur...dev.js gzip 314 kB 314 kB
app-page-tur..prod.js gzip 166 kB 166 kB
app-page.run...dev.js gzip 314 kB 315 kB
app-page.run..prod.js gzip 167 kB 167 kB
app-route-ex...dev.js gzip 70.7 kB 70.7 kB
app-route-ex..prod.js gzip 49.1 kB 49.1 kB
app-route-tu...dev.js gzip 70.7 kB 70.7 kB
app-route-tu..prod.js gzip 49.2 kB 49.2 kB
app-route-tu...dev.js gzip 70.3 kB 70.3 kB
app-route-tu..prod.js gzip 48.9 kB 48.9 kB
app-route.ru...dev.js gzip 70.2 kB 70.2 kB
app-route.ru..prod.js gzip 48.9 kB 48.9 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.2 kB 43.2 kB
pages-api-tu..prod.js gzip 32.9 kB 32.9 kB
pages-api.ru...dev.js gzip 43.2 kB 43.2 kB
pages-api.ru..prod.js gzip 32.8 kB 32.8 kB
pages-turbo....dev.js gzip 52.5 kB 52.5 kB
pages-turbo...prod.js gzip 38.5 kB 38.5 kB
pages.runtim...dev.js gzip 52.5 kB 52.5 kB
pages.runtim..prod.js gzip 38.4 kB 38.4 kB
server.runti..prod.js gzip 62 kB 62 kB
Total 2.81 MB 2.81 MB ⚠️ +1.51 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

Diff too large to display

app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js

Diff too large to display

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

Diff too large to display

📎 Tarball URL
next@https://vercel-packages.vercel.app/next/prs/89858/next

@feedthejim feedthejim changed the title refactor(app-render): extract stream-ops and debug-channel modules (5/8) refactor(app-render): extract stream-ops and debug-channel modules Feb 12, 2026
@feedthejim feedthejim changed the title (5/8) refactor(app-render): extract stream-ops and debug-channel modules refactor(app-render): extract stream-ops and debug-channel modules (5/8) Feb 12, 2026
@timneutkens timneutkens force-pushed the feedthejim/node-stream-01d-cache-dce branch from a174fe1 to 24732c7 Compare February 16, 2026 14:59
@timneutkens timneutkens force-pushed the feedthejim/node-stream-02-extract branch from ac9e39f to 0ebb65f Compare February 16, 2026 14:59
@timneutkens timneutkens force-pushed the feedthejim/node-stream-01d-cache-dce branch from 24732c7 to a296e79 Compare February 16, 2026 16:50
@timneutkens timneutkens force-pushed the feedthejim/node-stream-02-extract branch from 0ebb65f to 229dd11 Compare February 16, 2026 16:50
@timneutkens timneutkens marked this pull request as ready for review February 16, 2026 16:51
@timneutkens timneutkens force-pushed the feedthejim/node-stream-02-extract branch from 229dd11 to cdc35bb Compare February 19, 2026 10:20
@timneutkens timneutkens force-pushed the feedthejim/node-stream-01d-cache-dce branch 2 times, most recently from 74b6486 to f0c9ffe Compare February 19, 2026 11:07
@timneutkens timneutkens force-pushed the feedthejim/node-stream-02-extract branch 2 times, most recently from 694434e to 1cb6828 Compare February 19, 2026 12:12
Base automatically changed from feedthejim/node-stream-01d-cache-dce to canary February 19, 2026 12:36
@timneutkens timneutkens force-pushed the feedthejim/node-stream-02-extract branch from 1cb6828 to f324ca1 Compare February 19, 2026 12:41
@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 19, 2026

Tests Passed

feedthejim and others added 2 commits February 23, 2026 11:02
…le-time switchable modules

Extract stream operations and debug channel code from app-render.tsx into
separate modules that can be swapped at compile time:

- stream-ops.web.ts: web stream implementations (renderToFlightStream,
  renderToFizzStream, continueFizzStream, etc.)
- stream-ops.ts: re-exports from .web.ts (future: conditional branch)
- debug-channel-server.web.ts: web debug channel implementation
- debug-channel-server.ts: re-exports from .web.ts (future: conditional branch)
- node-web-streams-helper.ts: add createRuntimePrefetchTransformStream

Pure code motion with no behavior changes. Web paths produce identical output.
@timneutkens timneutkens force-pushed the feedthejim/node-stream-02-extract branch from 258bc9f to 488d4c7 Compare February 23, 2026 10:02
@timneutkens timneutkens merged commit 9b6e563 into canary Feb 23, 2026
158 checks passed
@timneutkens timneutkens deleted the feedthejim/node-stream-02-extract branch February 23, 2026 10:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants