Throw special error if rejected Promises are incorrectly instrumented - #36328

Merged
eps1lon merged 1 commit into
react: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
react:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented

Conversation

@eps1lon

@eps1loneps1lon commented Apr 22, 2026

Copy link
Copy Markdown
Collaborator

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.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Apr 22, 2026
@react-sizebot

react-sizebot commented Apr 22, 2026

Copy link
Copy Markdown

Comparing: cafd63b...0856999

Critical size changes

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

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.16%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js+0.01%614.17 kB614.26 kB+0.04%108.52 kB108.57 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.11%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js+0.01%680.11 kB680.19 kB+0.03%119.48 kB119.51 kB
facebook-www/ReactDOM-prod.classic.js+0.01%700.53 kB700.61 kB+0.03%123.05 kB123.09 kB
facebook-www/ReactDOM-prod.modern.js+0.01%690.84 kB690.93 kB+0.03%121.44 kB121.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-stable/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-experimental/react-server/cjs/react-server-flight.production.js+0.65%68.05 kB68.49 kB+1.33%13.49 kB13.67 kB
facebook-www/ReactFlightServer-prod.classic.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
facebook-www/ReactFlightServer-prod.modern.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.38%114.28 kB114.71 kB+0.66%23.19 kB23.34 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%118.30 kB118.73 kB+0.65%23.95 kB24.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.34 kB24.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.33 kB24.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.35%122.36 kB122.80 kB+0.64%24.52 kB24.67 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%128.23 kB128.67 kB+0.55%25.47 kB25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%129.28 kB129.71 kB+0.54%25.70 kB25.84 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%129.29 kB129.73 kB+0.54%25.69 kB25.83 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-stable/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-experimental/react-server/cjs/react-server-flight.development.js+0.31%148.07 kB148.52 kB+0.68%26.53 kB26.71 kB
oss-stable-semver/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-stable/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-experimental/react-server/cjs/react-server.production.js+0.30%149.81 kB150.25 kB+0.67%26.41 kB26.59 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js+0.24%360.40 kB361.27 kB+0.49%66.82 kB67.14 kB
facebook-www/ReactFlightServer-dev.classic.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
facebook-www/ReactFlightServer-dev.modern.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%210.38 kB210.84 kB+0.44%38.07 kB38.23 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%214.39 kB214.85 kB+0.44%38.66 kB38.83 kB
oss-experimental/react-server/cjs/react-server.development.js+0.21%215.71 kB216.17 kB+0.44%38.09 kB38.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%218.00 kB218.45 kB+0.43%39.38 kB39.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%218.47 kB218.93 kB+0.43%39.49 kB39.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.20%222.11 kB222.56 kB+0.42%39.97 kB40.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.20%222.11 kB222.57 kB+0.42%39.97 kB40.14 kB

Generated by 🚫 dangerJS against 0856999

