diff options
author | frankiebee <frankie.diamond@gmail.com> | 2017-03-10 10:24:41 +0800 |
---|---|---|
committer | frankiebee <frankie.diamond@gmail.com> | 2017-03-10 10:24:41 +0800 |
commit | 9f3445252c766053b7a773d75dceb1c1bbfdc6f5 (patch) | |
tree | 9722cb40e5799cbda5a356d79ff6737254c50b9f /library/sw-core.js | |
parent | e602cb13c5266516aadeb1c6908575d43afe4164 (diff) | |
download | tangerine-wallet-browser-9f3445252c766053b7a773d75dceb1c1bbfdc6f5.tar tangerine-wallet-browser-9f3445252c766053b7a773d75dceb1c1bbfdc6f5.tar.gz tangerine-wallet-browser-9f3445252c766053b7a773d75dceb1c1bbfdc6f5.tar.bz2 tangerine-wallet-browser-9f3445252c766053b7a773d75dceb1c1bbfdc6f5.tar.lz tangerine-wallet-browser-9f3445252c766053b7a773d75dceb1c1bbfdc6f5.tar.xz tangerine-wallet-browser-9f3445252c766053b7a773d75dceb1c1bbfdc6f5.tar.zst tangerine-wallet-browser-9f3445252c766053b7a773d75dceb1c1bbfdc6f5.zip |
put background in service worker
Diffstat (limited to 'library/sw-core.js')
-rw-r--r-- | library/sw-core.js | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/library/sw-core.js b/library/sw-core.js new file mode 100644 index 000000000..e018dff0f --- /dev/null +++ b/library/sw-core.js @@ -0,0 +1,203 @@ +global.window = global +const SWGlobal = self +const urlUtil = require('url') +const endOfStream = require('end-of-stream') +const asyncQ = require('async-q') +const pipe = require('pump') +// const ParentStream = require('iframe-stream').ParentStream +const setupMultiplex = require('../app/scripts/lib/stream-utils.js').setupMultiplex +const PortStream = require('../app/scripts/lib/port-stream.js') +// const notification = require('../app/scripts/lib/notifications.js') + +const DbController = require('./controllers/index-db-controller') + +// // all this will go in service worker +const MetamaskController = require('../app/scripts/metamask-controller') +// const extension = require('../app/scripts/lib/extension') +// const LocalStorageStore = require('obs-store/lib/localStorage') +const storeTransform = require('obs-store/lib/transform') +const Migrator = require('../app/scripts/lib/migrator/') +const migrations = require('../app/scripts/migrations/') +const firstTimeState = require('../app/scripts/first-time-state') + +const STORAGE_KEY = 'metamask-config' +const METAMASK_DEBUG = 'GULP_METAMASK_DEBUG' +let popupIsOpen = false + +self.addEventListener('install', function(event) { + event.waitUntil(self.skipWaiting()) +}) +self.addEventListener('activate', function(event) { + event.waitUntil(self.clients.claim()) +}) + +self.onsync = function (syncEvent) { +// What is done when a sync even is fired + console.log('inside:sync') + var focused + self.clients.matchAll() + .then(clients => { + clients.forEach(function(client) { + + }) + }) +} + + + +console.log('inside:open') + + +// // state persistence +let diskStore +const dbController = new DbController({ + key: STORAGE_KEY, + global: self, + version: 6, + initialState: { + dataStore: { + meta: 2, + data: firstTimeState, + }, + }, +}) +asyncQ.waterfall([ + () => loadStateFromPersistence(), + (initState) => setupController(initState), +]) +.then(() => console.log('MetaMask initialization complete.')) +.catch((err) => { + console.log('WHILE SETTING UP:') + console.error(err) +}) + +// initialization flow + +// +// State and Persistence +// +function loadStateFromPersistence() { + // migrations + let migrator = new Migrator({ migrations }) + const initialState = migrator.generateInitialState(firstTimeState) + dbController.initialState = initialState + return dbController.open() + .then((stuff) => { + return dbController.get('dataStore') + }) + .then((data) => { + if (!data) { + return dbController._add('dataStore', initialState) + .then(() => dbController.get('dataStore')) + .then((versionedData) => Promise.resolve(versionedData.data)) + } + + return Promise.resolve(data.data) + }) + .catch((err) => console.error(err)) + + // return asyncQ.waterfall([ + // // read from disk + // () => Promise.resolve(diskStore || initialState), + // // migrate data + // (versionedData) => migrator.migrateData(versionedData), + // // write to disk + // (versionedData) => { + // diskStore.put(versionedData) + // return Promise.resolve(versionedData) + // }, + // // resolve to just data + // (versionedData) => Promise.resolve(versionedData.data), + // ]) +} + +function setupController (initState, client) { + + // + // MetaMask Controller + // + + const controller = new MetamaskController({ + // User confirmation callbacks: + showUnconfirmedMessage: triggerUi, + unlockAccountMessage: triggerUi, + showUnapprovedTx: triggerUi, + // initial state + initState, + }) + global.metamaskController = controller + + // setup state persistence + pipe( + controller.store, + storeTransform(versionifyData), + diskStore + ) + + function versionifyData(state) { + let versionedData = diskStore.getState() + versionedData.data = state + return versionedData + } + + // + // connect to other contexts + // + var connectionStream //= new ParentStream() + SWGlobal.onmessage = (message) => { + + debugger + connectRemote(connectionStream, message.origin) + } + + connectRemote(connectionStream, client.origin) + + function connectRemote (connectionStream, originDomain) { + var isMetaMaskInternalProcess = (originDomain === 'http://localhost:9001') + if (isMetaMaskInternalProcess) { + // communication with popup + controller.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 + controller.setupProviderConnection(mx.createStream('provider'), originDomain) + } + // + // User Interface setup + // + return Promise.resolve() + +} + +// // // +// // // Etc... +// // // + +// // // popup trigger +function triggerUi () { + if (!popupIsOpen) notification.show() +} + +// function getParentHref(){ +// try { +// var parentLocation = window.parent.location +// return parentLocation.hostname + ':' + parentLocation.port +// } catch (err) { +// return 'unknown' +// } +// } |