node-simple-router
Version:
Yet another minimalistic router for node.js
729 lines (664 loc) • 25 kB
JavaScript
// 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á, 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ón!</p>\n</div>\n<hr/>\n<p><strong>Current Time:</strong> <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: </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: </label><input type=\"text\" placeholder=\"River Plate\" name=\"team_name\" required=\"required\" /><br/>\n <label>Titles won: </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 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);