@sentry/browser 7.0.0-alpha.1 → 7.0.0-beta.2

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 (240) hide show
  1. package/README.md +2 -3
  2. package/cjs/client.js +130 -83
  3. package/cjs/client.js.map +1 -1
  4. package/cjs/eventbuilder.js +225 -167
  5. package/cjs/eventbuilder.js.map +1 -1
  6. package/cjs/exports.js +55 -47
  7. package/cjs/exports.js.map +1 -1
  8. package/cjs/flags.js +7 -3
  9. package/cjs/flags.js.map +1 -1
  10. package/cjs/helpers.js +122 -130
  11. package/cjs/helpers.js.map +1 -1
  12. package/cjs/index.js +78 -13
  13. package/cjs/index.js.map +1 -1
  14. package/cjs/integrations/breadcrumbs.js +223 -192
  15. package/cjs/integrations/breadcrumbs.js.map +1 -1
  16. package/cjs/integrations/dedupe.js +183 -142
  17. package/cjs/integrations/dedupe.js.map +1 -1
  18. package/cjs/integrations/globalhandlers.js +211 -171
  19. package/cjs/integrations/globalhandlers.js.map +1 -1
  20. package/cjs/integrations/httpcontext.js +51 -0
  21. package/cjs/integrations/httpcontext.js.map +1 -0
  22. package/cjs/integrations/index.js +18 -14
  23. package/cjs/integrations/index.js.map +1 -1
  24. package/cjs/integrations/linkederrors.js +79 -51
  25. package/cjs/integrations/linkederrors.js.map +1 -1
  26. package/cjs/integrations/trycatch.js +245 -216
  27. package/cjs/integrations/trycatch.js.map +1 -1
  28. package/cjs/sdk.js +168 -114
  29. package/cjs/sdk.js.map +1 -1
  30. package/cjs/stack-parsers.js +134 -84
  31. package/cjs/stack-parsers.js.map +1 -1
  32. package/cjs/transports/fetch.js +34 -80
  33. package/cjs/transports/fetch.js.map +1 -1
  34. package/cjs/transports/index.js +10 -14
  35. package/cjs/transports/index.js.map +1 -1
  36. package/cjs/transports/utils.js +57 -53
  37. package/cjs/transports/utils.js.map +1 -1
  38. package/cjs/transports/xhr.js +53 -63
  39. package/cjs/transports/xhr.js.map +1 -1
  40. package/esm/client.js +128 -82
  41. package/esm/client.js.map +1 -1
  42. package/esm/eventbuilder.js +218 -160
  43. package/esm/eventbuilder.js.map +1 -1
  44. package/esm/exports.js +12 -7
  45. package/esm/exports.js.map +1 -1
  46. package/esm/flags.js +5 -2
  47. package/esm/flags.js.map +1 -1
  48. package/esm/helpers.js +120 -127
  49. package/esm/helpers.js.map +1 -1
  50. package/esm/index.js +28 -10
  51. package/esm/index.js.map +1 -1
  52. package/esm/integrations/breadcrumbs.js +219 -190
  53. package/esm/integrations/breadcrumbs.js.map +1 -1
  54. package/esm/integrations/dedupe.js +180 -140
  55. package/esm/integrations/dedupe.js.map +1 -1
  56. package/esm/integrations/globalhandlers.js +208 -169
  57. package/esm/integrations/globalhandlers.js.map +1 -1
  58. package/esm/integrations/httpcontext.js +49 -0
  59. package/esm/integrations/httpcontext.js.map +1 -0
  60. package/esm/integrations/index.js +7 -7
  61. package/esm/integrations/index.js.map +1 -1
  62. package/esm/integrations/linkederrors.js +76 -49
  63. package/esm/integrations/linkederrors.js.map +1 -1
  64. package/esm/integrations/trycatch.js +242 -214
  65. package/esm/integrations/trycatch.js.map +1 -1
  66. package/esm/sdk.js +164 -111
  67. package/esm/sdk.js.map +1 -1
  68. package/esm/stack-parsers.js +126 -83
  69. package/esm/stack-parsers.js.map +1 -1
  70. package/esm/transports/fetch.js +32 -79
  71. package/esm/transports/fetch.js.map +1 -1
  72. package/esm/transports/index.js +3 -7
  73. package/esm/transports/index.js.map +1 -1
  74. package/esm/transports/utils.js +56 -52
  75. package/esm/transports/utils.js.map +1 -1
  76. package/esm/transports/xhr.js +51 -62
  77. package/esm/transports/xhr.js.map +1 -1
  78. package/package.json +4 -4
  79. package/types/client.d.ts +24 -18
  80. package/types/client.d.ts.map +1 -1
  81. package/types/eventbuilder.d.ts +1 -1
  82. package/types/exports.d.ts +5 -5
  83. package/types/exports.d.ts.map +1 -1
  84. package/types/helpers.d.ts +0 -5
  85. package/types/helpers.d.ts.map +1 -1
  86. package/types/index.d.ts +2 -3
  87. package/types/index.d.ts.map +1 -1
  88. package/types/integrations/breadcrumbs.d.ts +6 -7
  89. package/types/integrations/breadcrumbs.d.ts.map +1 -1
  90. package/types/integrations/globalhandlers.d.ts.map +1 -1
  91. package/types/integrations/{useragent.d.ts → httpcontext.d.ts} +3 -3
  92. package/types/integrations/httpcontext.d.ts.map +1 -0
  93. package/types/integrations/index.d.ts +1 -1
  94. package/types/integrations/index.d.ts.map +1 -1
  95. package/types/integrations/linkederrors.d.ts.map +1 -1
  96. package/types/sdk.d.ts +4 -4
  97. package/types/sdk.d.ts.map +1 -1
  98. package/types/stack-parsers.d.ts +7 -6
  99. package/types/stack-parsers.d.ts.map +1 -1
  100. package/types/transports/fetch.d.ts +6 -15
  101. package/types/transports/fetch.d.ts.map +1 -1
  102. package/types/transports/index.d.ts +2 -6
  103. package/types/transports/index.d.ts.map +1 -1
  104. package/types/transports/types.d.ts +10 -0
  105. package/types/transports/types.d.ts.map +1 -0
  106. package/types/transports/utils.d.ts +1 -1
  107. package/types/transports/utils.d.ts.map +1 -1
  108. package/types/transports/xhr.d.ts +6 -10
  109. package/types/transports/xhr.d.ts.map +1 -1
  110. package/cjs/client.d.ts +0 -58
  111. package/cjs/client.d.ts.map +0 -1
  112. package/cjs/eventbuilder.d.ts +0 -37
  113. package/cjs/eventbuilder.d.ts.map +0 -1
  114. package/cjs/exports.d.ts +0 -10
  115. package/cjs/exports.d.ts.map +0 -1
  116. package/cjs/flags.d.ts +0 -3
  117. package/cjs/flags.d.ts.map +0 -1
  118. package/cjs/helpers.d.ts +0 -52
  119. package/cjs/helpers.d.ts.map +0 -1
  120. package/cjs/index.d.ts +0 -16
  121. package/cjs/index.d.ts.map +0 -1
  122. package/cjs/integrations/breadcrumbs.d.ts +0 -47
  123. package/cjs/integrations/breadcrumbs.d.ts.map +0 -1
  124. package/cjs/integrations/dedupe.d.ts +0 -21
  125. package/cjs/integrations/dedupe.d.ts.map +0 -1
  126. package/cjs/integrations/globalhandlers.d.ts +0 -30
  127. package/cjs/integrations/globalhandlers.d.ts.map +0 -1
  128. package/cjs/integrations/index.d.ts +0 -7
  129. package/cjs/integrations/index.d.ts.map +0 -1
  130. package/cjs/integrations/linkederrors.d.ts +0 -42
  131. package/cjs/integrations/linkederrors.d.ts.map +0 -1
  132. package/cjs/integrations/trycatch.d.ts +0 -33
  133. package/cjs/integrations/trycatch.d.ts.map +0 -1
  134. package/cjs/integrations/useragent.d.ts +0 -17
  135. package/cjs/integrations/useragent.d.ts.map +0 -1
  136. package/cjs/integrations/useragent.js +0 -42
  137. package/cjs/integrations/useragent.js.map +0 -1
  138. package/cjs/sdk.d.ts +0 -112
  139. package/cjs/sdk.d.ts.map +0 -1
  140. package/cjs/stack-parsers.d.ts +0 -8
  141. package/cjs/stack-parsers.d.ts.map +0 -1
  142. package/cjs/transports/base.d.ts +0 -65
  143. package/cjs/transports/base.d.ts.map +0 -1
  144. package/cjs/transports/base.js +0 -141
  145. package/cjs/transports/base.js.map +0 -1
  146. package/cjs/transports/fetch.d.ts +0 -17
  147. package/cjs/transports/fetch.d.ts.map +0 -1
  148. package/cjs/transports/index.d.ts +0 -7
  149. package/cjs/transports/index.d.ts.map +0 -1
  150. package/cjs/transports/new-fetch.d.ts +0 -10
  151. package/cjs/transports/new-fetch.d.ts.map +0 -1
  152. package/cjs/transports/new-fetch.js +0 -27
  153. package/cjs/transports/new-fetch.js.map +0 -1
  154. package/cjs/transports/new-xhr.d.ts +0 -11
  155. package/cjs/transports/new-xhr.d.ts.map +0 -1
  156. package/cjs/transports/new-xhr.js +0 -46
  157. package/cjs/transports/new-xhr.js.map +0 -1
  158. package/cjs/transports/setup.d.ts +0 -22
  159. package/cjs/transports/setup.d.ts.map +0 -1
  160. package/cjs/transports/setup.js +0 -44
  161. package/cjs/transports/setup.js.map +0 -1
  162. package/cjs/transports/utils.d.ts +0 -48
  163. package/cjs/transports/utils.d.ts.map +0 -1
  164. package/cjs/transports/xhr.d.ts +0 -11
  165. package/cjs/transports/xhr.d.ts.map +0 -1
  166. package/cjs/version.d.ts +0 -2
  167. package/cjs/version.d.ts.map +0 -1
  168. package/cjs/version.js +0 -4
  169. package/cjs/version.js.map +0 -1
  170. package/esm/client.d.ts +0 -58
  171. package/esm/client.d.ts.map +0 -1
  172. package/esm/eventbuilder.d.ts +0 -37
  173. package/esm/eventbuilder.d.ts.map +0 -1
  174. package/esm/exports.d.ts +0 -10
  175. package/esm/exports.d.ts.map +0 -1
  176. package/esm/flags.d.ts +0 -3
  177. package/esm/flags.d.ts.map +0 -1
  178. package/esm/helpers.d.ts +0 -52
  179. package/esm/helpers.d.ts.map +0 -1
  180. package/esm/index.d.ts +0 -16
  181. package/esm/index.d.ts.map +0 -1
  182. package/esm/integrations/breadcrumbs.d.ts +0 -47
  183. package/esm/integrations/breadcrumbs.d.ts.map +0 -1
  184. package/esm/integrations/dedupe.d.ts +0 -21
  185. package/esm/integrations/dedupe.d.ts.map +0 -1
  186. package/esm/integrations/globalhandlers.d.ts +0 -30
  187. package/esm/integrations/globalhandlers.d.ts.map +0 -1
  188. package/esm/integrations/index.d.ts +0 -7
  189. package/esm/integrations/index.d.ts.map +0 -1
  190. package/esm/integrations/linkederrors.d.ts +0 -42
  191. package/esm/integrations/linkederrors.d.ts.map +0 -1
  192. package/esm/integrations/trycatch.d.ts +0 -33
  193. package/esm/integrations/trycatch.d.ts.map +0 -1
  194. package/esm/integrations/useragent.d.ts +0 -17
  195. package/esm/integrations/useragent.d.ts.map +0 -1
  196. package/esm/integrations/useragent.js +0 -41
  197. package/esm/integrations/useragent.js.map +0 -1
  198. package/esm/sdk.d.ts +0 -112
  199. package/esm/sdk.d.ts.map +0 -1
  200. package/esm/stack-parsers.d.ts +0 -8
  201. package/esm/stack-parsers.d.ts.map +0 -1
  202. package/esm/transports/base.d.ts +0 -65
  203. package/esm/transports/base.d.ts.map +0 -1
  204. package/esm/transports/base.js +0 -140
  205. package/esm/transports/base.js.map +0 -1
  206. package/esm/transports/fetch.d.ts +0 -17
  207. package/esm/transports/fetch.d.ts.map +0 -1
  208. package/esm/transports/index.d.ts +0 -7
  209. package/esm/transports/index.d.ts.map +0 -1
  210. package/esm/transports/new-fetch.d.ts +0 -10
  211. package/esm/transports/new-fetch.d.ts.map +0 -1
  212. package/esm/transports/new-fetch.js +0 -25
  213. package/esm/transports/new-fetch.js.map +0 -1
  214. package/esm/transports/new-xhr.d.ts +0 -11
  215. package/esm/transports/new-xhr.d.ts.map +0 -1
  216. package/esm/transports/new-xhr.js +0 -44
  217. package/esm/transports/new-xhr.js.map +0 -1
  218. package/esm/transports/setup.d.ts +0 -22
  219. package/esm/transports/setup.d.ts.map +0 -1
  220. package/esm/transports/setup.js +0 -42
  221. package/esm/transports/setup.js.map +0 -1
  222. package/esm/transports/utils.d.ts +0 -48
  223. package/esm/transports/utils.d.ts.map +0 -1
  224. package/esm/transports/xhr.d.ts +0 -11
  225. package/esm/transports/xhr.d.ts.map +0 -1
  226. package/esm/version.d.ts +0 -2
  227. package/esm/version.d.ts.map +0 -1
  228. package/esm/version.js +0 -3
  229. package/esm/version.js.map +0 -1
  230. package/types/integrations/useragent.d.ts.map +0 -1
  231. package/types/transports/base.d.ts +0 -65
  232. package/types/transports/base.d.ts.map +0 -1
  233. package/types/transports/new-fetch.d.ts +0 -10
  234. package/types/transports/new-fetch.d.ts.map +0 -1
  235. package/types/transports/new-xhr.d.ts +0 -11
  236. package/types/transports/new-xhr.d.ts.map +0 -1
  237. package/types/transports/setup.d.ts +0 -22
  238. package/types/transports/setup.d.ts.map +0 -1
  239. package/types/version.d.ts +0 -2
  240. package/types/version.d.ts.map +0 -1
