// Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // var localStreams = []; var remoteStreams = []; function ping(callback) { callback("pong"); } function getUserMedia(constraints, onSuccessCallback, onFailCallback){ console.log("Getting user media."); navigator.webkitGetUserMedia(constraints, onSuccessCallbackWraper, onFailCallback); function onSuccessCallbackWraper(stream) { console.log("GetUserMedia success."); localStreams[stream.id] = stream; onSuccessCallback(stream); } } function createPeerConnection(config, doneCallback, failCallback) { console.log("Creating peer connection"); var obj = {}; var pc = new webkitRTCPeerConnection(config); expose(obj, pc, "close"); expose(obj, pc, "createOffer"); expose(obj, pc, "createAnswer"); expose(obj, pc, "addEventListener"); expose(obj, pc, "addIceCandidate", { 0: RTCIceCandidate}); expose(obj, pc, "setRemoteDescription", { 0: RTCSessionDescription }); expose(obj, pc, "setLocalDescription", { 0: RTCSessionDescription }); obj.addStream = function(stream) { console.log("Adding local stream."); var tempStream = localStreams[stream.id]; if (!tempStream) { console.log("Undefined stream!"); return; } pc.addStream(tempStream); }; // Return an array of Objects, each Object is a copy of RTCStateReport // and has the following attributes (id, type, names, and stats). // names: array originaly returned by calling RTCStateReport.names(). // stats: dictionary of stat name as key and stat value as dictionary // value. obj.getStats = function(callback, mediaTrack) { pc.getStats(onStatsReady, mediaTrack); function onStatsReady(stateResponse) { var outputReports = []; var reports = stateResponse.result(); for (index in reports) { var report = {}; report.id = reports[index].id; report.type = reports[index].type; report.names = reports[index].names(); report.stats = []; populateStats(reports[index], report.stats); outputReports.push(report); } callback(outputReports); } function populateStats(report, stats) { var names = report.names(); for (index in names) { stats.push({ name: names[index], stat: report.stat(names[index]), }); } } }; pc.addEventListener('addstream', function(event) { remoteStreams[event.stream.id] = event.stream; }); doneCallback(obj); }; function showStream(streamId, autoplay, muted) { var stream = getStreamFromIdentifier_(streamId); var video = document.createElement('video'); video.autoplay = autoplay; video.muted = muted; document.body.appendChild(video); video.src = URL.createObjectURL(stream); console.log("Stream " + stream.id + " attached to video element"); }; function getStreamFromIdentifier_(id) { var tempStream = localStreams[id]; if (tempStream) return tempStream; tempStream = remoteStreams[id]; if (tempStream) return tempStream; console.log(id + " is not id for stream."); return null; }; function downloadFile(path, onSuccess, onError) { var xhr = new XMLHttpRequest(); function onResult() { if (xhr.readyState != 4) return; if (xhr.status != 200) { onError("Download request failed!"); return; } onSuccess(xhr.responseText); } xhr.onreadystatechange = onResult; xhr.open('GET', path, true); xhr.send(); }; connectToServer({ ping: ping, getUserMedia: getUserMedia, createPeerConnection: createPeerConnection, showStream: showStream, downloadFile: downloadFile, });