238 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
<html>
 | 
						|
<head>
 | 
						|
<title>PeerConnection server test page</title>
 | 
						|
 | 
						|
<script>
 | 
						|
var request = null;
 | 
						|
var hangingGet = null;
 | 
						|
var localName;
 | 
						|
var server;
 | 
						|
var my_id = -1;
 | 
						|
var other_peers = {};
 | 
						|
var message_counter = 0;
 | 
						|
 | 
						|
function trace(txt) {
 | 
						|
  var elem = document.getElementById("debug");
 | 
						|
  elem.innerHTML += txt + "<br>";
 | 
						|
}
 | 
						|
 | 
						|
function handleServerNotification(data) {
 | 
						|
  trace("Server notification: " + data);
 | 
						|
  var parsed = data.split(',');
 | 
						|
  if (parseInt(parsed[2]) != 0)
 | 
						|
    other_peers[parseInt(parsed[1])] = parsed[0];
 | 
						|
}
 | 
						|
 | 
						|
function handlePeerMessage(peer_id, data) {
 | 
						|
  ++message_counter;
 | 
						|
  var str = "Message from '" + other_peers[peer_id] + "' ";
 | 
						|
  str += "<span id='toggle_" + message_counter + "' onclick='toggleMe(this);' ";
 | 
						|
  str += "style='cursor: pointer'>+</span><br>";
 | 
						|
  str += "<blockquote id='msg_" + message_counter + "' style='display:none'>";
 | 
						|
  str += data + "</blockquote>";
 | 
						|
  trace(str);
 | 
						|
  if (document.getElementById("loopback").checked) {
 | 
						|
    if (data.search("offer") != -1) {
 | 
						|
      // In loopback mode, if DTLS is enabled, notify the client to disable it.
 | 
						|
      // Otherwise replace the offer with an answer.
 | 
						|
      if (data.search("fingerprint") != -1)
 | 
						|
        data = data.replace("offer", "offer-loopback");
 | 
						|
      else
 | 
						|
        data = data.replace("offer", "answer");
 | 
						|
    }
 | 
						|
    sendToPeer(peer_id, data);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function GetIntHeader(r, name) {
 | 
						|
  var val = r.getResponseHeader(name);
 | 
						|
  return val != null && val.length ? parseInt(val) : -1;
 | 
						|
}
 | 
						|
 | 
						|
function hangingGetCallback() {
 | 
						|
  try {
 | 
						|
    if (hangingGet.readyState != 4)
 | 
						|
      return;
 | 
						|
    if (hangingGet.status != 200) {
 | 
						|
      trace("server error: " + hangingGet.statusText);
 | 
						|
      disconnect();
 | 
						|
    } else {
 | 
						|
      var peer_id = GetIntHeader(hangingGet, "Pragma");
 | 
						|
      if (peer_id == my_id) {
 | 
						|
        handleServerNotification(hangingGet.responseText);
 | 
						|
      } else {
 | 
						|
        handlePeerMessage(peer_id, hangingGet.responseText);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (hangingGet) {
 | 
						|
      hangingGet.abort();
 | 
						|
      hangingGet = null;
 | 
						|
    }
 | 
						|
 | 
						|
    if (my_id != -1)
 | 
						|
      window.setTimeout(startHangingGet, 0);
 | 
						|
  } catch (e) {
 | 
						|
    trace("Hanging get error: " + e.description);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function startHangingGet() {
 | 
						|
  try {
 | 
						|
    hangingGet = new XMLHttpRequest();
 | 
						|
    hangingGet.onreadystatechange = hangingGetCallback;
 | 
						|
    hangingGet.ontimeout = onHangingGetTimeout;
 | 
						|
    hangingGet.open("GET", server + "/wait?peer_id=" + my_id, true);
 | 
						|
    hangingGet.send();  
 | 
						|
  } catch (e) {
 | 
						|
    trace("error" + e.description);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function onHangingGetTimeout() {
 | 
						|
  trace("hanging get timeout. issuing again.");
 | 
						|
  hangingGet.abort();
 | 
						|
  hangingGet = null;
 | 
						|
  if (my_id != -1)
 | 
						|
    window.setTimeout(startHangingGet, 0);
 | 
						|
}
 | 
						|
 | 
						|
function signInCallback() {
 | 
						|
  try {
 | 
						|
    if (request.readyState == 4) {
 | 
						|
      if (request.status == 200) {
 | 
						|
        var peers = request.responseText.split("\n");
 | 
						|
        my_id = parseInt(peers[0].split(',')[1]);
 | 
						|
        trace("My id: " + my_id);
 | 
						|
        for (var i = 1; i < peers.length; ++i) {
 | 
						|
          if (peers[i].length > 0) {
 | 
						|
            trace("Peer " + i + ": " + peers[i]);
 | 
						|
            var parsed = peers[i].split(',');
 | 
						|
            other_peers[parseInt(parsed[1])] = parsed[0];
 | 
						|
          }
 | 
						|
        }
 | 
						|
        startHangingGet();
 | 
						|
        request = null;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  } catch (e) {
 | 
						|
    trace("error: " + e.description);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function signIn() {
 | 
						|
  try {
 | 
						|
    request = new XMLHttpRequest();
 | 
						|
    request.onreadystatechange = signInCallback;
 | 
						|
    request.open("GET", server + "/sign_in?" + localName, true);
 | 
						|
    request.send();
 | 
						|
  } catch (e) {
 | 
						|
    trace("error: " + e.description);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function sendToPeer(peer_id, data) {
 | 
						|
  if (my_id == -1) {
 | 
						|
    alert("Not connected");
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  if (peer_id == my_id) {
 | 
						|
    alert("Can't send a message to oneself :)");
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  var r = new XMLHttpRequest();
 | 
						|
  r.open("POST", server + "/message?peer_id=" + my_id + "&to=" + peer_id,
 | 
						|
         false);
 | 
						|
  r.setRequestHeader("Content-Type", "text/plain");
 | 
						|
  r.send(data);
 | 
						|
  r = null;
 | 
						|
}
 | 
						|
 | 
						|
function connect() {
 | 
						|
  localName = document.getElementById("local").value.toLowerCase();
 | 
						|
  server = document.getElementById("server").value.toLowerCase();
 | 
						|
  if (localName.length == 0) {
 | 
						|
    alert("I need a name please.");
 | 
						|
    document.getElementById("local").focus();
 | 
						|
  } else {
 | 
						|
    document.getElementById("connect").disabled = true;
 | 
						|
    document.getElementById("disconnect").disabled = false;
 | 
						|
    document.getElementById("send").disabled = false;
 | 
						|
    signIn();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function disconnect() {
 | 
						|
  if (request) {
 | 
						|
    request.abort();
 | 
						|
    request = null;
 | 
						|
  }
 | 
						|
  
 | 
						|
  if (hangingGet) {
 | 
						|
    hangingGet.abort();
 | 
						|
    hangingGet = null;
 | 
						|
  }
 | 
						|
 | 
						|
  if (my_id != -1) {
 | 
						|
    request = new XMLHttpRequest();
 | 
						|
    request.open("GET", server + "/sign_out?peer_id=" + my_id, false);
 | 
						|
    request.send();
 | 
						|
    request = null;
 | 
						|
    my_id = -1;
 | 
						|
  }
 | 
						|
 | 
						|
  document.getElementById("connect").disabled = false;
 | 
						|
  document.getElementById("disconnect").disabled = true;
 | 
						|
  document.getElementById("send").disabled = true;
 | 
						|
}
 | 
						|
 | 
						|
window.onbeforeunload = disconnect;
 | 
						|
 | 
						|
function send() {
 | 
						|
  var text = document.getElementById("message").value;
 | 
						|
  var peer_id = parseInt(document.getElementById("peer_id").value);
 | 
						|
  if (!text.length || peer_id == 0) {
 | 
						|
    alert("No text supplied or invalid peer id");
 | 
						|
  } else {
 | 
						|
    sendToPeer(peer_id, text);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function toggleMe(obj) {
 | 
						|
  var id = obj.id.replace("toggle", "msg");
 | 
						|
  var t = document.getElementById(id);
 | 
						|
  if (obj.innerText == "+") {
 | 
						|
    obj.innerText = "-";
 | 
						|
    t.style.display = "block";
 | 
						|
  } else {
 | 
						|
    obj.innerText = "+";
 | 
						|
    t.style.display = "none";
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
</script>
 | 
						|
 | 
						|
</head>
 | 
						|
<body>
 | 
						|
Server: <input type="text" id="server" value="http://localhost:8888" /><br>
 | 
						|
<input type="checkbox" id="loopback" checked="checked"/> Loopback (just send
 | 
						|
received messages right back)<br>
 | 
						|
Your name: <input type="text" id="local" value="my_name"/>
 | 
						|
<button id="connect" onclick="connect();">Connect</button>
 | 
						|
<button disabled="true" id="disconnect"
 | 
						|
        onclick="disconnect();">Disconnect</button>
 | 
						|
<br>
 | 
						|
<table><tr><td>
 | 
						|
Target peer id: <input type="text" id="peer_id" size="3"/></td><td>
 | 
						|
Message: <input type="text" id="message"/></td><td>
 | 
						|
<button disabled="true" id="send" onclick="send();">Send</button>
 | 
						|
</td></tr></table>
 | 
						|
<button onclick="document.getElementById('debug').innerHTML='';">
 | 
						|
Clear log</button>
 | 
						|
 | 
						|
<pre id="debug">
 | 
						|
</pre>
 | 
						|
<br><hr>
 | 
						|
</body>
 | 
						|
</html>
 |