Created
April 9, 2014 00:46
-
-
Save soareschen/10214286 to your computer and use it in GitHub Desktop.
Benchmark
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict' | |
var Nedb = require('nedb') | |
var urlLib = require('url') | |
var httpLib = require('http') | |
var express = require('express') | |
var MongoClient = require('mongodb').MongoClient | |
var useExpress = true | |
var useMongo = true | |
var useImmediate = true | |
var defaultGreet = 'Hello' | |
var serverPort = 8080 | |
var mockUserEntries = [ | |
{ | |
'user_id': 'john', | |
'name': 'John Smith', | |
'greet': 'bonjour' | |
}, | |
{ | |
'user_id': 'joker', | |
'name': 'Mr Joker', | |
'want_uppercase_greet': true | |
}, | |
{ | |
'user_id': 'troll', | |
'name': 'Anonymous Troll', | |
'is_banned': true | |
}, | |
{ | |
'user_id': 'admin', | |
'name': 'Administrator', | |
'is_admin': true | |
} | |
] | |
var createMockDatabase = function(callback) { | |
console.log('creating mock database') | |
var db = new Nedb() | |
db.insert(mockUserEntries, function(err) { | |
if(err) return callback(err) | |
callback(null, db) | |
}) | |
} | |
var createMongoDatabase = function(callback) { | |
console.log('connecting to MongoDB') | |
MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) { | |
if(err) return callback(err) | |
var collection = db.collection('users') | |
callback(null, collection) | |
}) | |
} | |
var endResponse = function(statusCode, response) { | |
response.writeHead(statusCode) | |
response.end() | |
} | |
var nodeStreamToText = function(readStream, callback) { | |
var stringBuffer = '' | |
var streamEnded = false | |
readStream.on('data', function(data) { | |
stringBuffer += data | |
}) | |
readStream.on('end', function() { | |
if(streamEnded) return | |
streamEnded = true | |
callback(null, stringBuffer) | |
}) | |
readStream.on('error', function(err) { | |
if(streamEnded) return | |
streamEnded = true | |
callback(err) | |
}) | |
} | |
var tagsToReplace = { | |
'&': '&', | |
'<': '<', | |
'>': '>' | |
} | |
function replaceTag(tag) { | |
return tagsToReplace[tag] || tag; | |
} | |
function htmlEscape(str) { | |
return str.replace(/[&<>]/g, replaceTag); | |
} | |
var startExpressServer = function(handler) { | |
var app = express() | |
app.post('/:uid', handler) | |
app.listen(serverPort) | |
console.log('Express listening to port ' + serverPort + '...') | |
} | |
var startNodeServer = function(handler) { | |
var server = httpLib.createServer(handler) | |
server.listen(serverPort) | |
console.log('Node listening to port ' + serverPort + '...') | |
} | |
var createDatabase = useMongo ? createMongoDatabase : createMockDatabase | |
var doStartServver = useExpress ? startExpressServer : startNodeServer | |
var startServer = function(handler) { | |
if(!useImmediate) return doStartServver(handler) | |
console.log('using setImmediate') | |
var newHandler = function(request, response) { | |
setImmediate(function() { | |
handler(request, response) | |
}) | |
} | |
doStartServver(newHandler) | |
} | |
createDatabase(function(err, db) { | |
if(err) throw err | |
var handler = function(request, response) { | |
var userId = useExpress ? request.params.uid : urlLib.parse( | |
request.url, true).pathname.slice(1) | |
db.findOne({ user_id: userId }, function(err, user) { | |
if(err) return callback(err) | |
if(!user) return endResponse(404, response) | |
if(user.is_banned) return endResponse(403, response) | |
nodeStreamToText(request, function(err, inputText) { | |
if(err) return endResponse(500, response) | |
if(!user.is_admin) inputText = htmlEscape(inputText) | |
var greet = user.greet || defaultGreet | |
var greeting = greet + ', <b>' + user.name + '</b>!\n' + | |
'You have submitted the following text: \n' + inputText | |
if(user.want_uppercase_greet) greeting = greeting.toUpperCase() | |
response.writeHead(200) | |
response.write(greeting) | |
response.end() | |
}) | |
}) | |
} | |
startServer(handler) | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment