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,71 +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 EventBase {
13- protocol : string ;
14- host : string ;
15- method : string ;
16- headers : Record < string , string > ;
17- }
18-
19- interface MinimalCfProps {
20- httpProtocol ?: string ;
21- country ?: string ;
22- // ...other CF properties
23- }
24-
25- interface MinimalCloudflareProps {
26- context : ExecutionContext ;
27- request ?: Record < string , unknown > ;
28- env ?: Record < string , unknown > ;
29- }
30-
31- // Direct shape: cf and cloudflare are directly on context
32- interface CfEventDirect extends EventBase {
33- context : {
34- cf : MinimalCfProps ;
35- cloudflare : MinimalCloudflareProps ;
36- } ;
37- }
38-
39- // Nested shape: cf and cloudflare are under _platform
40- // Since Nitro v2.12.0 (PR: https://github.com/nitrojs/nitro/commit/911a63bc478183acb472d05e977584dcdce61abf)
41- interface CfEventPlatform extends EventBase {
42- context : {
43- _platform : {
44- cf : MinimalCfProps ;
45- cloudflare : MinimalCloudflareProps ;
46- } ;
47- } ;
48- }
49-
50- type CfEventType = CfEventDirect | CfEventPlatform ;
51-
52- function isEventType ( event : unknown ) : event is CfEventType {
53- if ( event === null || typeof event !== 'object' ) return false ;
54-
55- return (
56- // basic properties
57- 'protocol' in event &&
58- 'host' in event &&
59- typeof event . protocol === 'string' &&
60- typeof event . host === 'string' &&
61- // context property
62- 'context' in event &&
63- typeof event . context === 'object' &&
64- event . context !== null &&
65- // context.cf properties
66- 'cf' in event . context &&
67- typeof event . context . cf === 'object' &&
68- event . context . cf !== null &&
69- // context.cloudflare properties
70- 'cloudflare' in event . context &&
71- typeof event . context . cloudflare === 'object' &&
72- event . context . cloudflare !== null &&
73- 'context' in event . context . cloudflare
74- ) ;
75- }
11+ import { getCfProperties , getCloudflareProperties , isEventType } from '../utils/event-type' ;
7612
7713/**
7814 * Sentry Cloudflare Nitro plugin for when using the "cloudflare-pages" preset in Nuxt.
@@ -128,13 +64,13 @@ export const sentryCloudflareNitroPlugin =
12864 const request = new Request ( url , {
12965 method : event . method ,
13066 headers : event . headers ,
131- cf : event . context . cf ,
67+ cf : getCfProperties ( event ) ,
13268 } ) as Request < unknown , IncomingRequestCfProperties < unknown > > ;
13369
13470 const requestHandlerOptions = {
13571 options : cloudflareOptions ,
13672 request,
137- context : event . context . cloudflare . context ,
73+ context : getCloudflareProperties ( event ) . context ,
13874 } ;
13975
14076 return wrapRequestHandler ( requestHandlerOptions , ( ) => {
@@ -145,7 +81,7 @@ export const sentryCloudflareNitroPlugin =
14581 const traceData = getTraceData ( ) ;
14682 if ( traceData && Object . keys ( traceData ) . length > 0 ) {
14783 // Storing trace data in the WeakMap using event.context.cf as key for later use in HTML meta-tags
148- traceDataMap . set ( event . context . cf , traceData ) ;
84+ traceDataMap . set ( getCfProperties ( event ) , traceData ) ;
14985 debug . log ( 'Stored trace data for later use in HTML meta-tags: ' , traceData ) ;
15086 }
15187
0 commit comments