1*d9f75844SAndroid Build Coastguard Worker<html> 2*d9f75844SAndroid Build Coastguard Worker<head> 3*d9f75844SAndroid Build Coastguard Worker<title>PeerConnection server test page</title> 4*d9f75844SAndroid Build Coastguard Worker 5*d9f75844SAndroid Build Coastguard Worker<script> 6*d9f75844SAndroid Build Coastguard Workervar request = null; 7*d9f75844SAndroid Build Coastguard Workervar hangingGet = null; 8*d9f75844SAndroid Build Coastguard Workervar localName; 9*d9f75844SAndroid Build Coastguard Workervar server; 10*d9f75844SAndroid Build Coastguard Workervar my_id = -1; 11*d9f75844SAndroid Build Coastguard Workervar other_peers = {}; 12*d9f75844SAndroid Build Coastguard Workervar message_counter = 0; 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Workerfunction trace(txt) { 15*d9f75844SAndroid Build Coastguard Worker var elem = document.getElementById("debug"); 16*d9f75844SAndroid Build Coastguard Worker elem.innerHTML += txt + "<br>"; 17*d9f75844SAndroid Build Coastguard Worker} 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Workerfunction handleServerNotification(data) { 20*d9f75844SAndroid Build Coastguard Worker trace("Server notification: " + data); 21*d9f75844SAndroid Build Coastguard Worker var parsed = data.split(','); 22*d9f75844SAndroid Build Coastguard Worker if (parseInt(parsed[2]) != 0) 23*d9f75844SAndroid Build Coastguard Worker other_peers[parseInt(parsed[1])] = parsed[0]; 24*d9f75844SAndroid Build Coastguard Worker} 25*d9f75844SAndroid Build Coastguard Worker 26*d9f75844SAndroid Build Coastguard Workerfunction handlePeerMessage(peer_id, data) { 27*d9f75844SAndroid Build Coastguard Worker ++message_counter; 28*d9f75844SAndroid Build Coastguard Worker var str = "Message from '" + other_peers[peer_id] + "' "; 29*d9f75844SAndroid Build Coastguard Worker str += "<span id='toggle_" + message_counter + "' onclick='toggleMe(this);' "; 30*d9f75844SAndroid Build Coastguard Worker str += "style='cursor: pointer'>+</span><br>"; 31*d9f75844SAndroid Build Coastguard Worker str += "<blockquote id='msg_" + message_counter + "' style='display:none'>"; 32*d9f75844SAndroid Build Coastguard Worker str += data + "</blockquote>"; 33*d9f75844SAndroid Build Coastguard Worker trace(str); 34*d9f75844SAndroid Build Coastguard Worker if (document.getElementById("loopback").checked) { 35*d9f75844SAndroid Build Coastguard Worker if (data.search("offer") != -1) { 36*d9f75844SAndroid Build Coastguard Worker // In loopback mode, if DTLS is enabled, notify the client to disable it. 37*d9f75844SAndroid Build Coastguard Worker // Otherwise replace the offer with an answer. 38*d9f75844SAndroid Build Coastguard Worker if (data.search("fingerprint") != -1) 39*d9f75844SAndroid Build Coastguard Worker data = data.replace("offer", "offer-loopback"); 40*d9f75844SAndroid Build Coastguard Worker else 41*d9f75844SAndroid Build Coastguard Worker data = data.replace("offer", "answer"); 42*d9f75844SAndroid Build Coastguard Worker } 43*d9f75844SAndroid Build Coastguard Worker sendToPeer(peer_id, data); 44*d9f75844SAndroid Build Coastguard Worker } 45*d9f75844SAndroid Build Coastguard Worker} 46*d9f75844SAndroid Build Coastguard Worker 47*d9f75844SAndroid Build Coastguard Workerfunction GetIntHeader(r, name) { 48*d9f75844SAndroid Build Coastguard Worker var val = r.getResponseHeader(name); 49*d9f75844SAndroid Build Coastguard Worker return val != null && val.length ? parseInt(val) : -1; 50*d9f75844SAndroid Build Coastguard Worker} 51*d9f75844SAndroid Build Coastguard Worker 52*d9f75844SAndroid Build Coastguard Workerfunction hangingGetCallback() { 53*d9f75844SAndroid Build Coastguard Worker try { 54*d9f75844SAndroid Build Coastguard Worker if (hangingGet.readyState != 4) 55*d9f75844SAndroid Build Coastguard Worker return; 56*d9f75844SAndroid Build Coastguard Worker if (hangingGet.status != 200) { 57*d9f75844SAndroid Build Coastguard Worker trace("server error: " + hangingGet.statusText); 58*d9f75844SAndroid Build Coastguard Worker disconnect(); 59*d9f75844SAndroid Build Coastguard Worker } else { 60*d9f75844SAndroid Build Coastguard Worker var peer_id = GetIntHeader(hangingGet, "Pragma"); 61*d9f75844SAndroid Build Coastguard Worker if (peer_id == my_id) { 62*d9f75844SAndroid Build Coastguard Worker handleServerNotification(hangingGet.responseText); 63*d9f75844SAndroid Build Coastguard Worker } else { 64*d9f75844SAndroid Build Coastguard Worker handlePeerMessage(peer_id, hangingGet.responseText); 65*d9f75844SAndroid Build Coastguard Worker } 66*d9f75844SAndroid Build Coastguard Worker } 67*d9f75844SAndroid Build Coastguard Worker 68*d9f75844SAndroid Build Coastguard Worker if (hangingGet) { 69*d9f75844SAndroid Build Coastguard Worker hangingGet.abort(); 70*d9f75844SAndroid Build Coastguard Worker hangingGet = null; 71*d9f75844SAndroid Build Coastguard Worker } 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker if (my_id != -1) 74*d9f75844SAndroid Build Coastguard Worker window.setTimeout(startHangingGet, 0); 75*d9f75844SAndroid Build Coastguard Worker } catch (e) { 76*d9f75844SAndroid Build Coastguard Worker trace("Hanging get error: " + e.description); 77*d9f75844SAndroid Build Coastguard Worker } 78*d9f75844SAndroid Build Coastguard Worker} 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Workerfunction startHangingGet() { 81*d9f75844SAndroid Build Coastguard Worker try { 82*d9f75844SAndroid Build Coastguard Worker hangingGet = new XMLHttpRequest(); 83*d9f75844SAndroid Build Coastguard Worker hangingGet.onreadystatechange = hangingGetCallback; 84*d9f75844SAndroid Build Coastguard Worker hangingGet.ontimeout = onHangingGetTimeout; 85*d9f75844SAndroid Build Coastguard Worker hangingGet.open("GET", server + "/wait?peer_id=" + my_id, true); 86*d9f75844SAndroid Build Coastguard Worker hangingGet.send(); 87*d9f75844SAndroid Build Coastguard Worker } catch (e) { 88*d9f75844SAndroid Build Coastguard Worker trace("error" + e.description); 89*d9f75844SAndroid Build Coastguard Worker } 90*d9f75844SAndroid Build Coastguard Worker} 91*d9f75844SAndroid Build Coastguard Worker 92*d9f75844SAndroid Build Coastguard Workerfunction onHangingGetTimeout() { 93*d9f75844SAndroid Build Coastguard Worker trace("hanging get timeout. issuing again."); 94*d9f75844SAndroid Build Coastguard Worker hangingGet.abort(); 95*d9f75844SAndroid Build Coastguard Worker hangingGet = null; 96*d9f75844SAndroid Build Coastguard Worker if (my_id != -1) 97*d9f75844SAndroid Build Coastguard Worker window.setTimeout(startHangingGet, 0); 98*d9f75844SAndroid Build Coastguard Worker} 99*d9f75844SAndroid Build Coastguard Worker 100*d9f75844SAndroid Build Coastguard Workerfunction signInCallback() { 101*d9f75844SAndroid Build Coastguard Worker try { 102*d9f75844SAndroid Build Coastguard Worker if (request.readyState == 4) { 103*d9f75844SAndroid Build Coastguard Worker if (request.status == 200) { 104*d9f75844SAndroid Build Coastguard Worker var peers = request.responseText.split("\n"); 105*d9f75844SAndroid Build Coastguard Worker my_id = parseInt(peers[0].split(',')[1]); 106*d9f75844SAndroid Build Coastguard Worker trace("My id: " + my_id); 107*d9f75844SAndroid Build Coastguard Worker for (var i = 1; i < peers.length; ++i) { 108*d9f75844SAndroid Build Coastguard Worker if (peers[i].length > 0) { 109*d9f75844SAndroid Build Coastguard Worker trace("Peer " + i + ": " + peers[i]); 110*d9f75844SAndroid Build Coastguard Worker var parsed = peers[i].split(','); 111*d9f75844SAndroid Build Coastguard Worker other_peers[parseInt(parsed[1])] = parsed[0]; 112*d9f75844SAndroid Build Coastguard Worker } 113*d9f75844SAndroid Build Coastguard Worker } 114*d9f75844SAndroid Build Coastguard Worker startHangingGet(); 115*d9f75844SAndroid Build Coastguard Worker request = null; 116*d9f75844SAndroid Build Coastguard Worker } 117*d9f75844SAndroid Build Coastguard Worker } 118*d9f75844SAndroid Build Coastguard Worker } catch (e) { 119*d9f75844SAndroid Build Coastguard Worker trace("error: " + e.description); 120*d9f75844SAndroid Build Coastguard Worker } 121*d9f75844SAndroid Build Coastguard Worker} 122*d9f75844SAndroid Build Coastguard Worker 123*d9f75844SAndroid Build Coastguard Workerfunction signIn() { 124*d9f75844SAndroid Build Coastguard Worker try { 125*d9f75844SAndroid Build Coastguard Worker request = new XMLHttpRequest(); 126*d9f75844SAndroid Build Coastguard Worker request.onreadystatechange = signInCallback; 127*d9f75844SAndroid Build Coastguard Worker request.open("GET", server + "/sign_in?" + localName, true); 128*d9f75844SAndroid Build Coastguard Worker request.send(); 129*d9f75844SAndroid Build Coastguard Worker } catch (e) { 130*d9f75844SAndroid Build Coastguard Worker trace("error: " + e.description); 131*d9f75844SAndroid Build Coastguard Worker } 132*d9f75844SAndroid Build Coastguard Worker} 133*d9f75844SAndroid Build Coastguard Worker 134*d9f75844SAndroid Build Coastguard Workerfunction sendToPeer(peer_id, data) { 135*d9f75844SAndroid Build Coastguard Worker if (my_id == -1) { 136*d9f75844SAndroid Build Coastguard Worker alert("Not connected"); 137*d9f75844SAndroid Build Coastguard Worker return; 138*d9f75844SAndroid Build Coastguard Worker } 139*d9f75844SAndroid Build Coastguard Worker if (peer_id == my_id) { 140*d9f75844SAndroid Build Coastguard Worker alert("Can't send a message to oneself :)"); 141*d9f75844SAndroid Build Coastguard Worker return; 142*d9f75844SAndroid Build Coastguard Worker } 143*d9f75844SAndroid Build Coastguard Worker var r = new XMLHttpRequest(); 144*d9f75844SAndroid Build Coastguard Worker r.open("POST", server + "/message?peer_id=" + my_id + "&to=" + peer_id, 145*d9f75844SAndroid Build Coastguard Worker false); 146*d9f75844SAndroid Build Coastguard Worker r.setRequestHeader("Content-Type", "text/plain"); 147*d9f75844SAndroid Build Coastguard Worker r.send(data); 148*d9f75844SAndroid Build Coastguard Worker r = null; 149*d9f75844SAndroid Build Coastguard Worker} 150*d9f75844SAndroid Build Coastguard Worker 151*d9f75844SAndroid Build Coastguard Workerfunction connect() { 152*d9f75844SAndroid Build Coastguard Worker localName = document.getElementById("local").value.toLowerCase(); 153*d9f75844SAndroid Build Coastguard Worker server = document.getElementById("server").value.toLowerCase(); 154*d9f75844SAndroid Build Coastguard Worker if (localName.length == 0) { 155*d9f75844SAndroid Build Coastguard Worker alert("I need a name please."); 156*d9f75844SAndroid Build Coastguard Worker document.getElementById("local").focus(); 157*d9f75844SAndroid Build Coastguard Worker } else { 158*d9f75844SAndroid Build Coastguard Worker document.getElementById("connect").disabled = true; 159*d9f75844SAndroid Build Coastguard Worker document.getElementById("disconnect").disabled = false; 160*d9f75844SAndroid Build Coastguard Worker document.getElementById("send").disabled = false; 161*d9f75844SAndroid Build Coastguard Worker signIn(); 162*d9f75844SAndroid Build Coastguard Worker } 163*d9f75844SAndroid Build Coastguard Worker} 164*d9f75844SAndroid Build Coastguard Worker 165*d9f75844SAndroid Build Coastguard Workerfunction disconnect() { 166*d9f75844SAndroid Build Coastguard Worker if (request) { 167*d9f75844SAndroid Build Coastguard Worker request.abort(); 168*d9f75844SAndroid Build Coastguard Worker request = null; 169*d9f75844SAndroid Build Coastguard Worker } 170*d9f75844SAndroid Build Coastguard Worker 171*d9f75844SAndroid Build Coastguard Worker if (hangingGet) { 172*d9f75844SAndroid Build Coastguard Worker hangingGet.abort(); 173*d9f75844SAndroid Build Coastguard Worker hangingGet = null; 174*d9f75844SAndroid Build Coastguard Worker } 175*d9f75844SAndroid Build Coastguard Worker 176*d9f75844SAndroid Build Coastguard Worker if (my_id != -1) { 177*d9f75844SAndroid Build Coastguard Worker request = new XMLHttpRequest(); 178*d9f75844SAndroid Build Coastguard Worker request.open("GET", server + "/sign_out?peer_id=" + my_id, false); 179*d9f75844SAndroid Build Coastguard Worker request.send(); 180*d9f75844SAndroid Build Coastguard Worker request = null; 181*d9f75844SAndroid Build Coastguard Worker my_id = -1; 182*d9f75844SAndroid Build Coastguard Worker } 183*d9f75844SAndroid Build Coastguard Worker 184*d9f75844SAndroid Build Coastguard Worker document.getElementById("connect").disabled = false; 185*d9f75844SAndroid Build Coastguard Worker document.getElementById("disconnect").disabled = true; 186*d9f75844SAndroid Build Coastguard Worker document.getElementById("send").disabled = true; 187*d9f75844SAndroid Build Coastguard Worker} 188*d9f75844SAndroid Build Coastguard Worker 189*d9f75844SAndroid Build Coastguard Workerwindow.onbeforeunload = disconnect; 190*d9f75844SAndroid Build Coastguard Worker 191*d9f75844SAndroid Build Coastguard Workerfunction send() { 192*d9f75844SAndroid Build Coastguard Worker var text = document.getElementById("message").value; 193*d9f75844SAndroid Build Coastguard Worker var peer_id = parseInt(document.getElementById("peer_id").value); 194*d9f75844SAndroid Build Coastguard Worker if (!text.length || peer_id == 0) { 195*d9f75844SAndroid Build Coastguard Worker alert("No text supplied or invalid peer id"); 196*d9f75844SAndroid Build Coastguard Worker } else { 197*d9f75844SAndroid Build Coastguard Worker sendToPeer(peer_id, text); 198*d9f75844SAndroid Build Coastguard Worker } 199*d9f75844SAndroid Build Coastguard Worker} 200*d9f75844SAndroid Build Coastguard Worker 201*d9f75844SAndroid Build Coastguard Workerfunction toggleMe(obj) { 202*d9f75844SAndroid Build Coastguard Worker var id = obj.id.replace("toggle", "msg"); 203*d9f75844SAndroid Build Coastguard Worker var t = document.getElementById(id); 204*d9f75844SAndroid Build Coastguard Worker if (obj.innerText == "+") { 205*d9f75844SAndroid Build Coastguard Worker obj.innerText = "-"; 206*d9f75844SAndroid Build Coastguard Worker t.style.display = "block"; 207*d9f75844SAndroid Build Coastguard Worker } else { 208*d9f75844SAndroid Build Coastguard Worker obj.innerText = "+"; 209*d9f75844SAndroid Build Coastguard Worker t.style.display = "none"; 210*d9f75844SAndroid Build Coastguard Worker } 211*d9f75844SAndroid Build Coastguard Worker} 212*d9f75844SAndroid Build Coastguard Worker 213*d9f75844SAndroid Build Coastguard Worker</script> 214*d9f75844SAndroid Build Coastguard Worker 215*d9f75844SAndroid Build Coastguard Worker</head> 216*d9f75844SAndroid Build Coastguard Worker<body> 217*d9f75844SAndroid Build Coastguard WorkerServer: <input type="text" id="server" value="http://localhost:8888" /><br> 218*d9f75844SAndroid Build Coastguard Worker<input type="checkbox" id="loopback" checked="checked"/> Loopback (just send 219*d9f75844SAndroid Build Coastguard Workerreceived messages right back)<br> 220*d9f75844SAndroid Build Coastguard WorkerYour name: <input type="text" id="local" value="my_name"/> 221*d9f75844SAndroid Build Coastguard Worker<button id="connect" onclick="connect();">Connect</button> 222*d9f75844SAndroid Build Coastguard Worker<button disabled="true" id="disconnect" 223*d9f75844SAndroid Build Coastguard Worker onclick="disconnect();">Disconnect</button> 224*d9f75844SAndroid Build Coastguard Worker<br> 225*d9f75844SAndroid Build Coastguard Worker<table><tr><td> 226*d9f75844SAndroid Build Coastguard WorkerTarget peer id: <input type="text" id="peer_id" size="3"/></td><td> 227*d9f75844SAndroid Build Coastguard WorkerMessage: <input type="text" id="message"/></td><td> 228*d9f75844SAndroid Build Coastguard Worker<button disabled="true" id="send" onclick="send();">Send</button> 229*d9f75844SAndroid Build Coastguard Worker</td></tr></table> 230*d9f75844SAndroid Build Coastguard Worker<button onclick="document.getElementById('debug').innerHTML='';"> 231*d9f75844SAndroid Build Coastguard WorkerClear log</button> 232*d9f75844SAndroid Build Coastguard Worker 233*d9f75844SAndroid Build Coastguard Worker<pre id="debug"> 234*d9f75844SAndroid Build Coastguard Worker</pre> 235*d9f75844SAndroid Build Coastguard Worker<br><hr> 236*d9f75844SAndroid Build Coastguard Worker</body> 237*d9f75844SAndroid Build Coastguard Worker</html> 238