mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-22 18:00:18 +01:00
refactor - push data to popup
This commit is contained in:
parent
e50e189443
commit
2f079dfdd1
@ -2,10 +2,11 @@ const Dnode = require('dnode')
|
|||||||
const PortStream = require('./lib/port-stream.js')
|
const PortStream = require('./lib/port-stream.js')
|
||||||
const MetaMaskProvider = require('./lib/metamask-provider')
|
const MetaMaskProvider = require('./lib/metamask-provider')
|
||||||
const IdentityManager = require('./lib/idmgmt')
|
const IdentityManager = require('./lib/idmgmt')
|
||||||
|
const eos = require('end-of-stream')
|
||||||
|
|
||||||
console.log('ready to roll')
|
console.log('ready to roll')
|
||||||
|
|
||||||
var wallet = IdentityManager()
|
var wallet = new IdentityManager()
|
||||||
|
|
||||||
// setup provider
|
// setup provider
|
||||||
var zeroClient = MetaMaskProvider({
|
var zeroClient = MetaMaskProvider({
|
||||||
@ -35,8 +36,35 @@ function connectRemote(remotePort){
|
|||||||
|
|
||||||
function handleInternalCommunication(remotePort){
|
function handleInternalCommunication(remotePort){
|
||||||
var duplex = new PortStream(remotePort)
|
var duplex = new PortStream(remotePort)
|
||||||
var remote = Dnode(wallet)
|
var connection = Dnode({
|
||||||
duplex.pipe(remote).pipe(duplex)
|
// this is annoying, have to decompose wallet
|
||||||
|
getState: wallet.getState.bind(wallet),
|
||||||
|
submitPassword: wallet.submitPassword.bind(wallet),
|
||||||
|
setSelectedAddress: wallet.setSelectedAddress.bind(wallet),
|
||||||
|
signTransaction: wallet.signTransaction.bind(wallet),
|
||||||
|
setLocked: wallet.setLocked.bind(wallet),
|
||||||
|
getAccounts: wallet.getAccounts.bind(wallet),
|
||||||
|
confirmTransaction: wallet.confirmTransaction.bind(wallet),
|
||||||
|
newBlock: wallet.newBlock.bind(wallet),
|
||||||
|
setProvider: wallet.setProvider.bind(wallet),
|
||||||
|
})
|
||||||
|
duplex.pipe(connection).pipe(duplex)
|
||||||
|
connection.on('remote', function(remote){
|
||||||
|
|
||||||
|
// push updates to popup
|
||||||
|
wallet.on('update', sendUpdate)
|
||||||
|
eos(duplex, function unsubscribe(){
|
||||||
|
wallet.removeListener('update', sendUpdate)
|
||||||
|
})
|
||||||
|
function sendUpdate(state){
|
||||||
|
remote.sendUpdate(state)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// sub to metamask store
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleExternalCommunication(remotePort){
|
function handleExternalCommunication(remotePort){
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
const inherits = require('util').inherits
|
||||||
const EventEmitter = require('events').EventEmitter
|
const EventEmitter = require('events').EventEmitter
|
||||||
const async = require('async')
|
const async = require('async')
|
||||||
const KeyStore = require('eth-lightwallet').keystore
|
const KeyStore = require('eth-lightwallet').keystore
|
||||||
@ -11,34 +12,18 @@ module.exports = IdentityManager
|
|||||||
var provider = null
|
var provider = null
|
||||||
var pubsub = new EventEmitter()
|
var pubsub = new EventEmitter()
|
||||||
|
|
||||||
pubsub.on('block', function(){
|
|
||||||
updateIdentities()
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
inherits(IdentityManager, EventEmitter)
|
||||||
function IdentityManager(opts){
|
function IdentityManager(opts){
|
||||||
opts = opts || {}
|
const self = this
|
||||||
providerEngine = opts.providerEngine
|
self.on('block', function(){
|
||||||
|
self.updateIdentities()
|
||||||
return {
|
})
|
||||||
// plugin popup
|
|
||||||
getState: getState,
|
|
||||||
subscribe: subscribe,
|
|
||||||
submitPassword: submitPassword,
|
|
||||||
setSelectedAddress: setSelectedAddress,
|
|
||||||
signTransaction: signTransaction,
|
|
||||||
setLocked: setLocked,
|
|
||||||
// eth rpc
|
|
||||||
getAccounts: getAccounts,
|
|
||||||
confirmTransaction: confirmTransaction,
|
|
||||||
// etc
|
|
||||||
newBlock: newBlock,
|
|
||||||
setProvider: setProvider,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// plugin popup
|
// plugin popup
|
||||||
IdentityManager.prototype.getState = getState
|
IdentityManager.prototype.getState = getState
|
||||||
IdentityManager.prototype.subscribe = subscribe
|
|
||||||
IdentityManager.prototype.submitPassword = submitPassword
|
IdentityManager.prototype.submitPassword = submitPassword
|
||||||
IdentityManager.prototype.setSelectedAddress = setSelectedAddress
|
IdentityManager.prototype.setSelectedAddress = setSelectedAddress
|
||||||
IdentityManager.prototype.signTransaction = signTransaction
|
IdentityManager.prototype.signTransaction = signTransaction
|
||||||
@ -57,21 +42,8 @@ function setProvider(_provider){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function newBlock(block){
|
function newBlock(block){
|
||||||
pubsub.emit('block', block)
|
var self = this
|
||||||
}
|
self.emit('block', block)
|
||||||
|
|
||||||
// on new block, update our accounts (but only if we're unlocked)
|
|
||||||
function subscribe(cb){
|
|
||||||
pubsub.on('block', sendUpdateState)
|
|
||||||
// we're not unsubbing
|
|
||||||
// this causes errors and potentially breaks shit
|
|
||||||
// we should emit on change instead
|
|
||||||
// and background should handle unsubbing
|
|
||||||
function sendUpdateState(){
|
|
||||||
if (!isUnlocked()) return
|
|
||||||
var state = _getState()
|
|
||||||
cb(state)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getState(cb){
|
function getState(cb){
|
||||||
@ -105,6 +77,7 @@ function setSelectedAddress(address, cb){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function submitPassword(password, cb){
|
function submitPassword(password, cb){
|
||||||
|
const self = this
|
||||||
console.log('submitPassword:', password)
|
console.log('submitPassword:', password)
|
||||||
tryPassword(password, function(err){
|
tryPassword(password, function(err){
|
||||||
if (err) console.log('bad password:', password, err)
|
if (err) console.log('bad password:', password, err)
|
||||||
@ -112,11 +85,12 @@ function submitPassword(password, cb){
|
|||||||
console.log('good password:', password)
|
console.log('good password:', password)
|
||||||
window.sessionStorage['password'] = password
|
window.sessionStorage['password'] = password
|
||||||
// load identities before returning...
|
// load identities before returning...
|
||||||
loadIdentities()
|
self.loadIdentities()
|
||||||
var state = _getState()
|
var state = _getState()
|
||||||
cb(null, state)
|
cb(null, state)
|
||||||
// trigger an update but dont wait for it
|
// trigger an update but dont wait for it
|
||||||
updateIdentities()
|
console.log(self)
|
||||||
|
self.updateIdentities()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +106,8 @@ function getIdentities(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// load identities from keyStore
|
// load identities from keyStore
|
||||||
function loadIdentities(){
|
IdentityManager.prototype.loadIdentities = function(){
|
||||||
|
const self = this
|
||||||
if (!isUnlocked()) throw new Error('not unlocked')
|
if (!isUnlocked()) throw new Error('not unlocked')
|
||||||
var keyStore = getKeyStore()
|
var keyStore = getKeyStore()
|
||||||
var addresses = keyStore.getAddresses().map(function(address){ return '0x'+address })
|
var addresses = keyStore.getAddresses().map(function(address){ return '0x'+address })
|
||||||
@ -146,18 +121,21 @@ function loadIdentities(){
|
|||||||
}
|
}
|
||||||
identities[address] = identity
|
identities[address] = identity
|
||||||
})
|
})
|
||||||
|
self.emit('update', _getState())
|
||||||
}
|
}
|
||||||
|
|
||||||
// foreach in identities, update balance + nonce
|
// foreach in identities, update balance + nonce
|
||||||
function updateIdentities(cb){
|
IdentityManager.prototype.updateIdentities = function(cb){
|
||||||
|
var self = this
|
||||||
cb = cb || function(){}
|
cb = cb || function(){}
|
||||||
if (!isUnlocked()) return cb(new Error('Not unlocked.'))
|
if (!isUnlocked()) return cb(new Error('Not unlocked.'))
|
||||||
var addresses = Object.keys(identities)
|
var addresses = Object.keys(identities)
|
||||||
async.map(addresses, updateIdentity, cb)
|
async.map(addresses, self.updateIdentity.bind(self), cb)
|
||||||
}
|
}
|
||||||
|
|
||||||
// gets latest info from the network for the identity
|
// gets latest info from the network for the identity
|
||||||
function updateIdentity(address, cb){
|
IdentityManager.prototype.updateIdentity = function(address, cb){
|
||||||
|
var self = this
|
||||||
async.parallel([
|
async.parallel([
|
||||||
getAccountBalance.bind(null, address),
|
getAccountBalance.bind(null, address),
|
||||||
getTxCount.bind(null, address),
|
getTxCount.bind(null, address),
|
||||||
@ -166,6 +144,8 @@ function updateIdentity(address, cb){
|
|||||||
var identity = identities[address]
|
var identity = identities[address]
|
||||||
identity.balance = result[0]
|
identity.balance = result[0]
|
||||||
identity.txCount = result[1]
|
identity.txCount = result[1]
|
||||||
|
console.log('updated!')
|
||||||
|
self.emit('update', _getState())
|
||||||
cb()
|
cb()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ function PortDuplexStream(port){
|
|||||||
})
|
})
|
||||||
this._port = port
|
this._port = port
|
||||||
port.onMessage.addListener(this._onMessage.bind(this))
|
port.onMessage.addListener(this._onMessage.bind(this))
|
||||||
|
port.onDisconnect.addListener(this._onDisconnect.bind(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
// private
|
// private
|
||||||
@ -21,6 +22,15 @@ PortDuplexStream.prototype._onMessage = function(msg){
|
|||||||
this.push(msg)
|
this.push(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PortDuplexStream.prototype._onDisconnect = function(msg){
|
||||||
|
// console.log('PortDuplexStream - saw message', msg)
|
||||||
|
try {
|
||||||
|
this.end()
|
||||||
|
} catch(err){
|
||||||
|
this.emit('error', err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// stream plumbing
|
// stream plumbing
|
||||||
|
|
||||||
PortDuplexStream.prototype._read = noop
|
PortDuplexStream.prototype._read = noop
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
const EventEmitter = require('events').EventEmitter
|
||||||
const Dnode = require('dnode')
|
const Dnode = require('dnode')
|
||||||
const MetaMaskUi = require('metamask-ui')
|
const MetaMaskUi = require('metamask-ui')
|
||||||
const MetaMaskUiCss = require('metamask-ui/css')
|
const MetaMaskUiCss = require('metamask-ui/css')
|
||||||
@ -8,11 +9,18 @@ const PortStream = require('./lib/port-stream.js')
|
|||||||
// setup communication with background
|
// setup communication with background
|
||||||
var pluginPort = chrome.runtime.connect({name: 'popup'})
|
var pluginPort = chrome.runtime.connect({name: 'popup'})
|
||||||
var duplex = new PortStream(pluginPort)
|
var duplex = new PortStream(pluginPort)
|
||||||
|
var eventEmitter = new EventEmitter()
|
||||||
var background = Dnode({
|
var background = Dnode({
|
||||||
// setUnconfirmedTxs: setUnconfirmedTxs,
|
// setUnconfirmedTxs: setUnconfirmedTxs,
|
||||||
|
sendUpdate: function(state){
|
||||||
|
eventEmitter.emit('update', state)
|
||||||
|
},
|
||||||
})
|
})
|
||||||
duplex.pipe(background).pipe(duplex)
|
duplex.pipe(background).pipe(duplex)
|
||||||
background.once('remote', setupApp)
|
background.once('remote', function(accountManager){
|
||||||
|
accountManager.on = eventEmitter.on.bind(eventEmitter)
|
||||||
|
setupApp(accountManager)
|
||||||
|
})
|
||||||
|
|
||||||
// setup app
|
// setup app
|
||||||
var css = MetaMaskUiCss()
|
var css = MetaMaskUiCss()
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "^1.4.0",
|
"async": "^1.4.0",
|
||||||
"dnode": "^1.2.2",
|
"dnode": "^1.2.2",
|
||||||
|
"end-of-stream": "^1.1.0",
|
||||||
"eth-lightwallet": "^1.0.1",
|
"eth-lightwallet": "^1.0.1",
|
||||||
"ethereumjs-tx": "^0.6.7",
|
"ethereumjs-tx": "^0.6.7",
|
||||||
"ethereumjs-util": "^1.3.5",
|
"ethereumjs-util": "^1.3.5",
|
||||||
|
Loading…
Reference in New Issue
Block a user