diff options
author | Thomas Huang <tmashuang@users.noreply.github.com> | 2018-05-31 07:04:02 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-31 07:04:02 +0800 |
commit | dc5477be3cc62dff912a9447c702edab66200f02 (patch) | |
tree | 4c4c4293bfbc2a80812d231af9c7e22877cebfbd /app/scripts/lib | |
parent | 5fc24930a7febd919ec6a8f6e9c14f2bac0ef2b2 (diff) | |
parent | e59f606adb65de85484b0fb258980543967ee5e1 (diff) | |
download | tangerine-wallet-browser-dc5477be3cc62dff912a9447c702edab66200f02.tar tangerine-wallet-browser-dc5477be3cc62dff912a9447c702edab66200f02.tar.gz tangerine-wallet-browser-dc5477be3cc62dff912a9447c702edab66200f02.tar.bz2 tangerine-wallet-browser-dc5477be3cc62dff912a9447c702edab66200f02.tar.lz tangerine-wallet-browser-dc5477be3cc62dff912a9447c702edab66200f02.tar.xz tangerine-wallet-browser-dc5477be3cc62dff912a9447c702edab66200f02.tar.zst tangerine-wallet-browser-dc5477be3cc62dff912a9447c702edab66200f02.zip |
Merge pull request #4408 from MetaMask/v4.7.0rc2
Version 4.7.0 - rc2
Diffstat (limited to 'app/scripts/lib')
-rw-r--r-- | app/scripts/lib/createErrorMiddleware.js | 66 | ||||
-rw-r--r-- | app/scripts/lib/get-first-preferred-lang-code.js | 11 | ||||
-rw-r--r-- | app/scripts/lib/inpage-provider.js | 2 | ||||
-rw-r--r-- | app/scripts/lib/setupRaven.js | 42 |
4 files changed, 100 insertions, 21 deletions
diff --git a/app/scripts/lib/createErrorMiddleware.js b/app/scripts/lib/createErrorMiddleware.js new file mode 100644 index 000000000..baed99e45 --- /dev/null +++ b/app/scripts/lib/createErrorMiddleware.js @@ -0,0 +1,66 @@ +const log = require('loglevel') + +/** + * JSON-RPC error object + * + * @typedef {Object} RpcError + * @property {number} code - Indicates the error type that occurred + * @property {Object} [data] - Contains additional information about the error + * @property {string} [message] - Short description of the error + */ + +/** + * Middleware configuration object + * + * @typedef {Object} MiddlewareConfig + * @property {boolean} [override] - Use RPC_ERRORS message in place of provider message + */ + +/** + * Map of standard and non-standard RPC error codes to messages + */ +const RPC_ERRORS = { + 1: 'An unauthorized action was attempted.', + 2: 'A disallowed action was attempted.', + 3: 'An execution error occurred.', + [-32600]: 'The JSON sent is not a valid Request object.', + [-32601]: 'The method does not exist / is not available.', + [-32602]: 'Invalid method parameter(s).', + [-32603]: 'Internal JSON-RPC error.', + [-32700]: 'Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text.', + internal: 'Internal server error.', + unknown: 'Unknown JSON-RPC error.', +} + +/** + * Modifies a JSON-RPC error object in-place to add a human-readable message, + * optionally overriding any provider-supplied message + * + * @param {RpcError} error - JSON-RPC error object + * @param {boolean} override - Use RPC_ERRORS message in place of provider message + */ +function sanitizeRPCError (error, override) { + if (error.message && !override) { return error } + const message = error.code > -31099 && error.code < -32100 ? RPC_ERRORS.internal : RPC_ERRORS[error.code] + error.message = message || RPC_ERRORS.unknown +} + +/** + * json-rpc-engine middleware that both logs standard and non-standard error + * messages and ends middleware stack traversal if an error is encountered + * + * @param {MiddlewareConfig} [config={override:true}] - Middleware configuration + * @returns {Function} json-rpc-engine middleware function + */ +function createErrorMiddleware ({ override = true } = {}) { + return (req, res, next) => { + next(done => { + const { error } = res + if (!error) { return done() } + sanitizeRPCError(error) + log.error(`MetaMask - RPC Error: ${error.message}`, error) + }) + } +} + +module.exports = createErrorMiddleware
\ No newline at end of file diff --git a/app/scripts/lib/get-first-preferred-lang-code.js b/app/scripts/lib/get-first-preferred-lang-code.js index 5473fccf0..1e6a83ba6 100644 --- a/app/scripts/lib/get-first-preferred-lang-code.js +++ b/app/scripts/lib/get-first-preferred-lang-code.js @@ -2,6 +2,12 @@ const extension = require('extensionizer') const promisify = require('pify') const allLocales = require('../../_locales/index.json') +const isSupported = extension.i18n && extension.i18n.getAcceptLanguages +const getPreferredLocales = isSupported ? promisify( + extension.i18n.getAcceptLanguages, + { errorFirst: false } +) : async () => [] + const existingLocaleCodes = allLocales.map(locale => locale.code.toLowerCase().replace('_', '-')) /** @@ -12,10 +18,7 @@ const existingLocaleCodes = allLocales.map(locale => locale.code.toLowerCase().r * */ async function getFirstPreferredLangCode () { - const userPreferredLocaleCodes = await promisify( - extension.i18n.getAcceptLanguages, - { errorFirst: false } - )() + const userPreferredLocaleCodes = await getPreferredLocales() const firstPreferredLangCode = userPreferredLocaleCodes .map(code => code.toLowerCase()) .find(code => existingLocaleCodes.includes(code)) diff --git a/app/scripts/lib/inpage-provider.js b/app/scripts/lib/inpage-provider.js index 99cc5d2cf..4e65f0a23 100644 --- a/app/scripts/lib/inpage-provider.js +++ b/app/scripts/lib/inpage-provider.js @@ -1,5 +1,6 @@ const pump = require('pump') const RpcEngine = require('json-rpc-engine') +const createErrorMiddleware = require('./createErrorMiddleware') const createIdRemapMiddleware = require('json-rpc-engine/src/idRemapMiddleware') const createStreamMiddleware = require('json-rpc-middleware-stream') const LocalStorageStore = require('obs-store') @@ -44,6 +45,7 @@ function MetamaskInpageProvider (connectionStream) { // handle sendAsync requests via dapp-side rpc engine const rpcEngine = new RpcEngine() rpcEngine.push(createIdRemapMiddleware()) + rpcEngine.push(createErrorMiddleware()) rpcEngine.push(streamMiddleware) self.rpcEngine = rpcEngine } diff --git a/app/scripts/lib/setupRaven.js b/app/scripts/lib/setupRaven.js index b1b67f771..d164827ab 100644 --- a/app/scripts/lib/setupRaven.js +++ b/app/scripts/lib/setupRaven.js @@ -25,7 +25,7 @@ function setupRaven(opts) { const report = opts.data try { // handle error-like non-error exceptions - nonErrorException(report) + rewriteErrorLikeExceptions(report) // simplify certain complex error messages (e.g. Ethjs) simplifyErrorMessages(report) // modify report urls @@ -42,27 +42,35 @@ function setupRaven(opts) { 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 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 => { - 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 + item.value = rewriteFn(item.value) }) } } |