mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-22 09:57:02 +01:00
Export individual fns from tx-state-history-helpers (#8370)
This commit is contained in:
parent
e05db747f5
commit
164923acd1
@ -1,20 +1,12 @@
|
|||||||
import jsonDiffer from 'fast-json-patch'
|
import jsonDiffer from 'fast-json-patch'
|
||||||
import { cloneDeep } from 'lodash'
|
import { cloneDeep } from 'lodash'
|
||||||
|
|
||||||
/** @module*/
|
|
||||||
export default {
|
|
||||||
generateHistoryEntry,
|
|
||||||
replayHistory,
|
|
||||||
snapshotFromTxMeta,
|
|
||||||
migrateFromSnapshotsToDiffs,
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
converts non-initial history entries into diffs
|
converts non-initial history entries into diffs
|
||||||
@param {array} longHistory
|
@param {array} longHistory
|
||||||
@returns {array}
|
@returns {array}
|
||||||
*/
|
*/
|
||||||
function migrateFromSnapshotsToDiffs (longHistory) {
|
export function migrateFromSnapshotsToDiffs (longHistory) {
|
||||||
return (
|
return (
|
||||||
longHistory
|
longHistory
|
||||||
// convert non-initial history entries into diffs
|
// convert non-initial history entries into diffs
|
||||||
@ -39,7 +31,7 @@ function migrateFromSnapshotsToDiffs (longHistory) {
|
|||||||
@param {string} [note] - a optional note for the state change
|
@param {string} [note] - a optional note for the state change
|
||||||
@returns {array}
|
@returns {array}
|
||||||
*/
|
*/
|
||||||
function generateHistoryEntry (previousState, newState, note) {
|
export function generateHistoryEntry (previousState, newState, note) {
|
||||||
const entry = jsonDiffer.compare(previousState, newState)
|
const entry = jsonDiffer.compare(previousState, newState)
|
||||||
// Add a note to the first op, since it breaks if we append it to the entry
|
// Add a note to the first op, since it breaks if we append it to the entry
|
||||||
if (entry[0]) {
|
if (entry[0]) {
|
||||||
@ -56,7 +48,7 @@ function generateHistoryEntry (previousState, newState, note) {
|
|||||||
Recovers previous txMeta state obj
|
Recovers previous txMeta state obj
|
||||||
@returns {Object}
|
@returns {Object}
|
||||||
*/
|
*/
|
||||||
function replayHistory (_shortHistory) {
|
export function replayHistory (_shortHistory) {
|
||||||
const shortHistory = cloneDeep(_shortHistory)
|
const shortHistory = cloneDeep(_shortHistory)
|
||||||
return shortHistory.reduce((val, entry) => jsonDiffer.applyPatch(val, entry).newDocument)
|
return shortHistory.reduce((val, entry) => jsonDiffer.applyPatch(val, entry).newDocument)
|
||||||
}
|
}
|
||||||
@ -66,7 +58,7 @@ function replayHistory (_shortHistory) {
|
|||||||
* @param {Object} txMeta - the tx metadata object
|
* @param {Object} txMeta - the tx metadata object
|
||||||
* @returns {Object} a deep clone without history
|
* @returns {Object} a deep clone without history
|
||||||
*/
|
*/
|
||||||
function snapshotFromTxMeta (txMeta) {
|
export function snapshotFromTxMeta (txMeta) {
|
||||||
const shallow = { ...txMeta }
|
const shallow = { ...txMeta }
|
||||||
delete shallow.history
|
delete shallow.history
|
||||||
return cloneDeep(shallow)
|
return cloneDeep(shallow)
|
@ -1,7 +1,7 @@
|
|||||||
import EventEmitter from 'safe-event-emitter'
|
import EventEmitter from 'safe-event-emitter'
|
||||||
import ObservableStore from 'obs-store'
|
import ObservableStore from 'obs-store'
|
||||||
import log from 'loglevel'
|
import log from 'loglevel'
|
||||||
import txStateHistoryHelper from './lib/tx-state-history-helper'
|
import { generateHistoryEntry, replayHistory, snapshotFromTxMeta } from './lib/tx-state-history-helpers'
|
||||||
import createId from '../../lib/random-id'
|
import createId from '../../lib/random-id'
|
||||||
import { getFinalStates, normalizeTxParams } from './lib/util'
|
import { getFinalStates, normalizeTxParams } from './lib/util'
|
||||||
/**
|
/**
|
||||||
@ -146,7 +146,7 @@ class TransactionStateManager extends EventEmitter {
|
|||||||
// initialize history
|
// initialize history
|
||||||
txMeta.history = []
|
txMeta.history = []
|
||||||
// capture initial snapshot of txMeta for history
|
// capture initial snapshot of txMeta for history
|
||||||
const snapshot = txStateHistoryHelper.snapshotFromTxMeta(txMeta)
|
const snapshot = snapshotFromTxMeta(txMeta)
|
||||||
txMeta.history.push(snapshot)
|
txMeta.history.push(snapshot)
|
||||||
|
|
||||||
const transactions = this.getFullTxList()
|
const transactions = this.getFullTxList()
|
||||||
@ -197,11 +197,11 @@ class TransactionStateManager extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create txMeta snapshot for history
|
// create txMeta snapshot for history
|
||||||
const currentState = txStateHistoryHelper.snapshotFromTxMeta(txMeta)
|
const currentState = snapshotFromTxMeta(txMeta)
|
||||||
// recover previous tx state obj
|
// recover previous tx state obj
|
||||||
const previousState = txStateHistoryHelper.replayHistory(txMeta.history)
|
const previousState = replayHistory(txMeta.history)
|
||||||
// generate history entry and add to history
|
// generate history entry and add to history
|
||||||
const entry = txStateHistoryHelper.generateHistoryEntry(previousState, currentState, note)
|
const entry = generateHistoryEntry(previousState, currentState, note)
|
||||||
txMeta.history.push(entry)
|
txMeta.history.push(entry)
|
||||||
|
|
||||||
// commit txMeta to state
|
// commit txMeta to state
|
||||||
|
@ -7,8 +7,10 @@ This migration updates "transaction state history" to diffs style
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { cloneDeep } from 'lodash'
|
import { cloneDeep } from 'lodash'
|
||||||
|
import {
|
||||||
import txStateHistoryHelper from '../controllers/transactions/lib/tx-state-history-helper'
|
snapshotFromTxMeta,
|
||||||
|
migrateFromSnapshotsToDiffs,
|
||||||
|
} from '../controllers/transactions/lib/tx-state-history-helpers'
|
||||||
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -36,13 +38,13 @@ function transformState (state) {
|
|||||||
newState.TransactionController.transactions = transactions.map((txMeta) => {
|
newState.TransactionController.transactions = transactions.map((txMeta) => {
|
||||||
// no history: initialize
|
// no history: initialize
|
||||||
if (!txMeta.history || txMeta.history.length === 0) {
|
if (!txMeta.history || txMeta.history.length === 0) {
|
||||||
const snapshot = txStateHistoryHelper.snapshotFromTxMeta(txMeta)
|
const snapshot = snapshotFromTxMeta(txMeta)
|
||||||
txMeta.history = [snapshot]
|
txMeta.history = [snapshot]
|
||||||
return txMeta
|
return txMeta
|
||||||
}
|
}
|
||||||
// has history: migrate
|
// has history: migrate
|
||||||
const newHistory = (
|
const newHistory = (
|
||||||
txStateHistoryHelper.migrateFromSnapshotsToDiffs(txMeta.history)
|
migrateFromSnapshotsToDiffs(txMeta.history)
|
||||||
// remove empty diffs
|
// remove empty diffs
|
||||||
.filter((entry) => {
|
.filter((entry) => {
|
||||||
return !Array.isArray(entry) || entry.length > 0
|
return !Array.isArray(entry) || entry.length > 0
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import txStateHistoryHelper from '../../app/scripts/controllers/transactions/lib/tx-state-history-helper'
|
import { snapshotFromTxMeta } from '../../app/scripts/controllers/transactions/lib/tx-state-history-helpers'
|
||||||
|
|
||||||
export default createTxMeta
|
export default function createTxMeta (partialMeta) {
|
||||||
|
|
||||||
function createTxMeta (partialMeta) {
|
|
||||||
const txMeta = Object.assign({
|
const txMeta = Object.assign({
|
||||||
status: 'unapproved',
|
status: 'unapproved',
|
||||||
txParams: {},
|
txParams: {},
|
||||||
@ -10,7 +8,7 @@ function createTxMeta (partialMeta) {
|
|||||||
// initialize history
|
// initialize history
|
||||||
txMeta.history = []
|
txMeta.history = []
|
||||||
// capture initial snapshot of txMeta for history
|
// capture initial snapshot of txMeta for history
|
||||||
const snapshot = txStateHistoryHelper.snapshotFromTxMeta(txMeta)
|
const snapshot = snapshotFromTxMeta(txMeta)
|
||||||
txMeta.history.push(snapshot)
|
txMeta.history.push(snapshot)
|
||||||
return txMeta
|
return txMeta
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
import { strict as assert } from 'assert'
|
import { strict as assert } from 'assert'
|
||||||
import txStateHistoryHelper from '../../../../../app/scripts/controllers/transactions/lib/tx-state-history-helper'
|
import {
|
||||||
|
snapshotFromTxMeta,
|
||||||
|
migrateFromSnapshotsToDiffs,
|
||||||
|
replayHistory,
|
||||||
|
generateHistoryEntry,
|
||||||
|
} from '../../../../../app/scripts/controllers/transactions/lib/tx-state-history-helpers'
|
||||||
import testVault from '../../../../data/v17-long-history.json'
|
import testVault from '../../../../data/v17-long-history.json'
|
||||||
|
|
||||||
describe('Transaction state history helper', function () {
|
describe('Transaction state history helper', function () {
|
||||||
@ -12,7 +17,7 @@ describe('Transaction state history helper', function () {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
const output = txStateHistoryHelper.snapshotFromTxMeta(input)
|
const output = snapshotFromTxMeta(input)
|
||||||
assert.ok('foo' in output, 'has a foo key')
|
assert.ok('foo' in output, 'has a foo key')
|
||||||
assert.ok('bar' in output.foo, 'has a bar key')
|
assert.ok('bar' in output.foo, 'has a bar key')
|
||||||
assert.ok('bam' in output.foo.bar, 'has a bar key')
|
assert.ok('bam' in output.foo.bar, 'has a bar key')
|
||||||
@ -21,7 +26,7 @@ describe('Transaction state history helper', function () {
|
|||||||
|
|
||||||
it('should remove the history key', function () {
|
it('should remove the history key', function () {
|
||||||
const input = { foo: 'bar', history: 'remembered' }
|
const input = { foo: 'bar', history: 'remembered' }
|
||||||
const output = txStateHistoryHelper.snapshotFromTxMeta(input)
|
const output = snapshotFromTxMeta(input)
|
||||||
assert.equal(typeof output.history, 'undefined', 'should remove history')
|
assert.equal(typeof output.history, 'undefined', 'should remove history')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -29,7 +34,7 @@ describe('Transaction state history helper', function () {
|
|||||||
describe('#migrateFromSnapshotsToDiffs', function () {
|
describe('#migrateFromSnapshotsToDiffs', function () {
|
||||||
it('migrates history to diffs and can recover original values', function () {
|
it('migrates history to diffs and can recover original values', function () {
|
||||||
testVault.data.TransactionController.transactions.forEach((tx) => {
|
testVault.data.TransactionController.transactions.forEach((tx) => {
|
||||||
const newHistory = txStateHistoryHelper.migrateFromSnapshotsToDiffs(tx.history)
|
const newHistory = migrateFromSnapshotsToDiffs(tx.history)
|
||||||
newHistory.forEach((newEntry, index) => {
|
newHistory.forEach((newEntry, index) => {
|
||||||
if (index === 0) {
|
if (index === 0) {
|
||||||
assert.equal(Array.isArray(newEntry), false, 'initial history item IS NOT a json patch obj')
|
assert.equal(Array.isArray(newEntry), false, 'initial history item IS NOT a json patch obj')
|
||||||
@ -38,7 +43,7 @@ describe('Transaction state history helper', function () {
|
|||||||
}
|
}
|
||||||
const oldEntry = tx.history[index]
|
const oldEntry = tx.history[index]
|
||||||
const historySubset = newHistory.slice(0, index + 1)
|
const historySubset = newHistory.slice(0, index + 1)
|
||||||
const reconstructedValue = txStateHistoryHelper.replayHistory(historySubset)
|
const reconstructedValue = replayHistory(historySubset)
|
||||||
assert.deepEqual(oldEntry, reconstructedValue, 'was able to reconstruct old entry from diffs')
|
assert.deepEqual(oldEntry, reconstructedValue, 'was able to reconstruct old entry from diffs')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -61,7 +66,7 @@ describe('Transaction state history helper', function () {
|
|||||||
const history = [initialState, diff1, diff2]
|
const history = [initialState, diff1, diff2]
|
||||||
|
|
||||||
const beforeStateSnapshot = JSON.stringify(initialState)
|
const beforeStateSnapshot = JSON.stringify(initialState)
|
||||||
const latestState = txStateHistoryHelper.replayHistory(history)
|
const latestState = replayHistory(history)
|
||||||
const afterStateSnapshot = JSON.stringify(initialState)
|
const afterStateSnapshot = JSON.stringify(initialState)
|
||||||
assert.notEqual(initialState, latestState, 'initial state is not the same obj as the latest state')
|
assert.notEqual(initialState, latestState, 'initial state is not the same obj as the latest state')
|
||||||
assert.equal(beforeStateSnapshot, afterStateSnapshot, 'initial state is not modified during run')
|
assert.equal(beforeStateSnapshot, afterStateSnapshot, 'initial state is not modified during run')
|
||||||
@ -92,7 +97,7 @@ describe('Transaction state history helper', function () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const before = new Date().getTime()
|
const before = new Date().getTime()
|
||||||
const result = txStateHistoryHelper.generateHistoryEntry(prevState, nextState, note)
|
const result = generateHistoryEntry(prevState, nextState, note)
|
||||||
const after = new Date().getTime()
|
const after = new Date().getTime()
|
||||||
assert.ok(Array.isArray(result))
|
assert.ok(Array.isArray(result))
|
||||||
assert.equal(result.length, 3)
|
assert.equal(result.length, 3)
|
@ -1,6 +1,6 @@
|
|||||||
import { strict as assert } from 'assert'
|
import { strict as assert } from 'assert'
|
||||||
import TxStateManager from '../../../../../app/scripts/controllers/transactions/tx-state-manager'
|
import TxStateManager from '../../../../../app/scripts/controllers/transactions/tx-state-manager'
|
||||||
import txStateHistoryHelper from '../../../../../app/scripts/controllers/transactions/lib/tx-state-history-helper'
|
import { snapshotFromTxMeta } from '../../../../../app/scripts/controllers/transactions/lib/tx-state-history-helpers'
|
||||||
|
|
||||||
const noop = () => true
|
const noop = () => true
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ describe('TransactionStateManager', function () {
|
|||||||
// verify tx was initialized correctly
|
// verify tx was initialized correctly
|
||||||
assert.equal(updatedTx.history.length, 1, 'one history item (initial)')
|
assert.equal(updatedTx.history.length, 1, 'one history item (initial)')
|
||||||
assert.equal(Array.isArray(updatedTx.history[0]), false, 'first history item is initial state')
|
assert.equal(Array.isArray(updatedTx.history[0]), false, 'first history item is initial state')
|
||||||
assert.deepEqual(updatedTx.history[0], txStateHistoryHelper.snapshotFromTxMeta(updatedTx), 'first history item is initial state')
|
assert.deepEqual(updatedTx.history[0], snapshotFromTxMeta(updatedTx), 'first history item is initial state')
|
||||||
// modify value and updateTx
|
// modify value and updateTx
|
||||||
updatedTx.txParams.gasPrice = desiredGasPrice
|
updatedTx.txParams.gasPrice = desiredGasPrice
|
||||||
const before = new Date().getTime()
|
const before = new Date().getTime()
|
||||||
|
Loading…
Reference in New Issue
Block a user