UNPKG

@alayanetwork/inpage-provider

Version:

A JavaScript PlatON provider that connects over a WebExtension port.

84 lines (73 loc) 2.33 kB
const EventEmitter = require('events') const log = require('loglevel') const { ethErrors, serializeError } = require('eth-json-rpc-errors') const SafeEventEmitter = require('safe-event-emitter') // utility functions /** * json-rpc-engine middleware that both logs standard and non-standard error * messages and ends middleware stack traversal if an error is encountered * * @returns {Function} json-rpc-engine middleware function */ function createErrorMiddleware () { return (req, res, next) => { // json-rpc-engine will terminate the request when it notices this error if (!req.method || typeof req.method !== 'string') { res.error = ethErrors.rpc.invalidRequest({ message: `The request 'method' must be a non-empty string.`, data: req, }) } next((done) => { const { error } = res if (!error) { return done() } serializeError(error) log.error(`MetaMask - RPC Error: ${error.message}`, error) return done() }) } } // resolve response.result or response, reject errors const getRpcPromiseCallback = (resolve, reject, unwrapResult = true) => (error, response) => { if (error || response.error) { reject(error || response.error) } else { !unwrapResult || Array.isArray(response) ? resolve(response) : resolve(response.result) } } /** * Logs a stream disconnection error. Emits an 'error' if bound to an * EventEmitter that has listeners for the 'error' event. * * @param {string} remoteLabel - The label of the disconnected stream. * @param {Error} err - The associated error to log. */ function logStreamDisconnectWarning (remoteLabel, err) { let warningMsg = `MetamaskInpageProvider - lost connection to ${remoteLabel}` if (err) { warningMsg += `\n${err.stack}` } log.warn(warningMsg) if (this instanceof EventEmitter || this instanceof SafeEventEmitter) { if (this.listenerCount('error') > 0) { this.emit('error', warningMsg) } } } // eslint-disable-next-line no-empty-function const NOOP = () => {} // constants const EMITTED_NOTIFICATIONS = [ 'platon_subscription', // per eth-json-rpc-filters/subscriptionManager ] module.exports = { createErrorMiddleware, EMITTED_NOTIFICATIONS, getRpcPromiseCallback, logStreamDisconnectWarning, NOOP, }