aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/lib/migrator/index.js
diff options
context:
space:
mode:
authorkumavis <kumavis@users.noreply.github.com>2017-01-25 12:38:13 +0800
committerGitHub <noreply@github.com>2017-01-25 12:38:13 +0800
commitd30612a2168b02c39a3eaa86f29e47d9edda07d8 (patch)
tree27eab17687c0c7a1b2583f51abf8064fa54de82a /app/scripts/lib/migrator/index.js
parent4f39e8192cd94ad45d68992d5d1129f1612b1aa6 (diff)
parent0f33acb80ca90e07e6f7b7c083f52a1f4344c48e (diff)
downloadtangerine-wallet-browser-d30612a2168b02c39a3eaa86f29e47d9edda07d8.tar
tangerine-wallet-browser-d30612a2168b02c39a3eaa86f29e47d9edda07d8.tar.gz
tangerine-wallet-browser-d30612a2168b02c39a3eaa86f29e47d9edda07d8.tar.bz2
tangerine-wallet-browser-d30612a2168b02c39a3eaa86f29e47d9edda07d8.tar.lz
tangerine-wallet-browser-d30612a2168b02c39a3eaa86f29e47d9edda07d8.tar.xz
tangerine-wallet-browser-d30612a2168b02c39a3eaa86f29e47d9edda07d8.tar.zst
tangerine-wallet-browser-d30612a2168b02c39a3eaa86f29e47d9edda07d8.zip
Merge pull request #999 from MetaMask/obs-store2
background - introduce ObservableStore (mark II)
Diffstat (limited to 'app/scripts/lib/migrator/index.js')
-rw-r--r--app/scripts/lib/migrator/index.js40
1 files changed, 40 insertions, 0 deletions
diff --git a/app/scripts/lib/migrator/index.js b/app/scripts/lib/migrator/index.js
new file mode 100644
index 000000000..ab5a757b3
--- /dev/null
+++ b/app/scripts/lib/migrator/index.js
@@ -0,0 +1,40 @@
+const asyncQ = require('async-q')
+
+class Migrator {
+
+ constructor (opts = {}) {
+ let migrations = opts.migrations || []
+ this.migrations = migrations.sort((a, b) => a.version - b.version)
+ let lastMigration = this.migrations.slice(-1)[0]
+ // use specified defaultVersion or highest migration version
+ this.defaultVersion = opts.defaultVersion || (lastMigration && lastMigration.version) || 0
+ }
+
+ // run all pending migrations on meta in place
+ migrateData (versionedData = this.generateInitialState()) {
+ let remaining = this.migrations.filter(migrationIsPending)
+
+ return (
+ asyncQ.eachSeries(remaining, (migration) => migration.migrate(versionedData))
+ .then(() => versionedData)
+ )
+
+ // migration is "pending" if hit has a higher
+ // version number than currentVersion
+ function migrationIsPending(migration) {
+ return migration.version > versionedData.meta.version
+ }
+ }
+
+ generateInitialState (initState) {
+ return {
+ meta: {
+ version: this.defaultVersion,
+ },
+ data: initState,
+ }
+ }
+
+}
+
+module.exports = Migrator