Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Cache the bound args encryption result for inline server functions #73521

Merged
merged 6 commits into from
Dec 5, 2024

Conversation

unstubbable
Copy link
Contributor

@unstubbable unstubbable commented Dec 4, 2024

The crypto.subtle.encrypt() call that's used to encrypt the serialized bound args of inline server functions does not finish within the current task. Therefore it will prevent an otherwise static/cached page from being prerendered, when dynamicIO is enabled.

To fix that, we need to cache the encryption result, and also signal to the prerendering process (using the cacheSignal) when the encryption is finished.

Since the bound args might also include fetched or otherwise cached data, we include the encryption result in the resume data cache. This ensures data consistency with other parts of the page when resuming a partial prerender.

closes NAR-47

@ijjk
Copy link
Member

ijjk commented Dec 4, 2024

Failing test suites

Commit: 219d875

pnpm test-dev test/development/acceptance-app/ReactRefreshLogBox.test.ts

  • ReactRefreshLogBox app default > server component can recover from error thrown in the module
Expand output

● ReactRefreshLogBox app default › server component can recover from error thrown in the module

Expected Redbox but found none

  1060 |
  1061 |       await next.patchFile('index.js', "throw new Error('module error')")
> 1062 |       await session.assertHasRedbox()
       |       ^
  1063 |       await next.patchFile(
  1064 |         'index.js',
  1065 |         'export default function Page() {return <p>hello world</p>}'

  at Object.<anonymous> (development/acceptance-app/ReactRefreshLogBox.test.ts:1062:7)

Read more about building and testing Next.js in contributing.md.

@ijjk
Copy link
Member

ijjk commented Dec 4, 2024

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
buildDuration 21s 17.8s N/A
buildDurationCached 16.8s 14.8s N/A
nodeModulesSize 409 MB 409 MB ⚠️ +20.2 kB
nextStartRea..uration (ms) 455ms 457ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
1187-HASH.js gzip 49.2 kB 49.2 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.3 kB 5.3 kB N/A
bccd1874-HASH.js gzip 53 kB 53 kB N/A
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 232 B 235 B N/A
main-HASH.js gzip 33.7 kB 33.7 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 0 B 0 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 513 B 511 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB N/A
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.44 kB 4.43 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.34 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 1.75 kB 1.75 kB
Client Build Manifests
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
_buildManifest.js gzip 746 B 747 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
index.html gzip 524 B 524 B
link.html gzip 538 B 536 B N/A
withRouter.html gzip 520 B 521 B N/A
Overall change 524 B 524 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
edge-ssr.js gzip 128 kB 128 kB N/A
page.js gzip 200 kB 200 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
middleware-b..fest.js gzip 667 B 664 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.1 kB 31.1 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
797-experime...dev.js gzip 322 B 322 B
797.runtime.dev.js gzip 314 B 314 B
app-page-exp...dev.js gzip 321 kB 321 kB N/A
app-page-exp..prod.js gzip 126 kB 126 kB N/A
app-page-tur..prod.js gzip 139 kB 139 kB N/A
app-page-tur..prod.js gzip 134 kB 134 kB N/A
app-page.run...dev.js gzip 311 kB 311 kB N/A
app-page.run..prod.js gzip 122 kB 122 kB N/A
app-route-ex...dev.js gzip 36.8 kB 36.8 kB
app-route-ex..prod.js gzip 25 kB 25 kB
app-route-tu..prod.js gzip 25 kB 25 kB
app-route-tu..prod.js gzip 24.8 kB 24.8 kB
app-route.ru...dev.js gzip 38.5 kB 38.5 kB
app-route.ru..prod.js gzip 24.8 kB 24.8 kB
pages-api-tu..prod.js gzip 9.56 kB 9.56 kB
pages-api.ru...dev.js gzip 11.4 kB 11.4 kB
pages-api.ru..prod.js gzip 9.56 kB 9.56 kB
pages-turbo...prod.js gzip 21.3 kB 21.3 kB
pages.runtim...dev.js gzip 27 kB 27 kB
pages.runtim..prod.js gzip 21.3 kB 21.3 kB
server.runti..prod.js gzip 916 kB 916 kB
Overall change 1.19 MB 1.19 MB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js hl/cache-encrypted-bound-args Change
0.pack gzip 2.03 MB 2.04 MB ⚠️ +2.02 kB
index.pack gzip 146 kB 146 kB N/A
Overall change 2.03 MB 2.04 MB ⚠️ +2.02 kB
Diff details
Diff for main-HASH.js

Diff too large to display

Diff for app-page-exp..ntime.dev.js

Diff too large to display

Diff for app-page-exp..time.prod.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page.runtime.dev.js

Diff too large to display

Diff for app-page.runtime.prod.js

Diff too large to display

Commit: 219d875

@unstubbable unstubbable force-pushed the hl/cache-encrypted-bound-args branch from 7ffcab1 to 0608cab Compare December 5, 2024 12:10
@unstubbable unstubbable marked this pull request as ready for review December 5, 2024 13:17
@unstubbable unstubbable requested a review from gnoff December 5, 2024 13:17
@unstubbable unstubbable force-pushed the hl/cache-encrypted-bound-args branch from 0608cab to a719b32 Compare December 5, 2024 20:03
@unstubbable unstubbable requested a review from wyattjoh December 5, 2024 20:04
@unstubbable unstubbable force-pushed the hl/cache-encrypted-bound-args branch from 0139e75 to 219d875 Compare December 5, 2024 21:08
@unstubbable unstubbable enabled auto-merge (squash) December 5, 2024 21:38
@unstubbable unstubbable merged commit 50bead1 into canary Dec 5, 2024
106 of 111 checks passed
@unstubbable unstubbable deleted the hl/cache-encrypted-bound-args branch December 5, 2024 21:49
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Dec 20, 2024
# for free to subscribe to this conversation on GitHub. Already have an account? #.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants