rewrite: begin the great server-side javascript migration

This commit is contained in:
Tyler Renelle 2013-08-28 23:21:06 -04:00
parent 10b0c9f9a5
commit ad67cbcc1c
9 changed files with 209 additions and 180 deletions

View file

@ -41,7 +41,7 @@
"npm": "1.2.x"
},
"scripts": {
"start": "nodemon src/server.coffee",
"start": "nodemon src/server.js",
"test": "mocha test/api.mocha.coffee",
"postinstall": "./node_modules/bower/bin/bower install -f"
}

View file

@ -1,20 +0,0 @@
# Load nconf and define default configuration values if config.json or ENV vars are not found
conf = require("nconf")
path = require("path")
conf
.argv()
.env()
.file('defaults', path.join(path.resolve __dirname, '../config.json.example'))
.file('user', path.join(path.resolve __dirname, '../config.json'))
#var agent;
#if (process.env.NODE_ENV === 'development') {
# // Follow these instructions for profiling / debugging leaks
# // * https://developers.google.com/chrome-developer-tools/docs/heap-profiling
# // * https://developers.google.com/chrome-developer-tools/docs/memory-analysis-101
# agent = require('webkit-devtools-agent');
# console.log("To debug memory leaks:" +
# "\n\t(1) Run `kill -SIGUSR2 " + process.pid + "`" +
# "\n\t(2) open http://c4milo.github.com/node-webkit-agent/21.0.1180.57/inspector.html?host=localhost:1337&page=0");
#}
Error.stackTraceLimit = Infinity if conf.get('NODE_ENV') is "development"

28
src/config.js Normal file
View file

@ -0,0 +1,28 @@
/* Load nconf and define default configuration values if config.json or ENV vars are not found*/
var conf = require("nconf");
var path = require("path");
conf.argv()
.env()
.file('defaults', path.join(path.resolve(__dirname, '../config.json.example')))
.file('user', path.join(path.resolve(__dirname, '../config.json')));
/*
var agent;
if (process.env.NODE_ENV === 'development') {
// Follow these instructions for profiling / debugging leaks
// * https://developers.google.com/chrome-developer-tools/docs/heap-profiling
// * https://developers.google.com/chrome-developer-tools/docs/memory-analysis-101
agent = require('webkit-devtools-agent');
console.log("To debug memory leaks:" +
"\n\t(1) Run `kill -SIGUSR2 " + process.pid + "`" +
"\n\t(2) open http://c4milo.github.com/node-webkit-agent/21.0.1180.57/inspector.html?host=localhost:1337&page=0");
}
*/
if (conf.get('NODE_ENV') === "development") {
Error.stackTraceLimit = Infinity;
}

View file

@ -1,30 +0,0 @@
nconf = require('nconf')
process.on "uncaughtException", (error) ->
sendEmail = (mailData) ->
nodemailer = require("derby-auth/node_modules/nodemailer")
# create reusable transport method (opens pool of SMTP connections)
# TODO derby-auth isn't currently configurable here, if you need customizations please send pull request
smtpTransport = nodemailer.createTransport("SMTP",
service: nconf.get('SMTP_SERVICE')
auth:
user: nconf.get('SMTP_USER')
pass: nconf.get('SMTP_PASS')
)
# send mail with defined transport object
smtpTransport.sendMail mailData, (error, response) ->
if error
console.log error
else
console.log "Message sent: " + response.message
smtpTransport.close() # shut down the connection pool, no more messages
sendEmail
from: "HabitRPG <admin@habitrpg.com>"
to: "tylerrenelle@gmail.com"
subject: "HabitRPG Error"
text: error.stack
console.log error.stack

39
src/errors.js Normal file
View file

@ -0,0 +1,39 @@
var nconf = require('nconf');
process.on("uncaughtException", function(error) {
var sendEmail;
sendEmail = function(mailData) {
var nodemailer, smtpTransport;
nodemailer = require("derby-auth/node_modules/nodemailer");
/* create reusable transport method (opens pool of SMTP connections)*/
/* TODO derby-auth isn't currently configurable here, if you need customizations please send pull request*/
smtpTransport = nodemailer.createTransport("SMTP", {
service: nconf.get('SMTP_SERVICE'),
auth: {
user: nconf.get('SMTP_USER'),
pass: nconf.get('SMTP_PASS')
}
});
/* send mail with defined transport object*/
return smtpTransport.sendMail(mailData, function(error, response) {
if (error) {
console.log(error);
} else {
console.log("Message sent: " + response.message);
}
/* shut down the connection pool, no more messages*/
return smtpTransport.close();
});
};
sendEmail({
from: "HabitRPG <admin@habitrpg.com>",
to: "tylerrenelle@gmail.com",
subject: "HabitRPG Error",
text: error.stack
});
return console.log(error.stack);
});

