multirtc-websocket
Version:
1) It is a skype-like demo using WebRTC for realtime connections! 2) It allows you enable/disable webcams; and join with or without webcams! 3) It allows you share screen using existing peer connections! 4) It allows you share files with preview and downl
263 lines (207 loc) • 7.6 kB
JavaScript
// Muaz Khan - www.MuazKhan.com
// MIT License - www.WebRTC-Experiment.com/licence
// Experiments - github.com/muaz-khan/WebRTC-Experiment
function getElement(selector) {
return document.querySelector(selector);
}
var main = getElement('.main');
function getRandomColor() {
var letters = '0123456789ABCDEF'.split('');
var color = '#';
for (var i = 0; i < 6; i++) {
color += letters[Math.round(Math.random() * 15)];
}
return color;
}
function addNewMessage(args) {
var newMessageDIV = document.createElement('div');
newMessageDIV.className = 'new-message';
var userinfoDIV = document.createElement('div');
userinfoDIV.className = 'user-info';
userinfoDIV.innerHTML = args.userinfo || '<img src="images/user.png">';
userinfoDIV.style.background = args.color || rtcMultiConnection.extra.color || getRandomColor();
newMessageDIV.appendChild(userinfoDIV);
var userActivityDIV = document.createElement('div');
userActivityDIV.className = 'user-activity';
userActivityDIV.innerHTML = '<h2 class="header">' + args.header + '</h2>';
var p = document.createElement('p');
p.className = 'message';
userActivityDIV.appendChild(p);
p.innerHTML = args.message;
newMessageDIV.appendChild(userActivityDIV);
main.insertBefore(newMessageDIV, main.firstChild);
userinfoDIV.style.height = newMessageDIV.clientHeight + 'px';
if (args.callback) {
args.callback(newMessageDIV);
}
document.querySelector('#message-sound').play();
}
main.querySelector('#your-name').onkeyup = function(e) {
if (e.keyCode != 13) return;
main.querySelector('#continue').onclick();
};
main.querySelector('#room-name').onkeyup = function(e) {
if (e.keyCode != 13) return;
main.querySelector('#continue').onclick();
};
main.querySelector('#room-name').value = localStorage.getItem('room-name') || (Math.random() * 1000).toString().replace('.', '');
if(localStorage.getItem('user-name')) {
main.querySelector('#your-name').value = localStorage.getItem('user-name');
}
main.querySelector('#continue').onclick = function() {
var yourName = this.parentNode.querySelector('#your-name');
var roomName = this.parentNode.querySelector('#room-name');
if(!roomName.value || !roomName.value.length) {
roomName.focus();
return alert('Your MUST Enter Room Name!');
}
localStorage.setItem('room-name', roomName.value);
localStorage.setItem('user-name', yourName.value);
yourName.disabled = roomName.disabled = this.disabled = true;
var username = yourName.value || 'Anonymous';
rtcMultiConnection.extra = {
username: username,
color: getRandomColor()
};
addNewMessage({
header: username,
message: 'Searching for existing rooms...',
userinfo: '<img src="images/action-needed.png">'
});
var roomid = main.querySelector('#room-name').value;
rtcMultiConnection.channel = roomid;
var websocket = new WebSocket(SIGNALING_SERVER);
websocket.onmessage = function(event) {
var data = JSON.parse(event.data);
if (data.isChannelPresent == false) {
addNewMessage({
header: username,
message: 'No room found. Creating new room...<br /><br />You can share following room-id with your friends: <input type=text value="' + roomid + '">',
userinfo: '<img src="images/action-needed.png">'
});
rtcMultiConnection.userid = roomid;
rtcMultiConnection.open({
dontTransmit: true,
sessionid: roomid
});
} else {
addNewMessage({
header: username,
message: 'Room found. Joining the room...',
userinfo: '<img src="images/action-needed.png">'
});
rtcMultiConnection.join({
sessionid: roomid,
userid: roomid,
extra: {},
session: rtcMultiConnection.session
});
}
};
websocket.onopen = function() {
websocket.send(JSON.stringify({
checkPresence: true,
channel: roomid
}));
};
};
function getUserinfo(blobURL, imageURL) {
return blobURL ? '<video src="' + blobURL + '" autoplay controls></video>' : '<img src="' + imageURL + '">';
}
var isShiftKeyPressed = false;
getElement('.main-input-box textarea').onkeydown = function(e) {
if (e.keyCode == 16) {
isShiftKeyPressed = true;
}
};
var numberOfKeys = 0;
getElement('.main-input-box textarea').onkeyup = function(e) {
numberOfKeys++;
if (numberOfKeys > 3) numberOfKeys = 0;
if (!numberOfKeys) {
if (e.keyCode == 8) {
return rtcMultiConnection.send({
stoppedTyping: true
});
}
rtcMultiConnection.send({
typing: true
});
}
if (isShiftKeyPressed) {
if (e.keyCode == 16) {
isShiftKeyPressed = false;
}
return;
}
if (e.keyCode != 13) return;
addNewMessage({
header: rtcMultiConnection.extra.username,
message: 'Your Message:<br /><br />' + linkify(this.value),
userinfo: getUserinfo(rtcMultiConnection.blobURLs[rtcMultiConnection.userid], 'images/chat-message.png'),
color: rtcMultiConnection.extra.color
});
rtcMultiConnection.send(this.value);
this.value = '';
};
getElement('#allow-webcam').onclick = function() {
this.disabled = true;
var session = { audio: true, video: true };
rtcMultiConnection.captureUserMedia(function(stream) {
var streamid = rtcMultiConnection.token();
rtcMultiConnection.customStreams[streamid] = stream;
rtcMultiConnection.sendMessage({
hasCamera: true,
streamid: streamid,
session: session
});
}, session);
};
getElement('#allow-mic').onclick = function() {
this.disabled = true;
var session = { audio: true };
rtcMultiConnection.captureUserMedia(function(stream) {
var streamid = rtcMultiConnection.token();
rtcMultiConnection.customStreams[streamid] = stream;
rtcMultiConnection.sendMessage({
hasMic: true,
streamid: streamid,
session: session
});
}, session);
};
getElement('#allow-screen').onclick = function() {
this.disabled = true;
var session = { screen: true };
rtcMultiConnection.captureUserMedia(function(stream) {
var streamid = rtcMultiConnection.token();
rtcMultiConnection.customStreams[streamid] = stream;
rtcMultiConnection.sendMessage({
hasScreen: true,
streamid: streamid,
session: session
});
}, session);
};
getElement('#share-files').onclick = function() {
var file = document.createElement('input');
file.type = 'file';
file.onchange = function() {
rtcMultiConnection.send(this.files[0]);
};
fireClickEvent(file);
};
function fireClickEvent(element) {
var evt = new MouseEvent('click', {
view: window,
bubbles: true,
cancelable: true
});
element.dispatchEvent(evt);
}
function bytesToSize(bytes) {
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
if (bytes == 0) return '0 Bytes';
var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
}