1 | (function() {
|
2 | 'use strict';
|
3 | var chalk, cluster, configured, controllers, cryptojs, fs, glob, middleware, rfs, settings, underscored, uselist;
|
4 |
|
5 | settings = require('./settings.js');
|
6 |
|
7 | chalk = require('chalk');
|
8 |
|
9 | underscored = require('underscore.string').underscored;
|
10 |
|
11 | glob = require('glob');
|
12 |
|
13 | fs = require('fs');
|
14 |
|
15 | rfs = require('rotating-file-stream');
|
16 |
|
17 | cluster = require('cluster');
|
18 |
|
19 | cryptojs = require('crypto-js');
|
20 |
|
21 | configured = false;
|
22 |
|
23 | controllers = [];
|
24 |
|
25 | uselist = [];
|
26 |
|
27 | middleware = [];
|
28 |
|
29 | module.exports = {
|
30 | config: function(config) {
|
31 | var key, keyU;
|
32 | for (key in config) {
|
33 | keyU = underscored(key).toUpperCase();
|
34 | if (Object.prototype.toString.call(config[key]) === '[object Boolean]') {
|
35 | settings[keyU] = config[key];
|
36 | } else {
|
37 | settings[keyU] = settings[keyU] || config[key];
|
38 | }
|
39 | }
|
40 | if (!settings.DB_ENGINE) {
|
41 | settings.DB_ENGINE = require('ndxdb');
|
42 | }
|
43 | if (settings.TABLES && settings.TABLES.length) {
|
44 | if (settings.TABLES.indexOf(settings.USER_TABLE) === -1) {
|
45 | settings.TABLES.push(settings.USER_TABLE);
|
46 | }
|
47 | } else {
|
48 | settings.TABLES = [settings.USER_TABLE];
|
49 | }
|
50 | configured = true;
|
51 | return this;
|
52 | },
|
53 | controller: function(ctrl) {
|
54 | var type;
|
55 | type = Object.prototype.toString.call(ctrl);
|
56 | if (type === '[object Function]') {
|
57 | controllers.push(ctrl);
|
58 | } else {
|
59 | controllers.push(require('../../' + ctrl));
|
60 | }
|
61 | return this;
|
62 | },
|
63 | use: function(ctrl) {
|
64 | var type;
|
65 | type = Object.prototype.toString.call(ctrl);
|
66 | if (type === '[object Function]') {
|
67 | uselist.push(ctrl);
|
68 | } else {
|
69 | uselist.push(require('../../' + ctrl));
|
70 | }
|
71 | return this;
|
72 | },
|
73 | start: function() {
|
74 | var MemoryStore, accessLogStream, bodyParser, compression, cookieParser, ctrl, e, express, folder, helmet, http, https, i, j, k, l, len, len1, len2, len3, len4, len5, len6, m, maintenance, module, moduleName, modulePackage, modulesToLoad, morgan, n, ndx, o, p, r, ref, session, useCtrl, w;
|
75 | if (cluster.isMaster) {
|
76 | i = 0;
|
77 | while (i++ < 1) {
|
78 | cluster.fork();
|
79 | }
|
80 | return cluster.on('exit', function(worker) {
|
81 | console.log(`Worker ${worker.id} died..`);
|
82 | if (settings.AUTO_RESTART && settings.AUTO_RESTART.toString().toLowerCase() !== 'false') {
|
83 | return cluster.fork();
|
84 | } else {
|
85 | return process.exit(1);
|
86 | }
|
87 | });
|
88 | } else {
|
89 | console.log("\nndx server starting");
|
90 | if (!configured) {
|
91 | this.config();
|
92 | }
|
93 | ndx = require('./services/ndx');
|
94 | ndx.database = settings.DB_ENGINE.config(settings).setNdx(ndx).start();
|
95 | express = require('express');
|
96 | compression = require('compression');
|
97 | bodyParser = require('body-parser');
|
98 | cookieParser = require('cookie-parser');
|
99 | session = require('express-session');
|
100 | MemoryStore = require('session-memory-store')(session);
|
101 | http = require('http');
|
102 | if (settings.SSL_PORT) {
|
103 | https = require('https');
|
104 | }
|
105 | helmet = require('helmet');
|
106 | morgan = require('morgan');
|
107 | maintenance = require('./maintenance.js');
|
108 | ndx.app = express();
|
109 | ndx.static = express.static;
|
110 | ndx.port = settings.PORT;
|
111 | ndx.ssl_port = settings.SSL_PORT;
|
112 | ndx.host = settings.HOST;
|
113 | ndx.settings = settings;
|
114 | ndx.app.use(compression()).use(helmet());
|
115 | if (!ndx.settings.DO_NOT_LOG) {
|
116 | if (ndx.settings.LOG_TO_SCREEN) {
|
117 | ndx.app.use(morgan(ndx.settings.LOG_LEVEL));
|
118 | } else {
|
119 | fs.existsSync(ndx.settings.LOG_DIR) || fs.mkdirSync(ndx.settings.LOG_DIR);
|
120 | accessLogStream = rfs('access.log', {
|
121 | interval: '1d',
|
122 | path: ndx.settings.LOG_DIR
|
123 | });
|
124 | ndx.app.use(morgan(ndx.settings.LOG_LEVEL, {
|
125 | stream: accessLogStream
|
126 | }));
|
127 | }
|
128 | }
|
129 | ndx.app.use(maintenance({
|
130 | database: ndx.database
|
131 | })).use(session({
|
132 | name: 'session',
|
133 | secret: ndx.settings.SESSION_SECRET,
|
134 | saveUninitialized: true,
|
135 | resave: true,
|
136 | store: new MemoryStore({
|
137 | expires: 5
|
138 | })
|
139 | })).use(cookieParser(ndx.settings.SESSION_SECRET));
|
140 | if (ndx.settings.E2E_ENCRYPTION) {
|
141 | ndx.app.use(function(req, res, next) {
|
142 | if (req.headers['content-type'] && req.headers['content-type'].indexOf('application/json') === 0) {
|
143 | return bodyParser.text({
|
144 | type: '*/*',
|
145 | limit: '50mb'
|
146 | })(req, res, next);
|
147 | } else {
|
148 | return bodyParser.json({
|
149 | limit: '50mb'
|
150 | })(req, res, next);
|
151 | }
|
152 | }).use(function(req, res, next) {
|
153 | if (req.headers['content-type'] && req.headers['content-type'].indexOf('application/json') === 0) {
|
154 | if (ndx.crypto) {
|
155 | ndx.crypto.decrypt(req);
|
156 | }
|
157 | }
|
158 | return next();
|
159 | });
|
160 | ndx.app.use(function(req, res, next) {
|
161 | if (ndx.crypto) {
|
162 | ndx.crypto.encrypt(res);
|
163 | }
|
164 | return next();
|
165 | });
|
166 | } else {
|
167 | ndx.app.use(bodyParser.json({
|
168 | limit: '50mb'
|
169 | }));
|
170 | }
|
171 | ndx.server = http.createServer(ndx.app);
|
172 | if (settings.SSL_PORT) {
|
173 | ndx.sslserver = https.createServer({
|
174 | key: fs.readFileSync('key.pem'),
|
175 | cert: fs.readFileSync('cert.pem')
|
176 | }, ndx.app);
|
177 | }
|
178 | require('./controllers/token')(ndx);
|
179 | modulesToLoad = [];
|
180 | if (settings.AUTO_LOAD_MODULES) {
|
181 | r = glob.sync("server/startup/**/*.js");
|
182 | r.reverse();
|
183 | for (j = 0, len = r.length; j < len; j++) {
|
184 | module = r[j];
|
185 | require(`${process.cwd()}/${module}`)(ndx);
|
186 | }
|
187 | r = glob.sync('node_modules/*');
|
188 | for (k = 0, len1 = r.length; k < len1; k++) {
|
189 | module = r[k];
|
190 | moduleName = module.replace('node_modules/', '');
|
191 | modulePackage = {};
|
192 | try {
|
193 | modulePackage = require(`${process.cwd()}/node_modules/${moduleName}/package.json`);
|
194 | } catch (error) {
|
195 | e = error;
|
196 | }
|
197 | if ((moduleName.indexOf('ndx-') === 0 || modulePackage.ndx) && !modulePackage.ndxIgnore) {
|
198 | if (moduleName !== 'ndx-server' && modulePackage.loadOrder !== 'ignore') {
|
199 | modulesToLoad.push({
|
200 | name: moduleName,
|
201 | loadOrder: Object.prototype.toString.call(modulePackage.loadOrder) === '[object Number]' ? modulePackage.loadOrder : 5,
|
202 | version: modulePackage.version
|
203 | });
|
204 | }
|
205 | }
|
206 | modulePackage = null;
|
207 | }
|
208 | modulesToLoad.sort(function(a, b) {
|
209 | return a.loadOrder - b.loadOrder;
|
210 | });
|
211 | console.log('');
|
212 | w = function(text) {
|
213 | i = text.length;
|
214 | while (i++ < 20) {
|
215 | text += ' ';
|
216 | }
|
217 | return text;
|
218 | };
|
219 | for (l = 0, len2 = modulesToLoad.length; l < len2; l++) {
|
220 | module = modulesToLoad[l];
|
221 | //console.log "loading #{module.name}"
|
222 | require(`../../${module.name}`)(ndx);
|
223 | console.log(`${w(module.name)}\t${module.version}`);
|
224 | }
|
225 | ref = ['services', 'controllers'];
|
226 | for (m = 0, len3 = ref.length; m < len3; m++) {
|
227 | folder = ref[m];
|
228 | r = glob.sync(`server/${folder}/**/*.js`);
|
229 | r.reverse();
|
230 | for (n = 0, len4 = r.length; n < len4; n++) {
|
231 | module = r[n];
|
232 | //console.log "loading #{module}"
|
233 | require(`${process.cwd()}/${module}`)(ndx);
|
234 | }
|
235 | }
|
236 | }
|
237 | for (o = 0, len5 = uselist.length; o < len5; o++) {
|
238 | useCtrl = uselist[o];
|
239 | useCtrl(ndx);
|
240 | }
|
241 | for (p = 0, len6 = controllers.length; p < len6; p++) {
|
242 | ctrl = controllers[p];
|
243 | ctrl(ndx);
|
244 | }
|
245 | ndx.UNAUTHORIZED = {
|
246 | status: 401,
|
247 | message: 'Not authorized'
|
248 | };
|
249 | setImmediate(function() {
|
250 | return ndx.app.use(function(err, req, res, next) {
|
251 | var message;
|
252 | message = '';
|
253 | if (err.hasOwnProperty('message')) {
|
254 | message = err.message;
|
255 | } else {
|
256 | message = err.toString();
|
257 | }
|
258 | if (Object.prototype.toString.call(message === '[object Object]')) {
|
259 | return res.status(err.status || 500).json(message);
|
260 | } else {
|
261 | return res.status(err.status || 500).send(message);
|
262 | }
|
263 | });
|
264 | });
|
265 | /*
|
266 | process.on 'uncaughtException', (err) ->
|
267 | console.log 'uncaughtException'
|
268 | console.log err
|
269 | process.exit 1
|
270 | */
|
271 | ndx.server.listen(ndx.port, function() {
|
272 | console.log(chalk.yellow(`${ndx.logo}ndx server v${chalk.cyan.bold(ndx.version)} listening on ${chalk.cyan.bold(ndx.port)}`));
|
273 | return console.log(chalk.yellow(`started: ${new Date().toLocaleString()}`));
|
274 | });
|
275 | if (settings.SSL_PORT) {
|
276 | return ndx.sslserver.listen(ndx.ssl_port, function() {
|
277 | return console.log(chalk.yellow(`ndx ssl server v${chalk.cyan.bold(ndx.version)} listening on ${chalk.cyan.bold(ndx.ssl_port)}`));
|
278 | });
|
279 | }
|
280 | }
|
281 | }
|
282 | };
|
283 |
|
284 | if (global.gc) {
|
285 | setInterval(function() {
|
286 | return typeof global.gc === "function" ? global.gc() : void 0;
|
287 | }, 2 * 60 * 1000);
|
288 | }
|
289 |
|
290 | }).call(this);
|
291 |
|
292 | //# sourceMappingURL=index.js.map
|
293 |
|
\ | No newline at end of file |