mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-30 16:18:07 +01:00
98 lines
1.9 KiB
JavaScript
98 lines
1.9 KiB
JavaScript
|
const Dnode = require('dnode')
|
||
|
const inherits = require('util').inherits
|
||
|
|
||
|
module.exports = {
|
||
|
HostStore: HostStore,
|
||
|
RemoteStore: RemoteStore,
|
||
|
}
|
||
|
|
||
|
function BaseStore(initState){
|
||
|
this._state = initState || {}
|
||
|
this._subs = []
|
||
|
}
|
||
|
|
||
|
BaseStore.prototype.set = function(key, value){
|
||
|
throw Error('Not implemented.')
|
||
|
}
|
||
|
|
||
|
BaseStore.prototype.get = function(key){
|
||
|
return this._state[key]
|
||
|
}
|
||
|
|
||
|
BaseStore.prototype.subscribe = function(fn){
|
||
|
this._subs.push(fn)
|
||
|
var unsubscribe = this.unsubscribe.bind(this, fn)
|
||
|
return unsubscribe
|
||
|
}
|
||
|
|
||
|
BaseStore.prototype.unsubscribe = function(fn){
|
||
|
var index = this._subs.indexOf(fn)
|
||
|
if (index !== -1) this._subs.splice(index, 1)
|
||
|
}
|
||
|
|
||
|
BaseStore.prototype._emitUpdates = function(state){
|
||
|
this._subs.forEach(function(handler){
|
||
|
handler(state)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// host
|
||
|
//
|
||
|
|
||
|
inherits(HostStore, BaseStore)
|
||
|
function HostStore(initState, opts){
|
||
|
BaseStore.call(this, initState)
|
||
|
}
|
||
|
|
||
|
HostStore.prototype.set = function(key, value){
|
||
|
this._state[key] = value
|
||
|
process.nextTick(this._emitUpdates.bind(this, this._state))
|
||
|
}
|
||
|
|
||
|
HostStore.prototype.createStream = function(){
|
||
|
var dnode = Dnode({
|
||
|
// update: this._didUpdate.bind(this),
|
||
|
})
|
||
|
dnode.on('remote', this._didConnect.bind(this))
|
||
|
return dnode
|
||
|
}
|
||
|
|
||
|
HostStore.prototype._didConnect = function(remote){
|
||
|
this.subscribe(function(state){
|
||
|
remote.update(state)
|
||
|
})
|
||
|
remote.update(this._state)
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// remote
|
||
|
//
|
||
|
|
||
|
inherits(RemoteStore, BaseStore)
|
||
|
function RemoteStore(initState, opts){
|
||
|
BaseStore.call(this, initState)
|
||
|
this._remote = null
|
||
|
}
|
||
|
|
||
|
RemoteStore.prototype.set = function(key, value){
|
||
|
this._remote.set(key, value)
|
||
|
}
|
||
|
|
||
|
RemoteStore.prototype.createStream = function(){
|
||
|
var dnode = Dnode({
|
||
|
update: this._didUpdate.bind(this),
|
||
|
})
|
||
|
dnode.once('remote', this._didConnect.bind(this))
|
||
|
return dnode
|
||
|
}
|
||
|
|
||
|
RemoteStore.prototype._didConnect = function(remote){
|
||
|
this._remote = remote
|
||
|
}
|
||
|
|
||
|
RemoteStore.prototype._didUpdate = function(state){
|
||
|
this._state = state
|
||
|
this._emitUpdates(state)
|
||
|
}
|