1 var RTCPeerConnection = null; 2 var getUserMedia = null; 3 var attachMediaStream = null; 4 var reattachMediaStream = null; 5 var webrtcDetectedBrowser = null; 6 var webrtcDetectedVersion = null; 7 8 function trace(text) { 9 // This function is used for logging. 10 if (text[text.length - 1] == '\n') { 11 text = text.substring(0, text.length - 1); 12 } 13 console.log((performance.now() / 1000).toFixed(3) + ": " + text); 14 } 15 function maybeFixConfiguration(pcConfig) { 16 if (pcConfig == null) { 17 return; 18 } 19 for (var i = 0; i < pcConfig.iceServers.length; i++) { 20 if (pcConfig.iceServers[i].hasOwnProperty('urls')){ 21 pcConfig.iceServers[i]['url'] = pcConfig.iceServers[i]['urls']; 22 delete pcConfig.iceServers[i]['urls']; 23 } 24 } 25 } 26 27 if (navigator.mozGetUserMedia) { 28 console.log("This appears to be Firefox"); 29 30 webrtcDetectedBrowser = "firefox"; 31 32 webrtcDetectedVersion = 33 parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10); 34 35 // The RTCPeerConnection object. 36 var RTCPeerConnection = function(pcConfig, pcConstraints) { 37 // .urls is not supported in FF yet. 38 maybeFixConfiguration(pcConfig); 39 return new mozRTCPeerConnection(pcConfig, pcConstraints); 40 } 41 42 // The RTCSessionDescription object. 43 RTCSessionDescription = mozRTCSessionDescription; 44 45 // The RTCIceCandidate object. 46 RTCIceCandidate = mozRTCIceCandidate; 47 48 // Get UserMedia (only difference is the prefix). 49 // Code from Adam Barth. 50 getUserMedia = navigator.mozGetUserMedia.bind(navigator); 51 navigator.getUserMedia = getUserMedia; 52 53 // Creates iceServer from the url for FF. 54 createIceServer = function(url, username, password) { 55 var iceServer = null; 56 var url_parts = url.split(':'); 57 if (url_parts[0].indexOf('stun') === 0) { 58 // Create iceServer with stun url. 59 iceServer = { 'url': url }; 60 } else if (url_parts[0].indexOf('turn') === 0) { 61 if (webrtcDetectedVersion < 27) { 62 // Create iceServer with turn url. 63 // Ignore the transport parameter from TURN url for FF version <=27. 64 var turn_url_parts = url.split("?"); 65 // Return null for createIceServer if transport=tcp. 66 if (turn_url_parts.length === 1 || 67 turn_url_parts[1].indexOf('transport=udp') === 0) { 68 iceServer = {'url': turn_url_parts[0], 69 'credential': password, 70 'username': username}; 71 } 72 } else { 73 // FF 27 and above supports transport parameters in TURN url, 74 // So passing in the full url to create iceServer. 75 iceServer = {'url': url, 76 'credential': password, 77 'username': username}; 78 } 79 } 80 return iceServer; 81 }; 82 83 createIceServers = function(urls, username, password) { 84 var iceServers = []; 85 // Use .url for FireFox. 86 for (i = 0; i < urls.length; i++) { 87 var iceServer = createIceServer(urls[i], 88 username, 89 password); 90 if (iceServer !== null) { 91 iceServers.push(iceServer); 92 } 93 } 94 return iceServers; 95 } 96 97 // Attach a media stream to an element. 98 attachMediaStream = function(element, stream) { 99 console.log("Attaching media stream"); 100 element.mozSrcObject = stream; 101 element.play(); 102 }; 103 104 reattachMediaStream = function(to, from) { 105 console.log("Reattaching media stream"); 106 to.mozSrcObject = from.mozSrcObject; 107 to.play(); 108 }; 109 110 // Fake get{Video,Audio}Tracks 111 if (!MediaStream.prototype.getVideoTracks) { 112 MediaStream.prototype.getVideoTracks = function() { 113 return []; 114 }; 115 } 116 117 if (!MediaStream.prototype.getAudioTracks) { 118 MediaStream.prototype.getAudioTracks = function() { 119 return []; 120 }; 121 } 122 } else if (navigator.webkitGetUserMedia) { 123 console.log("This appears to be Chrome"); 124 125 webrtcDetectedBrowser = "chrome"; 126 webrtcDetectedVersion = 127 parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2], 10); 128 129 // Creates iceServer from the url for Chrome M33 and earlier. 130 createIceServer = function(url, username, password) { 131 var iceServer = null; 132 var url_parts = url.split(':'); 133 if (url_parts[0].indexOf('stun') === 0) { 134 // Create iceServer with stun url. 135 iceServer = { 'url': url }; 136 } else if (url_parts[0].indexOf('turn') === 0) { 137 // Chrome M28 & above uses below TURN format. 138 iceServer = {'url': url, 139 'credential': password, 140 'username': username}; 141 } 142 return iceServer; 143 }; 144 145 // Creates iceServers from the urls for Chrome M34 and above. 146 createIceServers = function(urls, username, password) { 147 var iceServers = []; 148 if (webrtcDetectedVersion >= 34) { 149 // .urls is supported since Chrome M34. 150 iceServers = {'urls': urls, 151 'credential': password, 152 'username': username }; 153 } else { 154 for (i = 0; i < urls.length; i++) { 155 var iceServer = createIceServer(urls[i], 156 username, 157 password); 158 if (iceServer !== null) { 159 iceServers.push(iceServer); 160 } 161 } 162 } 163 return iceServers; 164 }; 165 166 // The RTCPeerConnection object. 167 var RTCPeerConnection = function(pcConfig, pcConstraints) { 168 // .urls is supported since Chrome M34. 169 if (webrtcDetectedVersion < 34) { 170 maybeFixConfiguration(pcConfig); 171 } 172 return new webkitRTCPeerConnection(pcConfig, pcConstraints); 173 } 174 175 // Get UserMedia (only difference is the prefix). 176 // Code from Adam Barth. 177 getUserMedia = navigator.webkitGetUserMedia.bind(navigator); 178 navigator.getUserMedia = getUserMedia; 179 180 // Attach a media stream to an element. 181 attachMediaStream = function(element, stream) { 182 if (typeof element.srcObject !== 'undefined') { 183 element.srcObject = stream; 184 } else if (typeof element.mozSrcObject !== 'undefined') { 185 element.mozSrcObject = stream; 186 } else if (typeof element.src !== 'undefined') { 187 element.src = URL.createObjectURL(stream); 188 } else { 189 console.log('Error attaching stream to element.'); 190 } 191 }; 192 193 reattachMediaStream = function(to, from) { 194 to.src = from.src; 195 }; 196 } else { 197 console.log("Browser does not appear to be WebRTC-capable"); 198 } 199