diff --git a/package.json b/package.json index 1fde71bdc7..ac6a9f4f45 100644 --- a/package.json +++ b/package.json @@ -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" } diff --git a/src/config.coffee b/src/config.coffee deleted file mode 100644 index 220c5b2c87..0000000000 --- a/src/config.coffee +++ /dev/null @@ -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" \ No newline at end of file diff --git a/src/config.js b/src/config.js new file mode 100644 index 0000000000..308179c43a --- /dev/null +++ b/src/config.js @@ -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; +} diff --git a/src/errors.coffee b/src/errors.coffee deleted file mode 100644 index f39cb6ebd6..0000000000 --- a/src/errors.coffee +++ /dev/null @@ -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 " - to: "tylerrenelle@gmail.com" - subject: "HabitRPG Error" - text: error.stack - - console.log error.stack \ No newline at end of file diff --git a/src/errors.js b/src/errors.js new file mode 100644 index 0000000000..eff5f899e1 --- /dev/null +++ b/src/errors.js @@ -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 ", + to: "tylerrenelle@gmail.com", + subject: "HabitRPG Error", + text: error.stack + }); + return console.log(error.stack); +}); \ No newline at end of file diff --git a/src/middleware.coffee b/src/middleware.coffee deleted file mode 100644 index 9713dc06c8..0000000000 --- a/src/middleware.coffee +++ /dev/null @@ -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() diff --git a/src/middleware.js b/src/middleware.js new file mode 100644 index 0000000000..afc1381ac9 --- /dev/null +++ b/src/middleware.js @@ -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(); +}; diff --git a/src/server.coffee b/src/server.coffee deleted file mode 100644 index 3d4c4889bd..0000000000 --- a/src/server.coffee +++ /dev/null @@ -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}" diff --git a/src/server.js b/src/server.js new file mode 100644 index 0000000000..478e99dc29 --- /dev/null +++ b/src/server.js @@ -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}" + */ +