UNPKG

rtcmulticonnection

Version:

RTCMultiConnection is a WebRTC JavaScript wrapper library runs top over RTCPeerConnection API to support all possible peer-to-peer features.

256 lines (198 loc) 7.57 kB
// Muaz Khan - www.MuazKhan.com // MIT License - www.WebRTC-Experiment.com/licence // Experiments - github.com/muaz-khan/RTCMultiConnection 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; rtcMultiConnection.extra.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; rtcMultiConnection.checkPresence(roomid, function(isRoomExists) { if (!isRoomExists) { 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.open(roomid); } else { addNewMessage({ header: username, message: 'Room found. Joining the room...', userinfo: '<img src="images/action-needed.png">' }); rtcMultiConnection.join(roomid); } var socket = rtcMultiConnection.getSocket(); socket.on(rtcMultiConnection.socketCustomEvent, rtcMultiConnection.onCustomMessage); console.debug('room is present?', isRoomExists); }); }; 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]; }