OSDN Git Service

update the advanced Transfer and add the signmessage function
[bytom/Byone.git] / src / background.js
1 import { LocalStream } from 'extension-streams'
2 import InternalMessage from '@/messages/internal'
3 import * as MsgTypes from './messages/types'
4
5 import Error from './utils/errors/Error'
6 import accountAction from "@/models/account";
7 import bytom from "@/models/bytom";
8
9 export default class Background {
10   constructor() {
11     this.setupInternalMessaging()
12     this.setupBytom()
13   }
14
15   setupBytom(){
16     const network = localStorage.bytomNet||'mainnet'
17     bytom.setupNet(network)
18
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) {});
25         });
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) {});
29         });
30       }
31     }
32   }
33
34   setupInternalMessaging() {
35     LocalStream.watch((request, sendResponse) => {
36       console.log(request)
37       const message = InternalMessage.fromJson(request)
38       this.dispatchMessage(sendResponse, message)
39     })
40   }
41
42   dispatchMessage(sendResponse, message) {
43     switch (message.type) {
44       case MsgTypes.TRANSFER:
45         this.transfer(sendResponse, message.payload)
46         break
47       case MsgTypes.ADVTRANSFER:
48         this.advancedTransfer(sendResponse, message.payload)
49         break
50       case MsgTypes.SEND:
51         this.send(sendResponse, message.payload)
52         break
53       case MsgTypes.SIGNMESSAGE:
54         this.signMessage(sendResponse, message.payload)
55         break
56       case MsgTypes.REQUEST_CURRENT_ACCOUNT:
57         this.requestCurrentAccount(sendResponse)
58         break
59       case MsgTypes.REQUEST_CURRENT_NETWORK:
60         this.requestCurrentNetwork(sendResponse)
61         break
62       case MsgTypes.REQUEST_ACCOUNT_LIST:
63         this.requestAccountList(sendResponse)
64         break
65     }
66   }
67
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)
73
74     if(requestBody.address === undefined){
75       sendResponse(Error.typeMissed('address'));
76       return false;
77     }
78     if(requestBody.message === undefined){
79       sendResponse(Error.typeMissed('message'));
80       return false;
81     }
82
83     chrome.windows.create(
84       {
85         url: `${promptURL}#signMessage?${queryString}`,
86         type: 'popup',
87         width: 360,
88         height: 623,
89         top: 0,
90         left: 0
91       },
92       (window) => {
93         chrome.runtime.onMessage.addListener(function(request, sender) {
94           if(sender.tab.windowId === window.id){
95             switch (request.method){
96               case 'sign-message':
97                 if (request.action === 'success'){
98                   sendResponse(request.message);
99                   return true;
100                 } else if (request.action === 'reject'){
101                   sendResponse(request.message);
102                   return false;
103                 }
104             }
105           }
106         });
107
108         chrome.windows.onRemoved.addListener(function(windowId){
109           if(windowId === window.id) {
110             sendResponse(Error.promptClosedWithoutAction());
111             return false;
112           }
113         });
114       }
115     )
116   }
117
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)
124
125     if(requestBody.from === undefined){
126       sendResponse(Error.typeMissed('from'));
127       return false;
128     }
129     if(requestBody.to === undefined){
130       sendResponse(Error.typeMissed('to'));
131       return false;
132     }
133     if(requestBody.asset === undefined){
134       sendResponse(Error.typeMissed('asset'));
135       return false;
136     }
137     if(requestBody.amount === undefined){
138       sendResponse(Error.typeMissed('amount'));
139       return false;
140     }
141
142
143       chrome.windows.create(
144       {
145         url: `${promptURL}#transfer?${queryString}`,
146         type: 'popup',
147         width: 360,
148         height: 623,
149         top: 0,
150         left: 0
151       },
152       (window) => {
153         chrome.runtime.onMessage.addListener(function(request, sender) {
154           if(sender.tab.windowId === window.id){
155             switch (request.method){
156               case 'transfer':
157                 if (request.action === 'success'){
158                   sendResponse(request.message);
159                   return true;
160                 } else if (request.action === 'reject'){
161                   sendResponse(request.message);
162                   return false;
163                 }
164             }
165           }
166         });
167
168         chrome.windows.onRemoved.addListener(function(windowId){
169           if(windowId === window.id) {
170             sendResponse(Error.promptClosedWithoutAction());
171             return false;
172           }
173         });
174       }
175     )
176   }
177
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)
182
183     if(payload.input === undefined){
184       sendResponse(Error.typeMissed('input'));
185       return false;
186     }
187     if(payload.output === undefined){
188       sendResponse(Error.typeMissed('output'));
189       return false;
190     }
191     if(payload.gas === undefined){
192       sendResponse(Error.typeMissed('gas'));
193       return false;
194     }
195
196     chrome.windows.create(
197       {
198         url: `${promptURL}#advancedTransfer?${queryString}`,
199         type: 'popup',
200         width: 360,
201         height: 623,
202         top: 0,
203         left: 0
204       },
205       (window) => {
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);
212                   return true;
213                 } else if (request.action === 'reject'){
214                   sendResponse(request.message);
215                   return false;
216                 }
217             }
218           }
219         });
220         chrome.windows.onRemoved.addListener(function(windowId){
221           if(windowId === window.id) {
222             sendResponse(Error.promptClosedWithoutAction());
223             return false;
224           }
225         });
226       }
227     )
228   }
229
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'])
237
238     sendResponse(currentAccount)
239   }
240
241   requestCurrentNetwork(sendResponse){
242     sendResponse(localStorage.bytomNet)
243   }
244
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'])
254       })
255       sendResponse(accountList)
256     })
257   }
258
259   send(sendResponse, payload) {
260     const action = payload.action
261     if(action){
262       let promise
263       switch (action){
264         case 'listAllAccount':
265           promise = accountAction.list()
266           break
267       }
268       if(promise){
269         promise.then(resp =>
270         {
271           sendResponse(resp)
272         })
273       }
274     }
275   }
276 }
277
278 new Background()