Skip to content

feat: use fast-webstreams for server rendering#89686

Draft
feedthejim wants to merge 5 commits intocanaryfrom
feedthejim/fast-webstreams
Draft

feat: use fast-webstreams for server rendering#89686
feedthejim wants to merge 5 commits intocanaryfrom
feedthejim/fast-webstreams

Conversation

@feedthejim
Copy link
Copy Markdown
Contributor

Summary

Replace global WebStream constructors (ReadableStream, WritableStream, TransformStream) with faster Node.js-backed implementations from experimental-fast-webstreams. The patching happens synchronously in node-environment-baseline.ts before any rendering code loads.

This is a zero-application-code-change approach: just patchGlobalWebStreams() replaces the globals, and all existing WebStream-based code in Next.js automatically uses the faster implementations.

What changed

  • Added experimental-fast-webstreams@0.0.5 as devDependency with a pnpm patch for bug fixes
  • Added ncc_fast_webstreams task in taskfile.js to bundle the ESM package into CJS at dist/compiled/fast-webstreams/patch.js
  • Added patchGlobalWebStreams() call in node-environment-baseline.ts (runs before any other server code)

Vendored fixes (upstream PR: vercel-labs/fast-webstreams#1)

  1. Bug fix: specPipeTo dropped chunks enqueued during TransformStream.flush(). The reader.closed promise resolved before the pump drained buffered data, causing premature shutdown. Fix: move close-shutdown from reader.closed handler to pump's done-detection.

  2. Perf optimization: Batch sync reads in specPipeTo. Instead of yielding via queueMicrotask after every chunk, drain all buffered chunks in one loop before yielding.

Benchmark: Next.js force-dynamic page (4KB response)

Single client (c=1, 10s)

Mode req/s vs baseline
Web Streams (native) 611
Fast WebStreams (this PR) 1,011 +65%
Node Streams (full rewrite) 1,327 +117%

Under load (c=100, 10s)

Mode req/s p99 latency vs baseline
Web Streams (native) 1,167 144ms
Fast WebStreams (this PR) 1,128 113ms -3% throughput, -22% p99
Node Streams (full rewrite) 1,611 86ms +38%, -40% p99

Test plan

  • pnpm --filter=next build succeeds
  • require('next/dist/compiled/fast-webstreams/patch.js') exports patchGlobalWebStreams
  • Upstream test suite passes: 36/36 (7 new regression tests + 29 existing)
  • CI: all existing tests pass with patched globals

@nextjs-bot
Copy link
Copy Markdown
Collaborator

nextjs-bot commented Feb 8, 2026

Failing test suites

Commit: 6e32119 | About building and testing Next.js

pnpm test test/unit/eslint-config-next/typescript/eslint-config-next-typescript.test.ts (job)

  • eslint-config-next > should match expected resolved configuration (DD)
Expand output

● eslint-config-next › should match expected resolved configuration

SyntaxError: Unexpected token ' ', " WARN  Uns"... is not valid JSON
    at JSON.parse (<anonymous>)

  15 |     )
  16 |
> 17 |     const { settings, languageOptions, ...eslintConfigAfterSetup } = JSON.parse(
     |                                                                           ^
  18 |       eslintConfigAfterSetupJSON
  19 |     )
  20 |

  at Object.parse (unit/eslint-config-next/default/eslint-config-next-default.test.ts:17:75)

pnpm test test/integration/server-side-dev-errors/test/index.test.ts (turbopack) (job)

  • server-side dev errors > should show server-side error for gsp page correctly (DD)
  • server-side dev errors > should show server-side error for gssp page correctly (DD)
  • server-side dev errors > should show server-side error for dynamic gssp page correctly (DD)
  • server-side dev errors > should show server-side error for api route correctly (DD)
  • server-side dev errors > should show server-side error for dynamic api route correctly (DD)
Expand output

● server-side dev errors › should show server-side error for gsp page correctly

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for gsp page correctly 1`

- Snapshot  - 2
+ Received  + 2

  {
    "description": "missingVar is not defined",
    "environmentLabel": null,
    "label": "Runtime ReferenceError",
-   "source": "pages/gsp.js (6:3) @ getStaticProps
+   "source": "../../test/integration/server-side-dev-errors/pages/gsp.js (6:3) @ getStaticProps
  > 6 |   missingVar;return {
      |   ^",
    "stack": [
-     "getStaticProps pages/gsp.js (6:3)",
+     "getStaticProps ../../test/integration/server-side-dev-errors/pages/gsp.js (6:3)",
    ],
  }

  84 |       )
  85 |
> 86 |       await expect(browser).toDisplayRedbox(`
     |                             ^
  87 |         {
  88 |           "description": "missingVar is not defined",
  89 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.ts:86:29)

● server-side dev errors › should show server-side error for gssp page correctly

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for gssp page correctly 1`

- Snapshot  - 2
+ Received  + 2

  {
    "description": "missingVar is not defined",
    "environmentLabel": null,
    "label": "Runtime ReferenceError",
-   "source": "pages/gssp.js (6:3) @ getServerSideProps
+   "source": "../../test/integration/server-side-dev-errors/pages/gssp.js (6:3) @ getServerSideProps
  > 6 |   missingVar;return {
      |   ^",
    "stack": [
-     "getServerSideProps pages/gssp.js (6:3)",
+     "getServerSideProps ../../test/integration/server-side-dev-errors/pages/gssp.js (6:3)",
    ],
  }

  134 |       )
  135 |
> 136 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  137 |         {
  138 |           "description": "missingVar is not defined",
  139 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.ts:136:29)

● server-side dev errors › should show server-side error for dynamic gssp page correctly

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for dynamic gssp page correctly 1`

- Snapshot  - 2
+ Received  + 2

  {
    "description": "missingVar is not defined",
    "environmentLabel": null,
    "label": "Runtime ReferenceError",
-   "source": "pages/blog/[slug].js (6:3) @ getServerSideProps
+   "source": "../../test/integration/server-side-dev-errors/pages/blog/[slug].js (6:3) @ getServerSideProps
  > 6 |   missingVar;return {
      |   ^",
    "stack": [
-     "getServerSideProps pages/blog/[slug].js (6:3)",
+     "getServerSideProps ../../test/integration/server-side-dev-errors/pages/blog/[slug].js (6:3)",
    ],
  }

  184 |       )
  185 |
> 186 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  187 |         {
  188 |           "description": "missingVar is not defined",
  189 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.ts:186:29)

● server-side dev errors › should show server-side error for api route correctly

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for api route correctly 1`

- Snapshot  - 2
+ Received  + 2

  {
    "description": "missingVar is not defined",
    "environmentLabel": null,
    "label": "Runtime ReferenceError",
-   "source": "pages/api/hello.js (2:3) @ handler
+   "source": "../../test/integration/server-side-dev-errors/pages/api/hello.js (2:3) @ handler
  > 2 |   missingVar;res.status(200).json({ hello: 'world' })
      |   ^",
    "stack": [
-     "handler pages/api/hello.js (2:3)",
+     "handler ../../test/integration/server-side-dev-errors/pages/api/hello.js (2:3)",
    ],
  }

  244 |       }
  245 |
> 246 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  247 |         {
  248 |           "description": "missingVar is not defined",
  249 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.ts:246:29)

● server-side dev errors › should show server-side error for dynamic api route correctly

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for dynamic api route correctly 1`

- Snapshot  - 2
+ Received  + 2

  {
    "description": "missingVar is not defined",
    "environmentLabel": null,
    "label": "Runtime ReferenceError",
-   "source": "pages/api/blog/[slug].js (2:3) @ handler
+   "source": "../../test/integration/server-side-dev-errors/pages/api/blog/[slug].js (2:3) @ handler
  > 2 |   missingVar;res.status(200).json({ slug: req.query.slug })
      |   ^",
    "stack": [
-     "handler pages/api/blog/[slug].js (2:3)",
+     "handler ../../test/integration/server-side-dev-errors/pages/api/blog/[slug].js (2:3)",
    ],
  }

  310 |       }
  311 |
> 312 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  313 |         {
  314 |           "description": "missingVar is not defined",
  315 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.ts:312:29)

pnpm test-dev test/e2e/app-dir/server-source-maps/server-source-maps.test.ts (job)

  • app-dir - server source maps > handles invalid sourcemaps gracefully (DD)
Expand output

● app-dir - server source maps › handles invalid sourcemaps gracefully

expect(received).toContain(expected) // indexOf

