|  | <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> |