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
\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
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) \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
+ }\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
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
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
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
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
})\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