1 document
.title
= "Strapp.io Host"
2 const conf
= {"iceServers": [{ "urls": "stun:stun.1.google.com:19302" }] }
3 const clients
= new Map([])
4 const iceCandidates
= []
8 /* TODO: duplicate in both client.js and host.jhs */
9 function getPublicKey() {
10 return new Promise( (resolve
, reject
) => {
11 /* Check local storage for public key */
12 if (!window
.localStorage
.getItem('public-key')) {
13 console
.log('public key is undefined')
14 /* If doesn't exist, generate public and private key pair, store in
16 crypto
.subtle
.generateKey(
19 publicExponent
: new Uint8Array([0x01, 0x00, 0x01]),
20 hash
: {name
: "SHA-256"}
23 ['encrypt', 'decrypt']
25 /* TODO: Do we need to store the private key as well? */
26 crypto
.subtle
.exportKey('jwk', keyPair
.publicKey
)
27 .then((exportedKey
) => {
28 window
.localStorage
.setItem('publicKey', exportedKey
)
29 console
.log('public key is' + window
.localStorage
.getItem('publicKey'))
36 resolve(window
.localStorage
.getItem('publicKey'))
41 function handleNewClientConnection(offer
) {
42 /* New Client Connection*/
43 hpc
= new RTCPeerConnection(conf
)
45 clients
.set(offer
.pubKey
, hpc
)
46 hpc
.setRemoteDescription(offer
.sdp
)
48 hpc
.createAnswer().then((answer
) => {
49 return hpc
.setLocalDescription(answer
)
52 getPublicKey().then((hpk
) => {
53 hpc
.onicecandidate
= (event
) => {
54 if (event
.candidate
) {
55 console
.log('Host: Allocating ice candidate for client')
56 iceCandidates
.push(JSON
.stringify({
59 hostPubKey
: hpk
.n
, /* TODO: do we need to send this? */
60 clientPubKey
: offer
.pubKey
,
65 console
.log('Host: Finished sending ICE candidates')
69 console
.log('Host: Sending answer to Client')
70 wsock
.send(JSON
.stringify({
72 sdp
: hpc
.localDescription
,
74 clientPubKey
: offer
.pubKey
76 hpc
.ondatachannel
= (evt
) => {
77 dataChannel
= evt
.channel
79 dataChannel
.onmessage
= (msg
) => {
82 dataChannel
.onopen
= () => {
83 dataChannel
.send(`Hi ${offer.pubKey} -host`)
86 hpc
.oniceconnectionstatechange
= () => {
87 console
.log('iceConnectionState = ' + hpc
.iceConnectionState
)
91 console
.log(`error in host answer ${err}`)
97 function handleNewIceSubmission(msg
) {
98 console
.log('Host: Adding new ice candidate')
99 const hpc
= clients
.get(msg
.pubKey
)
100 let candidate
= new RTCIceCandidate(msg
.ice
)
101 hpc
.addIceCandidate(candidate
)
104 function handleIceRequest(msg
) {
105 console
.log('Host: Handling ice candidate request')
106 console
.log(iceCandidates
)
107 const hpc
= clients
.get(msg
.pubKey
)
108 const iceCandidate
= iceCandidates
.pop()
109 if (iceCandidate
!== undefined) {
110 wsock
.send(iceCandidate
)
112 if (hpc
.iceGatheringState
.localeCompare('gathering') === 0) {
113 wsock
.send(`{"cmd" : "< ice pubKey", "clientPubKey":"${msg.pubKey}", "iceState": "g"}`)
115 else if (hpc
.iceGatheringState
.localeCompare('complete') === 0) {
116 wsock
.send(`{"cmd" : "< ice pubKey", "clientPubKey":"${msg.pubKey}", "iceState": "c"}`)
122 if ("WebSocket" in window
) {
123 document
.addEventListener('DOMContentLoaded', (event
) => {
124 wsock
= new WebSocket(`${_strapp_protocol}://${window.location.hostname}:${_strapp_port}`)
125 wsock
.onopen
= () => {
126 console
.log(`Strapped to ${_strapp_protocol}://${window.location.hostname}:${_strapp_port}`)
129 wsock
.onmessage
= (serverMsg
) => {
130 /* msg is either offer or ice candidate or ice candidate request*/
132 /* What if data null? */
133 let msg
= JSON
.parse(serverMsg
.data
)
135 const clientID
= msg
.pubKey
137 /* TODO: redo this trash */
138 if (clients
.has(clientID
)) {
140 handleNewIceSubmission(msg
)
141 } else if (msg
.sdp
) {
142 //handleRepeatedOffer
144 handleIceRequest(msg
)
149 console
.log('Host: Client that doesnt exist is sending ice submissions')
150 } else if (msg
.sdp
) {
151 handleNewClientConnection(msg
)
153 console
.log('Host: Client that doesnt exist is sending ice requests')
160 document
.addEventListener('DOMContentLoaded', () => {
161 document
.body
.innerHTML
= 'Websockets not supported in your browser'