@@ -78,11 +78,13 @@ const defaultNetworkOptions: NetworkRecordOptions = {
78
78
type Headers = Record < string , string > ;
79
79
80
80
type NetworkRequest = {
81
- performanceEntry : PerformanceEntry ;
81
+ requestUrl : string ;
82
82
requestMethod : string ;
83
+ requestInitiator : InitiatorType ;
83
84
requestHeaders ?: Headers ;
84
85
requestBody ?: string | null ;
85
86
responseStatus ?: number ;
87
+ responseDuration : number ;
86
88
responseHeaders ?: Headers ;
87
89
responseBody ?: string | null ;
88
90
} ;
@@ -101,6 +103,13 @@ const isResourceTiming = (
101
103
entry : PerformanceEntry ,
102
104
) : entry is PerformanceResourceTiming => entry . entryType === 'resource' ;
103
105
106
+ type ObservedPerformanceEntry = (
107
+ | PerformanceNavigationTiming
108
+ | PerformanceResourceTiming
109
+ ) & {
110
+ responseStatus ?: number ;
111
+ } ;
112
+
104
113
function initPerformanceObserver (
105
114
cb : networkCallback ,
106
115
win : IWindow ,
@@ -110,7 +119,7 @@ function initPerformanceObserver(
110
119
const initialPerformanceEntries = win . performance
111
120
. getEntries ( )
112
121
. filter (
113
- ( entry ) =>
122
+ ( entry ) : entry is ObservedPerformanceEntry =>
114
123
isNavigationTiming ( entry ) ||
115
124
( isResourceTiming ( entry ) &&
116
125
options . initiatorTypes . includes (
@@ -119,8 +128,14 @@ function initPerformanceObserver(
119
128
) ;
120
129
cb ( {
121
130
requests : initialPerformanceEntries . map ( ( performanceEntry ) => ( {
122
- performanceEntry,
131
+ requestUrl : performanceEntry . name ,
123
132
requestMethod : 'GET' ,
133
+ requestInitiator : performanceEntry . initiatorType as InitiatorType ,
134
+ responseStatus :
135
+ 'responseStatus' in performanceEntry
136
+ ? performanceEntry . responseStatus
137
+ : undefined ,
138
+ responseDuration : Math . round ( performanceEntry . duration ) ,
124
139
} ) ) ,
125
140
isInitial : true ,
126
141
} ) ;
@@ -129,7 +144,7 @@ function initPerformanceObserver(
129
144
const performanceEntries = entries
130
145
. getEntries ( )
131
146
. filter (
132
- ( entry ) =>
147
+ ( entry ) : entry is ObservedPerformanceEntry =>
133
148
isNavigationTiming ( entry ) ||
134
149
( isResourceTiming ( entry ) &&
135
150
options . initiatorTypes . includes (
@@ -140,8 +155,14 @@ function initPerformanceObserver(
140
155
) ;
141
156
cb ( {
142
157
requests : performanceEntries . map ( ( performanceEntry ) => ( {
143
- performanceEntry,
158
+ requestUrl : performanceEntry . name ,
144
159
requestMethod : 'GET' ,
160
+ requestInitiator : performanceEntry . initiatorType as InitiatorType ,
161
+ responseStatus :
162
+ 'responseStatus' in performanceEntry
163
+ ? performanceEntry . responseStatus
164
+ : undefined ,
165
+ responseDuration : Math . round ( performanceEntry . duration ) ,
145
166
} ) ) ,
146
167
} ) ;
147
168
} ) ;
@@ -158,11 +179,13 @@ const getRequestPerformanceEntry = async (
158
179
after ?: number ,
159
180
before ?: number ,
160
181
attempt = 0 ,
161
- ) : Promise < PerformanceEntry > => {
182
+ ) : Promise < PerformanceResourceTiming > => {
162
183
if ( attempt > 10 ) {
163
184
throw new Error ( 'Cannot find performance entry' ) ;
164
185
}
165
- const urlPerformanceEntries = win . performance . getEntriesByName ( url ) ;
186
+ const urlPerformanceEntries = win . performance . getEntriesByName (
187
+ url ,
188
+ ) as PerformanceResourceTiming [ ] ;
166
189
const performanceEntry = findLast (
167
190
urlPerformanceEntries ,
168
191
( performanceEntry ) =>
@@ -301,10 +324,15 @@ function initXhrObserver(
301
324
)
302
325
. then ( ( performanceEntry ) => {
303
326
const request : NetworkRequest = {
304
- performanceEntry,
327
+ requestUrl : performanceEntry . name ,
305
328
requestMethod : req . method ,
329
+ requestInitiator : performanceEntry . initiatorType as InitiatorType ,
330
+ requestHeaders : networkRequest . requestHeaders ,
331
+ requestBody : networkRequest . requestBody ,
306
332
responseStatus : xhr . status ,
307
- ...networkRequest ,
333
+ responseDuration : performanceEntry . duration ,
334
+ responseHeaders : networkRequest . responseHeaders ,
335
+ responseBody : networkRequest . responseBody ,
308
336
} ;
309
337
cb ( { requests : [ request ] } ) ;
310
338
} )
@@ -355,6 +383,7 @@ function initFetchObserver(
355
383
const originalFetch = win . fetch ;
356
384
const wrappedFetch : typeof fetch = async ( url , init ) => {
357
385
const req = new Request ( url , init ) ;
386
+ let res : Response | undefined ;
358
387
const networkRequest : Partial < NetworkRequest > = { } ;
359
388
let after : number | undefined ;
360
389
let before : number | undefined ;
@@ -378,7 +407,7 @@ function initFetchObserver(
378
407
}
379
408
}
380
409
after = win . performance . now ( ) ;
381
- const res = await originalFetch ( req ) ;
410
+ res = await originalFetch ( req ) ;
382
411
before = win . performance . now ( ) ;
383
412
networkRequest . responseStatus = res . status ;
384
413
if ( recordResponseHeaders ) {
@@ -410,9 +439,15 @@ function initFetchObserver(
410
439
getRequestPerformanceEntry ( win , 'fetch' , req . url , after , before )
411
440
. then ( ( performanceEntry ) => {
412
441
const request : NetworkRequest = {
413
- performanceEntry,
442
+ requestUrl : performanceEntry . name ,
414
443
requestMethod : req . method ,
415
- ...networkRequest ,
444
+ requestInitiator : performanceEntry . initiatorType as InitiatorType ,
445
+ requestHeaders : networkRequest . requestHeaders ,
446
+ requestBody : networkRequest . requestBody ,
447
+ responseStatus : res ?. status ,
448
+ responseDuration : performanceEntry . duration ,
449
+ responseHeaders : networkRequest . responseHeaders ,
450
+ responseBody : networkRequest . responseBody ,
416
451
} ;
417
452
cb ( { requests : [ request ] } ) ;
418
453
} )
0 commit comments