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