1 var RTCPeerConnection = null;
2 var getUserMedia = null;
3 var attachMediaStream = null;
4 var reattachMediaStream = null;
5 var webrtcDetectedBrowser = null;
6 var webrtcDetectedVersion = null;
9 // This function is used for logging.
10 if (text[text.length - 1] == '\n') {
11 text = text.substring(0, text.length - 1);
13 console.log((performance.now() / 1000).toFixed(3) + ": " + text);
15 function maybeFixConfiguration(pcConfig) {
16 if (pcConfig == null) {
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'];
27 if (navigator.mozGetUserMedia) {
28 console.log("This appears to be Firefox");
30 webrtcDetectedBrowser = "firefox";
32 webrtcDetectedVersion =
33 parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10);
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);
42 // The RTCSessionDescription object.
43 RTCSessionDescription = mozRTCSessionDescription;
45 // The RTCIceCandidate object.
46 RTCIceCandidate = mozRTCIceCandidate;
48 // Get UserMedia (only difference is the prefix).
49 // Code from Adam Barth.
50 getUserMedia = navigator.mozGetUserMedia.bind(navigator);
51 navigator.getUserMedia = getUserMedia;
53 // Creates iceServer from the url for FF.
54 createIceServer = function(url, username, password) {
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};
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};
83 createIceServers = function(urls, username, password) {
85 // Use .url for FireFox.
86 for (i = 0; i < urls.length; i++) {
87 var iceServer = createIceServer(urls[i],
90 if (iceServer !== null) {
91 iceServers.push(iceServer);
97 // Attach a media stream to an element.
98 attachMediaStream = function(element, stream) {
99 console.log("Attaching media stream");
100 element.mozSrcObject = stream;
104 reattachMediaStream = function(to, from) {
105 console.log("Reattaching media stream");
106 to.mozSrcObject = from.mozSrcObject;
110 // Fake get{Video,Audio}Tracks
111 if (!MediaStream.prototype.getVideoTracks) {
112 MediaStream.prototype.getVideoTracks = function() {
117 if (!MediaStream.prototype.getAudioTracks) {
118 MediaStream.prototype.getAudioTracks = function() {
122 } else if (navigator.webkitGetUserMedia) {
123 console.log("This appears to be Chrome");
125 webrtcDetectedBrowser = "chrome";
126 webrtcDetectedVersion =
127 parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2], 10);
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};
145 // Creates iceServers from the urls for Chrome M34 and above.
146 createIceServers = function(urls, username, password) {
148 if (webrtcDetectedVersion >= 34) {
149 // .urls is supported since Chrome M34.
150 iceServers = {'urls': urls,
151 'credential': password,
152 'username': username };
154 for (i = 0; i < urls.length; i++) {
155 var iceServer = createIceServer(urls[i],
158 if (iceServer !== null) {
159 iceServers.push(iceServer);
166 // The RTCPeerConnection object.
167 var RTCPeerConnection = function(pcConfig, pcConstraints) {
168 // .urls is supported since Chrome M34.
169 if (webrtcDetectedVersion < 34) {
170 maybeFixConfiguration(pcConfig);
172 return new webkitRTCPeerConnection(pcConfig, pcConstraints);
175 // Get UserMedia (only difference is the prefix).
176 // Code from Adam Barth.
177 getUserMedia = navigator.webkitGetUserMedia.bind(navigator);
178 navigator.getUserMedia = getUserMedia;
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);
189 console.log('Error attaching stream to element.');
193 reattachMediaStream = function(to, from) {
197 console.log("Browser does not appear to be WebRTC-capable");