1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

popup - breakout popup-core

This commit is contained in:
kumavis 2016-09-12 23:28:07 -07:00
parent ed11ab6d18
commit b4e3b83f04
2 changed files with 71 additions and 61 deletions

63
app/scripts/popup-core.js Normal file
View File

@ -0,0 +1,63 @@
const EventEmitter = require('events').EventEmitter
const Dnode = require('dnode')
const Web3 = require('web3')
const MetaMaskUi = require('../../ui')
const StreamProvider = require('web3-stream-provider')
const setupMultiplex = require('./lib/stream-utils.js').setupMultiplex
module.exports = initializePopup
function initializePopup(connectionStream){
// setup app
connectToAccountManager(connectionStream, setupApp)
}
function connectToAccountManager (connectionStream, cb) {
// setup communication with background
// setup multiplexing
var mx = setupMultiplex(connectionStream)
// connect features
setupControllerConnection(mx.createStream('controller'), cb)
setupWeb3Connection(mx.createStream('provider'))
}
function setupWeb3Connection (connectionStream) {
var providerStream = new StreamProvider()
providerStream.pipe(connectionStream).pipe(providerStream)
connectionStream.on('error', console.error.bind(console))
providerStream.on('error', console.error.bind(console))
global.web3 = new Web3(providerStream)
}
function setupControllerConnection (connectionStream, cb) {
// this is a really sneaky way of adding EventEmitter api
// to a bi-directional dnode instance
var eventEmitter = new EventEmitter()
var accountManagerDnode = Dnode({
sendUpdate: function (state) {
eventEmitter.emit('update', state)
},
})
connectionStream.pipe(accountManagerDnode).pipe(connectionStream)
accountManagerDnode.once('remote', function (accountManager) {
// setup push events
accountManager.on = eventEmitter.on.bind(eventEmitter)
cb(null, accountManager)
})
}
function setupApp (err, accountManager) {
if (err) {
alert(err.stack)
throw err
}
var container = document.getElementById('app-content')
MetaMaskUi({
container: container,
accountManager: accountManager,
})
}

View File

@ -1,75 +1,22 @@
const EventEmitter = require('events').EventEmitter
const Dnode = require('dnode')
const Web3 = require('web3')
const MetaMaskUi = require('../../ui')
const MetaMaskUiCss = require('../../ui/css')
const injectCss = require('inject-css') const injectCss = require('inject-css')
const MetaMaskUiCss = require('../../ui/css')
const PortStream = require('./lib/port-stream.js') const PortStream = require('./lib/port-stream.js')
const StreamProvider = require('web3-stream-provider') const startPopup = require('./popup-core')
const setupMultiplex = require('./lib/stream-utils.js').setupMultiplex
const isPopupOrNotification = require('./lib/is-popup-or-notification') const isPopupOrNotification = require('./lib/is-popup-or-notification')
const extension = require('./lib/extension') const extension = require('./lib/extension')
const notification = require('./lib/notifications') const notification = require('./lib/notifications')
// setup app
var css = MetaMaskUiCss() var css = MetaMaskUiCss()
injectCss(css) injectCss(css)
connectToAccountManager(setupApp)
function connectToAccountManager (cb) {
// setup communication with background
var name = isPopupOrNotification() var name = isPopupOrNotification()
closePopupIfOpen(name) closePopupIfOpen(name)
window.METAMASK_UI_TYPE = name window.METAMASK_UI_TYPE = name
var pluginPort = extension.runtime.connect({ name }) var pluginPort = extension.runtime.connect({ name })
var portStream = new PortStream(pluginPort) var portStream = new PortStream(pluginPort)
// setup multiplexing
var mx = setupMultiplex(portStream)
// connect features
setupControllerConnection(mx.createStream('controller'), cb)
setupWeb3Connection(mx.createStream('provider'))
}
function setupWeb3Connection (connectionStream) { startPopup(portStream)
var providerStream = new StreamProvider()
providerStream.pipe(connectionStream).pipe(providerStream)
connectionStream.on('error', console.error.bind(console))
providerStream.on('error', console.error.bind(console))
global.web3 = new Web3(providerStream)
}
function setupControllerConnection (connectionStream, cb) {
// this is a really sneaky way of adding EventEmitter api
// to a bi-directional dnode instance
var eventEmitter = new EventEmitter()
var accountManagerDnode = Dnode({
sendUpdate: function (state) {
eventEmitter.emit('update', state)
},
})
connectionStream.pipe(accountManagerDnode).pipe(connectionStream)
accountManagerDnode.once('remote', function (accountManager) {
// setup push events
accountManager.on = eventEmitter.on.bind(eventEmitter)
cb(null, accountManager)
})
}
function setupApp (err, accountManager) {
if (err) {
alert(err.stack)
throw err
}
var container = document.getElementById('app-content')
MetaMaskUi({
container: container,
accountManager: accountManager,
})
}
function closePopupIfOpen(name) { function closePopupIfOpen(name) {
if (name !== 'notification') { if (name !== 'notification') {