Created
December 26, 2014 16:03
-
-
Save StasKoval/49aadce8e4cd8ff1eeb9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head lang="en"> | |
<meta charset="UTF-8"> | |
<title></title> | |
<link rel="stylesheet" type="text/css" href="css/bootstrap.css" /> | |
<link rel="stylesheet" type="text/css" href="css/style.css" /> | |
<script type="text/javascript" src="/socket.io/socket.io.js"></script> | |
<script type="text/javascript" src="/underscore-min.js"></script> | |
<script type="text/javascript" src="http://cdn.peerjs.com/0.3/peer.js"></script> | |
</head> | |
<body> | |
<nav class="navbar navbar-default"> | |
<div class="container"> | |
<div class="logo"></div> | |
<div class="logo-text">RESUMEO $HARES</div> | |
<ul class="nav navbar-nav navbar-right"> | |
<div class="logo-text"><span id="inRoomName"></span></div> | |
<li class="tools"> | |
<a href="#"></a> | |
</li> | |
<li class="log_in"> | |
<a href="#"></a> | |
</li> | |
</ul> | |
</div> | |
</nav> | |
<div class="content"> | |
<div class="container "> | |
<div id="videos"> | |
</div> | |
<!--<div id="register">--> | |
<!--<label for="name">Name</label><input id="name">--> | |
<!--<button id="join" onclick="register()">Join</button>--> | |
<!--<label for="asBroadcaster">as broadcaster</label><input type="checkbox" id="asBroadcaster" onclick="broadcasterMode()">--> | |
<!--<input id="broadcasterPassword" style="display:none">--> | |
<!--</div>--> | |
<!--<div id="chat" style="display:none">--> | |
<!--<span id="inRoomName"></span>--> | |
<!--<br>--> | |
<!--<label for="chatMessage">Message </label> <input id="chatMessage" onkeyup="onChatMessageKeyup(event)">--> | |
<!--<hr>--> | |
<!--</div>--> | |
<div id="register"> | |
<div class="create-user"> | |
<input class="create-user" placeholder="Name" id="name"> | |
<button class="create-button" id="join" onclick="register()">JOIN</button> | |
</div> | |
<br> | |
<label for="asBroadcaster">as broadcaster </label> <input type="checkbox" id="asBroadcaster" onclick="broadcasterMode()"> | |
<br> | |
<input class="create-user" id="broadcasterPassword" style="display:none"> | |
</div> | |
<div id="chat" style="display:none"> | |
<div class="dialog"> | |
<div class="comments-history"> | |
</div> | |
<div class="new-comment"> | |
<input class="input-comment" id="chatMessage" onkeyup="onChatMessageKeyup(event)" placeholder="Write something cool..." > | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
<script> | |
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; | |
var socket = io(), | |
participants = {}, | |
name, id, peer, calls = [], isBroadcaster = false, broadcasterStream = null, | |
chat = document.getElementById('chat'); | |
var sdpConstraints = navigator.webkitGetUserMedia | |
? { | |
optional: [], | |
mandatory: { | |
OfferToReceiveAudio: true, | |
OfferToReceiveVideo: true, | |
MozDontOfferDataChannel: true | |
} | |
} | |
: {}; | |
window.onbeforeunload = function() { | |
socket.close(); | |
}; | |
socket.on('chat', function(data) { | |
var div = document.createElement('div'); | |
var today = new Date(); | |
var h = today.getHours(); | |
var m = today.getMinutes(); | |
var s = today.getSeconds(); | |
div.innerHTML = '<div class="comment"><div class="row"><div class="col-md-2"><div class="comment-user">'+ data.sender +'</div><div class="comment-date">['+ h + ":" + m + ":" + s +']:</div></div><div class="col-md-10"><div class="comment-text">' + data.text + '</div></div></div></div> ' | |
// '<b>' + data.sender + '</b>: ' + data.text; | |
document.getElementsByClassName('comments-history')[0].appendChild(div); | |
// chat.appendChild(div); | |
}); | |
socket.on('message', function(message) { | |
console.log('Received message: ', message); | |
if(!id && message.type !== 'roomReady') { | |
return; | |
} | |
switch (message.type) { | |
case 'roomReady': | |
onRoomReady(message); | |
break; | |
case 'newParticipantArrived': | |
onNewParticipant(message); | |
break; | |
case 'participantLeft': | |
onParticipantLeft(message); | |
break; | |
default: | |
console.error('Unrecognized message', message); | |
} | |
}); | |
function broadcasterMode() { | |
var asBroadcaster = document.getElementById('asBroadcaster'); | |
document.getElementById('broadcasterPassword').style.display = asBroadcaster.checked ? 'inline' : 'none'; | |
} | |
function register() { | |
name = document.getElementById('name').value; | |
document.getElementById('register').style.display = 'none'; | |
chat.style.display = 'block'; | |
document.getElementById('inRoomName').innerText = name; | |
var asBroadcaster = document.getElementById('asBroadcaster'); | |
document.getElementById('broadcasterPassword').style.display = asBroadcaster.checked ? 'inline' : 'none'; | |
sendMessage({ | |
type: 'joinRoom', | |
name: name, | |
broadcaster: asBroadcaster.checked ? document.getElementById('broadcasterPassword').value : null | |
}); | |
} | |
function onChatMessageKeyup(e) { | |
if(e.keyCode === 13) { | |
var text = document.getElementById('chatMessage').value; | |
document.getElementById('chatMessage').value = ''; | |
text.length && sendMessage({ | |
type: 'chat', | |
text: text, | |
userId: id | |
}); | |
} | |
} | |
function onRoomReady(message) { | |
console.log(name + " registered in room"); | |
id = message.userId; | |
peer = new Peer(message.userId, { | |
key: 'lwjd5qra8257b9', | |
debug: 0, | |
config: { | |
'iceServers': [{ | |
url: 'stun:79.135.200.66:3478' | |
}] | |
} | |
}); | |
peer.on('open', function(){ | |
console.log('Peer ready'); | |
}); | |
peer.on('error', function(err){ | |
console.log('Peer error:' ,err); | |
}); | |
peer.on('call', function(call) { | |
var video = document.createElement('video'); | |
video.id = call.peer; | |
call.on('stream', function(stream){ | |
video.src = URL.createObjectURL(stream); | |
video.autoplay = true; | |
video.controls = true; | |
document.getElementById('videos').appendChild(video); | |
}); | |
call.on('disconnected', function(){ | |
document.getElementById('videos').removeChild(video); | |
}); | |
call.on('error', function(err){ | |
console.log('Answer error:' ,err); | |
}); | |
call.answer(); | |
}); | |
if(message.isBroadcaster) { | |
isBroadcaster = true; | |
navigator.getUserMedia({ | |
audio: { | |
mandatory: {}, | |
optional: [ | |
//{googDucking:false}, | |
{ | |
googEchoCancellation: true | |
}, { | |
googAutoGainControl: true | |
}, { | |
googNoiseSupression: true | |
}, { | |
googHighpassFilter: true | |
}, { | |
googAudioMirroring: false | |
}, { | |
googNoisesuppression2: true | |
}, { | |
googEchoCancellation2: true | |
}, { | |
googAutoGainControl2: true | |
}, { | |
chromeRenderToAssociatedSink: true | |
}] | |
}, | |
video: { | |
mandatory: { | |
maxWidth: 320, | |
maxHeight: 240, | |
maxFrameRate:20 | |
}, | |
optional: [] | |
} | |
}, function (stream) { | |
broadcasterStream = stream; | |
var video = document.createElement('video'); | |
video.src = URL.createObjectURL(stream); | |
video.volume = 0.1 | |
video.autoplay = true; | |
video.controls = true; | |
document.getElementById('videos').appendChild(video); | |
_.each(message.participants, function(participant) { | |
var call = peer.call(participant.id, broadcasterStream, sdpConstraints); | |
calls.push(call); | |
call.on('error', function(err){ | |
console.log('Call error:' ,err); | |
}); | |
}); | |
}, function(err) { | |
console.log(err); | |
}); | |
} | |
_.each(message.participants, function(participant) { | |
participants[participant.id] = participant; | |
}); | |
} | |
function onNewParticipant(message) { | |
participants[message.user.id] = message.user; | |
if(isBroadcaster) { | |
var call = peer.call(message.user.id, broadcasterStream, sdpConstraints); | |
calls.push(call); | |
} | |
} | |
function onParticipantLeft(message) { | |
console.log('Participant ' + message.user.name + ' left'); | |
var video = document.getElementById(message.user.id); | |
video && document.getElementById('videos').removeChild(video); | |
delete participants[message.user.id]; | |
} | |
function sendMessage(message) { | |
socket.emit('message', message); | |
} | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment