summaryrefslogtreecommitdiff
path: root/shared/logger/node_modules/@sentry/browser/esm/integrations/dedupe.js
diff options
context:
space:
mode:
Diffstat (limited to 'shared/logger/node_modules/@sentry/browser/esm/integrations/dedupe.js')
-rw-r--r--shared/logger/node_modules/@sentry/browser/esm/integrations/dedupe.js211
1 files changed, 211 insertions, 0 deletions
diff --git a/shared/logger/node_modules/@sentry/browser/esm/integrations/dedupe.js b/shared/logger/node_modules/@sentry/browser/esm/integrations/dedupe.js
new file mode 100644
index 0000000..591a552
--- /dev/null
+++ b/shared/logger/node_modules/@sentry/browser/esm/integrations/dedupe.js
@@ -0,0 +1,211 @@
+import { logger } from '@sentry/utils';
+
+/** Deduplication filter */
+class Dedupe {constructor() { Dedupe.prototype.__init.call(this); }
+ /**
+ * @inheritDoc
+ */
+ static __initStatic() {this.id = 'Dedupe';}
+
+ /**
+ * @inheritDoc
+ */
+ __init() {this.name = Dedupe.id;}
+
+ /**
+ * @inheritDoc
+ */
+
+ /**
+ * @inheritDoc
+ */
+ setupOnce(addGlobalEventProcessor, getCurrentHub) {
+ const eventProcessor = currentEvent => {
+ // We want to ignore any non-error type events, e.g. transactions or replays
+ // These should never be deduped, and also not be compared against as _previousEvent.
+ if (currentEvent.type) {
+ return currentEvent;
+ }
+
+ const self = getCurrentHub().getIntegration(Dedupe);
+ if (self) {
+ // Juuust in case something goes wrong
+ try {
+ if (_shouldDropEvent(currentEvent, self._previousEvent)) {
+ (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('Event dropped due to being a duplicate of previously captured event.');
+ return null;
+ }
+ } catch (_oO) {
+ return (self._previousEvent = currentEvent);
+ }
+
+ return (self._previousEvent = currentEvent);
+ }
+ return currentEvent;
+ };
+
+ eventProcessor.id = this.name;
+ addGlobalEventProcessor(eventProcessor);
+ }
+} Dedupe.__initStatic();
+
+/** JSDoc */
+function _shouldDropEvent(currentEvent, previousEvent) {
+ if (!previousEvent) {
+ return false;
+ }
+
+ if (_isSameMessageEvent(currentEvent, previousEvent)) {
+ return true;
+ }
+
+ if (_isSameExceptionEvent(currentEvent, previousEvent)) {
+ return true;
+ }
+
+ return false;
+}
+
+/** JSDoc */
+function _isSameMessageEvent(currentEvent, previousEvent) {
+ const currentMessage = currentEvent.message;
+ const previousMessage = previousEvent.message;
+
+ // If neither event has a message property, they were both exceptions, so bail out
+ if (!currentMessage && !previousMessage) {
+ return false;
+ }
+
+ // If only one event has a stacktrace, but not the other one, they are not the same
+ if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {
+ return false;
+ }
+
+ if (currentMessage !== previousMessage) {
+ return false;
+ }
+
+ if (!_isSameFingerprint(currentEvent, previousEvent)) {
+ return false;
+ }
+
+ if (!_isSameStacktrace(currentEvent, previousEvent)) {
+ return false;
+ }
+
+ return true;
+}
+
+/** JSDoc */
+function _isSameExceptionEvent(currentEvent, previousEvent) {
+ const previousException = _getExceptionFromEvent(previousEvent);
+ const currentException = _getExceptionFromEvent(currentEvent);
+
+ if (!previousException || !currentException) {
+ return false;
+ }
+
+ if (previousException.type !== currentException.type || previousException.value !== currentException.value) {
+ return false;
+ }
+
+ if (!_isSameFingerprint(currentEvent, previousEvent)) {
+ return false;
+ }
+
+ if (!_isSameStacktrace(currentEvent, previousEvent)) {
+ return false;
+ }
+
+ return true;
+}
+
+/** JSDoc */
+function _isSameStacktrace(currentEvent, previousEvent) {
+ let currentFrames = _getFramesFromEvent(currentEvent);
+ let previousFrames = _getFramesFromEvent(previousEvent);
+
+ // If neither event has a stacktrace, they are assumed to be the same
+ if (!currentFrames && !previousFrames) {
+ return true;
+ }
+
+ // If only one event has a stacktrace, but not the other one, they are not the same
+ if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {
+ return false;
+ }
+
+ currentFrames = currentFrames ;
+ previousFrames = previousFrames ;
+
+ // If number of frames differ, they are not the same
+ if (previousFrames.length !== currentFrames.length) {
+ return false;
+ }
+
+ // Otherwise, compare the two
+ for (let i = 0; i < previousFrames.length; i++) {
+ const frameA = previousFrames[i];
+ const frameB = currentFrames[i];
+
+ if (
+ frameA.filename !== frameB.filename ||
+ frameA.lineno !== frameB.lineno ||
+ frameA.colno !== frameB.colno ||
+ frameA.function !== frameB.function
+ ) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/** JSDoc */
+function _isSameFingerprint(currentEvent, previousEvent) {
+ let currentFingerprint = currentEvent.fingerprint;
+ let previousFingerprint = previousEvent.fingerprint;
+
+ // If neither event has a fingerprint, they are assumed to be the same
+ if (!currentFingerprint && !previousFingerprint) {
+ return true;
+ }
+
+ // If only one event has a fingerprint, but not the other one, they are not the same
+ if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {
+ return false;
+ }
+
+ currentFingerprint = currentFingerprint ;
+ previousFingerprint = previousFingerprint ;
+
+ // Otherwise, compare the two
+ try {
+ return !!(currentFingerprint.join('') === previousFingerprint.join(''));
+ } catch (_oO) {
+ return false;
+ }
+}
+
+/** JSDoc */
+function _getExceptionFromEvent(event) {
+ return event.exception && event.exception.values && event.exception.values[0];
+}
+
+/** JSDoc */
+function _getFramesFromEvent(event) {
+ const exception = event.exception;
+
+ if (exception) {
+ try {
+ // @ts-ignore Object could be undefined
+ return exception.values[0].stacktrace.frames;
+ } catch (_oO) {
+ return undefined;
+ }
+ }
+ return undefined;
+}
+
+export { Dedupe };
+//# sourceMappingURL=dedupe.js.map