Merge branch 'master' of github.com:Jlavatai/strapp
[henge/kiak.git] / client.js
index 19ad38f..6cdf150 100644 (file)
--- a/client.js
+++ b/client.js
@@ -2,10 +2,8 @@ const body = document.createElement('body')
 const root = document.createElement('div')\r
 document.title = "Strapp.io Client"\r
 const conf = {"iceServers": [{ "urls": "stun:stun.1.google.com:19302" }] }\r
-let dataChannel\r
-let hostScreen\r
 \r
-/* TODO: duplicate in both client.js and host.js */\r
+/* TODO: This is duplicated in both client.js and host.js */\r
 function getPublicKey() {\r
   return new Promise( (resolve, reject) => {\r
     /* Check local storage for public key */\r
@@ -38,7 +36,7 @@ function getPublicKey() {
 \r
 }\r
 \r
-function postServer(url, data) {\r
+function sendHost(url, data) {\r
   const request = new XMLHttpRequest()\r
   request.open('POST', url, true)\r
   request.setRequestHeader('Content-Type', 'application/json' )\r
@@ -46,44 +44,38 @@ function postServer(url, data) {
   request.send(data)\r
 }\r
 \r
-/* TODO: All this does is wrap a function in a promise. Allows pollServerForAnswer\r
-to call itself recursively with the same promise */\r
-function pollServer(url, clientPubKey, func) {\r
-  return new Promise((resolve, reject) => {\r
-    func(url, clientPubKey, resolve, reject )\r
-  })\r
-}\r
-\r
 /* Poll the server. Send get request, wait for timeout, send another request.\r
 Do this until...? Can be used for either reconnecting or waiting for answer*/\r
-function pollServerForAnswer(url, data, resolve, reject) {\r
-  const request = new XMLHttpRequest()\r
-  request.open('GET', url, true)\r
-  /* But there is no JSON? */\r
-  request.setRequestHeader('Content-Type', 'application/json' )\r
-  request.setRequestHeader('X-Strapp-Type', 'client-sdp-offer')\r
-  request.setRequestHeader('X-Client-Offer', JSON.stringify(data))\r
-  request.onreadystatechange = () => {\r
-    if (request.status === 200) {\r
-      if(request.readyState === 4) {\r
-        console.log('Client: Recieved Answer from Host')\r
-        console.log(request)\r
-        resolve(request.response)\r
+function requestHostAnswer(url, data) {\r
+  return new Promise((resolve, reject) => {\r
+    const request = new XMLHttpRequest()\r
+    request.open('GET', url, true)\r
+    /* But there is no JSON? */\r
+    request.setRequestHeader('Content-Type', 'application/json' )\r
+    request.setRequestHeader('X-Strapp-Type', 'client-sdp-offer')\r
+    request.setRequestHeader('X-Strapp-Pubkey', data.pubKey)
+    request.onreadystatechange = () => {
+      if (request.status === 200) {\r
+        if(request.readyState === 4) {\r
+          console.log('Client: Recieved Answer from Host')\r
+          console.log(request)\r
+          resolve(request.response)\r
+        }\r
+      }\r
+      else if (request.status === 504) {\r
+        console.log('timed out, resending')\r
+        resolve(requestHostAnswer(url, data))\r
+      }\r
+      else {\r
+        reject('server unhandled response of status ' + request.status)\r
       }\r
     }\r
-    else if (request.status === 504) {\r
-      console.log('timed out, resending')\r
-      pollServerForAnswer(url, data, resolve, reject)\r
-    }\r
-    else {\r
-      reject('server unhandled response of status ' + request.status)\r
-    }\r
-  }\r
-  request.send()\r
+    request.send(data)\r
+  })\r
 }\r
 \r
 /* Poll server for ice candidates until ice is complete */\r
-function pollServerForICECandidate(cpc, url, pubKey) {\r
+function requestHostICE(cpc, url, pubKey) {\r
   let intervalID = window.setInterval(() => {\r
     if (cpc.iceConnectionState.localeCompare('connected') !== 0\r
     && cpc.iceConnectionState.localeCompare('completed') !== 0) {\r
@@ -101,17 +93,17 @@ function pollServerForICECandidate(cpc, url, pubKey) {
             let response = JSON.parse(request.response)\r
             switch(response['iceState']) {\r
               case "a":\r
-                cpc.addIceCandidate(new RTCIceCandidate(response.ice))\r
-                break\r
+              cpc.addIceCandidate(new RTCIceCandidate(response.ice))\r
+              break\r
               case "g": /* Gathering so let interval keep polling */\r
-                break\r
+              break\r
               case "c": /* host iceState == Complete, stop bugging it */\r
-                clearInterval(intervalID)\r
-                clearTimeout()\r
-                break\r
+              clearInterval(intervalID)\r
+              clearTimeout()\r
+              break\r
               default:\r
-                console.log('Unhandled iceState in pollServerForICECandidate()' + response['iceState'])\r
-                break\r
+              console.log('Unhandled iceState in requestHostICE()' + response['iceState'])\r
+              break\r
             }\r
           }\r
         }\r
@@ -131,6 +123,7 @@ function pollServerForICECandidate(cpc, url, pubKey) {
 \r
 /* Create and send offer -> Send ICE Candidates -> Poll for ICE Candidates */\r
 getPublicKey().then((cpk) => {\r
+  let dataChannel\r
   console.log('Client: Create and send offer')\r
   const cpc = new RTCPeerConnection(conf)\r
 \r
@@ -150,16 +143,17 @@ getPublicKey().then((cpk) => {
         sdp: cpc.localDescription,\r
         pubKey: cpk.n\r
       }\r
-      return pollServer(window.location, offer, pollServerForAnswer)\r
-    }).then((serverResponse) => {\r
+      return requestHostAnswer(window.location, offer)\r
+    })\r
+    .then((serverResponse) => {\r
       const answer = JSON.parse(serverResponse)\r
       console.log('Client: Polling for ICE candidates')\r
-      pollServerForICECandidate(cpc, window.location, cpk.n)\r
+      requestHostICE(cpc, window.location, cpk.n)\r
       cpc.setRemoteDescription(answer.sdp)\r
       cpc.onicecandidate = (event) => {\r
         if (event.candidate) {\r
           console.log('Client: Sending ice candidate to host')\r
-          postServer(window.location, JSON.stringify({\r
+          sendHost(window.location, JSON.stringify({\r
             cmd: '> ice pubkey',\r
             ice: event.candidate,\r
             pubKey: cpk.n\r
@@ -175,16 +169,16 @@ getPublicKey().then((cpk) => {
       console.log('error in sdp handshake: ' + err)\r
     })\r
   }\r
-  /* Start data channel */\r
+  /* Start data channel, triggers on negotiation needed */\r
   dataChannel = cpc.createDataChannel("sendChannel");\r
+\r
+  /* Triggered when Host adds track to peer connection */\r
   cpc.ontrack = (event) => {\r
-    console.log(`track event is ${event}`)\r
-    let remoteRTPSenders = cpc.getSenders()\r
     let remoteRTPReceivers = cpc.getReceivers()\r
-    console.log(remoteRTPReceivers)\r
-    /* Add each remoteRTPSenders.track to own stream */\r
+    let hostScreen\r
     let video = document.querySelector('video')\r
-    video.autoplay = true\r
+    /* TODO: Audio, video, or other track? */\r
+    console.log(remoteRTPReceivers)\r
     console.log(video)\r
     hostScreen = new MediaStream([remoteRTPReceivers[0].track])\r
     if(!video.srcObject) {\r
@@ -192,14 +186,15 @@ getPublicKey().then((cpk) => {
     }\r
     console.log(hostScreen.getVideoTracks())\r
     console.log(video.srcObject)\r
-    video.play()\r
     video.onloadedmetadata = () => {\r
       video.play()\r
     }\r
   }\r
+\r
   dataChannel.onmessage = (msg) => {\r
     /* Get mediaStream from host and add it to the video */\r
     let hostMessage = JSON.parse(msg.data)\r
+    console.log('Client: Renego')\r
     cpc.setRemoteDescription(hostMessage.sdp).then(() => {\r
       cpc.createAnswer().then((answer) => {\r
         return cpc.setLocalDescription(answer)\r
@@ -220,6 +215,6 @@ getPublicKey().then((cpk) => {
 })\r
 document.addEventListener('DOMContentLoaded', () => {\r
 \r
-    document.body.innerHTML = `<button> Setting up connection with host  </button>`\r
+  document.body.innerHTML = `<button> Setting up connection with host  </button>`\r
 \r
 });\r