Skip to content

Commit

Permalink
separate callback into different handler
Browse files Browse the repository at this point in the history
  • Loading branch information
huozhi committed Aug 13, 2024
1 parent 67cdcf4 commit c309970
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 32 deletions.
36 changes: 14 additions & 22 deletions packages/next/src/server/app-render/app-render.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1233,23 +1233,20 @@ async function renderToStream(

const reactServerErrorsByDigest: Map<string, DigestedError> = new Map()
const silenceLogger = false
const serverComponentsErrorHandler = createHTMLReactServerErrorHandler(
!!renderOpts.dev,
!!renderOpts.nextExport,
reactServerErrorsByDigest,
silenceLogger,
// RSC rendering error will report as SSR error
// @TODO we should report RSC errors where they happen for instrumentation purposes
// and should omit the error reporter in the SSR layer instead
undefined
)
function onHTMLRenderRSCError(err: DigestedError) {
return renderOpts.onInstrumentationRequestError?.(
err,
req,
createErrorContext(ctx, 'react-server-components')
)
}
const serverComponentsErrorHandler = createHTMLReactServerErrorHandler(
!!renderOpts.dev,
!!renderOpts.nextExport,
reactServerErrorsByDigest,
silenceLogger,
onHTMLRenderRSCError
)

function onHTMLRenderSSRError(err: DigestedError) {
return renderOpts.onInstrumentationRequestError?.(
Expand All @@ -1266,7 +1263,6 @@ async function renderToStream(
reactServerErrorsByDigest,
allCapturedErrors,
silenceLogger,
onHTMLRenderRSCError,
onHTMLRenderSSRError
)

Expand Down Expand Up @@ -1651,23 +1647,20 @@ async function prerenderToStream(
const reactServerErrorsByDigest: Map<string, DigestedError> = new Map()
// We don't report errors during prerendering through our instrumentation hooks
const silenceLogger = !!renderOpts.experimental.isRoutePPREnabled
const serverComponentsErrorHandler = createHTMLReactServerErrorHandler(
!!renderOpts.dev,
!!renderOpts.nextExport,
reactServerErrorsByDigest,
silenceLogger,
// RSC rendering error will report as SSR error
// @TODO we should report RSC errors where they happen for instrumentation purposes
// and should omit the error reporter in the SSR layer instead
undefined
)
function onHTMLRenderRSCError(err: DigestedError) {
return renderOpts.onInstrumentationRequestError?.(
err,
req,
createErrorContext(ctx, 'react-server-components')
)
}
const serverComponentsErrorHandler = createHTMLReactServerErrorHandler(
!!renderOpts.dev,
!!renderOpts.nextExport,
reactServerErrorsByDigest,
silenceLogger,
onHTMLRenderRSCError
)

function onHTMLRenderSSRError(err: DigestedError) {
return renderOpts.onInstrumentationRequestError?.(
Expand All @@ -1683,7 +1676,6 @@ async function prerenderToStream(
reactServerErrorsByDigest,
allCapturedErrors,
silenceLogger,
onHTMLRenderRSCError,
onHTMLRenderSSRError
)

Expand Down
19 changes: 9 additions & 10 deletions packages/next/src/server/app-render/create-error-handler.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -141,20 +141,19 @@ export function createHTMLErrorHandler(
reactServerErrors: Map<string, DigestedError>,
allCapturedErrors: Array<unknown>,
silenceLogger: boolean,
onHTMLRenderRSCError: (err: any) => void,
onHTMLRenderSSRError: (err: any) => void
): ErrorHandler {
return (err: any, errorInfo: any) => {
let isRSCError = false
let isSSRError = true

// If the error already has a digest, respect the original digest,
// so it won't get re-generated into another new error.

if (err.digest) {
if (reactServerErrors.has(err.digest)) {
isRSCError = true
// This error is likely an obfuscated error from react-server.
// We recover the original error here.
err = reactServerErrors.get(err.digest)
isSSRError = false
} else {
// The error is not from react-server but has a digest
// from other means so we don't need to produce a new one
Expand Down Expand Up @@ -206,12 +205,12 @@ export function createHTMLErrorHandler(
})
}

if (!silenceLogger) {
if (isRSCError) {
onHTMLRenderRSCError(err)
} else {
onHTMLRenderSSRError(err)
}
if (
!silenceLogger &&
// HTML errors contain RSC errors as well, filter them out before reporting
isSSRError
) {
onHTMLRenderSSRError(err)
}
}

Expand Down

0 comments on commit c309970

Please sign in to comment.