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