@@ -13,12 +13,14 @@ import {
1313 tracingContextFromHeaders ,
1414} from '@sentry/utils' ;
1515
16+ import { getFutureFlagsServer } from './futureFlags' ;
1617import type {
1718 AppData ,
1819 CreateRequestHandlerFunction ,
1920 DataFunction ,
2021 DataFunctionArgs ,
2122 EntryContext ,
23+ FutureConfig ,
2224 HandleDocumentRequestFunction ,
2325 ReactRouterDomPkg ,
2426 RemixRequest ,
@@ -30,6 +32,8 @@ import type {
3032import { extractData , getRequestMatch , isDeferredData , isResponse , json , matchServerRoutes } from './vendor/response' ;
3133import { normalizeRemixRequest } from './web-fetch' ;
3234
35+ let FUTURE_FLAGS : FutureConfig | undefined ;
36+
3337// Flag to track if the core request handler is instrumented.
3438export let isRequestHandlerWrapped = false ;
3539
@@ -56,7 +60,16 @@ async function extractResponseError(response: Response): Promise<unknown> {
5660 return responseData ;
5761}
5862
59- async function captureRemixServerException ( err : unknown , name : string , request : Request ) : Promise < void > {
63+ /**
64+ * Captures an exception happened in the Remix server.
65+ *
66+ * @param err The error to capture.
67+ * @param name The name of the origin function.
68+ * @param request The request object.
69+ *
70+ * @returns A promise that resolves when the exception is captured.
71+ */
72+ export async function captureRemixServerException ( err : unknown , name : string , request : Request ) : Promise < void > {
6073 // Skip capturing if the thrown error is not a 5xx response
6174 // https://remix.run/docs/en/v1/api/conventions#throwing-responses-in-loaders
6275 if ( isResponse ( err ) && err . status < 500 ) {
@@ -145,7 +158,10 @@ function makeWrappedDocumentRequestFunction(
145158
146159 span ?. finish ( ) ;
147160 } catch ( err ) {
148- await captureRemixServerException ( err , 'documentRequest' , request ) ;
161+ if ( ! FUTURE_FLAGS ?. v2_errorBoundary ) {
162+ await captureRemixServerException ( err , 'documentRequest' , request ) ;
163+ }
164+
149165 throw err ;
150166 }
151167
@@ -182,7 +198,10 @@ function makeWrappedDataFunction(origFn: DataFunction, id: string, name: 'action
182198 currentScope . setSpan ( activeTransaction ) ;
183199 span ?. finish ( ) ;
184200 } catch ( err ) {
185- await captureRemixServerException ( err , name , args . request ) ;
201+ if ( ! FUTURE_FLAGS ?. v2_errorBoundary ) {
202+ await captureRemixServerException ( err , name , args . request ) ;
203+ }
204+
186205 throw err ;
187206 }
188207
@@ -431,6 +450,7 @@ function makeWrappedCreateRequestHandler(
431450 isRequestHandlerWrapped = true ;
432451
433452 return function ( this : unknown , build : ServerBuild , ...args : unknown [ ] ) : RequestHandler {
453+ FUTURE_FLAGS = getFutureFlagsServer ( build ) ;
434454 const newBuild = instrumentBuild ( build ) ;
435455 const requestHandler = origCreateRequestHandler . call ( this , newBuild , ...args ) ;
436456
0 commit comments