1 import { EncryptedStream, LocalStream } from 'extension-streams'
2 import IdGenerator from '@/utils/IdGenerator'
3 import NetworkMessage from '@/messages/network'
4 import InternalMessage from '@/messages/internal'
5 import * as MsgTypes from './messages/types'
6 import * as EventNames from '@/messages/event'
8 let stream = new WeakMap()
9 let INJECTION_SCRIPT_FILENAME = 'js/inject.js'
14 this.setupEncryptedStream()
15 this.injectInteractionScript()
18 injectInteractionScript() {
19 let script = document.createElement('script')
20 script.src = chrome.extension.getURL(INJECTION_SCRIPT_FILENAME)
21 ;(document.head || document.documentElement).appendChild(script)
22 script.onload = () => script.remove()
25 setupEncryptedStream() {
26 console.log('stream listening...', IdGenerator.text(256))
28 stream = new EncryptedStream(EventNames.BYTOM, IdGenerator.text(256))
29 stream.listenWith(msg => this.contentListener(msg))
31 stream.onSync(async () => {
32 const defaultAccount = await this.getDefaultAccount();
33 const net = await this.getDefaultNetwork();
34 const accountList = await this.getAccountList();
36 // Pushing an instance of Bytomdapp to the web application
38 NetworkMessage.payload(MsgTypes.PUSH_BYTOM, {defaultAccount, net, accountList}),
42 // Dispatching the loaded event to the web application.
45 document.dispatchEvent(new CustomEvent('chromeBytomLoaded'))
48 chrome.runtime.onMessage.addListener(async (obj) => {
51 const defaultAccount = await this.getDefaultAccount();
54 NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
59 case 'updateNetAndAccounts':
60 const net = await this.getDefaultNetwork();
61 const accountList = await this.getAccountList();
63 NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'net', value: net}),
67 NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'accounts', value: accountList}),
77 contentListener(msg) {
78 console.log('content.stream.listen:', msg, stream.key)
83 let networkMessage = NetworkMessage.fromJson(msg)
88 case MsgTypes.TRANSFER:
89 case MsgTypes.ADVTRANSFER:
91 this.transfer(msg.type, networkMessage)
94 stream.send(networkMessage.error('errtest'), EventNames.INJECT)
102 return InternalMessage.signal(MsgTypes.REQUEST_CURRENT_ACCOUNT)
107 return InternalMessage.signal(MsgTypes.REQUEST_CURRENT_NETWORK)
112 return InternalMessage.signal(MsgTypes.REQUEST_ACCOUNT_LIST)
116 respond(message, payload) {
119 console.log(222, message, payload)
121 !payload || payload.hasOwnProperty('isError')
122 ? message.error(payload)
123 : message.respond(payload)
124 stream.send(response, EventNames.INJECT)
128 stream.key = message.handshake.length ? message.handshake : null
129 stream.send({ type: 'sync' }, EventNames.INJECT)
133 transfer(type, message) {
136 InternalMessage.payload(type, message.payload)
138 .then(res => this.respond(message, res))
142 const content = new Content()