Skip to content

Commit 66c77dc

Browse files
authored
Merge pull request MetaMask#4570 from MetaMask/persistence-stream-fix
background - persistence pipeline - fix persistence bug
2 parents 8cb5f57 + 86f7692 commit 66c77dc

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Current Master
44

5+
- Fix bug where metamask data would stop being written to disk after prolonged use
56
- Fix bug where account reset did not work with custom RPC providers.
67
- Fix bug where nonce mutex was never released
78
- Stop reloading browser page on Ethereum network change

app/scripts/background.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const ExtensionPlatform = require('./platforms/extension')
1616
const Migrator = require('./lib/migrator/')
1717
const migrations = require('./migrations/')
1818
const PortStream = require('./lib/port-stream.js')
19+
const createStreamSink = require('./lib/createStreamSink')
1920
const NotificationManager = require('./lib/notification-manager.js')
2021
const MetamaskController = require('./metamask-controller')
2122
const firstTimeState = require('./first-time-state')
@@ -273,7 +274,7 @@ function setupController (initState, initLangCode) {
273274
asStream(controller.store),
274275
debounce(1000),
275276
storeTransform(versionifyData),
276-
storeTransform(persistData),
277+
createStreamSink(persistData),
277278
(error) => {
278279
log.error('MetaMask - Persistence pipeline failed', error)
279280
}
@@ -289,20 +290,21 @@ function setupController (initState, initLangCode) {
289290
return versionedData
290291
}
291292

292-
function persistData (state) {
293+
async function persistData (state) {
293294
if (!state) {
294295
throw new Error('MetaMask - updated state is missing', state)
295296
}
296297
if (!state.data) {
297298
throw new Error('MetaMask - updated state does not have data', state)
298299
}
299300
if (localStore.isSupported) {
300-
localStore.set(state)
301-
.catch((err) => {
301+
try {
302+
await localStore.set(state)
303+
} catch (err) {
304+
// log error so we dont break the pipeline
302305
log.error('error setting state in local store:', err)
303-
})
306+
}
304307
}
305-
return state
306308
}
307309

308310
//

app/scripts/lib/createStreamSink.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const WritableStream = require('readable-stream').Writable
2+
const promiseToCallback = require('promise-to-callback')
3+
4+
module.exports = createStreamSink
5+
6+
7+
function createStreamSink(asyncWriteFn, _opts) {
8+
return new AsyncWritableStream(asyncWriteFn, _opts)
9+
}
10+
11+
class AsyncWritableStream extends WritableStream {
12+
13+
constructor (asyncWriteFn, _opts) {
14+
const opts = Object.assign({ objectMode: true }, _opts)
15+
super(opts)
16+
this._asyncWriteFn = asyncWriteFn
17+
}
18+
19+
// write from incomming stream to state
20+
_write (chunk, encoding, callback) {
21+
promiseToCallback(this._asyncWriteFn(chunk, encoding))(callback)
22+
}
23+
24+
}

0 commit comments

Comments
 (0)