UNPKG

9.95 kBJavaScriptView Raw
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