Skip to content

[Flight] Respect displayName of Promise instances on the server#34825

Merged
sebmarkbage merged 3 commits into
facebook:mainfrom
sebmarkbage:promisedisplayname
Oct 13, 2025
Merged

[Flight] Respect displayName of Promise instances on the server#34825
sebmarkbage merged 3 commits into
facebook:mainfrom
sebmarkbage:promisedisplayname

Conversation

@sebmarkbage
Copy link
Copy Markdown
Contributor

This lets you assign a name to a Promise that's passed into first party code from third party since it otherwise would have no other stack frame to indicate its name since the whole creation stack would be in third party.

We already respect the displayName on the client but it's more complicated on the server because we don't only consider the exact instance passed to use() but the whole await sequence and we can pick any Promise along the way for consideration. Therefore this also adds a change where we pick the Promise node for consideration if it has a name but no stack. Where we otherwise would've picked the I/O node.

Another thing that this PR does is treat anonymous stack frames (empty url) as third party for purposes of heuristics like "hasUnfilteredFrame" and the name assignment. This lets you include these in the actual generated stacks (by overriding filterStackFrame) but we don't actually want them to be considered first party code in the heuristics since it ends up favoring those stacks and using internals like Function.all in name assignment.

@meta-cla meta-cla Bot added the CLA Signed label Oct 13, 2025
@github-actions github-actions Bot added the React Core Team Opened by a member of the React Core Team label Oct 13, 2025
@react-sizebot
Copy link
Copy Markdown

Comparing: 1d68bce...e598297

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.js = 6.68 kB 6.68 kB +0.05% 1.83 kB 1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js = 605.42 kB 604.98 kB = 107.21 kB 107.14 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.69 kB 6.69 kB = 1.83 kB 1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js = 664.39 kB 663.95 kB = 117.09 kB 117.03 kB
facebook-www/ReactDOM-prod.classic.js = 688.26 kB 687.81 kB = 121.13 kB 121.07 kB
facebook-www/ReactDOM-prod.modern.js = 678.69 kB 678.24 kB = 119.48 kB 119.42 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.30% 210.94 kB 211.57 kB +0.33% 38.50 kB 38.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.30% 210.94 kB 211.57 kB +0.33% 38.50 kB 38.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.29% 215.55 kB 216.17 kB +0.29% 39.35 kB 39.46 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.29% 217.45 kB 218.08 kB +0.33% 39.19 kB 39.32 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.29% 217.45 kB 218.08 kB +0.33% 39.19 kB 39.32 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.28% 222.06 kB 222.69 kB +0.23% 40.05 kB 40.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.28% 224.17 kB 224.79 kB +0.25% 40.29 kB 40.39 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.28% 224.17 kB 224.79 kB +0.25% 40.29 kB 40.39 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.28% 225.37 kB 226.00 kB +0.26% 40.58 kB 40.69 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.28% 225.37 kB 226.00 kB +0.26% 40.58 kB 40.69 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.28% 225.42 kB 226.05 kB +0.26% 40.59 kB 40.69 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.28% 225.42 kB 226.05 kB +0.26% 40.59 kB 40.69 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.27% 228.77 kB 229.40 kB +0.23% 41.12 kB 41.22 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.27% 229.98 kB 230.60 kB +0.22% 41.42 kB 41.51 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.27% 230.03 kB 230.66 kB +0.22% 41.42 kB 41.51 kB

Generated by 🚫 dangerJS against e598297

"name": "greeting",
"start": 0,
"value": {
"status": "halted",
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Wouldn't we expect the value here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is an interesting one. Because the promise gets serialized by the props to Component before it has fully resolved, it gives up while serializing it. Later it also is awaited but then it's already serialized as part of props.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Debug channel fixes this ofc.

@sebmarkbage sebmarkbage merged commit 026abea into facebook:main Oct 13, 2025
246 of 247 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed React Core Team Opened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants