1
- import type { ExecutionContext , IncomingRequestCfProperties } from '@cloudflare/workers-types' ;
1
+ import type { IncomingRequestCfProperties } from '@cloudflare/workers-types' ;
2
2
import type { CloudflareOptions } from '@sentry/cloudflare' ;
3
3
import { setAsyncLocalStorageAsyncContextStrategy , wrapRequestHandler } from '@sentry/cloudflare' ;
4
4
import { debug , getDefaultIsolationScope , getIsolationScope , getTraceData } from '@sentry/core' ;
@@ -8,50 +8,7 @@ import type { NuxtRenderHTMLContext } from 'nuxt/app';
8
8
import { sentryCaptureErrorHook } from '../hooks/captureErrorHook' ;
9
9
import { updateRouteBeforeResponse } from '../hooks/updateRouteBeforeResponse' ;
10
10
import { addSentryTracingMetaTags } from '../utils' ;
11
-
12
- interface CfEventType {
13
- protocol : string ;
14
- host : string ;
15
- method : string ;
16
- headers : Record < string , string > ;
17
- context : {
18
- cf : {
19
- httpProtocol ?: string ;
20
- country ?: string ;
21
- // ...other CF properties
22
- } ;
23
- cloudflare : {
24
- context : ExecutionContext ;
25
- request ?: Record < string , unknown > ;
26
- env ?: Record < string , unknown > ;
27
- } ;
28
- } ;
29
- }
30
-
31
- function isEventType ( event : unknown ) : event is CfEventType {
32
- if ( event === null || typeof event !== 'object' ) return false ;
33
-
34
- return (
35
- // basic properties
36
- 'protocol' in event &&
37
- 'host' in event &&
38
- typeof event . protocol === 'string' &&
39
- typeof event . host === 'string' &&
40
- // context property
41
- 'context' in event &&
42
- typeof event . context === 'object' &&
43
- event . context !== null &&
44
- // context.cf properties
45
- 'cf' in event . context &&
46
- typeof event . context . cf === 'object' &&
47
- event . context . cf !== null &&
48
- // context.cloudflare properties
49
- 'cloudflare' in event . context &&
50
- typeof event . context . cloudflare === 'object' &&
51
- event . context . cloudflare !== null &&
52
- 'context' in event . context . cloudflare
53
- ) ;
54
- }
11
+ import { getCfProperties , getCloudflareProperties , hasCfProperty , isEventType } from '../utils/event-type-check' ;
55
12
56
13
/**
57
14
* Sentry Cloudflare Nitro plugin for when using the "cloudflare-pages" preset in Nuxt.
@@ -107,13 +64,13 @@ export const sentryCloudflareNitroPlugin =
107
64
const request = new Request ( url , {
108
65
method : event . method ,
109
66
headers : event . headers ,
110
- cf : event . context . cf ,
67
+ cf : getCfProperties ( event ) ,
111
68
} ) as Request < unknown , IncomingRequestCfProperties < unknown > > ;
112
69
113
70
const requestHandlerOptions = {
114
71
options : cloudflareOptions ,
115
72
request,
116
- context : event . context . cloudflare . context ,
73
+ context : getCloudflareProperties ( event ) . context ,
117
74
} ;
118
75
119
76
return wrapRequestHandler ( requestHandlerOptions , ( ) => {
@@ -124,7 +81,7 @@ export const sentryCloudflareNitroPlugin =
124
81
const traceData = getTraceData ( ) ;
125
82
if ( traceData && Object . keys ( traceData ) . length > 0 ) {
126
83
// Storing trace data in the WeakMap using event.context.cf as key for later use in HTML meta-tags
127
- traceDataMap . set ( event . context . cf , traceData ) ;
84
+ traceDataMap . set ( getCfProperties ( event ) , traceData ) ;
128
85
debug . log ( 'Stored trace data for later use in HTML meta-tags: ' , traceData ) ;
129
86
}
130
87
@@ -144,7 +101,19 @@ export const sentryCloudflareNitroPlugin =
144
101
145
102
// @ts -expect-error - 'render:html' is a valid hook name in the Nuxt context
146
103
nitroApp . hooks . hook ( 'render:html' , ( html : NuxtRenderHTMLContext , { event } : { event : H3Event } ) => {
147
- const storedTraceData = event ?. context ?. cf ? traceDataMap . get ( event . context . cf ) : undefined ;
104
+ let storedTraceData : ReturnType < typeof getTraceData > | undefined = undefined ;
105
+
106
+ if (
107
+ event ?. context &&
108
+ '_platform' in event . context &&
109
+ event . context . _platform &&
110
+ hasCfProperty ( event . context . _platform )
111
+ ) {
112
+ storedTraceData = traceDataMap . get ( event . context . _platform . cf ) ;
113
+ } else if ( event ?. context && hasCfProperty ( event . context ) ) {
114
+ // legacy support (before Nitro v2.11.7 (PR: https://github.com/nitrojs/nitro/pull/3224))
115
+ storedTraceData = traceDataMap . get ( event . context . cf ) ;
116
+ }
148
117
149
118
if ( storedTraceData && Object . keys ( storedTraceData ) . length > 0 ) {
150
119
debug . log ( 'Using stored trace data for HTML meta-tags: ' , storedTraceData ) ;
0 commit comments