| <!DOCTYPE html> | 
| <html lang="en"> | 
| <head> | 
|     <meta charset="utf-8"> | 
|     <title>JSDoc: Source: webrtcstreamer.js</title> | 
|   | 
|     <script src="scripts/prettify/prettify.js"> </script> | 
|     <script src="scripts/prettify/lang-css.js"> </script> | 
|     <!--[if lt IE 9]> | 
|       <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> | 
|     <![endif]--> | 
|     <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> | 
|     <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> | 
| </head> | 
|   | 
| <body> | 
|   | 
| <div id="main"> | 
|   | 
|     <h1 class="page-title">Source: webrtcstreamer.js</h1> | 
|   | 
|      | 
|   | 
|   | 
|   | 
|      | 
|     <section> | 
|         <article> | 
|             <pre class="prettyprint source linenums"><code> | 
| /**  | 
|  * Interface with WebRTC-streamer API | 
|  * @constructor | 
|  * @param {string} videoElement - id of the video element tag | 
|  * @param {string} srvurl -  url of webrtc-streamer (default is current location) | 
| */ | 
| function WebRtcStreamer (videoElement, srvurl) { | 
|     this.videoElement     = videoElement;     | 
|     this.srvurl           = srvurl || location.protocol+"//"+window.location.hostname+":"+window.location.port; | 
|     this.pc               = null;     | 
|   | 
|     this.pcOptions        = { "optional": [{"DtlsSrtpKeyAgreement": true} ] }; | 
|   | 
|     this.mediaConstraints = { offerToReceiveAudio: true, offerToReceiveVideo: true }; | 
|   | 
|     this.iceServers = null; | 
|     this.earlyCandidates = []; | 
| } | 
|   | 
| /**  | 
|  * Connect a WebRTC Stream to videoElement  | 
|  * @param {string} videourl - id of WebRTC video stream | 
|  * @param {string} audiourl - id of WebRTC audio stream | 
|  * @param {string} options -  options of WebRTC call | 
|  * @param {string} stream  -  local stream to send | 
| */ | 
| WebRtcStreamer.prototype.connect = function(videourl, audiourl, options, localstream) { | 
|     this.disconnect(); | 
|      | 
|     // getIceServers is not already received | 
|     if (!this.iceServers) { | 
|         console.log("Get IceServers"); | 
|          | 
|         var bind = this; | 
|         request("GET" , this.srvurl + "/api/getIceServers") | 
|             .done( function (response) {  | 
|                 if (response.statusCode === 200) { | 
|                     bind.onReceiveGetIceServers.call(bind,JSON.parse(response.body), videourl, audiourl, options, localstream); | 
|                 } | 
|                 else { | 
|                     bind.onError(response.statusCode); | 
|                 } | 
|             } | 
|         );         | 
|     } else { | 
|         this.onReceiveGetIceServers(this.iceServers, videourl, audiourl, options, localstream); | 
|     } | 
| } | 
|   | 
| /**  | 
|  * Disconnect a WebRTC Stream and clear videoElement source | 
| */ | 
| WebRtcStreamer.prototype.disconnect = function() {         | 
|     var videoElement = document.getElementById(this.videoElement); | 
|     if (videoElement) { | 
|         videoElement.src = ""; | 
|     } | 
|     if (this.pc) { | 
|         request("GET" , this.srvurl + "/api/hangup?peerid="+this.pc.peerid); | 
|          | 
|         try { | 
|             this.pc.close(); | 
|         } | 
|         catch (e) { | 
|             console.log ("Failure close peer connection:" + e); | 
|         } | 
|         this.pc = null; | 
|     } | 
| }     | 
|   | 
| /* | 
| * GetIceServers callback | 
| */ | 
| WebRtcStreamer.prototype.onReceiveGetIceServers = function(iceServers, videourl, audiourl, options, stream) { | 
|     this.iceServers       = iceServers; | 
|     this.pcConfig         = iceServers || {"iceServers": [] }; | 
|     try {             | 
|         this.pc = this.createPeerConnection(); | 
|   | 
|         var peerid = Math.random();             | 
|         this.pc.peerid = peerid; | 
|          | 
|         var callurl = this.srvurl + "/api/call?peerid="+ peerid+"&url="+encodeURIComponent(videourl); | 
|         if (audiourl) { | 
|             callurl += "&audiourl="+encodeURIComponent(audiourl); | 
|         } | 
|         if (options) { | 
|             callurl += "&options="+encodeURIComponent(options); | 
|         } | 
|          | 
|         if (stream) { | 
|             this.pc.addStream(stream); | 
|         } | 
|   | 
|                 // clear early candidates | 
|         this.earlyCandidates.length = 0; | 
|          | 
|         // create Offer | 
|         var bind = this; | 
|         this.pc.createOffer(this.mediaConstraints).then(function(sessionDescription) { | 
|             console.log("Create offer:" + JSON.stringify(sessionDescription)); | 
|              | 
|             bind.pc.setLocalDescription(sessionDescription | 
|                 , function() { | 
|                     request("POST" , callurl, { body: JSON.stringify(sessionDescription) }) | 
|                         .done( function (response) {  | 
|                             if (response.statusCode === 200) { | 
|                                 bind.onReceiveCall.call(bind,JSON.parse(response.body)); | 
|                             } | 
|                             else { | 
|                                 bind.onError(response.statusCode); | 
|                             } | 
|                         } | 
|                     );                     | 
|                 } | 
|                 , function() {} ); | 
|              | 
|         }, function(error) {  | 
|             alert("Create offer error:" + JSON.stringify(error)); | 
|         }); | 
|   | 
|     } catch (e) { | 
|         this.disconnect(); | 
|         alert("connect error: " + e); | 
|     }         | 
| } | 
|   | 
| /* | 
| * create RTCPeerConnection  | 
| */ | 
| WebRtcStreamer.prototype.createPeerConnection = function() { | 
|     console.log("createPeerConnection  config: " + JSON.stringify(this.pcConfig) + " option:"+  JSON.stringify(this.pcOptions)); | 
|     var pc = new RTCPeerConnection(this.pcConfig, this.pcOptions); | 
|     var streamer = this; | 
|     pc.onicecandidate = function(evt) { streamer.onIceCandidate.call(streamer, evt); }; | 
|     pc.onaddstream    = function(evt) { streamer.onAddStream.call(streamer,evt); }; | 
|     pc.oniceconnectionstatechange = function(evt) {   | 
|         console.log("oniceconnectionstatechange  state: " + pc.iceConnectionState); | 
|         var videoElement = document.getElementById(streamer.videoElement); | 
|         if (videoElement) { | 
|             if (pc.iceConnectionState === "connected") { | 
|                 videoElement.style.opacity = "1.0"; | 
|             }             | 
|             else if (pc.iceConnectionState === "disconnected") { | 
|                 videoElement.style.opacity = "0.25"; | 
|             }             | 
|             else if ( (pc.iceConnectionState === "failed") || (pc.iceConnectionState === "closed") )  { | 
|                 videoElement.style.opacity = "0.5"; | 
|             }             | 
|         } | 
|     } | 
|     pc.ondatachannel = function(evt) {   | 
|         console.log("remote datachannel created:"+JSON.stringify(evt)); | 
|          | 
|         evt.channel.onopen = function () { | 
|             console.log("remote datachannel open"); | 
|             this.send("remote channel openned"); | 
|         } | 
|         evt.channel.onmessage = function (event) { | 
|             console.log("remote datachannel recv:"+JSON.stringify(event.data)); | 
|         } | 
|     } | 
|   | 
|     try { | 
|         var dataChannel = pc.createDataChannel("ClientDataChannel"); | 
|         dataChannel.onopen = function() { | 
|             console.log("local datachannel open"); | 
|             this.send("local channel openned"); | 
|         } | 
|         dataChannel.onmessage = function(evt) { | 
|             console.log("local datachannel recv:"+JSON.stringify(evt.data)); | 
|         } | 
|     } catch (e) { | 
|         console.log("Cannor create datachannel error: " + e); | 
|     }     | 
|      | 
|     console.log("Created RTCPeerConnnection with config: " + JSON.stringify(this.pcConfig) + "option:"+  JSON.stringify(this.pcOptions) ); | 
|     return pc; | 
| } | 
|   | 
|   | 
| /* | 
| * RTCPeerConnection IceCandidate callback | 
| */ | 
| WebRtcStreamer.prototype.onIceCandidate = function (event) { | 
|     if (event.candidate) { | 
|                 if (this.pc.currentRemoteDescription)  { | 
|             var bind = this; | 
|             request("POST" , this.srvurl + "/api/addIceCandidate?peerid="+this.pc.peerid, { body: JSON.stringify(event.candidate) }) | 
|                 .done( function (response) {  | 
|                     if (response.statusCode === 200) { | 
|                         console.log("addIceCandidate ok:" + response.body); | 
|                     } | 
|                     else { | 
|                         bind.onError(response.statusCode); | 
|                     } | 
|                 } | 
|             );                     | 
|         } else { | 
|             this.earlyCandidates.push(event.candidate); | 
|         } | 
|     }  | 
|     else { | 
|         console.log("End of candidates."); | 
|     } | 
| } | 
|   | 
| /* | 
| * RTCPeerConnection AddTrack callback | 
| */ | 
| WebRtcStreamer.prototype.onAddStream = function(event) { | 
|     console.log("Remote track added:" +  JSON.stringify(event)); | 
|      | 
|     var videoElement = document.getElementById(this.videoElement); | 
|     videoElement.srcObject = event.stream; | 
|     videoElement.setAttribute("playsinline", true); | 
|     videoElement.play(); | 
| } | 
|          | 
| /* | 
| * AJAX /call callback | 
| */ | 
| WebRtcStreamer.prototype.onReceiveCall = function(dataJson) { | 
|     var bind = this; | 
|     console.log("offer: " + JSON.stringify(dataJson)); | 
|     this.pc.setRemoteDescription(new RTCSessionDescription(dataJson) | 
|         , function()      {  | 
|                         console.log ("setRemoteDescription ok"); | 
|                         while (bind.earlyCandidates.length) { | 
|                 var candidate = bind.earlyCandidates.shift(); | 
|                  | 
|                 request("POST" , bind.srvurl + "/api/addIceCandidate?peerid=" + bind.pc.peerid, { body: JSON.stringify(candidate) }) | 
|                     .done( function (response) {  | 
|                         if (response.statusCode === 200) { | 
|                             console.log("addIceCandidate ok:" + response.body); | 
|                         } | 
|                         else { | 
|                             bind.onError(response.statusCode); | 
|                         } | 
|                     } | 
|                 ); | 
|             } | 
|              | 
|             request("GET" , bind.srvurl + "/api/getIceCandidate?peerid=" + bind.pc.peerid) | 
|                 .done( function (response) {  | 
|                     if (response.statusCode === 200) { | 
|                         bind.onReceiveCandidate.call(bind,JSON.parse(response.body)); | 
|                     } | 
|                     else { | 
|                         bind.onError(response.statusCode); | 
|                     } | 
|                 } | 
|             ); | 
|                  | 
|         } | 
|         , function(error) { console.log ("setRemoteDescription error:" + JSON.stringify(error)); }); | 
| }     | 
|   | 
| /* | 
| * AJAX /getIceCandidate callback | 
| */ | 
| WebRtcStreamer.prototype.onReceiveCandidate = function(dataJson) { | 
|     console.log("candidate: " + JSON.stringify(dataJson)); | 
|     if (dataJson) { | 
|         for (var i=0; i<dataJson.length; i++) { | 
|             var candidate = new RTCIceCandidate(dataJson[i]); | 
|              | 
|             console.log("Adding ICE candidate :" + JSON.stringify(candidate) ); | 
|             this.pc.addIceCandidate(candidate | 
|                 , function()      { console.log ("addIceCandidate OK"); } | 
|                 , function(error) { console.log ("addIceCandidate error:" + JSON.stringify(error)); } ); | 
|         } | 
|         this.pc.addIceCandidate(); | 
|     } | 
| } | 
|   | 
|   | 
| /* | 
| * AJAX callback for Error | 
| */ | 
| WebRtcStreamer.prototype.onError = function(status) { | 
|     console.log("onError:" + status); | 
| }</code></pre> | 
|         </article> | 
|     </section> | 
|   | 
|   | 
|   | 
|   | 
| </div> | 
|   | 
| <nav> | 
|     <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="JanusVideoRoom.html">JanusVideoRoom</a></li><li><a href="WebRtcStreamer.html">WebRtcStreamer</a></li><li><a href="XMPPVideoRoom.html">XMPPVideoRoom</a></li></ul> | 
| </nav> | 
|   | 
| <br class="clear"> | 
|   | 
| <footer> | 
|     Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Sat Aug 25 2018 15:00:27 GMT+0200 (CEST) | 
| </footer> | 
|   | 
| <script> prettyPrint(); </script> | 
| <script src="scripts/linenumber.js"> </script> | 
| </body> | 
| </html> |