1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-10-23 11:46:13 +02:00
metamask-extension/app/scripts/controllers/network.js

109 lines
3.6 KiB
JavaScript
Raw Normal View History

const EventEmitter = require('events')
const MetaMaskProvider = require('web3-provider-engine/zero.js')
const ObservableStore = require('obs-store')
2017-05-23 08:12:28 +02:00
const ComposedStore = require('obs-store/lib/composed')
const extend = require('xtend')
const EthQuery = require('eth-query')
2017-09-26 20:52:57 +02:00
const createEventEmitterProxy = require('../lib/events-proxy.js')
2017-05-23 07:56:10 +02:00
const RPC_ADDRESS_LIST = require('../config.js').network
2017-05-23 08:12:28 +02:00
const DEFAULT_RPC = RPC_ADDRESS_LIST['rinkeby']
module.exports = class NetworkController extends EventEmitter {
2017-05-23 08:12:28 +02:00
constructor (config) {
super()
2017-05-23 08:12:28 +02:00
config.provider.rpcTarget = this.getRpcAddressForType(config.provider.type, config.provider)
2017-09-27 23:10:58 +02:00
this.networkStore = new ObservableStore('loading')
2017-05-23 08:12:28 +02:00
this.providerStore = new ObservableStore(config.provider)
this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore })
this._providerListeners = {}
2017-05-23 07:56:10 +02:00
2017-05-23 08:12:28 +02:00
this.on('networkDidChange', this.lookupNetwork)
this.providerStore.subscribe((state) => this.switchNetwork({rpcUrl: state.rpcTarget}))
2017-05-23 07:56:10 +02:00
}
initializeProvider (opts, providerContructor = MetaMaskProvider) {
2017-09-27 23:10:58 +02:00
this._providerInit = opts
this._provider = providerContructor(opts)
2017-09-26 20:52:57 +02:00
this._proxy = createEventEmitterProxy(this._provider)
2017-09-27 23:10:58 +02:00
this._proxy._blockTracker = createEventEmitterProxy(this._provider._blockTracker)
this._proxy.on('block', this._logBlock.bind(this))
this._proxy.on('error', this.verifyNetwork.bind(this))
this.ethQuery = new EthQuery(this._proxy)
this.lookupNetwork()
2017-09-27 23:10:58 +02:00
return this._proxy
}
2017-05-23 07:56:10 +02:00
2017-05-23 08:12:28 +02:00
switchNetwork (providerInit) {
this.setNetworkState('loading')
2017-09-27 23:10:58 +02:00
const newInit = extend(this._providerInit, providerInit)
this._providerInit = newInit
2017-05-23 07:56:10 +02:00
2017-09-27 23:10:58 +02:00
this._proxy.removeAllListeners()
this._proxy.stop()
2017-09-26 20:52:57 +02:00
this._provider = MetaMaskProvider(newInit)
2017-05-23 07:56:10 +02:00
// apply the listners created by other controllers
2017-09-27 23:10:58 +02:00
const blockTrackerHandlers = this._proxy._blockTracker.proxyEventHandlers
this._proxy.setTarget(this._provider)
this._proxy._blockTracker = createEventEmitterProxy(this._provider._blockTracker, blockTrackerHandlers)
2017-05-23 08:12:28 +02:00
this.emit('networkDidChange')
}
verifyNetwork () {
// Check network when restoring connectivity:
if (this.isNetworkLoading()) this.lookupNetwork()
}
getNetworkState () {
2017-05-23 08:12:28 +02:00
return this.networkStore.getState()
}
setNetworkState (network) {
2017-05-23 08:12:28 +02:00
return this.networkStore.putState(network)
}
isNetworkLoading () {
return this.getNetworkState() === 'loading'
}
2017-05-23 08:12:28 +02:00
lookupNetwork () {
this.ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
if (err) return this.setNetworkState('loading')
log.info('web3.getNetwork returned ' + network)
this.setNetworkState(network)
})
}
setRpcTarget (rpcUrl) {
this.providerStore.updateState({
2017-05-23 08:12:28 +02:00
type: 'rpc',
rpcTarget: rpcUrl,
})
}
getCurrentRpcAddress () {
2017-05-23 08:12:28 +02:00
const provider = this.getProviderConfig()
if (!provider) return null
return this.getRpcAddressForType(provider.type)
}
setProviderType (type) {
2017-05-23 08:12:28 +02:00
if (type === this.getProviderConfig().type) return
const rpcTarget = this.getRpcAddressForType(type)
2017-05-23 08:12:28 +02:00
this.providerStore.updateState({type, rpcTarget})
}
2017-05-23 08:12:28 +02:00
getProviderConfig () {
return this.providerStore.getState()
}
2017-05-23 08:12:28 +02:00
getRpcAddressForType (type, provider = this.getProviderConfig()) {
if (RPC_ADDRESS_LIST[type]) return RPC_ADDRESS_LIST[type]
return provider && provider.rpcTarget ? provider.rpcTarget : DEFAULT_RPC
2017-05-23 07:56:10 +02:00
}
2017-05-23 07:56:10 +02:00
_logBlock (block) {
log.info(`BLOCK CHANGED: #${block.number.toString('hex')} 0x${block.hash.toString('hex')}`)
this.verifyNetwork()
}
}