UNPKG

node-simple-router

Version:

Yet another minimalistic router for node.js

729 lines (664 loc) 25 kB
#!/usr/bin/env node // Generated by CoffeeScript 1.10.0 (function() { var Router, _extend, argv, base_context, chatManager, clean_up, createProxy, defer, e, e2, error, error1, error2, fakehandler, fs, func, get_wiki, http, https, msgs, path, ref, ref1, router, scgi_child, server, site_router, socks, spawn, wamp, wampRouter, wsserver; process.chdir(__dirname); path = require('path'); fs = require('fs'); spawn = require('child_process').spawn; try { Router = require('../src/router'); } catch (error) { e = error; try { Router = require('../lib/router'); } catch (error1) { e2 = error1; console.log('node-simple-router must be installed for this to work'); process.exit(-1); } } defer = require('../lib/promises').defer; ref = require("" + __dirname + path.sep + "wschat"), wsserver = ref.wsserver, socks = ref.socks, msgs = ref.msgs, createProxy = ref.createProxy; wamp = require("../lib/wamp"); ref1 = require("" + __dirname + path.sep + "wampchat"), wampRouter = ref1.wampRouter, chatManager = ref1.chatManager; http = require('http'); https = require('https'); router = Router({ list_dir: true }); _extend = function(base, extender) { var key, new_obj, val; new_obj = {}; for (key in base) { val = base[key]; new_obj[key] = val; } for (key in extender) { val = extender[key]; new_obj[key] = val; } return new_obj; }; base_context = { home_active: '', getting_started_active: '', documentation_active: '', changelog_active: '', license_active: '', wiki_active: '', about_active: '' }; site_router = function(context, response, keep_tokens) { if (keep_tokens == null) { keep_tokens = false; } return router.render_template_file(__dirname + "/templates/layout.html", context, (function(exists, rendered_text) { return response.end(rendered_text); }), keep_tokens); }; router.get("/", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/home.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data, home_active: 'active' }); return site_router(context, response); }); }); router.get("/getting_started", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/getting_started.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data, getting_started_active: 'active' }); return site_router(context, response); }); }); router.get("/documents", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/documents.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data, documentation_active: 'active' }); return site_router(context, response, true); }); }); router.get("/changelog", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/changelog.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data, changelog_active: 'active' }); return site_router(context, response); }); }); router.get("/license", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/license.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data, license_active: 'active' }); return site_router(context, response); }); }); router.get("/wiki", function(request, response) { return get_wiki(request, response, "Home"); }); router.get("/wiki/:page", function(request, response) { return get_wiki(request, response, request.params.page); }); get_wiki = function(request, response, destination) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/wiki.html", { encoding: "utf8" }, function(err, data) { return https.get("https://github.com/sandy98/node-simple-router/wiki/" + destination, function(resp) { var chunks; chunks = []; resp.on('error', function(err) { return router._500(request, response, request.url, err.message); }); resp.on('data', function(chunk) { return chunks.push(chunk); }); return resp.on('end', function() { var context, remote_data; remote_data = chunks.join(''); context = _extend(base_context, { contents: router.render_template(data, { wiki_content: remote_data }), wiki_active: 'active' }); return site_router(context, response); }); }); }); }; router.get("/about", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/about.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: router.render_template(data, { current_version: router.version }), about_active: 'active' }); return site_router(context, response); }); }); router.get("/hello_world", function(request, response) { var context, data; response.writeHead(200, { 'Content-Type': 'text/html' }); data = "<div style=\"margin-left: 2em;\">\n <p style=\"color: rgb(" + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + ");\" title=\"English\">Hello, World!</p>\n <p style=\"color: rgb(" + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + ");\" title=\"Spanish\">Hola, Mundo!</p>\n <p style=\"color: rgb(" + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + ");\" title=\"Italian\">Ciao, Mondo!</p>\n <p style=\"color: rgb(" + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + ");\" title=\"French\">Bonjour, tout le Monde!</p>\n <p style=\"color: rgb(" + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + ");\" title=\"Portuguese\">Ol&aacute;, Mundo!</p>\n <p style=\"color: rgb(" + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + ");\" title=\"German\">Hallo, Welt!</p>\n <p style=\"color: rgb(" + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + "," + (Math.floor(Math.random() * 256)) + ");\" title=\"Catalan\">Hola, M&oacute;n!</p>\n</div>\n<hr/>\n<p><strong>Current Time:</strong>&nbsp;<span id='date-span'>" + (new Date().toLocaleString().replace(/GMT.+/, '')) + "</span></p>\n<script type=\"text/javascript\">\n setTimeout(function () {try {$('p[title]').tooltip({placement: 'left'});} catch (e) {}}, 0);\n setInterval(function () {document.getElementById('date-span').innerHTML = new Date().toLocaleString().replace(/GMT.+/, '');}\n , 1000);\n setTimeout(function () {location.reload();}, 10000);\n </script>"; context = _extend(base_context, { contents: data }); return site_router(context, response); }); router.any("/agents/:number", function(request, response) { var context, data; response.writeHead(200, { 'Content-Type': 'text/html' }); data = "<div>\n <h1>\n <span>Super Agent No:&nbsp;</span>\n <span class=\"nsr\">" + request.params.number + "</span>\n </h1>\n</div>"; context = _extend(base_context, { contents: data }); return site_router(context, response); }); router.get("/teams", function(request, response) { var context, data; response.writeHead(200, { 'Content-Type': 'text/html' }); data = "<div>\n <form method=\"post\">\n <label>Preferred team:&nbsp;&nbsp;&nbsp;</label><input type=\"text\" placeholder=\"River Plate\" name=\"team_name\" required=\"required\" /><br/>\n <label>Titles won:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label><input type=\"number\" value=\"0\" name=\"titles_won\" required=\"required\" /><br/>\n <p></p>\n <input class=\"btn btn-primary\" type=\"submit\" value=\"Send\" /> <input class=\"btn\" type=\"reset\" value=\"Reset\" />\n </form>\n</div>"; context = _extend(base_context, { contents: data }); return site_router(context, response); }); router.post("/teams", function(request, response) { var context, data; response.writeHead(200, { 'Content-Type': 'text/html' }); data = "<h1>\n Your team is <span style=\"color: #ff0000;\">{{ team_name }}</span>\n &nbsp;and has won <span style=\"color: #008f00;\">{{ titles_won }}</span> title{{is_plural}}.\n</h1>\n<hr/>\n<p><a href=\"/teams\">Back to team choice</a></p>"; context = _extend(base_context, { contents: router.render_template(data, _extend(request.post, { is_plural: request.post.titles_won === "1" ? '' : 's' })) }); return site_router(context, response); }); router.get("/wimi", function(request, response) { return router.proxy_pass("http://sandy98-coffee-hello.herokuapp.com/wimi", response); }); router.get("/cgitest", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/cgitest.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data }); return site_router(context, response); }); }); router.get("/scgitest", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/scgiform.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data }); return site_router(context, response); }); }); router.post("/scgi/:prog_id", function(request, response) { if (request.params.prog_id === 'hello_scgi_py') { return router.scgi_pass(26000, request, response); } else { return router._404(request, response, request.url); } }); router.any("/templates", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/layout.html", { encoding: "utf8" }, function(err, layout) { return fs.readFile(__dirname + "/templates/templates.html", { encoding: "utf8" }, function(err, data) { var compiled, error2, script, str_to_replace, template, tpl_obj; if (request.method.match(/post/i)) { try { tpl_obj = eval("(" + request.post.txt_context + ")"); } catch (error2) { e = error2; tpl_obj = {}; } template = request.post.txt_template; compiled = router.render_template(template, tpl_obj); str_to_replace = "<div id=\"template-result\">"; data = data.replace(str_to_replace, "" + str_to_replace + compiled); script = "<script type=\"text/javascript\">\n var setValues = function () {\n //document.getElementById('txt-context').value = 'CONTEXT';\n //document.getElementById('txt-template').value = 'TEMPLATE';\n var context = '" + (escape(request.post.txt_context)) + "';\n var template = '" + (escape(request.post.txt_template)) + "';\n document.getElementById('txt-context').value = unescape(context);\n document.getElementById('txt-template').value = unescape(template);\n };\n document.body.onload = function() {setTimeout(setValues, 100);};\n </script>\n</body>"; layout = layout.replace('</body>', script); } return response.end(layout.replace("{{& contents }}", data)); }); }); }); router.get("/uploads_form", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/uploadsform.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data }); return site_router(context, response); }); }); router.post("/handle_upload", function(request, response) { var encoding, fullname; response.writeHead(200, { 'Content-type': 'text/html' }); if (request.fileName) { response.write("<h2>Uploaded File Data</h2>"); response.write("File name = " + request.fileName + "<br/>"); response.write("File length = " + request.fileLen + " bytes<br/>"); response.write("File type = " + request.fileType + "<br/>"); fullname = __dirname + "/public/uploads/" + request.fileName; if (request.fileType.indexOf('text') >= 0) { encoding = 'utf8'; } else { encoding = 'binary'; } return fs.writeFile(fullname, request.fileData, { encoding: encoding }, function(err) { if (err) { response.write("<p style='color: red;'>Something went wrong, uploaded file could not be saved.</p>"); } else { response.write('<div style="text-align:center; padding: 1em; border: 1px solid; border-radius: 5px;">'); if (request.fileType.indexOf('image') >= 0) { response.write("<img src='/uploads/" + request.fileName + "' />"); } else if (request.fileType.indexOf('video') >= 0) { response.write("<video src='/uploads/" + request.fileName + "'></video>"); } else { response.write("<pre>" + request.fileData + "</pre>"); } response.write("</div>"); } response.write("<hr/>"); return response.end("<div style=\"text-align: center;\"><button onclick=\"history.back();\">Back</button></div>"); }); } else { response.write("<p style='color: red;'>Something went wrong, looks like nothing was uploaded.</p>"); return response.end("<div style=\"text-align: center;\"><button onclick=\"history.back();\">Back</button></div>"); } }); router.get("/sillychat", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/sillychat.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data }); return site_router(context, response); }); }); router.get("/wampchat", function(request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/wampchat.html", { encoding: "utf8" }, function(err, data) { var context; context = _extend(base_context, { contents: data }); return site_router(context, response); }); }); router.get('/getsession', function(request, response) { return router.getSession(request, function(sess_obj) { return response.end(JSON.stringify(sess_obj)); }); }); router.get('/setsession', function(request, response) { router.setSession(request, request.get); response.writeHead(307, { 'Location': "/session" }); return response.end("Session updated with " + (JSON.stringify(request.get))); }); router.get('/updatesession', function(request, response) { router.updateSession(request, request.get); response.writeHead(307, { 'Location': "/session" }); return response.end("Session updated with " + (JSON.stringify(request.get))); }); router.get('/getcookie/:cookiename', function(request, response) { return response.end(JSON.stringify(router.getCookie(request, request.params.cookiename))); }); router.get('/getcookie', function(request, response) { return response.end(JSON.stringify(router.getCookie(request))); }); router.get('/setcookie', function(request, response) { var max_age; if (request.get.max_age) { max_age = request.get.max_age; delete request.get.max_age; router.setCookie(response, request.get, max_age); } else { router.setCookie(response, request.get); } response.writeHead(307, { 'Location': "/getcookie" }); return response.end("Cookie updated with " + (JSON.stringify(request.get))); }); router.get("/uuid", function(request, response) { return response.end(router.getUUID()); }); router.get("/sethandler/:funcname", function(request, response) { router.setSessionHandler(request.params.funcname); response.writeHead(307, { "Location": "/session" }); return response.end("Session handler set to '" + router.nsr_session_handler + "' function"); }); router.any("/session", function(request, response) { var delete_sess, obj, set_sess, update_sess; set_sess = false; update_sess = false; delete_sess = false; obj = null; response.writeHead(200, { 'Content-Type': 'text/html' }); return fs.readFile(__dirname + "/templates/session.html", { encoding: "utf8" }, function(err, data) { var key, value; if (request.method.toLowerCase() === 'post') { if ('nsr-handlers' in request.post) { router.setSessionHandler(request.post['nsr-handlers']); } if ('key-text' in request.post) { key = request.post['key-text']; value = request.post['value-text']; obj = {}; obj[key] = value; switch (request.post['radio-action']) { case 'set': set_sess = true; break; case 'update': update_sess = true; break; case 'delete': delete_sess = true; } } } return router.getSession(request, function(sess) { var context, handler, k, sess_array, v; if (set_sess) { sess = obj; router.setSession(request, sess); } if (update_sess) { router.updateSession(request, obj); for (k in obj) { v = obj[k]; sess[k] = v; } } if (delete_sess) { for (k in obj) { delete sess[k]; } router.setSession(request, sess); } sess_array = (function() { var results1; results1 = []; for (k in sess) { v = sess[k]; results1.push({ key: k, value: v }); } return results1; })(); obj = { session: sess_array, sid: router.getCookie(request, 'nsr_sid').nsr_sid }; obj.selected_handler = router.nsr_session_handler; obj.handlers = (function() { var i, len, ref2, results1; ref2 = router.avail_nsr_session_handlers; results1 = []; for (i = 0, len = ref2.length; i < len; i++) { handler = ref2[i]; results1.push({ name: handler, selected: handler === router.nsr_session_handler ? 'selected' : '' }); } return results1; })(); context = _extend(base_context, { contents: router.render_template(data, obj) }); return site_router(context, response); }); }); }); router.get("/icon/:x/:y", function(request, response) { var x, y; response.writeHead(200, { 'Content-Type': 'text/html' }); x = parseInt(request.params.x) || 0; y = parseInt(request.params.y) || 0; return response.end(router.get_icon(x, y)); }); router.get("/stockicon/:which", function(request, response) { if (router.stock_icons[request.params.which]) { response.writeHead(200, { 'Content-Type': 'text/html' }); return response.end(router.stock_icons[request.params.which]()); } else { return router._404(request, response, request.url); } }); router.get("/gallery", function(request, response) { var fpath; fpath = "" + router.static_route; path = request.get.dir ? "/" + request.get.dir : "."; if (path !== ".") { fpath = "" + fpath + path; } router.gallery(fpath, path, response); return router.log(fpath); }); router.get("/latencies", function(request, response) { var i, len, sock; for (i = 0, len = socks.length; i < len; i++) { sock = socks[i]; response.write(sock.username + " - " + sock.currentRoundTrip + " secs.\n"); } return response.end(); }); fakehandler = function(request, opcode, sessObj, cb) { if (opcode == null) { opcode = 'get'; } if (sessObj == null) { sessObj = {}; } if (cb == null) { cb = (function(id) { return id; }); } cb({ username: 'cacarulo', time: new Date().toISOString() }); return "Narizota"; }; func = router.addSessionHandler('fakehandler', fakehandler); argv = process.argv.slice(2); server = http.createServer(router); try { scgi_child = spawn(__dirname + "/public/scgi/python/hello_scgi.py", [], { cwd: __dirname + "/public/scgi/python" }); } catch (error2) { e = error2; scgi_child = { kill: function(signal) { return console.log("'Killing' mock child with signal: " + signal); } }; console.log("Couldn't spawn real child process because of: " + e.message + "\nUsing a mock one."); } server.on('listening', function() { var addr, addrString, wampClient; wsserver.listen(server); addr = server.address(); if (addr.port != null) { createProxy(addr.port - 1); } wampRouter.listen(server, null, '/wampchat'); wampClient = new wamp.WampClient({ url: "ws://" + addr.address + ":" + addr.port + "/wampchat", realm: "test" }); wampClient.onopen = function(sessionData) { var add2, factorial, key, val; add2 = function() { var result; return result = arguments[0] + arguments[1]; }; factorial = function(n) { if (n < 2) { return n; } else { return n * factorial(n - 1); } }; for (key in sessionData) { val = sessionData[key]; wampClient[key] = val; } wampClient.register('localhost.test.add2', add2); wampClient.register('localhost.test.factorial', factorial); wampClient.call('localhost.test.add2', [30, 40]).then(function(results) { return console.log("Result from RPC is: %j", results[0]); }); wampClient.subscribe('localhost.test.chat', function(args, kwArgs) { if (args == null) { args = []; } if (kwArgs == null) { kwArgs = {}; } return console.log("RECEIVED THE FOLLOWING MESSAGE: " + args[0] + " FROM SUBSCRIPTION localhost.test.chat"); }); return wampClient.publish('localhost.test.chat', ['Hi, everybody!']); }; chatManager.onopen = function(sessionData) { var key, val; for (key in sessionData) { val = sessionData[key]; chatManager[key] = val; } return chatManager.start(); }; wampClient.connect(); chatManager.connect(); addrString = typeof addr === 'string' ? "'" + addr + "'" : addr.address + ":" + addr.port; return router.log(("NSR v" + router.version + " serving web content at " + addrString + " - PID: ") + process.pid); }); clean_up = function() { router.log(' '); router.log("Server shutting up..."); router.log(' '); server.close(); scgi_child.kill('SIGTERM'); return process.exit(0); }; process.on('SIGINT', clean_up); process.on('SIGHUP', clean_up); process.on('SIGQUIT', clean_up); process.on('SIGTERM', clean_up); server.listen((argv[0] != null) && !isNaN(parseInt(argv[0])) ? parseInt(argv[0]) : 8000); }).call(this);