Skip to content

Commit 98afc15

Browse files
committed
Release v2.15.0
1 parent d731a9c commit 98afc15

27 files changed

+283
-175
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Rollbar.js
22

3-
[![Build Status](https://api.travis-ci.org/rollbar/rollbar.js.png?branch=v2.14.6)](https://travis-ci.org/rollbar/rollbar.js)
3+
[![Build Status](https://api.travis-ci.org/rollbar/rollbar.js.png?branch=v2.15.0)](https://travis-ci.org/rollbar/rollbar.js)
44
[![Code Quality: Javascript](https://img.shields.io/lgtm/grade/javascript/g/rollbar/rollbar.js.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/rollbar/rollbar.js/context:javascript)
55
[![Total Alerts](https://img.shields.io/lgtm/alerts/g/rollbar/rollbar.js.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/rollbar/rollbar.js/alerts)
66

dist/plugins/jquery.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rollbar.js

+65-38
Original file line numberDiff line numberDiff line change
@@ -572,10 +572,9 @@ function createItem(args, logger, notifier, requestKeys, lambdaContext) {
572572
diagnostic: diagnostic,
573573
uuid: uuid4()
574574
};
575-
if (custom && custom.level !== undefined) {
576-
item.level = custom.level;
577-
delete custom.level;
578-
}
575+
576+
setCustomItemKeys(item, custom);
577+
579578
if (requestKeys && request) {
580579
item.request = request;
581580
}
@@ -586,6 +585,17 @@ function createItem(args, logger, notifier, requestKeys, lambdaContext) {
586585
return item;
587586
}
588587

588+
function setCustomItemKeys(item, custom) {
589+
if (custom && custom.level !== undefined) {
590+
item.level = custom.level;
591+
delete custom.level;
592+
}
593+
if (custom && custom.skipFrames !== undefined) {
594+
item.skipFrames = custom.skipFrames;
595+
delete custom.skipFrames;
596+
}
597+
}
598+
589599
var TELEMETRY_TYPES = ['log', 'network', 'dom', 'navigation', 'error', 'manual'];
590600
var TELEMETRY_LEVELS = ['critical', 'error', 'warning', 'info', 'debug'];
591601

@@ -1167,30 +1177,21 @@ function Frame(stackFrame) {
11671177
}
11681178

11691179

1170-
function Stack(exception) {
1180+
function Stack(exception, skip) {
11711181
function getStack() {
11721182
var parserStack = [];
1173-
var exc;
11741183

1175-
if (!exception.stack) {
1176-
try {
1177-
throw exception;
1178-
} catch (e) {
1179-
exc = e;
1180-
}
1181-
} else {
1182-
exc = exception;
1183-
}
1184+
skip = skip || 0;
11841185

11851186
try {
1186-
parserStack = ErrorStackParser.parse(exc);
1187+
parserStack = ErrorStackParser.parse(exception);
11871188
} catch(e) {
11881189
parserStack = [];
11891190
}
11901191

11911192
var stack = [];
11921193

1193-
for (var i = 0; i < parserStack.length; i++) {
1194+
for (var i = skip; i < parserStack.length; i++) {
11941195
stack.push(new Frame(parserStack[i]));
11951196
}
11961197

@@ -1207,21 +1208,23 @@ function Stack(exception) {
12071208
}
12081209

12091210

1210-
function parse(e) {
1211+
function parse(e, skip) {
12111212
var err = e;
12121213

12131214
if (err.nested) {
12141215
var traceChain = [];
12151216
while (err) {
1216-
traceChain.push(new Stack(err));
1217+
traceChain.push(new Stack(err, skip));
12171218
err = err.nested;
1219+
1220+
skip = 0; // Only apply skip value to primary error
12181221
}
12191222

12201223
// Return primary error with full trace chain attached.
12211224
traceChain[0].traceChain = traceChain;
12221225
return traceChain[0];
12231226
} else {
1224-
return new Stack(err);
1227+
return new Stack(err, skip);
12251228
}
12261229
}
12271230

@@ -1810,6 +1813,10 @@ Rollbar.prototype._createItem = function(args) {
18101813
return _.createItem(args, logger, this);
18111814
};
18121815

1816+
Rollbar.prototype.loadFull = function() {
1817+
logger.info('Unexpected Rollbar.loadFull() called on a Notifier instance. This can happen when Rollbar is loaded multiple times.');
1818+
};
1819+
18131820
function _getFirstFunction(args) {
18141821
for (var i = 0, len = args.length; i < len; ++i) {
18151822
if (_.isFunction(args[i])) {
@@ -1831,7 +1838,7 @@ function _gWindow() {
18311838
/* global __DEFAULT_ENDPOINT__:false */
18321839

18331840
var defaultOptions = {
1834-
version: "2.14.6",
1841+
version: "2.15.0",
18351842
scrubFields: ["pw","pass","passwd","password","secret","confirm_password","confirmPassword","password_confirmation","passwordConfirmation","access_token","accessToken","X-Rollbar-Access-Token","secret_key","secretKey","secretToken","cc-number","card number","cardnumber","cardnum","ccnum","ccnumber","cc num","creditcardnumber","credit card number","newcreditcardnumber","new credit card","creditcardno","credit card no","card#","card #","cc-csc","cvc","cvc2","cvv2","ccv2","security code","card verification","name on credit card","name on card","nameoncard","cardholder","card holder","name des karteninhabers","ccname","card type","cardtype","cc type","cctype","payment type","expiration date","expirationdate","expdate","cc-exp","ccmonth","ccyear"],
18361843
logLevel: "debug",
18371844
reportLevel: "debug",
@@ -4283,7 +4290,7 @@ function handleItemWithError(item, options, callback) {
42834290
item.data = item.data || {};
42844291
if (item.err) {
42854292
try {
4286-
item.stackInfo = item.err._savedStackTrace || errorParser.parse(item.err);
4293+
item.stackInfo = item.err._savedStackTrace || errorParser.parse(item.err, item.skipFrames);
42874294
} catch (e) {
42884295
logger.error('Error while parsing the error object.', e);
42894296
try {
@@ -4592,9 +4599,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
45924599
}(this, function ErrorStackParser(StackFrame) {
45934600
'use strict';
45944601

4595-
var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\S+\:\d+/;
4596-
var CHROME_IE_STACK_REGEXP = /^\s*at .*(\S+\:\d+|\(native\))/m;
4597-
var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\[native code\])?$/;
4602+
var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\S+:\d+/;
4603+
var CHROME_IE_STACK_REGEXP = /^\s*at .*(\S+:\d+|\(native\))/m;
4604+
var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\[native code])?$/;
45984605

45994606
return {
46004607
/**
@@ -4622,8 +4629,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
46224629
return [urlLike];
46234630
}
46244631

4625-
var regExp = /(.+?)(?:\:(\d+))?(?:\:(\d+))?$/;
4626-
var parts = regExp.exec(urlLike.replace(/[\(\)]/g, ''));
4632+
var regExp = /(.+?)(?::(\d+))?(?::(\d+))?$/;
4633+
var parts = regExp.exec(urlLike.replace(/[()]/g, ''));
46274634
return [parts[1], parts[2] || undefined, parts[3] || undefined];
46284635
},
46294636

@@ -4635,7 +4642,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
46354642
return filtered.map(function(line) {
46364643
if (line.indexOf('(eval ') > -1) {
46374644
// Throw away eval information until we implement stacktrace.js/stackframe#8
4638-
line = line.replace(/eval code/g, 'eval').replace(/(\(eval at [^\()]*)|(\)\,.*$)/g, '');
4645+
line = line.replace(/eval code/g, 'eval').replace(/(\(eval at [^()]*)|(\),.*$)/g, '');
46394646
}
46404647
var sanitizedLine = line.replace(/^\s+/, '').replace(/\(eval code/g, '(');
46414648

@@ -4670,7 +4677,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
46704677
return filtered.map(function(line) {
46714678
// Throw away eval information until we implement stacktrace.js/stackframe#8
46724679
if (line.indexOf(' > eval') > -1) {
4673-
line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g, ':$1');
4680+
line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g, ':$1');
46744681
}
46754682

46764683
if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {
@@ -4758,11 +4765,11 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
47584765
var locationParts = this.extractLocation(tokens.pop());
47594766
var functionCall = (tokens.shift() || '');
47604767
var functionName = functionCall
4761-
.replace(/<anonymous function(: (\w+))?>/, '$2')
4762-
.replace(/\([^\)]*\)/g, '') || undefined;
4768+
.replace(/<anonymous function(: (\w+))?>/, '$2')
4769+
.replace(/\([^)]*\)/g, '') || undefined;
47634770
var argsRaw;
4764-
if (functionCall.match(/\(([^\)]*)\)/)) {
4765-
argsRaw = functionCall.replace(/^[^\(]+\(([^\)]*)\)$/, '$1');
4771+
if (functionCall.match(/\(([^)]*)\)/)) {
4772+
argsRaw = functionCall.replace(/^[^(]+\(([^)]*)\)$/, '$1');
47664773
}
47674774
var args = (argsRaw === undefined || argsRaw === '[arguments not available]') ?
47684775
undefined : argsRaw.split(',');
@@ -4820,11 +4827,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
48204827
var props = booleanProps.concat(numericProps, stringProps, arrayProps);
48214828

48224829
function StackFrame(obj) {
4823-
if (obj instanceof Object) {
4824-
for (var i = 0; i < props.length; i++) {
4825-
if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) {
4826-
this['set' + _capitalize(props[i])](obj[props[i]]);
4827-
}
4830+
if (!obj) return;
4831+
for (var i = 0; i < props.length; i++) {
4832+
if (obj[props[i]] !== undefined) {
4833+
this['set' + _capitalize(props[i])](obj[props[i]]);
48284834
}
48294835
}
48304836
}
@@ -5277,6 +5283,9 @@ var defaults = {
52775283
networkResponseBody: false,
52785284
networkRequestHeaders: false,
52795285
networkRequestBody: false,
5286+
networkErrorOnHttp5xx: false,
5287+
networkErrorOnHttp4xx: false,
5288+
networkErrorOnHttp0: false,
52805289
log: true,
52815290
dom: true,
52825291
navigation: true,
@@ -5543,6 +5552,7 @@ Instrumenter.prototype.instrumentNetwork = function() {
55435552
code = code === 1223 ? 204 : code;
55445553
xhr.__rollbar_xhr.status_code = code;
55455554
xhr.__rollbar_event.level = self.telemeter.levelFromStatus(code);
5555+
self.errorOnHttpStatus(xhr.__rollbar_xhr);
55465556
} catch (e) {
55475557
/* ignore possible exception from xhr.status */
55485558
}
@@ -5561,6 +5571,9 @@ Instrumenter.prototype.instrumentNetwork = function() {
55615571
} else {
55625572
xhr.onreadystatechange = onreadystatechangeHandler;
55635573
}
5574+
if (xhr.__rollbar_xhr) {
5575+
xhr.__rollbar_xhr.stack = (new Error()).stack;
5576+
}
55645577
return orig.apply(this, arguments);
55655578
}
55665579
}, this.replacements, 'network');
@@ -5616,6 +5629,7 @@ Instrumenter.prototype.instrumentNetwork = function() {
56165629
}
56175630
}
56185631
self.captureNetwork(metadata, 'fetch', undefined);
5632+
metadata.stack = (new Error()).stack;
56195633
return orig.apply(this, args).then(function (resp) {
56205634
metadata.end_time_ms = _.now();
56215635
metadata.status_code = resp.status;
@@ -5648,6 +5662,7 @@ Instrumenter.prototype.instrumentNetwork = function() {
56485662
metadata.response.headers = headers;
56495663
}
56505664
}
5665+
self.errorOnHttpStatus(metadata);
56515666
return resp;
56525667
});
56535668
};
@@ -5695,6 +5710,18 @@ Instrumenter.prototype.fetchHeaders = function(inHeaders, headersConfig) {
56955710
return outHeaders;
56965711
}
56975712

5713+
Instrumenter.prototype.errorOnHttpStatus = function(metadata) {
5714+
var status = metadata.status_code;
5715+
5716+
if ((status >= 500 && this.autoInstrument.networkErrorOnHttp5xx) ||
5717+
(status >= 400 && this.autoInstrument.networkErrorOnHttp4xx) ||
5718+
(status === 0 && this.autoInstrument.networkErrorOnHttp0)) {
5719+
var error = new Error('HTTP request failed with Status ' + status);
5720+
error.stack = metadata.stack;
5721+
this.rollbar.error(error, { skipFrames: 1 });
5722+
}
5723+
}
5724+
56985725
Instrumenter.prototype.deinstrumentConsole = function() {
56995726
if (!('console' in this._window && this._window.console.log)) {
57005727
return;

dist/rollbar.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rollbar.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rollbar.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)