@@ -70,46 +70,50 @@ export class SentryHttpInstrumentationBeforeOtel extends InstrumentationBase {
70
70
function patchResponseToFlushOnServerlessPlatforms ( res : http . OutgoingMessage ) : void {
71
71
// Freely extend this function with other platforms if necessary
72
72
if ( process . env . VERCEL ) {
73
- let markOnEndDone = ( ) : void => undefined ;
74
- const onEndDonePromise = new Promise < void > ( res => {
75
- markOnEndDone = res ;
76
- } ) ;
77
-
78
- res . on ( 'close' , ( ) => {
79
- markOnEndDone ( ) ;
80
- } ) ;
81
-
82
- // eslint-disable-next-line @typescript-eslint/unbound-method
83
- res . end = new Proxy ( res . end , {
84
- apply ( target , thisArg , argArray ) {
85
- vercelWaitUntil (
86
- new Promise < void > ( finishWaitUntil => {
87
- // Define a timeout that unblocks the lambda just to be safe so we're not indefinitely keeping it alive, exploding server bills
88
- const timeout = setTimeout ( ( ) => {
89
- finishWaitUntil ( ) ;
90
- } , 2000 ) ;
91
-
92
- onEndDonePromise
93
- . then ( ( ) => {
94
- DEBUG_BUILD && logger . log ( 'Flushing events before Vercel Lambda freeze' ) ;
95
- return flush ( 2000 ) ;
96
- } )
97
- . then (
98
- ( ) => {
99
- clearTimeout ( timeout ) ;
100
- finishWaitUntil ( ) ;
101
- } ,
102
- e => {
103
- clearTimeout ( timeout ) ;
104
- DEBUG_BUILD && logger . log ( 'Error while flushing events for Vercel:\n' , e ) ;
105
- finishWaitUntil ( ) ;
106
- } ,
107
- ) ;
108
- } ) ,
109
- ) ;
110
-
111
- return target . apply ( thisArg , argArray ) ;
112
- } ,
113
- } ) ;
73
+ // In some cases res.end does not seem to be defined leading to errors if passed to Proxy
74
+ // https://github.com/getsentry/sentry-javascript/issues/15759
75
+ if ( typeof res . end === 'function' ) {
76
+ let markOnEndDone = ( ) : void => undefined ;
77
+ const onEndDonePromise = new Promise < void > ( res => {
78
+ markOnEndDone = res ;
79
+ } ) ;
80
+
81
+ res . on ( 'close' , ( ) => {
82
+ markOnEndDone ( ) ;
83
+ } ) ;
84
+
85
+ // eslint-disable-next-line @typescript-eslint/unbound-method
86
+ res . end = new Proxy ( res . end , {
87
+ apply ( target , thisArg , argArray ) {
88
+ vercelWaitUntil (
89
+ new Promise < void > ( finishWaitUntil => {
90
+ // Define a timeout that unblocks the lambda just to be safe so we're not indefinitely keeping it alive, exploding server bills
91
+ const timeout = setTimeout ( ( ) => {
92
+ finishWaitUntil ( ) ;
93
+ } , 2000 ) ;
94
+
95
+ onEndDonePromise
96
+ . then ( ( ) => {
97
+ DEBUG_BUILD && logger . log ( 'Flushing events before Vercel Lambda freeze' ) ;
98
+ return flush ( 2000 ) ;
99
+ } )
100
+ . then (
101
+ ( ) => {
102
+ clearTimeout ( timeout ) ;
103
+ finishWaitUntil ( ) ;
104
+ } ,
105
+ e => {
106
+ clearTimeout ( timeout ) ;
107
+ DEBUG_BUILD && logger . log ( 'Error while flushing events for Vercel:\n' , e ) ;
108
+ finishWaitUntil ( ) ;
109
+ } ,
110
+ ) ;
111
+ } ) ,
112
+ ) ;
113
+
114
+ return target . apply ( thisArg , argArray ) ;
115
+ } ,
116
+ } ) ;
117
+ }
114
118
}
115
119
}
0 commit comments