Skip to content

Commit b47577b

Browse files
committed
remove unimplemented onError errorInfo argument
RSC has never supported the `errorInfo` argument to `onError` unlike SSR. This PR updates our usage of onError in RSC contexts to clarify that this value does not exist
1 parent 0362f85 commit b47577b

File tree

3 files changed

+29
-29
lines changed

3 files changed

+29
-29
lines changed

packages/next/src/server/app-render/app-render.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import type { DeepReadonly } from '../../shared/lib/deep-readonly'
2222
import type { BaseNextRequest, BaseNextResponse } from '../base-http'
2323
import type { IncomingHttpHeaders } from 'http'
2424

25-
import React, { type JSX } from 'react'
25+
import React, { type ErrorInfo, type JSX } from 'react'
2626

2727
import RenderResult, {
2828
type AppPageRenderResultMetadata,
@@ -1958,13 +1958,13 @@ async function prerenderToStream(
19581958
dynamicTracking,
19591959
}
19601960
let SSRIsDynamic = false
1961-
function SSROnError(err: unknown) {
1961+
function SSROnError(err: unknown, errorInfo?: ErrorInfo) {
19621962
if (err === abortReason || isPrerenderInterruptedError(err)) {
19631963
SSRIsDynamic = true
19641964
return
19651965
}
19661966

1967-
return htmlRendererErrorHandler(err)
1967+
return htmlRendererErrorHandler(err, errorInfo)
19681968
}
19691969

19701970
function SSROnPostpone(reason: string) {
@@ -2255,7 +2255,7 @@ async function prerenderToStream(
22552255
const err = new DynamicServerError(
22562256
`Route ${staticGenerationStore.route} couldn't be rendered statically because it used IO that was not cached in a Server Component. See more info here: https://nextjs.org/docs/messages/dynamic-io`
22572257
)
2258-
serverComponentsErrorHandler(err, {})
2258+
serverComponentsErrorHandler(err)
22592259
throw err
22602260
}
22612261

packages/next/src/server/app-render/create-error-handler.tsx

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { ErrorInfo } from 'react'
2+
13
import stringHash from 'next/dist/compiled/string-hash'
24
import { formatServerError } from '../../lib/format-server-error'
35
import { SpanStatusCode, getTracer } from '../lib/trace/tracer'
@@ -10,27 +12,24 @@ declare global {
1012
var __next_log_error__: undefined | ((err: unknown) => void)
1113
}
1214

13-
type ErrorHandler = (err: unknown, errorInfo?: unknown) => string | undefined
15+
type RSCErrorHandler = (err: unknown) => string | undefined
16+
type SSRErrorHandler = (
17+
err: unknown,
18+
errorInfo?: ErrorInfo
19+
) => string | undefined
1420

1521
export type DigestedError = Error & { digest: string }
1622

1723
export function createFlightReactServerErrorHandler(
1824
dev: boolean,
1925
onReactServerRenderError: (err: any) => void
20-
): ErrorHandler {
21-
return (err: any, errorInfo?: unknown) => {
26+
): RSCErrorHandler {
27+
return (err: any) => {
2228
// If the error already has a digest, respect the original digest,
2329
// so it won't get re-generated into another new error.
2430
if (!err.digest) {
2531
// TODO-APP: look at using webcrypto instead. Requires a promise to be awaited.
26-
err.digest = stringHash(
27-
err.message +
28-
(typeof errorInfo === 'object' &&
29-
errorInfo !== null &&
30-
'stack' in errorInfo
31-
? errorInfo.stack
32-
: err.stack || '')
33-
).toString()
32+
err.digest = stringHash(err.message + err.stack || '').toString()
3433
}
3534

3635
// If the response was closed, we don't need to log the error.
@@ -75,15 +74,13 @@ export function createHTMLReactServerErrorHandler(
7574
reactServerErrors: Map<string, DigestedError>,
7675
silenceLogger: boolean,
7776
onReactServerRenderError: undefined | ((err: any) => void)
78-
): ErrorHandler {
79-
return (err: any, errorInfo: any) => {
77+
): RSCErrorHandler {
78+
return (err: any) => {
8079
// If the error already has a digest, respect the original digest,
8180
// so it won't get re-generated into another new error.
8281
if (!err.digest) {
8382
// TODO-APP: look at using webcrypto instead. Requires a promise to be awaited.
84-
err.digest = stringHash(
85-
err.message + (errorInfo?.stack || err.stack || '')
86-
).toString()
83+
err.digest = stringHash(err.message + (err.stack || '')).toString()
8784
}
8885

8986
// If the response was closed, we don't need to log the error.
@@ -146,9 +143,9 @@ export function createHTMLErrorHandler(
146143
reactServerErrors: Map<string, DigestedError>,
147144
allCapturedErrors: Array<unknown>,
148145
silenceLogger: boolean,
149-
onHTMLRenderSSRError: (err: any) => void
150-
): ErrorHandler {
151-
return (err: any, errorInfo: any) => {
146+
onHTMLRenderSSRError: (err: any, errorInfo?: ErrorInfo) => void
147+
): SSRErrorHandler {
148+
return (err: any, errorInfo?: ErrorInfo) => {
152149
let isSSRError = true
153150

154151
// If the error already has a digest, respect the original digest,
@@ -165,7 +162,10 @@ export function createHTMLErrorHandler(
165162
}
166163
} else {
167164
err.digest = stringHash(
168-
err.message + (errorInfo?.stack || err.stack || '')
165+
err.message +
166+
(typeof (errorInfo as any)?.stack === 'string'
167+
? (errorInfo as any).stack
168+
: err.stack || '')
169169
).toString()
170170
}
171171

@@ -215,7 +215,7 @@ export function createHTMLErrorHandler(
215215
// HTML errors contain RSC errors as well, filter them out before reporting
216216
isSSRError
217217
) {
218-
onHTMLRenderSSRError(err)
218+
onHTMLRenderSSRError(err, errorInfo)
219219
}
220220
}
221221

packages/next/types/react-dom.d.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
declare module 'react-dom/server.edge' {
2-
import type { JSX } from 'react'
2+
import type { ErrorInfo, JSX } from 'react'
33
/**
44
* https://github.com/facebook/react/blob/aec521a96d3f1bebc2ba38553d14f4989c6e88e0/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js#L329-L333
55
*/
@@ -42,7 +42,7 @@ declare module 'react-dom/server.edge' {
4242
bootstrapModules?: Array<string | BootstrapScriptDescriptor>
4343
progressiveChunkSize?: number
4444
signal?: AbortSignal
45-
onError?: (error: unknown) => string | undefined
45+
onError?: (error: unknown, errorInfo: ErrorInfo) => string | undefined
4646
onPostpone?: (reason: string) => void
4747
unstable_externalRuntimeSrc?: string | BootstrapScriptDescriptor
4848
importMap?: {
@@ -71,7 +71,7 @@ declare module 'react-dom/server.edge' {
7171
}
7272

7373
declare module 'react-dom/static.edge' {
74-
import type { JSX } from 'react'
74+
import type { ErrorInfo, JSX } from 'react'
7575
/**
7676
* https://github.com/facebook/react/blob/aec521a96d3f1bebc2ba38553d14f4989c6e88e0/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js#L329-L333
7777
*/
@@ -94,7 +94,7 @@ declare module 'react-dom/static.edge' {
9494
bootstrapModules?: Array<string | BootstrapScriptDescriptor>
9595
progressiveChunkSize?: number
9696
signal?: AbortSignal
97-
onError?: (error: unknown) => string | undefined
97+
onError?: (error: unknown, errorInfo: ErrorInfo) => string | undefined
9898
onPostpone?: (reason: string) => void
9999
unstable_externalRuntimeSrc?: string | BootstrapScriptDescriptor
100100
importMap?: {

0 commit comments

Comments
 (0)