parent
f1986d7a37
commit
5479509618
@ -0,0 +1,11 @@ |
||||
<!doctype html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<title>MetaMask Notification</title> |
||||
</head> |
||||
<body> |
||||
<div id="app-content"></div> |
||||
<script src="./scripts/notification.js" type="text/javascript" charset="utf-8"></script> |
||||
</body> |
||||
</html> |
@ -0,0 +1,85 @@ |
||||
const url = require('url') |
||||
const EventEmitter = require('events').EventEmitter |
||||
const async = require('async') |
||||
const Dnode = require('dnode') |
||||
const Web3 = require('web3') |
||||
const MetaMaskNotification = require('../../ui/notification') |
||||
const MetaMaskUiCss = require('../../ui/css') |
||||
const injectCss = require('inject-css') |
||||
const PortStream = require('./lib/port-stream.js') |
||||
const StreamProvider = require('web3-stream-provider') |
||||
const setupMultiplex = require('./lib/stream-utils.js').setupMultiplex |
||||
const extension = require('./lib/extension') |
||||
|
||||
// setup app
|
||||
var css = MetaMaskUiCss() |
||||
injectCss(css) |
||||
|
||||
async.parallel({ |
||||
currentDomain: getCurrentDomain, |
||||
accountManager: connectToAccountManager, |
||||
}, setupApp) |
||||
|
||||
function connectToAccountManager (cb) { |
||||
// setup communication with background
|
||||
var pluginPort = extension.runtime.connect({name: 'notification'}) |
||||
var portStream = new PortStream(pluginPort) |
||||
// setup multiplexing
|
||||
var mx = setupMultiplex(portStream) |
||||
// connect features
|
||||
setupControllerConnection(mx.createStream('controller'), cb) |
||||
setupWeb3Connection(mx.createStream('provider')) |
||||
} |
||||
|
||||
function setupWeb3Connection (stream) { |
||||
var remoteProvider = new StreamProvider() |
||||
remoteProvider.pipe(stream).pipe(remoteProvider) |
||||
stream.on('error', console.error.bind(console)) |
||||
remoteProvider.on('error', console.error.bind(console)) |
||||
global.web3 = new Web3(remoteProvider) |
||||
} |
||||
|
||||
function setupControllerConnection (stream, cb) { |
||||
var eventEmitter = new EventEmitter() |
||||
var background = Dnode({ |
||||
sendUpdate: function (state) { |
||||
eventEmitter.emit('update', state) |
||||
}, |
||||
}) |
||||
stream.pipe(background).pipe(stream) |
||||
background.once('remote', function (accountManager) { |
||||
// setup push events
|
||||
accountManager.on = eventEmitter.on.bind(eventEmitter) |
||||
cb(null, accountManager) |
||||
}) |
||||
} |
||||
|
||||
function getCurrentDomain (cb) { |
||||
const unknown = '<unknown>' |
||||
if (!extension.tabs) return cb(null, unknown) |
||||
extension.tabs.query({active: true, currentWindow: true}, function (results) { |
||||
var activeTab = results[0] |
||||
var currentUrl = activeTab && activeTab.url |
||||
var currentDomain = url.parse(currentUrl).host |
||||
if (!currentUrl) { |
||||
return cb(null, unknown) |
||||
} |
||||
cb(null, currentDomain) |
||||
}) |
||||
} |
||||
|
||||
function setupApp (err, opts) { |
||||
if (err) { |
||||
alert(err.stack) |
||||
throw err |
||||
} |
||||
|
||||
var container = document.getElementById('app-content') |
||||
|
||||
MetaMaskNotification({ |
||||
container: container, |
||||
accountManager: opts.accountManager, |
||||
currentDomain: opts.currentDomain, |
||||
networkVersion: opts.networkVersion, |
||||
}) |
||||
} |
@ -0,0 +1,52 @@ |
||||
const render = require('react-dom').render |
||||
const h = require('react-hyperscript') |
||||
const Root = require('./app/root') |
||||
const actions = require('./app/actions') |
||||
const configureStore = require('./app/store') |
||||
|
||||
module.exports = launchApp |
||||
|
||||
function launchApp (opts) { |
||||
var accountManager = opts.accountManager |
||||
actions._setAccountManager(accountManager) |
||||
|
||||
// check if we are unlocked first
|
||||
accountManager.getState(function (err, metamaskState) { |
||||
if (err) throw err |
||||
startApp(metamaskState, accountManager, opts) |
||||
}) |
||||
} |
||||
|
||||
function startApp (metamaskState, accountManager, opts) { |
||||
// parse opts
|
||||
var store = configureStore({ |
||||
|
||||
// metamaskState represents the cross-tab state
|
||||
metamask: metamaskState, |
||||
|
||||
// appState represents the current tab's popup state
|
||||
appState: { |
||||
currentDomain: opts.currentDomain, |
||||
}, |
||||
|
||||
// Which blockchain we are using:
|
||||
networkVersion: opts.networkVersion, |
||||
}) |
||||
|
||||
// if unconfirmed txs, start on txConf page
|
||||
if (Object.keys(metamaskState.unconfTxs || {}).length) { |
||||
store.dispatch(actions.showConfTxPage()) |
||||
} |
||||
|
||||
accountManager.on('update', function (metamaskState) { |
||||
store.dispatch(actions.updateMetamaskState(metamaskState)) |
||||
}) |
||||
|
||||
// start app
|
||||
render( |
||||
h(Root, { |
||||
// inject initial state
|
||||
store: store, |
||||
} |
||||
), opts.container) |
||||
} |
Loading…
Reference in new issue