From 04af828a1c09bf422f11f33261583e51d6306304 Mon Sep 17 00:00:00 2001 From: Philipp Hancke Date: Tue, 26 May 2015 09:19:47 -0700 Subject: [PATCH] firefox 38+ supports .urls for RTCIceServer --- adapter.js | 125 +++++++++++++++-------------------------------------- 1 file changed, 34 insertions(+), 91 deletions(-) diff --git a/adapter.js b/adapter.js index 61861e105..e01b908ca 100644 --- a/adapter.js +++ b/adapter.js @@ -21,6 +21,7 @@ var attachMediaStream = null; var reattachMediaStream = null; var webrtcDetectedBrowser = null; var webrtcDetectedVersion = null; +var webrtcMinimumVersion = null; function trace(text) { // This function is used for logging. @@ -40,18 +41,38 @@ if (navigator.mozGetUserMedia) { webrtcDetectedBrowser = 'firefox'; + // the detected firefox version. webrtcDetectedVersion = parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10); + // the minimum firefox version still supported by adapter. + webrtcMinimumVersion = 31; + // The RTCPeerConnection object. RTCPeerConnection = function(pcConfig, pcConstraints) { - // .urls is not supported in FF yet. - if (pcConfig && pcConfig.iceServers) { - for (var i = 0; i < pcConfig.iceServers.length; i++) { - if (pcConfig.iceServers[i].hasOwnProperty('urls')) { - pcConfig.iceServers[i].url = pcConfig.iceServers[i].urls; - delete pcConfig.iceServers[i].urls; + if (webrtcDetectedVersion < 38) { + // .urls is not supported in FF < 38. + // create RTCIceServers with a single url. + if (pcConfig && pcConfig.iceServers) { + var newIceServers = []; + for (var i = 0; i < pcConfig.iceServers.length; i++) { + var server = pcConfig.iceServers[i]; + if (server.hasOwnProperty('urls')) { + for (var j = 0; j < server.urls.length; j++) { + var newServer = { + url: server.urls[j] + }; + if (server.urls[j].indexOf('turn') === 0) { + newServer.username = server.username; + newServer.credential = server.credential; + } + newIceServers.push(newServer); + } + } else { + newIceServers.push(pcConfig.iceServers[i]); + } } + pcConfig.iceServers = newIceServers; } } return new mozRTCPeerConnection(pcConfig, pcConstraints); @@ -79,55 +100,6 @@ if (navigator.mozGetUserMedia) { }, 0); }; - // Creates ICE server from the URL for FF. - window.createIceServer = function(url, username, password) { - var iceServer = null; - var urlParts = url.split(':'); - if (urlParts[0].indexOf('stun') === 0) { - // Create ICE server with STUN URL. - iceServer = { - 'url': url - }; - } else if (urlParts[0].indexOf('turn') === 0) { - if (webrtcDetectedVersion < 27) { - // Create iceServer with turn url. - // Ignore the transport parameter from TURN url for FF version <=27. - var turnUrlParts = url.split('?'); - // Return null for createIceServer if transport=tcp. - if (turnUrlParts.length === 1 || - turnUrlParts[1].indexOf('transport=udp') === 0) { - iceServer = { - 'url': turnUrlParts[0], - 'credential': password, - 'username': username - }; - } - } else { - // FF 27 and above supports transport parameters in TURN url, - // So passing in the full url to create iceServer. - iceServer = { - 'url': url, - 'credential': password, - 'username': username - }; - } - } - return iceServer; - }; - - window.createIceServers = function(urls, username, password) { - var iceServers = []; - // Use .url for FireFox. - for (var i = 0; i < urls.length; i++) { - var iceServer = - window.createIceServer(urls[i], username, password); - if (iceServer !== null) { - iceServers.push(iceServer); - } - } - return iceServers; - }; - // Attach a media stream to an element. attachMediaStream = function(element, stream) { console.log('Attaching media stream'); @@ -143,43 +115,13 @@ if (navigator.mozGetUserMedia) { console.log('This appears to be Chrome'); webrtcDetectedBrowser = 'chrome'; - // Temporary fix until crbug/374263 is fixed. - // Setting Chrome version to 999, if version is unavailable. - var result = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); - if (result !== null) { - webrtcDetectedVersion = parseInt(result[2], 10); - } else { - webrtcDetectedVersion = 999; - } - // Creates iceServer from the url for Chrome M33 and earlier. - window.createIceServer = function(url, username, password) { - var iceServer = null; - var urlParts = url.split(':'); - if (urlParts[0].indexOf('stun') === 0) { - // Create iceServer with stun url. - iceServer = { - 'url': url - }; - } else if (urlParts[0].indexOf('turn') === 0) { - // Chrome M28 & above uses below TURN format. - iceServer = { - 'url': url, - 'credential': password, - 'username': username - }; - } - return iceServer; - }; + // the detected chrome version. + webrtcDetectedVersion = + parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2], 10); - // Creates an ICEServer object from multiple URLs. - window.createIceServers = function(urls, username, password) { - return { - 'urls': urls, - 'credential': password, - 'username': username - }; - }; + // the minimum chrome version still supported by adapter. + webrtcMinimumVersion = 38; // The RTCPeerConnection object. RTCPeerConnection = function(pcConfig, pcConstraints) { @@ -229,7 +171,8 @@ if (typeof module !== 'undefined') { attachMediaStream: attachMediaStream, reattachMediaStream: reattachMediaStream, webrtcDetectedBrowser: webrtcDetectedBrowser, - webrtcDetectedVersion: webrtcDetectedVersion + webrtcDetectedVersion: webrtcDetectedVersion, + webrtcMinimumVersion: webrtcMinimumVersion //requestUserMedia: not exposed on purpose. //trace: not exposed on purpose. };