open-easyrtc
Version:
Open-EasyRTC enables quick development of WebRTC
419 lines (366 loc) • 13.9 kB
JavaScript
//
//Copyright (c) 2016, Skedans Systems, Inc.
//All rights reserved.
//
//Redistribution and use in source and binary forms, with or without
//modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
//AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
//IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
//ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
//LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
//SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
//INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
//CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
//ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
//POSSIBILITY OF SUCH DAMAGE.
//
var selfEasyrtcid = "";
var waitingForRoomList = true;
var isConnected = false;
function initApp() {
document.getElementById("main").className = "notconnected";
}
function addToConversation(who, msgType, content, targeting) {
// Escape html special characters, then add linefeeds.
if( !content) {
content = "**no body**";
}
content = content.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
content = content.replace(/\n/g, '<br />');
var targetingStr = "";
if (targeting) {
if (targeting.targetEasyrtcid) {
targetingStr += "user=" + targeting.targetEasyrtcid;
}
if (targeting.targetRoom) {
targetingStr += " room=" + targeting.targetRoom;
}
if (targeting.targetGroup) {
targetingStr += " group=" + targeting.targetGroup;
}
}
document.getElementById('conversation').innerHTML +=
"<b>" + who + " sent " + targetingStr + ":</b> " + content + "<br />";
}
function genRoomDivName(roomName) {
return "roomblock_" + roomName;
}
function genRoomOccupantName(roomName) {
return "roomOccupant_" + roomName;
}
function setCredential(event, value) {
if (event.keyCode === 13) {
easyrtc.setCredential(value);
}
}
function addRoom(roomName, parmString, userAdded) {
if (!roomName) {
roomName = document.getElementById("roomToAdd").value;
parmString = document.getElementById("optRoomParms").value;
}
var roomid = genRoomDivName(roomName);
if (document.getElementById(roomid)) {
return;
}
function addRoomButton() {
var roomButtonHolder = document.getElementById('rooms');
var roomdiv = document.createElement("div");
roomdiv.id = roomid;
roomdiv.className = "roomDiv";
var roomButton = document.createElement("button");
roomButton.onclick = function() {
sendMessage(null, roomName);
};
var roomLabel = (document.createTextNode(roomName));
roomButton.appendChild(roomLabel);
roomdiv.appendChild(roomButton);
roomButtonHolder.appendChild(roomdiv);
var roomOccupants = document.createElement("div");
roomOccupants.id = genRoomOccupantName(roomName);
roomOccupants.className = "roomOccupants";
roomdiv.appendChild(roomOccupants);
$(roomdiv).append(" -<a href=\"javascript:\leaveRoom('" + roomName + "')\">leave</a>");
}
var roomParms = null;
if (parmString && parmString !== "") {
try {
roomParms = JSON.parse(parmString);
} catch (error) {
roomParms = null;
easyrtc.showError(easyrtc.errCodes.DEVELOPER_ERR, "Room Parameters must be an object containing key/value pairs. eg: {\"fruit\":\"banana\",\"color\":\"yellow\"}");
return;
}
}
if (!isConnected || !userAdded) {
addRoomButton();
console.log("adding gui for room " + roomName);
}
else {
console.log("not adding gui for room " + roomName + " because already connected and it's a user action");
}
if (userAdded) {
console.log("calling joinRoom(" + roomName + ") because it was a user action ");
easyrtc.joinRoom(roomName, roomParms,
function() {
/* we'll geta room entry event for the room we were actually added to */
},
function(errorCode, errorText, roomName) {
easyrtc.showError(errorCode, errorText + ": room name was(" + roomName + ")");
});
}
}
function leaveRoom(roomName) {
if (!roomName) {
roomName = document.getElementById("roomToAdd").value;
}
var entry = document.getElementById(genRoomDivName(roomName));
var roomButtonHolder = document.getElementById('rooms');
easyrtc.leaveRoom(roomName, null);
roomButtonHolder.removeChild(entry);
}
function roomEntryListener(entered, roomName) {
if (entered) { // entered a room
console.log("saw add of room " + roomName);
addRoom(roomName, null, false);
}
else {
var roomNode = document.getElementById(genRoomDivName(roomName));
if (roomNode) {
document.getElementById('#rooms').removeChildNode(roomNode);
}
}
refreshRoomList();
}
function refreshRoomList() {
if( isConnected) {
easyrtc.getRoomList(addQuickJoinButtons, null);
}
}
function peerListener(who, msgType, content, targeting) {
addToConversation(who, msgType, content, targeting);
}
function connect() {
easyrtc.setPeerListener(peerListener);
easyrtc.setRoomOccupantListener(occupantListener);
easyrtc.setRoomEntryListener(roomEntryListener);
easyrtc.setDisconnectListener(function() {
jQuery('#rooms').empty();
document.getElementById("main").className = "notconnected";
console.log("disconnect listener fired");
});
updatePresence();
var username = document.getElementById("userNameField").value;
var password = document.getElementById("credentialField").value;
if (username) {
easyrtc.setUsername(username);
}
if (password) {
easyrtc.setCredential({password: password});
}
easyrtc.connect("easyrtc.instantMessaging", loginSuccess, loginFailure);
}
function disconnect() {
easyrtc.disconnect();
}
function addQuickJoinButtons(roomList) {
var quickJoinBlock = document.getElementById("quickJoinBlock");
var n = quickJoinBlock.childNodes.length;
for (var i = n - 1; i >= 0; i--) {
quickJoinBlock.removeChild(quickJoinBlock.childNodes[i]);
}
function addQuickJoinButton(roomname, numberClients) {
var checkid = "roomblock_" + roomname;
if (document.getElementById(checkid)) {
return; // already present so don't add again
}
var id = "quickjoin_" + roomname;
var div = document.createElement("div");
div.id = id;
div.className = "quickJoin";
var parmsField = document.getElementById("optRoomParms");
var button = document.createElement("button");
button.onclick = function() {
addRoom(roomname, parmsField.value, true);
refreshRoomList();
};
button.appendChild(document.createTextNode("Join " + roomname + "(" + numberClients + ")"));
div.appendChild(button);
quickJoinBlock.appendChild(div);
}
if( !roomList.room1) {
roomList.room1 = { numberClients:0};
}
if( !roomList.room2) {
roomList.room2 = { numberClients:0};
}
if( !roomList.room3) {
roomList.room3 = { numberClients:0};
}
for (var roomName in roomList) {
addQuickJoinButton(roomName, roomList[roomName].numberClients);
}
}
function occupantListener(roomName, occupants, isPrimary) {
if (roomName === null) {
return;
}
var roomId = genRoomOccupantName(roomName);
var roomDiv = document.getElementById(roomId);
if (!roomDiv) {
addRoom(roomName, "", false);
roomDiv = document.getElementById(roomId);
}
else {
jQuery(roomDiv).empty();
}
for (var easyrtcid in occupants) {
var button = document.createElement("button");
button.onclick = (function(roomname, easyrtcid) {
return function() {
sendMessage(easyrtcid, roomName);
};
})(roomName, easyrtcid);
var presenceText = "";
if (occupants[easyrtcid].presence) {
presenceText += "(";
if (occupants[easyrtcid].presence.show) {
presenceText += "show=" + occupants[easyrtcid].presence.show + " ";
}
if (occupants[easyrtcid].presence.status) {
presenceText += "status=" + occupants[easyrtcid].presence.status;
}
presenceText += ")";
}
var label = document.createTextNode(easyrtc.idToName(easyrtcid) + presenceText);
button.appendChild(label);
roomDiv.appendChild(button);
}
refreshRoomList();
}
function getGroupId() {
return null;
}
function sendMessage(destTargetId, destRoom) {
var text = document.getElementById('sendMessageText').value;
if (text.replace(/\s/g, "").length === 0) { // Don't send just whitespace
return;
}
var dest;
var destGroup = getGroupId();
if (destRoom || destGroup) {
dest = {};
if (destRoom) {
dest.targetRoom = destRoom;
}
if (destGroup) {
dest.targetGroup = destGroup;
}
if (destTargetId) {
dest.targetEasyrtcid = destTargetId;
}
}
else if (destTargetId) {
dest = destTargetId;
}
else {
easyrtc.showError("user error", "no destination selected");
return;
}
if( text === "empty") {
easyrtc.sendPeerMessage(dest, "message");
}
else {
easyrtc.sendDataWS(dest, "message", text, function(reply) {
if (reply.msgType === "error") {
easyrtc.showError(reply.msgData.errorCode, reply.msgData.errorText);
}
});
}
addToConversation("Me", "message", text);
document.getElementById('sendMessageText').value = "";
}
function loginSuccess(easyrtcid) {
selfEasyrtcid = easyrtcid;
document.getElementById("iam").innerHTML = "I am " + easyrtcid;
refreshRoomList();
isConnected = true;
displayFields();
document.getElementById("main").className = "connected";
}
function displayFields() {
var outstr = "Application fields<div style='margin-left:1em'>";
outstr += JSON.stringify(easyrtc.getApplicationFields());
outstr += "</div><br>";
outstr += "Session fields<div style='margin-left:1em'>";
outstr += JSON.stringify(easyrtc.getSessionFields());
outstr += "</div><br>";
outstr += "Connection fields<div style='margin-left:1em'>";
outstr += JSON.stringify(easyrtc.getConnectionFields());
outstr += "</div><br>";
var roomlist = easyrtc.getRoomsJoined();
for (var roomname in roomlist) {
var roomfields = easyrtc.getRoomFields(roomname);
if (roomfields != null) {
outstr += "Room " + roomname + " fields<div style='margin-left:1em'>";
outstr += JSON.stringify(roomfields);
outstr += "</div><br>";
}
}
document.getElementById('fields').innerHTML = outstr;
}
function loginFailure(errorCode, message) {
easyrtc.showError("LOGIN-FAILURE", message);
document.getElementById('connectButton').disabled = false;
jQuery('#rooms').empty();
}
var currentShowState = 'chat';
var currentShowText = '';
function setPresence(value) {
currentShowState = value;
updatePresence();
}
function updatePresenceStatus(value) {
currentShowText = value;
updatePresence();
}
function updatePresence()
{
easyrtc.updatePresence(currentShowState, currentShowText);
}
function queryRoomNames() {
var roomName = document.getElementById("queryRoom").value;
if( !roomName ) {
roomName = "default";
}
if( roomName ) {
console.log("getRoomOccupantsAsArray("+ roomName + ")=" + JSON.stringify(easyrtc.getRoomOccupantsAsArray(roomName)));
console.log("getRoomOccupantsAsMap(" + roomName + ")=" + JSON.stringify(easyrtc.getRoomOccupantsAsMap(roomName)));
}
}
function addApiField() {
var roomName = document.getElementById("apiroomname").value;
var fieldname = document.getElementById("apifieldname").value;
var fieldvaluetext = document.getElementById("apifieldvalue").value;
var fieldvalue;
if(fieldvaluetext.indexOf("{") >= 0) {
fieldvalue = JSON.parse(fieldvaluetext);
}
else {
fieldvalue = fieldvaluetext;
}
easyrtc.setRoomApiField(roomName, fieldname, fieldvalue);
}
function getIdsOfName() {
var name = document.getElementById("targetName").value;
var ids = easyrtc.usernameToIds(name);
document.getElementById("foundIds").innerHTML = JSON.stringify(ids);
}