Mercurial > hg > rlgwebd
comparison rlgwebd.js @ 103:f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
Separate the game-listing and http-responding components of statusmsg()
so the listing function can be reused for WebSockets.
author | John "Elwin" Edwards <elwin@sdf.org> |
---|---|
date | Fri, 13 Jul 2012 09:17:05 -0700 |
parents | f34a286c51bd |
children | 7d444ba4739e |
comparison
equal
deleted
inserted
replaced
102:f34a286c51bd | 103:f30495f7ede8 |
---|---|
870 res.writeHead(200, { "Content-Type": "application/json" }); | 870 res.writeHead(200, { "Content-Type": "application/json" }); |
871 res.write(JSON.stringify(msgs)); | 871 res.write(JSON.stringify(msgs)); |
872 res.end(); | 872 res.end(); |
873 } | 873 } |
874 | 874 |
875 function statusmsg(req, res) { | 875 function getStatus(callback) { |
876 var now = new Date(); | 876 var now = new Date(); |
877 var reply = {"s": allowlogin, "g": []}; | 877 var statusinfo = {"s": allowlogin, "g": []}; |
878 function respond() { | |
879 res.writeHead(200, { "Content-Type": "application/json" }); | |
880 if (req.method != 'HEAD') | |
881 res.write(JSON.stringify(reply)); | |
882 res.end(); | |
883 } | |
884 function idleset(i, idletime) { | 878 function idleset(i, idletime) { |
885 if (i >= 0 && i < reply.g.length) { | 879 if (i >= 0 && i < statusinfo.g.length) { |
886 reply.g[i].i = idletime; | 880 statusinfo.g[i].i = idletime; |
887 } | 881 } |
888 for (var j = 0; j < reply.g.length; j++) { | 882 for (var j = 0; j < statusinfo.g.length; j++) { |
889 if (!("i" in reply.g[j])) | 883 if (!("i" in statusinfo.g[j])) |
890 return; | 884 return; |
891 } | 885 } |
892 respond(); | 886 callback(statusinfo); |
893 } | 887 } |
894 for (var sessid in sessions) { | 888 for (var sessid in sessions) { |
895 var gamedesc = {}; | 889 var gamedesc = {}; |
896 gamedesc["n"] = sessid; | 890 gamedesc["n"] = sessid; |
897 gamedesc["p"] = sessions[sessid].pname; | 891 gamedesc["p"] = sessions[sessid].pname; |
898 gamedesc["g"] = sessions[sessid].game.uname; | 892 gamedesc["g"] = sessions[sessid].game.uname; |
899 reply["g"].push(gamedesc); | 893 statusinfo["g"].push(gamedesc); |
900 } | 894 } |
901 if (reply.g.length == 0) { | 895 if (statusinfo.g.length == 0) { |
902 respond(); | 896 callback(statusinfo); |
903 return; | 897 return; |
904 } | 898 } |
905 function makecallback(i) { | 899 function makecallback(i) { |
906 return function (err, stats) { | 900 return function (err, stats) { |
907 if (err) | 901 if (err) |
908 idleset(i, null); | 902 idleset(i, null); |
909 else | 903 else |
910 idleset(i, now - stats.mtime); | 904 idleset(i, now - stats.mtime); |
911 } | 905 } |
912 } | 906 } |
913 for (var i = 0; i < reply.g.length; i++) { | 907 for (var i = 0; i < statusinfo.g.length; i++) { |
914 if (reply.g[i].n in sessions) { | 908 if (statusinfo.g[i].n in sessions) { |
915 fs.fstat(sessions[reply.g[i].n].record.fd, makecallback(i)); | 909 fs.fstat(sessions[statusinfo.g[i].n].record.fd, makecallback(i)); |
916 } | 910 } |
917 else { | 911 else { |
918 idleset(i, null); | 912 idleset(i, null); |
919 } | 913 } |
920 } | 914 } |
915 } | |
916 | |
917 function statusmsg(req, res) { | |
918 function respond(info) { | |
919 res.writeHead(200, { "Content-Type": "application/json" }); | |
920 if (req.method != 'HEAD') | |
921 res.write(JSON.stringify(info)); | |
922 res.end(); | |
923 } | |
924 getStatus(respond); | |
921 } | 925 } |
922 | 926 |
923 function pstatusmsg(req, res) { | 927 function pstatusmsg(req, res) { |
924 if (req.method == 'HEAD') { | 928 if (req.method == 'HEAD') { |
925 res.writeHead(200, { "Content-Type": "application/json" }); | 929 res.writeHead(200, { "Content-Type": "application/json" }); |