View file

@ -1,33 +0,0 @@
nconf = require('nconf')
_ = require('lodash')
module.exports = (req, res, next) ->
# splash = (req, res, next) ->
# isStatic = req.url.split('/')[1] is 'static'
# unless req.query?.play? or req.getModel().get('_userId') or isStatic
# res.redirect('/static/front')
# else
# next()
## Set _mobileDevice to true or false so view can exclude portions from mobile device
_.defaults (res.locals.habitrpg ?= {}),
NODE_ENV: nconf.get('NODE_ENV')
IS_MOBILE: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header 'User-Agent')
#CORS middleware
res.header "Access-Control-Allow-Origin", (req.headers.origin || "*")
res.header "Access-Control-Allow-Methods", "OPTIONS,GET,POST,PUT,HEAD,DELETE"
res.header "Access-Control-Allow-Headers", "Content-Type,Accept,Content-Encoding,X-Requested-With,x-api-user,x-api-key"
# wtf is this for?
if req.method is 'OPTIONS'
return res.send(200);
# translate = (req, res, next) ->
# model = req.getModel()
# # Set locale to bg on dev
# #model.set '_i18n.locale', 'bg' if process.env.NODE_ENV is "development"
# next()
next()

40
src/middleware.js Normal file
View file

@ -0,0 +1,40 @@
var nconf = require('nconf');
var _ = require('lodash');
module.exports = function(req, res, next) {
/*
//splash = (req, res, next) ->
// isStatic = req.url.split('/')[1] is 'static'
// unless req.query?.play? or req.getModel().get('_userId') or isStatic
// res.redirect('/static/front')
// else
// next()
*/
/* Set _mobileDevice to true or false so view can exclude portions from mobile device*/
var _base;
_.defaults(((_base = res.locals).habitrpg != null ? (_base = res.locals).habitrpg : _base.habitrpg = {}), {
NODE_ENV: nconf.get('NODE_ENV'),
IS_MOBILE: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header('User-Agent'))
});
/*CORS middleware*/
res.header("Access-Control-Allow-Origin", req.headers.origin || "*");
res.header("Access-Control-Allow-Methods", "OPTIONS,GET,POST,PUT,HEAD,DELETE");
res.header("Access-Control-Allow-Headers", "Content-Type,Accept,Content-Encoding,X-Requested-With,x-api-user,x-api-key");
/* wtf is this for?*/
if (req.method === 'OPTIONS') {
return res.send(200);
}
/*
// translate = (req, res, next) ->
// model = req.getModel()
// # Set locale to bg on dev
// #model.set '_i18n.locale', 'bg' if process.env.NODE_ENV is "development"
// next()
*/
return next();
};

View file

@ -1,96 +0,0 @@
express = require("express")
http = require("http")
path = require("path")
app = express()
nconf = require('nconf')
require('./config') # Setup configurations
require('./errors')
###
MongoDB Configuration
###
mongoose = require('mongoose')
require('./models/user') # load up the user schema - TODO is this necessary?
require('./models/group')
module.exports = server
# Connect using Mongoose too for API purposes, we'll eventually phase out Derby and only use mongoose
mongoose.connect nconf.get('NODE_DB_URI'), (err) ->
throw err if (err)
console.info('Connected with Mongoose')
###
Server Configuration
###
# all environments
app.set "port", nconf.get('PORT')
app.set "views", __dirname + "/../views"
app.set "view engine", "jade"
app.use express.favicon()
app.use express.logger("dev")
app.use express.bodyParser()
app.use require('connect-assets')()
app.use express.methodOverride()
app.use app.router
app.use express['static'](path.join(__dirname, "/../public"))
# development only
app.use express.errorHandler() if "development" is app.get("env")
# Custom Directives
app.use(require('./middleware'))
app.use(require('./routes/pages').middleware)
app.use('/api/v1', require('./routes/api').middleware)
app.use(require('./controllers/deprecated').middleware)
server = http.createServer(app).listen app.get("port"), ->
console.log "Express server listening on port " + app.get("port")
module.exports = server
#ONE_YEAR = 1000 * 60 * 60 * 24 * 365
#TWO_WEEKS = 1000 * 60 * 60 * 24 * 14
#root = path.dirname path.dirname __dirname
#publicPath = path.join root, 'public'
#
#
#expressApp
# .use(middleware.allowCrossDomain)
# .use(express.favicon("#{publicPath}/favicon.ico"))
# # Gzip static files and serve from memory
# .use(gzippo.staticGzip(publicPath, maxAge: ONE_YEAR))
# # Gzip dynamically rendered content
# .use(express.compress())
# .use(express.bodyParser())
# .use(express.methodOverride())
# # Uncomment and supply secret to add Derby session handling
# # Derby session middleware creates req.session and socket.io sessions
# .use(express.cookieParser())
# .use(store.sessionMiddleware
# secret: process.env.SESSION_SECRET || 'YOUR SECRET HERE'
# cookie: { maxAge: TWO_WEEKS } # defaults to 2 weeks? aka, can delete this line?
# store: mongo_store
# )
# # Adds req.getModel method
# .use(store.modelMiddleware())
# .use(middleware.translate)
# # API should be hit before all other routes
# # Show splash page for newcomers
# .use(middleware.splash)
# .use(priv.middleware)
# .use(middleware.view)
# .use(auth.middleware(strategies, options))
# # Creates an express middleware from the app's routes
# .use(app.router())
# .use(require('./static').middleware)
# .use(expressApp.router)
# .use(serverError(root))
#
#
## Errors
#expressApp.all '*', (req) ->
# throw "404: #{req.url}"

