OSDN Git Service

update the home page.
[bytom/Byone.git] / src / content.js
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
8 let stream = new WeakMap()
9 let INJECTION_SCRIPT_FILENAME = 'js/inject.js'
10 let isReady = false
11
12 class Content {
13   constructor() {
14     this.setupEncryptedStream()
15     this.injectInteractionScript()
16   }
17
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()
23   }
24
25   setupEncryptedStream() {
26     console.log('stream listening...', IdGenerator.text(256))
27
28     stream = new EncryptedStream(EventNames.BYTOM, IdGenerator.text(256))
29     stream.listenWith(msg => this.contentListener(msg))
30
31     stream.onSync(() => {
32       const version = this.getVersion()
33       // const version = await this.getVersion();
34       // const identity = await this.identityFromPermissions();
35
36       // Pushing an instance of Scatterdapp to the web application
37       stream.send(
38         NetworkMessage.payload(MsgTypes.PUSH_BYTOM, {}),
39         EventNames.INJECT
40       )
41
42       // Dispatching the loaded event to the web application.
43       isReady = true
44
45       document.dispatchEvent(new CustomEvent('chromeBytomLoaded'))
46     })
47   }
48
49   contentListener(msg) {
50     console.log('content.stream.listen:', msg, stream.key)
51
52     if (!isReady) return
53     if (!msg) return
54
55     let networkMessage = NetworkMessage.fromJson(msg)
56     switch (msg.type) {
57       case 'sync':
58         this.sync(msg)
59         break
60       case MsgTypes.TRANSFER:
61       case MsgTypes.ADVTRANSFER:
62       case MsgTypes.SEND:
63         this.transfer(msg.type, networkMessage)
64         break
65       default:
66         stream.send(networkMessage.error('errtest'), EventNames.INJECT)
67         break
68     }
69   }
70
71   getVersion() {}
72
73   respond(message, payload) {
74     if (!isReady) return
75
76     console.log(222, message, payload)
77     const response =
78       !payload || payload.hasOwnProperty('isError')
79         ? message.error(payload)
80         : message.respond(payload)
81     stream.send(response, EventNames.INJECT)
82   }
83
84   sync(message) {
85     stream.key = message.handshake.length ? message.handshake : null
86     stream.send({ type: 'sync' }, EventNames.INJECT)
87     stream.synced = true
88   }
89
90   transfer(type, message) {
91     if (!isReady) return
92
93     InternalMessage.payload(type, message.payload)
94       .send()
95       .then(res => this.respond(message, res))
96   }
97 }
98
99 const content = new Content()