webtty: switch all server responses to JSON.

This commit is contained in:
John "Elwin" Edwards 2012-05-11 13:33:48 -07:00
parent 71d43603a9
commit b6bf7038ca
2 changed files with 38 additions and 36 deletions

View file

@ -119,23 +119,20 @@ function getData() {
var datareq = new XMLHttpRequest(); var datareq = new XMLHttpRequest();
datareq.onreadystatechange = function () { datareq.onreadystatechange = function () {
if (datareq.readyState == 4 && datareq.status == 200) { if (datareq.readyState == 4 && datareq.status == 200) {
var datalines = datareq.responseText.split("\n"); var response = JSON.parse(this.responseText);
if (!datalines[0]) { if (!response.t)
return; return;
} else if (response.t == "E") {
else if (datalines[0] == "E1") { if (response.c == 1) {
termemu.alive = false; termemu.alive = false;
return; debug(1, "Server error: " + response.s);
} }
else if (datalines[0].charAt(0) != 'd') {
return;
} }
if (datalines[1]) { else if (response.t == "n")
writeData(datalines[1]);
ajaxstate.gotdata();
}
else {
ajaxstate.gotnothing(); ajaxstate.gotnothing();
else if (response.t == "d") {
writeData(response.d);
ajaxstate.gotdata();
} }
return; return;
} }
@ -147,18 +144,21 @@ function getData() {
function postResponseHandler() { function postResponseHandler() {
if (this.readyState == 4 && this.status == 200) { if (this.readyState == 4 && this.status == 200) {
var datalines = this.responseText.split("\n"); var response = JSON.parse(this.responseText);
if (!datalines[0]) if (!response.t || response.t == "n")
return; return;
else if (datalines[0] == "E1") { else if (response.t == "E") {
if (response.c == 1) {
termemu.alive = false; termemu.alive = false;
debug(1, "Server error: " + response.s);
}
return; return;
} }
else if (datalines[0].charAt(0) != "d") else if (response.t != "d")
return; return;
/* It is a data message */ /* It is a data message */
if (datalines[1]) { if (response.d) {
writeData(datalines[1]); writeData(response.d);
} }
ajaxstate.posted(); ajaxstate.posted();
return; return;
@ -301,7 +301,6 @@ function login(h, w) {
var req = new XMLHttpRequest(); var req = new XMLHttpRequest();
req.onreadystatechange = function () { req.onreadystatechange = function () {
if (req.readyState == 4 && req.status == 200) { if (req.readyState == 4 && req.status == 200) {
var datalines = req.responseText.split("\n");
var logindict = JSON.parse(req.responseText); var logindict = JSON.parse(req.responseText);
if (logindict.login) { if (logindict.login) {
/* Success */ /* Success */
@ -324,8 +323,8 @@ function stop() {
var req = new XMLHttpRequest(); var req = new XMLHttpRequest();
req.onreadystatechange = function () { req.onreadystatechange = function () {
if (req.readyState == 4 && req.status == 200) { if (req.readyState == 4 && req.status == 200) {
var datalines = req.responseText.split("\n");
/* Figure out whether or not it worked. */ /* Figure out whether or not it worked. */
/* FIXME the server might respond with output. */
termemu.alive = false; termemu.alive = false;
return; return;
} }

View file

@ -39,6 +39,7 @@ function TermSession(sessid, h, w) {
this.sessid = sessid; this.sessid = sessid;
this.alive = true; this.alive = true;
this.data = []; this.data = [];
this.nsend = 0;
this.child.stdout.on("data", function (buf) { this.child.stdout.on("data", function (buf) {
ss.data.push(buf); ss.data.push(buf);
}); });
@ -244,16 +245,21 @@ function serveStatic(req, res, fname) {
function readFeed(res, term) { function readFeed(res, term) {
res.writeHead(200, { "Content-Type": "text/plain" }); res.writeHead(200, { "Content-Type": "text/plain" });
if (term) { if (term) {
var answer = {};
var result = term.read(); var result = term.read();
if (result == null) if (result == null) {
resultstr = ""; answer["t"] = "n";
else
resultstr = result.toString("hex");
res.write("d" + resultstr.length.toString() + "\n" + resultstr + "\n");
} }
else { else {
//console.log("Where's the term?"); answer["t"] = "d";
res.write("d0\n\n"); answer["d"] = result.toString("hex");
answer["n"] = term.nsend++;
}
res.write(JSON.stringify(answer));
res.end();
}
else {
sendError(res, 1);
} }
} }
@ -261,10 +267,9 @@ var errorcodes = [ "Generic Error", "Not logged in", "Invalid data" ];
function sendError(res, ecode) { function sendError(res, ecode) {
res.writeHead(200, { "Content-Type": "text/plain" }); res.writeHead(200, { "Content-Type": "text/plain" });
if (ecode < errorcodes.length && ecode > 0) if (!(ecode >= 0 && ecode < errorcodes.length))
res.write("E" + ecode + '\n' + errorcodes[ecode] + '\n'); ecode = 0;
else res.write(JSON.stringify({"t": "E", "c": ecode, "s": errorcodes[ecode]}));
res.write("E0\nGeneric Error\n");
res.end(); res.end();
} }
@ -309,7 +314,6 @@ function handler(req, res) {
cterm.write(keybuf); cterm.write(keybuf);
} }
readFeed(res, cterm); readFeed(res, cterm);
res.end();
} }
else if (target == "/login") { else if (target == "/login") {
login(req, res, formdata); login(req, res, formdata);
@ -326,7 +330,6 @@ function handler(req, res) {
return; return;
} }
readFeed(res, cterm); readFeed(res, cterm);
res.end();
} }
/* Default page, create a new term */ /* Default page, create a new term */
/* FIXME New term not created anymore, is a special case still needed? */ /* FIXME New term not created anymore, is a special case still needed? */