UNPKG

3.31 kBJavaScriptView Raw
1var express = require('express');
2var morgan = require('morgan');
3var cookieParser = require('cookie-parser');
4var bodyParser = require('body-parser');
5var methodOverride = require('method-override');
6var ipaddr = require('ipaddr.js');
7var extend = require('extend');
8var domain = require('domain');
9var VError = require('verror');
10
11var log = require('./logger')('server');
12var db = require('./db');
13var messenger = require('./messenger');
14var AuthController = require('./controllers/AuthController');
15var router = require('./router');
16var defaultOptions = require('./defaultOptions');
17var emitter = require('./emitter');
18var errors = require('./errors');
19
20var userbaseDomain = domain.create();
21
22/////////////////////////
23// INIT //
24/////////////////////////
25
26userbaseDomain.on('error', function(err) {
27 log.fatal(err);
28 process.exit(1);
29});
30
31morgan.token('user', function getId(req) {
32 return req.user && req.user._id || '';
33});
34
35function init(app, options) {
36 var morganFormat = morgan.combined.replace(':status', ':status :user');
37
38 if (process.env.NODE_ENV === 'development') {
39 morganFormat = 'dev';
40 }
41
42 app.use(morgan(morganFormat));
43
44 app.use(bodyParser.json());
45 app.use(bodyParser.urlencoded({
46 extended: false
47 }));
48 app.use(methodOverride());
49 app.use(cookieParser());
50
51 if (options.ipv4) {
52 addIPv4Middleware(app);
53 }
54
55 // configure athentication middleware
56 AuthController(app, options);
57
58 process.nextTick(function() {
59 // error handler configuration after routers are synchronously registered
60 addErrorMiddleware(app, options);
61 });
62}
63
64function registerDbAdaptor(app, options, dbAdaptor) {
65 return db(dbAdaptor).then(function() {
66 app.listen(options.port);
67 log.info('App listening on port', options.port);
68 });
69}
70
71function registerMessageAdaptor(app, options, messageAdaptor) {
72 return messenger(messageAdaptor);
73}
74
75function addIPv4Middleware(app) {
76 app.use(function(req, res, next) {
77 var ip = req.ip;
78
79 Object.defineProperty(req, 'ip', {
80 get: function() {
81 return ip;
82 },
83 set: function(val) {
84 ip = ipaddr.process(val).toString();
85 }
86 });
87
88 req.ip = req.ip;
89 next();
90 });
91}
92
93function addErrorMiddleware(app, options) {
94 // catch 404 and forward to error handler
95 app.use(function(req, res, next) {
96 var err = new VError('Not Found');
97 err.status = 404;
98 next(err);
99 });
100
101 app.use(function(err, req, res, next) {
102 (req.log || log).error(err);
103
104 if (res.headersSent) {
105 return next(err);
106 }
107
108 var data = options.apiEnvelope(null, err);
109
110 // request library uses statucCode
111 res.status(err.status || err.statusCode || 500).send(data);
112 });
113}
114
115function createUserbaseApp(options) {
116 var app = express();
117 options = extend(true, defaultOptions, options);
118
119 init(app, options);
120
121 exports.router = router(app, options);
122 exports.registerDbAdaptor = registerDbAdaptor.bind(this, app, options);
123 exports.registerMessageAdaptor = registerMessageAdaptor.bind(this, app, options);
124 exports.apiEnvelope = options.apiEnvelope;
125
126 return app;
127}
128
129///////////////////////////
130// EXPORTS //
131///////////////////////////
132
133exports = module.exports = userbaseDomain.bind(createUserbaseApp);
134
135exports.emitter = emitter;
136exports.errors = errors;
\No newline at end of file