xref: /aosp_15_r20/external/webrtc/examples/peerconnection/server/server_test.html (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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] + "'&nbsp;";
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