Expected substring: "
webpack-internal:///(rsc)/./app/bad-sourcemap/page.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: TypeError [ERR_INVALID_ARG_TYPE]: The \"payload\" argument must be of type object. Received null
Error: bad-sourcemap

  at logError (webpack-internal:///(rsc)../../../../../../app/bad-sourcemap/page.js:12:19)
  at Page (webpack-internal:///(rsc)../../../../../../app/bad-sourcemap/page.js:15:5)"
  Received string:    "⚠ Fast Refresh had to perform a full reload due to a runtime error.
  ⚠ Fast Refresh had to perform a full reload due to a runtime error.
  Error: bad-sourcemap
  at logError (webpack-internal:///(rsc)../../../../../../app/bad-sourcemap/page.js:12:19)
  at Page (webpack-internal:///(rsc)../../../../../../app/bad-sourcemap/page.js:15:5)
  ⨯ Error: ssr-throw
  at throwError (../app/ssr-throw/Thrower.js:4:9)
  at Thrower (../app/ssr-throw/Thrower.js:8:3)
    2 |
    3 | function throwError() {
  > 4 |   throw new Error('ssr-throw')
      |         ^
    5 | }
    6 |
    7 | export function Thrower() { {
    digest: '1976948337'
  }
   GET /bad-sourcemap 200 in 528ms (compile: 428ms, render: 100ms)
  "
  at Object.toContain (e2e/app-dir/server-source-maps/server-source-maps.test.ts:541:71)

pnpm test-start-turbo test/production/next-server-nft/next-server-nft.test.ts (turbopack) (job)

  • next-server-nft > with output:standalone > should not trace too many files in next-server.js.nft.json (DD)
Expand output

● next-server-nft › with output:standalone › should not trace too many files in next-server.js.nft.json

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `next-server-nft with output:standalone should not trace too many files in next-server.js.nft.json 1`

- Snapshot  - 0
+ Received  + 1

@@ -53,10 +53,11 @@
    "/node_modules/next/dist/compiled/content-disposition/index.js",
    "/node_modules/next/dist/compiled/cookie/index.js",
    "/node_modules/next/dist/compiled/cross-spawn/index.js",
    "/node_modules/next/dist/compiled/debug/index.js",
    "/node_modules/next/dist/compiled/edge-runtime/index.js",
+   "/node_modules/next/dist/compiled/fast-webstreams/patch.js",
    "/node_modules/next/dist/compiled/find-up/index.js",
    "/node_modules/next/dist/compiled/fresh/index.js",
    "/node_modules/next/dist/compiled/http-proxy/index.js",
    "/node_modules/next/dist/compiled/image-detector/detector.js",
    "/node_modules/next/dist/compiled/image-size/index.js",

  126 |         ]
  127 |
> 128 |         expect(traceGrouped).toMatchInlineSnapshot(`
      |                              ^
  129 |          [
  130 |            "/node_modules/@img/colour/*",
  131 |            "/node_modules/@img/sharp-*/sharp-*.node",

  at Object.toMatchInlineSnapshot (production/next-server-nft/next-server-nft.test.ts:128:30)

pnpm test-dev test/e2e/app-dir/instant-navigation-testing-api/instant-navigation-testing-api.test.ts (job)

  • instant-navigation-testing-api > renders static shell on MPA navigation via plain anchor (DD)
  • instant-navigation-testing-api > reload followed by MPA navigation, both block dynamic data (DD)
  • instant-navigation-testing-api > successive MPA navigations within instant scope (DD)
Expand output

● instant-navigation-testing-api › renders static shell on MPA navigation via plain anchor

locator.waitFor: Timeout 10000ms exceeded.
Call log:
  - waiting for locator('[data-testid="dynamic-content"]') to be visible

  240 |     // After exiting the instant scope, dynamic content streams in
  241 |     const dynamicContent = page.locator('[data-testid="dynamic-content"]')
> 242 |     await dynamicContent.waitFor({ state: 'visible', timeout: 10000 })
      |                          ^
  243 |     expect(await dynamicContent.textContent()).toContain(
  244 |       'Dynamic content loaded'
  245 |     )

  at Object.waitFor (e2e/app-dir/instant-navigation-testing-api/instant-navigation-testing-api.test.ts:242:26)

● instant-navigation-testing-api › reload followed by MPA navigation, both block dynamic data

locator.waitFor: Timeout 60000ms exceeded.
Call log:
  - waiting for locator('[data-testid="dynamic-content"]') to be visible

  271 |     // After exiting the instant scope, dynamic content streams in
  272 |     const dynamicContent = page.locator('[data-testid="dynamic-content"]')
> 273 |     await dynamicContent.waitFor({ state: 'visible' })
      |                          ^
  274 |     expect(await dynamicContent.textContent()).toContain(
  275 |       'Dynamic content loaded'
  276 |     )

  at Object.waitFor (e2e/app-dir/instant-navigation-testing-api/instant-navigation-testing-api.test.ts:273:26)

● instant-navigation-testing-api › successive MPA navigations within instant scope

locator.waitFor: Timeout 60000ms exceeded.
Call log:
  - waiting for locator('[data-testid="dynamic-content"]') to be visible

  311 |     // After exiting instant scope, dynamic content streams in
  312 |     const dynamicContent = page.locator('[data-testid="dynamic-content"]')
> 313 |     await dynamicContent.waitFor({ state: 'visible' })
      |                          ^
  314 |     expect(await dynamicContent.textContent()).toContain(
  315 |       'Dynamic content loaded'
  316 |     )

  at Object.waitFor (e2e/app-dir/instant-navigation-testing-api/instant-navigation-testing-api.test.ts:313:26)

pnpm test-start test/e2e/app-dir/ppr-root-param-fallback/ppr-root-param-fallback.test.ts (job)

  • ppr-root-param-fallback > should have use-cache content in fallback shells for all pregenerated locales (DD)
Expand output

● ppr-root-param-fallback › should have use-cache content in fallback shells for all pregenerated locales

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  50 |       }
  51 |
> 52 |       const result = Reflect.apply(target, thisArg, args)
     |                              ^
  53 |       return typeof result === 'function' ? wrapJestTestFn(result) : result
  54 |     },
  55 |     get(target, prop, receiver) {

  at Object.apply (lib/e2e-utils/index.ts:52:30)
  at it (e2e/app-dir/ppr-root-param-fallback/ppr-root-param-fallback.test.ts:8:3)
  at Object.describe (e2e/app-dir/ppr-root-param-fallback/ppr-root-param-fallback.test.ts:3:1)

pnpm test-start test/e2e/app-dir/autoscroll-with-css-modules/index.test.ts (job)

  • searchparams-reuse-loading > should re-use the prefetched loading state when navigating to a new searchParam value (DD)
Expand output

● searchparams-reuse-loading › should re-use the prefetched loading state when navigating to a new searchParam value

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  50 |       }
  51 |
> 52 |       const result = Reflect.apply(target, thisArg, args)
     |                              ^
  53 |       return typeof result === 'function' ? wrapJestTestFn(result) : result
  54 |     },
  55 |     get(target, prop, receiver) {

  at Object.apply (lib/e2e-utils/index.ts:52:30)
  at it (e2e/app-dir/searchparams-reuse-loading/searchparams-reuse-loading.test.ts:9:3)
  at Object.describe (e2e/app-dir/searchparams-reuse-loading/searchparams-reuse-loading.test.ts:4:1)

pnpm test-start-turbo test/e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts (turbopack) (job)

  • PPR - partial hydration > No static shell, no streaming metadata > should produce a valid HTML document (DD)
  • PPR - partial hydration > No static shell, streaming metadata > should produce a valid HTML document (DD)
  • PPR - partial hydration > Static shell, no streaming metadata > should produce a valid HTML document (DD)
  • PPR - partial hydration > Static shell, streaming metadata > should hydrate the shell without waiting for slow suspense boundaries (DD)
  • PPR - partial hydration > Static shell, streaming metadata > should produce a valid HTML document (DD)
  • PPR - partial hydration > Static shell, streaming metadata > should display the shell without JS (DD)
Expand output

● PPR - partial hydration › Static shell, no streaming metadata › should produce a valid HTML document

expect(received).toEndWith(expected)

Expected string to end with:
  "</body></html>"
Received:
  "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/38680a0b28b6f47f.js\"/><script src=\"/_next/static/chunks/8061739bc534d45b.js\" async=\"\"></script><script src=\"/_next/static/chunks/22a615e8954be7fa.js\" async=\"\"></script><script src=\"/_next/static/chunks/turbopack-a406616a58798fe6.js\" async=\"\"></script><script src=\"/_next/static/chunks/f2c4350bd1689ac4.js\" async=\"\"></script><script src=\"/_next/static/chunks/0af28e50b9ffe91e.js\" async=\"\"></script><script src=\"/_next/static/chunks/712526575ec20134.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$--><!--/$--></div><!--&--><!--&--><!--&--><main id=\"shell\"><h1>This is a page with static shell + no streaming metadata</h1><div><p>Static shell</p><div id=\"shell-hydrated\" data-is-hydrated=\"false\">⚪ Not hydrated yet</div><hr/><!--$?--><template id=\"B:0\"></template><div id=\"dynamic-fallback\">Loading...</div><!--/$--></div></main><!--$--><!--/$--><!--/&--><!--/&--><!--/&--><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src=\"/_next/static/chunks/38680a0b28b6f47f.js\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[76018,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"default\\\"]\\n3:I[84105,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"default\\\"]\\n4:I[14961,[\\\"/_next/static/chunks/0af28e50b9ffe91e.js\\\"],\\\"HydrationIndicator\\\"]\\n5:\\\"$Sreact.suspense\\\"\\n7:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"OutletBoundary\\\"]\\na:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"ViewportBoundary\\\"]\\nc:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"MetadataBoundary\\\"]\\ne:I[12134,[],\\\"default\\\",1]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"c\\\":[\\\"\\\",\\\"with-shell\\\",\\\"without-metadata\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"with-shell\\\",{\\\"children\\\":[\\\"without-metadata\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",16]}],[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"}]}]]}]}]],[]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[\\\"$\\\",\\\"main\\\",null,{\\\"id\\\":\\\"shell\\\",\\\"children\\\":[[\\\"$\\\",\\\"h1\\\",null,{\\\"children\\\":\\\"This is a page with static shell + no streaming metadata\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"p\\\",null,{\\\"children\\\":\\\"Static shell\\\"}],[\\\"$\\\",\\\"$L4\\\",null,{\\\"id\\\":\\\"shell-hydrated\\\"}],[\\\"$\\\",\\\"hr\\\",null,{}],[\\\"$\\\",\\\"$5\\\",null,{\\\"fallback\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"id\\\":\\\"dynamic-fallback\\\",\\\"children\\\":\\\"Loading...\\\"}],\\\"children\\\":\\\"$L6\\\"}]]}]]}],[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/0af28e50b9ffe91e.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"$L7\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$5\\\",null,{\\\"name\\\":\\\"Next.MetadataOutlet\\\",\\\"children\\\":\\\"$@8\\\"}]}]]}],{},null,false,null]},null,false,\\\"$@9\\\"]},null,false,null]},null,false,\\\"$@9\\\"],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$La\\\",null,{\\\"children\\\":\\\"$Lb\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$Lc\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$5\\\",null,{\\\"name\\\":\\\"Next.Metadata\\\",\\\"children\\\":\\\"$Ld\\\"}]}]}],null]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$e\\\",[]],\\\"S\\\":false,\\\"h\\\":null,\\\"b\\\":\\\"POzRejx0MugQ9u3ajROic\\\"}\\n\"])</script><script>self.__next_f.push([1,\"f:[]\\n9:\\\"$Wf\\\"\\nb:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n8:null\\nd:[]\\n\"])</script><script>self.__next_f.push([1,\"6:[\\\"$\\\",\\\"div\\\",null,{\\\"id\\\":\\\"dynamic\\\",\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":\\\"Random value: 419\\\"}],[\\\"$\\\",\\\"$L4\\\",null,{\\\"id\\\":\\\"dynamic-hydrated\\\"}]]}]\\n\"])</script><script src=\"/_next/static/chunks/712526575ec20134.js\" noModule=\"\"></script><div hidden id=\"S:0\"><div id=\"dynamic\"><div>Random value: 419</div><div id=\"dynamic-hydrated\" data-is-hydrated=\"false\">⚪ Not hydrated yet</div></div></div><script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if(\"/$\"===d||\"/&\"===d)if(0===h)break;else h--;else\"$\"!==d&&\"$?\"!==d&&\"$~\"!==d&&\"$!\"!==d&&\"&\"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data=\"$\";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data=\"$~\",$RB.push(a,b),2===$RB.length&&(\"number\"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC(\"B:0\",\"S:0\")</script>"

  123 |       await next.patchFile('slowComponentReady', 'marker file', async () => {
  124 |         await retry(() => {
> 125 |           expect(body).toEndWith('</body></html>')
      |                        ^
  126 |         })
  127 |       })
  128 |     })

  at toEndWith (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:125:24)
  at fn (lib/next-test-utils.ts:831:20)
  at e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:124:9
  at NextStartInstance.patchFile (lib/next-modes/base.ts:742:9)
  at Object.<anonymous> (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:123:7)

● PPR - partial hydration › Static shell, streaming metadata › should hydrate the shell without waiting for slow suspense boundaries

page.waitForSelector: Timeout 10ms exceeded.
Call log:
  - waiting for locator('#shell-hydrated') to be visible
  -   locator resolved to visible <div id="shell-hydrated" data-is-hydrated="true">🟢 Hydrated</div>

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss (lib/browsers/playwright.ts:413:17)
  at elementByCssInstant (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:82:18)
  at fn (lib/next-test-utils.ts:831:20)
  at e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:77:9
  at NextStartInstance.patchFile (lib/next-modes/base.ts:742:9)
  at Object.<anonymous> (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:76:7)
  at Proxy._chain (lib/browsers/playwright.ts:651:23)
  at Proxy._chain (lib/browsers/playwright.ts:627:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:455:17)
  at getAttribute (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:83:18)
  at fn (lib/next-test-utils.ts:831:20)
  at e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:77:9
  at NextStartInstance.patchFile (lib/next-modes/base.ts:742:9)
  at Object.<anonymous> (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:76:7)

● PPR - partial hydration › Static shell, streaming metadata › should produce a valid HTML document

expect(received).toEndWith(expected)

Expected string to end with:
  "</body></html>"
Received:
  "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/38680a0b28b6f47f.js\"/><script src=\"/_next/static/chunks/8061739bc534d45b.js\" async=\"\"></script><script src=\"/_next/static/chunks/22a615e8954be7fa.js\" async=\"\"></script><script src=\"/_next/static/chunks/turbopack-a406616a58798fe6.js\" async=\"\"></script><script src=\"/_next/static/chunks/f2c4350bd1689ac4.js\" async=\"\"></script><script src=\"/_next/static/chunks/0af28e50b9ffe91e.js\" async=\"\"></script><script src=\"/_next/static/chunks/712526575ec20134.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$?--><template id=\"B:0\"></template><!--/$--></div><!--&--><!--&--><!--&--><main id=\"shell\"><h1>This is a page with static shell + streaming metadata</h1><div><p>Static shell</p><div id=\"shell-hydrated\" data-is-hydrated=\"false\">⚪ Not hydrated yet</div><hr/><!--$?--><template id=\"B:1\"></template><div id=\"dynamic-fallback\">Loading...</div><!--/$--></div></main><!--$?--><template id=\"B:2\"></template><!--/$--><!--/&--><!--/&--><!--/&--><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src=\"/_next/static/chunks/38680a0b28b6f47f.js\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script src=\"/_next/static/chunks/712526575ec20134.js\" noModule=\"\"></script><title>Resume test</title><div hidden id=\"S:2\"></div><script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if(\"/$\"===d||\"/&\"===d)if(0===h)break;else h--;else\"$\"!==d&&\"$?\"!==d&&\"$~\"!==d&&\"$!\"!==d&&\"&\"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data=\"$\";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data=\"$~\",$RB.push(a,b),2===$RB.length&&(\"number\"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC(\"B:2\",\"S:2\")</script><div hidden id=\"S:0\"></div><script>$RC(\"B:0\",\"S:0\")</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[76018,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"default\\\"]\\n3:I[84105,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"default\\\"]\\n4:I[14961,[\\\"/_next/static/chunks/0af28e50b9ffe91e.js\\\"],\\\"HydrationIndicator\\\"]\\n5:\\\"$Sreact.suspense\\\"\\n7:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"OutletBoundary\\\"]\\na:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"ViewportBoundary\\\"]\\nc:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"MetadataBoundary\\\"]\\ne:I[12134,[],\\\"default\\\",1]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"c\\\":[\\\"\\\",\\\"with-shell\\\",\\\"with-streaming-metadata\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"with-shell\\\",{\\\"children\\\":[\\\"with-streaming-metadata\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",16]}],[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"}]}]]}]}]],[]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[\\\"$\\\",\\\"main\\\",null,{\\\"id\\\":\\\"shell\\\",\\\"children\\\":[[\\\"$\\\",\\\"h1\\\",null,{\\\"children\\\":\\\"This is a page with static shell + streaming metadata\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"p\\\",null,{\\\"children\\\":\\\"Static shell\\\"}],[\\\"$\\\",\\\"$L4\\\",null,{\\\"id\\\":\\\"shell-hydrated\\\"}],[\\\"$\\\",\\\"hr\\\",null,{}],[\\\"$\\\",\\\"$5\\\",null,{\\\"fallback\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"id\\\":\\\"dynamic-fallback\\\",\\\"children\\\":\\\"Loading...\\\"}],\\\"children\\\":\\\"$L6\\\"}]]}]]}],[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/0af28e50b9ffe91e.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"$L7\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$5\\\",null,{\\\"name\\\":\\\"Next.MetadataOutlet\\\",\\\"children\\\":\\\"$@8\\\"}]}]]}],{},null,false,null]},null,false,\\\"$@9\\\"]},null,false,null]},null,false,\\\"$@9\\\"],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$La\\\",null,{\\\"children\\\":\\\"$Lb\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$Lc\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$5\\\",null,{\\\"name\\\":\\\"Next.Metadata\\\",\\\"children\\\":\\\"$Ld\\\"}]}]}],null]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$e\\\",[]],\\\"S\\\":false,\\\"h\\\":null,\\\"b\\\":\\\"POzRejx0MugQ9u3ajROic\\\"}\\n\"])</script><script>self.__next_f.push([1,\"f:[]\\n9:\\\"$Wf\\\"\\nb:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n8:null\\nd:[[\\\"$\\\",\\\"title\\\",\\\"0\\\",{\\\"children\\\":\\\"Resume test\\\"}]]\\n\"])</script><script>self.__next_f.push([1,\"6:[\\\"$\\\",\\\"div\\\",null,{\\\"id\\\":\\\"dynamic\\\",\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":\\\"Random value: 433\\\"}],[\\\"$\\\",\\\"$L4\\\",null,{\\\"id\\\":\\\"dynamic-hydrated\\\"}]]}]\\n\"])</script>"

  123 |       await next.patchFile('slowComponentReady', 'marker file', async () => {
  124 |         await retry(() => {
> 125 |           expect(body).toEndWith('</body></html>')
      |                        ^
  126 |         })
  127 |       })
  128 |     })

  at toEndWith (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:125:24)
  at fn (lib/next-test-utils.ts:831:20)
  at e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:124:9
  at NextStartInstance.patchFile (lib/next-modes/base.ts:742:9)
  at Object.<anonymous> (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:123:7)

● PPR - partial hydration › Static shell, streaming metadata › should display the shell without JS

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  50 |       }
  51 |
> 52 |       const result = Reflect.apply(target, thisArg, args)
     |                              ^
  53 |       return typeof result === 'function' ? wrapJestTestFn(result) : result
  54 |     },
  55 |     get(target, prop, receiver) {

  at Object.apply (lib/e2e-utils/index.ts:52:30)
  at it (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:130:5)
      at Array.forEach (<anonymous>)
  at e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:46:4
  at Object.describe (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:10:1)

● PPR - partial hydration › No static shell, no streaming metadata › should produce a valid HTML document

expect(received).toEndWith(expected)

Expected string to end with:
  "</body></html>"
Received:
  "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/38680a0b28b6f47f.js\"/><script src=\"/_next/static/chunks/8061739bc534d45b.js\" async=\"\"></script><script src=\"/_next/static/chunks/22a615e8954be7fa.js\" async=\"\"></script><script src=\"/_next/static/chunks/turbopack-a406616a58798fe6.js\" async=\"\"></script><script src=\"/_next/static/chunks/f2c4350bd1689ac4.js\" async=\"\"></script><script src=\"/_next/static/chunks/0af28e50b9ffe91e.js\" async=\"\"></script><script src=\"/_next/static/chunks/712526575ec20134.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$--><!--/$--></div><!--&--><!--$--><!--html--><!--body--><!--&--><!--&--><main id=\"shell\"><h1>This is a page with no static shell + no streaming metadata</h1><div><p>Dynamic shell</p><div id=\"shell-hydrated\" data-is-hydrated=\"false\">⚪ Not hydrated yet</div><hr/><!--$?--><template id=\"B:0\"></template><div id=\"dynamic-fallback\">Loading...</div><!--/$--></div></main><!--$--><!--/$--><!--/&--><!--/&--><!--/$--><!--/&--><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src=\"/_next/static/chunks/38680a0b28b6f47f.js\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[76018,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"default\\\"]\\n3:I[84105,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"default\\\"]\\n4:\\\"$Sreact.suspense\\\"\\n6:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"OutletBoundary\\\"]\\n9:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"ViewportBoundary\\\"]\\nb:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"MetadataBoundary\\\"]\\nd:I[12134,[],\\\"default\\\",1]\\nf:I[14961,[\\\"/_next/static/chunks/0af28e50b9ffe91e.js\\\"],\\\"HydrationIndicator\\\"]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"c\\\":[\\\"\\\",\\\"without-shell\\\",\\\"without-metadata\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"without-shell\\\",{\\\"children\\\":[\\\"without-metadata\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",16]}],[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"}]}]]}]}]],[]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$4\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]}]}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[\\\"$L5\\\",[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/0af28e50b9ffe91e.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"$L6\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$4\\\",null,{\\\"name\\\":\\\"Next.MetadataOutlet\\\",\\\"children\\\":\\\"$@7\\\"}]}]]}],{},null,false,null]},null,false,\\\"$@8\\\"]},null,false,null]},null,false,\\\"$@8\\\"],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L9\\\",null,{\\\"children\\\":\\\"$La\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$Lb\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$4\\\",null,{\\\"name\\\":\\\"Next.Metadata\\\",\\\"children\\\":\\\"$Lc\\\"}]}]}],null]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$d\\\",[]],\\\"S\\\":false,\\\"h\\\":null,\\\"b\\\":\\\"POzRejx0MugQ9u3ajROic\\\"}\\n\"])</script><script>self.__next_f.push([1,\"e:[]\\n8:\\\"$We\\\"\\n5:[\\\"$\\\",\\\"main\\\",null,{\\\"id\\\":\\\"shell\\\",\\\"children\\\":[[\\\"$\\\",\\\"h1\\\",null,{\\\"children\\\":\\\"This is a page with no static shell + no streaming metadata\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"p\\\",null,{\\\"children\\\":\\\"Dynamic shell\\\"}],[\\\"$\\\",\\\"$Lf\\\",null,{\\\"id\\\":\\\"shell-hydrated\\\"}],[\\\"$\\\",\\\"hr\\\",null,{}],[\\\"$\\\",\\\"$4\\\",null,{\\\"fallback\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"id\\\":\\\"dynamic-fallback\\\",\\\"children\\\":\\\"Loading...\\\"}],\\\"children\\\":\\\"$L10\\\"}]]}]]}]\\na:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n7:null\\nc:[]\\n\"])</script><script>self.__next_f.push([1,\"10:[\\\"$\\\",\\\"div\\\",null,{\\\"id\\\":\\\"dynamic\\\",\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":\\\"Random value: 302\\\"}],[\\\"$\\\",\\\"$Lf\\\",null,{\\\"id\\\":\\\"dynamic-hydrated\\\"}]]}]\\n\"])</script><div hidden id=\"S:0\"><div id=\"dynamic\"><div>Random value: 302</div><div id=\"dynamic-hydrated\" data-is-hydrated=\"false\">⚪ Not hydrated yet</div></div></div><script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if(\"/$\"===d||\"/&\"===d)if(0===h)break;else h--;else\"$\"!==d&&\"$?\"!==d&&\"$~\"!==d&&\"$!\"!==d&&\"&\"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data=\"$\";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data=\"$~\",$RB.push(a,b),2===$RB.length&&(\"number\"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC(\"B:0\",\"S:0\")</script>"

  123 |       await next.patchFile('slowComponentReady', 'marker file', async () => {
  124 |         await retry(() => {
> 125 |           expect(body).toEndWith('</body></html>')
      |                        ^
  126 |         })
  127 |       })
  128 |     })

  at toEndWith (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:125:24)
  at fn (lib/next-test-utils.ts:831:20)
  at e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:124:9
  at NextStartInstance.patchFile (lib/next-modes/base.ts:742:9)
  at Object.<anonymous> (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:123:7)

● PPR - partial hydration › No static shell, streaming metadata › should produce a valid HTML document

expect(received).toEndWith(expected)

Expected string to end with:
  "</body></html>"
Received:
  "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/38680a0b28b6f47f.js\"/><script src=\"/_next/static/chunks/8061739bc534d45b.js\" async=\"\"></script><script src=\"/_next/static/chunks/22a615e8954be7fa.js\" async=\"\"></script><script src=\"/_next/static/chunks/turbopack-a406616a58798fe6.js\" async=\"\"></script><script src=\"/_next/static/chunks/f2c4350bd1689ac4.js\" async=\"\"></script><script src=\"/_next/static/chunks/0af28e50b9ffe91e.js\" async=\"\"></script><title>Resume test</title><script src=\"/_next/static/chunks/712526575ec20134.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$--><!--/$--></div><!--&--><!--$--><!--html--><!--body--><!--&--><!--&--><main id=\"shell\"><h1>This is a page with no static shell + with streaming metadata</h1><div><p>Dynamic shell</p><div id=\"shell-hydrated\" data-is-hydrated=\"false\">⚪ Not hydrated yet</div><hr/><!--$?--><template id=\"B:0\"></template><div id=\"dynamic-fallback\">Loading...</div><!--/$--></div></main><!--$--><!--/$--><!--/&--><!--/&--><!--/$--><!--/&--><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src=\"/_next/static/chunks/38680a0b28b6f47f.js\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[76018,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"default\\\"]\\n3:I[84105,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"default\\\"]\\n4:\\\"$Sreact.suspense\\\"\\n6:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"OutletBoundary\\\"]\\n9:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"ViewportBoundary\\\"]\\nb:I[73634,[\\\"/_next/static/chunks/f2c4350bd1689ac4.js\\\"],\\\"MetadataBoundary\\\"]\\nd:I[12134,[],\\\"default\\\",1]\\nf:I[14961,[\\\"/_next/static/chunks/0af28e50b9ffe91e.js\\\"],\\\"HydrationIndicator\\\"]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"c\\\":[\\\"\\\",\\\"without-shell\\\",\\\"with-streaming-metadata\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"without-shell\\\",{\\\"children\\\":[\\\"with-streaming-metadata\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",16]}],[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"}]}]]}]}]],[]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$4\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]}]}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[\\\"$L5\\\",[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/0af28e50b9ffe91e.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"$L6\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$4\\\",null,{\\\"name\\\":\\\"Next.MetadataOutlet\\\",\\\"children\\\":\\\"$@7\\\"}]}]]}],{},null,false,null]},null,false,\\\"$@8\\\"]},null,false,null]},null,false,\\\"$@8\\\"],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L9\\\",null,{\\\"children\\\":\\\"$La\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$Lb\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$4\\\",null,{\\\"name\\\":\\\"Next.Metadata\\\",\\\"children\\\":\\\"$Lc\\\"}]}]}],null]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$d\\\",[]],\\\"S\\\":false,\\\"h\\\":null,\\\"b\\\":\\\"POzRejx0MugQ9u3ajROic\\\"}\\n\"])</script><script>self.__next_f.push([1,\"e:[]\\n8:\\\"$We\\\"\\n5:[\\\"$\\\",\\\"main\\\",null,{\\\"id\\\":\\\"shell\\\",\\\"children\\\":[[\\\"$\\\",\\\"h1\\\",null,{\\\"children\\\":\\\"This is a page with no static shell + with streaming metadata\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"p\\\",null,{\\\"children\\\":\\\"Dynamic shell\\\"}],[\\\"$\\\",\\\"$Lf\\\",null,{\\\"id\\\":\\\"shell-hydrated\\\"}],[\\\"$\\\",\\\"hr\\\",null,{}],[\\\"$\\\",\\\"$4\\\",null,{\\\"fallback\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"id\\\":\\\"dynamic-fallback\\\",\\\"children\\\":\\\"Loading...\\\"}],\\\"children\\\":\\\"$L10\\\"}]]}]]}]\\na:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n7:null\\nc:[[\\\"$\\\",\\\"title\\\",\\\"0\\\",{\\\"children\\\":\\\"Resume test\\\"}]]\\n\"])</script><script>self.__next_f.push([1,\"10:[\\\"$\\\",\\\"div\\\",null,{\\\"id\\\":\\\"dynamic\\\",\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":\\\"Random value: 547\\\"}],[\\\"$\\\",\\\"$Lf\\\",null,{\\\"id\\\":\\\"dynamic-hydrated\\\"}]]}]\\n\"])</script><div hidden id=\"S:0\"><div id=\"dynamic\"><div>Random value: 547</div><div id=\"dynamic-hydrated\" data-is-hydrated=\"false\">⚪ Not hydrated yet</div></div></div><script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if(\"/$\"===d||\"/&\"===d)if(0===h)break;else h--;else\"$\"!==d&&\"$?\"!==d&&\"$~\"!==d&&\"$!\"!==d&&\"&\"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data=\"$\";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data=\"$~\",$RB.push(a,b),2===$RB.length&&(\"number\"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC(\"B:0\",\"S:0\")</script>"

  123 |       await next.patchFile('slowComponentReady', 'marker file', async () => {
  124 |         await retry(() => {
> 125 |           expect(body).toEndWith('</body></html>')
      |                        ^
  126 |         })
  127 |       })
  128 |     })

  at toEndWith (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:125:24)
  at fn (lib/next-test-utils.ts:831:20)
  at e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:124:9
  at NextStartInstance.patchFile (lib/next-modes/base.ts:742:9)
  at Object.<anonymous> (e2e/app-dir/ppr-partial-hydration/ppr-partial-hydration.test.ts:123:7)

pnpm test-start-turbo test/e2e/filesystem-cache/filesystem-cache.test.ts (turbopack) (job)

  • filesystem-caching with cache enabled > should cache or not cache loaders (DD)
  • filesystem-caching with cache enabled > should allow to change files while stopped (RSC change) (DD)
  • filesystem-caching with cache enabled > should allow to change files while stopped (RCC change) (DD)
  • filesystem-caching with cache enabled > should allow to change files while stopped (Pages change) (DD)
  • filesystem-caching with cache enabled > should allow to change files while stopped (rename app page) (DD)
  • filesystem-caching with cache enabled > should allow to change files while stopped (next config change) (DD)
  • filesystem-caching with cache enabled > should allow to change files while stopped (env var change) (DD)
  • filesystem-caching with cache enabled > should allow to change files while stopped (RSC change, RCC change, Pages change, rename app page, next config change, env var change) (DD)
Expand output

● filesystem-caching with cache enabled › should cache or not cache loaders

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/filesystem-cache/filesystem-cache.test.ts:45:57
  at Object.describe (e2e/filesystem-cache/filesystem-cache.test.ts:29:3)

● filesystem-caching with cache enabled › should cache or not cache loaders

next instance is not initialized yet, make sure you call methods on next instance in test body.

  347 |     set: function (_target, key, value) {
  348 |       if (!next) {
> 349 |         throw new Error(
      |               ^
  350 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  351 |         )
  352 |       }

  at Object.set (lib/e2e-utils/index.ts:349:15)
  at Object.<anonymous> (e2e/filesystem-cache/filesystem-cache.test.ts:68:53)

● filesystem-caching with cache enabled › should cache or not cache loaders

next instance is not initialized yet, make sure you call methods on next instance in test body.

  338 |     get: function (_target, property) {
  339 |       if (!next) {
> 340 |         throw new Error(
      |               ^
  341 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  342 |         )
  343 |       }

  at Object.get (lib/e2e-utils/index.ts:340:15)
  at stop (e2e/filesystem-cache/filesystem-cache.test.ts:87:18)
  at Object.stop (e2e/filesystem-cache/filesystem-cache.test.ts:108:13)

● filesystem-caching with cache enabled › should allow to change files while stopped (RSC change)

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/filesystem-cache/filesystem-cache.test.ts:45:57
  at Object.describe (e2e/filesystem-cache/filesystem-cache.test.ts:29:3)

● filesystem-caching with cache enabled › should allow to change files while stopped (RSC change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  347 |     set: function (_target, key, value) {
  348 |       if (!next) {
> 349 |         throw new Error(
      |               ^
  350 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  351 |         )
  352 |       }

  at Object.set (lib/e2e-utils/index.ts:349:15)
  at Object.<anonymous> (e2e/filesystem-cache/filesystem-cache.test.ts:68:53)

● filesystem-caching with cache enabled › should allow to change files while stopped (RSC change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  338 |     get: function (_target, property) {
  339 |       if (!next) {
> 340 |         throw new Error(
      |               ^
  341 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  342 |         )
  343 |       }

  at Object.get (lib/e2e-utils/index.ts:340:15)
  at stop (e2e/filesystem-cache/filesystem-cache.test.ts:87:18)
  at Object.stop (e2e/filesystem-cache/filesystem-cache.test.ts:108:13)

● filesystem-caching with cache enabled › should allow to change files while stopped (RCC change)

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/filesystem-cache/filesystem-cache.test.ts:45:57
  at Object.describe (e2e/filesystem-cache/filesystem-cache.test.ts:29:3)

● filesystem-caching with cache enabled › should allow to change files while stopped (RCC change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  347 |     set: function (_target, key, value) {
  348 |       if (!next) {
> 349 |         throw new Error(
      |               ^
  350 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  351 |         )
  352 |       }

  at Object.set (lib/e2e-utils/index.ts:349:15)
  at Object.<anonymous> (e2e/filesystem-cache/filesystem-cache.test.ts:68:53)

● filesystem-caching with cache enabled › should allow to change files while stopped (RCC change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  338 |     get: function (_target, property) {
  339 |       if (!next) {
> 340 |         throw new Error(
      |               ^
  341 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  342 |         )
  343 |       }

  at Object.get (lib/e2e-utils/index.ts:340:15)
  at stop (e2e/filesystem-cache/filesystem-cache.test.ts:87:18)
  at Object.stop (e2e/filesystem-cache/filesystem-cache.test.ts:108:13)

● filesystem-caching with cache enabled › should allow to change files while stopped (Pages change)

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/filesystem-cache/filesystem-cache.test.ts:45:57
  at Object.describe (e2e/filesystem-cache/filesystem-cache.test.ts:29:3)

● filesystem-caching with cache enabled › should allow to change files while stopped (Pages change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  347 |     set: function (_target, key, value) {
  348 |       if (!next) {
> 349 |         throw new Error(
      |               ^
  350 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  351 |         )
  352 |       }

  at Object.set (lib/e2e-utils/index.ts:349:15)
  at Object.<anonymous> (e2e/filesystem-cache/filesystem-cache.test.ts:68:53)

● filesystem-caching with cache enabled › should allow to change files while stopped (Pages change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  338 |     get: function (_target, property) {
  339 |       if (!next) {
> 340 |         throw new Error(
      |               ^
  341 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  342 |         )
  343 |       }

  at Object.get (lib/e2e-utils/index.ts:340:15)
  at stop (e2e/filesystem-cache/filesystem-cache.test.ts:87:18)
  at Object.stop (e2e/filesystem-cache/filesystem-cache.test.ts:108:13)

● filesystem-caching with cache enabled › should allow to change files while stopped (rename app page)

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/filesystem-cache/filesystem-cache.test.ts:45:57
  at Object.describe (e2e/filesystem-cache/filesystem-cache.test.ts:29:3)

● filesystem-caching with cache enabled › should allow to change files while stopped (rename app page)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  347 |     set: function (_target, key, value) {
  348 |       if (!next) {
> 349 |         throw new Error(
      |               ^
  350 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  351 |         )
  352 |       }

  at Object.set (lib/e2e-utils/index.ts:349:15)
  at Object.<anonymous> (e2e/filesystem-cache/filesystem-cache.test.ts:68:53)

● filesystem-caching with cache enabled › should allow to change files while stopped (rename app page)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  338 |     get: function (_target, property) {
  339 |       if (!next) {
> 340 |         throw new Error(
      |               ^
  341 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  342 |         )
  343 |       }

  at Object.get (lib/e2e-utils/index.ts:340:15)
  at stop (e2e/filesystem-cache/filesystem-cache.test.ts:87:18)
  at Object.stop (e2e/filesystem-cache/filesystem-cache.test.ts:108:13)

● filesystem-caching with cache enabled › should allow to change files while stopped (next config change)

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/filesystem-cache/filesystem-cache.test.ts:45:57
  at Object.describe (e2e/filesystem-cache/filesystem-cache.test.ts:29:3)

● filesystem-caching with cache enabled › should allow to change files while stopped (next config change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  347 |     set: function (_target, key, value) {
  348 |       if (!next) {
> 349 |         throw new Error(
      |               ^
  350 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  351 |         )
  352 |       }

  at Object.set (lib/e2e-utils/index.ts:349:15)
  at Object.<anonymous> (e2e/filesystem-cache/filesystem-cache.test.ts:68:53)

● filesystem-caching with cache enabled › should allow to change files while stopped (next config change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  338 |     get: function (_target, property) {
  339 |       if (!next) {
> 340 |         throw new Error(
      |               ^
  341 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  342 |         )
  343 |       }

  at Object.get (lib/e2e-utils/index.ts:340:15)
  at stop (e2e/filesystem-cache/filesystem-cache.test.ts:87:18)
  at Object.stop (e2e/filesystem-cache/filesystem-cache.test.ts:108:13)

● filesystem-caching with cache enabled › should allow to change files while stopped (env var change)

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/filesystem-cache/filesystem-cache.test.ts:45:57
  at Object.describe (e2e/filesystem-cache/filesystem-cache.test.ts:29:3)

● filesystem-caching with cache enabled › should allow to change files while stopped (env var change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  347 |     set: function (_target, key, value) {
  348 |       if (!next) {
> 349 |         throw new Error(
      |               ^
  350 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  351 |         )
  352 |       }

  at Object.set (lib/e2e-utils/index.ts:349:15)
  at Object.<anonymous> (e2e/filesystem-cache/filesystem-cache.test.ts:68:53)

● filesystem-caching with cache enabled › should allow to change files while stopped (env var change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  338 |     get: function (_target, property) {
  339 |       if (!next) {
> 340 |         throw new Error(
      |               ^
  341 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  342 |         )
  343 |       }

  at Object.get (lib/e2e-utils/index.ts:340:15)
  at stop (e2e/filesystem-cache/filesystem-cache.test.ts:87:18)
  at Object.stop (e2e/filesystem-cache/filesystem-cache.test.ts:108:13)

● filesystem-caching with cache enabled › should allow to change files while stopped (RSC change, RCC change, Pages change, rename app page, next config change, env var change)

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/filesystem-cache/filesystem-cache.test.ts:45:57
  at Object.describe (e2e/filesystem-cache/filesystem-cache.test.ts:29:3)

● filesystem-caching with cache enabled › should allow to change files while stopped (RSC change, RCC change, Pages change, rename app page, next config change, env var change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  347 |     set: function (_target, key, value) {
  348 |       if (!next) {
> 349 |         throw new Error(
      |               ^
  350 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  351 |         )
  352 |       }

  at Object.set (lib/e2e-utils/index.ts:349:15)
  at Object.<anonymous> (e2e/filesystem-cache/filesystem-cache.test.ts:68:53)

● filesystem-caching with cache enabled › should allow to change files while stopped (RSC change, RCC change, Pages change, rename app page, next config change, env var change)

next instance is not initialized yet, make sure you call methods on next instance in test body.

  338 |     get: function (_target, property) {
  339 |       if (!next) {
> 340 |         throw new Error(
      |               ^
  341 |           'next instance is not initialized yet, make sure you call methods on next instance in test body.'
  342 |         )
  343 |       }

  at Object.get (lib/e2e-utils/index.ts:340:15)
  at stop (e2e/filesystem-cache/filesystem-cache.test.ts:87:18)
  at Object.stop (e2e/filesystem-cache/filesystem-cache.test.ts:108:13)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  205 |     if (nextInstance) {
  206 |       await nextInstance.destroy()
> 207 |       throw new Error(
      |             ^
  208 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  209 |       )
  210 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:207:13)

pnpm test-dev test/e2e/app-dir/nx-handling/nx-handling.test.ts (job)

  • nx-handling > should work for pages page (DD)
  • nx-handling > should work for pages API (DD)
  • nx-handling > should work with app page (DD)
  • nx-handling > should work with app route (DD)
Expand output

● nx-handling › should work for pages page

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work for pages API

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work with app page

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work with app route

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  205 |     if (nextInstance) {
  206 |       await nextInstance.destroy()
> 207 |       throw new Error(
      |             ^
  208 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  209 |       )
  210 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:207:13)

pnpm test-dev-turbo test/e2e/opentelemetry/instrumentation/opentelemetry.test.ts (turbopack) (job)

  • opentelemetry > incoming context propagation > app router > should handle RSC with fetch (DD)
  • opentelemetry > incoming context propagation > app router > should handle error in RSC (DD)
  • opentelemetry > incoming context propagation > app router > should handle error inside Suspense boundary (DD)
  • opentelemetry > incoming context propagation > pages > should handle getServerSideProps returning notFound (DD)
  • opentelemetry > root context > app router > should handle RSC with fetch (DD)
  • opentelemetry > root context > app router > should handle error in RSC (DD)
  • opentelemetry > root context > app router > should handle error inside Suspense boundary (DD)
  • opentelemetry > root context > pages > should handle getServerSideProps returning notFound (DD)
  • opentelemetry with custom server > should set attributes correctly on handleRequest span (DD)
  • opentelemetry with disabled fetch tracing > root context > app router with disabled fetch > should handle RSC with disabled fetch (DD)
Expand output

● opentelemetry › root context › app router › should handle RSC with fetch

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  - 19
+ Received  + 87

@@ -14,130 +14,198 @@
      "name": "GET /app/[param]/rsc-fetch",
      "parentId": undefined,
      "spans": Array [
        Object {
          "attributes": Object {
+           "next.clientComponentLoadCount": 8,
+           "next.span_type": "NextNodeServer.clientComponentLoading",
+         },
+         "events": Array [],
+         "id": "032638f1e5102fc1",
+         "kind": 0,
+         "links": Array [],
+         "name": "NextNodeServer.clientComponentLoading",
+         "parentId": "414c0aefc6131d76",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "[trace-id]",
+       },
+       Object {
+         "attributes": Object {
            "next.route": "/app/[param]/rsc-fetch",
            "next.span_name": "render route (app) /app/[param]/rsc-fetch",
            "next.span_type": "AppRender.getBodyResult",
          },
+         "events": Array [],
+         "id": "63746a82fb024bdb",
          "kind": 0,
+         "links": Array [],
          "name": "render route (app) /app/[param]/rsc-fetch",
+         "parentId": "414c0aefc6131d76",
+         "runtime": "nodejs",
          "spans": Array [
            Object {
              "attributes": Object {
                "next.span_name": "build component tree",
                "next.span_type": "NextNodeServer.createComponentTree",
              },
+             "events": Array [],
+             "id": "4a09a5a41e036f5e",
              "kind": 0,
+             "links": Array [],
              "name": "build component tree",
+             "parentId": "63746a82fb024bdb",
+             "runtime": "nodejs",
              "spans": Array [
                Object {
                  "attributes": Object {
                    "next.segment": "__PAGE__",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "e82d54645d46562c",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "4a09a5a41e036f5e",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
                Object {
                  "attributes": Object {
                    "next.segment": "[param]",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "7925a25aa35ab388",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "4a09a5a41e036f5e",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
              ],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
            Object {
              "attributes": Object {
                "http.method": "GET",
                "http.url": "https://example.vercel.sh/",
                "net.peer.name": "example.vercel.sh",
                "next.span_name": "fetch GET https://example.vercel.sh/",
                "next.span_type": "AppRender.fetch",
              },
+             "events": Array [],
+             "id": "95bc94415d29a12b",
              "kind": 2,
+             "links": Array [],
              "name": "fetch GET https://example.vercel.sh/",
+             "parentId": "63746a82fb024bdb",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/layout",
                "next.span_name": "generateMetadata /app/[param]/layout",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "6657e35d4fd9a2e9",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/layout",
+             "parentId": "63746a82fb024bdb",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/rsc-fetch/page",
                "next.span_name": "generateMetadata /app/[param]/rsc-fetch/page",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "1c05366bf95d1f55",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/rsc-fetch/page",
+             "parentId": "63746a82fb024bdb",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
-             },
              },
-           Object {
-             "attributes": Object {
-               "next.clientComponentLoadCount": 8,
-               "next.span_type": "NextNodeServer.clientComponentLoading",
+             "traceId": "[trace-id]",
            },
-             "kind": 0,
-             "name": "NextNodeServer.clientComponentLoading",
+         ],
          "status": Object {
            "code": 0,
          },
+         "traceId": "[trace-id]",
        },
        Object {
          "attributes": Object {
-               "next.span_name": "start response",
-               "next.span_type": "NextNodeServer.startResponse",
+           "next.route": "/app/[param]/rsc-fetch",
+           "next.span_name": "resolve page components",
+           "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "57f1471b75cbf5d3",
          "kind": 0,
-             "name": "start response",
-             "status": Object {
-               "code": 0,
-             },
-           },
-         ],
+         "links": Array [],
+         "name": "resolve page components",
+         "parentId": "414c0aefc6131d76",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "[trace-id]",
        },
        Object {
          "attributes": Object {
-           "next.route": "/app/[param]/rsc-fetch",
-           "next.span_name": "resolve page components",
-           "next.span_type": "NextNodeServer.findPageComponents",
+           "next.span_name": "start response",
+           "next.span_type": "NextNodeServer.startResponse",
          },
+         "events": Array [],
+         "id": "7d4952aa06a84b55",
          "kind": 0,
-         "name": "resolve page components",
+         "links": Array [],
+         "name": "start response",
+         "parentId": "414c0aefc6131d76",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "[trace-id]",
        },
      ],
      "status": Object {
        "code": 0,
      },

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:73:13)

● opentelemetry › root context › app router › should handle error in RSC

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  -  20
+ Received  + 101

@@ -15,116 +15,197 @@
      "name": "GET /app/[param]/rsc-fetch/error",
      "parentId": undefined,
      "spans": Array [
        Object {
          "attributes": Object {
+           "next.clientComponentLoadCount": 12,
+           "next.span_type": "NextNodeServer.clientComponentLoading",
+         },
+         "events": Array [],
+         "id": "2c3a262575e6c126",
+         "kind": 0,
+         "links": Array [],
+         "name": "NextNodeServer.clientComponentLoading",
+         "parentId": "9e8090d28aaeb658",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "[trace-id]",
+       },
+       Object {
+         "attributes": Object {
+           "error.type": "Error",
            "next.route": "/app/[param]/rsc-fetch/error",
            "next.span_name": "render route (app) /app/[param]/rsc-fetch/error",
            "next.span_type": "AppRender.getBodyResult",
+         },
+         "events": Array [
+           Object {
+             "attributes": Object {
+               "exception.message": "Error from Server Component",
+               "exception.stacktrace": "Error: Error from Server Component
+     at Page (/tmp/next-install-d63f954e228876695c86a888a9fc6ba801dfecbbc60c1c841b44206fe9498058/.next/dev/server/chunks/ssr/[root-of-the-server]__3e596755._.js:24:15)
+     at runNextTicks (node:internal/process/task_queues:60:5)
+     at listOnTimeout (node:internal/timers:545:9)
+     at process.processTimers (node:internal/timers:519:7)",
+               "exception.type": "Error",
+             },
+             "droppedAttributesCount": 0,
+             "name": "exception",
+             "time": Array [
+               1771873984,
+               428970598,
+             ],
            },
+         ],
+         "id": "de869c72db93835e",
          "kind": 0,
+         "links": Array [],
          "name": "render route (app) /app/[param]/rsc-fetch/error",
+         "parentId": "9e8090d28aaeb658",
+         "runtime": "nodejs",
          "spans": Array [
            Object {
              "attributes": Object {
                "next.span_name": "build component tree",
                "next.span_type": "NextNodeServer.createComponentTree",
              },
+             "events": Array [],
+             "id": "41146688086a6725",
              "kind": 0,
+             "links": Array [],
              "name": "build component tree",
+             "parentId": "de869c72db93835e",
+             "runtime": "nodejs",
              "spans": Array [
                Object {
                  "attributes": Object {
                    "next.segment": "__PAGE__",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "6238feda61ff9ff3",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "41146688086a6725",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
                Object {
                  "attributes": Object {
                    "next.segment": "[param]",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "f55b1978fa416e0e",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "41146688086a6725",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
              ],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/layout",
                "next.span_name": "generateMetadata /app/[param]/layout",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "4b316a91c3b781d2",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/layout",
+             "parentId": "de869c72db93835e",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/layout",
                "next.span_name": "generateMetadata /app/[param]/layout",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "0f9bd32aa55bd038",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/layout",
+             "parentId": "de869c72db93835e",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
-             },
              },
-           Object {
-             "attributes": Object {
-               "next.clientComponentLoadCount": 12,
-               "next.span_type": "NextNodeServer.clientComponentLoading",
+             "traceId": "[trace-id]",
            },
-             "kind": 0,
-             "name": "NextNodeServer.clientComponentLoading",
+         ],
          "status": Object {
-               "code": 0,
+           "code": 2,
+           "message": "Error from Server Component",
          },
+         "traceId": "[trace-id]",
        },
        Object {
          "attributes": Object {
-               "next.span_name": "start response",
-               "next.span_type": "NextNodeServer.startResponse",
+           "next.route": "/app/[param]/rsc-fetch/error",
+           "next.span_name": "resolve page components",
+           "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "4de9e5a0aa407c5f",
          "kind": 0,
-             "name": "start response",
+         "links": Array [],
+         "name": "resolve page components",
+         "parentId": "9e8090d28aaeb658",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
-           },
-         ],
-         "status": Object {
-           "code": 2,
+         "traceId": "[trace-id]",
        },
-       },
        Object {
          "attributes": Object {
-           "next.route": "/app/[param]/rsc-fetch/error",
-           "next.span_name": "resolve page components",
-           "next.span_type": "NextNodeServer.findPageComponents",
+           "next.span_name": "start response",
+           "next.span_type": "NextNodeServer.startResponse",
          },
+         "events": Array [],
+         "id": "f471c4bdca9b0337",
          "kind": 0,
-         "name": "resolve page components",
+         "links": Array [],
+         "name": "start response",
+         "parentId": "9e8090d28aaeb658",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "[trace-id]",
        },
      ],
      "status": Object {
        "code": 2,
      },

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:493:13)

● opentelemetry › root context › app router › should handle error inside Suspense boundary

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  - 21
+ Received  + 90

@@ -14,106 +14,175 @@
      "name": "GET /app/[param]/loading/error",
      "parentId": undefined,
      "spans": Array [
        Object {
          "attributes": Object {
+           "next.clientComponentLoadCount": 9,
+           "next.span_type": "NextNodeServer.clientComponentLoading",
+         },
+         "events": Array [],
+         "id": "003f10f10aed7403",
+         "kind": 0,
+         "links": Array [],
+         "name": "NextNodeServer.clientComponentLoading",
+         "parentId": "763f865f4ebb0e9a",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "[trace-id]",
+       },
+       Object {
+         "attributes": Object {
            "error.type": "Error",
            "next.route": "/app/[param]/loading/error",
            "next.span_name": "render route (app) /app/[param]/loading/error",
            "next.span_type": "AppRender.getBodyResult",
          },
+         "events": Array [
+           Object {
+             "attributes": Object {
+               "exception.message": "Error inside Suspense boundary",
+               "exception.stacktrace": "Error: Error inside Suspense boundary
+     at Page (/tmp/next-install-d63f954e228876695c86a888a9fc6ba801dfecbbc60c1c841b44206fe9498058/.next/dev/server/chunks/ssr/[root-of-the-server]__54fc761b._.js:29:11)",
+               "exception.type": "Error",
+             },
+             "droppedAttributesCount": 0,
+             "name": "exception",
+             "time": Array [
+               1771874015,
+               219847811,
+             ],
+           },
+         ],
+         "id": "32386b4cf466ab8f",
          "kind": 0,
+         "links": Array [],
          "name": "render route (app) /app/[param]/loading/error",
+         "parentId": "763f865f4ebb0e9a",
+         "runtime": "nodejs",
          "spans": Array [
            Object {
              "attributes": Object {
                "next.span_name": "build component tree",
                "next.span_type": "NextNodeServer.createComponentTree",
              },
+             "events": Array [],
+             "id": "a796fcc363eeac60",
              "kind": 0,
+             "links": Array [],
              "name": "build component tree",
+             "parentId": "32386b4cf466ab8f",
+             "runtime": "nodejs",
              "spans": Array [
                Object {
                  "attributes": Object {
                    "next.segment": "__PAGE__",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "161c320869c73264",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "a796fcc363eeac60",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
                Object {
                  "attributes": Object {
                    "next.segment": "[param]",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "5fb30b374d9228e3",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "a796fcc363eeac60",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
              ],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/layout",
                "next.span_name": "generateMetadata /app/[param]/layout",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "3de2e284871101a6",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/layout",
+             "parentId": "32386b4cf466ab8f",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
+         ],
+         "status": Object {
+           "code": 2,
+           "message": "Error inside Suspense boundary",
+         },
+         "traceId": "[trace-id]",
+       },
        Object {
          "attributes": Object {
-               "next.clientComponentLoadCount": 9,
-               "next.span_type": "NextNodeServer.clientComponentLoading",
+           "next.route": "/app/[param]/loading/error",
+           "next.span_name": "resolve page components",
+           "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "95f8465d0186ac19",
          "kind": 0,
-             "name": "NextNodeServer.clientComponentLoading",
+         "links": Array [],
+         "name": "resolve page components",
+         "parentId": "763f865f4ebb0e9a",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "[trace-id]",
        },
        Object {
          "attributes": Object {
            "next.span_name": "start response",
            "next.span_type": "NextNodeServer.startResponse",
          },
+         "events": Array [],
+         "id": "ff8fa68aec249b29",
          "kind": 0,
+         "links": Array [],
          "name": "start response",
-             "status": Object {
-               "code": 0,
-             },
-           },
-         ],
-         "status": Object {
-           "code": 2,
-           "message": "Error inside Suspense boundary",
-         },
-       },
-       Object {
-         "attributes": Object {
-           "next.route": "/app/[param]/loading/error",
-           "next.span_name": "resolve page components",
-           "next.span_type": "NextNodeServer.findPageComponents",
-         },
-         "kind": 0,
-         "name": "resolve page components",
+         "parentId": "763f865f4ebb0e9a",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "[trace-id]",
        },
      ],
      "status": Object {
        "code": 0,
      },

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:620:13)

● opentelemetry › root context › pages › should handle getServerSideProps returning notFound

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  -   0
+ Received  + 122

@@ -17,51 +17,173 @@
          "attributes": Object {
            "next.route": "/pages/[param]/getServerSidePropsNotFound",
            "next.span_name": "getServerSideProps /pages/[param]/getServerSidePropsNotFound",
            "next.span_type": "Render.getServerSideProps",
          },
+         "events": Array [],
+         "id": "4245bd5f47d8a7a4",
          "kind": 0,
+         "links": Array [],
          "name": "getServerSideProps /pages/[param]/getServerSidePropsNotFound",
+         "parentId": "fda451a18780c6fe",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "[trace-id]",
+       },
+       Object {
+         "attributes": Object {
+           "next.clientComponentLoadCount": 8,
+           "next.span_type": "NextNodeServer.clientComponentLoading",
+         },
+         "events": Array [],
+         "id": "4dafda2f5359d57f",
+         "kind": 0,
+         "links": Array [],
+         "name": "NextNodeServer.clientComponentLoading",
+         "parentId": "fda451a18780c6fe",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "[trace-id]",
        },
        Object {
          "attributes": Object {
            "next.route": "/_not-found",
            "next.span_name": "render route (app) /_not-found",
            "next.span_type": "AppRender.getBodyResult",
          },
+         "events": Array [],
+         "id": "870f777c41768307",
          "kind": 0,
+         "links": Array [],
          "name": "render route (app) /_not-found",
+         "parentId": "fda451a18780c6fe",
+         "runtime": "nodejs",
+         "spans": Array [
+           Object {
+             "attributes": Object {
+               "next.span_name": "build component tree",
+               "next.span_type": "NextNodeServer.createComponentTree",
+             },
+             "events": Array [],
+             "id": "5e06bb30fd7c13c4",
+             "kind": 0,
+             "links": Array [],
+             "name": "build component tree",
+             "parentId": "870f777c41768307",
+             "runtime": "nodejs",
+             "spans": Array [
+               Object {
+                 "attributes": Object {
+                   "next.segment": "",
+                   "next.span_name": "resolve segment modules",
+                   "next.span_type": "NextNodeServer.getLayoutOrPageModule",
+                 },
+                 "events": Array [],
+                 "id": "e1246e8413f4d81f",
+                 "kind": 0,
+                 "links": Array [],
+                 "name": "resolve segment modules",
+                 "parentId": "5e06bb30fd7c13c4",
+                 "runtime": "nodejs",
+                 "spans": Array [],
+                 "status": Object {
+                   "code": 0,
+                 },
+                 "traceId": "[trace-id]",
+               },
+               Object {
+                 "attributes": Object {
+                   "next.segment": "__PAGE__",
+                   "next.span_name": "resolve segment modules",
+                   "next.span_type": "NextNodeServer.getLayoutOrPageModule",
+                 },
+                 "events": Array [],
+                 "id": "cc402970d8fb7635",
+                 "kind": 0,
+                 "links": Array [],
+                 "name": "resolve segment modules",
+                 "parentId": "5e06bb30fd7c13c4",
+                 "runtime": "nodejs",
+                 "spans": Array [],
+                 "status": Object {
+                   "code": 0,
+                 },
+                 "traceId": "[trace-id]",
+               },
+             ],
+             "status": Object {
+               "code": 0,
+             },
+             "traceId": "[trace-id]",
+           },
+         ],
          "status": Object {
            "code": 0,
          },
+         "traceId": "[trace-id]",
        },
        Object {
          "attributes": Object {
            "next.route": "/_not-found",
            "next.span_name": "resolve page components",
            "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "7c81d72945ccac65",
          "kind": 0,
+         "links": Array [],
          "name": "resolve page components",
+         "parentId": "fda451a18780c6fe",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "[trace-id]",
        },
        Object {
          "attributes": Object {
            "next.route": "/pages/[param]/getServerSidePropsNotFound",
            "next.span_name": "resolve page components",
            "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "3a654e15d7d09bdd",
          "kind": 0,
+         "links": Array [],
          "name": "resolve page components",
+         "parentId": "fda451a18780c6fe",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
+         },
+         "traceId": "[trace-id]",
        },
+       Object {
+         "attributes": Object {
+           "next.span_name": "start response",
+           "next.span_type": "NextNodeServer.startResponse",
+         },
+         "events": Array [],
+         "id": "fb3391dfa1710705",
+         "kind": 0,
+         "links": Array [],
+         "name": "start response",
+         "parentId": "fda451a18780c6fe",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "[trace-id]",
        },
      ],
      "status": Object {
        "code": 0,
      },

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1028:13)

● opentelemetry › incoming context propagation › app router › should handle RSC with fetch

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  - 19
+ Received  + 87

@@ -14,130 +14,198 @@
      "name": "GET /app/[param]/rsc-fetch",
      "parentId": "0f6a325411bdc432",
      "spans": Array [
        Object {
          "attributes": Object {
+           "next.clientComponentLoadCount": 8,
+           "next.span_type": "NextNodeServer.clientComponentLoading",
+         },
+         "events": Array [],
+         "id": "4b25cfc6954e7875",
+         "kind": 0,
+         "links": Array [],
+         "name": "NextNodeServer.clientComponentLoading",
+         "parentId": "d5df06d12c26ee4f",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
+       },
+       Object {
+         "attributes": Object {
            "next.route": "/app/[param]/rsc-fetch",
            "next.span_name": "render route (app) /app/[param]/rsc-fetch",
            "next.span_type": "AppRender.getBodyResult",
          },
+         "events": Array [],
+         "id": "a07e0757a07245d5",
          "kind": 0,
+         "links": Array [],
          "name": "render route (app) /app/[param]/rsc-fetch",
+         "parentId": "d5df06d12c26ee4f",
+         "runtime": "nodejs",
          "spans": Array [
            Object {
              "attributes": Object {
                "next.span_name": "build component tree",
                "next.span_type": "NextNodeServer.createComponentTree",
              },
+             "events": Array [],
+             "id": "34f5aa692435d561",
              "kind": 0,
+             "links": Array [],
              "name": "build component tree",
+             "parentId": "a07e0757a07245d5",
+             "runtime": "nodejs",
              "spans": Array [
                Object {
                  "attributes": Object {
                    "next.segment": "__PAGE__",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "59f5d59247f660cf",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "34f5aa692435d561",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
                },
                Object {
                  "attributes": Object {
                    "next.segment": "[param]",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "e923cdf3798b0569",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "34f5aa692435d561",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
                },
              ],
              "status": Object {
                "code": 0,
              },
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
            },
            Object {
              "attributes": Object {
                "http.method": "GET",
                "http.url": "https://example.vercel.sh/",
                "net.peer.name": "example.vercel.sh",
                "next.span_name": "fetch GET https://example.vercel.sh/",
                "next.span_type": "AppRender.fetch",
              },
+             "events": Array [],
+             "id": "2aa950691b6de6ec",
              "kind": 2,
+             "links": Array [],
              "name": "fetch GET https://example.vercel.sh/",
+             "parentId": "a07e0757a07245d5",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/layout",
                "next.span_name": "generateMetadata /app/[param]/layout",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "3dbc0018c5d65fc6",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/layout",
+             "parentId": "a07e0757a07245d5",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/rsc-fetch/page",
                "next.span_name": "generateMetadata /app/[param]/rsc-fetch/page",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "ac281aa8da9d4f66",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/rsc-fetch/page",
+             "parentId": "a07e0757a07245d5",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
-             },
              },
-           Object {
-             "attributes": Object {
-               "next.clientComponentLoadCount": 8,
-               "next.span_type": "NextNodeServer.clientComponentLoading",
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
            },
-             "kind": 0,
-             "name": "NextNodeServer.clientComponentLoading",
+         ],
          "status": Object {
            "code": 0,
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
        Object {
          "attributes": Object {
-               "next.span_name": "start response",
-               "next.span_type": "NextNodeServer.startResponse",
+           "next.route": "/app/[param]/rsc-fetch",
+           "next.span_name": "resolve page components",
+           "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "e1786e31eac6b64f",
          "kind": 0,
-             "name": "start response",
-             "status": Object {
-               "code": 0,
-             },
-           },
-         ],
+         "links": Array [],
+         "name": "resolve page components",
+         "parentId": "d5df06d12c26ee4f",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
        Object {
          "attributes": Object {
-           "next.route": "/app/[param]/rsc-fetch",
-           "next.span_name": "resolve page components",
-           "next.span_type": "NextNodeServer.findPageComponents",
+           "next.span_name": "start response",
+           "next.span_type": "NextNodeServer.startResponse",
          },
+         "events": Array [],
+         "id": "4c816874e4a1bae5",
          "kind": 0,
-         "name": "resolve page components",
+         "links": Array [],
+         "name": "start response",
+         "parentId": "d5df06d12c26ee4f",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
      ],
      "status": Object {
        "code": 0,
      },

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:73:13)

● opentelemetry › incoming context propagation › app router › should handle error in RSC

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  -  20
+ Received  + 101

@@ -15,116 +15,197 @@
      "name": "GET /app/[param]/rsc-fetch/error",
      "parentId": "0f6a325411bdc432",
      "spans": Array [
        Object {
          "attributes": Object {
+           "next.clientComponentLoadCount": 12,
+           "next.span_type": "NextNodeServer.clientComponentLoading",
+         },
+         "events": Array [],
+         "id": "9a95662f056e748b",
+         "kind": 0,
+         "links": Array [],
+         "name": "NextNodeServer.clientComponentLoading",
+         "parentId": "fbb1e8692389e2de",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
+       },
+       Object {
+         "attributes": Object {
+           "error.type": "Error",
            "next.route": "/app/[param]/rsc-fetch/error",
            "next.span_name": "render route (app) /app/[param]/rsc-fetch/error",
            "next.span_type": "AppRender.getBodyResult",
+         },
+         "events": Array [
+           Object {
+             "attributes": Object {
+               "exception.message": "Error from Server Component",
+               "exception.stacktrace": "Error: Error from Server Component
+     at Page (/tmp/next-install-d63f954e228876695c86a888a9fc6ba801dfecbbc60c1c841b44206fe9498058/.next/dev/server/chunks/ssr/[root-of-the-server]__3e596755._.js:24:15)
+     at runNextTicks (node:internal/process/task_queues:60:5)
+     at listOnTimeout (node:internal/timers:545:9)
+     at process.processTimers (node:internal/timers:519:7)",
+               "exception.type": "Error",
+             },
+             "droppedAttributesCount": 0,
+             "name": "exception",
+             "time": Array [
+               1771874119,
+               554314860,
+             ],
            },
+         ],
+         "id": "e5290e0b7333e1a7",
          "kind": 0,
+         "links": Array [],
          "name": "render route (app) /app/[param]/rsc-fetch/error",
+         "parentId": "fbb1e8692389e2de",
+         "runtime": "nodejs",
          "spans": Array [
            Object {
              "attributes": Object {
                "next.span_name": "build component tree",
                "next.span_type": "NextNodeServer.createComponentTree",
              },
+             "events": Array [],
+             "id": "dd2f8696f4a62ab5",
              "kind": 0,
+             "links": Array [],
              "name": "build component tree",
+             "parentId": "e5290e0b7333e1a7",
+             "runtime": "nodejs",
              "spans": Array [
                Object {
                  "attributes": Object {
                    "next.segment": "__PAGE__",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "d522938211a20252",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "dd2f8696f4a62ab5",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
                },
                Object {
                  "attributes": Object {
                    "next.segment": "[param]",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "f98e73a0ede32fc1",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "dd2f8696f4a62ab5",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
                },
              ],
              "status": Object {
                "code": 0,
              },
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/layout",
                "next.span_name": "generateMetadata /app/[param]/layout",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "77f93166a036c78c",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/layout",
+             "parentId": "e5290e0b7333e1a7",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/layout",
                "next.span_name": "generateMetadata /app/[param]/layout",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "07ec0b4980974640",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/layout",
+             "parentId": "e5290e0b7333e1a7",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
-             },
              },
-           Object {
-             "attributes": Object {
-               "next.clientComponentLoadCount": 12,
-               "next.span_type": "NextNodeServer.clientComponentLoading",
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
            },
-             "kind": 0,
-             "name": "NextNodeServer.clientComponentLoading",
+         ],
          "status": Object {
-               "code": 0,
+           "code": 2,
+           "message": "Error from Server Component",
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
        Object {
          "attributes": Object {
-               "next.span_name": "start response",
-               "next.span_type": "NextNodeServer.startResponse",
+           "next.route": "/app/[param]/rsc-fetch/error",
+           "next.span_name": "resolve page components",
+           "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "a54070fa45e23586",
          "kind": 0,
-             "name": "start response",
+         "links": Array [],
+         "name": "resolve page components",
+         "parentId": "fbb1e8692389e2de",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
-           },
-         ],
-         "status": Object {
-           "code": 2,
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
-       },
        Object {
          "attributes": Object {
-           "next.route": "/app/[param]/rsc-fetch/error",
-           "next.span_name": "resolve page components",
-           "next.span_type": "NextNodeServer.findPageComponents",
+           "next.span_name": "start response",
+           "next.span_type": "NextNodeServer.startResponse",
          },
+         "events": Array [],
+         "id": "575dd1a0da588e1b",
          "kind": 0,
-         "name": "resolve page components",
+         "links": Array [],
+         "name": "start response",
+         "parentId": "fbb1e8692389e2de",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
      ],
      "status": Object {
        "code": 2,
      },

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:493:13)

● opentelemetry › incoming context propagation › app router › should handle error inside Suspense boundary

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  - 21
+ Received  + 90

@@ -14,106 +14,175 @@
      "name": "GET /app/[param]/loading/error",
      "parentId": "0f6a325411bdc432",
      "spans": Array [
        Object {
          "attributes": Object {
+           "next.clientComponentLoadCount": 9,
+           "next.span_type": "NextNodeServer.clientComponentLoading",
+         },
+         "events": Array [],
+         "id": "5f2342de10d7f258",
+         "kind": 0,
+         "links": Array [],
+         "name": "NextNodeServer.clientComponentLoading",
+         "parentId": "86f80632ff4280f9",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
+       },
+       Object {
+         "attributes": Object {
            "error.type": "Error",
            "next.route": "/app/[param]/loading/error",
            "next.span_name": "render route (app) /app/[param]/loading/error",
            "next.span_type": "AppRender.getBodyResult",
          },
+         "events": Array [
+           Object {
+             "attributes": Object {
+               "exception.message": "Error inside Suspense boundary",
+               "exception.stacktrace": "Error: Error inside Suspense boundary
+     at Page (/tmp/next-install-d63f954e228876695c86a888a9fc6ba801dfecbbc60c1c841b44206fe9498058/.next/dev/server/chunks/ssr/[root-of-the-server]__54fc761b._.js:29:11)",
+               "exception.type": "Error",
+             },
+             "droppedAttributesCount": 0,
+             "name": "exception",
+             "time": Array [
+               1771874149,
+               813350596,
+             ],
+           },
+         ],
+         "id": "47d98c36c9ef4de8",
          "kind": 0,
+         "links": Array [],
          "name": "render route (app) /app/[param]/loading/error",
+         "parentId": "86f80632ff4280f9",
+         "runtime": "nodejs",
          "spans": Array [
            Object {
              "attributes": Object {
                "next.span_name": "build component tree",
                "next.span_type": "NextNodeServer.createComponentTree",
              },
+             "events": Array [],
+             "id": "2d25a74613932fee",
              "kind": 0,
+             "links": Array [],
              "name": "build component tree",
+             "parentId": "47d98c36c9ef4de8",
+             "runtime": "nodejs",
              "spans": Array [
                Object {
                  "attributes": Object {
                    "next.segment": "__PAGE__",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "f96ed0aadbdcea3b",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "2d25a74613932fee",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
                },
                Object {
                  "attributes": Object {
                    "next.segment": "[param]",
                    "next.span_name": "resolve segment modules",
                    "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                  },
+                 "events": Array [],
+                 "id": "9379195b3f47557f",
                  "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "2d25a74613932fee",
+                 "runtime": "nodejs",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
                },
              ],
              "status": Object {
                "code": 0,
              },
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
            },
            Object {
              "attributes": Object {
                "next.page": "/app/[param]/layout",
                "next.span_name": "generateMetadata /app/[param]/layout",
                "next.span_type": "ResolveMetadata.generateMetadata",
              },
+             "events": Array [],
+             "id": "86718f49f8caf34a",
              "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/layout",
+             "parentId": "47d98c36c9ef4de8",
+             "runtime": "nodejs",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
            },
+         ],
+         "status": Object {
+           "code": 2,
+           "message": "Error inside Suspense boundary",
+         },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
+       },
        Object {
          "attributes": Object {
-               "next.clientComponentLoadCount": 9,
-               "next.span_type": "NextNodeServer.clientComponentLoading",
+           "next.route": "/app/[param]/loading/error",
+           "next.span_name": "resolve page components",
+           "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "269008be7a74cd47",
          "kind": 0,
-             "name": "NextNodeServer.clientComponentLoading",
+         "links": Array [],
+         "name": "resolve page components",
+         "parentId": "86f80632ff4280f9",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
        Object {
          "attributes": Object {
            "next.span_name": "start response",
            "next.span_type": "NextNodeServer.startResponse",
          },
+         "events": Array [],
+         "id": "dd4659473ca7ae32",
          "kind": 0,
+         "links": Array [],
          "name": "start response",
-             "status": Object {
-               "code": 0,
-             },
-           },
-         ],
-         "status": Object {
-           "code": 2,
-           "message": "Error inside Suspense boundary",
-         },
-       },
-       Object {
-         "attributes": Object {
-           "next.route": "/app/[param]/loading/error",
-           "next.span_name": "resolve page components",
-           "next.span_type": "NextNodeServer.findPageComponents",
-         },
-         "kind": 0,
-         "name": "resolve page components",
+         "parentId": "86f80632ff4280f9",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
      ],
      "status": Object {
        "code": 0,
      },

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:620:13)

● opentelemetry › incoming context propagation › pages › should handle getServerSideProps returning notFound

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  -   0
+ Received  + 122

@@ -17,51 +17,173 @@
          "attributes": Object {
            "next.route": "/pages/[param]/getServerSidePropsNotFound",
            "next.span_name": "getServerSideProps /pages/[param]/getServerSidePropsNotFound",
            "next.span_type": "Render.getServerSideProps",
          },
+         "events": Array [],
+         "id": "92af1c2984035a14",
          "kind": 0,
+         "links": Array [],
          "name": "getServerSideProps /pages/[param]/getServerSidePropsNotFound",
+         "parentId": "48a79a50c00ec117",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
+       },
+       Object {
+         "attributes": Object {
+           "next.clientComponentLoadCount": 8,
+           "next.span_type": "NextNodeServer.clientComponentLoading",
+         },
+         "events": Array [],
+         "id": "6793b8941f00f20d",
+         "kind": 0,
+         "links": Array [],
+         "name": "NextNodeServer.clientComponentLoading",
+         "parentId": "48a79a50c00ec117",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
        Object {
          "attributes": Object {
            "next.route": "/_not-found",
            "next.span_name": "render route (app) /_not-found",
            "next.span_type": "AppRender.getBodyResult",
          },
+         "events": Array [],
+         "id": "5993c8957d0dcec6",
          "kind": 0,
+         "links": Array [],
          "name": "render route (app) /_not-found",
+         "parentId": "48a79a50c00ec117",
+         "runtime": "nodejs",
+         "spans": Array [
+           Object {
+             "attributes": Object {
+               "next.span_name": "build component tree",
+               "next.span_type": "NextNodeServer.createComponentTree",
+             },
+             "events": Array [],
+             "id": "c50381c3856bd87a",
+             "kind": 0,
+             "links": Array [],
+             "name": "build component tree",
+             "parentId": "5993c8957d0dcec6",
+             "runtime": "nodejs",
+             "spans": Array [
+               Object {
+                 "attributes": Object {
+                   "next.segment": "",
+                   "next.span_name": "resolve segment modules",
+                   "next.span_type": "NextNodeServer.getLayoutOrPageModule",
+                 },
+                 "events": Array [],
+                 "id": "c7e2370fdf030d3b",
+                 "kind": 0,
+                 "links": Array [],
+                 "name": "resolve segment modules",
+                 "parentId": "c50381c3856bd87a",
+                 "runtime": "nodejs",
+                 "spans": Array [],
+                 "status": Object {
+                   "code": 0,
+                 },
+                 "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
+               },
+               Object {
+                 "attributes": Object {
+                   "next.segment": "__PAGE__",
+                   "next.span_name": "resolve segment modules",
+                   "next.span_type": "NextNodeServer.getLayoutOrPageModule",
+                 },
+                 "events": Array [],
+                 "id": "558a869a7acc91e0",
+                 "kind": 0,
+                 "links": Array [],
+                 "name": "resolve segment modules",
+                 "parentId": "c50381c3856bd87a",
+                 "runtime": "nodejs",
+                 "spans": Array [],
+                 "status": Object {
+                   "code": 0,
+                 },
+                 "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
+               },
+             ],
+             "status": Object {
+               "code": 0,
+             },
+             "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
+           },
+         ],
          "status": Object {
            "code": 0,
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
        Object {
          "attributes": Object {
            "next.route": "/_not-found",
            "next.span_name": "resolve page components",
            "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "54c0e4844788eb2e",
          "kind": 0,
+         "links": Array [],
          "name": "resolve page components",
+         "parentId": "48a79a50c00ec117",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
          },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
        Object {
          "attributes": Object {
            "next.route": "/pages/[param]/getServerSidePropsNotFound",
            "next.span_name": "resolve page components",
            "next.span_type": "NextNodeServer.findPageComponents",
          },
+         "events": Array [],
+         "id": "9a9a8e241ca6708c",
          "kind": 0,
+         "links": Array [],
          "name": "resolve page components",
+         "parentId": "48a79a50c00ec117",
+         "runtime": "nodejs",
+         "spans": Array [],
          "status": Object {
            "code": 0,
+         },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
+       Object {
+         "attributes": Object {
+           "next.span_name": "start response",
+           "next.span_type": "NextNodeServer.startResponse",
+         },
+         "events": Array [],
+         "id": "53caccf97e0260ae",
+         "kind": 0,
+         "links": Array [],
+         "name": "start response",
+         "parentId": "48a79a50c00ec117",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "ee75cd9e534ff5e9ed78b4a0c706f0f2",
        },
      ],
      "status": Object {
        "code": 0,
      },

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1028:13)

● opentelemetry with disabled fetch tracing › root context › app router with disabled fetch › should handle RSC with disabled fetch

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  -   5
+ Received  + 144

@@ -2,39 +2,178 @@
    Object {
      "name": "GET /app/[param]/rsc-fetch",
      "parentId": undefined,
      "spans": Array [
        Object {
+         "attributes": Object {
+           "next.clientComponentLoadCount": 8,
+           "next.span_type": "NextNodeServer.clientComponentLoading",
+         },
+         "events": Array [],
+         "id": "7612f00a31f6d9bd",
+         "kind": 0,
+         "links": Array [],
+         "name": "NextNodeServer.clientComponentLoading",
+         "parentId": "49981f52540d23e1",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "[trace-id]",
+       },
+       Object {
+         "attributes": Object {
+           "next.route": "/app/[param]/rsc-fetch",
+           "next.span_name": "render route (app) /app/[param]/rsc-fetch",
+           "next.span_type": "AppRender.getBodyResult",
+         },
+         "events": Array [],
+         "id": "74ade58f184e0649",
+         "kind": 0,
+         "links": Array [],
          "name": "render route (app) /app/[param]/rsc-fetch",
+         "parentId": "49981f52540d23e1",
+         "runtime": "nodejs",
          "spans": Array [
            Object {
+             "attributes": Object {
+               "next.span_name": "build component tree",
+               "next.span_type": "NextNodeServer.createComponentTree",
+             },
+             "events": Array [],
+             "id": "cccb25404b712d3f",
+             "kind": 0,
+             "links": Array [],
              "name": "build component tree",
+             "parentId": "74ade58f184e0649",
+             "runtime": "nodejs",
              "spans": Array [
                Object {
+                 "attributes": Object {
+                   "next.segment": "__PAGE__",
+                   "next.span_name": "resolve segment modules",
+                   "next.span_type": "NextNodeServer.getLayoutOrPageModule",
+                 },
+                 "events": Array [],
+                 "id": "27396865f3dc463c",
+                 "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "cccb25404b712d3f",
+                 "runtime": "nodejs",
+                 "spans": Array [],
+                 "status": Object {
+                   "code": 0,
                  },
+                 "traceId": "[trace-id]",
+               },
                Object {
+                 "attributes": Object {
+                   "next.segment": "[param]",
+                   "next.span_name": "resolve segment modules",
+                   "next.span_type": "NextNodeServer.getLayoutOrPageModule",
+                 },
+                 "events": Array [],
+                 "id": "df5696b1ca9f70bd",
+                 "kind": 0,
+                 "links": Array [],
                  "name": "resolve segment modules",
+                 "parentId": "cccb25404b712d3f",
+                 "runtime": "nodejs",
+                 "spans": Array [],
+                 "status": Object {
+                   "code": 0,
+                 },
+                 "traceId": "[trace-id]",
                },
              ],
+             "status": Object {
+               "code": 0,
              },
+             "traceId": "[trace-id]",
+           },
            Object {
+             "attributes": Object {
+               "next.page": "/app/[param]/layout",
+               "next.span_name": "generateMetadata /app/[param]/layout",
+               "next.span_type": "ResolveMetadata.generateMetadata",
+             },
+             "events": Array [],
+             "id": "1440e5818842d8df",
+             "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/layout",
+             "parentId": "74ade58f184e0649",
+             "runtime": "nodejs",
+             "spans": Array [],
+             "status": Object {
+               "code": 0,
+             },
+             "traceId": "[trace-id]",
            },
            Object {
+             "attributes": Object {
+               "next.page": "/app/[param]/rsc-fetch/page",
+               "next.span_name": "generateMetadata /app/[param]/rsc-fetch/page",
+               "next.span_type": "ResolveMetadata.generateMetadata",
+             },
+             "events": Array [],
+             "id": "8b65de2eb9d98975",
+             "kind": 0,
+             "links": Array [],
              "name": "generateMetadata /app/[param]/rsc-fetch/page",
-           },
-           Object {
-             "name": "NextNodeServer.clientComponentLoading",
+             "parentId": "74ade58f184e0649",
+             "runtime": "nodejs",
+             "spans": Array [],
+             "status": Object {
+               "code": 0,
              },
-           Object {
-             "name": "start response",
+             "traceId": "[trace-id]",
            },
          ],
+         "status": Object {
+           "code": 0,
          },
+         "traceId": "[trace-id]",
+       },
        Object {
+         "attributes": Object {
+           "next.route": "/app/[param]/rsc-fetch",
+           "next.span_name": "resolve page components",
+           "next.span_type": "NextNodeServer.findPageComponents",
+         },
+         "events": Array [],
+         "id": "fb589df148139393",
+         "kind": 0,
+         "links": Array [],
          "name": "resolve page components",
+         "parentId": "49981f52540d23e1",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "[trace-id]",
+       },
+       Object {
+         "attributes": Object {
+           "next.span_name": "start response",
+           "next.span_type": "NextNodeServer.startResponse",
+         },
+         "events": Array [],
+         "id": "ea4adc7999507e38",
+         "kind": 0,
+         "links": Array [],
+         "name": "start response",
+         "parentId": "49981f52540d23e1",
+         "runtime": "nodejs",
+         "spans": Array [],
+         "status": Object {
+           "code": 0,
+         },
+         "traceId": "[trace-id]",
        },
      ],
      "traceId": "[trace-id]",
    },
  ]

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1198:11)

● opentelemetry with custom server › should set attributes correctly on handleRequest span

TIMED OUT: success

undefined

Error: expect(received).toMatchObject(expected)

- Expected  - 19
+ Received  + 77

@@ -17,130 +17,188 @@
          "kind": 1,
          "name": "GET /app/[param]/rsc-fetch",
          "spans": Array [
            Object {
              "attributes": Object {
+               "next.clientComponentLoadCount": 8,
+               "next.span_type": "NextNodeServer.clientComponentLoading",
+             },
+             "events": Array [],
+             "id": "cd2b58b7bc889cb8",
+             "kind": 0,
+             "links": Array [],
+             "name": "NextNodeServer.clientComponentLoading",
+             "parentId": "6b1306f5198c5d13",
+             "spans": Array [],
+             "status": Object {
+               "code": 0,
+             },
+             "traceId": "[trace-id]",
+           },
+           Object {
+             "attributes": Object {
                "next.route": "/app/[param]/rsc-fetch",
                "next.span_name": "render route (app) /app/[param]/rsc-fetch",
                "next.span_type": "AppRender.getBodyResult",
              },
+             "events": Array [],
+             "id": "8b5e4b3421dc67e5",
              "kind": 0,
+             "links": Array [],
              "name": "render route (app) /app/[param]/rsc-fetch",
+             "parentId": "6b1306f5198c5d13",
              "spans": Array [
                Object {
                  "attributes": Object {
                    "next.span_name": "build component tree",
                    "next.span_type": "NextNodeServer.createComponentTree",
                  },
+                 "events": Array [],
+                 "id": "49d8a1c63a809aa5",
                  "kind": 0,
+                 "links": Array [],
                  "name": "build component tree",
+                 "parentId": "8b5e4b3421dc67e5",
                  "spans": Array [
                    Object {
                      "attributes": Object {
                        "next.segment": "__PAGE__",
                        "next.span_name": "resolve segment modules",
                        "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                      },
+                     "events": Array [],
+                     "id": "12161f710c067e95",
                      "kind": 0,
+                     "links": Array [],
                      "name": "resolve segment modules",
+                     "parentId": "49d8a1c63a809aa5",
+                     "spans": Array [],
                      "status": Object {
                        "code": 0,
                      },
+                     "traceId": "[trace-id]",
                    },
                    Object {
                      "attributes": Object {
                        "next.segment": "[param]",
                        "next.span_name": "resolve segment modules",
                        "next.span_type": "NextNodeServer.getLayoutOrPageModule",
                      },
+                     "events": Array [],
+                     "id": "fe5cd11a54b9b320",
                      "kind": 0,
+                     "links": Array [],
                      "name": "resolve segment modules",
+                     "parentId": "49d8a1c63a809aa5",
+                     "spans": Array [],
                      "status": Object {
                        "code": 0,
                      },
+                     "traceId": "[trace-id]",
                    },
                  ],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
                Object {
                  "attributes": Object {
                    "http.method": "GET",
                    "http.url": "https://example.vercel.sh/",
                    "net.peer.name": "example.vercel.sh",
                    "next.span_name": "fetch GET https://example.vercel.sh/",
                    "next.span_type": "AppRender.fetch",
                  },
+                 "events": Array [],
+                 "id": "ad394366c4f948cb",
                  "kind": 2,
+                 "links": Array [],
                  "name": "fetch GET https://example.vercel.sh/",
+                 "parentId": "8b5e4b3421dc67e5",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
                Object {
                  "attributes": Object {
                    "next.page": "/app/[param]/layout",
                    "next.span_name": "generateMetadata /app/[param]/layout",
                    "next.span_type": "ResolveMetadata.generateMetadata",
                  },
+                 "events": Array [],
+                 "id": "c62a815f2064b045",
                  "kind": 0,
+                 "links": Array [],
                  "name": "generateMetadata /app/[param]/layout",
+                 "parentId": "8b5e4b3421dc67e5",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
                Object {
                  "attributes": Object {
                    "next.page": "/app/[param]/rsc-fetch/page",
                    "next.span_name": "generateMetadata /app/[param]/rsc-fetch/page",
                    "next.span_type": "ResolveMetadata.generateMetadata",
                  },
+                 "events": Array [],
+                 "id": "1d97dff7412fbcf9",
                  "kind": 0,
+                 "links": Array [],
                  "name": "generateMetadata /app/[param]/rsc-fetch/page",
+                 "parentId": "8b5e4b3421dc67e5",
+                 "spans": Array [],
                  "status": Object {
                    "code": 0,
                  },
+                 "traceId": "[trace-id]",
                },
-               Object {
-                 "attributes": Object {
-                   "next.clientComponentLoadCount": 8,
-                   "next.span_type": "NextNodeServer.clientComponentLoading",
-                 },
-                 "kind": 0,
-                 "name": "NextNodeServer.clientComponentLoading",
+             ],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
            Object {
              "attributes": Object {
-                   "next.span_name": "start response",
-                   "next.span_type": "NextNodeServer.startResponse",
+               "next.route": "/app/[param]/rsc-fetch",
+               "next.span_name": "resolve page components",
+               "next.span_type": "NextNodeServer.findPageComponents",
              },
+             "events": Array [],
+             "id": "4925b46058036d43",
              "kind": 0,
-                 "name": "start response",
-                 "status": Object {
-                   "code": 0,
-                 },
-               },
-             ],
+             "links": Array [],
+             "name": "resolve page components",
+             "parentId": "6b1306f5198c5d13",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
            Object {
              "attributes": Object {
-               "next.route": "/app/[param]/rsc-fetch",
-               "next.span_name": "resolve page components",
-               "next.span_type": "NextNodeServer.findPageComponents",
+               "next.span_name": "start response",
+               "next.span_type": "NextNodeServer.startResponse",
              },
+             "events": Array [],
+             "id": "bb69ef7e2dfcdba7",
              "kind": 0,
-             "name": "resolve page components",
+             "links": Array [],
+             "name": "start response",
+             "parentId": "6b1306f5198c5d13",
+             "spans": Array [],
              "status": Object {
                "code": 0,
              },
+             "traceId": "[trace-id]",
            },
          ],
          "status": Object {
            "code": 0,
          },

  758 |   }
  759 |   console.error('TIMED OUT CHECK: ', { regex, content, lastErr })
> 760 |   throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |         ^
  761 | }
  762 |
  763 | export class File {

  at check (lib/next-test-utils.ts:760:9)
  at expectTrace (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1497:3)
  at Object.<anonymous> (e2e/opentelemetry/instrumentation/opentelemetry.test.ts:1284:5)

pnpm test-start test/e2e/app-dir/router-autoscroll/router-autoscroll.test.ts (job)

  • nx-handling > should work for pages page (DD)
  • nx-handling > should work for pages API (DD)
  • nx-handling > should work with app page (DD)
  • nx-handling > should work with app route (DD)
Expand output

● nx-handling › should work for pages page

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work for pages API

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work with app page

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work with app route

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  205 |     if (nextInstance) {
  206 |       await nextInstance.destroy()
> 207 |       throw new Error(
      |             ^
  208 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  209 |       )
  210 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:207:13)

pnpm test-start test/e2e/app-dir/cache-components-allow-otel-spans/cache-components-allow-otel-spans.test.ts (job)

  • hello-world > should allow creating Spans during prerendering at runtime - inside a Cache Components (DD)
  • hello-world > should allow creating Spans during resuming a fallback - inside a Cache Component (DD)
Expand output

● hello-world › should allow creating Spans during prerendering at runtime - inside a Cache Components

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  50 |       }
  51 |
> 52 |       const result = Reflect.apply(target, thisArg, args)
     |                              ^
  53 |       return typeof result === 'function' ? wrapJestTestFn(result) : result
  54 |     },
  55 |     get(target, prop, receiver) {

  at Object.apply (lib/e2e-utils/index.ts:52:30)
  at it (e2e/app-dir/cache-components-allow-otel-spans/cache-components-allow-otel-spans.test.ts:266:5)
  at Object.describe (e2e/app-dir/cache-components-allow-otel-spans/cache-components-allow-otel-spans.test.ts:3:1)

● hello-world › should allow creating Spans during resuming a fallback - inside a Cache Component

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  50 |       }
  51 |
> 52 |       const result = Reflect.apply(target, thisArg, args)
     |                              ^
  53 |       return typeof result === 'function' ? wrapJestTestFn(result) : result
  54 |     },
  55 |     get(target, prop, receiver) {

  at Object.apply (lib/e2e-utils/index.ts:52:30)
  at it (e2e/app-dir/cache-components-allow-otel-spans/cache-components-allow-otel-spans.test.ts:315:5)
  at Object.describe (e2e/app-dir/cache-components-allow-otel-spans/cache-components-allow-otel-spans.test.ts:3:1)

pnpm test-start-turbo test/e2e/app-dir/cache-components-errors/cache-components-errors.test.ts (turbopack) (job)

  • nx-handling > should work for pages page (DD)
  • nx-handling > should work for pages API (DD)
  • nx-handling > should work with app page (DD)
  • nx-handling > should work with app route (DD)
Expand output

● nx-handling › should work for pages page

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work for pages API

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work with app page

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● nx-handling › should work with app route

thrown: "Exceeded timeout of 120000 ms for a hook.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  324 |   let next: NextInstance | undefined
  325 |   if (!skipped) {
> 326 |     beforeAll(async () => {
      |     ^
  327 |       next = await createNext(options)
  328 |     })
  329 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:326:5)
  at e2e/app-dir/nx-handling/nx-handling.test.ts:4:33
  at Object.describe (e2e/app-dir/nx-handling/nx-handling.test.ts:3:1)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  205 |     if (nextInstance) {
  206 |       await nextInstance.destroy()
> 207 |       throw new Error(
      |             ^
  208 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  209 |       )
  210 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:207:13)

@feedthejim
Copy link
Copy Markdown
Contributor Author

dont have time to dig into this

@feedthejim feedthejim closed this Feb 9, 2026
@timneutkens timneutkens reopened this Feb 23, 2026
@timneutkens timneutkens force-pushed the feedthejim/fast-webstreams branch from 8e5f4d8 to 31ac09e Compare February 23, 2026 10:34
Copy link
Copy Markdown
Member

This stack of pull requests is managed by Graphite. Learn more about stacking.

feedthejim and others added 4 commits February 23, 2026 14:23
Replace global WebStream constructors (ReadableStream, WritableStream,
TransformStream) with faster Node.js-backed implementations from
experimental-fast-webstreams. The patching happens synchronously in
node-environment-baseline.ts before any rendering code loads.

Includes vendored fixes:
- fix(pipe-to): drain buffered flush chunks before shutdown in specPipeTo
- perf(pipe-to): batch sync reads to reduce microtask yields

Benchmark (force-dynamic page, 4KB response):
  Single client: 611 -> 1,011 req/s (+65% vs native WebStreams)
  Under load:  1,167 -> 1,128 req/s (on par, -22% p99 latency)
@timneutkens timneutkens force-pushed the feedthejim/fast-webstreams branch from 31ac09e to 4a72d43 Compare February 23, 2026 13:23
@nextjs-bot
Copy link
Copy Markdown
Collaborator

Stats from current PR

🔴 3 regressions, 1 improvement

Metric Canary PR Change Trend
node_modules Size 474 MB 475 MB 🔴 +1.29 MB (+0%) █████
Cold (First Request) 3.138s 3.361s 🔴 +223ms (+7%) ▄▅▄▁▄
Warm (First Request) 1.359s 1.652s 🔴 +293ms (+22%) ▁▁▂▁▁
nextDevColdR..urationTurbo 1.454s 1.351s 🟢 103ms (-7%) ▂▂▂▁▂
📊 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) 1.450s 1.365s ▁▁▁▁▁
Cold (Ready in log) 1.454s 1.351s 🟢 103ms (-7%) ▂▂▂▁▂
Cold (First Request) 3.138s 3.361s 🔴 +223ms (+7%) ▄▅▄▁▄
Warm (Listen) 1.420s 1.400s ▁▁▁▁▁
Warm (Ready in log) 1.402s 1.380s ▁▁▁▁▁
Warm (First Request) 1.359s 1.652s 🔴 +293ms (+22%) ▁▁▂▁▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 455ms 456ms ▁▁▁▁▁
Cold (Ready in log) 440ms 443ms ▁▄▃▂▁
Cold (First Request) 1.930s 1.945s ▁▂▁▂▁
Warm (Listen) 456ms 455ms ▁▁▁▁▁
Warm (Ready in log) 439ms 442ms ▁▄▃▂▁
Warm (First Request) 1.944s 1.941s ▁▂▂▂▁

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 11.482s 11.863s ▁▁▁▁▁
Cached Build 11.510s 11.254s ▁▁▁▁▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 14.105s 14.239s ▁▁▁▃▃
Cached Build 14.160s 14.267s ▁▁▁▃▃
node_modules Size 474 MB 475 MB 🔴 +1.29 MB (+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 255 B 253 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 252 kB 253 kB
Total 377 kB 378 kB ⚠️ +511 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 615 B 613 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 ⚠️ +65 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.98 MB 3.98 MB
index.pack gzip 102 kB 104 kB 🔴 +1.93 kB (+2%)
index.pack.old gzip 102 kB 104 kB 🔴 +1.25 kB (+1%)
Total 4.19 MB 4.19 MB ⚠️ +3.98 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 318 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 315 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 79 kB 🔴 +17 kB (+27%)
Total 2.81 MB 2.83 MB ⚠️ +17 kB
📝 Changed Files (3 files)

Files with changes:

  • pages-api-tu..time.prod.js
  • pages-turbo...time.prod.js
  • server.runtime.prod.js
View diffs
pages-api-tu..time.prod.js

Diff too large to display

pages-turbo...time.prod.js

Diff too large to display

server.runtime.prod.js

Diff too large to display

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

@nextjs-bot nextjs-bot added create-next-app Related to our CLI tool for quickly starting a new Next.js application. tests labels Feb 23, 2026
@benfavre
Copy link
Copy Markdown
Contributor

Benchmark on Node.js v25.7.0

I tested this on Node.js v25.7.0 (the version Next.js uses in production with NODE_OPTIONS="--import tsx") and the results are different from the v22 benchmarks:

Setup

  • patchGlobalWebStreams() called in a wrapper before minimal-server.js loads
  • experimental-fast-webstreams@0.0.19
  • Same machine, autocannon with warmup

Results

Route Native WhatWG fast-webstreams Delta
Simple /rsc (c=1) 5,131 req/s 5,220 req/s +1.7%
Simple /rsc (c=100) 6,105 req/s 6,067 req/s -0.6%
Deep 10-layout (c=50) 624 req/s 582 req/s -6.7%

Analysis

On Node.js v25, native WhatWG streams have improved significantly compared to v22. The fast-webstreams interop layer (which wraps Node.js streams behind the WhatWG API) now adds overhead for complex workloads:

  • The deep route (10 nested layouts, 10 dynamic params, headers() + cookies() calls) creates 6-8 TransformStreams per request. The interop cost between fast-webstreams' internal Node.js streams and the WhatWG-compatible API compounds across these chained transforms.
  • For simple routes, the difference is within noise (~1%).

Recommendation

For Node.js v25+, native Node.js streams (PRs #91580, #91583, #89566) are the better path. They bypass the WhatWG API entirely rather than trying to make it faster, avoiding both the native WhatWG overhead and the fast-webstreams interop overhead.

The node-streams rewrite (#89566) showed +42-46% throughput even on v22 — native piping avoids the per-chunk Promise overhead that both native WhatWG and fast-webstreams still incur.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

create-next-app Related to our CLI tool for quickly starting a new Next.js application. created-by: Next.js team PRs by the Next.js team. tests type: next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants