<!DOCTYPE html> 
 | 
<html lang="en"> 
 | 
<head> 
 | 
    <meta charset="utf-8"> 
 | 
    <title>JSDoc: Source: janusvideoroom.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: janusvideoroom.js</h1> 
 | 
  
 | 
     
 | 
  
 | 
  
 | 
  
 | 
     
 | 
    <section> 
 | 
        <article> 
 | 
            <pre class="prettyprint source linenums"><code>//var JanusVideoRoom = (function() { 
 | 
  
 | 
     
 | 
/**  
 | 
 * Interface with Janus Gateway Video Room and WebRTC-streamer API 
 | 
 * @constructor 
 | 
 * @param {string} janusUrl - url of Janus Gateway 
 | 
 * @param {string} srvurl - url of WebRTC-streamer 
 | 
*/ 
 | 
var JanusVideoRoom = function JanusVideoRoom (janusUrl, srvurl) {     
 | 
    this.janusUrl    = janusUrl; 
 | 
    this.handlers    = []; 
 | 
    this.srvurl      = srvurl || location.protocol+"//"+window.location.hostname+":"+window.location.port; 
 | 
    this.connection  = []; 
 | 
}; 
 | 
     
 | 
/**  
 | 
* Ask to publish a stream from WebRTC-streamer in a Janus Video Room user 
 | 
 * @param {string} janusroomid - id of the Janus Video Room to join 
 | 
 * @param {string} url - WebRTC stream to publish 
 | 
 * @param {string} name - name in  Janus Video Room 
 | 
*/ 
 | 
JanusVideoRoom.prototype.join = function(janusroomid, url, name) { 
 | 
    // create a session 
 | 
    var createReq = {janus: "create", transaction: Math.random().toString() }; 
 | 
  
 | 
        var bind = this; 
 | 
        request("POST" , this.janusUrl, 
 | 
            {     
 | 
                body: JSON.stringify(createReq), 
 | 
            }).done( function (response) {  
 | 
                if (response.statusCode === 200) { 
 | 
                    bind.onCreateSession(JSON.parse(response.body), janusroomid, url, name); 
 | 
                } 
 | 
                else { 
 | 
                    bind.onError(response.statusCode); 
 | 
                } 
 | 
            } 
 | 
        ); 
 | 
} 
 | 
  
 | 
/** 
 | 
* Ask to unpublish a stream from WebRTC-streamer in a Janus Video Room user 
 | 
 * @param {string} janusroomid - id of the Janus Video Room to join 
 | 
 * @param {string} url - WebRTC stream to publish 
 | 
 * @param {string} name - name in  Janus Video Room 
 | 
*/ 
 | 
JanusVideoRoom.prototype.leave = function(janusroomid, url, name) { 
 | 
    var connection = this.connection[janusroomid + "_" + url + "_" + name]; 
 | 
    if (connection) { 
 | 
        var sessionId = connection.sessionId; 
 | 
        var pluginid  = connection.pluginId; 
 | 
         
 | 
        var leaveReq = { "janus": "message", "body": {"request": "unpublish"}, "transaction": Math.random().toString() }; 
 | 
         
 | 
        var bind = this; 
 | 
        request("POST" , this.janusUrl + "/" + sessionId + "/" + pluginid, 
 | 
            {     
 | 
                body: JSON.stringify(leaveReq), 
 | 
            }).done( function (response) {  
 | 
                if (response.statusCode === 200) { 
 | 
                    console.log("leave janus room answer:" + response.body); 
 | 
                } 
 | 
                else { 
 | 
                    bind.onError(response.statusCode); 
 | 
                } 
 | 
            } 
 | 
        ); 
 | 
    } 
 | 
} 
 | 
  
 | 
/** 
 | 
* subscribeEvents 
 | 
 * @param {string} fn - funtcion to call 
 | 
*/ 
 | 
