rollbar 2.26.3 → 3.0.0-alpha.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/.cursor/rules/guidelines.mdc +154 -0
- package/.github/workflows/ci.yml +32 -12
- package/.lgtm.yml +7 -7
- package/.prettierignore +18 -0
- package/.vscode/settings.json +39 -0
- package/CHANGELOG.md +121 -35
- package/CLAUDE.md +201 -0
- package/Gruntfile.js +101 -48
- package/Makefile +3 -3
- package/README.md +2 -4
- package/SECURITY.md +5 -0
- package/babel.config.json +9 -0
- package/bower.json +1 -3
- package/codex.md +148 -0
- package/defaults.js +17 -5
- package/dist/plugins/jquery.min.js +1 -1
- package/dist/rollbar.js +18748 -5375
- package/dist/rollbar.js.map +1 -1
- package/dist/rollbar.min.js +2 -1
- package/dist/rollbar.min.js.LICENSE.txt +1 -0
- package/dist/rollbar.min.js.map +1 -1
- package/dist/rollbar.named-amd.js +19368 -6000
- package/dist/rollbar.named-amd.js.map +1 -1
- package/dist/rollbar.named-amd.min.js +3 -1
- package/dist/rollbar.named-amd.min.js.LICENSE.txt +1 -0
- package/dist/rollbar.named-amd.min.js.map +1 -1
- package/dist/rollbar.noconflict.umd.js +18749 -5380
- package/dist/rollbar.noconflict.umd.js.map +1 -1
- package/dist/rollbar.noconflict.umd.min.js +3 -1
- package/dist/rollbar.noconflict.umd.min.js.LICENSE.txt +1 -0
- package/dist/rollbar.noconflict.umd.min.js.map +1 -1
- package/dist/rollbar.snippet.js +1 -1
- package/dist/rollbar.umd.js +19367 -6000
- package/dist/rollbar.umd.js.map +1 -1
- package/dist/rollbar.umd.min.js +3 -1
- package/dist/rollbar.umd.min.js.LICENSE.txt +1 -0
- package/dist/rollbar.umd.min.js.map +1 -1
- package/docs/extension-exceptions.md +35 -30
- package/docs/migration_v0_to_v1.md +41 -38
- package/eslint.config.mjs +33 -0
- package/get_versions.js +33 -0
- package/index.d.ts +270 -231
- package/karma.conf.js +18 -27
- package/package.json +21 -21
- package/prettier.config.js +7 -0
- package/src/api.js +78 -14
- package/src/apiUtility.js +14 -11
- package/src/browser/core.js +138 -72
- package/src/browser/defaults/scrubFields.js +3 -3
- package/src/browser/detection.js +7 -8
- package/src/browser/domUtility.js +18 -8
- package/src/browser/globalSetup.js +12 -6
- package/src/browser/logger.js +1 -1
- package/src/browser/plugins/jquery.js +35 -35
- package/src/browser/predicates.js +1 -1
- package/src/browser/replay/defaults.js +71 -0
- package/src/browser/replay/recorder.js +193 -0
- package/src/browser/replay/replayMap.js +195 -0
- package/src/browser/rollbar.js +12 -8
- package/src/browser/rollbarWrapper.js +8 -5
- package/src/browser/shim.js +43 -19
- package/src/browser/snippet_callback.js +6 -4
- package/src/browser/telemetry.js +573 -361
- package/src/browser/transforms.js +46 -27
- package/src/browser/transport/fetch.js +26 -14
- package/src/browser/transport/xhr.js +41 -14
- package/src/browser/transport.js +93 -33
- package/src/browser/url.js +16 -8
- package/src/browser/wrapGlobals.js +27 -8
- package/src/defaults.js +3 -3
- package/src/errorParser.js +14 -11
- package/src/merge.js +32 -23
- package/src/notifier.js +16 -13
- package/src/predicates.js +43 -23
- package/src/queue.js +133 -40
- package/src/rateLimiter.js +59 -18
- package/src/react-native/logger.js +1 -1
- package/src/react-native/rollbar.js +59 -55
- package/src/react-native/transforms.js +13 -9
- package/src/react-native/transport.js +44 -34
- package/src/rollbar.js +72 -21
- package/src/scrub.js +0 -1
- package/src/server/locals.js +69 -39
- package/src/server/logger.js +4 -4
- package/src/server/parser.js +72 -47
- package/src/server/rollbar.js +135 -56
- package/src/server/sourceMap/stackTrace.js +33 -18
- package/src/server/telemetry/urlHelpers.js +9 -11
- package/src/server/telemetry.js +68 -45
- package/src/server/transforms.js +37 -21
- package/src/server/transport.js +62 -32
- package/src/telemetry.js +162 -33
- package/src/tracing/context.js +24 -0
- package/src/tracing/contextManager.js +37 -0
- package/src/tracing/defaults.js +7 -0
- package/src/tracing/exporter.js +188 -0
- package/src/tracing/hrtime.js +98 -0
- package/src/tracing/id.js +24 -0
- package/src/tracing/session.js +55 -0
- package/src/tracing/span.js +92 -0
- package/src/tracing/spanProcessor.js +15 -0
- package/src/tracing/tracer.js +46 -0
- package/src/tracing/tracing.js +89 -0
- package/src/transforms.js +33 -21
- package/src/truncation.js +8 -5
- package/src/utility/headers.js +43 -43
- package/src/utility/replace.js +9 -0
- package/src/utility/traverse.js +1 -1
- package/src/utility.js +123 -52
- package/test/api.test.js +88 -41
- package/test/apiUtility.test.js +48 -50
- package/test/browser.core.test.js +142 -141
- package/test/browser.domUtility.test.js +53 -36
- package/test/browser.predicates.test.js +14 -14
- package/test/browser.replay.recorder.test.js +416 -0
- package/test/browser.rollbar.test.js +655 -515
- package/test/browser.telemetry.test.js +46 -39
- package/test/browser.transforms.test.js +164 -139
- package/test/browser.transport.test.js +59 -50
- package/test/browser.url.test.js +13 -12
- package/test/fixtures/locals.fixtures.js +245 -126
- package/test/fixtures/replay/index.js +20 -0
- package/test/fixtures/replay/payloads.fixtures.js +229 -0
- package/test/fixtures/replay/rrwebEvents.fixtures.js +251 -0
- package/test/fixtures/replay/rrwebSyntheticEvents.fixtures.js +328 -0
- package/test/notifier.test.js +91 -79
- package/test/predicates.test.js +261 -215
- package/test/queue.test.js +231 -215
- package/test/rateLimiter.test.js +51 -43
- package/test/react-native.rollbar.test.js +150 -116
- package/test/react-native.transforms.test.js +23 -25
- package/test/react-native.transport.test.js +26 -14
- package/test/replay/index.js +2 -0
- package/test/replay/integration/api.spans.test.js +136 -0
- package/test/replay/integration/e2e.test.js +228 -0
- package/test/replay/integration/index.js +9 -0
- package/test/replay/integration/queue.replayMap.test.js +332 -0
- package/test/replay/integration/replayMap.test.js +163 -0
- package/test/replay/integration/sessionRecording.test.js +390 -0
- package/test/replay/unit/api.postSpans.test.js +150 -0
- package/test/replay/unit/index.js +7 -0
- package/test/replay/unit/queue.replayMap.test.js +225 -0
- package/test/replay/unit/replayMap.test.js +348 -0
- package/test/replay/util/index.js +5 -0
- package/test/replay/util/mockRecordFn.js +80 -0
- package/test/server.lambda.mocha.test.mjs +172 -0
- package/test/server.locals.constructor.mocha.test.mjs +80 -0
- package/test/server.locals.error-handling.mocha.test.mjs +387 -0
- package/test/server.locals.merge.mocha.test.mjs +267 -0
- package/test/server.locals.test-utils.mjs +114 -0
- package/test/server.parser.mocha.test.mjs +87 -0
- package/test/server.predicates.mocha.test.mjs +63 -0
- package/test/server.rollbar.constructor.mocha.test.mjs +199 -0
- package/test/server.rollbar.handlers.mocha.test.mjs +253 -0
- package/test/server.rollbar.logging.mocha.test.mjs +326 -0
- package/test/server.rollbar.misc.mocha.test.mjs +44 -0
- package/test/server.rollbar.test-utils.mjs +57 -0
- package/test/server.telemetry.mocha.test.mjs +377 -0
- package/test/server.transforms.data.mocha.test.mjs +163 -0
- package/test/server.transforms.error.mocha.test.mjs +199 -0
- package/test/server.transforms.request.mocha.test.mjs +208 -0
- package/test/server.transforms.scrub.mocha.test.mjs +140 -0
- package/test/server.transforms.sourcemaps.mocha.test.mjs +122 -0
- package/test/server.transforms.test-utils.mjs +62 -0
- package/test/server.transport.mocha.test.mjs +269 -0
- package/test/telemetry.test.js +178 -38
- package/test/tracing/contextManager.test.js +28 -0
- package/test/tracing/exporter.toPayload.test.js +400 -0
- package/test/tracing/id.test.js +24 -0
- package/test/tracing/span.test.js +183 -0
- package/test/tracing/spanProcessor.test.js +73 -0
- package/test/tracing/tracing.test.js +105 -0
- package/test/transforms.test.js +70 -68
- package/test/truncation.test.js +57 -55
- package/test/utility.test.js +310 -228
- package/webpack.config.js +36 -70
- package/.eslintignore +0 -7
- package/.gitmodules +0 -3
- package/test/server.lambda.test.js +0 -177
- package/test/server.locals.test.js +0 -841
- package/test/server.parser.test.js +0 -72
- package/test/server.predicates.test.js +0 -89
- package/test/server.rollbar.test.js +0 -676
- package/test/server.telemetry.test.js +0 -318
- package/test/server.transforms.test.js +0 -1099
- package/test/server.transport.test.js +0 -201
|
@@ -3,7 +3,7 @@ var errorParser = require('../errorParser');
|
|
|
3
3
|
var logger = require('./logger');
|
|
4
4
|
|
|
5
5
|
function handleDomException(item, options, callback) {
|
|
6
|
-
if(item.err && errorParser.Stack(item.err).name === 'DOMException') {
|
|
6
|
+
if (item.err && errorParser.Stack(item.err).name === 'DOMException') {
|
|
7
7
|
var originalError = new Error();
|
|
8
8
|
originalError.name = item.err.name;
|
|
9
9
|
originalError.message = item.err.message;
|
|
@@ -18,7 +18,9 @@ function handleItemWithError(item, options, callback) {
|
|
|
18
18
|
item.data = item.data || {};
|
|
19
19
|
if (item.err) {
|
|
20
20
|
try {
|
|
21
|
-
item.stackInfo =
|
|
21
|
+
item.stackInfo =
|
|
22
|
+
item.err._savedStackTrace ||
|
|
23
|
+
errorParser.parse(item.err, item.skipFrames);
|
|
22
24
|
|
|
23
25
|
if (options.addErrorContext) {
|
|
24
26
|
addErrorContext(item);
|
|
@@ -26,7 +28,11 @@ function handleItemWithError(item, options, callback) {
|
|
|
26
28
|
} catch (e) {
|
|
27
29
|
logger.error('Error while parsing the error object.', e);
|
|
28
30
|
try {
|
|
29
|
-
item.message =
|
|
31
|
+
item.message =
|
|
32
|
+
item.err.message ||
|
|
33
|
+
item.err.description ||
|
|
34
|
+
item.message ||
|
|
35
|
+
String(item.err);
|
|
30
36
|
} catch (e2) {
|
|
31
37
|
item.message = String(item.err) || String(e2);
|
|
32
38
|
}
|
|
@@ -58,7 +64,8 @@ function ensureItemHasSomethingToSay(item, options, callback) {
|
|
|
58
64
|
}
|
|
59
65
|
|
|
60
66
|
function addBaseInfo(item, options, callback) {
|
|
61
|
-
var environment =
|
|
67
|
+
var environment =
|
|
68
|
+
(options.payload && options.payload.environment) || options.environment;
|
|
62
69
|
item.data = _.merge(item.data, {
|
|
63
70
|
environment: environment,
|
|
64
71
|
level: item.level,
|
|
@@ -70,15 +77,15 @@ function addBaseInfo(item, options, callback) {
|
|
|
70
77
|
uuid: item.uuid,
|
|
71
78
|
notifier: {
|
|
72
79
|
name: 'rollbar-browser-js',
|
|
73
|
-
version: options.version
|
|
80
|
+
version: options.version,
|
|
74
81
|
},
|
|
75
|
-
custom: item.custom
|
|
82
|
+
custom: item.custom,
|
|
76
83
|
});
|
|
77
84
|
callback(null, item);
|
|
78
85
|
}
|
|
79
86
|
|
|
80
87
|
function addRequestInfo(window) {
|
|
81
|
-
return function(item, options, callback) {
|
|
88
|
+
return function (item, options, callback) {
|
|
82
89
|
var requestInfo = {};
|
|
83
90
|
|
|
84
91
|
if (window && window.location) {
|
|
@@ -103,7 +110,7 @@ function addRequestInfo(window) {
|
|
|
103
110
|
}
|
|
104
111
|
|
|
105
112
|
function addClientInfo(window) {
|
|
106
|
-
return function(item, options, callback) {
|
|
113
|
+
return function (item, options, callback) {
|
|
107
114
|
if (!window) {
|
|
108
115
|
return callback(null, item);
|
|
109
116
|
}
|
|
@@ -118,25 +125,25 @@ function addClientInfo(window) {
|
|
|
118
125
|
cookie_enabled: nav.cookieEnabled,
|
|
119
126
|
screen: {
|
|
120
127
|
width: scr.width,
|
|
121
|
-
height: scr.height
|
|
122
|
-
}
|
|
123
|
-
}
|
|
128
|
+
height: scr.height,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
124
131
|
});
|
|
125
132
|
callback(null, item);
|
|
126
133
|
};
|
|
127
134
|
}
|
|
128
135
|
|
|
129
136
|
function addPluginInfo(window) {
|
|
130
|
-
return function(item, options, callback) {
|
|
137
|
+
return function (item, options, callback) {
|
|
131
138
|
if (!window || !window.navigator) {
|
|
132
139
|
return callback(null, item);
|
|
133
140
|
}
|
|
134
141
|
var plugins = [];
|
|
135
142
|
var navPlugins = window.navigator.plugins || [];
|
|
136
143
|
var cur;
|
|
137
|
-
for (var i=0, l=navPlugins.length; i < l; ++i) {
|
|
144
|
+
for (var i = 0, l = navPlugins.length; i < l; ++i) {
|
|
138
145
|
cur = navPlugins[i];
|
|
139
|
-
plugins.push({name: cur.name, description: cur.description});
|
|
146
|
+
plugins.push({ name: cur.name, description: cur.description });
|
|
140
147
|
}
|
|
141
148
|
_.set(item, 'data.client.javascript.plugins', plugins);
|
|
142
149
|
callback(null, item);
|
|
@@ -163,21 +170,26 @@ function addBodyMessage(item, options, callback) {
|
|
|
163
170
|
message = 'Item sent with null or missing arguments.';
|
|
164
171
|
}
|
|
165
172
|
var result = {
|
|
166
|
-
body: message
|
|
173
|
+
body: message,
|
|
167
174
|
};
|
|
168
175
|
|
|
169
176
|
if (custom) {
|
|
170
177
|
result.extra = _.merge(custom);
|
|
171
178
|
}
|
|
172
179
|
|
|
173
|
-
_.set(item, 'data.body', {message: result});
|
|
180
|
+
_.set(item, 'data.body', { message: result });
|
|
174
181
|
callback(null, item);
|
|
175
182
|
}
|
|
176
183
|
|
|
177
184
|
function stackFromItem(item) {
|
|
178
185
|
// Transform a TraceKit stackInfo object into a Rollbar trace
|
|
179
186
|
var stack = item.stackInfo.stack;
|
|
180
|
-
if (
|
|
187
|
+
if (
|
|
188
|
+
stack &&
|
|
189
|
+
stack.length === 0 &&
|
|
190
|
+
item._unhandledStackInfo &&
|
|
191
|
+
item._unhandledStackInfo.stack
|
|
192
|
+
) {
|
|
181
193
|
stack = item._unhandledStackInfo.stack;
|
|
182
194
|
}
|
|
183
195
|
return stack;
|
|
@@ -193,7 +205,7 @@ function addBodyTraceChain(item, options, callback) {
|
|
|
193
205
|
traces.push(trace);
|
|
194
206
|
}
|
|
195
207
|
|
|
196
|
-
_.set(item, 'data.body', {trace_chain: traces});
|
|
208
|
+
_.set(item, 'data.body', { trace_chain: traces });
|
|
197
209
|
callback(null, item);
|
|
198
210
|
}
|
|
199
211
|
|
|
@@ -202,7 +214,7 @@ function addBodyTrace(item, options, callback) {
|
|
|
202
214
|
|
|
203
215
|
if (stack) {
|
|
204
216
|
var trace = buildTrace(item, item.stackInfo, options);
|
|
205
|
-
_.set(item, 'data.body', {trace: trace});
|
|
217
|
+
_.set(item, 'data.body', { trace: trace });
|
|
206
218
|
callback(null, item);
|
|
207
219
|
} else {
|
|
208
220
|
var stackInfo = item.stackInfo;
|
|
@@ -225,9 +237,9 @@ function buildTrace(item, stackInfo, options) {
|
|
|
225
237
|
var message = guess[1];
|
|
226
238
|
var trace = {
|
|
227
239
|
exception: {
|
|
228
|
-
|
|
229
|
-
message: message
|
|
230
|
-
}
|
|
240
|
+
class: className,
|
|
241
|
+
message: message,
|
|
242
|
+
},
|
|
231
243
|
};
|
|
232
244
|
|
|
233
245
|
if (description) {
|
|
@@ -253,13 +265,20 @@ function buildTrace(item, stackInfo, options) {
|
|
|
253
265
|
frame = {
|
|
254
266
|
filename: stackFrame.url ? _.sanitizeUrl(stackFrame.url) : '(unknown)',
|
|
255
267
|
lineno: stackFrame.line || null,
|
|
256
|
-
method:
|
|
257
|
-
|
|
268
|
+
method:
|
|
269
|
+
!stackFrame.func || stackFrame.func === '?'
|
|
270
|
+
? '[anonymous]'
|
|
271
|
+
: stackFrame.func,
|
|
272
|
+
colno: stackFrame.column,
|
|
258
273
|
};
|
|
259
274
|
if (options.sendFrameUrl) {
|
|
260
275
|
frame.url = stackFrame.url;
|
|
261
276
|
}
|
|
262
|
-
if (
|
|
277
|
+
if (
|
|
278
|
+
frame.method &&
|
|
279
|
+
frame.method.endsWith &&
|
|
280
|
+
frame.method.endsWith('_rollbar_wrapped')
|
|
281
|
+
) {
|
|
263
282
|
continue;
|
|
264
283
|
}
|
|
265
284
|
|
|
@@ -322,7 +341,7 @@ function addScrubber(scrubFn) {
|
|
|
322
341
|
item.data = scrubFn(item.data, scrubFields, scrubPaths);
|
|
323
342
|
}
|
|
324
343
|
callback(null, item);
|
|
325
|
-
}
|
|
344
|
+
};
|
|
326
345
|
}
|
|
327
346
|
|
|
328
347
|
module.exports = {
|
|
@@ -334,5 +353,5 @@ module.exports = {
|
|
|
334
353
|
addClientInfo: addClientInfo,
|
|
335
354
|
addPluginInfo: addPluginInfo,
|
|
336
355
|
addBody: addBody,
|
|
337
|
-
addScrubber: addScrubber
|
|
356
|
+
addScrubber: addScrubber,
|
|
338
357
|
};
|
|
@@ -5,9 +5,11 @@ function makeFetchRequest(accessToken, url, method, data, callback, timeout) {
|
|
|
5
5
|
var controller;
|
|
6
6
|
var timeoutId;
|
|
7
7
|
|
|
8
|
-
if(_.isFiniteNumber(timeout)) {
|
|
8
|
+
if (_.isFiniteNumber(timeout)) {
|
|
9
9
|
controller = new AbortController();
|
|
10
|
-
timeoutId = setTimeout(function () {
|
|
10
|
+
timeoutId = setTimeout(function () {
|
|
11
|
+
controller.abort();
|
|
12
|
+
}, timeout);
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
fetch(url, {
|
|
@@ -15,21 +17,31 @@ function makeFetchRequest(accessToken, url, method, data, callback, timeout) {
|
|
|
15
17
|
headers: {
|
|
16
18
|
'Content-Type': 'application/json',
|
|
17
19
|
'X-Rollbar-Access-Token': accessToken,
|
|
18
|
-
signal: controller && controller.signal
|
|
20
|
+
signal: controller && controller.signal,
|
|
19
21
|
},
|
|
20
22
|
body: data,
|
|
21
23
|
})
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
.then(function (response) {
|
|
25
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
26
|
+
const respHeaders = response.headers;
|
|
27
|
+
const headers = {
|
|
28
|
+
'Rollbar-Replay-Enabled': respHeaders.get(
|
|
29
|
+
'Rollbar-Replay-Enabled'
|
|
30
|
+
),
|
|
31
|
+
'Rollbar-Replay-RateLimit-Remaining': respHeaders.get(
|
|
32
|
+
'Rollbar-Replay-RateLimit-Remaining'
|
|
33
|
+
),
|
|
34
|
+
'Rollbar-Replay-RateLimit-Reset': respHeaders.get(
|
|
35
|
+
'Rollbar-Replay-RateLimit-Reset'
|
|
36
|
+
),
|
|
37
|
+
};
|
|
38
|
+
const json = response.json();
|
|
39
|
+
callback(null, json, headers);
|
|
40
|
+
})
|
|
41
|
+
.catch(function (error) {
|
|
42
|
+
logger.error(error.message);
|
|
43
|
+
callback(error);
|
|
44
|
+
});
|
|
33
45
|
}
|
|
34
46
|
|
|
35
47
|
module.exports = makeFetchRequest;
|
|
@@ -3,7 +3,15 @@
|
|
|
3
3
|
var _ = require('../../utility');
|
|
4
4
|
var logger = require('../logger');
|
|
5
5
|
|
|
6
|
-
function makeXhrRequest(
|
|
6
|
+
function makeXhrRequest(
|
|
7
|
+
accessToken,
|
|
8
|
+
url,
|
|
9
|
+
method,
|
|
10
|
+
data,
|
|
11
|
+
callback,
|
|
12
|
+
requestFactory,
|
|
13
|
+
timeout,
|
|
14
|
+
) {
|
|
7
15
|
var request;
|
|
8
16
|
if (requestFactory) {
|
|
9
17
|
request = requestFactory();
|
|
@@ -16,19 +24,31 @@ function makeXhrRequest(accessToken, url, method, data, callback, requestFactory
|
|
|
16
24
|
}
|
|
17
25
|
try {
|
|
18
26
|
try {
|
|
19
|
-
var onreadystatechange = function() {
|
|
27
|
+
var onreadystatechange = function () {
|
|
20
28
|
try {
|
|
21
29
|
if (onreadystatechange && request.readyState === 4) {
|
|
22
30
|
onreadystatechange = undefined;
|
|
23
31
|
|
|
24
32
|
var parseResponse = _.jsonParse(request.responseText);
|
|
25
33
|
if (_isSuccess(request)) {
|
|
26
|
-
|
|
34
|
+
const headers = {
|
|
35
|
+
'Rollbar-Replay-Enabled': request.getResponseHeader(
|
|
36
|
+
'Rollbar-Replay-Enabled'
|
|
37
|
+
),
|
|
38
|
+
'Rollbar-Replay-RateLimit-Remaining': request.getResponseHeader(
|
|
39
|
+
'Rollbar-Replay-RateLimit-Remaining'
|
|
40
|
+
),
|
|
41
|
+
'Rollbar-Replay-RateLimit-Reset': request.getResponseHeader(
|
|
42
|
+
'Rollbar-Replay-RateLimit-Reset'
|
|
43
|
+
),
|
|
44
|
+
}
|
|
45
|
+
callback(parseResponse.error, parseResponse.value, headers);
|
|
27
46
|
return;
|
|
28
47
|
} else if (_isNormalFailure(request)) {
|
|
29
48
|
if (request.status === 403) {
|
|
30
49
|
// likely caused by using a server access token
|
|
31
|
-
var message =
|
|
50
|
+
var message =
|
|
51
|
+
parseResponse.value && parseResponse.value.message;
|
|
32
52
|
logger.error(message);
|
|
33
53
|
}
|
|
34
54
|
// return valid http status codes
|
|
@@ -37,7 +57,8 @@ function makeXhrRequest(accessToken, url, method, data, callback, requestFactory
|
|
|
37
57
|
// IE will return a status 12000+ on some sort of connection failure,
|
|
38
58
|
// so we return a blank error
|
|
39
59
|
// http://msdn.microsoft.com/en-us/library/aa383770%28VS.85%29.aspx
|
|
40
|
-
var msg =
|
|
60
|
+
var msg =
|
|
61
|
+
'XHR response had no status code (likely connection failure)';
|
|
41
62
|
callback(_newRetriableError(msg));
|
|
42
63
|
}
|
|
43
64
|
}
|
|
@@ -61,7 +82,7 @@ function makeXhrRequest(accessToken, url, method, data, callback, requestFactory
|
|
|
61
82
|
request.setRequestHeader('X-Rollbar-Access-Token', accessToken);
|
|
62
83
|
}
|
|
63
84
|
|
|
64
|
-
if(_.isFiniteNumber(timeout)) {
|
|
85
|
+
if (_.isFiniteNumber(timeout)) {
|
|
65
86
|
request.timeout = timeout;
|
|
66
87
|
}
|
|
67
88
|
|
|
@@ -70,31 +91,37 @@ function makeXhrRequest(accessToken, url, method, data, callback, requestFactory
|
|
|
70
91
|
} catch (e1) {
|
|
71
92
|
// Sending using the normal xmlhttprequest object didn't work, try XDomainRequest
|
|
72
93
|
if (typeof XDomainRequest !== 'undefined') {
|
|
73
|
-
|
|
74
94
|
// Assume we are in a really old browser which has a bunch of limitations:
|
|
75
95
|
// http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
|
|
76
96
|
|
|
77
97
|
// Extreme paranoia: if we have XDomainRequest then we have a window, but just in case
|
|
78
98
|
if (!window || !window.location) {
|
|
79
|
-
return callback(
|
|
99
|
+
return callback(
|
|
100
|
+
new Error(
|
|
101
|
+
'No window available during request, unknown environment',
|
|
102
|
+
),
|
|
103
|
+
);
|
|
80
104
|
}
|
|
81
105
|
|
|
82
106
|
// If the current page is http, try and send over http
|
|
83
|
-
if (
|
|
107
|
+
if (
|
|
108
|
+
window.location.href.substring(0, 5) === 'http:' &&
|
|
109
|
+
url.substring(0, 5) === 'https'
|
|
110
|
+
) {
|
|
84
111
|
url = 'http' + url.substring(5);
|
|
85
112
|
}
|
|
86
113
|
|
|
87
114
|
var xdomainrequest = new XDomainRequest();
|
|
88
|
-
xdomainrequest.onprogress = function() {};
|
|
89
|
-
xdomainrequest.ontimeout = function() {
|
|
115
|
+
xdomainrequest.onprogress = function () {};
|
|
116
|
+
xdomainrequest.ontimeout = function () {
|
|
90
117
|
var msg = 'Request timed out';
|
|
91
118
|
var code = 'ETIMEDOUT';
|
|
92
119
|
callback(_newRetriableError(msg, code));
|
|
93
120
|
};
|
|
94
|
-
xdomainrequest.onerror = function() {
|
|
121
|
+
xdomainrequest.onerror = function () {
|
|
95
122
|
callback(new Error('Error during request'));
|
|
96
123
|
};
|
|
97
|
-
xdomainrequest.onload = function() {
|
|
124
|
+
xdomainrequest.onload = function () {
|
|
98
125
|
var parseResponse = _.jsonParse(xdomainrequest.responseText);
|
|
99
126
|
callback(parseResponse.error, parseResponse.value);
|
|
100
127
|
};
|
|
@@ -124,7 +151,7 @@ function _createXMLHTTPObject() {
|
|
|
124
151
|
},
|
|
125
152
|
function () {
|
|
126
153
|
return new ActiveXObject('Microsoft.XMLHTTP');
|
|
127
|
-
}
|
|
154
|
+
},
|
|
128
155
|
];
|
|
129
156
|
var xmlhttp;
|
|
130
157
|
var i;
|
package/src/browser/transport.js
CHANGED
|
@@ -24,22 +24,41 @@ function Transport(truncation) {
|
|
|
24
24
|
this.truncation = truncation;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
Transport.prototype.get = function(
|
|
27
|
+
Transport.prototype.get = function (
|
|
28
|
+
accessToken,
|
|
29
|
+
options,
|
|
30
|
+
params,
|
|
31
|
+
callback,
|
|
32
|
+
requestFactory,
|
|
33
|
+
) {
|
|
28
34
|
if (!callback || !_.isFunction(callback)) {
|
|
29
|
-
callback = function() {};
|
|
35
|
+
callback = function () {};
|
|
30
36
|
}
|
|
31
37
|
_.addParamsAndAccessTokenToPath(accessToken, options, params);
|
|
32
38
|
|
|
33
39
|
var method = 'GET';
|
|
34
40
|
var url = _.formatUrl(options);
|
|
35
41
|
this._makeZoneRequest(
|
|
36
|
-
accessToken,
|
|
42
|
+
accessToken,
|
|
43
|
+
url,
|
|
44
|
+
method,
|
|
45
|
+
null,
|
|
46
|
+
callback,
|
|
47
|
+
requestFactory,
|
|
48
|
+
options.timeout,
|
|
49
|
+
options.transport,
|
|
37
50
|
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
Transport.prototype.post = function(
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
Transport.prototype.post = function (
|
|
54
|
+
accessToken,
|
|
55
|
+
options,
|
|
56
|
+
payload,
|
|
57
|
+
callback,
|
|
58
|
+
requestFactory,
|
|
59
|
+
) {
|
|
41
60
|
if (!callback || !_.isFunction(callback)) {
|
|
42
|
-
callback = function() {};
|
|
61
|
+
callback = function () {};
|
|
43
62
|
}
|
|
44
63
|
|
|
45
64
|
if (!payload) {
|
|
@@ -47,10 +66,11 @@ Transport.prototype.post = function(accessToken, options, payload, callback, req
|
|
|
47
66
|
}
|
|
48
67
|
|
|
49
68
|
var stringifyResult;
|
|
50
|
-
|
|
69
|
+
// Check payload.body to ensure only items are truncated.
|
|
70
|
+
if (this.truncation && payload.body) {
|
|
51
71
|
stringifyResult = this.truncation.truncate(payload);
|
|
52
72
|
} else {
|
|
53
|
-
stringifyResult = _.stringify(payload)
|
|
73
|
+
stringifyResult = _.stringify(payload);
|
|
54
74
|
}
|
|
55
75
|
if (stringifyResult.error) {
|
|
56
76
|
return callback(stringifyResult.error);
|
|
@@ -60,34 +80,57 @@ Transport.prototype.post = function(accessToken, options, payload, callback, req
|
|
|
60
80
|
var method = 'POST';
|
|
61
81
|
var url = _.formatUrl(options);
|
|
62
82
|
this._makeZoneRequest(
|
|
63
|
-
accessToken,
|
|
83
|
+
accessToken,
|
|
84
|
+
url,
|
|
85
|
+
method,
|
|
86
|
+
writeData,
|
|
87
|
+
callback,
|
|
88
|
+
requestFactory,
|
|
89
|
+
options.timeout,
|
|
90
|
+
options.transport,
|
|
64
91
|
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
Transport.prototype.postJsonPayload = function (
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
Transport.prototype.postJsonPayload = function (
|
|
95
|
+
accessToken,
|
|
96
|
+
options,
|
|
97
|
+
jsonPayload,
|
|
98
|
+
callback,
|
|
99
|
+
requestFactory,
|
|
100
|
+
) {
|
|
68
101
|
if (!callback || !_.isFunction(callback)) {
|
|
69
|
-
callback = function() {};
|
|
102
|
+
callback = function () {};
|
|
70
103
|
}
|
|
71
104
|
|
|
72
105
|
var method = 'POST';
|
|
73
106
|
var url = _.formatUrl(options);
|
|
74
107
|
this._makeZoneRequest(
|
|
75
|
-
accessToken,
|
|
108
|
+
accessToken,
|
|
109
|
+
url,
|
|
110
|
+
method,
|
|
111
|
+
jsonPayload,
|
|
112
|
+
callback,
|
|
113
|
+
requestFactory,
|
|
114
|
+
options.timeout,
|
|
115
|
+
options.transport,
|
|
76
116
|
);
|
|
77
|
-
}
|
|
78
|
-
|
|
117
|
+
};
|
|
79
118
|
|
|
80
|
-
// Wraps _makeRequest
|
|
81
|
-
//
|
|
82
|
-
// This is
|
|
83
|
-
//
|
|
119
|
+
// Wraps `_makeRequest` if zone.js is being used, ensuring that Rollbar
|
|
120
|
+
// API calls are not intercepted by any child forked zones.
|
|
121
|
+
// This is equivalent to `NgZone.runOutsideAngular` in Angular.
|
|
84
122
|
Transport.prototype._makeZoneRequest = function () {
|
|
85
|
-
var gWindow =
|
|
86
|
-
|
|
123
|
+
var gWindow =
|
|
124
|
+
(typeof window != 'undefined' && window) ||
|
|
125
|
+
(typeof self != 'undefined' && self);
|
|
126
|
+
// Whenever zone.js is loaded and `Zone` is exposed globally, access
|
|
127
|
+
// the root zone to ensure that requests are always made within it.
|
|
128
|
+
// This approach is framework-agnostic, regardless of which
|
|
129
|
+
// framework zone.js is used with.
|
|
130
|
+
var rootZone = gWindow && gWindow.Zone && gWindow.Zone.root;
|
|
87
131
|
var args = Array.prototype.slice.call(arguments);
|
|
88
132
|
|
|
89
|
-
if (
|
|
90
|
-
var rootZone = currentZone._parent;
|
|
133
|
+
if (rootZone) {
|
|
91
134
|
var self = this;
|
|
92
135
|
rootZone.run(function () {
|
|
93
136
|
self._makeRequest.apply(undefined, args);
|
|
@@ -95,31 +138,48 @@ Transport.prototype._makeZoneRequest = function () {
|
|
|
95
138
|
} else {
|
|
96
139
|
this._makeRequest.apply(undefined, args);
|
|
97
140
|
}
|
|
98
|
-
}
|
|
141
|
+
};
|
|
99
142
|
|
|
100
143
|
Transport.prototype._makeRequest = function (
|
|
101
|
-
accessToken,
|
|
144
|
+
accessToken,
|
|
145
|
+
url,
|
|
146
|
+
method,
|
|
147
|
+
data,
|
|
148
|
+
callback,
|
|
149
|
+
requestFactory,
|
|
150
|
+
timeout,
|
|
151
|
+
transport,
|
|
102
152
|
) {
|
|
103
153
|
if (typeof RollbarProxy !== 'undefined') {
|
|
104
154
|
return _proxyRequest(data, callback);
|
|
105
155
|
}
|
|
106
156
|
|
|
107
157
|
if (transport === 'fetch') {
|
|
108
|
-
makeFetchRequest(accessToken, url, method, data, callback, timeout)
|
|
158
|
+
makeFetchRequest(accessToken, url, method, data, callback, timeout);
|
|
109
159
|
} else {
|
|
110
|
-
makeXhrRequest(
|
|
160
|
+
makeXhrRequest(
|
|
161
|
+
accessToken,
|
|
162
|
+
url,
|
|
163
|
+
method,
|
|
164
|
+
data,
|
|
165
|
+
callback,
|
|
166
|
+
requestFactory,
|
|
167
|
+
timeout,
|
|
168
|
+
);
|
|
111
169
|
}
|
|
112
|
-
}
|
|
170
|
+
};
|
|
113
171
|
|
|
114
172
|
/* global RollbarProxy */
|
|
115
173
|
function _proxyRequest(json, callback) {
|
|
116
174
|
var rollbarProxy = new RollbarProxy();
|
|
117
175
|
rollbarProxy.sendJsonPayload(
|
|
118
176
|
json,
|
|
119
|
-
function(_msg) {
|
|
120
|
-
|
|
177
|
+
function (_msg) {
|
|
178
|
+
/* do nothing */
|
|
179
|
+
}, // eslint-disable-line no-unused-vars
|
|
180
|
+
function (err) {
|
|
121
181
|
callback(new Error(err));
|
|
122
|
-
}
|
|
182
|
+
},
|
|
123
183
|
);
|
|
124
184
|
}
|
|
125
185
|
|
package/src/browser/url.js
CHANGED
|
@@ -1,24 +1,32 @@
|
|
|
1
1
|
// See https://nodejs.org/docs/latest/api/url.html
|
|
2
2
|
function parse(url) {
|
|
3
3
|
var result = {
|
|
4
|
-
protocol: null,
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
protocol: null,
|
|
5
|
+
auth: null,
|
|
6
|
+
host: null,
|
|
7
|
+
path: null,
|
|
8
|
+
hash: null,
|
|
9
|
+
href: url,
|
|
10
|
+
hostname: null,
|
|
11
|
+
port: null,
|
|
12
|
+
pathname: null,
|
|
13
|
+
search: null,
|
|
14
|
+
query: null,
|
|
7
15
|
};
|
|
8
16
|
|
|
9
17
|
var i, last;
|
|
10
18
|
i = url.indexOf('//');
|
|
11
19
|
if (i !== -1) {
|
|
12
|
-
result.protocol = url.substring(0,i);
|
|
13
|
-
last = i+2;
|
|
20
|
+
result.protocol = url.substring(0, i);
|
|
21
|
+
last = i + 2;
|
|
14
22
|
} else {
|
|
15
23
|
last = 0;
|
|
16
24
|
}
|
|
17
|
-
|
|
25
|
+
|
|
18
26
|
i = url.indexOf('@', last);
|
|
19
27
|
if (i !== -1) {
|
|
20
28
|
result.auth = url.substring(last, i);
|
|
21
|
-
last = i+1;
|
|
29
|
+
last = i + 1;
|
|
22
30
|
}
|
|
23
31
|
|
|
24
32
|
i = url.indexOf('/', last);
|
|
@@ -75,5 +83,5 @@ function parse(url) {
|
|
|
75
83
|
}
|
|
76
84
|
|
|
77
85
|
module.exports = {
|
|
78
|
-
parse: parse
|
|
86
|
+
parse: parse,
|
|
79
87
|
};
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
function wrapGlobals(window, handler, shim) {
|
|
2
|
-
if (!window) {
|
|
2
|
+
if (!window) {
|
|
3
|
+
return;
|
|
4
|
+
}
|
|
3
5
|
// Adapted from https://github.com/bugsnag/bugsnag-js
|
|
4
|
-
var globals =
|
|
6
|
+
var globals =
|
|
7
|
+
'EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload'.split(
|
|
8
|
+
',',
|
|
9
|
+
);
|
|
5
10
|
var i, global;
|
|
6
11
|
for (i = 0; i < globals.length; ++i) {
|
|
7
12
|
global = globals[i];
|
|
@@ -13,12 +18,18 @@ function wrapGlobals(window, handler, shim) {
|
|
|
13
18
|
}
|
|
14
19
|
|
|
15
20
|
function _extendListenerPrototype(handler, prototype, shim) {
|
|
16
|
-
if (
|
|
21
|
+
if (
|
|
22
|
+
prototype.hasOwnProperty &&
|
|
23
|
+
prototype.hasOwnProperty('addEventListener')
|
|
24
|
+
) {
|
|
17
25
|
var oldAddEventListener = prototype.addEventListener;
|
|
18
|
-
while (
|
|
26
|
+
while (
|
|
27
|
+
oldAddEventListener._rollbarOldAdd &&
|
|
28
|
+
oldAddEventListener.belongsToShim
|
|
29
|
+
) {
|
|
19
30
|
oldAddEventListener = oldAddEventListener._rollbarOldAdd;
|
|
20
31
|
}
|
|
21
|
-
var addFn = function(event, callback, bubble) {
|
|
32
|
+
var addFn = function (event, callback, bubble) {
|
|
22
33
|
oldAddEventListener.call(this, event, handler.wrap(callback), bubble);
|
|
23
34
|
};
|
|
24
35
|
addFn._rollbarOldAdd = oldAddEventListener;
|
|
@@ -26,11 +37,19 @@ function _extendListenerPrototype(handler, prototype, shim) {
|
|
|
26
37
|
prototype.addEventListener = addFn;
|
|
27
38
|
|
|
28
39
|
var oldRemoveEventListener = prototype.removeEventListener;
|
|
29
|
-
while (
|
|
40
|
+
while (
|
|
41
|
+
oldRemoveEventListener._rollbarOldRemove &&
|
|
42
|
+
oldRemoveEventListener.belongsToShim
|
|
43
|
+
) {
|
|
30
44
|
oldRemoveEventListener = oldRemoveEventListener._rollbarOldRemove;
|
|
31
45
|
}
|
|
32
|
-
var removeFn = function(event, callback, bubble) {
|
|
33
|
-
oldRemoveEventListener.call(
|
|
46
|
+
var removeFn = function (event, callback, bubble) {
|
|
47
|
+
oldRemoveEventListener.call(
|
|
48
|
+
this,
|
|
49
|
+
event,
|
|
50
|
+
(callback && callback._rollbar_wrapped) || callback,
|
|
51
|
+
bubble,
|
|
52
|
+
);
|
|
34
53
|
};
|
|
35
54
|
removeFn._rollbarOldRemove = oldRemoveEventListener;
|
|
36
55
|
removeFn.belongsToShim = shim;
|