From b4912f29cd3b6e0a5df81e9f69acc50b03e31c0c Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 16 Apr 2018 17:45:18 -0400 Subject: [PATCH] Disable token price polling when no client is active --- app/scripts/background.js | 3 +++ app/scripts/controllers/token-rates.js | 1 + app/scripts/metamask-controller.js | 9 +++++++++ test/unit/token-rates-controller.js | 1 + 4 files changed, 14 insertions(+) diff --git a/app/scripts/background.js b/app/scripts/background.js index 5878cd2e8..3f0e289c9 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -200,6 +200,7 @@ function setupController (initState, initLangCode) { if (isMetaMaskInternalProcess) { // communication with popup popupIsOpen = popupIsOpen || (remotePort.name === 'popup') + controller.isClientOpen = true controller.setupTrustedCommunication(portStream, 'MetaMask') // record popup as closed if (remotePort.sender.url.match(/home.html$/)) { @@ -211,6 +212,8 @@ function setupController (initState, initLangCode) { if (remotePort.sender.url.match(/home.html$/)) { openMetamaskTabsIDs[remotePort.sender.tab.id] = false } + controller.isClientOpen = popupIsOpen || + Object.keys(openMetamaskTabsIDs).some(key => openMetamaskTabsIDs[key]) }) } if (remotePort.name === 'notification') { diff --git a/app/scripts/controllers/token-rates.js b/app/scripts/controllers/token-rates.js index 85a8ca24e..22e3e8154 100644 --- a/app/scripts/controllers/token-rates.js +++ b/app/scripts/controllers/token-rates.js @@ -23,6 +23,7 @@ class TokenRatesController { * Updates exchange rates for all tokens */ async updateExchangeRates () { + if (!this.isActive) { return } const contractExchangeRates = {} for (const i in this._tokens) { const address = this._tokens[i].address diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 750a97b86..73b7cfbb0 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -269,6 +269,7 @@ module.exports = class MetamaskController extends EventEmitter { // memStore -> transform -> publicConfigStore this.on('update', (memState) => { + this.isClientOpenAndUnlocked = memState.isUnlocked && this._isClientOpen const publicState = selectPublicState(memState) publicConfigStore.putState(publicState) }) @@ -1030,4 +1031,12 @@ module.exports = class MetamaskController extends EventEmitter { } } + set isClientOpen (open) { + this._isClientOpen = open + this.isClientOpenAndUnlocked = this.getState().isUnlocked && open + } + + set isClientOpenAndUnlocked (active) { + this.tokenRatesController.isActive = active + } } diff --git a/test/unit/token-rates-controller.js b/test/unit/token-rates-controller.js index 55bfe7823..a49547313 100644 --- a/test/unit/token-rates-controller.js +++ b/test/unit/token-rates-controller.js @@ -20,6 +20,7 @@ describe('TokenRatesController', () => { it('should fetch each token rate based on address', async () => { const controller = new TokenRatesController() + controller.isActive = true controller.fetchExchangeRate = address => address controller.tokens = [{ address: 'foo' }, { address: 'bar' }] await controller.updateExchangeRates()