mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Merge pull request #2194 from MetaMask/network-controller-refactor
Network controller refactor
This commit is contained in:
commit
ecf909e140
@ -11,52 +11,36 @@ const DEFAULT_RPC = RPC_ADDRESS_LIST['rinkeby']
|
|||||||
module.exports = class NetworkController extends EventEmitter {
|
module.exports = class NetworkController extends EventEmitter {
|
||||||
constructor (config) {
|
constructor (config) {
|
||||||
super()
|
super()
|
||||||
this.networkStore = new ObservableStore('loading')
|
|
||||||
config.provider.rpcTarget = this.getRpcAddressForType(config.provider.type, config.provider)
|
config.provider.rpcTarget = this.getRpcAddressForType(config.provider.type, config.provider)
|
||||||
|
this.networkStore = new ObservableStore('loading')
|
||||||
this.providerStore = new ObservableStore(config.provider)
|
this.providerStore = new ObservableStore(config.provider)
|
||||||
this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore })
|
this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore })
|
||||||
this._providerListeners = {}
|
this._proxy = createEventEmitterProxy()
|
||||||
|
|
||||||
this.on('networkDidChange', this.lookupNetwork)
|
this.on('networkDidChange', this.lookupNetwork)
|
||||||
this.providerStore.subscribe((state) => this.switchNetwork({rpcUrl: state.rpcTarget}))
|
this.providerStore.subscribe((state) => this.switchNetwork({ rpcUrl: state.rpcTarget }))
|
||||||
}
|
|
||||||
|
|
||||||
get provider () {
|
|
||||||
return this._proxy
|
|
||||||
}
|
|
||||||
|
|
||||||
set provider (provider) {
|
|
||||||
this._provider = provider
|
|
||||||
}
|
}
|
||||||
|
|
||||||
initializeProvider (opts, providerContructor = MetaMaskProvider) {
|
initializeProvider (opts, providerContructor = MetaMaskProvider) {
|
||||||
this.providerInit = opts
|
this._baseProviderParams = opts
|
||||||
this._provider = providerContructor(opts)
|
const provider = providerContructor(opts)
|
||||||
this._proxy = createEventEmitterProxy(this._provider)
|
this._setProvider(provider)
|
||||||
this.provider._blockTracker = createEventEmitterProxy(this._provider._blockTracker)
|
this._proxy.on('block', this._logBlock.bind(this))
|
||||||
this.provider.on('block', this._logBlock.bind(this))
|
this._proxy.on('error', this.verifyNetwork.bind(this))
|
||||||
this.provider.on('error', this.verifyNetwork.bind(this))
|
this.ethQuery = new EthQuery(this._proxy)
|
||||||
this.ethQuery = new EthQuery(this.provider)
|
|
||||||
this.lookupNetwork()
|
this.lookupNetwork()
|
||||||
return this.provider
|
return this._proxy
|
||||||
}
|
}
|
||||||
|
|
||||||
switchNetwork (providerInit) {
|
switchNetwork (opts) {
|
||||||
this.setNetworkState('loading')
|
this.setNetworkState('loading')
|
||||||
const newInit = extend(this.providerInit, providerInit)
|
const providerParams = extend(this._baseProviderParams, opts)
|
||||||
this.providerInit = newInit
|
this._baseProviderParams = providerParams
|
||||||
|
const provider = MetaMaskProvider(providerParams)
|
||||||
this._provider.removeAllListeners()
|
this._setProvider(provider)
|
||||||
this._provider.stop()
|
|
||||||
this._provider = MetaMaskProvider(newInit)
|
|
||||||
// apply the listners created by other controllers
|
|
||||||
const blockTrackerHandlers = this.provider._blockTracker.proxyEventHandlers
|
|
||||||
this.provider.setTarget(this._provider)
|
|
||||||
this.provider._blockTracker = createEventEmitterProxy(this._provider._blockTracker, blockTrackerHandlers)
|
|
||||||
this.emit('networkDidChange')
|
this.emit('networkDidChange')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
verifyNetwork () {
|
verifyNetwork () {
|
||||||
// Check network when restoring connectivity:
|
// Check network when restoring connectivity:
|
||||||
if (this.isNetworkLoading()) this.lookupNetwork()
|
if (this.isNetworkLoading()) this.lookupNetwork()
|
||||||
@ -110,6 +94,24 @@ module.exports = class NetworkController extends EventEmitter {
|
|||||||
return provider && provider.rpcTarget ? provider.rpcTarget : DEFAULT_RPC
|
return provider && provider.rpcTarget ? provider.rpcTarget : DEFAULT_RPC
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_setProvider (provider) {
|
||||||
|
// collect old block tracker events
|
||||||
|
const oldProvider = this._provider
|
||||||
|
let blockTrackerHandlers
|
||||||
|
if (oldProvider) {
|
||||||
|
// capture old block handlers
|
||||||
|
blockTrackerHandlers = oldProvider._blockTracker.proxyEventHandlers
|
||||||
|
// tear down
|
||||||
|
oldProvider.removeAllListeners()
|
||||||
|
oldProvider.stop()
|
||||||
|
}
|
||||||
|
// override block tracler
|
||||||
|
provider._blockTracker = createEventEmitterProxy(provider._blockTracker, blockTrackerHandlers)
|
||||||
|
// set as new provider
|
||||||
|
this._provider = provider
|
||||||
|
this._proxy.setTarget(provider)
|
||||||
|
}
|
||||||
|
|
||||||
_logBlock (block) {
|
_logBlock (block) {
|
||||||
log.info(`BLOCK CHANGED: #${block.number.toString('hex')} 0x${block.hash.toString('hex')}`)
|
log.info(`BLOCK CHANGED: #${block.number.toString('hex')} 0x${block.hash.toString('hex')}`)
|
||||||
this.verifyNetwork()
|
this.verifyNetwork()
|
||||||
|
@ -232,8 +232,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
processTransaction: nodeify(async (txParams) => await this.txController.newUnapprovedTransaction(txParams), this),
|
processTransaction: nodeify(async (txParams) => await this.txController.newUnapprovedTransaction(txParams), this),
|
||||||
// old style msg signing
|
// old style msg signing
|
||||||
processMessage: this.newUnsignedMessage.bind(this),
|
processMessage: this.newUnsignedMessage.bind(this),
|
||||||
|
// personal_sign msg signing
|
||||||
// new style msg signing
|
|
||||||
processPersonalMessage: this.newUnsignedPersonalMessage.bind(this),
|
processPersonalMessage: this.newUnsignedPersonalMessage.bind(this),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -20,9 +20,9 @@ describe('# Network Controller', function () {
|
|||||||
describe('#provider', function () {
|
describe('#provider', function () {
|
||||||
it('provider should be updatable without reassignment', function () {
|
it('provider should be updatable without reassignment', function () {
|
||||||
networkController.initializeProvider(networkControllerProviderInit, dummyProviderConstructor)
|
networkController.initializeProvider(networkControllerProviderInit, dummyProviderConstructor)
|
||||||
const provider = networkController.provider
|
const proxy = networkController._proxy
|
||||||
networkController.provider.setTarget({test: true, on: () => {}})
|
proxy.setTarget({ test: true, on: () => {} })
|
||||||
assert.ok(provider.test)
|
assert.ok(proxy.test)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
describe('#getNetworkState', function () {
|
describe('#getNetworkState', function () {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user