@@ -2,7 +2,6 @@ import { Event, EventHint, Exception, Severity, StackFrame } from '@sentry/types
2
2
import {
3
3
addExceptionMechanism ,
4
4
addExceptionTypeValue ,
5
- createStackParser ,
6
5
extractExceptionKeysForMessage ,
7
6
isDOMError ,
8
7
isDOMException ,
@@ -12,24 +11,15 @@ import {
12
11
isPlainObject ,
13
12
normalizeToSize ,
14
13
resolvedSyncPromise ,
14
+ StackParser ,
15
15
} from '@sentry/utils' ;
16
16
17
- import {
18
- chromeStackParser ,
19
- geckoStackParser ,
20
- opera10StackParser ,
21
- opera11StackParser ,
22
- winjsStackParser ,
23
- } from './stack-parsers' ;
24
-
25
17
/**
26
18
* This function creates an exception from an TraceKitStackTrace
27
- * @param stacktrace TraceKitStackTrace that will be converted to an exception
28
- * @hidden
29
19
*/
30
- export function exceptionFromError ( ex : Error ) : Exception {
20
+ export function exceptionFromError ( stackParser : StackParser , ex : Error ) : Exception {
31
21
// Get the frames first since Opera can lose the stack if we touch anything else first
32
- const frames = parseStackFrames ( ex ) ;
22
+ const frames = parseStackFrames ( stackParser , ex ) ;
33
23
34
24
const exception : Exception = {
35
25
type : ex && ex . name ,
@@ -51,6 +41,7 @@ export function exceptionFromError(ex: Error): Exception {
51
41
* @hidden
52
42
*/
53
43
export function eventFromPlainObject (
44
+ stackParser : StackParser ,
54
45
exception : Record < string , unknown > ,
55
46
syntheticException ?: Error ,
56
47
isUnhandledRejection ?: boolean ,
@@ -72,7 +63,7 @@ export function eventFromPlainObject(
72
63
} ;
73
64
74
65
if ( syntheticException ) {
75
- const frames = parseStackFrames ( syntheticException ) ;
66
+ const frames = parseStackFrames ( stackParser , syntheticException ) ;
76
67
if ( frames . length ) {
77
68
event . stacktrace = { frames } ;
78
69
}
@@ -84,16 +75,19 @@ export function eventFromPlainObject(
84
75
/**
85
76
* @hidden
86
77
*/
87
- export function eventFromError ( ex : Error ) : Event {
78
+ export function eventFromError ( stackParser : StackParser , ex : Error ) : Event {
88
79
return {
89
80
exception : {
90
- values : [ exceptionFromError ( ex ) ] ,
81
+ values : [ exceptionFromError ( stackParser , ex ) ] ,
91
82
} ,
92
83
} ;
93
84
}
94
85
95
86
/** Parses stack frames from an error */
96
- export function parseStackFrames ( ex : Error & { framesToPop ?: number ; stacktrace ?: string } ) : StackFrame [ ] {
87
+ export function parseStackFrames (
88
+ stackParser : StackParser ,
89
+ ex : Error & { framesToPop ?: number ; stacktrace ?: string } ,
90
+ ) : StackFrame [ ] {
97
91
// Access and store the stacktrace property before doing ANYTHING
98
92
// else to it because Opera is not very good at providing it
99
93
// reliably in other circumstances.
@@ -102,13 +96,7 @@ export function parseStackFrames(ex: Error & { framesToPop?: number; stacktrace?
102
96
const popSize = getPopSize ( ex ) ;
103
97
104
98
try {
105
- return createStackParser (
106
- opera10StackParser ,
107
- opera11StackParser ,
108
- chromeStackParser ,
109
- winjsStackParser ,
110
- geckoStackParser ,
111
- ) ( stacktrace , popSize ) ;
99
+ return stackParser ( stacktrace , popSize ) ;
112
100
} catch ( e ) {
113
101
// no-empty
114
102
}
@@ -154,12 +142,13 @@ function extractMessage(ex: Error & { message: { error?: Error } }): string {
154
142
* @hidden
155
143
*/
156
144
export function eventFromException (
145
+ stackParser : StackParser ,
157
146
exception : unknown ,
158
147
hint ?: EventHint ,
159
148
attachStacktrace ?: boolean ,
160
149
) : PromiseLike < Event > {
161
150
const syntheticException = ( hint && hint . syntheticException ) || undefined ;
162
- const event = eventFromUnknownInput ( exception , syntheticException , attachStacktrace ) ;
151
+ const event = eventFromUnknownInput ( stackParser , exception , syntheticException , attachStacktrace ) ;
163
152
addExceptionMechanism ( event ) ; // defaults to { type: 'generic', handled: true }
164
153
event . level = Severity . Error ;
165
154
if ( hint && hint . event_id ) {
@@ -173,13 +162,14 @@ export function eventFromException(
173
162
* @hidden
174
163
*/
175
164
export function eventFromMessage (
165
+ stackParser : StackParser ,
176
166
message : string ,
177
167
level : Severity = Severity . Info ,
178
168
hint ?: EventHint ,
179
169
attachStacktrace ?: boolean ,
180
170
) : PromiseLike < Event > {
181
171
const syntheticException = ( hint && hint . syntheticException ) || undefined ;
182
- const event = eventFromString ( message , syntheticException , attachStacktrace ) ;
172
+ const event = eventFromString ( stackParser , message , syntheticException , attachStacktrace ) ;
183
173
event . level = level ;
184
174
if ( hint && hint . event_id ) {
185
175
event . event_id = hint . event_id ;
@@ -191,6 +181,7 @@ export function eventFromMessage(
191
181
* @hidden
192
182
*/
193
183
export function eventFromUnknownInput (
184
+ stackParser : StackParser ,
194
185
exception : unknown ,
195
186
syntheticException ?: Error ,
196
187
attachStacktrace ?: boolean ,
@@ -201,7 +192,7 @@ export function eventFromUnknownInput(
201
192
if ( isErrorEvent ( exception as ErrorEvent ) && ( exception as ErrorEvent ) . error ) {
202
193
// If it is an ErrorEvent with `error` property, extract it to get actual Error
203
194
const errorEvent = exception as ErrorEvent ;
204
- return eventFromError ( errorEvent . error as Error ) ;
195
+ return eventFromError ( stackParser , errorEvent . error as Error ) ;
205
196
}
206
197
207
198
// If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name
@@ -215,11 +206,11 @@ export function eventFromUnknownInput(
215
206
const domException = exception as DOMException ;
216
207
217
208
if ( 'stack' in ( exception as Error ) ) {
218
- event = eventFromError ( exception as Error ) ;
209
+ event = eventFromError ( stackParser , exception as Error ) ;
219
210
} else {
220
211
const name = domException . name || ( isDOMError ( domException ) ? 'DOMError' : 'DOMException' ) ;
221
212
const message = domException . message ? `${ name } : ${ domException . message } ` : name ;
222
- event = eventFromString ( message , syntheticException , attachStacktrace ) ;
213
+ event = eventFromString ( stackParser , message , syntheticException , attachStacktrace ) ;
223
214
addExceptionTypeValue ( event , message ) ;
224
215
}
225
216
if ( 'code' in domException ) {
@@ -230,14 +221,14 @@ export function eventFromUnknownInput(
230
221
}
231
222
if ( isError ( exception ) ) {
232
223
// we have a real Error object, do nothing
233
- return eventFromError ( exception ) ;
224
+ return eventFromError ( stackParser , exception ) ;
234
225
}
235
226
if ( isPlainObject ( exception ) || isEvent ( exception ) ) {
236
227
// If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize
237
228
// it manually. This will allow us to group events based on top-level keys which is much better than creating a new
238
229
// group on any key/value change.
239
230
const objectException = exception as Record < string , unknown > ;
240
- event = eventFromPlainObject ( objectException , syntheticException , isUnhandledRejection ) ;
231
+ event = eventFromPlainObject ( stackParser , objectException , syntheticException , isUnhandledRejection ) ;
241
232
addExceptionMechanism ( event , {
242
233
synthetic : true ,
243
234
} ) ;
@@ -253,7 +244,7 @@ export function eventFromUnknownInput(
253
244
// - a plain Object
254
245
//
255
246
// So bail out and capture it as a simple message:
256
- event = eventFromString ( exception as string , syntheticException , attachStacktrace ) ;
247
+ event = eventFromString ( stackParser , exception as string , syntheticException , attachStacktrace ) ;
257
248
addExceptionTypeValue ( event , `${ exception } ` , undefined ) ;
258
249
addExceptionMechanism ( event , {
259
250
synthetic : true ,
@@ -265,13 +256,18 @@ export function eventFromUnknownInput(
265
256
/**
266
257
* @hidden
267
258
*/
268
- export function eventFromString ( input : string , syntheticException ?: Error , attachStacktrace ?: boolean ) : Event {
259
+ export function eventFromString (
260
+ stackParser : StackParser ,
261
+ input : string ,
262
+ syntheticException ?: Error ,
263
+ attachStacktrace ?: boolean ,
264
+ ) : Event {
269
265
const event : Event = {
270
266
message : input ,
271
267
} ;
272
268
273
269
if ( attachStacktrace && syntheticException ) {
274
- const frames = parseStackFrames ( syntheticException ) ;
270
+ const frames = parseStackFrames ( stackParser , syntheticException ) ;
275
271
if ( frames . length ) {
276
272
event . stacktrace = { frames } ;
277
273
}
0 commit comments