aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/lib
diff options
context:
space:
mode:
Diffstat (limited to 'app/scripts/lib')
-rw-r--r--app/scripts/lib/config-manager.js49
-rw-r--r--app/scripts/lib/migrations.js13
-rw-r--r--app/scripts/lib/observable/host.js4
-rw-r--r--app/scripts/lib/observable/index.js10
-rw-r--r--app/scripts/lib/observable/local-storage.js37
-rw-r--r--app/scripts/lib/observable/remote.js2
-rw-r--r--app/scripts/lib/observable/util/sync.js24
-rw-r--r--app/scripts/lib/observable/util/transform.js13
8 files changed, 99 insertions, 53 deletions
diff --git a/app/scripts/lib/config-manager.js b/app/scripts/lib/config-manager.js
index 01e6ccc3c..6d7305377 100644
--- a/app/scripts/lib/config-manager.js
+++ b/app/scripts/lib/config-manager.js
@@ -1,6 +1,4 @@
-const Migrator = require('pojo-migrator')
const MetamaskConfig = require('../config.js')
-const migrations = require('./migrations')
const ethUtil = require('ethereumjs-util')
const normalize = require('./sig-util').normalize
@@ -20,38 +18,17 @@ function ConfigManager (opts) {
// ConfigManager is observable and will emit updates
this._subs = []
this.store = opts.store
-
- /* The migrator exported on the config-manager
- * has two methods the user should be concerned with:
- *
- * getData(), which returns the app-consumable data object
- * saveData(), which persists the app-consumable data object.
- */
- this.migrator = new Migrator({
-
- // Migrations must start at version 1 or later.
- // They are objects with a `version` number
- // and a `migrate` function.
- //
- // The `migrate` function receives the previous
- // config data format, and returns the new one.
- migrations: migrations,
-
- // Data persistence methods
- loadData: () => this.store.get(),
- setData: (value) => this.store.put(value),
- })
}
ConfigManager.prototype.setConfig = function (config) {
- var data = this.migrator.getData()
+ var data = this.store.get()
data.config = config
this.setData(data)
this._emitUpdates(config)
}
ConfigManager.prototype.getConfig = function () {
- var data = this.migrator.getData()
+ var data = this.store.get()
if ('config' in data) {
return data.config
} else {
@@ -94,15 +71,15 @@ ConfigManager.prototype.getProvider = function () {
}
ConfigManager.prototype.setData = function (data) {
- this.migrator.saveData(data)
+ this.store.put(data)
}
ConfigManager.prototype.getData = function () {
- return this.migrator.getData()
+ return this.store.get()
}
ConfigManager.prototype.setWallet = function (wallet) {
- var data = this.migrator.getData()
+ var data = this.store.get()
data.wallet = wallet
this.setData(data)
}
@@ -119,11 +96,11 @@ ConfigManager.prototype.getVault = function () {
}
ConfigManager.prototype.getKeychains = function () {
- return this.migrator.getData().keychains || []
+ return this.store.get().keychains || []
}
ConfigManager.prototype.setKeychains = function (keychains) {
- var data = this.migrator.getData()
+ var data = this.store.get()
data.keychains = keychains
this.setData(data)
}
@@ -140,19 +117,19 @@ ConfigManager.prototype.setSelectedAccount = function (address) {
}
ConfigManager.prototype.getWallet = function () {
- return this.migrator.getData().wallet
+ return this.store.get().wallet
}
// Takes a boolean
ConfigManager.prototype.setShowSeedWords = function (should) {
- var data = this.migrator.getData()
+ var data = this.store.get()
data.showSeedWords = should
this.setData(data)
}
ConfigManager.prototype.getShouldShowSeedWords = function () {
- var data = this.migrator.getData()
+ var data = this.store.get()
return data.showSeedWords
}
@@ -187,7 +164,7 @@ ConfigManager.prototype.getCurrentRpcAddress = function () {
}
ConfigManager.prototype.setData = function (data) {
- this.migrator.saveData(data)
+ this.store.put(data)
}
//
@@ -195,7 +172,7 @@ ConfigManager.prototype.setData = function (data) {
//
ConfigManager.prototype.getTxList = function () {
- var data = this.migrator.getData()
+ var data = this.store.get()
if (data.transactions !== undefined) {
return data.transactions
} else {
@@ -204,7 +181,7 @@ ConfigManager.prototype.getTxList = function () {
}
ConfigManager.prototype.setTxList = function (txList) {
- var data = this.migrator.getData()
+ var data = this.store.get()
data.transactions = txList
this.setData(data)
}
diff --git a/app/scripts/lib/migrations.js b/app/scripts/lib/migrations.js
index f026cbe53..12f60def1 100644
--- a/app/scripts/lib/migrations.js
+++ b/app/scripts/lib/migrations.js
@@ -1,3 +1,16 @@
+/* The migrator has two methods the user should be concerned with:
+ *
+ * getData(), which returns the app-consumable data object
+ * saveData(), which persists the app-consumable data object.
+ */
+
+// Migrations must start at version 1 or later.
+// They are objects with a `version` number
+// and a `migrate` function.
+//
+// The `migrate` function receives the previous
+// config data format, and returns the new one.
+
module.exports = [
require('../migrations/002'),
require('../migrations/003'),
diff --git a/app/scripts/lib/observable/host.js b/app/scripts/lib/observable/host.js
index 69f674be8..d1b110503 100644
--- a/app/scripts/lib/observable/host.js
+++ b/app/scripts/lib/observable/host.js
@@ -12,14 +12,14 @@ class HostStore extends ObservableStore {
constructor (initState, opts) {
super(initState)
- this.opts = opts || {}
+ this._opts = opts || {}
}
createStream () {
const self = this
// setup remotely exposed api
let remoteApi = {}
- if (!self.opts.readOnly) {
+ if (!self._opts.readOnly) {
remoteApi.put = (newState) => self.put(newState)
}
// listen for connection to remote
diff --git a/app/scripts/lib/observable/index.js b/app/scripts/lib/observable/index.js
index d193e5554..1ff112e95 100644
--- a/app/scripts/lib/observable/index.js
+++ b/app/scripts/lib/observable/index.js
@@ -7,22 +7,30 @@ class ObservableStore extends EventEmitter {
this._state = initialState
}
+ // wrapper around internal get
get () {
return this._state
}
-
+
+ // wrapper around internal put
put (newState) {
this._put(newState)
}
+ // subscribe to changes
subscribe (handler) {
this.on('update', handler)
}
+ // unsubscribe to changes
unsubscribe (handler) {
this.removeListener('update', handler)
}
+ //
+ // private
+ //
+
_put (newState) {
this._state = newState
this.emit('update', newState)
diff --git a/app/scripts/lib/observable/local-storage.js b/app/scripts/lib/observable/local-storage.js
new file mode 100644
index 000000000..6ed3860f6
--- /dev/null
+++ b/app/scripts/lib/observable/local-storage.js
@@ -0,0 +1,37 @@
+const ObservableStore = require('./index')
+
+//
+// LocalStorageStore
+//
+// uses localStorage instead of a cache
+//
+
+class LocalStorageStore extends ObservableStore {
+
+ constructor (opts) {
+ super()
+ delete this._state
+
+ this._opts = opts || {}
+ if (!this._opts.storageKey) {
+ throw new Error('LocalStorageStore - no "storageKey" specified')
+ }
+ this._storageKey = this._opts.storageKey
+ }
+
+ get() {
+ try {
+ return JSON.parse(global.localStorage[this._storageKey])
+ } catch (err) {
+ return undefined
+ }
+ }
+
+ _put(newState) {
+ global.localStorage[this._storageKey] = JSON.stringify(newState)
+ this.emit('update', newState)
+ }
+
+}
+
+module.exports = LocalStorageStore
diff --git a/app/scripts/lib/observable/remote.js b/app/scripts/lib/observable/remote.js
index b5a3254a2..603f6f0b8 100644
--- a/app/scripts/lib/observable/remote.js
+++ b/app/scripts/lib/observable/remote.js
@@ -12,7 +12,7 @@ class RemoteStore extends ObservableStore {
constructor (initState, opts) {
super(initState)
- this.opts = opts || {}
+ this._opts = opts || {}
this._remote = null
}
diff --git a/app/scripts/lib/observable/util/sync.js b/app/scripts/lib/observable/util/sync.js
new file mode 100644
index 000000000..c61feb02e
--- /dev/null
+++ b/app/scripts/lib/observable/util/sync.js
@@ -0,0 +1,24 @@
+
+//
+// synchronizeStore(inStore, outStore, stateTransform)
+//
+// keeps outStore synchronized with inStore, via an optional stateTransform
+//
+
+module.exports = synchronizeStore
+
+
+function synchronizeStore(inStore, outStore, stateTransform) {
+ stateTransform = stateTransform || transformNoop
+ const initState = stateTransform(inStore.get())
+ outStore.put(initState)
+ inStore.subscribe((inState) => {
+ const outState = stateTransform(inState)
+ outStore.put(outState)
+ })
+ return outStore
+}
+
+function transformNoop(state) {
+ return state
+} \ No newline at end of file
diff --git a/app/scripts/lib/observable/util/transform.js b/app/scripts/lib/observable/util/transform.js
deleted file mode 100644
index 87946f402..000000000
--- a/app/scripts/lib/observable/util/transform.js
+++ /dev/null
@@ -1,13 +0,0 @@
-
-module.exports = transformStore
-
-
-function transformStore(inStore, outStore, stateTransform) {
- const initState = stateTransform(inStore.get())
- outStore.put(initState)
- inStore.subscribe((inState) => {
- const outState = stateTransform(inState)
- outStore.put(outState)
- })
- return outStore
-} \ No newline at end of file