UNPKG

rtcmulticonnection

Version:

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

227 lines (194 loc) 10.2 kB
// Last time updated at March 15, 2016 // Latest file can be found here: https://cdn.webrtc-experiment.com/Plugin.EveryWhere.js // Muaz Khan - www.MuazKhan.com // MIT License - www.WebRTC-Experiment.com/licence // Source Codes - https://github.com/muaz-khan/PluginRTC // _____________________ // Plugin.EveryWhere.js // Original Source: https://github.com/sarandogou/webrtc-everywhere#downloads (function() { var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0; var isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveOrOpenBlob || !!navigator.msSaveBlob); var isIE = !!document.documentMode && !isEdge; var isMobileDevice = !!navigator.userAgent.match(/Android|iPhone|iPad|iPod|BlackBerry|IEMobile/i); if (typeof cordova !== 'undefined') { isMobileDevice = true; } if (navigator.userAgent.indexOf('Crosswalk') !== -1) { isMobileDevice = true; } if (!(isSafari || isIE) || isMobileDevice) return; function LoadPluginRTC() { window.PluginRTC = {}; var extractPluginObj = function(elt) { return elt.isWebRtcPlugin ? elt : elt.pluginObj; } var attachEventListener = function(elt, type, listener, useCapture) { var _pluginObj = extractPluginObj(elt); if (_pluginObj) { _pluginObj.bindEventListener(type, listener, useCapture); } else { if (typeof elt.addEventListener !== 'undefined') { elt.addEventListener(type, listener, useCapture); } else if (typeof elt.addEvent !== 'undefined') { elt.addEventListener('on' + type, listener, useCapture); } } } var pluginUID = 'WebrtcEverywherePluginId'; function getPlugin() { return document.getElementById(pluginUID); } var installPlugin = function() { if (document.getElementById(pluginUID)) { return; } var isInternetExplorer = !!((Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(window, 'ActiveXObject')) || ('ActiveXObject' in window)); var isSafari = !!navigator.userAgent.indexOf('Safari'); var pluginObj = document.createElement('object'); if (isInternetExplorer) { pluginObj.setAttribute('classid', 'CLSID:7FD49E23-C8D7-4C4F-93A1-F7EACFA1EC53'); isInternetExplorer = true; } else { pluginObj.setAttribute('type', 'application/webrtc-everywhere'); } pluginObj.setAttribute('id', pluginUID); document.body.appendChild(pluginObj); pluginObj.setAttribute('width', '0'); pluginObj.setAttribute('height', '0'); if (pluginObj.isWebRtcPlugin || (typeof navigator.plugins !== 'undefined' && (!!navigator.plugins['WebRTC Everywhere'] || navigator.plugins['WebRTC Everywhere Plug-in for Safari']))) { if (isInternetExplorer) { webrtcDetectedBrowser = 'Internet Explorer'; } else if (isSafari) { webrtcDetectedBrowser = 'Safari'; } } } if (document.body) { installPlugin(); } else { attachEventListener(window, 'load', function() { installPlugin(); }); attachEventListener(document, 'readystatechange', function() { if (document.readyState == 'complete') { installPlugin(); } }); } var getUserMediaDelayed; window.PluginRTC.getUserMedia = navigator.getUserMedia = function(constraints, successCallback, errorCallback) { if (document.readyState !== 'complete') { if (!getUserMediaDelayed) { getUserMediaDelayed = true; attachEventListener(document, 'readystatechange', function() { if (getUserMediaDelayed && document.readyState == 'complete') { getUserMediaDelayed = false; getPlugin().getUserMedia(constraints, successCallback, errorCallback); } }); } } else { getPlugin().getUserMedia(constraints, successCallback, errorCallback); } } window.PluginRTC.attachMediaStream = function(element, stream) { if (!element) { return null; } if (element.isWebRtcPlugin) { element.src = stream; return element; } else if (element.nodeName.toLowerCase() === 'video') { if (!element.pluginObj && stream) { var _pluginObj = document.createElement('object'); var _isIE = (Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(window, 'ActiveXObject')) || ('ActiveXObject' in window); if (_isIE) { // windowless var windowlessParam = document.createElement('param'); windowlessParam.setAttribute('name', 'windowless'); windowlessParam.setAttribute('value', true); _pluginObj.appendChild(windowlessParam); _pluginObj.setAttribute('classid', 'CLSID:7FD49E23-C8D7-4C4F-93A1-F7EACFA1EC53'); } else { _pluginObj.setAttribute('type', 'application/webrtc-everywhere'); } element.pluginObj = _pluginObj; _pluginObj.setAttribute('className', element.className); _pluginObj.setAttribute('innerHTML', element.innerHTML); var width = element.getAttribute('width'); var height = element.getAttribute('height'); var bounds = element.getBoundingClientRect(); if (!width) width = bounds.right - bounds.left; if (!height) height = bounds.bottom - bounds.top; if ('getComputedStyle' in window) { var computedStyle = window.getComputedStyle(element, null); if (!width && computedStyle.width != 'auto' && computedStyle.width != '0px') { width = computedStyle.width; } if (!height && computedStyle.height != 'auto' && computedStyle.height != '0px') { height = computedStyle.height; } } if (width) _pluginObj.setAttribute('width', width); else _pluginObj.setAttribute('autowidth', true); if (height) _pluginObj.setAttribute('height', height); else _pluginObj.setAttribute('autoheight', true); document.body.appendChild(_pluginObj); if (element.parentNode) { element.parentNode.replaceChild(_pluginObj, element); // replace (and remove) element // add element again to be sure any query() will succeed document.body.appendChild(element); element.style.visibility = 'hidden'; } } if (element.pluginObj) { element.pluginObj.bindEventListener('play', function(objvid) { if (element.pluginObj) { if (element.pluginObj.getAttribute('autowidth') && objvid.videoWidth) { element.pluginObj.setAttribute('width', objvid.videoWidth /* + 'px'*/ ); } if (element.pluginObj.getAttribute('autoheight') && objvid.videoHeight) { element.pluginObj.setAttribute('height', objvid.videoHeight /* + 'px'*/ ); } } }); element.pluginObj.src = stream; } return element.pluginObj; } else if (element.nodeName.toLowerCase() === 'audio') { return element; } }; window.PluginRTC.MediaStreamTrack = {}; var getSourcesDelayed; window.PluginRTC.MediaStreamTrack.getSources = function(gotSources) { if (document.readyState !== 'complete') { if (!getSourcesDelayed) { getSourcesDelayed = true; attachEventListener(document, 'readystatechange', function() { if (getSourcesDelayed && document.readyState == 'complete') { getSourcesDelayed = false; getPlugin().getSources(gotSources); } }); } } else { getPlugin().getSources(gotSources); } } window.PluginRTC.RTCPeerConnection = function(configuration, constraints) { return getPlugin().createPeerConnection(configuration, constraints); } window.PluginRTC.RTCIceCandidate = function(RTCIceCandidateInit) { return getPlugin().createIceCandidate(RTCIceCandidateInit); } window.PluginRTC.RTCSessionDescription = function(RTCSessionDescriptionInit) { return getPlugin().createSessionDescription(RTCSessionDescriptionInit); } if (window.onPluginRTCInitialized) { window.onPluginRTCInitialized(window.PluginRTC); } } window.addEventListener('load', LoadPluginRTC, false); })();