You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.7 KiB
88 lines
2.7 KiB
const Raven = require('raven-js')
|
|
const METAMASK_DEBUG = process.env.METAMASK_DEBUG
|
|
const extractEthjsErrorMessage = require('./extractEthjsErrorMessage')
|
|
const PROD = 'https://3567c198f8a8412082d32655da2961d0@sentry.io/273505'
|
|
const DEV = 'https://f59f3dd640d2429d9d0e2445a87ea8e1@sentry.io/273496'
|
|
|
|
module.exports = setupRaven
|
|
|
|
// Setup raven / sentry remote error reporting
|
|
function setupRaven(opts) {
|
|
const { release } = opts
|
|
let ravenTarget
|
|
|
|
if (METAMASK_DEBUG) {
|
|
console.log('Setting up Sentry Remote Error Reporting: DEV')
|
|
ravenTarget = DEV
|
|
} else {
|
|
console.log('Setting up Sentry Remote Error Reporting: PROD')
|
|
ravenTarget = PROD
|
|
}
|
|
|
|
const client = Raven.config(ravenTarget, {
|
|
release,
|
|
transport: function(opts) {
|
|
const report = opts.data
|
|
try {
|
|
// handle error-like non-error exceptions
|
|
nonErrorException(report)
|
|
// simplify certain complex error messages (e.g. Ethjs)
|
|
simplifyErrorMessages(report)
|
|
// modify report urls
|
|
rewriteReportUrls(report)
|
|
} catch (err) {
|
|
console.warn(err)
|
|
}
|
|
// make request normally
|
|
client._makeRequest(opts)
|
|
},
|
|
})
|
|
client.install()
|
|
|
|
return Raven
|
|
}
|
|
|
|
function nonErrorException(report) {
|
|
// handle errors that lost their error-ness in serialization
|
|
if (report.message.includes('Non-Error exception captured with keys: message')) {
|
|
if (!(report.extra && report.extra.__serialized__)) return
|
|
report.message = `Non-Error Exception: ${report.extra.__serialized__.message}`
|
|
}
|
|
}
|
|
|
|
function simplifyErrorMessages(report) {
|
|
if (report.exception && report.exception.values) {
|
|
report.exception.values.forEach(item => {
|
|
let errorMessage = item.value
|
|
// simplify ethjs error messages
|
|
errorMessage = extractEthjsErrorMessage(errorMessage)
|
|
// simplify 'Transaction Failed: known transaction'
|
|
if (errorMessage.indexOf('Transaction Failed: known transaction') === 0) {
|
|
// cut the hash from the error message
|
|
errorMessage = 'Transaction Failed: known transaction'
|
|
}
|
|
// finalize
|
|
item.value = errorMessage
|
|
})
|
|
}
|
|
}
|
|
|
|
function rewriteReportUrls(report) {
|
|
// update request url
|
|
report.request.url = toMetamaskUrl(report.request.url)
|
|
// update exception stack trace
|
|
if (report.exception && report.exception.values) {
|
|
report.exception.values.forEach(item => {
|
|
item.stacktrace.frames.forEach(frame => {
|
|
frame.filename = toMetamaskUrl(frame.filename)
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
function toMetamaskUrl(origUrl) {
|
|
const filePath = origUrl.split(location.origin)[1]
|
|
if (!filePath) return origUrl
|
|
const metamaskUrl = `metamask${filePath}`
|
|
return metamaskUrl
|
|
}
|
|
|