JanusVideoRoom.prototype.subscribeEvents = function(fn) { 
 | 
    this.handlers.push(fn); 
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// callback  
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.callback = function(name, state) { 
 | 
    this.handlers.forEach(function(item) {  
 | 
        item(name,state); 
 | 
    }); 
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// Janus callback for Session Creation 
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onCreateSession = function(dataJson, janusroomid, url, name) { 
 | 
    var sessionId = dataJson.data.id; 
 | 
    console.log("onCreateSession sessionId:" + sessionId); 
 | 
     
 | 
    // attach to video room plugin 
 | 
    var attachReq = { "janus": "attach", "plugin": "janus.plugin.videoroom", "transaction": Math.random().toString() };             
 | 
     
 | 
    var bind = this; 
 | 
    request("POST" , this.janusUrl + "/" + sessionId, 
 | 
        {     
 | 
            body: JSON.stringify(attachReq), 
 | 
        }).done( function (response) {  
 | 
            if (response.statusCode === 200) { 
 | 
                bind.onPluginsAttached(JSON.parse(response.body), janusroomid, url, name, sessionId); 
 | 
            } 
 | 
            else { 
 | 
                bind.onError(response.statusCode); 
 | 
            } 
 | 
        } 
 | 
    ); 
 | 
} 
 | 
     
 | 
// ------------------------------------------ 
 | 
// Janus callback for Video Room Plugins Connection 
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onPluginsAttached = function(dataJson, janusroomid, url, name, sessionId) { 
 | 
    var pluginid = dataJson.data.id; 
 | 
    console.log("onPluginsAttached pluginid:" + pluginid); 
 | 
     
 | 
    this.callback(name, "joining"); 
 | 
  
 | 
    var joinReq = {"janus":"message","body":{"request":"join","room":janusroomid,"ptype":"publisher","display":name},"transaction":Math.random().toString()}; 
 | 
     
 | 
    var bind = this; 
 | 
    request("POST" , this.janusUrl + "/" + sessionId + "/" + pluginid, 
 | 
        {     
 | 
            body: JSON.stringify(joinReq), 
 | 
        }).done( function (response) {  
 | 
            if (response.statusCode === 200) { 
 | 
                bind.onJoinRoom(JSON.parse(response.body), janusroomid, url, name, sessionId, pluginid); 
 | 
            } 
 | 
            else { 
 | 
                bind.onError(response.statusCode); 
 | 
            } 
 | 
        } 
 | 
    ); 
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// Janus callback for Video Room Joined 
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onJoinRoom = function(dataJson,janusroomid,url,name,sessionId,pluginid) { 
 | 
    console.log("onJoinRoom:" + JSON.stringify(dataJson)); 
 | 
  
 | 
    var bind = this; 
 | 
    request("GET" , this.janusUrl + "/" + sessionId + "?rid=" + new Date().getTime() + "&maxev=1") 
 | 
        .done( function (response) {  
 | 
            if (response.statusCode === 200) { 
 | 
                bind.onJoinRoomResult(JSON.parse(response.body), janusroomid, url, name, sessionId, pluginid); 
 | 
            } 
 | 
            else { 
 | 
                bind.onError(response.statusCode); 
 | 
            } 
 | 
        } 
 | 
    ); 
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// Janus callback for Video Room Joined 
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onJoinRoomResult = function(dataJson,janusroomid,url,name,sessionId,pluginid) { 
 | 
    console.log("onJoinRoomResult:" + JSON.stringify(dataJson)); 
 | 
  
 | 
    if (dataJson.plugindata.data.videoroom === "joined") {     
 | 
        // register connection 
 | 
        this.connection[janusroomid + "_" + url + "_" + name] = {"sessionId":sessionId, "pluginId": pluginid }; 
 | 
         
 | 
        // notify new state 
 | 
        this.callback(name, "joined"); 
 | 
         
 | 
        var peerid = Math.random().toString(); 
 | 
         
 | 
        var createOfferUrl = this.srvurl + "/api/createOffer?peerid="+ peerid+"&url="+encodeURIComponent(url.video); 
 | 
        if (url.audio) { 
 | 
            createOfferUrl += "&audiourl="+encodeURIComponent(url.audio); 
 | 
        } 
 | 
        var bind = this; 
 | 
        request("GET" , createOfferUrl) 
 | 
            .done( function (response) {  
 | 
                if (response.statusCode === 200) { 
 | 
                    bind.onCreateOffer(JSON.parse(response.body), name, sessionId, pluginid, peerid); 
 | 
                } 
 | 
                else { 
 | 
                    bind.onError(response.statusCode); 
 | 
                } 
 | 
            } 
 | 
        );         
 | 
    } else { 
 | 
        this.callback(name, "joining room failed"); 
 | 
    } 
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// WebRTC streamer callback for Offer  
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onCreateOffer = function(dataJson,name,sessionId,pluginid,peerid) { 
 | 
    console.log("onCreateOffer:" + JSON.stringify(dataJson)); 
 | 
     
 | 
    this.callback(name, "publishing"); 
 | 
     
 | 
    var publishReq = { "janus": "message", "body": {"request": "publish", "video": true, "audio": true, "data": true}, "jsep": dataJson, "transaction": Math.random().toString() };         
 | 
    var bind = this; 
 | 
    request("POST" , this.janusUrl + "/" + sessionId + "/" + pluginid, 
 | 
        {     
 | 
            body: JSON.stringify(publishReq), 
 | 
        }).done( function (response) {  
 | 
            if (response.statusCode === 200) { 
 | 
                bind.onPublishStream(JSON.parse(response.body), name, sessionId, pluginid, peerid); 
 | 
            } 
 | 
            else { 
 | 
                bind.onError(response.statusCode); 
 | 
            } 
 | 
        } 
 | 
    );         
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// Janus callback for WebRTC stream is published 
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onPublishStream = function(dataJson,name,sessionId,pluginid,peerid) { 
 | 
    console.log("onPublishStream:" + JSON.stringify(dataJson)); 
 | 
  
 | 
    var bind = this; 
 | 
    request("GET" , this.janusUrl + "/" + sessionId + "?rid=" + new Date().getTime() + "&maxev=1") 
 | 
        .done( function (response) {  
 | 
            if (response.statusCode === 200) { 
 | 
                bind.onPublishStreamResult(JSON.parse(response.body), name, sessionId, pluginid, peerid); 
 | 
            } 
 | 
            else { 
 | 
                bind.onError(response.statusCode); 
 | 
            } 
 | 
        } 
 | 
    );         
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// Janus callback for WebRTC stream is published 
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onPublishStreamResult = function(dataJson,name,sessionId,pluginid,peerid) { 
 | 
    console.log("onPublishStreamResult:" + JSON.stringify(dataJson)); 
 | 
  
 | 
    if (dataJson.jsep) { 
 | 
        var bind = this; 
 | 
        request("POST" , this.srvurl + "/api/setAnswer?peerid="+ peerid, 
 | 
            {     
 | 
                body: JSON.stringify(dataJson.jsep), 
 | 
            }).done( function (response) {  
 | 
                if (response.statusCode === 200) { 
 | 
                    bind.onSetAnswer(JSON.parse(response.body), name, sessionId, pluginid, peerid); 
 | 
                } 
 | 
                else { 
 | 
                    bind.onError(response.statusCode); 
 | 
                } 
 | 
            } 
 | 
        );         
 | 
    } else { 
 | 
        this.callback(name, "publishing failed (no SDP)"); 
 | 
    } 
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// WebRTC streamer callback for Answer  
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onSetAnswer = function(dataJson,name,sessionId,pluginid,peerid) { 
 | 
    console.log("onSetAnswer:" + JSON.stringify(dataJson)); 
 | 
     
 | 
    var bind = this; 
 | 
    request("GET" , this.srvurl + "/api/getIceCandidate?peerid="+peerid) 
 | 
        .done( function (response) {  
 | 
            if (response.statusCode === 200) { 
 | 
                bind.onReceiveCandidate(JSON.parse(response.body), name, sessionId, pluginid); 
 | 
            } 
 | 
            else { 
 | 
                bind.onError(response.statusCode); 
 | 
            } 
 | 
        } 
 | 
    );         
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// WebRTC streamer callback for ICE candidate  
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onReceiveCandidate = function(dataJson,name,sessionId,pluginid) { 
 | 
    console.log("onReceiveCandidate answer:" + JSON.stringify(dataJson)); 
 | 
     
 | 
    for (var i=0; i<dataJson.length; i++) { 
 | 
        // send ICE candidate to Janus 
 | 
        var candidateReq = { "janus": "trickle", "candidate": dataJson[i], "transaction": Math.random().toString()  }; 
 | 
         
 | 
        var bind = this; 
 | 
        request("POST" , this.janusUrl + "/" + sessionId + "/" + pluginid, 
 | 
            {     
 | 
                body: JSON.stringify(candidateReq), 
 | 
            }).done( function (response) {  
 | 
                if (response.statusCode === 200) { 
 | 
                    console.log("onReceiveCandidate janus answer:" + response.body); 
 | 
                } 
 | 
                else { 
 | 
                    bind.onError(response.statusCode); 
 | 
                } 
 | 
            } 
 | 
        );         
 | 
    } 
 | 
     
 | 
    // start long polling 
 | 
    this.longpoll(null, name, sessionId);     
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// Janus callback for keepAlive Session 
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.keepAlive = function(sessionId) { 
 | 
    var keepAliveReq = { "janus": "keepalive", "session_id": sessionId, "transaction": Math.random().toString()  }; 
 | 
     
 | 
    var bind = this; 
 | 
    request("POST" , this.janusUrl + "/" + sessionId, 
 | 
        {     
 | 
            body: JSON.stringify(keepAliveReq), 
 | 
        }).done( function (response) {  
 | 
            if (response.statusCode === 200) { 
 | 
                console.log("keepAlive:" + response.body); 
 | 
            } 
 | 
            else { 
 | 
                bind.onError(response.statusCode); 
 | 
            } 
 | 
        } 
 | 
    );         
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// Janus callback for Long Polling 
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.longpoll = function(dataJson, name, sessionId) { 
 | 
    if (dataJson) { 
 | 
        console.log("poll evt:" + JSON.stringify(dataJson)); 
 | 
     
 | 
        if (dataJson.janus === "webrtcup") { 
 | 
            // notify connection 
 | 
            this.callback(name, "up"); 
 | 
             
 | 
            // start keep alive 
 | 
            var bind = this; 
 | 
            setInterval( function() { bind.keepAlive(sessionId); }, 10000);     
 | 
        } 
 | 
        else if (dataJson.janus === "hangup") { 
 | 
            // notify connection 
 | 
            this.callback(name, "down"); 
 | 
        } 
 | 
    } 
 | 
     
 | 
    var bind = this; 
 | 
    request("GET" , this.janusUrl + "/" + sessionId + "?rid=" + new Date().getTime() + "&maxev=1") 
 | 
        .done( function (response) {  
 | 
            bind.longpoll( JSON.parse(response.body), name, sessionId); 
 | 
        } 
 | 
    );         
 | 
} 
 | 
  
 | 
// ------------------------------------------ 
 | 
// Janus callback for Error 
 | 
// ------------------------------------------ 
 | 
JanusVideoRoom.prototype.onError = function(status) { 
 | 
    console.log("onError:" + status); 
 | 
} 
 | 
  
 | 
  
 | 
//return JanusVideoRoom; 
 | 
//})(); 
 | 
  
 | 
//module.exports = JanusVideoRoom; 
 | 
</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> 
 |