UNPKG

rtcmulticonnection

Version:

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

290 lines (243 loc) 9.2 kB
// Last time updated at Nov 07, 2016, 08:32:23 // Latest file can be found here: https://cdn.webrtc-experiment.com/getScreenId.js // Muaz Khan - www.MuazKhan.com // MIT License - www.WebRTC-Experiment.com/licence // Documentation - https://github.com/muaz-khan/getScreenId. // ______________ // getScreenId.js /* getScreenId(function (error, sourceId, screen_constraints) { // error == null || 'PermissionDeniedError || 'not-installed' || 'installed-disabled' || 'not-chrome' // sourceId == null || 'string' || 'firefox' if(sourceId == 'firefox') { navigator.mozGetUserMedia(screen_constraints, onSuccess, onFailure); } else navigator.webkitGetUserMedia(screen_constraints, onSuccess, onFailure); }); */ // via: https://bugs.chromium.org/p/chromium/issues/detail?id=487935#c17 // you can capture screen on Android Chrome >= 55 with flag: "Experimental ScreenCapture android" window.IsAndroidChrome = false; try { if (navigator.userAgent.toLowerCase().indexOf("android") > -1 && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)) { window.IsAndroidChrome = true; } } catch (e) {} (function() { window.getScreenId = function(callback) { if (window.IsAndroidChrome) { var screen_constraints = { mandatory: { chromeMediaSource: 'screen', maxWidth: 29999, maxHeight: 8640, minFrameRate: 30, maxFrameRate: 128, minAspectRatio: 1.77 // 2.39 }, optional: [] }; callback(null, null, { video: screen_constraints }); return; } // for Firefox: // sourceId == 'firefox' // screen_constraints = {...} if (!!navigator.mozGetUserMedia) { callback(null, 'firefox', { video: { mozMediaSource: 'window', mediaSource: 'window' } }); return; } postMessage(); window.addEventListener('message', onIFrameCallback); function onIFrameCallback(event) { if (!event.data) return; if (event.data.chromeMediaSourceId) { if (event.data.chromeMediaSourceId === 'PermissionDeniedError') { callback('PermissionDeniedError'); } else callback(null, event.data.chromeMediaSourceId, getScreenConstraints(null, event.data.chromeMediaSourceId)); } if (event.data.chromeExtensionStatus) { callback(event.data.chromeExtensionStatus, null, getScreenConstraints(event.data.chromeExtensionStatus)); } // this event listener is no more needed window.removeEventListener('message', onIFrameCallback); } }; function getScreenConstraints(error, sourceId) { var screen_constraints = { audio: false, video: { mandatory: { chromeMediaSource: error ? 'screen' : 'desktop', maxWidth: window.screen.width > 1920 ? window.screen.width : 1920, maxHeight: window.screen.height > 1080 ? window.screen.height : 1080 }, optional: [] } }; if (sourceId) { screen_constraints.video.mandatory.chromeMediaSourceId = sourceId; } return screen_constraints; } function postMessage() { if (!iframe) { loadIFrame(postMessage); return; } if (!iframe.isLoaded) { setTimeout(postMessage, 100); return; } iframe.contentWindow.postMessage({ captureSourceId: true }, '*'); } function loadIFrame(loadCallback) { if (iframe) { loadCallback(); return; } iframe = document.createElement('iframe'); iframe.onload = function() { iframe.isLoaded = true; loadCallback(); }; iframe.src = 'https://www.webrtc-experiment.com/getSourceId/'; // https://wwww.yourdomain.com/getScreenId.html iframe.style.display = 'none'; (document.body || document.documentElement).appendChild(iframe); } var iframe; // this function is used in v3.0 window.getScreenConstraints = function(callback) { if (window.IsAndroidChrome) { var screen_constraints = { mandatory: { chromeMediaSource: 'screen', maxWidth: 29999, maxHeight: 8640, minFrameRate: 30, maxFrameRate: 128, minAspectRatio: 1.77 // 2.39 }, optional: [] }; callback(null, screen_constraints); return; } loadIFrame(function() { getScreenId(function(error, sourceId, screen_constraints) { callback(error, (screen_constraints || {}).video); }); }); }; })(); (function() { if (document.domain.indexOf('webrtc-experiment.com') === -1) { return; } window.getScreenId = function(callback) { // for Firefox: // sourceId == 'firefox' // screen_constraints = {...} if (!!navigator.mozGetUserMedia) { callback(null, 'firefox', { video: { mozMediaSource: 'window', mediaSource: 'window' } }); return; } postMessage(); window.addEventListener('message', onIFrameCallback); function onIFrameCallback(event) { if (!event.data) return; if (event.data.chromeMediaSourceId) { if (event.data.chromeMediaSourceId === 'PermissionDeniedError') { callback('permission-denied'); } else callback(null, event.data.chromeMediaSourceId, getScreenConstraints(null, event.data.chromeMediaSourceId)); } if (event.data.chromeExtensionStatus) { callback(event.data.chromeExtensionStatus, null, getScreenConstraints(event.data.chromeExtensionStatus)); } // this event listener is no more needed window.removeEventListener('message', onIFrameCallback); } }; function getScreenConstraints(error, sourceId) { var screen_constraints = { audio: false, video: { mandatory: { chromeMediaSource: error ? 'screen' : 'desktop', maxWidth: window.screen.width > 1920 ? window.screen.width : 1920, maxHeight: window.screen.height > 1080 ? window.screen.height : 1080 }, optional: [] } }; if (sourceId) { screen_constraints.video.mandatory.chromeMediaSourceId = sourceId; } return screen_constraints; } function postMessage() { if (!iframe) { loadIFrame(postMessage); return; } if (!iframe.isLoaded) { setTimeout(postMessage, 100); return; } iframe.contentWindow.postMessage({ captureSourceId: true }, '*'); } function loadIFrame(loadCallback) { if (iframe) { loadCallback(); return; } iframe = document.createElement('iframe'); iframe.onload = function() { iframe.isLoaded = true; loadCallback(); }; iframe.src = 'https://www.webrtc-experiment.com/getSourceId/'; // https://wwww.yourdomain.com/getScreenId.html iframe.style.display = 'none'; (document.body || document.documentElement).appendChild(iframe); } var iframe; // this function is used in v3.0 window.getScreenConstraints = function(callback) { if (window.IsAndroidChrome) { var screen_constraints = { mandatory: { chromeMediaSource: 'screen', maxWidth: 29999, maxHeight: 8640, minFrameRate: 30, maxFrameRate: 128, minAspectRatio: 1.77 // 2.39 }, optional: [] }; callback(null, screen_constraints); return; } loadIFrame(function() { getScreenId(function(error, sourceId, screen_constraints) { callback(error, (screen_constraints || {}).video); }); }); }; })();