syntax stuff
[henge/kiak.git] / client.js
1 const body = document.createElement('body')
2 const root = document.createElement('div')
3 document.title = "Strapp.io Client"
4 body.appendChild(root)
5 document.body = body
6
7 /* Poll the server. Send get request, wait for timeout, send another request.
8 Do this until...? Can be used for either reconnecting or waiting for answer*/
9 function pollServerTimeout(url, data, resolve, reject) {
10 console.log('Polling server with offer ' + data)
11 const request = XMLHttpRequest()
12 request.open('GET', url)
13 request.setRequestHeader('Content-Type', 'application/json' )
14 request.onreadystatechange = () => {
15 if (request.status === 200) {
16 console.log('recieved answer from host ' + request.response)
17 resolve(request.response)
18 }
19 else if (request.status === 504) {
20 pollServerTimeout(url, data, resolve, reject)
21 }
22 else {
23 reject('server errored out with ' + request.status)
24 }
25 }
26 request.send(data)
27 }
28
29 /* TODO: Possible to pass resolve/reject to functions? */
30 function pollServer(url, clientPubKey, func) {
31 return new Promise((resolve, reject) => {
32 func(url, clientPubKey, resolve, reject )
33 })
34 }
35 /* If https connection, should be already defined. If not https,*/
36 function getPublicKey() {
37 /* Check local storage for public key */
38 if (window.localStorage.getItem('public-key') === undefined) {
39 /* If doesn't exist, generate public and private key pair, store in
40 local storage */
41 crypto.subtle.generateKey({name:'RSA-OAEP', length: 192}, true, ['encrypt', 'decrypt'])
42 .then((keyPair) => {
43 /* TODO: Do we need to store the private key as well? */
44 window.localStorage.setItem('public-key', keyPair.type.public.toString())
45 })
46 }
47 console.log(window.localStorage.getItem('public-key'))
48 return window.localStorage.getItem('public-key')
49 }
50
51 /* Create, set, and get client Offer. Poll server for host answer.
52 Set host answer as client remoteDescription */
53 const cpc = new RTCPeerConnection()
54 cpc.createOffer().then((offer) => {
55 console.log('creating offer which is ' + offer)
56 return cpc.setLocalDescription(offer)
57 }).then(() => {
58 console.log('sessionDescriptionInit = ' + cpc.localDescription)
59 const cpk = getPublicKey()
60 let offer = {
61 cmd: '> sdp pubKey'
62 sdp: cpc.localDescription,
63 pubKey: cpk
64 }
65 /* Poll for answer */
66 return pollServer(window.location, offer, pollServerTimeout)
67 }).then((answer) => {
68 /* TODO: Extract sdp from answer ?*/
69 console.log(answer)
70 /* State machine to parse answer */
71 cpc.setRemoteDescription(answer.sdp)
72 })