@@ -1,168 +1,209 @@
1
- Object.defineProperty(exports, "__esModule", { value: true });
2
- var utils_1 = require("@sentry/utils");
3
- var flags_1 = require("../flags");
1
+ Object.defineProperty(exports, '__esModule', { value: true });
2
+
3
+ var utils = require('@sentry/utils');
4
+ var flags = require('../flags.js');
5
+
4
6
  /** Deduplication filter */
5
- var Dedupe = /** @class */ (function () {
6
- function Dedupe() {
7
- /**
8
- * @inheritDoc
9
- */
10
- this.name = Dedupe.id;
11
- }
12
- /**
13
- * @inheritDoc
14
- */
15
- Dedupe.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {
16
- var eventProcessor = function (currentEvent) {
17
- var self = getCurrentHub().getIntegration(Dedupe);
18
- if (self) {
19
- // Juuust in case something goes wrong
20
- try {
21
- if (_shouldDropEvent(currentEvent, self._previousEvent)) {
22
- flags_1.IS_DEBUG_BUILD && utils_1.logger.warn('Event dropped due to being a duplicate of previously captured event.');
23
- return null;
24
- }
25
- }
26
- catch (_oO) {
27
- return (self._previousEvent = currentEvent);
28
- }
29
- return (self._previousEvent = currentEvent);
30
- }
31
- return currentEvent;
32
- };
33
- eventProcessor.id = this.name;
34
- addGlobalEventProcessor(eventProcessor);
7
+ class Dedupe {constructor() { Dedupe.prototype.__init.call(this); }
8
+ /**
9
+ * @inheritDoc
10
+ */
11
+ static __initStatic() {this.id = 'Dedupe';}
12
+
13
+ /**
14
+ * @inheritDoc
15
+ */
16
+ __init() {this.name = Dedupe.id;}
17
+
18
+ /**
19
+ * @inheritDoc
20
+ */
21
+
22
+
23
+ /**
24
+ * @inheritDoc
25
+ */
26
+ setupOnce(addGlobalEventProcessor, getCurrentHub) {
27
+ var eventProcessor = currentEvent => {
28
+ var self = getCurrentHub().getIntegration(Dedupe);
29
+ if (self) {
30
+ // Juuust in case something goes wrong
31
+ try {
32
+ if (_shouldDropEvent(currentEvent, self._previousEvent)) {
33
+ flags.IS_DEBUG_BUILD && utils.logger.warn('Event dropped due to being a duplicate of previously captured event.');
34
+ return null;
35
+ }
36
+ } catch (_oO) {
37
+ return (self._previousEvent = currentEvent);
38
+ }
39
+
40
+ return (self._previousEvent = currentEvent);
41
+ }
42
+ return currentEvent;
35
43
  };
36
- /**
37
- * @inheritDoc
38
- */
39
- Dedupe.id = 'Dedupe';
40
- return Dedupe;
41
- }());
42
- exports.Dedupe = Dedupe;
44
+
45
+ eventProcessor.id = this.name;
46
+ addGlobalEventProcessor(eventProcessor);
47
+ }
48
+ } Dedupe.__initStatic();
49
+
43
50
  /** JSDoc */
44
51
  function _shouldDropEvent(currentEvent, previousEvent) {
45
- if (!previousEvent) {
46
- return false;
47
- }
48
- if (_isSameMessageEvent(currentEvent, previousEvent)) {
49
- return true;
50
- }
51
- if (_isSameExceptionEvent(currentEvent, previousEvent)) {
52
- return true;
53
- }
52
+ if (!previousEvent) {
54
53
  return false;
54
+ }
55
+
56
+ if (_isSameMessageEvent(currentEvent, previousEvent)) {
57
+ return true;
58
+ }
59
+
60
+ if (_isSameExceptionEvent(currentEvent, previousEvent)) {
61
+ return true;
62
+ }
63
+
64
+ return false;
55
65
  }
66
+
56
67
  /** JSDoc */
57
68
  function _isSameMessageEvent(currentEvent, previousEvent) {
58
- var currentMessage = currentEvent.message;
59
- var previousMessage = previousEvent.message;
60
- // If neither event has a message property, they were both exceptions, so bail out
61
- if (!currentMessage && !previousMessage) {
62
- return false;
63
- }
64
- // If only one event has a stacktrace, but not the other one, they are not the same
65
- if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {
66
- return false;
67
- }
68
- if (currentMessage !== previousMessage) {
69
- return false;
70
- }
71
- if (!_isSameFingerprint(currentEvent, previousEvent)) {
72
- return false;
73
- }
74
- if (!_isSameStacktrace(currentEvent, previousEvent)) {
75
- return false;
76
- }
77
- return true;
69
+ var currentMessage = currentEvent.message;
70
+ var previousMessage = previousEvent.message;
71
+
72
+ // If neither event has a message property, they were both exceptions, so bail out
73
+ if (!currentMessage && !previousMessage) {
74
+ return false;
75
+ }
76
+
77
+ // If only one event has a stacktrace, but not the other one, they are not the same
78
+ if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {
79
+ return false;
80
+ }
81
+
82
+ if (currentMessage !== previousMessage) {
83
+ return false;
84
+ }
85
+
86
+ if (!_isSameFingerprint(currentEvent, previousEvent)) {
87
+ return false;
88
+ }
89
+
90
+ if (!_isSameStacktrace(currentEvent, previousEvent)) {
91
+ return false;
92
+ }
93
+
94
+ return true;
78
95
  }
96
+
79
97
  /** JSDoc */
80
98
  function _isSameExceptionEvent(currentEvent, previousEvent) {
81
- var previousException = _getExceptionFromEvent(previousEvent);
82
- var currentException = _getExceptionFromEvent(currentEvent);
83
- if (!previousException || !currentException) {
84
- return false;
85
- }
86
- if (previousException.type !== currentException.type || previousException.value !== currentException.value) {
87
- return false;
88
- }
89
- if (!_isSameFingerprint(currentEvent, previousEvent)) {
90
- return false;
91
- }
92
- if (!_isSameStacktrace(currentEvent, previousEvent)) {
93
- return false;
94
- }
95
- return true;
99
+ var previousException = _getExceptionFromEvent(previousEvent);
100
+ var currentException = _getExceptionFromEvent(currentEvent);
101
+
102
+ if (!previousException || !currentException) {
103
+ return false;
104
+ }
105
+
106
+ if (previousException.type !== currentException.type || previousException.value !== currentException.value) {
107
+ return false;
108
+ }
109
+
110
+ if (!_isSameFingerprint(currentEvent, previousEvent)) {
111
+ return false;
112
+ }
113
+
114
+ if (!_isSameStacktrace(currentEvent, previousEvent)) {
115
+ return false;
116
+ }
117
+
118
+ return true;
96
119
  }
120
+
97
121
  /** JSDoc */
98
122
  function _isSameStacktrace(currentEvent, previousEvent) {
99
- var currentFrames = _getFramesFromEvent(currentEvent);
100
- var previousFrames = _getFramesFromEvent(previousEvent);
101
- // If neither event has a stacktrace, they are assumed to be the same
102
- if (!currentFrames && !previousFrames) {
103
- return true;
104
- }
105
- // If only one event has a stacktrace, but not the other one, they are not the same
106
- if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {
107
- return false;
108
- }
109
- currentFrames = currentFrames;
110
- previousFrames = previousFrames;
111
- // If number of frames differ, they are not the same
112
- if (previousFrames.length !== currentFrames.length) {
113
- return false;
114
- }
115
- // Otherwise, compare the two
116
- for (var i = 0; i < previousFrames.length; i++) {
117
- var frameA = previousFrames[i];
118
- var frameB = currentFrames[i];
119
- if (frameA.filename !== frameB.filename ||
120
- frameA.lineno !== frameB.lineno ||
121
- frameA.colno !== frameB.colno ||
122
- frameA.function !== frameB.function) {
123
- return false;
124
- }
125
- }
123
+ let currentFrames = _getFramesFromEvent(currentEvent);
124
+ let previousFrames = _getFramesFromEvent(previousEvent);
125
+
126
+ // If neither event has a stacktrace, they are assumed to be the same
127
+ if (!currentFrames && !previousFrames) {
126
128
  return true;
129
+ }
130
+
131
+ // If only one event has a stacktrace, but not the other one, they are not the same
132
+ if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {
133
+ return false;
134
+ }
135
+
136
+ currentFrames = currentFrames ;
137
+ previousFrames = previousFrames ;
138
+
139
+ // If number of frames differ, they are not the same
140
+ if (previousFrames.length !== currentFrames.length) {
141
+ return false;
142
+ }
143
+
144
+ // Otherwise, compare the two
145
+ for (let i = 0; i < previousFrames.length; i++) {
146
+ var frameA = previousFrames[i];
147
+ var frameB = currentFrames[i];
148
+
149
+ if (
150
+ frameA.filename !== frameB.filename ||
151
+ frameA.lineno !== frameB.lineno ||
152
+ frameA.colno !== frameB.colno ||
153
+ frameA.function !== frameB.function
154
+ ) {
155
+ return false;
156
+ }
157
+ }
158
+
159
+ return true;
127
160
  }
161
+
128
162
  /** JSDoc */
129
163
  function _isSameFingerprint(currentEvent, previousEvent) {
130
- var currentFingerprint = currentEvent.fingerprint;
131
- var previousFingerprint = previousEvent.fingerprint;
132
- // If neither event has a fingerprint, they are assumed to be the same
133
- if (!currentFingerprint && !previousFingerprint) {
134
- return true;
135
- }
136
- // If only one event has a fingerprint, but not the other one, they are not the same
137
- if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {
138
- return false;
139
- }
140
- currentFingerprint = currentFingerprint;
141
- previousFingerprint = previousFingerprint;
142
- // Otherwise, compare the two
143
- try {
144
- return !!(currentFingerprint.join('') === previousFingerprint.join(''));
145
- }
146
- catch (_oO) {
147
- return false;
148
- }
164
+ let currentFingerprint = currentEvent.fingerprint;
165
+ let previousFingerprint = previousEvent.fingerprint;
166
+
167
+ // If neither event has a fingerprint, they are assumed to be the same
168
+ if (!currentFingerprint && !previousFingerprint) {
169
+ return true;
170
+ }
171
+
172
+ // If only one event has a fingerprint, but not the other one, they are not the same
173
+ if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {
174
+ return false;
175
+ }
176
+
177
+ currentFingerprint = currentFingerprint ;
178
+ previousFingerprint = previousFingerprint ;
179
+
180
+ // Otherwise, compare the two
181
+ try {
182
+ return !!(currentFingerprint.join('') === previousFingerprint.join(''));
183
+ } catch (_oO) {
184
+ return false;
185
+ }
149
186
  }
187
+
150
188
  /** JSDoc */
151
189
  function _getExceptionFromEvent(event) {
152
- return event.exception && event.exception.values && event.exception.values[0];
190
+ return event.exception && event.exception.values && event.exception.values[0];
153
191
  }
192
+
154
193
  /** JSDoc */
155
194
  function _getFramesFromEvent(event) {
156
- var exception = event.exception;
157
- if (exception) {
158
- try {
159
- // @ts-ignore Object could be undefined
160
- return exception.values[0].stacktrace.frames;
161
- }
162
- catch (_oO) {
163
- return undefined;
164
- }
195
+ var exception = event.exception;
196
+
197
+ if (exception) {
198
+ try {
199
+ // @ts-ignore Object could be undefined
200
+ return exception.values[0].stacktrace.frames;
201
+ } catch (_oO) {
202
+ return undefined;
165
203
  }
166
- return undefined;
204
+ }
205
+ return undefined;
167
206
  }
168
- //# sourceMappingURL=dedupe.js.map
207
+
208
+ exports.Dedupe = Dedupe;
209
+ //# sourceMappingURL=dedupe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dedupe.js","sourceRoot":"","sources":["../../../../src/integrations/dedupe.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event, EventProcessor, Exception, Hub, Integration, StackFrame } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\nimport { IS_DEBUG_BUILD } from '../flags';\n\n/** Deduplication filter */\nexport class Dedupe implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'Dedupe';\n\n /**\n * @inheritDoc\n */\n public name: string = Dedupe.id;\n\n /**\n * @inheritDoc\n */\n private _previousEvent?: Event;\n\n /**\n * @inheritDoc\n */\n public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {\n const eventProcessor: EventProcessor = currentEvent => {\n const self = getCurrentHub().getIntegration(Dedupe);\n if (self) {\n // Juuust in case something goes wrong\n try {\n if (_shouldDropEvent(currentEvent, self._previousEvent)) {\n IS_DEBUG_BUILD && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n return null;\n }\n } catch (_oO) {\n return (self._previousEvent = currentEvent);\n }\n\n return (self._previousEvent = currentEvent);\n }\n return currentEvent;\n };\n\n eventProcessor.id = this.name;\n addGlobalEventProcessor(eventProcessor);\n }\n}\n\n/** JSDoc */\nfunction _shouldDropEvent(currentEvent: Event, previousEvent?: Event): boolean {\n if (!previousEvent) {\n return false;\n }\n\n if (_isSameMessageEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n return false;\n}\n\n/** JSDoc */\nfunction _isSameMessageEvent(currentEvent: Event, previousEvent: Event): boolean {\n const currentMessage = currentEvent.message;\n const previousMessage = previousEvent.message;\n\n // If neither event has a message property, they were both exceptions, so bail out\n if (!currentMessage && !previousMessage) {\n return false;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n return false;\n }\n\n if (currentMessage !== previousMessage) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameExceptionEvent(currentEvent: Event, previousEvent: Event): boolean {\n const previousException = _getExceptionFromEvent(previousEvent);\n const currentException = _getExceptionFromEvent(currentEvent);\n\n if (!previousException || !currentException) {\n return false;\n }\n\n if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameStacktrace(currentEvent: Event, previousEvent: Event): boolean {\n let currentFrames = _getFramesFromEvent(currentEvent);\n let previousFrames = _getFramesFromEvent(previousEvent);\n\n // If neither event has a stacktrace, they are assumed to be the same\n if (!currentFrames && !previousFrames) {\n return true;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n return false;\n }\n\n currentFrames = currentFrames as StackFrame[];\n previousFrames = previousFrames as StackFrame[];\n\n // If number of frames differ, they are not the same\n if (previousFrames.length !== currentFrames.length) {\n return false;\n }\n\n // Otherwise, compare the two\n for (let i = 0; i < previousFrames.length; i++) {\n const frameA = previousFrames[i];\n const frameB = currentFrames[i];\n\n if (\n frameA.filename !== frameB.filename ||\n frameA.lineno !== frameB.lineno ||\n frameA.colno !== frameB.colno ||\n frameA.function !== frameB.function\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameFingerprint(currentEvent: Event, previousEvent: Event): boolean {\n let currentFingerprint = currentEvent.fingerprint;\n let previousFingerprint = previousEvent.fingerprint;\n\n // If neither event has a fingerprint, they are assumed to be the same\n if (!currentFingerprint && !previousFingerprint) {\n return true;\n }\n\n // If only one event has a fingerprint, but not the other one, they are not the same\n if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n return false;\n }\n\n currentFingerprint = currentFingerprint as string[];\n previousFingerprint = previousFingerprint as string[];\n\n // Otherwise, compare the two\n try {\n return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n } catch (_oO) {\n return false;\n }\n}\n\n/** JSDoc */\nfunction _getExceptionFromEvent(event: Event): Exception | undefined {\n return event.exception && event.exception.values && event.exception.values[0];\n}\n\n/** JSDoc */\nfunction _getFramesFromEvent(event: Event): StackFrame[] | undefined {\n const exception = event.exception;\n\n if (exception) {\n try {\n // @ts-ignore Object could be undefined\n return exception.values[0].stacktrace.frames;\n } catch (_oO) {\n return undefined;\n }\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"dedupe.js","sources":["../../../../src/integrations/dedupe.ts"],"sourcesContent":["import { Event, EventProcessor, Exception, Hub, Integration, StackFrame } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\nimport { IS_DEBUG_BUILD } from '../flags';\n\n/** Deduplication filter */\nexport class Dedupe implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'Dedupe';\n\n /**\n * @inheritDoc\n */\n public name: string = Dedupe.id;\n\n /**\n * @inheritDoc\n */\n private _previousEvent?: Event;\n\n /**\n * @inheritDoc\n */\n public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {\n const eventProcessor: EventProcessor = currentEvent => {\n const self = getCurrentHub().getIntegration(Dedupe);\n if (self) {\n // Juuust in case something goes wrong\n try {\n if (_shouldDropEvent(currentEvent, self._previousEvent)) {\n IS_DEBUG_BUILD && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n return null;\n }\n } catch (_oO) {\n return (self._previousEvent = currentEvent);\n }\n\n return (self._previousEvent = currentEvent);\n }\n return currentEvent;\n };\n\n eventProcessor.id = this.name;\n addGlobalEventProcessor(eventProcessor);\n }\n}\n\n/** JSDoc */\nfunction _shouldDropEvent(currentEvent: Event, previousEvent?: Event): boolean {\n if (!previousEvent) {\n return false;\n }\n\n if (_isSameMessageEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n return false;\n}\n\n/** JSDoc */\nfunction _isSameMessageEvent(currentEvent: Event, previousEvent: Event): boolean {\n const currentMessage = currentEvent.message;\n const previousMessage = previousEvent.message;\n\n // If neither event has a message property, they were both exceptions, so bail out\n if (!currentMessage && !previousMessage) {\n return false;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n return false;\n }\n\n if (currentMessage !== previousMessage) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameExceptionEvent(currentEvent: Event, previousEvent: Event): boolean {\n const previousException = _getExceptionFromEvent(previousEvent);\n const currentException = _getExceptionFromEvent(currentEvent);\n\n if (!previousException || !currentException) {\n return false;\n }\n\n if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameStacktrace(currentEvent: Event, previousEvent: Event): boolean {\n let currentFrames = _getFramesFromEvent(currentEvent);\n let previousFrames = _getFramesFromEvent(previousEvent);\n\n // If neither event has a stacktrace, they are assumed to be the same\n if (!currentFrames && !previousFrames) {\n return true;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n return false;\n }\n\n currentFrames = currentFrames as StackFrame[];\n previousFrames = previousFrames as StackFrame[];\n\n // If number of frames differ, they are not the same\n if (previousFrames.length !== currentFrames.length) {\n return false;\n }\n\n // Otherwise, compare the two\n for (let i = 0; i < previousFrames.length; i++) {\n const frameA = previousFrames[i];\n const frameB = currentFrames[i];\n\n if (\n frameA.filename !== frameB.filename ||\n frameA.lineno !== frameB.lineno ||\n frameA.colno !== frameB.colno ||\n frameA.function !== frameB.function\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameFingerprint(currentEvent: Event, previousEvent: Event): boolean {\n let currentFingerprint = currentEvent.fingerprint;\n let previousFingerprint = previousEvent.fingerprint;\n\n // If neither event has a fingerprint, they are assumed to be the same\n if (!currentFingerprint && !previousFingerprint) {\n return true;\n }\n\n // If only one event has a fingerprint, but not the other one, they are not the same\n if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n return false;\n }\n\n currentFingerprint = currentFingerprint as string[];\n previousFingerprint = previousFingerprint as string[];\n\n // Otherwise, compare the two\n try {\n return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n } catch (_oO) {\n return false;\n }\n}\n\n/** JSDoc */\nfunction _getExceptionFromEvent(event: Event): Exception | undefined {\n return event.exception && event.exception.values && event.exception.values[0];\n}\n\n/** JSDoc */\nfunction _getFramesFromEvent(event: Event): StackFrame[] | undefined {\n const exception = event.exception;\n\n if (exception) {\n try {\n // @ts-ignore Object could be undefined\n return exception.values[0].stacktrace.frames;\n } catch (_oO) {\n return undefined;\n }\n }\n return undefined;\n}\n"],"names":[],"mappings":";;;;;AAKA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;"}