Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style license
      4 // that can be found in the LICENSE file in the root of the source
      5 // tree. An additional intellectual property rights grant can be found
      6 // in the file PATENTS.  All contributing project authors may
      7 // be found in the AUTHORS file in the root of the source tree.
      8 //
      9 var localStreams = [];
     10 var remoteStreams = [];
     11 
     12 function ping(callback) {
     13   callback("pong");
     14 }
     15 
     16 function getUserMedia(constraints, onSuccessCallback, onFailCallback){
     17   console.log("Getting user media.");
     18   navigator.webkitGetUserMedia(constraints,
     19       onSuccessCallbackWraper, onFailCallback);
     20 
     21   function onSuccessCallbackWraper(stream) {
     22     console.log("GetUserMedia success.");
     23     localStreams[stream.id] = stream;
     24     onSuccessCallback(stream);
     25   }
     26 }
     27 
     28 function createPeerConnection(config, doneCallback, failCallback) {
     29   console.log("Creating peer connection");
     30   var obj = {};
     31   var pc = new webkitRTCPeerConnection(config);
     32 
     33   expose(obj, pc, "close");
     34   expose(obj, pc, "createOffer");
     35   expose(obj, pc, "createAnswer");
     36   expose(obj, pc, "addEventListener");
     37   expose(obj, pc, "addIceCandidate", { 0: RTCIceCandidate});
     38   expose(obj, pc, "setRemoteDescription", { 0: RTCSessionDescription });
     39   expose(obj, pc, "setLocalDescription", { 0: RTCSessionDescription });
     40 
     41   obj.addStream = function(stream) {
     42     console.log("Adding local stream.");
     43     var tempStream = localStreams[stream.id];
     44     if (!tempStream) {
     45       console.log("Undefined stream!");
     46       return;
     47     }
     48     pc.addStream(tempStream);
     49   };
     50 
     51   // Return an array of Objects, each Object is a copy of RTCStateReport
     52   // and has the following attributes (id, type, names, and stats).
     53   // names: array originaly returned by calling RTCStateReport.names().
     54   // stats: dictionary of stat name as key and stat value as dictionary
     55   // value.
     56   obj.getStats = function(callback, mediaTrack) {
     57     pc.getStats(onStatsReady, mediaTrack);
     58 
     59     function onStatsReady(stateResponse) {
     60       var outputReports = [];
     61       var reports = stateResponse.result();
     62       for (index in reports) {
     63         var report = {};
     64         report.id = reports[index].id;
     65         report.type = reports[index].type;
     66         report.names = reports[index].names();
     67         report.stats = [];
     68         populateStats(reports[index], report.stats);
     69 
     70         outputReports.push(report);
     71       }
     72 
     73       callback(outputReports);
     74     }
     75 
     76     function populateStats(report, stats) {
     77       var names = report.names();
     78       for (index in names) {
     79         stats.push({
     80            name: names[index],
     81            stat: report.stat(names[index]),
     82           });
     83       }
     84 
     85     }
     86   };
     87 
     88   pc.addEventListener('addstream', function(event) {
     89     remoteStreams[event.stream.id] = event.stream;
     90   });
     91 
     92   doneCallback(obj);
     93 };
     94 
     95 function showStream(streamId, autoplay, muted) {
     96   var stream = getStreamFromIdentifier_(streamId);
     97   var video = document.createElement('video');
     98   video.autoplay = autoplay;
     99   video.muted = muted;
    100   document.body.appendChild(video);
    101   video.src = URL.createObjectURL(stream);
    102   console.log("Stream " + stream.id + " attached to video element");
    103 };
    104 
    105 function getStreamFromIdentifier_(id) {
    106   var tempStream = localStreams[id];
    107   if (tempStream)
    108     return tempStream;
    109   tempStream = remoteStreams[id];
    110   if (tempStream)
    111     return tempStream;
    112   console.log(id + " is not id for stream.");
    113   return null;
    114 };
    115 
    116 function downloadFile(path, onSuccess, onError) {
    117   var xhr = new XMLHttpRequest();
    118   function onResult() {
    119     if (xhr.readyState != 4)
    120       return;
    121 
    122     if (xhr.status != 200) {
    123       onError("Download request failed!");
    124       return;
    125     }
    126     onSuccess(xhr.responseText);
    127   }
    128 
    129   xhr.onreadystatechange = onResult;
    130   xhr.open('GET', path, true);
    131   xhr.send();
    132 };
    133 
    134 connectToServer({
    135   ping: ping,
    136   getUserMedia: getUserMedia,
    137   createPeerConnection: createPeerConnection,
    138   showStream: showStream,
    139   downloadFile: downloadFile,
    140 });
    141