webrtc/samples/js/apprtc/turn-prober/turn-prober.html

133 lines
4.1 KiB
HTML

<html>
<head>
<script>
var CEOD_URL = ("https://computeengineondemand.appspot.com/turn?" +
"username=1234&key=5678");
var xmlhttp = null;
var turnServers = []; // Array of {turnUri, username, password}.
// The next two arrays' entries correspond 1:1 to turnServers.
var gotTurn = []; // Entries are null (not done), "PASS", or "FAIL"
var pcs = []; // Entries are RTCPeerConnection objects.
// Test is done; log & replace document body with an appropriate message.
function finish(msg) {
msg = "DONE: " + msg;
console.log(msg);
document.body.innerHTML = msg;
}
// Handle created offer SDP.
function offerHandler(i, c) {
var pc = pcs[i];
pc.setLocalDescription(c,
function() {},
function(e) {console.log("sLD error: " + e); });
pc = null;
}
// Handle SDP offer creation error.
function offerError(i, e) {
console.log("createOffer error: " + e);
checkForCompletion(i, "FAIL (offerError)");
}
// Register a terminal condition |msg| for the |index|'th server and
// terminate the test with an appropriate message if all servers are done.
function checkForCompletion(index, msg) {
gotTurn[index] = msg;
var pass = true;
for (var i = 0; i < gotTurn.length; ++i) {
if (!gotTurn[i])
return;
if (gotTurn[i] != "PASS") {
pass = false;
// Don't "break" because a later still-null gotTurn value should let
// us wait more.
}
}
if (pass) {
finish("PASS");
} else {
finish("FAIL: " + JSON.stringify(gotTurn));
}
}
// Make sure we don't wait forever for TURN to complete.
function nanny(i) {
if (!gotTurn[i]) {
checkForCompletion(i, "FAIL (TURN server failed to respond)");
}
}
// Handle incoming ICE candidate |c| from |turnServers[i]|.
function onIceCandidate(i, c) {
var pc = pcs[i];
if (!c || !c.candidate) {
checkForCompletion(
i, !gotTurn[i] ? "FAIL (no TURN candidate)" :
(gotTurn[i] == "PASS") ? "PASS" : gotTurn[i]);
return;
}
if (c.candidate.candidate.indexOf(" typ relay ") >= 0) {
gotTurn[i] = "PASS";
}
}
// Kick off the test.
function go() {
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = onTurnResult;
xmlhttp.open('GET', CEOD_URL, true);
xmlhttp.send();
}
// Handle the XMLHttpRequest's response.
function onTurnResult() {
if (xmlhttp.readyState != 4)
return;
if (xmlhttp.status != 200) {
finish("FAIL (no TURN server)");
return;
}
var turnServer = JSON.parse(xmlhttp.responseText);
for (i = 0; i < turnServer.uris.length; i++) {
if (turnServer.uris[i].indexOf(":3479?") >= 0) {
// Why does CEOD vend useless port 3479 URIs?
continue;
}
console.log("Adding to test: " +
[turnServer.uris[i], turnServer.username,
turnServer.password]);
gotTurn.push(null);
pcs.push(new webkitRTCPeerConnection({
"iceServers": [{
"url": turnServer.uris[i],
"username": turnServer.username,
"credential": turnServer.password
}]
}));
var index = pcs.length - 1;
var pc = pcs[index];
if (!pc) {
checkForCompletion(index, "FAIL (PeerConnection ctor failed)");
continue;
}
pc.onicecandidate = (
function(p) { return function(c) { onIceCandidate(p, c); } })(index);
pc.createOffer(
(function(p) { return function(o) { offerHandler(p, o); } })(index),
(function(p) { return function(e) { offerError(p, e); } })(index),
{'mandatory': { 'OfferToReceiveAudio': true } });
window.setTimeout(
(function(p) { return function() { nanny(p); } })(index), 10000);
}
}
</script>
</head>
<body onload="go()">
</body>
</html>