packages/raven-js/src/raven.js
function(current) {
    var last = this._lastData;

    if (
      !last ||
      current.message !== last.message || // defined for captureMessage
      current.transaction !== last.transaction // defined for captureException/onerror
    )
      return false;

    // Stacktrace interface (i.e. from captureMessage)
    if (current.stacktrace || last.stacktrace) {
      return isSameStacktrace(current.stacktrace, last.stacktrace);
    } else if (current.exception || last.exception) {
      // Exception interface (i.e. from captureException/onerror)
      return isSameException(current.exception, last.exception);
    } else if (current.fingerprint || last.fingerprint) {
      return Boolean(current.fingerprint && last.fingerprint) &&
        JSON.stringify(current.fingerprint) === JSON.stringify(last.fingerprint)
    }

    return true;
  }
function(current) {
    var last = this._lastData;

    if (
      !last ||
      current.message !== last.message || // defined for captureMessage
      current.transaction !== last.transaction // defined for captureException/onerror
    )
      return false;

    // Stacktrace interface (i.e. from captureMessage)
    if (current.stacktrace || last.stacktrace) {
      return isSameStacktrace(current.stacktrace, last.stacktrace);
    } else if (current.exception || last.exception) {
      // Exception interface (i.e. from captureException/onerror)
      return isSameException(current.exception, last.exception);
    } else if (current.fingerprint || last.fingerprint) {
      return Boolean(current.fingerprint && last.fingerprint) &&
        JSON.stringify(current.fingerprint) === JSON.stringify(last.fingerprint)
    }

    return true;
  }
function ( current ) { var last = this . _lastData ; if ( ! last || current . message !== last . message || // defined for captureMessage current . transaction !== last . transaction // defined for captureException/onerror ) return false ; // Stacktrace interface (i.e. from captureMessage) if ( current . stacktrace || last . stacktrace ) { return isSameStacktrace ( current . stacktrace , last . stacktrace ) ; } else if ( current . exception || last . exception ) { // Exception interface (i.e. from captureException/onerror) return isSameException ( current . exception , last . exception ) ; } else if ( current . fingerprint || last . fingerprint ) { return Boolean ( current . fingerprint && last . fingerprint ) && JSON . stringify ( current . fingerprint ) === JSON . stringify ( last . fingerprint ) } return true ; }
Returns true if the in-process data payload matches the signature
of the previously-sent data

NOTE: This has to be done at this level because TraceKit can generate
data from window.onerror WITHOUT an exception object (IE8, IE9,
other old browsers). This can take the form of an "exception"
data object with a single frame (derived from the onerror args).
Returns true if the in - process data payload matches the signature of the previously - sent data