@cloudcare/browser-core 1.1.3 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/{cookie.js → browser/cookie.js} +6 -37
- package/cjs/browser/fetchObservable.js +91 -0
- package/cjs/browser/xhrObservable.js +118 -0
- package/cjs/configuration/configuration.js +70 -0
- package/cjs/configuration/transportConfiguration.js +64 -0
- package/cjs/console/consoleObservable.js +84 -0
- package/cjs/dataMap.js +26 -21
- package/cjs/error/trackRuntimeError.js +27 -0
- package/cjs/helper/catchUserErrors.js +20 -0
- package/cjs/helper/contextHistory.js +134 -0
- package/cjs/helper/createEventRateLimiter.js +47 -0
- package/cjs/helper/deviceInfo.js +8 -25
- package/cjs/helper/display.js +31 -0
- package/cjs/helper/enums.js +28 -2
- package/cjs/helper/errorTools.js +63 -2
- package/cjs/helper/instrumentMethod.js +93 -0
- package/cjs/helper/lifeCycle.js +5 -3
- package/cjs/helper/observable.js +40 -2
- package/cjs/helper/tools.js +185 -9
- package/cjs/index.js +153 -23
- package/cjs/init.js +17 -27
- package/cjs/report/reportObservable.js +112 -0
- package/cjs/session/sessionConstants.js +13 -0
- package/cjs/session/sessionCookieStore.js +188 -0
- package/cjs/session/sessionManagement.js +96 -0
- package/cjs/session/sessionStore.js +150 -0
- package/cjs/synthetics/syntheticsWorkerValues.js +32 -0
- package/cjs/synthetics/usr.js +32 -0
- package/cjs/tracekit/computeStackTrace.js +73 -563
- package/cjs/tracekit/index.js +3 -15
- package/cjs/tracekit/tracekit.js +113 -0
- package/cjs/transport/batch.js +332 -0
- package/cjs/transport/httpRequest.js +112 -0
- package/cjs/transport/index.js +29 -0
- package/cjs/transport/sendWithRetryStrategy.js +177 -0
- package/cjs/transport/startBatchWithReplica.js +24 -0
- package/esm/{cookie.js → browser/cookie.js} +4 -35
- package/esm/browser/fetchObservable.js +77 -0
- package/esm/browser/xhrObservable.js +106 -0
- package/esm/configuration/configuration.js +55 -0
- package/esm/configuration/transportConfiguration.js +54 -0
- package/esm/console/consoleObservable.js +70 -0
- package/esm/dataMap.js +26 -21
- package/esm/error/trackRuntimeError.js +16 -0
- package/esm/helper/catchUserErrors.js +12 -0
- package/esm/helper/contextHistory.js +106 -0
- package/esm/helper/createEventRateLimiter.js +38 -0
- package/esm/helper/deviceInfo.js +6 -25
- package/esm/helper/display.js +21 -0
- package/esm/helper/enums.js +25 -1
- package/esm/helper/errorTools.js +58 -3
- package/esm/helper/instrumentMethod.js +81 -0
- package/esm/helper/lifeCycle.js +5 -3
- package/esm/helper/observable.js +39 -3
- package/esm/helper/tools.js +147 -1
- package/esm/index.js +17 -7
- package/esm/init.js +17 -22
- package/esm/report/reportObservable.js +98 -0
- package/esm/session/sessionConstants.js +3 -0
- package/esm/session/sessionCookieStore.js +168 -0
- package/esm/session/sessionManagement.js +78 -0
- package/esm/session/sessionStore.js +139 -0
- package/esm/synthetics/syntheticsWorkerValues.js +15 -0
- package/esm/synthetics/usr.js +18 -0
- package/esm/tracekit/computeStackTrace.js +73 -557
- package/esm/tracekit/index.js +1 -1
- package/esm/tracekit/tracekit.js +103 -0
- package/esm/transport/batch.js +316 -0
- package/esm/transport/httpRequest.js +104 -0
- package/esm/transport/index.js +3 -0
- package/esm/transport/sendWithRetryStrategy.js +165 -0
- package/esm/transport/startBatchWithReplica.js +15 -0
- package/package.json +2 -2
- package/src/.DS_Store +0 -0
- package/src/{cookie.js → browser/cookie.js} +6 -34
- package/src/browser/fetchObservable.js +86 -0
- package/src/browser/xhrObservable.js +102 -0
- package/src/configuration/configuration.js +61 -0
- package/src/configuration/transportConfiguration.js +42 -0
- package/src/console/consoleObservable.js +65 -0
- package/src/dataMap.js +26 -21
- package/src/error/trackRuntimeError.js +19 -0
- package/src/helper/catchUserErrors.js +12 -0
- package/src/helper/contextHistory.js +85 -0
- package/src/helper/createEventRateLimiter.js +37 -0
- package/src/helper/deviceInfo.js +5 -51
- package/src/helper/display.js +21 -0
- package/src/helper/enums.js +38 -14
- package/src/helper/errorTools.js +76 -12
- package/src/helper/instrumentMethod.js +97 -0
- package/src/helper/lifeCycle.js +5 -3
- package/src/helper/observable.js +33 -2
- package/src/helper/tools.js +135 -4
- package/src/index.js +18 -7
- package/src/init.js +17 -18
- package/src/report/reportObservable.js +113 -0
- package/src/session/sessionConstants.js +3 -0
- package/src/session/sessionCookieStore.js +159 -0
- package/src/session/sessionManagement.js +89 -0
- package/src/session/sessionStore.js +139 -0
- package/src/synthetics/syntheticsWorkerValues.js +22 -0
- package/src/synthetics/usr.js +18 -0
- package/src/tracekit/computeStackTrace.js +75 -551
- package/src/tracekit/index.js +1 -1
- package/src/tracekit/tracekit.js +100 -0
- package/src/transport/batch.js +289 -0
- package/src/transport/httpRequest.js +109 -0
- package/src/transport/index.js +3 -0
- package/src/transport/sendWithRetryStrategy.js +186 -0
- package/src/transport/startBatchWithReplica.js +26 -0
- package/cjs/configuration.js +0 -193
- package/cjs/errorCollection.js +0 -167
- package/cjs/fetchProxy.js +0 -161
- package/cjs/helper/errorFilter.js +0 -47
- package/cjs/sessionManagement.js +0 -221
- package/cjs/tracekit/report.js +0 -289
- package/cjs/transport.js +0 -373
- package/cjs/xhrProxy.js +0 -122
- package/esm/configuration.js +0 -176
- package/esm/errorCollection.js +0 -141
- package/esm/fetchProxy.js +0 -115
- package/esm/helper/errorFilter.js +0 -38
- package/esm/sessionManagement.js +0 -195
- package/esm/tracekit/report.js +0 -273
- package/esm/transport.js +0 -357
- package/esm/xhrProxy.js +0 -110
- package/src/configuration.js +0 -161
- package/src/errorCollection.js +0 -170
- package/src/fetchProxy.js +0 -108
- package/src/helper/errorFilter.js +0 -38
- package/src/sessionManagement.js +0 -224
- package/src/tracekit/report.js +0 -284
- package/src/transport.js +0 -380
- package/src/xhrProxy.js +0 -106
|
@@ -3,589 +3,141 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;
|
|
7
6
|
exports.computeStackTrace = computeStackTrace;
|
|
8
|
-
exports.computeStackTraceFromStackProp = computeStackTraceFromStackProp;
|
|
9
|
-
exports.computeStackTraceOfCaller = computeStackTraceOfCaller;
|
|
10
7
|
|
|
11
|
-
var
|
|
8
|
+
var _tools = require("../helper/tools");
|
|
12
9
|
|
|
13
10
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
14
11
|
|
|
15
12
|
var UNKNOWN_FUNCTION = '?';
|
|
16
|
-
/**
|
|
17
|
-
* computeStackTrace: cross-browser stack traces in JavaScript
|
|
18
|
-
*
|
|
19
|
-
* Syntax:
|
|
20
|
-
* ```js
|
|
21
|
-
* s = computeStackTraceOfCaller([depth])
|
|
22
|
-
* s = computeStackTrace(exception) // consider using report instead (see below)
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* Supports:
|
|
26
|
-
* - Firefox: full stack trace with line numbers and unreliable column
|
|
27
|
-
* number on top frame
|
|
28
|
-
* - Opera 10: full stack trace with line and column numbers
|
|
29
|
-
* - Opera 9-: full stack trace with line numbers
|
|
30
|
-
* - Chrome: full stack trace with line and column numbers
|
|
31
|
-
* - Safari: line and column number for the topmost stacktrace element
|
|
32
|
-
* only
|
|
33
|
-
* - IE: no line numbers whatsoever
|
|
34
|
-
*
|
|
35
|
-
* Tries to guess names of anonymous functions by looking for assignments
|
|
36
|
-
* in the source code. In IE and Safari, we have to guess source file names
|
|
37
|
-
* by searching for function bodies inside all page scripts. This will not
|
|
38
|
-
* work for scripts that are loaded cross-domain.
|
|
39
|
-
* Here be dragons: some function names may be guessed incorrectly, and
|
|
40
|
-
* duplicate functions may be mismatched.
|
|
41
|
-
*
|
|
42
|
-
* computeStackTrace should only be used for tracing purposes.
|
|
43
|
-
* Logging of unhandled exceptions should be done with report,
|
|
44
|
-
* which builds on top of computeStackTrace and provides better
|
|
45
|
-
* IE support by utilizing the window.onerror event to retrieve information
|
|
46
|
-
* about the top of the stack.
|
|
47
|
-
*
|
|
48
|
-
* Note: In IE and Safari, no stack trace is recorded on the Error object,
|
|
49
|
-
* so computeStackTrace instead walks its *own* chain of callers.
|
|
50
|
-
* This means that:
|
|
51
|
-
* * in Safari, some methods may be missing from the stack trace;
|
|
52
|
-
* * in IE, the topmost function in the stack trace will always be the
|
|
53
|
-
* caller of computeStackTrace.
|
|
54
|
-
*
|
|
55
|
-
* This is okay for tracing (because you are likely to be calling
|
|
56
|
-
* computeStackTrace from the function you want to be the topmost element
|
|
57
|
-
* of the stack trace anyway), but not okay for logging unhandled
|
|
58
|
-
* exceptions (because your catch block will likely be far away from the
|
|
59
|
-
* inner function that actually caused the exception).
|
|
60
|
-
*
|
|
61
|
-
* Tracing example:
|
|
62
|
-
* ```js
|
|
63
|
-
* function trace(message) {
|
|
64
|
-
* let stackInfo = computeStackTrace.ofCaller();
|
|
65
|
-
* let data = message + "\n";
|
|
66
|
-
* for(let i in stackInfo.stack) {
|
|
67
|
-
* let item = stackInfo.stack[i];
|
|
68
|
-
* data += (item.func || '[anonymous]') + "() in " + item.url + ":" + (item.line || '0') + "\n";
|
|
69
|
-
* }
|
|
70
|
-
* if (window.console)
|
|
71
|
-
* console.info(data);
|
|
72
|
-
* else
|
|
73
|
-
* alert(data);
|
|
74
|
-
* }
|
|
75
|
-
* ```
|
|
76
|
-
* @memberof TraceKit
|
|
77
|
-
* @namespace
|
|
78
|
-
*/
|
|
79
|
-
|
|
80
13
|
/**
|
|
81
14
|
* Computes a stack trace for an exception.
|
|
82
|
-
* @param {Error} ex
|
|
83
|
-
* @param {(string|number)=} depth
|
|
84
|
-
* @memberof computeStackTrace
|
|
85
15
|
*/
|
|
86
16
|
|
|
87
|
-
function computeStackTrace(ex
|
|
88
|
-
var stack;
|
|
89
|
-
var
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
// This must be tried first because Opera 10 *destroys*
|
|
93
|
-
// its stacktrace property if you try to access the stack
|
|
94
|
-
// property first!!
|
|
95
|
-
stack = computeStackTraceFromStacktraceProp(ex);
|
|
96
|
-
|
|
97
|
-
if (stack) {
|
|
98
|
-
return stack;
|
|
99
|
-
}
|
|
100
|
-
} catch (e) {
|
|
101
|
-
if (debug) {
|
|
102
|
-
throw e;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
try {
|
|
107
|
-
stack = computeStackTraceFromStackProp(ex);
|
|
108
|
-
|
|
109
|
-
if (stack) {
|
|
110
|
-
return stack;
|
|
111
|
-
}
|
|
112
|
-
} catch (e) {
|
|
113
|
-
if (debug) {
|
|
114
|
-
throw e;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
try {
|
|
119
|
-
stack = computeStackTraceFromOperaMultiLineMessage(ex);
|
|
17
|
+
function computeStackTrace(ex) {
|
|
18
|
+
var stack = [];
|
|
19
|
+
var stackProperty = tryToGetString(ex, 'stack');
|
|
120
20
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
} catch (e) {
|
|
125
|
-
if (debug) {
|
|
126
|
-
throw e;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
21
|
+
if (stackProperty) {
|
|
22
|
+
(0, _tools.each)(stackProperty.split('\n'), function (line) {
|
|
23
|
+
var stackFrame = parseChromeLine(line) || parseChromeAnonymousLine(line) || parseWinLine(line) || parseGeckoLine(line);
|
|
129
24
|
|
|
130
|
-
|
|
131
|
-
|
|
25
|
+
if (stackFrame) {
|
|
26
|
+
if (!stackFrame.func && stackFrame.line) {
|
|
27
|
+
stackFrame.func = UNKNOWN_FUNCTION;
|
|
28
|
+
}
|
|
132
29
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
} catch (e) {
|
|
137
|
-
if (debug) {
|
|
138
|
-
throw e;
|
|
139
|
-
}
|
|
30
|
+
stack.push(stackFrame);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
140
33
|
}
|
|
141
34
|
|
|
142
35
|
return {
|
|
143
36
|
message: tryToGetString(ex, 'message'),
|
|
144
37
|
name: tryToGetString(ex, 'name'),
|
|
145
|
-
stack:
|
|
38
|
+
stack: stack
|
|
146
39
|
};
|
|
147
40
|
}
|
|
148
41
|
|
|
149
|
-
var
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
// ex.line = 59
|
|
154
|
-
// ex.sourceId = 580238192
|
|
155
|
-
// ex.sourceURL = http://...
|
|
156
|
-
// ex.expressionBeginOffset = 96
|
|
157
|
-
// ex.expressionCaretOffset = 98
|
|
158
|
-
// ex.expressionEndOffset = 98
|
|
159
|
-
// ex.name = ReferenceError
|
|
160
|
-
//
|
|
161
|
-
// FIREFOX:
|
|
162
|
-
// ex.message = qq is not defined
|
|
163
|
-
// ex.fileName = http://...
|
|
164
|
-
// ex.lineNumber = 59
|
|
165
|
-
// ex.columnNumber = 69
|
|
166
|
-
// ex.stack = ...stack trace... (see the example below)
|
|
167
|
-
// ex.name = ReferenceError
|
|
168
|
-
//
|
|
169
|
-
// CHROME:
|
|
170
|
-
// ex.message = qq is not defined
|
|
171
|
-
// ex.name = ReferenceError
|
|
172
|
-
// ex.type = not_defined
|
|
173
|
-
// ex.arguments = ['aa']
|
|
174
|
-
// ex.stack = ...stack trace...
|
|
175
|
-
//
|
|
176
|
-
// INTERNET EXPLORER:
|
|
177
|
-
// ex.message = ...
|
|
178
|
-
// ex.name = ReferenceError
|
|
179
|
-
//
|
|
180
|
-
// OPERA:
|
|
181
|
-
// ex.message = ...message... (see the example below)
|
|
182
|
-
// ex.name = ReferenceError
|
|
183
|
-
// ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)
|
|
184
|
-
// ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'
|
|
42
|
+
var fileUrl = '((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\\w+\\.|\\/).*?)';
|
|
43
|
+
var filePosition = '(?::(\\d+))';
|
|
44
|
+
var CHROME_LINE_RE = new RegExp('^\\s*at (.*?) ?\\(' + fileUrl + filePosition + '?' + filePosition + '?\\)?\\s*$', 'i');
|
|
45
|
+
var CHROME_EVAL_RE = new RegExp('\\((\\S*)' + filePosition + filePosition + '\\)');
|
|
185
46
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
* Chrome and Gecko use this property.
|
|
189
|
-
* @param {Error} ex
|
|
190
|
-
* @return {?StackTrace} Stack trace information.
|
|
191
|
-
* @memberof computeStackTrace
|
|
192
|
-
*/
|
|
193
|
-
|
|
194
|
-
function computeStackTraceFromStackProp(ex) {
|
|
195
|
-
var stacktrace = tryToGetString(ex, 'stack');
|
|
47
|
+
function parseChromeLine(line) {
|
|
48
|
+
var parts = CHROME_LINE_RE.exec(line);
|
|
196
49
|
|
|
197
|
-
if (!
|
|
50
|
+
if (!parts) {
|
|
198
51
|
return;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; // eslint-disable-next-line max-len
|
|
203
|
-
|
|
204
|
-
var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|capacitor|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i; // eslint-disable-next-line max-len
|
|
205
|
-
|
|
206
|
-
var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; // Used to additionally parse URL/line/column from eval frames
|
|
207
|
-
|
|
208
|
-
var isEval;
|
|
209
|
-
var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
|
|
210
|
-
var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/;
|
|
211
|
-
var lines = stacktrace.split('\n');
|
|
212
|
-
var stack = [];
|
|
213
|
-
var submatch;
|
|
214
|
-
var parts;
|
|
215
|
-
var element;
|
|
216
|
-
|
|
217
|
-
for (var i = 0, j = lines.length; i < j; i += 1) {
|
|
218
|
-
if (chrome.exec(lines[i])) {
|
|
219
|
-
parts = chrome.exec(lines[i]);
|
|
220
|
-
var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
|
|
221
|
-
|
|
222
|
-
isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
|
|
223
|
-
|
|
224
|
-
submatch = chromeEval.exec(parts[2]);
|
|
52
|
+
}
|
|
225
53
|
|
|
226
|
-
|
|
227
|
-
// throw out eval line/column and use top-most line/column number
|
|
228
|
-
parts[2] = submatch[1]; // url
|
|
54
|
+
var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
|
|
229
55
|
|
|
230
|
-
|
|
56
|
+
var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
|
|
231
57
|
|
|
232
|
-
|
|
233
|
-
}
|
|
58
|
+
var submatch = CHROME_EVAL_RE.exec(parts[2]);
|
|
234
59
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
func: parts[1] || UNKNOWN_FUNCTION,
|
|
239
|
-
line: parts[3] ? +parts[3] : undefined,
|
|
240
|
-
url: !isNative ? parts[2] : undefined
|
|
241
|
-
};
|
|
242
|
-
} else if (winjs.exec(lines[i])) {
|
|
243
|
-
parts = winjs.exec(lines[i]);
|
|
244
|
-
element = {
|
|
245
|
-
args: [],
|
|
246
|
-
column: parts[4] ? +parts[4] : undefined,
|
|
247
|
-
func: parts[1] || UNKNOWN_FUNCTION,
|
|
248
|
-
line: +parts[3],
|
|
249
|
-
url: parts[2]
|
|
250
|
-
};
|
|
251
|
-
} else if (gecko.exec(lines[i])) {
|
|
252
|
-
parts = gecko.exec(lines[i]);
|
|
253
|
-
isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
|
|
254
|
-
submatch = geckoEval.exec(parts[3]);
|
|
255
|
-
|
|
256
|
-
if (isEval && submatch) {
|
|
257
|
-
// throw out eval line/column and use top-most line number
|
|
258
|
-
parts[3] = submatch[1];
|
|
259
|
-
parts[4] = submatch[2];
|
|
260
|
-
parts[5] = undefined; // no column when eval
|
|
261
|
-
} else if (i === 0 && !parts[5] && !isUndefined(ex.columnNumber)) {
|
|
262
|
-
// FireFox uses this awesome columnNumber property for its top frame
|
|
263
|
-
// Also note, Firefox's column number is 0-based and everything else expects 1-based,
|
|
264
|
-
// so adding 1
|
|
265
|
-
// NOTE: this hack doesn't work if top-most frame is eval
|
|
266
|
-
stack[0].column = ex.columnNumber + 1;
|
|
267
|
-
}
|
|
60
|
+
if (isEval && submatch) {
|
|
61
|
+
// throw out eval line/column and use top-most line/column number
|
|
62
|
+
parts[2] = submatch[1]; // url
|
|
268
63
|
|
|
269
|
-
|
|
270
|
-
args: parts[2] ? parts[2].split(',') : [],
|
|
271
|
-
column: parts[5] ? +parts[5] : undefined,
|
|
272
|
-
func: parts[1] || UNKNOWN_FUNCTION,
|
|
273
|
-
line: parts[4] ? +parts[4] : undefined,
|
|
274
|
-
url: parts[3]
|
|
275
|
-
};
|
|
276
|
-
} else {
|
|
277
|
-
continue;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
if (!element.func && element.line) {
|
|
281
|
-
element.func = UNKNOWN_FUNCTION;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
stack.push(element);
|
|
285
|
-
}
|
|
64
|
+
parts[3] = submatch[2]; // line
|
|
286
65
|
|
|
287
|
-
|
|
288
|
-
return;
|
|
66
|
+
parts[4] = submatch[3]; // column
|
|
289
67
|
}
|
|
290
68
|
|
|
291
69
|
return {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
70
|
+
args: isNative ? [parts[2]] : [],
|
|
71
|
+
column: parts[4] ? +parts[4] : undefined,
|
|
72
|
+
func: parts[1] || UNKNOWN_FUNCTION,
|
|
73
|
+
line: parts[3] ? +parts[3] : undefined,
|
|
74
|
+
url: !isNative ? parts[2] : undefined
|
|
295
75
|
};
|
|
296
76
|
}
|
|
297
|
-
/**
|
|
298
|
-
* Computes stack trace information from the stacktrace property.
|
|
299
|
-
* Opera 10+ uses this property.
|
|
300
|
-
* @param {Error} ex
|
|
301
|
-
* @return {?StackTrace} Stack trace information.
|
|
302
|
-
* @memberof computeStackTrace
|
|
303
|
-
*/
|
|
304
77
|
|
|
78
|
+
var CHROME_ANONYMOUS_FUNCTION_RE = new RegExp('^\\s*at ?' + fileUrl + filePosition + '?' + filePosition + '??\\s*$', 'i');
|
|
305
79
|
|
|
306
|
-
function
|
|
307
|
-
|
|
308
|
-
// else to it because Opera is not very good at providing it
|
|
309
|
-
// reliably in other circumstances.
|
|
310
|
-
var stacktrace = tryToGetString(ex, 'stacktrace');
|
|
80
|
+
function parseChromeAnonymousLine(line) {
|
|
81
|
+
var parts = CHROME_ANONYMOUS_FUNCTION_RE.exec(line);
|
|
311
82
|
|
|
312
|
-
if (!
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i; // eslint-disable-next-line max-len
|
|
317
|
-
|
|
318
|
-
var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i;
|
|
319
|
-
var lines = stacktrace.split('\n');
|
|
320
|
-
var stack = [];
|
|
321
|
-
var parts;
|
|
322
|
-
|
|
323
|
-
for (var line = 0; line < lines.length; line += 2) {
|
|
324
|
-
var element;
|
|
325
|
-
|
|
326
|
-
if (opera10Regex.exec(lines[line])) {
|
|
327
|
-
parts = opera10Regex.exec(lines[line]);
|
|
328
|
-
element = {
|
|
329
|
-
args: [],
|
|
330
|
-
column: undefined,
|
|
331
|
-
func: parts[3],
|
|
332
|
-
line: +parts[1],
|
|
333
|
-
url: parts[2]
|
|
334
|
-
};
|
|
335
|
-
} else if (opera11Regex.exec(lines[line])) {
|
|
336
|
-
parts = opera11Regex.exec(lines[line]);
|
|
337
|
-
element = {
|
|
338
|
-
args: parts[5] ? parts[5].split(',') : [],
|
|
339
|
-
column: +parts[2],
|
|
340
|
-
func: parts[3] || parts[4],
|
|
341
|
-
line: +parts[1],
|
|
342
|
-
url: parts[6]
|
|
343
|
-
};
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
if (element) {
|
|
347
|
-
if (!element.func && element.line) {
|
|
348
|
-
element.func = UNKNOWN_FUNCTION;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
element.context = [lines[line + 1]];
|
|
352
|
-
stack.push(element);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
if (!stack.length) {
|
|
83
|
+
if (!parts) {
|
|
357
84
|
return;
|
|
358
85
|
}
|
|
359
86
|
|
|
360
87
|
return {
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
88
|
+
args: [],
|
|
89
|
+
column: parts[3] ? +parts[3] : undefined,
|
|
90
|
+
func: UNKNOWN_FUNCTION,
|
|
91
|
+
line: parts[2] ? +parts[2] : undefined,
|
|
92
|
+
url: parts[1]
|
|
364
93
|
};
|
|
365
94
|
}
|
|
366
|
-
/**
|
|
367
|
-
* NOT TESTED.
|
|
368
|
-
* Computes stack trace information from an error message that includes
|
|
369
|
-
* the stack trace.
|
|
370
|
-
* Opera 9 and earlier use this method if the option to show stack
|
|
371
|
-
* traces is turned on in opera:config.
|
|
372
|
-
* @param {Error} ex
|
|
373
|
-
* @return {?StackTrace} Stack information.
|
|
374
|
-
* @memberof computeStackTrace
|
|
375
|
-
*/
|
|
376
95
|
|
|
96
|
+
var WINJS_LINE_RE = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
|
|
377
97
|
|
|
378
|
-
function
|
|
379
|
-
|
|
380
|
-
// Opera includes a stack trace into the exception message. An example is:
|
|
381
|
-
//
|
|
382
|
-
// Statement on line 3: Undefined variable: undefinedFunc
|
|
383
|
-
// Backtrace:
|
|
384
|
-
// Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js:
|
|
385
|
-
// In function zzz
|
|
386
|
-
// undefinedFunc(a);
|
|
387
|
-
// Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html:
|
|
388
|
-
// In function yyy
|
|
389
|
-
// zzz(x, y, z);
|
|
390
|
-
// Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html:
|
|
391
|
-
// In function xxx
|
|
392
|
-
// yyy(a, a, a);
|
|
393
|
-
// Line 1 of function script
|
|
394
|
-
// try { xxx('hi'); return false; } catch(ex) { report(ex); }
|
|
395
|
-
// ...
|
|
396
|
-
var message = tryToGetString(ex, 'message');
|
|
397
|
-
|
|
398
|
-
if (!message) {
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
var lines = message.split('\n');
|
|
98
|
+
function parseWinLine(line) {
|
|
99
|
+
var parts = WINJS_LINE_RE.exec(line);
|
|
403
100
|
|
|
404
|
-
if (
|
|
101
|
+
if (!parts) {
|
|
405
102
|
return;
|
|
406
103
|
}
|
|
407
104
|
|
|
408
|
-
var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i;
|
|
409
|
-
var lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i;
|
|
410
|
-
var lineRE3 = /^\s*Line (\d+) of function script\s*$/i;
|
|
411
|
-
var stack = [];
|
|
412
|
-
var scripts = window && window.document && window.document.getElementsByTagName('script');
|
|
413
|
-
var inlineScriptBlocks = [];
|
|
414
|
-
var parts;
|
|
415
|
-
|
|
416
|
-
for (var s in scripts) {
|
|
417
|
-
if (has(scripts, s) && !scripts[s].src) {
|
|
418
|
-
inlineScriptBlocks.push(scripts[s]);
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
for (var line = 2; line < lines.length; line += 2) {
|
|
423
|
-
var item;
|
|
424
|
-
|
|
425
|
-
if (lineRE1.exec(lines[line])) {
|
|
426
|
-
parts = lineRE1.exec(lines[line]);
|
|
427
|
-
item = {
|
|
428
|
-
args: [],
|
|
429
|
-
column: undefined,
|
|
430
|
-
func: parts[3],
|
|
431
|
-
line: +parts[1],
|
|
432
|
-
url: parts[2]
|
|
433
|
-
};
|
|
434
|
-
} else if (lineRE2.exec(lines[line])) {
|
|
435
|
-
parts = lineRE2.exec(lines[line]);
|
|
436
|
-
item = {
|
|
437
|
-
args: [],
|
|
438
|
-
column: undefined,
|
|
439
|
-
// TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number.
|
|
440
|
-
func: parts[4],
|
|
441
|
-
line: +parts[1],
|
|
442
|
-
url: parts[3]
|
|
443
|
-
};
|
|
444
|
-
} else if (lineRE3.exec(lines[line])) {
|
|
445
|
-
parts = lineRE3.exec(lines[line]);
|
|
446
|
-
var url = window.location.href.replace(/#.*$/, '');
|
|
447
|
-
item = {
|
|
448
|
-
url: url,
|
|
449
|
-
args: [],
|
|
450
|
-
column: undefined,
|
|
451
|
-
func: '',
|
|
452
|
-
line: +parts[1]
|
|
453
|
-
};
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
if (item) {
|
|
457
|
-
if (!item.func) {
|
|
458
|
-
item.func = UNKNOWN_FUNCTION;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
item.context = [lines[line + 1]];
|
|
462
|
-
stack.push(item);
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
if (!stack.length) {
|
|
467
|
-
return; // could not parse multiline exception message as Opera stack trace
|
|
468
|
-
}
|
|
469
|
-
|
|
470
105
|
return {
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
106
|
+
args: [],
|
|
107
|
+
column: parts[4] ? +parts[4] : undefined,
|
|
108
|
+
func: parts[1] || UNKNOWN_FUNCTION,
|
|
109
|
+
line: +parts[3],
|
|
110
|
+
url: parts[2]
|
|
474
111
|
};
|
|
475
112
|
}
|
|
476
|
-
/**
|
|
477
|
-
* Adds information about the first frame to incomplete stack traces.
|
|
478
|
-
* Safari and IE require this to get complete data on the first frame.
|
|
479
|
-
* @param {StackTrace} stackInfo Stack trace information from
|
|
480
|
-
* one of the compute* methods.
|
|
481
|
-
* @param {string=} url The URL of the script that caused an error.
|
|
482
|
-
* @param {(number|string)=} lineNo The line number of the script that
|
|
483
|
-
* caused an error.
|
|
484
|
-
* @param {string=} message The error generated by the browser, which
|
|
485
|
-
* hopefully contains the name of the object that caused the error.
|
|
486
|
-
* @return {boolean} Whether or not the stack information was
|
|
487
|
-
* augmented.
|
|
488
|
-
* @memberof computeStackTrace
|
|
489
|
-
*/
|
|
490
113
|
|
|
114
|
+
var GECKO_LINE_RE = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|capacitor|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;
|
|
115
|
+
var GECKO_EVAL_RE = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
|
|
491
116
|
|
|
492
|
-
function
|
|
493
|
-
var
|
|
494
|
-
url: url,
|
|
495
|
-
line: lineNo ? +lineNo : undefined
|
|
496
|
-
};
|
|
497
|
-
|
|
498
|
-
if (initial.url && initial.line) {
|
|
499
|
-
stackInfo.incomplete = false;
|
|
500
|
-
var stack = stackInfo.stack;
|
|
501
|
-
|
|
502
|
-
if (stack.length > 0) {
|
|
503
|
-
if (stack[0].url === initial.url) {
|
|
504
|
-
if (stack[0].line === initial.line) {
|
|
505
|
-
return false; // already in stack trace
|
|
506
|
-
}
|
|
117
|
+
function parseGeckoLine(line) {
|
|
118
|
+
var parts = GECKO_LINE_RE.exec(line);
|
|
507
119
|
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
stack[0].context = initial.context;
|
|
511
|
-
return false;
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
stack.unshift(initial);
|
|
517
|
-
stackInfo.partial = true;
|
|
518
|
-
return true;
|
|
120
|
+
if (!parts) {
|
|
121
|
+
return;
|
|
519
122
|
}
|
|
520
123
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
}
|
|
524
|
-
/**
|
|
525
|
-
* Computes stack trace information by walking the arguments.caller
|
|
526
|
-
* chain at the time the exception occurred. This will cause earlier
|
|
527
|
-
* frames to be missed but is the only way to get any stack trace in
|
|
528
|
-
* Safari and IE. The top frame is restored by
|
|
529
|
-
* {@link augmentStackTraceWithInitialElement}.
|
|
530
|
-
* @param {Error} ex
|
|
531
|
-
* @param {number} depth
|
|
532
|
-
* @return {StackTrace} Stack trace information.
|
|
533
|
-
* @memberof computeStackTrace
|
|
534
|
-
*/
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
function computeStackTraceByWalkingCallerChain(ex, depth) {
|
|
538
|
-
var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i;
|
|
539
|
-
var stack = [];
|
|
540
|
-
var funcs = {};
|
|
541
|
-
var recursion = false;
|
|
542
|
-
var parts;
|
|
543
|
-
var item;
|
|
544
|
-
|
|
545
|
-
for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {
|
|
546
|
-
if (curr === computeStackTrace || curr === _report.report) {
|
|
547
|
-
continue;
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
item = {
|
|
551
|
-
args: [],
|
|
552
|
-
column: undefined,
|
|
553
|
-
func: UNKNOWN_FUNCTION,
|
|
554
|
-
line: undefined,
|
|
555
|
-
url: undefined
|
|
556
|
-
};
|
|
557
|
-
parts = functionName.exec(curr.toString());
|
|
558
|
-
|
|
559
|
-
if (curr.name) {
|
|
560
|
-
item.func = curr.name;
|
|
561
|
-
} else if (parts) {
|
|
562
|
-
item.func = parts[1];
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
if (typeof item.func === 'undefined') {
|
|
566
|
-
item.func = parts ? parts.input.substring(0, parts.input.indexOf('{')) : undefined;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
if (funcs[curr.toString()]) {
|
|
570
|
-
recursion = true;
|
|
571
|
-
} else {
|
|
572
|
-
funcs[curr.toString()] = true;
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
stack.push(item);
|
|
576
|
-
}
|
|
124
|
+
var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
|
|
125
|
+
var submatch = GECKO_EVAL_RE.exec(parts[3]);
|
|
577
126
|
|
|
578
|
-
if (
|
|
579
|
-
|
|
127
|
+
if (isEval && submatch) {
|
|
128
|
+
// throw out eval line/column and use top-most line number
|
|
129
|
+
parts[3] = submatch[1];
|
|
130
|
+
parts[4] = submatch[2];
|
|
131
|
+
parts[5] = undefined; // no column when eval
|
|
580
132
|
}
|
|
581
133
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
134
|
+
return {
|
|
135
|
+
args: parts[2] ? parts[2].split(',') : [],
|
|
136
|
+
column: parts[5] ? +parts[5] : undefined,
|
|
137
|
+
func: parts[1] || UNKNOWN_FUNCTION,
|
|
138
|
+
line: parts[4] ? +parts[4] : undefined,
|
|
139
|
+
url: parts[3]
|
|
586
140
|
};
|
|
587
|
-
augmentStackTraceWithInitialElement(result, tryToGetString(ex, 'sourceURL') || tryToGetString(ex, 'fileName'), tryToGetString(ex, 'line') || tryToGetString(ex, 'lineNumber'));
|
|
588
|
-
return result;
|
|
589
141
|
}
|
|
590
142
|
|
|
591
143
|
function tryToGetString(candidate, property) {
|
|
@@ -595,46 +147,4 @@ function tryToGetString(candidate, property) {
|
|
|
595
147
|
|
|
596
148
|
var value = candidate[property];
|
|
597
149
|
return typeof value === 'string' ? value : undefined;
|
|
598
|
-
}
|
|
599
|
-
/**
|
|
600
|
-
* Logs a stacktrace starting from the previous call and working down.
|
|
601
|
-
* @param {(number|string)=} depth How many frames deep to trace.
|
|
602
|
-
* @return {StackTrace} Stack trace information.
|
|
603
|
-
* @memberof computeStackTrace
|
|
604
|
-
*/
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
function computeStackTraceOfCaller(depth) {
|
|
608
|
-
var currentDepth = (depth === undefined ? 0 : +depth) + 1; // "+ 1" because "ofCaller" should drop one frame
|
|
609
|
-
|
|
610
|
-
try {
|
|
611
|
-
throw new Error();
|
|
612
|
-
} catch (ex) {
|
|
613
|
-
return computeStackTrace(ex, currentDepth + 1);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
/**
|
|
617
|
-
* A better form of hasOwnProperty<br/>
|
|
618
|
-
* Example: `has(MainHostObject, property) === true/false`
|
|
619
|
-
*
|
|
620
|
-
* @param {Object} object to check property
|
|
621
|
-
* @param {string} key to check
|
|
622
|
-
* @return {Boolean} true if the object has the key and it is not inherited
|
|
623
|
-
*/
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
function has(object, key) {
|
|
627
|
-
return Object.prototype.hasOwnProperty.call(object, key);
|
|
628
|
-
}
|
|
629
|
-
/**
|
|
630
|
-
* Returns true if the parameter is undefined<br/>
|
|
631
|
-
* Example: `isUndefined(val) === true/false`
|
|
632
|
-
*
|
|
633
|
-
* @param {*} what Value to check
|
|
634
|
-
* @return {Boolean} true if undefined and false otherwise
|
|
635
|
-
*/
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
function isUndefined(what) {
|
|
639
|
-
return typeof what === 'undefined';
|
|
640
150
|
}
|