OSDN Git Service

update the basic vuex store structure
[bytom/Byone.git] / src / background.js
index e950ff5..48191d7 100644 (file)
 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() {
     LocalStream.watch((request, sendResponse) => {
       console.log(request)
-      // const message = InternalMessage.fromJson(request)
-      // this.dispatchMessage(sendResponse, message)
+      const message = InternalMessage.fromJson(request)
+      this.dispatchMessage(sendResponse, message)
     })
   }
 
   dispatchMessage(sendResponse, message) {
     switch (message.type) {
-      case InternalMessageTypes.SET_SEED:
-        // Background.setSeed(sendResponse, message.payload)
+      case MsgTypes.TRANSFER:
+        this.transfer(sendResponse, message.payload)
+        break
+      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);
+    }));
   }
 
-  static transfer(sendResponse) {
-    var optionsUrl = chrome.extension.getURL('pages/prompt.html')
-    console.log(optionsUrl)
-    chrome.tabs.query({ url: optionsUrl }, tabs => {
-      console.log(22, tabs)
+  transfer(sendResponse, payload) {
+    var promptURL = chrome.extension.getURL('pages/prompt.html')
+    var requestBody = payload
+    requestBody.type = "popup"
+    var queryString = new URLSearchParams(requestBody).toString()
+    console.log(promptURL, queryString)
+
+    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: optionsUrl, type: 'popup', width: 350, height: 625, left: 0 },
-        () => {
-          chrome.extension.sendMessage(
-            { cmd: '来自前台页面的主动调用' },
-            function(response) {
-              console.log(123, response)
+      {
+        url: `${promptURL}#transfer?${queryString}`,
+        type: 'popup',
+        width: 360,
+        height: 623,
+        top: 0,
+        left: 0
+      },
+      (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) {
+
+    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);
+            }
+          }
+        }));
+      }
+    })
+  }
+
+
 }
 
-const background = new Background()
+new Background()