@@ -10,12 +10,20 @@ import {
10
10
} from '@sentry/core' ;
11
11
import type { AppLoadContext , EntryContext , RouterContextProvider } from 'react-router' ;
12
12
13
- type OriginalHandleRequest = (
13
+ type OriginalHandleRequestWithoutMiddleware = (
14
14
request : Request ,
15
15
responseStatusCode : number ,
16
16
responseHeaders : Headers ,
17
17
routerContext : EntryContext ,
18
- loadContext : AppLoadContext | RouterContextProvider ,
18
+ loadContext : AppLoadContext ,
19
+ ) => Promise < unknown > ;
20
+
21
+ type OriginalHandleRequestWithMiddleware = (
22
+ request : Request ,
23
+ responseStatusCode : number ,
24
+ responseHeaders : Headers ,
25
+ routerContext : EntryContext ,
26
+ loadContext : RouterContextProvider ,
19
27
) => Promise < unknown > ;
20
28
21
29
/**
@@ -24,7 +32,27 @@ type OriginalHandleRequest = (
24
32
* @param originalHandle - The original handleRequest function to wrap
25
33
* @returns A wrapped version of the handle request function with Sentry instrumentation
26
34
*/
27
- export function wrapSentryHandleRequest ( originalHandle : OriginalHandleRequest ) : OriginalHandleRequest {
35
+ export function wrapSentryHandleRequest (
36
+ originalHandle : OriginalHandleRequestWithoutMiddleware ,
37
+ ) : OriginalHandleRequestWithoutMiddleware ;
38
+ /**
39
+ * Wraps the original handleRequest function to add Sentry instrumentation.
40
+ *
41
+ * @param originalHandle - The original handleRequest function to wrap
42
+ * @returns A wrapped version of the handle request function with Sentry instrumentation
43
+ */
44
+ export function wrapSentryHandleRequest (
45
+ originalHandle : OriginalHandleRequestWithMiddleware ,
46
+ ) : OriginalHandleRequestWithMiddleware ;
47
+ /**
48
+ * Wraps the original handleRequest function to add Sentry instrumentation.
49
+ *
50
+ * @param originalHandle - The original handleRequest function to wrap
51
+ * @returns A wrapped version of the handle request function with Sentry instrumentation
52
+ */
53
+ export function wrapSentryHandleRequest (
54
+ originalHandle : OriginalHandleRequestWithoutMiddleware | OriginalHandleRequestWithMiddleware ,
55
+ ) : OriginalHandleRequestWithoutMiddleware | OriginalHandleRequestWithMiddleware {
28
56
return async function sentryInstrumentedHandleRequest (
29
57
request : Request ,
30
58
responseStatusCode : number ,
@@ -57,10 +85,39 @@ export function wrapSentryHandleRequest(originalHandle: OriginalHandleRequest):
57
85
}
58
86
59
87
try {
60
- return await originalHandle ( request , responseStatusCode , responseHeaders , routerContext , loadContext ) ;
88
+ // Type guard to call the correct overload based on loadContext type
89
+ if ( isRouterContextProvider ( loadContext ) ) {
90
+ // loadContext is RouterContextProvider
91
+ return await ( originalHandle as OriginalHandleRequestWithMiddleware ) (
92
+ request ,
93
+ responseStatusCode ,
94
+ responseHeaders ,
95
+ routerContext ,
96
+ loadContext ,
97
+ ) ;
98
+ } else {
99
+ // loadContext is AppLoadContext
100
+ return await ( originalHandle as OriginalHandleRequestWithoutMiddleware ) (
101
+ request ,
102
+ responseStatusCode ,
103
+ responseHeaders ,
104
+ routerContext ,
105
+ loadContext ,
106
+ ) ;
107
+ }
61
108
} finally {
62
109
await flushIfServerless ( ) ;
63
110
}
111
+
112
+ /**
113
+ * Helper type guard to determine if the context is a RouterContextProvider.
114
+ *
115
+ * @param ctx - The context to check
116
+ * @returns True if the context is a RouterContextProvider
117
+ */
118
+ function isRouterContextProvider ( ctx : AppLoadContext | RouterContextProvider ) : ctx is RouterContextProvider {
119
+ return typeof ( ctx as RouterContextProvider ) ?. get === 'function' ;
120
+ }
64
121
} ;
65
122
}
66
123
0 commit comments