1 import { LocalStream } from 'extension-streams'
2 import InternalMessage from '@/messages/internal'
3 import * as MsgTypes from './messages/types'
5 import Error from './utils/errors/Error'
6 import accountAction from "@/models/account";
7 import bytom from "@/models/bytom";
9 export default class Background {
11 this.setupInternalMessaging()
16 const network = localStorage.bytomNet||'mainnet'
17 bytom.setupNet(network)
19 window.addEventListener('storage', storageEventHandler, false);
20 function storageEventHandler(evt){
21 if(evt.key === 'bytomNet'){
22 bytom.setupNet( evt.newValue )
23 chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
24 chrome.tabs.sendMessage(tabs[0].id, {action: "updateNetAndAccounts"}, function(response) {});
26 }else if(evt.key === 'currentAccount'){
27 chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
28 chrome.tabs.sendMessage(tabs[0].id, {action: "updateAccount"}, function(response) {});
34 setupInternalMessaging() {
35 LocalStream.watch((request, sendResponse) => {
37 const message = InternalMessage.fromJson(request)
38 this.dispatchMessage(sendResponse, message)
42 dispatchMessage(sendResponse, message) {
43 switch (message.type) {
44 case MsgTypes.TRANSFER:
45 this.transfer(sendResponse, message.payload)
47 case MsgTypes.ADVTRANSFER:
48 this.advancedTransfer(sendResponse, message.payload)
51 this.send(sendResponse, message.payload)
53 case MsgTypes.SIGNMESSAGE:
54 this.signMessage(sendResponse, message.payload)
56 case MsgTypes.REQUEST_CURRENT_ACCOUNT:
57 this.requestCurrentAccount(sendResponse)
59 case MsgTypes.REQUEST_CURRENT_NETWORK:
60 this.requestCurrentNetwork(sendResponse)
62 case MsgTypes.REQUEST_ACCOUNT_LIST:
63 this.requestAccountList(sendResponse)
68 signMessage(sendResponse, payload) {
69 var promptURL = chrome.extension.getURL('pages/prompt.html')
70 var requestBody = payload
71 var queryString = new URLSearchParams(requestBody).toString()
72 console.log(promptURL, queryString)
74 if(requestBody.address === undefined){
75 sendResponse(Error.typeMissed('address'));
78 if(requestBody.message === undefined){
79 sendResponse(Error.typeMissed('message'));
83 chrome.windows.create(
85 url: `${promptURL}#signMessage?${queryString}`,
93 chrome.runtime.onMessage.addListener(function(request, sender) {
94 if(sender.tab.windowId === window.id){
95 switch (request.method){
97 if (request.action === 'success'){
98 sendResponse(request.message);
100 } else if (request.action === 'reject'){
101 sendResponse(request.message);
108 chrome.windows.onRemoved.addListener(function(windowId){
109 if(windowId === window.id) {
110 sendResponse(Error.promptClosedWithoutAction());
118 transfer(sendResponse, payload) {
119 var promptURL = chrome.extension.getURL('pages/prompt.html')
120 var requestBody = payload
121 requestBody.type = "popup"
122 var queryString = new URLSearchParams(requestBody).toString()
123 console.log(promptURL, queryString)
125 if(requestBody.from === undefined){
126 sendResponse(Error.typeMissed('from'));
129 if(requestBody.to === undefined){
130 sendResponse(Error.typeMissed('to'));
133 if(requestBody.asset === undefined){
134 sendResponse(Error.typeMissed('asset'));
137 if(requestBody.amount === undefined){
138 sendResponse(Error.typeMissed('amount'));
143 chrome.windows.create(
145 url: `${promptURL}#transfer?${queryString}`,
153 chrome.runtime.onMessage.addListener(function(request, sender) {
154 if(sender.tab.windowId === window.id){
155 switch (request.method){
157 if (request.action === 'success'){
158 sendResponse(request.message);
160 } else if (request.action === 'reject'){
161 sendResponse(request.message);
168 chrome.windows.onRemoved.addListener(function(windowId){
169 if(windowId === window.id) {
170 sendResponse(Error.promptClosedWithoutAction());
178 advancedTransfer(sendResponse, payload) {
179 var promptURL = chrome.extension.getURL('pages/prompt.html')
180 var queryString = 'object='+JSON.stringify(payload)
181 console.log(promptURL, queryString)
183 if(payload.input === undefined){
184 sendResponse(Error.typeMissed('input'));
187 if(payload.output === undefined){
188 sendResponse(Error.typeMissed('output'));
191 if(payload.gas === undefined){
192 sendResponse(Error.typeMissed('gas'));
196 chrome.windows.create(
198 url: `${promptURL}#advancedTransfer?${queryString}`,
206 chrome.runtime.onMessage.addListener(function(request, sender) {
207 if(sender.tab.windowId === window.id){
208 switch (request.method){
209 case 'advanced-transfer':
210 if (request.action === 'success'){
211 sendResponse(request.message);
213 } else if (request.action === 'reject'){
214 sendResponse(request.message);
220 chrome.windows.onRemoved.addListener(function(windowId){
221 if(windowId === window.id) {
222 sendResponse(Error.promptClosedWithoutAction());
230 requestCurrentAccount(sendResponse){
231 const currentAccount = JSON.parse(localStorage.currentAccount)
232 delete(currentAccount['label'])
233 delete(currentAccount['net'])
234 currentAccount['accountId'] = currentAccount['guid']
235 delete(currentAccount['guid'])
236 delete(currentAccount['balance'])
238 sendResponse(currentAccount)
241 requestCurrentNetwork(sendResponse){
242 sendResponse(localStorage.bytomNet)
245 requestAccountList(sendResponse){
246 accountAction.list().then(resp=>{
247 const accountList = resp
248 accountList.forEach(function(account) {
249 delete(account['label'])
250 delete(account['net'])
251 account['accountId'] = account['guid']
252 delete(account['guid'])
253 delete(account['balance'])
255 sendResponse(accountList)
259 send(sendResponse, payload) {
260 const action = payload.action
264 case 'listAllAccount':
265 promise = accountAction.list()