mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 15:48:04 +01:00
rewrite server.js in es6
This commit is contained in:
@@ -1,183 +1,162 @@
|
||||
require('babel/register');
|
||||
require('./libs/api-v3/setupNconf')();
|
||||
// Only do the minimal amount of work before forking just in case of a dyno restart
|
||||
var cluster = require("cluster");
|
||||
var _ = require('lodash');
|
||||
var nconf = require('nconf');
|
||||
var utils = require('./libs/utils');
|
||||
import nconf from 'nconf';
|
||||
import logging from './libs/logging';
|
||||
import utils from './libs/utils';
|
||||
import express from 'express';
|
||||
import http from 'http';
|
||||
// import path from 'path';
|
||||
// let swagger = require('swagger-node-express');
|
||||
import autoinc from 'mongoose-id-autoinc';
|
||||
import passport from 'passport';
|
||||
// let shared = require('../../common');
|
||||
import passportFacebook from 'passport-facebook';
|
||||
import mongoose from 'mongoose';
|
||||
import Q from 'q';
|
||||
import attachMiddlewares from './middlewares/api-v3/index';
|
||||
utils.setupConfig();
|
||||
var logging = require('./libs/logging');
|
||||
var IS_PROD = nconf.get('IS_PROD');
|
||||
var IS_DEV = nconf.get('IS_DEV');
|
||||
var DISABLE_LOGGING = nconf.get('DISABLE_REQUEST_LOGGING');
|
||||
var cores = +nconf.get("WEB_CONCURRENCY") || 0;
|
||||
|
||||
if (cores!==0 && cluster.isMaster && (IS_DEV || IS_PROD)) {
|
||||
// Fork workers. If config.json has CORES=x, use that - otherwise, use all cpus-1 (production)
|
||||
for (var i = 0; i < cores; i += 1) {
|
||||
cluster.fork();
|
||||
}
|
||||
// Setup translations
|
||||
// let i18n = require('./libs/i18n');
|
||||
|
||||
cluster.on('disconnect', function(worker, code, signal) {
|
||||
var w = cluster.fork(); // replace the dead worker
|
||||
logging.info('[%s] [master:%s] worker:%s disconnect! new worker:%s fork', new Date(), process.pid, worker.process.pid, w.process.pid);
|
||||
});
|
||||
} else {
|
||||
require('coffee-script'); // remove this once we've fully converted over
|
||||
var express = require("express");
|
||||
var http = require("http");
|
||||
var path = require("path");
|
||||
var swagger = require("swagger-node-express");
|
||||
var autoinc = require('mongoose-id-autoinc');
|
||||
var shared = require('../../common');
|
||||
const IS_PROD = nconf.get('IS_PROD');
|
||||
// const IS_DEV = nconf.get('IS_DEV');
|
||||
// const DISABLE_LOGGING = nconf.get('DISABLE_REQUEST_LOGGING');
|
||||
// const TWO_WEEKS = 1000 * 60 * 60 * 24 * 14;
|
||||
|
||||
// Setup translations
|
||||
var i18n = require('./libs/i18n');
|
||||
let server = http.createServer();
|
||||
let app = express();
|
||||
|
||||
var TWO_WEEKS = 1000 * 60 * 60 * 24 * 14;
|
||||
var app = express();
|
||||
var server = http.createServer();
|
||||
// Mongoose configuration
|
||||
|
||||
// ------------ MongoDB Configuration ------------
|
||||
var mongoose = require('mongoose');
|
||||
// Use Q promises instead of mpromise in mongoose
|
||||
mongoose.Promise = require('q');
|
||||
var mongooseOptions = !IS_PROD ? {} : {
|
||||
replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } },
|
||||
server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }
|
||||
};
|
||||
var db = mongoose.connect(nconf.get('NODE_DB_URI'), mongooseOptions, function(err) {
|
||||
if (err) throw err;
|
||||
logging.info('Connected with Mongoose');
|
||||
});
|
||||
autoinc.init(db);
|
||||
// Use Q promises instead of mpromise in mongoose
|
||||
mongoose.Promise = Q;
|
||||
let mongooseOptions = !IS_PROD ? {} : {
|
||||
replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } },
|
||||
server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } },
|
||||
};
|
||||
let db = mongoose.connect(nconf.get('NODE_DB_URI'), mongooseOptions, (err) => {
|
||||
if (err) throw err;
|
||||
logging.info('Connected with Mongoose');
|
||||
});
|
||||
|
||||
require('./libs/firebase');
|
||||
autoinc.init(db);
|
||||
|
||||
// load schemas & models
|
||||
require('./models/challenge');
|
||||
require('./models/group');
|
||||
require('./models/user');
|
||||
import './libs/firebase';
|
||||
|
||||
// ------------ Passport Configuration ------------
|
||||
var passport = require('passport')
|
||||
var util = require('util')
|
||||
var FacebookStrategy = require('passport-facebook').Strategy;
|
||||
// Passport session setup.
|
||||
// To support persistent login sessions, Passport needs to be able to
|
||||
// serialize users into and deserialize users out of the session. Typically,
|
||||
// this will be as simple as storing the user ID when serializing, and finding
|
||||
// the user by ID when deserializing. However, since this example does not
|
||||
// have a database of user records, the complete Facebook profile is serialized
|
||||
// and deserialized.
|
||||
passport.serializeUser(function(user, done) {
|
||||
done(null, user);
|
||||
});
|
||||
// load schemas & models
|
||||
import './models/challenge';
|
||||
import './models/group';
|
||||
import './models/user';
|
||||
|
||||
passport.deserializeUser(function(obj, done) {
|
||||
done(null, obj);
|
||||
});
|
||||
// ------------ Passport Configuration ------------
|
||||
// let util = require('util')
|
||||
let FacebookStrategy = passportFacebook.Strategy;
|
||||
|
||||
// FIXME
|
||||
// This auth strategy is no longer used. It's just kept around for auth.js#loginFacebook() (passport._strategies.facebook.userProfile)
|
||||
// The proper fix would be to move to a general OAuth module simply to verify accessTokens
|
||||
passport.use(new FacebookStrategy({
|
||||
clientID: nconf.get("FACEBOOK_KEY"),
|
||||
clientSecret: nconf.get("FACEBOOK_SECRET"),
|
||||
//callbackURL: nconf.get("BASE_URL") + "/auth/facebook/callback"
|
||||
},
|
||||
function(accessToken, refreshToken, profile, done) {
|
||||
done(null, profile);
|
||||
}
|
||||
));
|
||||
// Passport session setup.
|
||||
// To support persistent login sessions, Passport needs to be able to
|
||||
// serialize users into and deserialize users out of the session. Typically,
|
||||
// this will be as simple as storing the user ID when serializing, and finding
|
||||
// the user by ID when deserializing. However, since this example does not
|
||||
// have a database of user records, the complete Facebook profile is serialized
|
||||
// and deserialized.
|
||||
passport.serializeUser((user, done) => done(null, user));
|
||||
|
||||
// ------------ Server Configuration ------------
|
||||
var publicDir = path.join(__dirname, "/../public");
|
||||
passport.deserializeUser((obj, done) => done(null, obj));
|
||||
|
||||
app.set("port", nconf.get('PORT'));
|
||||
// FIXME
|
||||
// This auth strategy is no longer used. It's just kept around for auth.js#loginFacebook() (passport._strategies.facebook.userProfile)
|
||||
// The proper fix would be to move to a general OAuth module simply to verify accessTokens
|
||||
passport.use(new FacebookStrategy({
|
||||
clientID: nconf.get('FACEBOOK_KEY'),
|
||||
clientSecret: nconf.get('FACEBOOK_SECRET'),
|
||||
// callbackURL: nconf.get("BASE_URL") + "/auth/facebook/callback"
|
||||
}, (accessToken, refreshToken, profile, done) => done(null, profile)));
|
||||
|
||||
// Setup two different Express apps, one that matches everything except '/api/v3'
|
||||
// and the other for /api/v3 routes, so we can keep the old an new api versions completely separate
|
||||
// not sharing a single middleware if we don't want to
|
||||
var oldApp = express(); // api v1 and v2, and not scoped routes
|
||||
var newApp = express(); // api v3
|
||||
// ------------ Server Configuration ------------
|
||||
// let publicDir = path.join(__dirname, '/../public');
|
||||
|
||||
// Route requests to the right app
|
||||
// Matches all request except the ones going to /api/v3/**
|
||||
app.all(/^(?!\/api\/v3).+/i, oldApp);
|
||||
// Matches all requests going to /api/v3
|
||||
app.all('/api/v3', newApp);
|
||||
app.set('port', nconf.get('PORT'));
|
||||
|
||||
// Mount middlewares for the new app
|
||||
require('./middlewares/api-v3/index')(newApp);
|
||||
// Setup two different Express apps, one that matches everything except '/api/v3'
|
||||
// and the other for /api/v3 routes, so we can keep the old an new api versions completely separate
|
||||
// not sharing a single middleware if we don't want to
|
||||
let oldApp = express(); // api v1 and v2, and not scoped routes
|
||||
let newApp = express(); // api v3
|
||||
|
||||
/* OLD APP IS DISABLED UNTIL COMPATIBLE WITH NEW MODELS
|
||||
//require('./middlewares/apiThrottle')(oldApp);
|
||||
oldApp.use(require('./middlewares/domain')(server,mongoose));
|
||||
if (!IS_PROD && !DISABLE_LOGGING) oldApp.use(require('morgan')("dev"));
|
||||
oldApp.use(require('compression')());
|
||||
oldApp.set("views", __dirname + "/../views");
|
||||
oldApp.set("view engine", "jade");
|
||||
oldApp.use(require('serve-favicon')(publicDir + '/favicon.ico'));
|
||||
oldApp.use(require('./middlewares/cors'));
|
||||
// Route requests to the right app
|
||||
// Matches all request except the ones going to /api/v3/**
|
||||
app.all(/^(?!\/api\/v3).+/i, oldApp);
|
||||
// Matches all requests going to /api/v3
|
||||
app.all('/api/v3', newApp);
|
||||
|
||||
var redirects = require('./middlewares/redirects');
|
||||
oldApp.use(redirects.forceHabitica);
|
||||
oldApp.use(redirects.forceSSL);
|
||||
var bodyParser = require('body-parser');
|
||||
// Default limit is 100kb, need that because we actually send whole groups to the server
|
||||
// FIXME as soon as possible (need to move on the client from $resource -> $http)
|
||||
oldApp.use(bodyParser.urlencoded({
|
||||
limit: '1mb',
|
||||
parameterLimit: 10000, // Upped for safety from 1k, FIXME as above
|
||||
extended: true // Uses 'qs' library as old connect middleware
|
||||
}));
|
||||
oldApp.use(bodyParser.json({
|
||||
limit: '1mb'
|
||||
}));
|
||||
oldApp.use(require('method-override')());
|
||||
// Mount middlewares for the new app
|
||||
attachMiddlewares(newApp);
|
||||
|
||||
oldApp.use(require('cookie-parser')());
|
||||
oldApp.use(require('cookie-session')({
|
||||
name: 'connect:sess', // Used to keep backward compatibility with Express 3 cookies
|
||||
secret: nconf.get('SESSION_SECRET'),
|
||||
httpOnly: false,
|
||||
maxAge: TWO_WEEKS
|
||||
}));
|
||||
/* OLD APP IS DISABLED UNTIL COMPATIBLE WITH NEW MODELS
|
||||
//require('./middlewares/apiThrottle')(oldApp);
|
||||
oldApp.use(require('./middlewares/domain')(server,mongoose));
|
||||
if (!IS_PROD && !DISABLE_LOGGING) oldApp.use(require('morgan')("dev"));
|
||||
oldApp.use(require('compression')());
|
||||
oldApp.set("views", __dirname + "/../views");
|
||||
oldApp.set("view engine", "jade");
|
||||
oldApp.use(require('serve-favicon')(publicDir + '/favicon.ico'));
|
||||
oldApp.use(require('./middlewares/cors'));
|
||||
|
||||
// Initialize Passport! Also use passport.session() middleware, to support
|
||||
// persistent login sessions (recommended).
|
||||
oldApp.use(passport.initialize());
|
||||
oldApp.use(passport.session());
|
||||
var redirects = require('./middlewares/redirects');
|
||||
oldApp.use(redirects.forceHabitica);
|
||||
oldApp.use(redirects.forceSSL);
|
||||
var bodyParser = require('body-parser');
|
||||
// Default limit is 100kb, need that because we actually send whole groups to the server
|
||||
// FIXME as soon as possible (need to move on the client from $resource -> $http)
|
||||
oldApp.use(bodyParser.urlencoded({
|
||||
limit: '1mb',
|
||||
parameterLimit: 10000, // Upped for safety from 1k, FIXME as above
|
||||
extended: true // Uses 'qs' library as old connect middleware
|
||||
}));
|
||||
oldApp.use(bodyParser.json({
|
||||
limit: '1mb'
|
||||
}));
|
||||
oldApp.use(require('method-override')());
|
||||
|
||||
// Custom Directives
|
||||
oldApp.use(require('./routes/pages'));
|
||||
oldApp.use(require('./routes/payments'));
|
||||
oldApp.use(require('./routes/api-v2/auth'));
|
||||
oldApp.use(require('./routes/api-v2/coupon'));
|
||||
oldApp.use(require('./routes/api-v2/unsubscription'));
|
||||
var v2 = express();
|
||||
oldApp.use('/api/v2', v2);
|
||||
oldApp.use('/api/v1', require('./routes/api-v1'));
|
||||
oldApp.use('/export', require('./routes/dataexport'));
|
||||
require('./routes/api-v2/swagger')(swagger, v2);
|
||||
oldApp.use(require('cookie-parser')());
|
||||
oldApp.use(require('cookie-session')({
|
||||
name: 'connect:sess', // Used to keep backward compatibility with Express 3 cookies
|
||||
secret: nconf.get('SESSION_SECRET'),
|
||||
httpOnly: false,
|
||||
maxAge: TWO_WEEKS
|
||||
}));
|
||||
|
||||
var maxAge = IS_PROD ? 31536000000 : 0;
|
||||
// Cache emojis without copying them to build, they are too many
|
||||
oldApp.use(express['static'](path.join(__dirname, "/../build"), { maxAge: maxAge }));
|
||||
oldApp.use('/common/dist', express['static'](publicDir + "/../../common/dist", { maxAge: maxAge }));
|
||||
oldApp.use('/common/audio', express['static'](publicDir + "/../../common/audio", { maxAge: maxAge }));
|
||||
oldApp.use('/common/script/public', express['static'](publicDir + "/../../common/script/public", { maxAge: maxAge }));
|
||||
oldApp.use('/common/img', express['static'](publicDir + "/../../common/img", { maxAge: maxAge }));
|
||||
oldApp.use(express['static'](publicDir));
|
||||
// Initialize Passport! Also use passport.session() middleware, to support
|
||||
// persistent login sessions (recommended).
|
||||
oldApp.use(passport.initialize());
|
||||
oldApp.use(passport.session());
|
||||
|
||||
oldApp.use(require('./middlewares/errorHandler'));
|
||||
*/
|
||||
// Custom Directives
|
||||
oldApp.use(require('./routes/pages'));
|
||||
oldApp.use(require('./routes/payments'));
|
||||
oldApp.use(require('./routes/api-v2/auth'));
|
||||
oldApp.use(require('./routes/api-v2/coupon'));
|
||||
oldApp.use(require('./routes/api-v2/unsubscription'));
|
||||
var v2 = express();
|
||||
oldApp.use('/api/v2', v2);
|
||||
oldApp.use('/api/v1', require('./routes/api-v1'));
|
||||
oldApp.use('/export', require('./routes/dataexport'));
|
||||
require('./routes/api-v2/swagger')(swagger, v2);
|
||||
|
||||
server.on('request', app);
|
||||
server.listen(app.get("port"), function() {
|
||||
return logging.info("Express server listening on port " + app.get("port"));
|
||||
});
|
||||
var maxAge = IS_PROD ? 31536000000 : 0;
|
||||
// Cache emojis without copying them to build, they are too many
|
||||
oldApp.use(express['static'](path.join(__dirname, "/../build"), { maxAge: maxAge }));
|
||||
oldApp.use('/common/dist', express['static'](publicDir + "/../../common/dist", { maxAge: maxAge }));
|
||||
oldApp.use('/common/audio', express['static'](publicDir + "/../../common/audio", { maxAge: maxAge }));
|
||||
oldApp.use('/common/script/public', express['static'](publicDir + "/../../common/script/public", { maxAge: maxAge }));
|
||||
oldApp.use('/common/img', express['static'](publicDir + "/../../common/img", { maxAge: maxAge }));
|
||||
oldApp.use(express['static'](publicDir));
|
||||
|
||||
module.exports = server;
|
||||
}
|
||||
oldApp.use(require('./middlewares/errorHandler'));
|
||||
*/
|
||||
|
||||
server.on('request', app);
|
||||
server.listen(app.get('port'), () => {
|
||||
return logging.info(`Express server listening on port ${app.get('port')}`);
|
||||
});
|
||||
|
||||
export default server;
|
||||
Reference in New Issue
Block a user