Permalink
Browse files

Initial commit

  • Loading branch information...
0 parents commit eb46c77007979195436bf398fca5398b5ca9f26f @Connorhd committed Sep 7, 2009
Showing with 4,365 additions and 0 deletions.
  1. +8 −0 README
  2. +103 −0 debug.js
  3. +3 −0 example.js
  4. +272 −0 fu.js
  5. +109 −0 index.html
  6. +92 −0 jquery.cookie.js
  7. +3,363 −0 jquery.js
  8. +72 −0 jquery.treeview.async.js
  9. +68 −0 jquery.treeview.css
  10. +251 −0 jquery.treeview.js
  11. +24 −0 screen.css
  12. BIN treeview-default-line.gif
  13. BIN treeview-default.gif
@@ -0,0 +1,8 @@
+HTTP based console and object explorer for node.js.
+
+to include in another project
+var debug = require("debug.js");
+debug.listen(8080);
+
+to run example (listens on port 8080)
+$ /usr/local/bin/node example.js
@@ -0,0 +1,103 @@
+var fu = require("fu.js");
+
+var debug = exports;
+
+debug.listen = function(port, host) {
+ fu.listen(port, host);
+};
+
+fu.get("/", fu.staticHandler("index.html"));
+fu.get("/screen.css", fu.staticHandler("screen.css"));
+fu.get("/jquery.treeview.css", fu.staticHandler("jquery.treeview.css"));
+fu.get("/jquery.js", fu.staticHandler("jquery.js"));
+fu.get("/jquery.cookie.js", fu.staticHandler("jquery.cookie.js"));
+fu.get("/jquery.treeview.js", fu.staticHandler("jquery.treeview.js"));
+fu.get("/jquery.treeview.async.js", fu.staticHandler("jquery.treeview.async.js"));
+fu.get("/treeview-default.gif", fu.staticHandler("treeview-default.gif"));
+fu.get("/treeview-default-line.gif", fu.staticHandler("treeview-default-line.gif"));
+
+fu.get("/eval", function (req, res) {
+ if (req.uri.params.eval !== undefined) {
+ res.simpleJSON(200, evalStr(req.uri.params.eval));
+ } else {
+ res.simpleText(200, 'Error');
+ }
+});
+
+fu.get("/tree", function (req, res) {
+ if (req.uri.params.root !== undefined && req.uri.params.root !== 'source') {
+ res.simpleJSON(200, getObj(req.uri.params.root));
+ } else {
+ res.simpleJSON(200, getObj('process'));
+ }
+
+});
+
+function getObj(key) {
+ var obj = process;
+ var keys = key.split('.');
+
+ keys.forEach(function (x) {
+ obj = obj[x];
+ });
+
+ var output = [];
+ var cur;
+ var children = false;
+ for (var i in obj) {
+ // Prevent loops
+ if (obj === obj[i])
+ continue;
+ cur = {id: key+'.'+i};
+ cur.text = '<strong>'+i+' - '+typeof(obj[i])+'</strong>';
+ var str;
+ try {
+ str = JSON.stringify(obj[i]);
+ } catch (e) {
+ str = undefined;
+ }
+ if (str == undefined) {
+ try {
+ str = obj[i].toString();
+ } catch (e) {
+ str = '';
+ }
+ }
+ cur.text += '<pre>'+str+'</pre>';
+ if (typeof(obj[i]) !== 'string') {
+ children = false
+ for (var j in obj[i]) {
+ children = true;
+ break;
+ }
+ if ((key+'.'+i) == 'process.node.Timer') {
+ children = false
+ }
+ if (children === true) {
+ cur.hasChildren = true;
+ }
+ }
+ output.push(cur);
+ }
+ return output;
+}
+
+function evalStr(str) {
+ var result;
+ var error = false;
+ try {
+ result = eval(str);
+ try {
+ result = JSON.stringify(result);
+ } catch (e) {
+ result = result.toString();
+ }
+ } catch (err) {
+ error = true;
+ result = err;
+ }
+ var output = {result: result};
+ output.error = error;
+ output.str = str;
+ return output;
+}
@@ -0,0 +1,3 @@
+var debug = require("debug.js");
+
+debug.listen(8080);
@@ -0,0 +1,272 @@
+DEBUG = false;
+
+var fu = exports;
+
+var NOT_FOUND = "Not Found\n";
+
+function notFound(req, res) {
+ res.sendHeader(404, [ ["Content-Type", "text/plain"]
+ , ["Content-Length", NOT_FOUND.length]
+ ]);
+ res.sendBody(NOT_FOUND);
+ res.finish();
+}
+
+var getMap = {};
+
+fu.get = function (path, handler) {
+ getMap[path] = handler;
+};
+
+var server = node.http.createServer(function (req, res) {
+ if (req.method === "GET" || req.method === "HEAD") {
+ var handler = getMap[req.uri.path] || notFound;
+
+ res.simpleText = function (code, body) {
+ res.sendHeader(code, [ ["Content-Type", "text/plain"]
+ , ["Content-Length", body.length]
+ ]);
+ res.sendBody(body);
+ res.finish();
+ };
+
+ res.simpleJSON = function (code, obj) {
+ var body = JSON.stringify(obj);
+ res.sendHeader(code, [ ["Content-Type", "text/json"]
+ , ["Content-Length", body.length]
+ ]);
+ res.sendBody(body);
+ res.finish();
+ };
+
+ handler(req, res);
+ }
+});
+
+fu.listen = function (port, host) {
+ server.listen(port, host);
+ puts("Server at http://" + (host || "127.0.0.1") + ":" + port.toString() + "/");
+};
+
+fu.close = function () { server.close(); };
+
+function extname (path) {
+ var index = path.lastIndexOf(".");
+ return index < 0 ? "" : path.substring(index);
+}
+
+fu.staticHandler = function (filename) {
+ var body, headers;
+ var content_type = fu.mime.lookupExtension(extname(filename));
+ var encoding = (content_type.slice(0,4) === "text" ? "utf8" : "raw");
+
+ function loadResponseData(callback) {
+ if (body && headers && !DEBUG) {
+ callback();
+ return;
+ }
+
+ puts("loading " + filename + "...");
+ var promise = node.fs.cat(filename, encoding);
+
+ promise.addCallback(function (data) {
+ body = data;
+ headers = [ [ "Content-Type" , content_type ]
+ , [ "Content-Length" , body.length ]
+ ];
+ if (!DEBUG)
+ headers.push(["Cache-Control", "public"]);
+
+ puts("static file " + filename + " loaded");
+ callback();
+ });
+
+ promise.addErrback(function () {
+ puts("Error loading " + filename);
+ });
+ }
+
+ return function (req, res) {
+ loadResponseData(function () {
+ res.sendHeader(200, headers);
+ res.sendBody(body);
+ res.finish();
+ });
+ }
+};
+
+// stolen from jack- thanks
+fu.mime = {
+ // returns MIME type for extension, or fallback, or octet-steam
+ lookupExtension : function(ext, fallback) {
+ return fu.mime.TYPES[ext.toLowerCase()] || fallback || 'application/octet-stream';
+ },
+
+ // List of most common mime-types, stolen from Rack.
+ TYPES : { ".3gp" : "video/3gpp"
+ , ".a" : "application/octet-stream"
+ , ".ai" : "application/postscript"
+ , ".aif" : "audio/x-aiff"
+ , ".aiff" : "audio/x-aiff"
+ , ".asc" : "application/pgp-signature"
+ , ".asf" : "video/x-ms-asf"
+ , ".asm" : "text/x-asm"
+ , ".asx" : "video/x-ms-asf"
+ , ".atom" : "application/atom+xml"
+ , ".au" : "audio/basic"
+ , ".avi" : "video/x-msvideo"
+ , ".bat" : "application/x-msdownload"
+ , ".bin" : "application/octet-stream"
+ , ".bmp" : "image/bmp"
+ , ".bz2" : "application/x-bzip2"
+ , ".c" : "text/x-c"
+ , ".cab" : "application/vnd.ms-cab-compressed"
+ , ".cc" : "text/x-c"
+ , ".chm" : "application/vnd.ms-htmlhelp"
+ , ".class" : "application/octet-stream"
+ , ".com" : "application/x-msdownload"
+ , ".conf" : "text/plain"
+ , ".cpp" : "text/x-c"
+ , ".crt" : "application/x-x509-ca-cert"
+ , ".css" : "text/css"
+ , ".csv" : "text/csv"
+ , ".cxx" : "text/x-c"
+ , ".deb" : "application/x-debian-package"
+ , ".der" : "application/x-x509-ca-cert"
+ , ".diff" : "text/x-diff"
+ , ".djv" : "image/vnd.djvu"
+ , ".djvu" : "image/vnd.djvu"
+ , ".dll" : "application/x-msdownload"
+ , ".dmg" : "application/octet-stream"
+ , ".doc" : "application/msword"
+ , ".dot" : "application/msword"
+ , ".dtd" : "application/xml-dtd"
+ , ".dvi" : "application/x-dvi"
+ , ".ear" : "application/java-archive"
+ , ".eml" : "message/rfc822"
+ , ".eps" : "application/postscript"
+ , ".exe" : "application/x-msdownload"
+ , ".f" : "text/x-fortran"
+ , ".f77" : "text/x-fortran"
+ , ".f90" : "text/x-fortran"
+ , ".flv" : "video/x-flv"
+ , ".for" : "text/x-fortran"
+ , ".gem" : "application/octet-stream"
+ , ".gemspec" : "text/x-script.ruby"
+ , ".gif" : "image/gif"
+ , ".gz" : "application/x-gzip"
+ , ".h" : "text/x-c"
+ , ".hh" : "text/x-c"
+ , ".htm" : "text/html"
+ , ".html" : "text/html"
+ , ".ico" : "image/vnd.microsoft.icon"
+ , ".ics" : "text/calendar"
+ , ".ifb" : "text/calendar"
+ , ".iso" : "application/octet-stream"
+ , ".jar" : "application/java-archive"
+ , ".java" : "text/x-java-source"
+ , ".jnlp" : "application/x-java-jnlp-file"
+ , ".jpeg" : "image/jpeg"
+ , ".jpg" : "image/jpeg"
+ , ".js" : "application/javascript"
+ , ".json" : "application/json"
+ , ".log" : "text/plain"
+ , ".m3u" : "audio/x-mpegurl"
+ , ".m4v" : "video/mp4"
+ , ".man" : "text/troff"
+ , ".mathml" : "application/mathml+xml"
+ , ".mbox" : "application/mbox"
+ , ".mdoc" : "text/troff"
+ , ".me" : "text/troff"
+ , ".mid" : "audio/midi"
+ , ".midi" : "audio/midi"
+ , ".mime" : "message/rfc822"
+ , ".mml" : "application/mathml+xml"
+ , ".mng" : "video/x-mng"
+ , ".mov" : "video/quicktime"
+ , ".mp3" : "audio/mpeg"
+ , ".mp4" : "video/mp4"
+ , ".mp4v" : "video/mp4"
+ , ".mpeg" : "video/mpeg"
+ , ".mpg" : "video/mpeg"
+ , ".ms" : "text/troff"
+ , ".msi" : "application/x-msdownload"
+ , ".odp" : "application/vnd.oasis.opendocument.presentation"
+ , ".ods" : "application/vnd.oasis.opendocument.spreadsheet"
+ , ".odt" : "application/vnd.oasis.opendocument.text"
+ , ".ogg" : "application/ogg"
+ , ".p" : "text/x-pascal"
+ , ".pas" : "text/x-pascal"
+ , ".pbm" : "image/x-portable-bitmap"
+ , ".pdf" : "application/pdf"
+ , ".pem" : "application/x-x509-ca-cert"
+ , ".pgm" : "image/x-portable-graymap"
+ , ".pgp" : "application/pgp-encrypted"
+ , ".pkg" : "application/octet-stream"
+ , ".pl" : "text/x-script.perl"
+ , ".pm" : "text/x-script.perl-module"
+ , ".png" : "image/png"
+ , ".pnm" : "image/x-portable-anymap"
+ , ".ppm" : "image/x-portable-pixmap"
+ , ".pps" : "application/vnd.ms-powerpoint"
+ , ".ppt" : "application/vnd.ms-powerpoint"
+ , ".ps" : "application/postscript"
+ , ".psd" : "image/vnd.adobe.photoshop"
+ , ".py" : "text/x-script.python"
+ , ".qt" : "video/quicktime"
+ , ".ra" : "audio/x-pn-realaudio"
+ , ".rake" : "text/x-script.ruby"
+ , ".ram" : "audio/x-pn-realaudio"
+ , ".rar" : "application/x-rar-compressed"
+ , ".rb" : "text/x-script.ruby"
+ , ".rdf" : "application/rdf+xml"
+ , ".roff" : "text/troff"
+ , ".rpm" : "application/x-redhat-package-manager"
+ , ".rss" : "application/rss+xml"
+ , ".rtf" : "application/rtf"
+ , ".ru" : "text/x-script.ruby"
+ , ".s" : "text/x-asm"
+ , ".sgm" : "text/sgml"
+ , ".sgml" : "text/sgml"
+ , ".sh" : "application/x-sh"
+ , ".sig" : "application/pgp-signature"
+ , ".snd" : "audio/basic"
+ , ".so" : "application/octet-stream"
+ , ".svg" : "image/svg+xml"
+ , ".svgz" : "image/svg+xml"
+ , ".swf" : "application/x-shockwave-flash"
+ , ".t" : "text/troff"
+ , ".tar" : "application/x-tar"
+ , ".tbz" : "application/x-bzip-compressed-tar"
+ , ".tcl" : "application/x-tcl"
+ , ".tex" : "application/x-tex"
+ , ".texi" : "application/x-texinfo"
+ , ".texinfo" : "application/x-texinfo"
+ , ".text" : "text/plain"
+ , ".tif" : "image/tiff"
+ , ".tiff" : "image/tiff"
+ , ".torrent" : "application/x-bittorrent"
+ , ".tr" : "text/troff"
+ , ".txt" : "text/plain"
+ , ".vcf" : "text/x-vcard"
+ , ".vcs" : "text/x-vcalendar"
+ , ".vrml" : "model/vrml"
+ , ".war" : "application/java-archive"
+ , ".wav" : "audio/x-wav"
+ , ".wma" : "audio/x-ms-wma"
+ , ".wmv" : "video/x-ms-wmv"
+ , ".wmx" : "video/x-ms-wmx"
+ , ".wrl" : "model/vrml"
+ , ".wsdl" : "application/wsdl+xml"
+ , ".xbm" : "image/x-xbitmap"
+ , ".xhtml" : "application/xhtml+xml"
+ , ".xls" : "application/vnd.ms-excel"
+ , ".xml" : "application/xml"
+ , ".xpm" : "image/x-xpixmap"
+ , ".xsl" : "application/xml"
+ , ".xslt" : "application/xslt+xml"
+ , ".yaml" : "text/yaml"
+ , ".yml" : "text/yaml"
+ , ".zip" : "application/zip"
+ }
+};
Oops, something went wrong.

0 comments on commit eb46c77

Please sign in to comment.