+
+ cpc.onnegotiationneeded = () => {
+ console.log('negotiation needed!')
+ cpc.createOffer().then((offer) => {
+ return cpc.setLocalDescription(offer)
+ })
+ .then(() => {
+ console.log('Client: Sending offer to host')
+ let offer = {
+ cmd: '> sdp pubKey',
+ sdp: cpc.localDescription,
+ pubKey: cpk.n
+ }
+ return requestHostAnswer(window.location, offer)
+ })
+ .then((serverResponse) => {
+ const answer = JSON.parse(serverResponse)
+ console.log('Client: Polling for ICE candidates')
+ requestHostICE(cpc, window.location, cpk.n)
+ cpc.setRemoteDescription(answer.sdp)
+ cpc.onicecandidate = (event) => {
+ if (event.candidate) {
+ console.log('Client: Sending ice candidate to host')
+ sendHost(window.location, JSON.stringify({
+ cmd: '> ice pubkey',
+ ice: event.candidate,
+ pubKey: cpk.n
+ }))
+ }
+ else {
+ console.log('Client: No more Ice Candidates to send')
+ }
+ }
+
+
+ }).catch( (err) => {
+ console.log('error in sdp handshake: ' + err)
+ })
+ }
+ /* Start data channel, triggers on negotiation needed */
+ dataChannel = cpc.createDataChannel("sendChannel");
+
+ /* Triggered when Host adds track to peer connection */
+ cpc.ontrack = (event) => {
+ let remoteRTPReceivers = cpc.getReceivers()
+ let hostScreen
+ let video = document.querySelector('video')
+ /* TODO: Audio, video, or other track? */
+ console.log(remoteRTPReceivers)
+ console.log(video)
+ hostScreen = new MediaStream([remoteRTPReceivers[0].track])
+ if(!video.srcObject) {
+ video.srcObject = hostScreen
+ }
+ console.log(hostScreen.getVideoTracks())
+ console.log(video.srcObject)
+ video.onloadedmetadata = () => {
+ video.play()
+ }
+ }
+
+ dataChannel.onmessage = (msg) => {
+ /* Get mediaStream from host and add it to the video */
+ let hostMessage = JSON.parse(msg.data)
+ console.log('Client: Renego')
+ cpc.setRemoteDescription(hostMessage.sdp).then(() => {
+ cpc.createAnswer().then((answer) => {
+ return cpc.setLocalDescription(answer)
+ }).then(() => {
+ dataChannel.send(JSON.stringify({
+ "cmd": "> screen dataChannel",
+ "sdp": cpc.localDescription
+ }))
+ })
+ })
+
+
+ }
+ dataChannel.onopen = () => {
+ document.body.innerHTML = (`<div><button> Connection with host established! </button></div> <video controls></video>`)
+ }
+