Skip to content

Throw special error if rejected Promises are incorrectly instrumented#36328

Merged
eps1lon merged 1 commit into
facebook:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented
May 27, 2026
Merged

Throw special error if rejected Promises are incorrectly instrumented#36328
eps1lon merged 1 commit into
facebook:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented

Conversation

@eps1lon
Copy link
Copy Markdown
Collaborator

@eps1lon eps1lon commented Apr 22, 2026

When a rejected Promise is instrumented in userspace while setting the rejection reason in the wrong field (e.g. error instead of reason), React will throw undefined (because usable.reason doesn't exist). This makes it incredibly hard to find the actual rejection reason.

React is now throwing a generic error if we couldn't find the rejection reason. That will produce a callstack pointing into the problematic Promise from where you can hopefully extract the real rejection reason (alongside fixing the bad instrumentation).

We're doing this in prod since this is unlikely to surface in dev. We're only doing runtime type-checking for the rejected case. That should be hit rarely and therefore hopefully have negligible runtime impact.

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

react-sizebot commented Apr 22, 2026

Comparing: cafd63b...0856999

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.84 kB 6.84 kB +0.16% 1.88 kB 1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js +0.01% 614.17 kB 614.26 kB +0.04% 108.52 kB 108.57 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.84 kB 6.84 kB +0.11% 1.88 kB 1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js +0.01% 680.11 kB 680.19 kB +0.03% 119.48 kB 119.51 kB
facebook-www/ReactDOM-prod.classic.js +0.01% 700.53 kB 700.61 kB +0.03% 123.05 kB 123.09 kB
facebook-www/ReactDOM-prod.modern.js +0.01% 690.84 kB 690.93 kB +0.03% 121.44 kB 121.48 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/cjs/react-server-flight.production.js +0.67% 66.24 kB 66.69 kB +1.37% 13.08 kB 13.25 kB
oss-stable/react-server/cjs/react-server-flight.production.js +0.67% 66.24 kB 66.69 kB +1.37% 13.08 kB 13.25 kB
oss-experimental/react-server/cjs/react-server-flight.production.js +0.65% 68.05 kB 68.49 kB +1.33% 13.49 kB 13.67 kB
facebook-www/ReactFlightServer-prod.classic.js +0.42% 103.32 kB 103.75 kB +0.73% 20.95 kB 21.10 kB
facebook-www/ReactFlightServer-prod.modern.js +0.42% 103.32 kB 103.75 kB +0.73% 20.95 kB 21.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js +0.39% 112.48 kB 112.92 kB +0.68% 22.80 kB 22.96 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js +0.39% 112.48 kB 112.92 kB +0.68% 22.80 kB 22.96 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js +0.38% 114.28 kB 114.71 kB +0.66% 23.19 kB 23.34 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +0.37% 116.50 kB 116.94 kB +0.65% 23.58 kB 23.73 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +0.37% 116.50 kB 116.94 kB +0.65% 23.58 kB 23.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +0.37% 118.30 kB 118.73 kB +0.65% 23.95 kB 24.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +0.36% 119.42 kB 119.85 kB +0.57% 23.97 kB 24.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +0.36% 119.42 kB 119.85 kB +0.57% 23.97 kB 24.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +0.36% 119.42 kB 119.85 kB +0.57% 23.96 kB 24.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +0.36% 119.42 kB 119.85 kB +0.57% 23.96 kB 24.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js +0.36% 120.57 kB 121.00 kB +0.63% 24.16 kB 24.31 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js +0.36% 120.57 kB 121.00 kB +0.63% 24.16 kB 24.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js +0.36% 121.21 kB 121.64 kB +0.57% 24.34 kB 24.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js +0.36% 121.21 kB 121.64 kB +0.57% 24.33 kB 24.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js +0.35% 122.36 kB 122.80 kB +0.64% 24.52 kB 24.67 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js +0.34% 126.44 kB 126.87 kB +0.55% 25.09 kB 25.23 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js +0.34% 126.44 kB 126.87 kB +0.55% 25.09 kB 25.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +0.34% 127.48 kB 127.92 kB +0.55% 25.33 kB 25.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +0.34% 127.48 kB 127.92 kB +0.55% 25.33 kB 25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +0.34% 127.50 kB 127.93 kB +0.55% 25.32 kB 25.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +0.34% 127.50 kB 127.93 kB +0.55% 25.32 kB 25.46 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js +0.34% 128.23 kB 128.67 kB +0.55% 25.47 kB 25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js +0.34% 129.28 kB 129.71 kB +0.54% 25.70 kB 25.84 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js +0.34% 129.29 kB 129.73 kB +0.54% 25.69 kB 25.83 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js +0.31% 145.98 kB 146.43 kB +0.68% 26.07 kB 26.24 kB
oss-stable/react-server/cjs/react-server-flight.development.js +0.31% 145.98 kB 146.43 kB +0.68% 26.07 kB 26.24 kB
oss-experimental/react-server/cjs/react-server-flight.development.js +0.31% 148.07 kB 148.52 kB +0.68% 26.53 kB 26.71 kB
oss-stable-semver/react-server/cjs/react-server.production.js +0.30% 146.32 kB 146.77 kB +0.69% 25.63 kB 25.81 kB
oss-stable/react-server/cjs/react-server.production.js +0.30% 146.32 kB 146.77 kB +0.69% 25.63 kB 25.81 kB
oss-experimental/react-server/cjs/react-server.production.js +0.30% 149.81 kB 150.25 kB +0.67% 26.41 kB 26.59 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js +0.24% 360.40 kB 361.27 kB +0.49% 66.82 kB 67.14 kB
facebook-www/ReactFlightServer-dev.classic.js +0.23% 199.56 kB 200.01 kB +0.47% 36.09 kB 36.26 kB
facebook-www/ReactFlightServer-dev.modern.js +0.23% 199.56 kB 200.01 kB +0.47% 36.09 kB 36.26 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.22% 208.28 kB 208.73 kB +0.44% 37.66 kB 37.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.22% 208.28 kB 208.73 kB +0.44% 37.66 kB 37.82 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.22% 210.38 kB 210.84 kB +0.44% 38.07 kB 38.23 kB
oss-stable-semver/react-server/cjs/react-server.development.js +0.22% 210.92 kB 211.38 kB +0.45% 37.18 kB 37.34 kB
oss-stable/react-server/cjs/react-server.development.js +0.22% 210.92 kB 211.38 kB +0.45% 37.18 kB 37.34 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.21% 212.30 kB 212.76 kB +0.44% 38.24 kB 38.41 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.21% 212.30 kB 212.76 kB +0.44% 38.24 kB 38.41 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.21% 214.39 kB 214.85 kB +0.44% 38.66 kB 38.83 kB
oss-experimental/react-server/cjs/react-server.development.js +0.21% 215.71 kB 216.17 kB +0.44% 38.09 kB 38.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.21% 215.89 kB 216.35 kB +0.44% 38.97 kB 39.14 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.21% 215.89 kB 216.35 kB +0.44% 38.97 kB 39.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.21% 216.37 kB 216.82 kB +0.45% 39.07 kB 39.25 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.21% 216.37 kB 216.82 kB +0.45% 39.07 kB 39.25 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.21% 218.00 kB 218.45 kB +0.43% 39.38 kB 39.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.21% 218.47 kB 218.93 kB +0.43% 39.49 kB 39.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.21% 220.02 kB 220.47 kB +0.43% 39.55 kB 39.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.21% 220.02 kB 220.47 kB +0.43% 39.55 kB 39.72 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.21% 220.02 kB 220.48 kB +0.44% 39.55 kB 39.73 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.21% 220.02 kB 220.48 kB +0.44% 39.55 kB 39.73 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.20% 222.11 kB 222.56 kB +0.42% 39.97 kB 40.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.20% 222.11 kB 222.57 kB +0.42% 39.97 kB 40.14 kB

Generated by 🚫 dangerJS against 0856999

@eps1lon eps1lon force-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 3 times, most recently from ab70052 to 8fc1b9e Compare April 22, 2026 16:14
@eps1lon eps1lon changed the title [Fiber] Throw special error if rejected Promises are incorrectly instrumented Throw special error if rejected Promises are incorrectly instrumented Apr 22, 2026
@eps1lon eps1lon force-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 2 times, most recently from 4c13990 to 2ba964a Compare April 23, 2026 19:18
@eps1lon eps1lon force-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch from 2ba964a to 0856999 Compare May 27, 2026 09:42
@eps1lon eps1lon marked this pull request as ready for review May 27, 2026 09:43
@eps1lon eps1lon requested review from acdlite and unstubbable May 27, 2026 09:43
@eps1lon eps1lon merged commit c0cd4d5 into facebook:main May 27, 2026
240 checks passed
@eps1lon eps1lon deleted the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch May 27, 2026 10:00
github-actions Bot pushed a commit that referenced this pull request May 27, 2026
…#36328)

When a rejected `Promise` is instrumented in userspace while setting the
rejection reason in the wrong field (e.g. `error` instead of `reason`),
React will throw undefined (because `usable.reason` doesn't exist). This
makes it incredibly hard to find the actual rejection reason.

React is now throwing a generic error if we couldn't find the rejection
reason. That will produce a callstack pointing into the problematic
Promise from where you can hopefully extract the real rejection reason
(alongside fixing the bad instrumentation).

We're doing this in prod since this is unlikely to surface in dev. We're
only doing runtime type-checking for the rejected case. That should be
hit rarely and therefore hopefully have negligible runtime impact.

DiffTrain build for [c0cd4d5](c0cd4d5)
github-actions Bot pushed a commit that referenced this pull request May 27, 2026
…#36328)

When a rejected `Promise` is instrumented in userspace while setting the
rejection reason in the wrong field (e.g. `error` instead of `reason`),
React will throw undefined (because `usable.reason` doesn't exist). This
makes it incredibly hard to find the actual rejection reason.

React is now throwing a generic error if we couldn't find the rejection
reason. That will produce a callstack pointing into the problematic
Promise from where you can hopefully extract the real rejection reason
(alongside fixing the bad instrumentation).

We're doing this in prod since this is unlikely to surface in dev. We're
only doing runtime type-checking for the rejected case. That should be
hit rarely and therefore hopefully have negligible runtime impact.

DiffTrain build for [c0cd4d5](c0cd4d5)
lubieowoce pushed a commit to vercel/next.js that referenced this pull request May 27, 2026
[diff
facebook/react@75b0945b...c0cd4d5d](facebook/react@75b0945...c0cd4d5)

<details>
<summary>React upstream changes</summary>

- facebook/react#36328
- facebook/react#36542
- facebook/react#36544

</details>

---------

Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
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.

3 participants