@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 3 times, most recently from ab70052 to 8fc1b9eCompareApril 22, 2026 16:14
@eps1loneps1lon changed the title [Fiber] Throw special error if rejected Promises are incorrectly instrumentedThrow special error if rejected Promises are incorrectly instrumentedApr 22, 2026
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 2 times, most recently from 4c13990 to 2ba964aCompareApril 23, 2026 19:18
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch from 2ba964a to 0856999CompareMay 27, 2026 09:42
@eps1lon
eps1lon marked this pull request as ready for review May 27, 2026 09:43
@eps1lon
eps1lon merged commit c0cd4d5 into react:mainMay 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-actionsBot 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-actionsBot 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
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
m-kawafuji pushed a commit to m-kawafuji/next.js that referenced this pull request Aug 8, 2026
…#94161)
[diff
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@eps1lon@react-sizebot@unstubbable
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Throw special error if rejected Promises are incorrectly instrumented - #36328

Merged
eps1lon merged 1 commit into
react: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
react:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented

Conversation

@eps1lon

@eps1loneps1lon commented Apr 22, 2026

Copy link
Copy Markdown
Collaborator

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.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Apr 22, 2026
@react-sizebot

react-sizebot commented Apr 22, 2026

Copy link
Copy Markdown

Comparing: cafd63b...0856999

Critical size changes

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

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.16%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js+0.01%614.17 kB614.26 kB+0.04%108.52 kB108.57 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.11%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js+0.01%680.11 kB680.19 kB+0.03%119.48 kB119.51 kB
facebook-www/ReactDOM-prod.classic.js+0.01%700.53 kB700.61 kB+0.03%123.05 kB123.09 kB
facebook-www/ReactDOM-prod.modern.js+0.01%690.84 kB690.93 kB+0.03%121.44 kB121.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-stable/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-experimental/react-server/cjs/react-server-flight.production.js+0.65%68.05 kB68.49 kB+1.33%13.49 kB13.67 kB
facebook-www/ReactFlightServer-prod.classic.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
facebook-www/ReactFlightServer-prod.modern.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.38%114.28 kB114.71 kB+0.66%23.19 kB23.34 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%118.30 kB118.73 kB+0.65%23.95 kB24.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.34 kB24.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.33 kB24.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.35%122.36 kB122.80 kB+0.64%24.52 kB24.67 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%128.23 kB128.67 kB+0.55%25.47 kB25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%129.28 kB129.71 kB+0.54%25.70 kB25.84 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%129.29 kB129.73 kB+0.54%25.69 kB25.83 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-stable/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-experimental/react-server/cjs/react-server-flight.development.js+0.31%148.07 kB148.52 kB+0.68%26.53 kB26.71 kB
oss-stable-semver/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-stable/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-experimental/react-server/cjs/react-server.production.js+0.30%149.81 kB150.25 kB+0.67%26.41 kB26.59 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js+0.24%360.40 kB361.27 kB+0.49%66.82 kB67.14 kB
facebook-www/ReactFlightServer-dev.classic.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
facebook-www/ReactFlightServer-dev.modern.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%210.38 kB210.84 kB+0.44%38.07 kB38.23 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%214.39 kB214.85 kB+0.44%38.66 kB38.83 kB
oss-experimental/react-server/cjs/react-server.development.js+0.21%215.71 kB216.17 kB+0.44%38.09 kB38.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%218.00 kB218.45 kB+0.43%39.38 kB39.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%218.47 kB218.93 kB+0.43%39.49 kB39.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.20%222.11 kB222.56 kB+0.42%39.97 kB40.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.20%222.11 kB222.57 kB+0.42%39.97 kB40.14 kB

Generated by 🚫 dangerJS against 0856999

@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 3 times, most recently from ab70052 to 8fc1b9eCompareApril 22, 2026 16:14
@eps1loneps1lon changed the title [Fiber] Throw special error if rejected Promises are incorrectly instrumentedThrow special error if rejected Promises are incorrectly instrumentedApr 22, 2026
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 2 times, most recently from 4c13990 to 2ba964aCompareApril 23, 2026 19:18
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch from 2ba964a to 0856999CompareMay 27, 2026 09:42
@eps1lon
eps1lon marked this pull request as ready for review May 27, 2026 09:43
@eps1lon
eps1lon merged commit c0cd4d5 into react:mainMay 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-actionsBot 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-actionsBot 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
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
m-kawafuji pushed a commit to m-kawafuji/next.js that referenced this pull request Aug 8, 2026
…#94161)
[diff
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@eps1lon@react-sizebot@unstubbable
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Throw special error if rejected Promises are incorrectly instrumented - #36328

Merged
eps1lon merged 1 commit into
react: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
react:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented

Conversation

@eps1lon

@eps1loneps1lon commented Apr 22, 2026

Copy link
Copy Markdown
Collaborator

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.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Apr 22, 2026
@react-sizebot

react-sizebot commented Apr 22, 2026

Copy link
Copy Markdown

Comparing: cafd63b...0856999

Critical size changes

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

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.16%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js+0.01%614.17 kB614.26 kB+0.04%108.52 kB108.57 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.11%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js+0.01%680.11 kB680.19 kB+0.03%119.48 kB119.51 kB
facebook-www/ReactDOM-prod.classic.js+0.01%700.53 kB700.61 kB+0.03%123.05 kB123.09 kB
facebook-www/ReactDOM-prod.modern.js+0.01%690.84 kB690.93 kB+0.03%121.44 kB121.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-stable/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-experimental/react-server/cjs/react-server-flight.production.js+0.65%68.05 kB68.49 kB+1.33%13.49 kB13.67 kB
facebook-www/ReactFlightServer-prod.classic.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
facebook-www/ReactFlightServer-prod.modern.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.38%114.28 kB114.71 kB+0.66%23.19 kB23.34 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%118.30 kB118.73 kB+0.65%23.95 kB24.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.34 kB24.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.33 kB24.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.35%122.36 kB122.80 kB+0.64%24.52 kB24.67 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%128.23 kB128.67 kB+0.55%25.47 kB25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%129.28 kB129.71 kB+0.54%25.70 kB25.84 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%129.29 kB129.73 kB+0.54%25.69 kB25.83 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-stable/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-experimental/react-server/cjs/react-server-flight.development.js+0.31%148.07 kB148.52 kB+0.68%26.53 kB26.71 kB
oss-stable-semver/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-stable/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-experimental/react-server/cjs/react-server.production.js+0.30%149.81 kB150.25 kB+0.67%26.41 kB26.59 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js+0.24%360.40 kB361.27 kB+0.49%66.82 kB67.14 kB
facebook-www/ReactFlightServer-dev.classic.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
facebook-www/ReactFlightServer-dev.modern.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%210.38 kB210.84 kB+0.44%38.07 kB38.23 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%214.39 kB214.85 kB+0.44%38.66 kB38.83 kB
oss-experimental/react-server/cjs/react-server.development.js+0.21%215.71 kB216.17 kB+0.44%38.09 kB38.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%218.00 kB218.45 kB+0.43%39.38 kB39.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%218.47 kB218.93 kB+0.43%39.49 kB39.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.20%222.11 kB222.56 kB+0.42%39.97 kB40.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.20%222.11 kB222.57 kB+0.42%39.97 kB40.14 kB

Generated by 🚫 dangerJS against 0856999

@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 3 times, most recently from ab70052 to 8fc1b9eCompareApril 22, 2026 16:14
@eps1loneps1lon changed the title [Fiber] Throw special error if rejected Promises are incorrectly instrumentedThrow special error if rejected Promises are incorrectly instrumentedApr 22, 2026
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 2 times, most recently from 4c13990 to 2ba964aCompareApril 23, 2026 19:18
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch from 2ba964a to 0856999CompareMay 27, 2026 09:42
@eps1lon
eps1lon marked this pull request as ready for review May 27, 2026 09:43
@eps1lon
eps1lon merged commit c0cd4d5 into react:mainMay 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-actionsBot 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-actionsBot 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
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
m-kawafuji pushed a commit to m-kawafuji/next.js that referenced this pull request Aug 8, 2026
…#94161)
[diff
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@eps1lon@react-sizebot@unstubbable
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Throw special error if rejected Promises are incorrectly instrumented - #36328

Merged
eps1lon merged 1 commit into
react: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
react:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented

Conversation

@eps1lon

@eps1loneps1lon commented Apr 22, 2026

Copy link
Copy Markdown
Collaborator

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.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Apr 22, 2026
@react-sizebot

react-sizebot commented Apr 22, 2026

Copy link
Copy Markdown

Comparing: cafd63b...0856999

Critical size changes

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

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.16%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js+0.01%614.17 kB614.26 kB+0.04%108.52 kB108.57 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.11%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js+0.01%680.11 kB680.19 kB+0.03%119.48 kB119.51 kB
facebook-www/ReactDOM-prod.classic.js+0.01%700.53 kB700.61 kB+0.03%123.05 kB123.09 kB
facebook-www/ReactDOM-prod.modern.js+0.01%690.84 kB690.93 kB+0.03%121.44 kB121.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-stable/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-experimental/react-server/cjs/react-server-flight.production.js+0.65%68.05 kB68.49 kB+1.33%13.49 kB13.67 kB
facebook-www/ReactFlightServer-prod.classic.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
facebook-www/ReactFlightServer-prod.modern.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.38%114.28 kB114.71 kB+0.66%23.19 kB23.34 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%118.30 kB118.73 kB+0.65%23.95 kB24.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.34 kB24.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.33 kB24.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.35%122.36 kB122.80 kB+0.64%24.52 kB24.67 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%128.23 kB128.67 kB+0.55%25.47 kB25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%129.28 kB129.71 kB+0.54%25.70 kB25.84 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%129.29 kB129.73 kB+0.54%25.69 kB25.83 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-stable/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-experimental/react-server/cjs/react-server-flight.development.js+0.31%148.07 kB148.52 kB+0.68%26.53 kB26.71 kB
oss-stable-semver/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-stable/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-experimental/react-server/cjs/react-server.production.js+0.30%149.81 kB150.25 kB+0.67%26.41 kB26.59 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js+0.24%360.40 kB361.27 kB+0.49%66.82 kB67.14 kB
facebook-www/ReactFlightServer-dev.classic.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
facebook-www/ReactFlightServer-dev.modern.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%210.38 kB210.84 kB+0.44%38.07 kB38.23 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%214.39 kB214.85 kB+0.44%38.66 kB38.83 kB
oss-experimental/react-server/cjs/react-server.development.js+0.21%215.71 kB216.17 kB+0.44%38.09 kB38.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%218.00 kB218.45 kB+0.43%39.38 kB39.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%218.47 kB218.93 kB+0.43%39.49 kB39.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.20%222.11 kB222.56 kB+0.42%39.97 kB40.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.20%222.11 kB222.57 kB+0.42%39.97 kB40.14 kB

Generated by 🚫 dangerJS against 0856999

@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 3 times, most recently from ab70052 to 8fc1b9eCompareApril 22, 2026 16:14
@eps1loneps1lon changed the title [Fiber] Throw special error if rejected Promises are incorrectly instrumentedThrow special error if rejected Promises are incorrectly instrumentedApr 22, 2026
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 2 times, most recently from 4c13990 to 2ba964aCompareApril 23, 2026 19:18
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch from 2ba964a to 0856999CompareMay 27, 2026 09:42
@eps1lon
eps1lon marked this pull request as ready for review May 27, 2026 09:43
@eps1lon
eps1lon merged commit c0cd4d5 into react:mainMay 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-actionsBot 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-actionsBot 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
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
m-kawafuji pushed a commit to m-kawafuji/next.js that referenced this pull request Aug 8, 2026
…#94161)
[diff
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@eps1lon@react-sizebot@unstubbable
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Throw special error if rejected Promises are incorrectly instrumented - #36328

Merged
eps1lon merged 1 commit into
react: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
react:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented

Conversation

@eps1lon

@eps1loneps1lon commented Apr 22, 2026

Copy link
Copy Markdown
Collaborator

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.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Apr 22, 2026
@react-sizebot

react-sizebot commented Apr 22, 2026

Copy link
Copy Markdown

Comparing: cafd63b...0856999

Critical size changes

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

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.16%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js+0.01%614.17 kB614.26 kB+0.04%108.52 kB108.57 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.11%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js+0.01%680.11 kB680.19 kB+0.03%119.48 kB119.51 kB
facebook-www/ReactDOM-prod.classic.js+0.01%700.53 kB700.61 kB+0.03%123.05 kB123.09 kB
facebook-www/ReactDOM-prod.modern.js+0.01%690.84 kB690.93 kB+0.03%121.44 kB121.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-stable/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-experimental/react-server/cjs/react-server-flight.production.js+0.65%68.05 kB68.49 kB+1.33%13.49 kB13.67 kB
facebook-www/ReactFlightServer-prod.classic.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
facebook-www/ReactFlightServer-prod.modern.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.38%114.28 kB114.71 kB+0.66%23.19 kB23.34 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%118.30 kB118.73 kB+0.65%23.95 kB24.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.34 kB24.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.33 kB24.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.35%122.36 kB122.80 kB+0.64%24.52 kB24.67 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%128.23 kB128.67 kB+0.55%25.47 kB25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%129.28 kB129.71 kB+0.54%25.70 kB25.84 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%129.29 kB129.73 kB+0.54%25.69 kB25.83 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-stable/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-experimental/react-server/cjs/react-server-flight.development.js+0.31%148.07 kB148.52 kB+0.68%26.53 kB26.71 kB
oss-stable-semver/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-stable/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-experimental/react-server/cjs/react-server.production.js+0.30%149.81 kB150.25 kB+0.67%26.41 kB26.59 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js+0.24%360.40 kB361.27 kB+0.49%66.82 kB67.14 kB
facebook-www/ReactFlightServer-dev.classic.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
facebook-www/ReactFlightServer-dev.modern.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%210.38 kB210.84 kB+0.44%38.07 kB38.23 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%214.39 kB214.85 kB+0.44%38.66 kB38.83 kB
oss-experimental/react-server/cjs/react-server.development.js+0.21%215.71 kB216.17 kB+0.44%38.09 kB38.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%218.00 kB218.45 kB+0.43%39.38 kB39.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%218.47 kB218.93 kB+0.43%39.49 kB39.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.20%222.11 kB222.56 kB+0.42%39.97 kB40.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.20%222.11 kB222.57 kB+0.42%39.97 kB40.14 kB

Generated by 🚫 dangerJS against 0856999

@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 3 times, most recently from ab70052 to 8fc1b9eCompareApril 22, 2026 16:14
@eps1loneps1lon changed the title [Fiber] Throw special error if rejected Promises are incorrectly instrumentedThrow special error if rejected Promises are incorrectly instrumentedApr 22, 2026
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 2 times, most recently from 4c13990 to 2ba964aCompareApril 23, 2026 19:18
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch from 2ba964a to 0856999CompareMay 27, 2026 09:42
@eps1lon
eps1lon marked this pull request as ready for review May 27, 2026 09:43
@eps1lon
eps1lon merged commit c0cd4d5 into react:mainMay 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-actionsBot 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-actionsBot 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
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
m-kawafuji pushed a commit to m-kawafuji/next.js that referenced this pull request Aug 8, 2026
…#94161)
[diff
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@eps1lon@react-sizebot@unstubbable
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Throw special error if rejected Promises are incorrectly instrumented - #36328

Merged
eps1lon merged 1 commit into
react: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
react:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented

Conversation

@eps1lon

@eps1loneps1lon commented Apr 22, 2026

Copy link
Copy Markdown
Collaborator

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.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Apr 22, 2026
@react-sizebot

react-sizebot commented Apr 22, 2026

Copy link
Copy Markdown

Comparing: cafd63b...0856999

Critical size changes

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

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.16%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js+0.01%614.17 kB614.26 kB+0.04%108.52 kB108.57 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.11%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js+0.01%680.11 kB680.19 kB+0.03%119.48 kB119.51 kB
facebook-www/ReactDOM-prod.classic.js+0.01%700.53 kB700.61 kB+0.03%123.05 kB123.09 kB
facebook-www/ReactDOM-prod.modern.js+0.01%690.84 kB690.93 kB+0.03%121.44 kB121.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-stable/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-experimental/react-server/cjs/react-server-flight.production.js+0.65%68.05 kB68.49 kB+1.33%13.49 kB13.67 kB
facebook-www/ReactFlightServer-prod.classic.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
facebook-www/ReactFlightServer-prod.modern.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.38%114.28 kB114.71 kB+0.66%23.19 kB23.34 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%118.30 kB118.73 kB+0.65%23.95 kB24.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.34 kB24.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.33 kB24.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.35%122.36 kB122.80 kB+0.64%24.52 kB24.67 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%128.23 kB128.67 kB+0.55%25.47 kB25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%129.28 kB129.71 kB+0.54%25.70 kB25.84 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%129.29 kB129.73 kB+0.54%25.69 kB25.83 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-stable/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-experimental/react-server/cjs/react-server-flight.development.js+0.31%148.07 kB148.52 kB+0.68%26.53 kB26.71 kB
oss-stable-semver/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-stable/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-experimental/react-server/cjs/react-server.production.js+0.30%149.81 kB150.25 kB+0.67%26.41 kB26.59 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js+0.24%360.40 kB361.27 kB+0.49%66.82 kB67.14 kB
facebook-www/ReactFlightServer-dev.classic.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
facebook-www/ReactFlightServer-dev.modern.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%210.38 kB210.84 kB+0.44%38.07 kB38.23 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%214.39 kB214.85 kB+0.44%38.66 kB38.83 kB
oss-experimental/react-server/cjs/react-server.development.js+0.21%215.71 kB216.17 kB+0.44%38.09 kB38.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%218.00 kB218.45 kB+0.43%39.38 kB39.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%218.47 kB218.93 kB+0.43%39.49 kB39.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.20%222.11 kB222.56 kB+0.42%39.97 kB40.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.20%222.11 kB222.57 kB+0.42%39.97 kB40.14 kB

Generated by 🚫 dangerJS against 0856999

@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 3 times, most recently from ab70052 to 8fc1b9eCompareApril 22, 2026 16:14
@eps1loneps1lon changed the title [Fiber] Throw special error if rejected Promises are incorrectly instrumentedThrow special error if rejected Promises are incorrectly instrumentedApr 22, 2026
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 2 times, most recently from 4c13990 to 2ba964aCompareApril 23, 2026 19:18
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch from 2ba964a to 0856999CompareMay 27, 2026 09:42
@eps1lon
eps1lon marked this pull request as ready for review May 27, 2026 09:43
@eps1lon
eps1lon merged commit c0cd4d5 into react:mainMay 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-actionsBot 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-actionsBot 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
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
m-kawafuji pushed a commit to m-kawafuji/next.js that referenced this pull request Aug 8, 2026
…#94161)
[diff
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@eps1lon@react-sizebot@unstubbable
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Throw special error if rejected Promises are incorrectly instrumented - #36328

Merged
eps1lon merged 1 commit into
react: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
react:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented

Conversation

@eps1lon

@eps1loneps1lon commented Apr 22, 2026

Copy link
Copy Markdown
Collaborator

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.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Apr 22, 2026
@react-sizebot

react-sizebot commented Apr 22, 2026

Copy link
Copy Markdown

Comparing: cafd63b...0856999

Critical size changes

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

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.16%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js+0.01%614.17 kB614.26 kB+0.04%108.52 kB108.57 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.11%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js+0.01%680.11 kB680.19 kB+0.03%119.48 kB119.51 kB
facebook-www/ReactDOM-prod.classic.js+0.01%700.53 kB700.61 kB+0.03%123.05 kB123.09 kB
facebook-www/ReactDOM-prod.modern.js+0.01%690.84 kB690.93 kB+0.03%121.44 kB121.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-stable/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-experimental/react-server/cjs/react-server-flight.production.js+0.65%68.05 kB68.49 kB+1.33%13.49 kB13.67 kB
facebook-www/ReactFlightServer-prod.classic.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
facebook-www/ReactFlightServer-prod.modern.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.38%114.28 kB114.71 kB+0.66%23.19 kB23.34 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%118.30 kB118.73 kB+0.65%23.95 kB24.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.34 kB24.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.33 kB24.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.35%122.36 kB122.80 kB+0.64%24.52 kB24.67 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%128.23 kB128.67 kB+0.55%25.47 kB25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%129.28 kB129.71 kB+0.54%25.70 kB25.84 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%129.29 kB129.73 kB+0.54%25.69 kB25.83 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-stable/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-experimental/react-server/cjs/react-server-flight.development.js+0.31%148.07 kB148.52 kB+0.68%26.53 kB26.71 kB
oss-stable-semver/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-stable/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-experimental/react-server/cjs/react-server.production.js+0.30%149.81 kB150.25 kB+0.67%26.41 kB26.59 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js+0.24%360.40 kB361.27 kB+0.49%66.82 kB67.14 kB
facebook-www/ReactFlightServer-dev.classic.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
facebook-www/ReactFlightServer-dev.modern.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%210.38 kB210.84 kB+0.44%38.07 kB38.23 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%214.39 kB214.85 kB+0.44%38.66 kB38.83 kB
oss-experimental/react-server/cjs/react-server.development.js+0.21%215.71 kB216.17 kB+0.44%38.09 kB38.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%218.00 kB218.45 kB+0.43%39.38 kB39.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%218.47 kB218.93 kB+0.43%39.49 kB39.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.20%222.11 kB222.56 kB+0.42%39.97 kB40.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.20%222.11 kB222.57 kB+0.42%39.97 kB40.14 kB

Generated by 🚫 dangerJS against 0856999

@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 3 times, most recently from ab70052 to 8fc1b9eCompareApril 22, 2026 16:14
@eps1loneps1lon changed the title [Fiber] Throw special error if rejected Promises are incorrectly instrumentedThrow special error if rejected Promises are incorrectly instrumentedApr 22, 2026
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 2 times, most recently from 4c13990 to 2ba964aCompareApril 23, 2026 19:18
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch from 2ba964a to 0856999CompareMay 27, 2026 09:42
@eps1lon
eps1lon marked this pull request as ready for review May 27, 2026 09:43
@eps1lon
eps1lon merged commit c0cd4d5 into react:mainMay 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-actionsBot 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-actionsBot 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
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
m-kawafuji pushed a commit to m-kawafuji/next.js that referenced this pull request Aug 8, 2026
…#94161)
[diff
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@eps1lon@react-sizebot@unstubbable
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Throw special error if rejected Promises are incorrectly instrumented - #36328

Merged
eps1lon merged 1 commit into
react: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
react:mainfrom
eps1lon:sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented

Conversation

@eps1lon

@eps1loneps1lon commented Apr 22, 2026

Copy link
Copy Markdown
Collaborator

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.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Apr 22, 2026
@react-sizebot

react-sizebot commented Apr 22, 2026

Copy link
Copy Markdown

Comparing: cafd63b...0856999

Critical size changes

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

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.16%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js+0.01%614.17 kB614.26 kB+0.04%108.52 kB108.57 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.11%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js+0.01%680.11 kB680.19 kB+0.03%119.48 kB119.51 kB
facebook-www/ReactDOM-prod.classic.js+0.01%700.53 kB700.61 kB+0.03%123.05 kB123.09 kB
facebook-www/ReactDOM-prod.modern.js+0.01%690.84 kB690.93 kB+0.03%121.44 kB121.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-stable/react-server/cjs/react-server-flight.production.js+0.67%66.24 kB66.69 kB+1.37%13.08 kB13.25 kB
oss-experimental/react-server/cjs/react-server-flight.production.js+0.65%68.05 kB68.49 kB+1.33%13.49 kB13.67 kB
facebook-www/ReactFlightServer-prod.classic.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
facebook-www/ReactFlightServer-prod.modern.js+0.42%103.32 kB103.75 kB+0.73%20.95 kB21.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.39%112.48 kB112.92 kB+0.68%22.80 kB22.96 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js+0.38%114.28 kB114.71 kB+0.66%23.19 kB23.34 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%116.50 kB116.94 kB+0.65%23.58 kB23.73 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js+0.37%118.30 kB118.73 kB+0.65%23.95 kB24.10 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.97 kB24.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%119.42 kB119.85 kB+0.57%23.96 kB24.10 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.36%120.57 kB121.00 kB+0.63%24.16 kB24.31 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.34 kB24.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js+0.36%121.21 kB121.64 kB+0.57%24.33 kB24.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js+0.35%122.36 kB122.80 kB+0.64%24.52 kB24.67 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%126.44 kB126.87 kB+0.55%25.09 kB25.23 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%127.48 kB127.92 kB+0.55%25.33 kB25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%127.50 kB127.93 kB+0.55%25.32 kB25.46 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js+0.34%128.23 kB128.67 kB+0.55%25.47 kB25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js+0.34%129.28 kB129.71 kB+0.54%25.70 kB25.84 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js+0.34%129.29 kB129.73 kB+0.54%25.69 kB25.83 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-stable/react-server/cjs/react-server-flight.development.js+0.31%145.98 kB146.43 kB+0.68%26.07 kB26.24 kB
oss-experimental/react-server/cjs/react-server-flight.development.js+0.31%148.07 kB148.52 kB+0.68%26.53 kB26.71 kB
oss-stable-semver/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-stable/react-server/cjs/react-server.production.js+0.30%146.32 kB146.77 kB+0.69%25.63 kB25.81 kB
oss-experimental/react-server/cjs/react-server.production.js+0.30%149.81 kB150.25 kB+0.67%26.41 kB26.59 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js+0.24%360.40 kB361.27 kB+0.49%66.82 kB67.14 kB
facebook-www/ReactFlightServer-dev.classic.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
facebook-www/ReactFlightServer-dev.modern.js+0.23%199.56 kB200.01 kB+0.47%36.09 kB36.26 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%208.28 kB208.73 kB+0.44%37.66 kB37.82 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js+0.22%210.38 kB210.84 kB+0.44%38.07 kB38.23 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable/react-server/cjs/react-server.development.js+0.22%210.92 kB211.38 kB+0.45%37.18 kB37.34 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%212.30 kB212.76 kB+0.44%38.24 kB38.41 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js+0.21%214.39 kB214.85 kB+0.44%38.66 kB38.83 kB
oss-experimental/react-server/cjs/react-server.development.js+0.21%215.71 kB216.17 kB+0.44%38.09 kB38.26 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%215.89 kB216.35 kB+0.44%38.97 kB39.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%216.37 kB216.82 kB+0.45%39.07 kB39.25 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js+0.21%218.00 kB218.45 kB+0.43%39.38 kB39.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js+0.21%218.47 kB218.93 kB+0.43%39.49 kB39.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.21%220.02 kB220.47 kB+0.43%39.55 kB39.72 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.21%220.02 kB220.48 kB+0.44%39.55 kB39.73 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js+0.20%222.11 kB222.56 kB+0.42%39.97 kB40.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js+0.20%222.11 kB222.57 kB+0.42%39.97 kB40.14 kB

Generated by 🚫 dangerJS against 0856999

@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 3 times, most recently from ab70052 to 8fc1b9eCompareApril 22, 2026 16:14
@eps1loneps1lon changed the title [Fiber] Throw special error if rejected Promises are incorrectly instrumentedThrow special error if rejected Promises are incorrectly instrumentedApr 22, 2026
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch 2 times, most recently from 4c13990 to 2ba964aCompareApril 23, 2026 19:18
@eps1lon
eps1lonforce-pushed the sebbie/04-22-_fiber_throw_special_error_if_rejected_promises_are_incorrectly_instrumented branch from 2ba964a to 0856999CompareMay 27, 2026 09:42
@eps1lon
eps1lon marked this pull request as ready for review May 27, 2026 09:43
@eps1lon
eps1lon merged commit c0cd4d5 into react:mainMay 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-actionsBot 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-actionsBot 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
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request May 30, 2026
…react#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](react@c0cd4d5)
m-kawafuji pushed a commit to m-kawafuji/next.js that referenced this pull request Aug 8, 2026
…#94161)
[diff
react/react@75b0945b...c0cd4d5d](react/react@75b0945...c0cd4d5)
<details>
<summary>React upstream changes</summary>
- react/react#36328
- react/react#36542
- react/react#36544
</details>
---------
Co-authored-by: next-js-bot[bot] <279046576+next-js-bot[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@eps1lon@react-sizebot@unstubbable