@@ -4,6 +4,15 @@ import { Event } from '@sentry/types';
4
4
const storeUrlRegex = / \. s e n t r y \. i o \/ a p i \/ \d + \/ s t o r e \/ / ;
5
5
const envelopeUrlRegex = / \. s e n t r y \. i o \/ a p i \/ \d + \/ e n v e l o p e \/ / ;
6
6
7
+ const storeRequestParser = ( request : Request | null ) : Event => JSON . parse ( ( request && request . postData ( ) ) || '' ) ;
8
+ const envelopeRequestParser = ( request : Request | null ) : Event => {
9
+ // https://develop.sentry.dev/sdk/envelopes/
10
+ const envelope = request ?. postData ( ) || '' ;
11
+
12
+ // Third row of the envelop is the event payload.
13
+ return envelope . split ( '\n' ) . map ( line => JSON . parse ( line ) ) [ 2 ] ;
14
+ } ;
15
+
7
16
type SentryRequestType = 'event' | 'transaction' ;
8
17
9
18
/**
@@ -31,28 +40,34 @@ async function waitForSentryRequest(page: Page, requestType: SentryRequestType =
31
40
* Wait and get Sentry's request sending the event at the given URL, or the current page
32
41
*
33
42
* @param {Page } page
34
- * @param {string } url
43
+ * @param {string } [ url]
35
44
* @return {* } {Promise<Event>}
36
45
*/
37
46
async function getSentryRequest ( page : Page , url ?: string ) : Promise < Event > {
38
- const request = ( await Promise . all ( [ page . goto ( url || '#' ) , waitForSentryRequest ( page ) ] ) ) [ 1 ] ;
47
+ const request = ( await Promise . all ( [ url ? page . goto ( url ) : Promise . resolve ( null ) , waitForSentryRequest ( page ) ] ) ) [ 1 ] ;
39
48
40
- return JSON . parse ( ( request && request . postData ( ) ) || '' ) ;
49
+ return storeRequestParser ( request ) ;
41
50
}
42
51
52
+ /**
53
+ * Wait and get Sentry's request sending transaction at the given URL, or the current page
54
+ *
55
+ * @param {Page } page
56
+ * @param {string } [url]
57
+ * @return {* } {Promise<Event>}
58
+ */
43
59
async function getSentryTransactionRequest ( page : Page , url ?: string ) : Promise < Event > {
44
- const request = ( await Promise . all ( [ page . goto ( url || '#' ) , waitForSentryRequest ( page , 'transaction' ) ] ) ) [ 1 ] ;
60
+ const request = (
61
+ await Promise . all ( [ url ? page . goto ( url ) : Promise . resolve ( null ) , waitForSentryRequest ( page , 'transaction' ) ] )
62
+ ) [ 1 ] ;
45
63
46
64
try {
47
- // https://develop.sentry.dev/sdk/envelopes/
48
- const envelope = request ?. postData ( ) || '' ;
49
-
50
- // Third row of the envelop is the event payload.
51
- return envelope . split ( '\n' ) . map ( line => JSON . parse ( line ) ) [ 2 ] ;
65
+ return envelopeRequestParser ( request ) ;
52
66
} catch ( err ) {
53
67
return Promise . reject ( err ) ;
54
68
}
55
69
}
70
+
56
71
/**
57
72
* Get Sentry events at the given URL, or the current page.
58
73
*
@@ -70,24 +85,31 @@ async function getSentryEvents(page: Page, url?: string): Promise<Array<Event>>
70
85
}
71
86
72
87
/**
73
- * Wait and get multiple event requests at the given URL, or the current page
88
+ * Wait and get multiple requests matching urlRgx at the given URL, or the current page
74
89
*
75
90
* @param {Page } page
76
91
* @param {number } count
77
- * @param {string } url
78
- * @return {* } {Promise<Event>}
92
+ * @param {RegExp } urlRgx
93
+ * @param {(req: Request) => Event } requestParser
94
+ * @param {string } [url]
95
+ * @return {* } {Promise<Event[]>}
79
96
*/
80
- async function getMultipleSentryRequests ( page : Page , count : number , url ?: string ) : Promise < Event [ ] > {
97
+ async function getMultipleRequests (
98
+ page : Page ,
99
+ count : number ,
100
+ urlRgx : RegExp ,
101
+ requestParser : ( req : Request ) => Event ,
102
+ url ?: string ,
103
+ ) : Promise < Event [ ] > {
81
104
const requests : Promise < Event [ ] > = new Promise ( ( resolve , reject ) => {
82
105
let reqCount = count ;
83
106
const requestData : Event [ ] = [ ] ;
84
107
85
108
page . on ( 'request' , request => {
86
- if ( storeUrlRegex . test ( request . url ( ) ) ) {
109
+ if ( urlRgx . test ( request . url ( ) ) ) {
87
110
try {
88
111
reqCount -= 1 ;
89
- requestData . push ( JSON . parse ( ( request && request . postData ( ) ) || '' ) ) ;
90
-
112
+ requestData . push ( requestParser ( request ) ) ;
91
113
if ( reqCount === 0 ) {
92
114
resolve ( requestData ) ;
93
115
}
@@ -105,6 +127,30 @@ async function getMultipleSentryRequests(page: Page, count: number, url?: string
105
127
return requests ;
106
128
}
107
129
130
+ /**
131
+ * Wait and get multiple event requests at the given URL, or the current page
132
+ *
133
+ * @param {Page } page
134
+ * @param {number } count
135
+ * @param {string } [url]
136
+ * @return {* } {Promise<Event>}
137
+ */
138
+ async function getMultipleSentryRequests ( page : Page , count : number , url ?: string ) : Promise < Event [ ] > {
139
+ return getMultipleRequests ( page , count , storeUrlRegex , storeRequestParser , url ) ;
140
+ }
141
+
142
+ /**
143
+ * Wait and get multiple transaction requests at the given URL, or the current page
144
+ *
145
+ * @param {Page } page
146
+ * @param {number } count
147
+ * @param {string } [url]
148
+ * @return {* } {Promise<Event>}
149
+ */
150
+ async function getMultipleSentryTransactionRequests ( page : Page , count : number , url ?: string ) : Promise < Event [ ] > {
151
+ return getMultipleRequests ( page , count , envelopeUrlRegex , envelopeRequestParser , url ) ;
152
+ }
153
+
108
154
/**
109
155
* Manually inject a script into the page of given URL.
110
156
* This function is useful to create more complex test subjects that can't be achieved by pre-built pages.
@@ -126,6 +172,7 @@ export {
126
172
runScriptInSandbox ,
127
173
waitForSentryRequest ,
128
174
getMultipleSentryRequests ,
175
+ getMultipleSentryTransactionRequests ,
129
176
getSentryRequest ,
130
177
getSentryTransactionRequest ,
131
178
getSentryEvents ,
0 commit comments