<!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> 
 |