101
src/server.js Normal file
View file

@ -0,0 +1,101 @@
require('coffee-script') // remove this once we've fully converted over
var express = require("express");
var http = require("http");
var path = require("path");
var app = express();
var nconf = require('nconf');
var server;
// Setup configurations
require('./config');
require('./errors');
// MongoDB Configuration
mongoose = require('mongoose');
require('./models/user'); //load up the user schema - TODO is this necessary?
require('./models/group');
mongoose.connect(nconf.get('NODE_DB_URI'), function(err) {
if (err) throw err;
console.info('Connected with Mongoose');
});
/*
Server Configuration
*/
// all environments
app.set("port", nconf.get('PORT'));
app.set("views", __dirname + "/../views");
app.set("view engine", "jade");
app.use(express.favicon());
app.use(express.logger("dev"));
app.use(express.bodyParser());
app.use(require('connect-assets')());
app.use(express.methodOverride());
app.use(app.router);
app.use(express['static'](path.join(__dirname, "/../public")));
// development only
if ("development" === app.get("env")) {
app.use(express.errorHandler());
}
// Custom Directives
app.use(require('./middleware'));
app.use(require('./routes/pages').middleware);
app.use('/api/v1', require('./routes/api').middleware);
app.use(require('./controllers/deprecated').middleware);
server = http.createServer(app).listen(app.get("port"), function() {
return console.log("Express server listening on port " + app.get("port"));
});
module.exports = server;
/*
#ONE_YEAR = 1000 * 60 * 60 * 24 * 365
#TWO_WEEKS = 1000 * 60 * 60 * 24 * 14
#root = path.dirname path.dirname __dirname
#publicPath = path.join root, 'public'
#
#
#expressApp
# .use(middleware.allowCrossDomain)
# .use(express.favicon("#{publicPath}/favicon.ico"))
# # Gzip static files and serve from memory
# .use(gzippo.staticGzip(publicPath, maxAge: ONE_YEAR))
# # Gzip dynamically rendered content
# .use(express.compress())
# .use(express.bodyParser())
# .use(express.methodOverride())
# # Uncomment and supply secret to add Derby session handling
# # Derby session middleware creates req.session and socket.io sessions
# .use(express.cookieParser())
# .use(store.sessionMiddleware
# secret: process.env.SESSION_SECRET || 'YOUR SECRET HERE'
# cookie: { maxAge: TWO_WEEKS } # defaults to 2 weeks? aka, can delete this line?
# store: mongo_store
# )
# # Adds req.getModel method
# .use(store.modelMiddleware())
# .use(middleware.translate)
# # API should be hit before all other routes
# # Show splash page for newcomers
# .use(middleware.splash)
# .use(priv.middleware)
# .use(middleware.view)
# .use(auth.middleware(strategies, options))
# # Creates an express middleware from the app's routes
# .use(app.router())
# .use(require('./static').middleware)
# .use(expressApp.router)
# .use(serverError(root))
#
#
## Errors
#expressApp.all '*', (req) ->
# throw "404: #{req.url}"
*/