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'
7 import {strippedHost} from '@/utils/GenericTools'
8 import _ from 'lodash';
11 let stream = new WeakMap()
12 let INJECTION_SCRIPT_FILENAME = 'js/inject.js'
17 this.setupEncryptedStream()
18 this.injectInteractionScript()
21 injectInteractionScript() {
22 let script = document.createElement('script')
23 script.src = chrome.extension.getURL(INJECTION_SCRIPT_FILENAME)
24 ;(document.head || document.documentElement).appendChild(script)
25 script.onload = () => script.remove()
28 setupEncryptedStream() {
29 console.log('stream listening...', IdGenerator.text(256))
31 stream = new EncryptedStream(EventNames.BYTOM, IdGenerator.text(256))
32 stream.listenWith(msg => this.contentListener(msg))
34 stream.onSync(async () => {
35 const defaultAccount = await this.getDefaultAccount();
36 const net = await this.getDefaultNetwork();
37 const chain = await this.getDefaultChain()
39 // Pushing an instance of Bytomdapp to the web application
41 NetworkMessage.payload(MsgTypes.PUSH_BYTOM, {defaultAccount, net, chain}),
45 // Dispatching the loaded event to the web application.
48 document.dispatchEvent(new CustomEvent('bytomLoaded'))
49 document.dispatchEvent(new CustomEvent('chromeBytomLoaded'))
52 chrome.storage.onChanged.addListener(async (evt) => {
53 if(evt.bytom.newValue.settings.network !== evt.bytom.oldValue.settings.network){
54 const net = await this.getDefaultNetwork();
55 const defaultAccount = await this.getDefaultAccount();
57 NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'net', value: net}),
61 NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
64 }else if(!_.isEqual(evt.bytom.newValue.currentAccount,evt.bytom.oldValue.currentAccount)){
65 const defaultAccount = await this.getDefaultAccount();
68 NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
72 }else if(evt.bytom.newValue.settings.netType!== evt.bytom.oldValue.settings.netType){
73 const chain = await this.getDefaultChain();
74 const defaultAccount = await this.getDefaultAccount();
76 NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'chain', value: chain}),
80 NetworkMessage.payload(MsgTypes.UPDATE_BYTOM, {type:'default_account', value: defaultAccount}),
88 contentListener(msg) {
89 console.log('content.stream.listen:', msg, stream.key)
93 if(!stream.synced && (!msg.hasOwnProperty('type') || msg.type !== 'sync')) {
94 stream.send(new Error('inject Error'), PairingTags.INJECTED);
98 let networkMessage = NetworkMessage.fromJson(msg)
103 case MsgTypes.TRANSFER:
104 case MsgTypes.SIGNTRANSACTION:
105 case MsgTypes.ADVTRANSFER:
106 case MsgTypes.SIGNMESSAGE:
107 case MsgTypes.SETCHAIN:
109 this.transfer(msg.type, networkMessage)
111 case MsgTypes.ENABLE:
112 this.enable(msg.type, networkMessage)
115 stream.send(networkMessage.error('errtest'), EventNames.INJECT)
123 return InternalMessage.payload(MsgTypes.REQUEST_CURRENT_ACCOUNT,{domain:strippedHost()})
128 return InternalMessage.signal(MsgTypes.REQUEST_CURRENT_NETWORK)
133 return InternalMessage.signal(MsgTypes.REQUEST_CURRENT_CHAIN_TYPE)
137 respond(message, payload) {
140 console.log(222, message, payload)
142 !payload || payload.hasOwnProperty('isError')
143 ? message.error(payload)
144 : message.respond(payload)
145 stream.send(response, EventNames.INJECT)
149 stream.key = message.handshake.length ? message.handshake : null
150 stream.send({ type: 'sync' }, EventNames.INJECT)
154 transfer(type, message) {
157 InternalMessage.payload(type, message.payload)
159 .then(res => this.respond(message, res))
162 enable(type, networkMessage) {
163 networkMessage.payload ={
164 domain: strippedHost()
167 this.transfer(type, networkMessage)
172 const content = new Content()