@sentry/browser 6.7.2 → 6.8.0

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.
Files changed (63) hide show
  1. package/build/bundle.es6.js +197 -24
  2. package/build/bundle.es6.js.map +1 -1
  3. package/build/bundle.es6.min.js +2 -2
  4. package/build/bundle.es6.min.js.map +1 -1
  5. package/build/bundle.js +235 -57
  6. package/build/bundle.js.map +1 -1
  7. package/build/bundle.min.js +2 -2
  8. package/build/bundle.min.js.map +1 -1
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/integrations/breadcrumbs.d.ts +1 -1
  12. package/dist/integrations/breadcrumbs.d.ts.map +1 -1
  13. package/dist/integrations/breadcrumbs.js +6 -3
  14. package/dist/integrations/breadcrumbs.js.map +1 -1
  15. package/dist/integrations/dedupe.d.ts +35 -0
  16. package/dist/integrations/dedupe.d.ts.map +1 -0
  17. package/dist/integrations/dedupe.js +166 -0
  18. package/dist/integrations/dedupe.js.map +1 -0
  19. package/dist/integrations/globalhandlers.d.ts.map +1 -1
  20. package/dist/integrations/globalhandlers.js +6 -8
  21. package/dist/integrations/globalhandlers.js.map +1 -1
  22. package/dist/integrations/index.d.ts +1 -0
  23. package/dist/integrations/index.d.ts.map +1 -1
  24. package/dist/integrations/index.js +2 -0
  25. package/dist/integrations/index.js.map +1 -1
  26. package/dist/sdk.d.ts +2 -2
  27. package/dist/sdk.d.ts.map +1 -1
  28. package/dist/sdk.js +1 -0
  29. package/dist/sdk.js.map +1 -1
  30. package/dist/transports/fetch.d.ts.map +1 -1
  31. package/dist/transports/fetch.js +19 -17
  32. package/dist/transports/fetch.js.map +1 -1
  33. package/dist/transports/xhr.d.ts.map +1 -1
  34. package/dist/transports/xhr.js +20 -18
  35. package/dist/transports/xhr.js.map +1 -1
  36. package/esm/index.d.ts +1 -0
  37. package/esm/index.d.ts.map +1 -1
  38. package/esm/integrations/breadcrumbs.d.ts +1 -1
  39. package/esm/integrations/breadcrumbs.d.ts.map +1 -1
  40. package/esm/integrations/breadcrumbs.js +6 -3
  41. package/esm/integrations/breadcrumbs.js.map +1 -1
  42. package/esm/integrations/dedupe.d.ts +35 -0
  43. package/esm/integrations/dedupe.d.ts.map +1 -0
  44. package/esm/integrations/dedupe.js +165 -0
  45. package/esm/integrations/dedupe.js.map +1 -0
  46. package/esm/integrations/globalhandlers.d.ts.map +1 -1
  47. package/esm/integrations/globalhandlers.js +6 -8
  48. package/esm/integrations/globalhandlers.js.map +1 -1
  49. package/esm/integrations/index.d.ts +1 -0
  50. package/esm/integrations/index.d.ts.map +1 -1
  51. package/esm/integrations/index.js +1 -0
  52. package/esm/integrations/index.js.map +1 -1
  53. package/esm/sdk.d.ts +2 -2
  54. package/esm/sdk.d.ts.map +1 -1
  55. package/esm/sdk.js +2 -1
  56. package/esm/sdk.js.map +1 -1
  57. package/esm/transports/fetch.d.ts.map +1 -1
  58. package/esm/transports/fetch.js +19 -17
  59. package/esm/transports/fetch.js.map +1 -1
  60. package/esm/transports/xhr.d.ts.map +1 -1
  61. package/esm/transports/xhr.js +20 -18
  62. package/esm/transports/xhr.js.map +1 -1
  63. package/package.json +5 -5
