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//
9var localStreams = [];
10var remoteStreams = [];
11
12function ping(callback) {
13  callback("pong");
14}
15
16function 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
28function 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
95function 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
105function 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
116function 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
134connectToServer({
135  ping: ping,
136  getUserMedia: getUserMedia,
137  createPeerConnection: createPeerConnection,
138  showStream: showStream,
139  downloadFile: downloadFile,
140});
141