const urlUtil = require('url') const extend = require('xtend') const Dnode = require('dnode') const eos = require('end-of-stream') const ParentStream = require('iframe-stream').ParentStream const PortStream = require('../app/scripts/lib/port-stream.js') const notification = require('../app/scripts/lib/notifications.js') const messageManager = require('../app/scripts/lib/message-manager') const setupMultiplex = require('../app/scripts/lib/stream-utils.js').setupMultiplex const MetamaskController = require('../app/scripts/metamask-controller') const extension = require('../app/scripts/lib/extension') const STORAGE_KEY = 'metamask-config' initializeZeroClient() function initializeZeroClient() { const controller = new MetamaskController({ // User confirmation callbacks: showUnconfirmedMessage, unlockAccountMessage, showUnconfirmedTx, // Persistence Methods: setData, loadData, }) const idStore = controller.idStore function unlockAccountMessage () { console.log('notif stub - unlockAccountMessage') } function showUnconfirmedMessage (msgParams, msgId) { console.log('notif stub - showUnconfirmedMessage') } function showUnconfirmedTx (txParams, txData, onTxDoneCb) { console.log('notif stub - showUnconfirmedTx') } // // connect to other contexts // var connectionStream = new ParentStream() connectRemote(connectionStream, getParentHref()) function connectRemote (connectionStream, originDomain) { var isMetaMaskInternalProcess = (originDomain === '127.0.0.1:9001') if (isMetaMaskInternalProcess) { // communication with popup setupTrustedCommunication(connectionStream, 'MetaMask') } else { // communication with page setupUntrustedCommunication(connectionStream, originDomain) } } function setupUntrustedCommunication (connectionStream, originDomain) { // setup multiplexing var mx = setupMultiplex(connectionStream) // connect features controller.setupProviderConnection(mx.createStream('provider'), originDomain) controller.setupPublicConfig(mx.createStream('publicConfig')) } function setupTrustedCommunication (connectionStream, originDomain) { // setup multiplexing var mx = setupMultiplex(connectionStream) // connect features setupControllerConnection(mx.createStream('controller')) controller.setupProviderConnection(mx.createStream('provider'), originDomain) } // // remote features // function setupControllerConnection (stream) { controller.stream = stream var api = controller.getApi() var dnode = Dnode(api) stream.pipe(dnode).pipe(stream) dnode.on('remote', (remote) => { // push updates to popup controller.ethStore.on('update', controller.sendUpdate.bind(controller)) controller.listeners.push(remote) idStore.on('update', controller.sendUpdate.bind(controller)) // teardown on disconnect eos(stream, () => { controller.ethStore.removeListener('update', controller.sendUpdate.bind(controller)) }) }) } function loadData () { var oldData = getOldStyleData() var newData try { newData = JSON.parse(window.localStorage[STORAGE_KEY]) } catch (e) {} var data = extend({ meta: { version: 0, }, data: { config: { provider: { type: 'testnet', }, }, }, }, oldData || null, newData || null) return data } function getOldStyleData () { var config, wallet, seedWords var result = { meta: { version: 0 }, data: {}, } try { config = JSON.parse(window.localStorage['config']) result.data.config = config } catch (e) {} try { wallet = JSON.parse(window.localStorage['lightwallet']) result.data.wallet = wallet } catch (e) {} try { seedWords = window.localStorage['seedWords'] result.data.seedWords = seedWords } catch (e) {} return result } function setData (data) { window.localStorage[STORAGE_KEY] = JSON.stringify(data) } function getParentHref(){ try { var parentLocation = window.parent.location return parentLocation.hostname + ':' + parentLocation.port } catch (err) { return 'unknown' } } }