OSDN Git Service

update the basic vuex store structure
[bytom/Byone.git] / src / background.js
index 9f99837..48191d7 100644 (file)
@@ -1,14 +1,43 @@
 import { LocalStream } from 'extension-streams'
 import InternalMessage from '@/messages/internal'
 import * as MsgTypes from './messages/types'
+import NotificationService from './services/NotificationService'
+import StorageService from './services/StorageService'
+import Prompt from './prompts/Prompt';
+import * as PromptTypes from './prompts/PromptTypes'
+
+import Error from './utils/errors/Error'
+import accountAction from "@/models/account";
+import bytom from "@/models/bytom";
+
+let prompt = null;
 
 export default class Background {
   constructor() {
     this.setupInternalMessaging()
+    this.setupBytom()
+  }
+
+  setupBytom(){
+    const network = localStorage.bytomNet||'mainnet'
+    bytom.setupNet(network)
+
+    window.addEventListener('storage', storageEventHandler, false);
+    function storageEventHandler(evt){
+      if(evt.key === 'bytomNet'){
+        bytom.setupNet( evt.newValue )
+        chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
+          chrome.tabs.sendMessage(tabs[0].id, {action: "updateNetAndAccounts"}, function(response) {});
+        });
+      }else if(evt.key === 'currentAccount'){
+        chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
+          chrome.tabs.sendMessage(tabs[0].id, {action: "updateAccount"}, function(response) {});
+        });
+      }
+    }
   }
 
   setupInternalMessaging() {
-    console.log('messaging')
     LocalStream.watch((request, sendResponse) => {
       console.log(request)
       const message = InternalMessage.fromJson(request)
@@ -24,46 +53,235 @@ export default class Background {
       case MsgTypes.ADVTRANSFER:
         this.advancedTransfer(sendResponse, message.payload)
         break
+      case MsgTypes.SEND:
+        this.send(sendResponse, message.payload)
+        break
+      case MsgTypes.SIGNMESSAGE:
+        this.signMessage(sendResponse, message.payload)
+        break
+      case MsgTypes.REQUEST_CURRENT_ACCOUNT:
+        this.requestCurrentAccount(sendResponse, message.payload)
+        break
+      case MsgTypes.REQUEST_CURRENT_NETWORK:
+        this.requestCurrentNetwork(sendResponse)
+        break
+      case MsgTypes.ENABLE:
+        Background.authenticate(sendResponse, message.payload)
+        break
+      case MsgTypes.SET_PROMPT:
+        Background.setPrompt(sendResponse, message.payload);
+        break;
+      case MsgTypes.GET_PROMPT:
+        Background.getPrompt(sendResponse);
+        break;
+      case MsgTypes.LOAD:
+        Background.load(sendResponse);
+        break;
+      case MsgTypes.UPDATE:
+        Background.update(sendResponse, message.payload);
+        break;
     }
   }
 
+  static setPrompt(sendResponse, notification){
+    prompt = notification;
+    sendResponse(true);
+  }
+
+  static getPrompt(sendResponse){
+    sendResponse(prompt);
+  }
+
+  signMessage(sendResponse, payload) {
+    if(payload.address === undefined){
+      sendResponse(Error.typeMissed('address'));
+      return false;
+    }
+    if(payload.message === undefined){
+      sendResponse(Error.typeMissed('message'));
+      return false;
+    }
+
+    NotificationService.open(new Prompt(PromptTypes.REQUEST_SIGN, '', payload ,approved => {
+     sendResponse(approved);
+    }));
+  }
+
   transfer(sendResponse, payload) {
     var promptURL = chrome.extension.getURL('pages/prompt.html')
-    var queryString = new URLSearchParams(payload).toString()
+    var requestBody = payload
+    requestBody.type = "popup"
+    var queryString = new URLSearchParams(requestBody).toString()
     console.log(promptURL, queryString)
-    chrome.windows.create(
+
+    if(requestBody.from === undefined){
+      sendResponse(Error.typeMissed('from'));
+      return false;
+    }
+    if(requestBody.to === undefined){
+      sendResponse(Error.typeMissed('to'));
+      return false;
+    }
+    if(requestBody.asset === undefined){
+      sendResponse(Error.typeMissed('asset'));
+      return false;
+    }
+    if(requestBody.amount === undefined){
+      sendResponse(Error.typeMissed('amount'));
+      return false;
+    }
+
+
+      chrome.windows.create(
       {
         url: `${promptURL}#transfer?${queryString}`,
         type: 'popup',
-        width: 350,
+        width: 360,
         height: 623,
         top: 0,
         left: 0
       },
-      () => {
-        sendResponse(true)
+      (window) => {
+        chrome.runtime.onMessage.addListener(function(request, sender) {
+          if(sender.tab.windowId === window.id){
+            switch (request.method){
+              case 'transfer':
+                if (request.action === 'success'){
+                  sendResponse(request.message);
+                  return true;
+                } else if (request.action === 'reject'){
+                  sendResponse(request.message);
+                  return false;
+                }
+            }
+          }
+        });
+
+        chrome.windows.onRemoved.addListener(function(windowId){
+          if(windowId === window.id) {
+            sendResponse(Error.promptClosedWithoutAction());
+            return false;
+          }
+        });
       }
     )
   }
 
   advancedTransfer(sendResponse, payload) {
-    var promptURL = chrome.extension.getURL('pages/prompt.html')
-    var queryString = 'object='+JSON.stringify(payload)
-    console.log(promptURL, queryString)
-    chrome.windows.create(
-      {
-        url: `${promptURL}#advancedTransfer?${queryString}`,
-        type: 'popup',
-        width: 350,
-        height: 623,
-        top: 0,
-        left: 0
-      },
-      () => {
-        sendResponse(true)
+
+    if(payload.input === undefined){
+      sendResponse(Error.typeMissed('input'));
+      return false;
+    }
+    if(payload.output === undefined){
+      sendResponse(Error.typeMissed('output'));
+      return false;
+    }
+    if(payload.gas === undefined){
+      sendResponse(Error.typeMissed('gas'));
+      return false;
+    }
+
+    NotificationService.open(new Prompt(PromptTypes.REQUEST_ADVANCED_TRANSFER, '', payload ,approved => {
+      sendResponse(approved);
+    }));
+
+  }
+
+  requestCurrentAccount(sendResponse, payload){
+    Background.load(bytom => {
+      const domain = payload.domain;
+      if(bytom.settings.domains.find(_domain => _domain === domain)) {
+        const currentAccount = JSON.parse(localStorage.currentAccount)
+        delete(currentAccount['label'])
+        delete(currentAccount['net'])
+        currentAccount['accountId'] = currentAccount['guid']
+        delete(currentAccount['guid'])
+        delete(currentAccount['balance'])
+
+        sendResponse(currentAccount);
+      } else{
+        sendResponse(null);
+        return false;
       }
-    )
+    })
+
+  }
+
+  requestCurrentNetwork(sendResponse){
+    sendResponse(localStorage.bytomNet)
+  }
+
+  send(sendResponse, payload) {
+    const action = payload.action
+    if(action){
+      let promise
+      switch (action){
+        case 'listAllAccount':
+          promise = accountAction.list()
+          break
+      }
+      if(promise){
+        promise.then(resp =>
+        {
+          sendResponse(resp)
+        })
+      }
+    }
   }
+
+  /***
+   * Returns the saved instance of Bytom from the storage
+   * @param sendResponse - Delegating response handler
+   * @returns {Bytom}
+   */
+  static load(sendResponse){
+    StorageService.get().then(bytom => {
+      sendResponse(bytom)
+    })
+  }
+
+  /***
+   * Updates the Scatter instance inside persistent storage
+   * @param sendResponse - Delegating response handler
+   * @param bytom - The updated cleartext Scatter instance
+   * @returns {boolean}
+   */
+  static update(sendResponse, bytom){
+    StorageService.save(bytom).then(saved => {
+      sendResponse(bytom)
+    })
+  }
+
+  static authenticate(sendResponse, payload){
+    Background.load(bytom => {
+      const domain = payload.domain;
+      const currentAccount = JSON.parse(localStorage.currentAccount)
+      delete(currentAccount['label'])
+      delete(currentAccount['net'])
+      currentAccount['accountId'] = currentAccount['guid']
+      delete(currentAccount['guid'])
+      delete(currentAccount['balance'])
+
+      if(bytom.settings.domains.find(_domain => _domain === domain)) {
+        sendResponse(currentAccount);
+      } else{
+        NotificationService.open(new Prompt(PromptTypes.REQUEST_AUTH, payload.domain, {}, approved => {
+          if(approved === false || approved.hasOwnProperty('isError')) sendResponse(approved);
+          else {
+            bytom.settings.domains.unshift(domain);
+            if(approved === true){
+              this.update(() => sendResponse(currentAccount), bytom);
+            }else{
+              this.update(() => sendResponse(approved), bytom);
+            }
+          }
+        }));
+      }
+    })
+  }
+
+
 }
 
 new Background()