aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/notification.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/scripts/notification.js')
-rw-r--r--app/scripts/notification.js85
1 files changed, 85 insertions, 0 deletions
diff --git a/app/scripts/notification.js b/app/scripts/notification.js
new file mode 100644
index 000000000..90c00b32d
--- /dev/null
+++ b/app/scripts/notification.js
@@ -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,
+ })
+}