1- import type { ExecutionContext , IncomingRequestCfProperties } from '@cloudflare/workers-types' ;
1+ import type { IncomingRequestCfProperties } from '@cloudflare/workers-types' ;
22import type { CloudflareOptions } from '@sentry/cloudflare' ;
33import { setAsyncLocalStorageAsyncContextStrategy , wrapRequestHandler } from '@sentry/cloudflare' ;
44import { debug , getDefaultIsolationScope , getIsolationScope , getTraceData } from '@sentry/core' ;
@@ -8,50 +8,7 @@ import type { NuxtRenderHTMLContext } from 'nuxt/app';
88import { sentryCaptureErrorHook } from '../hooks/captureErrorHook' ;
99import { updateRouteBeforeResponse } from '../hooks/updateRouteBeforeResponse' ;
1010import { 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' ;
5512
5613/**
5714 * Sentry Cloudflare Nitro plugin for when using the "cloudflare-pages" preset in Nuxt.
@@ -107,13 +64,13 @@ export const sentryCloudflareNitroPlugin =
10764 const request = new Request ( url , {
10865 method : event . method ,
10966 headers : event . headers ,
110- cf : event . context . cf ,
67+ cf : getCfProperties ( event ) ,
11168 } ) as Request < unknown , IncomingRequestCfProperties < unknown > > ;
11269
11370 const requestHandlerOptions = {
11471 options : cloudflareOptions ,
11572 request,
116- context : event . context . cloudflare . context ,
73+ context : getCloudflareProperties ( event ) . context ,
11774 } ;
11875
11976 return wrapRequestHandler ( requestHandlerOptions , ( ) => {
@@ -124,7 +81,7 @@ export const sentryCloudflareNitroPlugin =
12481 const traceData = getTraceData ( ) ;
12582 if ( traceData && Object . keys ( traceData ) . length > 0 ) {
12683 // 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 ) ;
12885 debug . log ( 'Stored trace data for later use in HTML meta-tags: ' , traceData ) ;
12986 }
13087
@@ -144,7 +101,19 @@ export const sentryCloudflareNitroPlugin =
144101
145102 // @ts -expect-error - 'render:html' is a valid hook name in the Nuxt context
146103 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+ }
148117
149118 if ( storedTraceData && Object . keys ( storedTraceData ) . length > 0 ) {
150119 debug . log ( 'Using stored trace data for HTML meta-tags: ' , storedTraceData ) ;
0 commit comments