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
        rewriteErrorLikeExceptions(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 rewriteErrorLikeExceptions(report) {
  // handle errors that lost their error-ness in serialization (e.g. dnode)
  rewriteErrorMessages(report, (errorMessage) => {
    if (!errorMessage.includes('Non-Error exception captured with keys:')) return errorMessage
    if (!(report.extra && report.extra.__serialized__ && report.extra.__serialized__.message)) return errorMessage
    return `Non-Error Exception: ${report.extra.__serialized__.message}`
  })
}

function simplifyErrorMessages(report) {
  rewriteErrorMessages(report, (errorMessage) => {
    // 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'
    }
    return errorMessage
  })
}

function rewriteErrorMessages(report, rewriteFn) {
  // rewrite top level message
  report.message = rewriteFn(report.message)
  // rewrite each exception message
  if (report.exception && report.exception.values) {
    report.exception.values.forEach(item => {
      item.value = rewriteFn(item.value)
    })
  }
}

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
}
ption>
<option value='2025Q3'>2025Q3</option>
<option value='branches/2014Q1'>branches/2014Q1</option>
<option value='branches/2014Q2'>branches/2014Q2</option>
<option value='branches/2014Q3'>branches/2014Q3</option>
<option value='branches/2014Q4'>branches/2014Q4</option>
<option value='branches/2015Q1'>branches/2015Q1</option>
<option value='branches/2015Q2'>branches/2015Q2</option>
<option value='branches/2015Q3'>branches/2015Q3</option>
<option value='branches/2015Q4'>branches/2015Q4</option>
<option value='branches/2016Q1'>branches/2016Q1</option>
<option value='branches/2016Q2'>branches/2016Q2</option>
<option value='branches/2016Q3'>branches/2016Q3</option>
<option value='branches/2016Q4'>branches/2016Q4</option>
<option value='branches/2017Q1'>branches/2017Q1</option>
<option value='branches/2017Q2'>branches/2017Q2</option>
<option value='branches/2017Q3'>branches/2017Q3</option>
<option value='branches/2017Q4'>branches/2017Q4</option>
<option value='branches/2018Q1'>branches/2018Q1</option>
<option value='branches/2018Q2'>branches/2018Q2</option>
<option value='branches/2018Q3'>branches/2018Q3</option>
<option value='branches/2018Q4'>branches/2018Q4</option>
<option value='branches/2019Q1'>branches/2019Q1</option>
<option value='branches/2019Q2'>branches/2019Q2</option>
<option value='branches/2019Q3'>branches/2019Q3</option>
<option value='branches/2019Q4'>branches/2019Q4</option>
<option value='branches/2020Q1'>branches/2020Q1</option>
<option value='branches/2020Q2'>branches/2020Q2</option>
<option value='branches/2020Q3'>branches/2020Q3</option>
<option value='branches/2020Q4'>branches/2020Q4</option>
<option value='branches/2021Q1'>branches/2021Q1</option>
<option value='branches/RELEASE_8_4_0'>branches/RELEASE_8_4_0</option>
<option value='branches/RELENG_2_1_0'>branches/RELENG_2_1_0</option>
<option value='branches/RELENG_2_2'>branches/RELENG_2_2</option>
<option value='branches/RELENG_9_1_0'>branches/RELENG_9_1_0</option>
<option value='branches/RELENG_9_2_0'>branches/RELENG_9_2_0</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3'>dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/lodash-4.17.15'>dependabot/npm_and_yarn/devel/electron4/files/lodash-4.17.15</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2'>dependabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/lodash.template-4.5.0'>dependabot/npm_and_yarn/devel/electron4/files/lodash.template-4.5.0</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2'>dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2</option>
<option value='main' selected='selected'>main</option>
<option value='master'>master</option>
<option value='svn_head'>svn_head</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>FreeBSD Ports (https://github.com/freebsd/freebsd-ports)</td><td class='sub right'></td></tr></table>
<table class='tabs'><tr><td>
<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/about/'>about</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/'>summary</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/refs/?id=f871c6efabc784eb6ddb4c3ee2ad116afc94800d'>refs</a><a class='active' href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/lang/gleam'>log</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/tree/lang/gleam?id=f871c6efabc784eb6ddb4c3ee2ad116afc94800d'>tree</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=f871c6efabc784eb6ddb4c3ee2ad116afc94800d'>commit</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/diff/lang/gleam?id=f871c6efabc784eb6ddb4c3ee2ad116afc94800d'>diff</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/stats/lang/gleam'>stats</a></td><td class='form'><form class='right' method='get' action='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/lang/gleam'>
<input type='hidden' name='id' value='f871c6efabc784eb6ddb4c3ee2ad116afc94800d'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/?id=f871c6efabc784eb6ddb4c3ee2ad116afc94800d'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/lang?id=f871c6efabc784eb6ddb4c3ee2ad116afc94800d'>lang</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/lang/gleam?id=f871c6efabc784eb6ddb4c3ee2ad116afc94800d'>gleam</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/lang/gleam?id=f871c6efabc784eb6ddb4c3ee2ad116afc94800d&amp;showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=e9a35a1c5016dde2e50c722753b048dfeb7093be'>lang/rust: Bump revisions after 1.61.0</a></td><td>Mikael Urankar</td><td><span title='2022-05-31 21:06:17 +0800'>2022-05-31</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=480c6ba42b381efe2f7db002cf1c82b9ee1a4e57'>lang/gleam: update to 0.21.0</a></td><td>Dave Cottlehuber</td><td><span title='2022-05-17 22:07:51 +0800'>2022-05-17</span></td><td>3</td><td><span class='deletions'>-303</span>/<span class='insertions'>+302</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=57c3caaa6c71fac422a82aa252be380179d3c042'>lang/rust: Relink ports after the Rust 1.60.0 update</a></td><td>Tobias Kortkamp</td><td><span title='2022-05-03 16:00:34 +0800'>2022-05-03</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=e255ac5487b4968237729e953a156c2be8914617'>lang/rust: Bump revisions after 1.59.0</a></td><td>Mikael Urankar</td><td><span title='2022-03-15 17:51:58 +0800'>2022-03-15</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=8dc8b7224bce38d334924304eeecb9f866cbfe73'>lang/gleam: update to 0.20.1</a></td><td>Dave Cottlehuber</td><td><span title='2022-03-09 16:42:53 +0800'>2022-03-09</span></td><td>3</td><td><span class='deletions'>-8</span>/<span class='insertions'>+19</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=d64a2a380f88ceec8264db6bbc94805f58112ee7'>lang/rust: Relink consumers</a></td><td>Tobias Kortkamp</td><td><span title='2022-02-03 22:02:32 +0800'>2022-02-03</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=835bd573300a74e379d8f37fefec3a0e9d24e391'>lang/rust: Bump revisions after 1.58.0</a></td><td>Tobias Kortkamp</td><td><span title='2022-01-17 19:57:45 +0800'>2022-01-17</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=bf49a06b0e408f652d579c839e8f38a0e9c4aca0'>lang/gleam: update to 0.19.0</a></td><td>Dave Cottlehuber</td><td><span title='2022-01-14 05:00:30 +0800'>2022-01-14</span></td><td>3</td><td><span class='deletions'>-139</span>/<span class='insertions'>+133</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=95a444db3579ffacd8c13602db0cea83f6e6dfc8'>lang/gleam: update to 0.18.2</a></td><td>Dave Cottlehuber</td><td><span title='2021-12-14 15:01:33 +0800'>2021-12-14</span></td><td>3</td><td><span class='deletions'>-46</span>/<span class='insertions'>+46</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=f60da0973d3432a3899b8a46e748441eea5c0dee'>lang/gleam: update to 0.18.0</a></td><td>Dave Cottlehuber</td><td><span title='2021-12-09 17:38:20 +0800'>2021-12-09</span></td><td>4</td><td><span class='deletions'>-259</span>/<span class='insertions'>+321</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=5a7f23c69df040ff8b38bb1c0d25db96cc1c2605'>lang/rust: Rebuild consumers for Rust 1.57.0</a></td><td>Tobias Kortkamp</td><td><span title='2021-12-05 20:35:42 +0800'>2021-12-05</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=ad90fc634b9923b6fb3b5072b30bc104175a0061'>*: Rebuild for Rust 1.56.0</a></td><td>Tobias Kortkamp</td><td><span title='2021-10-25 16:55:19 +0800'>2021-10-25</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=727a23e5771c5e10959873cfeff536cb8b9d7bd1'>lang/gleam: update to 0.17.0</a></td><td>Dave Cottlehuber</td><td><span title='2021-09-21 03:00:59 +0800'>2021-09-21</span></td><td>3</td><td><span class='deletions'>-328</span>/<span class='insertions'>+392</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/lang/gleam?id=7059b437276adb3724a01c87aa54da081f71c94b'>*: Rebuild lang/rust consumers after the 1.55.0 update</a></td><td>Tobias Kortkamp</td><td><span title='2021-09-19 17:03:23 +0800'>2021-09-19</span>