1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Merge pull request #3922 from MetaMask/empty-vault-fix

Empty vault - attempt recovery
This commit is contained in:
kumavis 2018-04-06 13:18:48 -07:00 committed by GitHub
commit 2511a9e634
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -78,6 +78,28 @@ async function loadStateFromPersistence () {
diskStore.getState() || diskStore.getState() ||
migrator.generateInitialState(firstTimeState) migrator.generateInitialState(firstTimeState)
// check if somehow state is empty
// this should never happen but new error reporting suggests that it has
// for a small number of users
// https://github.com/metamask/metamask-extension/issues/3919
if (versionedData && !versionedData.data) {
// try to recover from diskStore incase only localStore is bad
const diskStoreState = diskStore.getState()
if (diskStoreState && diskStoreState.data) {
// we were able to recover (though it might be old)
versionedData = diskStoreState
const vaultStructure = getObjStructure(versionedData)
raven.captureMessage('MetaMask - Empty vault found - recovered from diskStore', {
// "extra" key is required by Sentry
extra: { vaultStructure },
})
} else {
// unable to recover, clear state
versionedData = migrator.generateInitialState(firstTimeState)
raven.captureMessage('MetaMask - Empty vault found - unable to recover')
}
}
// report migration errors to sentry // report migration errors to sentry
migrator.on('error', (err) => { migrator.on('error', (err) => {
// get vault structure without secrets // get vault structure without secrets
@ -140,9 +162,9 @@ function setupController (initState, initLangCode) {
asStream(controller.store), asStream(controller.store),
debounce(1000), debounce(1000),
storeTransform(versionifyData), storeTransform(versionifyData),
storeTransform(syncDataWithExtension), storeTransform(persistData),
(error) => { (error) => {
log.error('pump hit error', error) log.error('MetaMask - Persistence pipeline failed', error)
} }
) )
@ -151,7 +173,13 @@ function setupController (initState, initLangCode) {
return versionedData return versionedData
} }
function syncDataWithExtension(state) { function persistData(state) {
if (!state) {
throw new Error('MetaMask - updated state is missing', state)
}
if (!state.data) {
throw new Error('MetaMask - updated state does not have data', state)
}
if (localStore.isSupported) { if (localStore.isSupported) {
localStore.set(state) localStore.set(state)
.catch((err) => { .catch((err) => {