package/build/bundle.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @sentry/browser 6.7.2 (35498a6) | https://github.com/getsentry/sentry-javascript */
1
+ /*! @sentry/browser 6.8.0 (e93d96f) | https://github.com/getsentry/sentry-javascript */
2
2
  var Sentry = (function (exports) {
3
3
  /*! *****************************************************************************
4
4
  Copyright (c) Microsoft Corporation. All rights reserved.
@@ -370,7 +370,7 @@ var Sentry = (function (exports) {
370
370
  * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]
371
371
  * @returns generated DOM path
372
372
  */
373
- function htmlTreeAsString(elem, keyAttr) {
373
+ function htmlTreeAsString(elem, keyAttrs) {
374
374
  // try/catch both:
375
375
  // - accessing event.target (see getsentry/raven-js#838, #768)
376
376
  // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly
@@ -387,7 +387,7 @@ var Sentry = (function (exports) {
387
387
  var nextStr = void 0;
388
388
  // eslint-disable-next-line no-plusplus
389
389
  while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {
390
- nextStr = _htmlElementAsString(currentElem, keyAttr);
390
+ nextStr = _htmlElementAsString(currentElem, keyAttrs);
391
391
  // bail out if
392
392
  // - nextStr is the 'html' element
393
393
  // - the length of the string that would be created exceeds MAX_OUTPUT_LEN
@@ -410,7 +410,8 @@ var Sentry = (function (exports) {
410
410
  * e.g. [HTMLElement] => input#foo.btn[name=baz]
411
411
  * @returns generated DOM path
412
412
  */
413
- function _htmlElementAsString(el, keyAttr) {
413
+ function _htmlElementAsString(el, keyAttrs) {
414
+ var _a, _b;
414
415
  var elem = el;
415
416
  var out = [];
416
417
  var className;
@@ -422,9 +423,13 @@ var Sentry = (function (exports) {
422
423
  return '';
423
424
  }
424
425
  out.push(elem.tagName.toLowerCase());
425
- var keyAttrValue = keyAttr ? elem.getAttribute(keyAttr) : null;
426
- if (keyAttrValue) {
427
- out.push("[" + keyAttr + "=\"" + keyAttrValue + "\"]");
426
+ // Pairs of attribute keys defined in `serializeAttribute` and their values on element.
427
+ var keyAttrPairs = ((_a = keyAttrs) === null || _a === void 0 ? void 0 : _a.length) ? keyAttrs.filter(function (keyAttr) { return elem.getAttribute(keyAttr); }).map(function (keyAttr) { return [keyAttr, elem.getAttribute(keyAttr)]; })
428
+ : null;
429
+ if ((_b = keyAttrPairs) === null || _b === void 0 ? void 0 : _b.length) {
430
+ keyAttrPairs.forEach(function (keyAttrPair) {
431
+ out.push("[" + keyAttrPair[0] + "=\"" + keyAttrPair[1] + "\"]");
432
+ });
428
433
  }
429
434
  else {
430
435
  if (elem.id) {
@@ -2156,14 +2161,16 @@ var Sentry = (function (exports) {
2156
2161
  /**
2157
2162
  * Add a promise to the queue.
2158
2163
  *
2159
- * @param task Can be any PromiseLike<T>
2164
+ * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task: PromiseLike<T>`,
2165
+ * however, Promises were instantly created on the call-site, making them fall through the buffer limit.
2160
2166
  * @returns The original promise.
2161
2167
  */
2162
- PromiseBuffer.prototype.add = function (task) {
2168
+ PromiseBuffer.prototype.add = function (taskProducer) {
2163
2169
  var _this = this;
2164
2170
  if (!this.isReady()) {
2165
2171
  return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));
2166
2172
  }
2173
+ var task = taskProducer();
2167
2174
  if (this._buffer.indexOf(task) === -1) {
2168
2175
  this._buffer.push(task);
2169
2176
  }
@@ -4414,7 +4421,7 @@ var Sentry = (function (exports) {
4414
4421
  hub.bindClient(client);
4415
4422
  }
4416
4423
 
4417
- var SDK_VERSION = '6.7.2';
4424
+ var SDK_VERSION = '6.8.0';
4418
4425
 
4419
4426
  var originalFunctionToString;
4420
4427
  /** Patch toString calls to return proper name for wrapped functions */
@@ -5278,23 +5285,25 @@ var Sentry = (function (exports) {
5278
5285
  if (this.options.headers !== undefined) {
5279
5286
  options.headers = this.options.headers;
5280
5287
  }
5281
- return this._buffer.add(new SyncPromise(function (resolve, reject) {
5282
- void _this._fetch(sentryRequest.url, options)
5283
- .then(function (response) {
5284
- var headers = {
5285
- 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
5286
- 'retry-after': response.headers.get('Retry-After'),
5287
- };
5288
- _this._handleResponse({
5289
- requestType: sentryRequest.type,
5290
- response: response,
5291
- headers: headers,
5292
- resolve: resolve,
5293
- reject: reject,
5294
- });
5295
- })
5296
- .catch(reject);
5297
- }));
5288
+ return this._buffer.add(function () {
5289
+ return new SyncPromise(function (resolve, reject) {
5290
+ void _this._fetch(sentryRequest.url, options)
5291
+ .then(function (response) {
5292
+ var headers = {
5293
+ 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
5294
+ 'retry-after': response.headers.get('Retry-After'),
5295
+ };
5296
+ _this._handleResponse({
5297
+ requestType: sentryRequest.type,
5298
+ response: response,
5299
+ headers: headers,
5300
+ resolve: resolve,
5301
+ reject: reject,
5302
+ });
5303
+ })
5304
+ .catch(reject);
5305
+ });
5306
+ });
5298
5307
  };
5299
5308
  return FetchTransport;
5300
5309
  }(BaseTransport));
@@ -5331,25 +5340,27 @@ var Sentry = (function (exports) {
5331
5340
  status: 429,
5332
5341
  });
5333
5342
  }
5334
- return this._buffer.add(new SyncPromise(function (resolve, reject) {
5335
- var request = new XMLHttpRequest();
5336
- request.onreadystatechange = function () {
5337
- if (request.readyState === 4) {
5338
- var headers = {
5339
- 'x-sentry-rate-limits': request.getResponseHeader('X-Sentry-Rate-Limits'),
5340
- 'retry-after': request.getResponseHeader('Retry-After'),
5341
- };
5342
- _this._handleResponse({ requestType: sentryRequest.type, response: request, headers: headers, resolve: resolve, reject: reject });
5343
- }
5344
- };
5345
- request.open('POST', sentryRequest.url);
5346
- for (var header in _this.options.headers) {
5347
- if (_this.options.headers.hasOwnProperty(header)) {
5348
- request.setRequestHeader(header, _this.options.headers[header]);
5343
+ return this._buffer.add(function () {
5344
+ return new SyncPromise(function (resolve, reject) {
5345
+ var request = new XMLHttpRequest();
5346
+ request.onreadystatechange = function () {
5347
+ if (request.readyState === 4) {
5348
+ var headers = {
5349
+ 'x-sentry-rate-limits': request.getResponseHeader('X-Sentry-Rate-Limits'),
5350
+ 'retry-after': request.getResponseHeader('Retry-After'),
5351
+ };
5352
+ _this._handleResponse({ requestType: sentryRequest.type, response: request, headers: headers, resolve: resolve, reject: reject });
5353
+ }
5354
+ };
5355
+ request.open('POST', sentryRequest.url);
5356
+ for (var header in _this.options.headers) {
5357
+ if (_this.options.headers.hasOwnProperty(header)) {
5358
+ request.setRequestHeader(header, _this.options.headers[header]);
5359
+ }
5349
5360
  }
5350
- }
5351
- request.send(sentryRequest.body);
5352
- }));
5361
+ request.send(sentryRequest.body);
5362
+ });
5363
+ });
5353
5364
  };
5354
5365
  return XHRTransport;
5355
5366
  }(BaseTransport));
@@ -5605,9 +5616,9 @@ var Sentry = (function (exports) {
5605
5616
  return;
5606
5617
  }
5607
5618
  var client = currentHub.getClient();
5608
- var event = isPrimitive(error)
5619
+ var event = error === undefined && isString(data.msg)
5609
5620
  ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)
5610
- : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, {
5621
+ : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error || data.msg, undefined, {
5611
5622
  attachStacktrace: client && client.getOptions().attachStacktrace,
5612
5623
  rejection: false,
5613
5624
  }), data.url, data.line, data.column);
@@ -5688,12 +5699,10 @@ var Sentry = (function (exports) {
5688
5699
  // If 'message' is ErrorEvent, get real message from inside
5689
5700
  var message = isErrorEvent(msg) ? msg.message : msg;
5690
5701
  var name;
5691
- if (isString(message)) {
5692
- var groups = message.match(ERROR_TYPES_RE);
5693
- if (groups) {
5694
- name = groups[1];
5695
- message = groups[2];
5696
- }
5702
+ var groups = message.match(ERROR_TYPES_RE);
5703
+ if (groups) {
5704
+ name = groups[1];
5705
+ message = groups[2];
5697
5706
  }
5698
5707
  var event = {
5699
5708
  exception: {
@@ -6118,12 +6127,15 @@ var Sentry = (function (exports) {
6118
6127
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
6119
6128
  Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {
6120
6129
  var target;
6121
- var keyAttr = typeof this._options.dom === 'object' ? this._options.dom.serializeAttribute : undefined;
6130
+ var keyAttrs = typeof this._options.dom === 'object' ? this._options.dom.serializeAttribute : undefined;
6131
+ if (typeof keyAttrs === 'string') {
6132
+ keyAttrs = [keyAttrs];
6133
+ }
6122
6134
  // Accessing event.target can throw (see getsentry/raven-js#838, #768)
6123
6135
  try {
6124
6136
  target = handlerData.event.target
6125
- ? htmlTreeAsString(handlerData.event.target, keyAttr)
6126
- : htmlTreeAsString(handlerData.event, keyAttr);
6137
+ ? htmlTreeAsString(handlerData.event.target, keyAttrs)
6138
+ : htmlTreeAsString(handlerData.event, keyAttrs);
6127
6139
  }
6128
6140
  catch (e) {
6129
6141
  target = '<unknown>';
@@ -6335,6 +6347,170 @@ var Sentry = (function (exports) {
6335
6347
  return UserAgent;
6336
6348
  }());
6337
6349
 
6350
+ /** Deduplication filter */
6351
+ var Dedupe = /** @class */ (function () {
6352
+ function Dedupe() {
6353
+ /**
6354
+ * @inheritDoc
6355
+ */
6356
+ this.name = Dedupe.id;
6357
+ }
6358
+ /**
6359
+ * @inheritDoc
6360
+ */
6361
+ Dedupe.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {
6362
+ addGlobalEventProcessor(function (currentEvent) {
6363
+ var self = getCurrentHub().getIntegration(Dedupe);
6364
+ if (self) {
6365
+ // Juuust in case something goes wrong
6366
+ try {
6367
+ if (self._shouldDropEvent(currentEvent, self._previousEvent)) {
6368
+ return null;
6369
+ }
6370
+ }
6371
+ catch (_oO) {
6372
+ return (self._previousEvent = currentEvent);
6373
+ }
6374
+ return (self._previousEvent = currentEvent);
6375
+ }
6376
+ return currentEvent;
6377
+ });
6378
+ };
6379
+ /** JSDoc */
6380
+ Dedupe.prototype._shouldDropEvent = function (currentEvent, previousEvent) {
6381
+ if (!previousEvent) {
6382
+ return false;
6383
+ }
6384
+ if (this._isSameMessageEvent(currentEvent, previousEvent)) {
6385
+ return true;
6386
+ }
6387
+ if (this._isSameExceptionEvent(currentEvent, previousEvent)) {
6388
+ return true;
6389
+ }
6390
+ return false;
6391
+ };
6392
+ /** JSDoc */
6393
+ Dedupe.prototype._isSameMessageEvent = function (currentEvent, previousEvent) {
6394
+ var currentMessage = currentEvent.message;
6395
+ var previousMessage = previousEvent.message;
6396
+ // If neither event has a message property, they were both exceptions, so bail out
6397
+ if (!currentMessage && !previousMessage) {
6398
+ return false;
6399
+ }
6400
+ // If only one event has a stacktrace, but not the other one, they are not the same
6401
+ if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {
6402
+ return false;
6403
+ }
6404
+ if (currentMessage !== previousMessage) {
6405
+ return false;
6406
+ }
6407
+ if (!this._isSameFingerprint(currentEvent, previousEvent)) {
6408
+ return false;
6409
+ }
6410
+ if (!this._isSameStacktrace(currentEvent, previousEvent)) {
6411
+ return false;
6412
+ }
6413
+ return true;
6414
+ };
6415
+ /** JSDoc */
6416
+ Dedupe.prototype._getFramesFromEvent = function (event) {
6417
+ var exception = event.exception;
6418
+ if (exception) {
6419
+ try {
6420
+ // @ts-ignore Object could be undefined
6421
+ return exception.values[0].stacktrace.frames;
6422
+ }
6423
+ catch (_oO) {
6424
+ return undefined;
6425
+ }
6426
+ }
6427
+ else if (event.stacktrace) {
6428
+ return event.stacktrace.frames;
6429
+ }
6430
+ return undefined;
6431
+ };
6432
+ /** JSDoc */
6433
+ Dedupe.prototype._isSameStacktrace = function (currentEvent, previousEvent) {
6434
+ var currentFrames = this._getFramesFromEvent(currentEvent);
6435
+ var previousFrames = this._getFramesFromEvent(previousEvent);
6436
+ // If neither event has a stacktrace, they are assumed to be the same
6437
+ if (!currentFrames && !previousFrames) {
6438
+ return true;
6439
+ }
6440
+ // If only one event has a stacktrace, but not the other one, they are not the same
6441
+ if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {
6442
+ return false;
6443
+ }
6444
+ currentFrames = currentFrames;
6445
+ previousFrames = previousFrames;
6446
+ // If number of frames differ, they are not the same
6447
+ if (previousFrames.length !== currentFrames.length) {
6448
+ return false;
6449
+ }
6450
+ // Otherwise, compare the two
6451
+ for (var i = 0; i < previousFrames.length; i++) {
6452
+ var frameA = previousFrames[i];
6453
+ var frameB = currentFrames[i];
6454
+ if (frameA.filename !== frameB.filename ||
6455
+ frameA.lineno !== frameB.lineno ||
6456
+ frameA.colno !== frameB.colno ||
6457
+ frameA.function !== frameB.function) {
6458
+ return false;
6459
+ }
6460
+ }
6461
+ return true;
6462
+ };
6463
+ /** JSDoc */
6464
+ Dedupe.prototype._getExceptionFromEvent = function (event) {
6465
+ return event.exception && event.exception.values && event.exception.values[0];
6466
+ };
6467
+ /** JSDoc */
6468
+ Dedupe.prototype._isSameExceptionEvent = function (currentEvent, previousEvent) {
6469
+ var previousException = this._getExceptionFromEvent(previousEvent);
6470
+ var currentException = this._getExceptionFromEvent(currentEvent);
6471
+ if (!previousException || !currentException) {
6472
+ return false;
6473
+ }
6474
+ if (previousException.type !== currentException.type || previousException.value !== currentException.value) {
6475
+ return false;
6476
+ }
6477
+ if (!this._isSameFingerprint(currentEvent, previousEvent)) {
6478
+ return false;
6479
+ }
6480
+ if (!this._isSameStacktrace(currentEvent, previousEvent)) {
6481
+ return false;
6482
+ }
6483
+ return true;
6484
+ };
6485
+ /** JSDoc */
6486
+ Dedupe.prototype._isSameFingerprint = function (currentEvent, previousEvent) {
6487
+ var currentFingerprint = currentEvent.fingerprint;
6488
+ var previousFingerprint = previousEvent.fingerprint;
6489
+ // If neither event has a fingerprint, they are assumed to be the same
6490
+ if (!currentFingerprint && !previousFingerprint) {
6491
+ return true;
6492
+ }
6493
+ // If only one event has a fingerprint, but not the other one, they are not the same
6494
+ if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {
6495
+ return false;
6496
+ }
6497
+ currentFingerprint = currentFingerprint;
6498
+ previousFingerprint = previousFingerprint;
6499
+ // Otherwise, compare the two
6500
+ try {
6501
+ return !!(currentFingerprint.join('') === previousFingerprint.join(''));
6502
+ }
6503
+ catch (_oO) {
6504
+ return false;
6505
+ }
6506
+ };
6507
+ /**
6508
+ * @inheritDoc
6509
+ */
6510
+ Dedupe.id = 'Dedupe';
6511
+ return Dedupe;
6512
+ }());
6513
+
6338
6514
 
6339
6515
 
6340
6516
  var BrowserIntegrations = /*#__PURE__*/Object.freeze({
@@ -6343,7 +6519,8 @@ var Sentry = (function (exports) {
6343
6519
  TryCatch: TryCatch,
6344
6520
  Breadcrumbs: Breadcrumbs,
6345
6521
  LinkedErrors: LinkedErrors,
6346
- UserAgent: UserAgent
6522
+ UserAgent: UserAgent,
6523
+ Dedupe: Dedupe
6347
6524
  });
6348
6525
 
6349
6526
  /**
@@ -6421,6 +6598,7 @@ var Sentry = (function (exports) {
6421
6598
  new Breadcrumbs(),
6422
6599
  new GlobalHandlers(),
6423
6600
  new LinkedErrors(),
6601
+ new Dedupe(),
6424
6602
  new UserAgent(),
6425
6603
  ];
6426
6604
  /**