UNPKG

rtcmulticonnection

Version:

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

285 lines (237 loc) 10.6 kB
// Muaz Khan - www.MuazKhan.com // MIT License - www.WebRTC-Experiment.com/licence // Experiments - github.com/muaz-khan/RTCMultiConnection window.enableAdapter = true; // enable adapter.js var rtcMultiConnection = new RTCMultiConnection(); // Using getScreenId.js to capture screen from any domain // You do NOT need to deploy Chrome Extension YOUR-Self!! rtcMultiConnection.getScreenConstraints = function(callback) { getScreenConstraints(function(error, screen_constraints) { if (!error) { screen_constraints = rtcMultiConnection.modifyScreenConstraints(screen_constraints); callback(error, screen_constraints); return; } alert(error); throw error; }); }; rtcMultiConnection.enableFileSharing = true; rtcMultiConnection.customStreams = {}; rtcMultiConnection.renegotiatedSessions = {}; rtcMultiConnection.sendCustomMessage = function(message) { var socket = rtcMultiConnection.getSocket(); socket.emit(rtcMultiConnection.socketCustomEvent, message); }; rtcMultiConnection.session = { data: true }; rtcMultiConnection.sdpConstraints.mandatory = { OfferToReceiveAudio: true, OfferToReceiveVideo: true }; /* // http://www.rtcmulticonnection.org/docs/fakeDataChannels/ rtcMultiConnection.fakeDataChannels = true; if(rtcMultiConnection.UA.Firefox) { rtcMultiConnection.session.data = true; } */ rtcMultiConnection.autoTranslateText = false; rtcMultiConnection.onopen = function(e) { getElement('#allow-webcam').disabled = false; getElement('#allow-mic').disabled = false; getElement('#share-files').disabled = false; getElement('#allow-screen').disabled = false; if(!e.extra.username) { e.extra.username = 'userid:' + e.userid; } addNewMessage({ header: e.extra.username, message: 'Data connection is opened between you and ' + e.extra.username + '.', userinfo: getUserinfo(rtcMultiConnection.blobURLs[rtcMultiConnection.userid], 'images/info.png'), color: '#B7ECB7' }); numbersOfUsers.innerHTML = parseInt(numbersOfUsers.innerHTML) + 1; }; var whoIsTyping = document.querySelector('#who-is-typing'); rtcMultiConnection.onmessage = function(e) { if (e.data.typing) { whoIsTyping.innerHTML = e.extra.username + ' is typing ...'; return; } if (e.data.stoppedTyping) { whoIsTyping.innerHTML = ''; return; } whoIsTyping.innerHTML = ''; addNewMessage({ header: e.extra.username, message: 'Text message from ' + e.extra.username + ':<br /><br />' + (rtcMultiConnection.autoTranslateText ? linkify(e.data) + ' ( ' + linkify(e.original) + ' )' : linkify(e.data)), userinfo: getUserinfo(rtcMultiConnection.blobURLs[e.userid], 'images/chat-message.png'), color: e.extra.color }); document.title = e.data; }; var sessions = { }; rtcMultiConnection.onNewSession = function(session) { if (sessions[session.sessionid]) return; sessions[session.sessionid] = session; session.join(); addNewMessage({ header: session.extra.username, message: 'Making handshake with room owner....!', userinfo: '<img src="images/action-needed.png">', color: session.extra.color }); }; rtcMultiConnection.onNewParticipant = function(participantId, userPreferences) { rtcMultiConnection.acceptParticipationRequest(participantId, userPreferences); var user = rtcMultiConnection.peers[participantId]; addNewMessage({ header: 'New Participant', message: 'A participant found. Accepting request of ' + user.extra.username + ' ( ' + participantId + ' )...', userinfo: '<img src="images/action-needed.png">', color: user.extra.color }); }; rtcMultiConnection.onCustomMessage = function(message) { if (message.hasCamera || message.hasScreen) { var msg = message.extra.username + ' enabled webcam. <button id="preview">Preview</button> ---- <button id="share-your-cam">Share Your Webcam</button>'; if (message.hasScreen) { msg = message.extra.username + ' is ready to share screen. <button id="preview">View His Screen</button> ---- <button id="share-your-cam">Share Your Screen</button>'; } addNewMessage({ header: message.extra.username, message: msg, userinfo: '<img src="images/action-needed.png">', color: message.extra.color, callback: function(div) { div.querySelector('#preview').onclick = function() { this.disabled = true; message.session.oneway = true; rtcMultiConnection.sendMessage({ renegotiate: true, streamid: message.streamid, session: message.session }); }; div.querySelector('#share-your-cam').onclick = function() { this.disabled = true; if (!message.hasScreen) { session = { audio: true, video: true }; rtcMultiConnection.captureUserMedia(function(stream) { rtcMultiConnection.renegotiatedSessions[JSON.stringify(session)] = { session: session, stream: stream }; rtcMultiConnection.addStream(stream, message.userid); div.querySelector('#preview').onclick(); }, session); } if (message.hasScreen) { var session = { screen: true }; rtcMultiConnection.captureUserMedia(function(stream) { rtcMultiConnection.renegotiatedSessions[JSON.stringify(session)] = { session: session, stream: stream } rtcMultiConnection.addStream(stream, message.userid); div.querySelector('#preview').onclick(); }, session); } }; } }); } if (message.hasMic) { addNewMessage({ header: message.extra.username, message: message.extra.username + ' enabled microphone. <button id="listen">Listen</button> ---- <button id="share-your-mic">Share Your Mic</button>', userinfo: '<img src="images/action-needed.png">', color: message.extra.color, callback: function(div) { div.querySelector('#listen').onclick = function() { this.disabled = true; message.session.oneway = true; rtcMultiConnection.sendMessage({ renegotiate: true, streamid: message.streamid, session: message.session }); }; div.querySelector('#share-your-mic').onclick = function() { this.disabled = true; var session = { audio: true }; rtcMultiConnection.captureUserMedia(function(stream) { rtcMultiConnection.renegotiatedSessions[JSON.stringify(session)] = { session: session, stream: stream }; rtcMultiConnection.addStream(stream, message.userid); div.querySelector('#listen').onclick(); }, session); }; } }); } if (message.renegotiate) { var customStream = rtcMultiConnection.customStreams[message.streamid]; if (customStream) { // rtcMultiConnection.peers[message.userid].peer.addStream(customStream); rtcMultiConnection.renegotiate(message.userid); } } }; rtcMultiConnection.blobURLs = { }; rtcMultiConnection.onstream = function(e) { if (e.stream.getVideoTracks().length) { rtcMultiConnection.blobURLs[e.userid] = e.streamid; /* if( document.getElementById(e.userid) ) { document.getElementById(e.userid).muted = true; } */ addNewMessage({ header: e.extra.username, message: e.extra.username + ' enabled webcam.', userinfo: '<video id="' + e.userid + '" src="' + URL.createObjectURL(e.stream) + '" autoplay muted=true volume=0></vide>', color: e.extra.color }); } else { addNewMessage({ header: e.extra.username, message: e.extra.username + ' enabled microphone.', userinfo: '<audio src="' + URL.createObjectURL(e.stream) + '" autoplay controls muted=true volume=0></vide>', color: e.extra.color }); } usersContainer.appendChild(e.mediaElement); }; rtcMultiConnection.sendMessage = function(message) { message.userid = rtcMultiConnection.userid; message.extra = rtcMultiConnection.extra; rtcMultiConnection.sendCustomMessage(message); }; rtcMultiConnection.onclose = function(event) { if(!event.extra.username) { event.extra.username = 'userid:' + event.userid; } addNewMessage({ header: event.extra.username, message: event.extra.username + ' is offline.', userinfo: getUserinfo(rtcMultiConnection.blobURLs[event.userid], 'images/user.png'), color: '#FFACAC' }); }; rtcMultiConnection.onPeerStateChanged = function(event) { if (event.iceConnectionState.search(/closed|failed/gi) !== -1) { if(!event.extra.username) { event.extra.username = 'userid:' + event.userid; } addNewMessage({ header: event.extra.username, message: event.extra.username + ' left the room.', userinfo: getUserinfo(rtcMultiConnection.blobURLs[event.userid], 'images/info.png'), color: event.extra.color }); } };