1 import { LocalStream } from 'extension-streams'
2 import InternalMessage from '@/messages/internal'
3 import * as MsgTypes from './messages/types'
4 import NotificationService from './services/NotificationService'
5 import StorageService from './services/StorageService'
6 import Prompt from './prompts/Prompt';
7 import * as PromptTypes from './prompts/PromptTypes'
9 import Error from './utils/errors/Error'
13 export default class Background {
15 this.setupInternalMessaging()
18 setupInternalMessaging() {
19 LocalStream.watch((request, sendResponse) => {
21 const message = InternalMessage.fromJson(request)
22 this.dispatchMessage(sendResponse, message)
26 dispatchMessage(sendResponse, message) {
27 switch (message.type) {
28 case MsgTypes.TRANSFER:
29 this.transfer(sendResponse, message.payload)
31 case MsgTypes.ADVTRANSFER:
32 this.advancedTransfer(sendResponse, message.payload)
35 this.send(sendResponse, message.payload)
37 case MsgTypes.SIGNMESSAGE:
38 this.signMessage(sendResponse, message.payload)
40 case MsgTypes.REQUEST_CURRENT_ACCOUNT:
41 this.requestCurrentAccount(sendResponse, message.payload)
43 case MsgTypes.REQUEST_CURRENT_NETWORK:
44 this.requestCurrentNetwork(sendResponse)
47 Background.authenticate(sendResponse, message.payload)
49 case MsgTypes.SET_PROMPT:
50 Background.setPrompt(sendResponse, message.payload);
52 case MsgTypes.GET_PROMPT:
53 Background.getPrompt(sendResponse);
56 Background.load(sendResponse);
59 Background.update(sendResponse, message.payload);
64 static setPrompt(sendResponse, notification){
65 prompt = notification;
69 static getPrompt(sendResponse){
73 signMessage(sendResponse, payload) {
74 if(payload.address === undefined){
75 sendResponse(Error.typeMissed('address'));
78 if(payload.message === undefined){
79 sendResponse(Error.typeMissed('message'));
83 NotificationService.open(new Prompt(PromptTypes.REQUEST_SIGN, '', payload ,approved => {
84 sendResponse(approved);
88 transfer(sendResponse, payload) {
89 var promptURL = chrome.extension.getURL('pages/prompt.html')
90 var requestBody = payload
91 requestBody.type = "popup"
92 var queryString = new URLSearchParams(requestBody).toString()
93 console.log(promptURL, queryString)
95 if(requestBody.from === undefined){
96 sendResponse(Error.typeMissed('from'));
99 if(requestBody.to === undefined){
100 sendResponse(Error.typeMissed('to'));
103 if(requestBody.asset === undefined){
104 sendResponse(Error.typeMissed('asset'));
107 if(requestBody.amount === undefined){
108 sendResponse(Error.typeMissed('amount'));
113 chrome.windows.create(
115 url: `${promptURL}#transfer?${queryString}`,
123 chrome.runtime.onMessage.addListener(function(request, sender) {
124 if(sender.tab.windowId === window.id){
125 switch (request.method){
127 if (request.action === 'success'){
128 sendResponse(request.message);
130 } else if (request.action === 'reject'){
131 sendResponse(request.message);
138 chrome.windows.onRemoved.addListener(function(windowId){
139 if(windowId === window.id) {
140 sendResponse(Error.promptClosedWithoutAction());
148 advancedTransfer(sendResponse, payload) {
150 if(payload.input === undefined){
151 sendResponse(Error.typeMissed('input'));
154 if(payload.output === undefined){
155 sendResponse(Error.typeMissed('output'));
158 if(payload.gas === undefined){
159 sendResponse(Error.typeMissed('gas'));
163 NotificationService.open(new Prompt(PromptTypes.REQUEST_ADVANCED_TRANSFER, '', payload ,approved => {
164 sendResponse(approved);
169 requestCurrentAccount(sendResponse, payload){
170 Background.load(bytom => {
171 const domain = payload.domain;
172 if(bytom.settings.domains.find(_domain => _domain === domain)) {
173 const currentAccount = Object.assign({}, bytom.currentAccount)
174 delete(currentAccount['label'])
175 delete(currentAccount['net'])
176 currentAccount['accountId'] = currentAccount['guid']
177 delete(currentAccount['guid'])
178 delete(currentAccount['balance'])
180 sendResponse(currentAccount);
189 requestCurrentNetwork(sendResponse){
190 Background.load(bytom => {
191 sendResponse(bytom.settings.network);
195 send(sendResponse, payload) {
196 const action = payload.action
200 case 'listAllAccount':
201 promise = accountAction.list()
214 * Returns the saved instance of Bytom from the storage
215 * @param sendResponse - Delegating response handler
218 static load(sendResponse){
219 StorageService.get().then(bytom => {
225 * Updates the Scatter instance inside persistent storage
226 * @param sendResponse - Delegating response handler
227 * @param bytom - The updated cleartext Scatter instance
230 static update(sendResponse, bytom){
231 StorageService.save(bytom).then(saved => {
236 static authenticate(sendResponse, payload){
237 Background.load(bytom => {
238 const domain = payload.domain;
239 const currentAccount = Object.assign({}, bytom.currentAccount)
240 delete(currentAccount['label'])
241 delete(currentAccount['net'])
242 currentAccount['accountId'] = currentAccount['guid']
243 delete(currentAccount['guid'])
244 delete(currentAccount['balance'])
246 if(bytom.settings.domains.find(_domain => _domain === domain)) {
247 sendResponse(currentAccount);
249 NotificationService.open(new Prompt(PromptTypes.REQUEST_AUTH, payload.domain, {}, approved => {
250 if(approved === false || approved.hasOwnProperty('isError')) sendResponse(approved);
252 bytom.settings.domains.unshift(domain);
253 if(approved === true){
254 this.update(() => sendResponse(currentAccount), bytom);
256 this.update(() => sendResponse(approved), bytom);