diff options
author | Dan Finlay <dan@danfinlay.com> | 2016-11-18 06:05:12 +0800 |
---|---|---|
committer | Dan Finlay <dan@danfinlay.com> | 2016-11-18 06:05:12 +0800 |
commit | 8eb91e89bf62fd835d5e59bd01ac54e0df7c22ed (patch) | |
tree | 975275cc991cdc4f2a0b8decd2db4f429e2f9096 | |
parent | b0ccde66f62ae69c5818ddd43e22fb517f8f13e2 (diff) | |
download | tangerine-wallet-browser-8eb91e89bf62fd835d5e59bd01ac54e0df7c22ed.tar tangerine-wallet-browser-8eb91e89bf62fd835d5e59bd01ac54e0df7c22ed.tar.gz tangerine-wallet-browser-8eb91e89bf62fd835d5e59bd01ac54e0df7c22ed.tar.bz2 tangerine-wallet-browser-8eb91e89bf62fd835d5e59bd01ac54e0df7c22ed.tar.lz tangerine-wallet-browser-8eb91e89bf62fd835d5e59bd01ac54e0df7c22ed.tar.xz tangerine-wallet-browser-8eb91e89bf62fd835d5e59bd01ac54e0df7c22ed.tar.zst tangerine-wallet-browser-8eb91e89bf62fd835d5e59bd01ac54e0df7c22ed.zip |
Increment tx ids to avoid collisions
Fixes #791
It was possible for two requests to have the same ID, causing a crash and loss of StreamProvider connection.
This new id generation strategy creates a random ID, and increments it for each request.
In case the id generator is included from two different processes, I'm initializing the counter at a random number, and rolling it over a large number when it gets too big.
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | app/scripts/lib/idStore.js | 2 | ||||
-rw-r--r-- | app/scripts/lib/inpage-provider.js | 11 | ||||
-rw-r--r-- | app/scripts/lib/random-id.js | 9 |
4 files changed, 13 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d75538f5..177545214 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Current Master +- Fix bug that would cause MetaMask to occasionally lose its StreamProvider connection and drop requests. + ## 2.13.8 2016-11-16 - Show a warning when a transaction fails during simulation. diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index 65b8c7029..ccd5efe69 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -7,7 +7,7 @@ const EthQuery = require('eth-query') const KeyStore = require('eth-lightwallet').keystore const clone = require('clone') const extend = require('xtend') -const createId = require('web3-provider-engine/util/random-id') +const createId = require('./random-id') const ethBinToOps = require('eth-bin-to-ops') const autoFaucet = require('./auto-faucet') const messageManager = require('./message-manager') diff --git a/app/scripts/lib/inpage-provider.js b/app/scripts/lib/inpage-provider.js index 052a8f5fe..f1ba2e0ed 100644 --- a/app/scripts/lib/inpage-provider.js +++ b/app/scripts/lib/inpage-provider.js @@ -2,6 +2,7 @@ const Streams = require('mississippi') const StreamProvider = require('web3-stream-provider') const ObjectMultiplex = require('./obj-multiplex') const RemoteStore = require('./remote-store.js').RemoteStore +const createRandomId = require('./random-id') module.exports = MetamaskInpageProvider @@ -119,16 +120,6 @@ function remoteStoreWithLocalStorageCache (storageKey) { return store } -function createRandomId(){ - const extraDigits = 3 - // 13 time digits - const datePart = new Date().getTime() * Math.pow(10, extraDigits) - // 3 random digits - const extraPart = Math.floor(Math.random() * Math.pow(10, extraDigits)) - // 16 digits - return datePart + extraPart -} - function eachJsonMessage(payload, transformFn){ if (Array.isArray(payload)) { return payload.map(transformFn) diff --git a/app/scripts/lib/random-id.js b/app/scripts/lib/random-id.js new file mode 100644 index 000000000..3c5ae5600 --- /dev/null +++ b/app/scripts/lib/random-id.js @@ -0,0 +1,9 @@ +const MAX = 1000000000 + +let idCounter = Math.round( Math.random() * MAX ) +function createRandomId() { + idCounter = idCounter % MAX + return idCounter++ +} + +module.exports = createRandomId |