-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcluster-main.js
141 lines (117 loc) · 4.26 KB
/
cluster-main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
'use strict';
const cluster_port = 43003;
var cluster = require('cluster');
var cpus = require('os').cpus().length;
cluster.setMaxListeners(0);
var http = require('http');
var path = require('path');
if (cluster.isMaster) {
for (var i = 0; i < cpus; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log('exwd-api-v2 worker %d died (%s). restarting...',
worker.process.pid, signal || code);
cluster.fork();
});
} else {
var express = require('express');
var bodyParser = require('body-parser');
var compression = require('compression');
var helmet = require('helmet');
var morgan = require('morgan');
var sequelize_sync = require(path.resolve(__dirname, './libs/sync'));
var env = require(path.resolve(__dirname, './libs/env'));
var server = express();
var serverContainer;
var routers = {
authenticate: require(path.resolve(__dirname, './routers/authenticate')),
chatroom: require(path.resolve(__dirname, './routers/chatroom')),
comment: require(path.resolve(__dirname, './routers/comment')),
exchange: require(path.resolve(__dirname, './routers/exchange')),
follow: require(path.resolve(__dirname, './routers/follow')),
message: require(path.resolve(__dirname, './routers/message')),
notification: require(path.resolve(__dirname, './routers/notification')),
queue: require(path.resolve(__dirname, './routers/queue')),
star: require(path.resolve(__dirname, './routers/star'))
};
sequelize_sync
.then(() => {
console.log('DB all synced ...');
console.log('Igniting API server ...');
})
.then(() => {
// Protect server from some well-known web vulnerabilities
server.use(helmet());
// Compress req before all middlewares
server.use(compression());
// Log all requests to the console
server.use(morgan(env.NODE_ENV === 'production' ? 'short' : 'dev'));
// Setting for bodyparser
var bodyParserSetting = {
limit: '64mb',
extended: true
};
// For parsing application/json
server.post('*', bodyParser.json(bodyParserSetting));
server.put('*', bodyParser.json(bodyParserSetting));
server.options('*', bodyParser.json(bodyParserSetting));
// For parsing application/x-www-form-urlencoded
server.post('*', bodyParser.urlencoded(bodyParserSetting));
server.put('*', bodyParser.urlencoded(bodyParserSetting));
server.options('*', bodyParser.urlencoded(bodyParserSetting));
server.all('*', (req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
/* Token authentications:
* If the path is not /api/authenticate, then it needs authentication
* If fail, return {"authentication": "fail"}
* If success, and then go next()
*/
server.all(/\/api\/(?!authenticate).+/, routers.authenticate.token, (req, res, next) => {
next();
});
server.use('/api/chatroom', routers.chatroom);
server.use('/api/comment', routers.comment);
server.use('/api/exchange', routers.exchange);
server.use('/api/follow', routers.follow);
server.use('/api/message', routers.message);
server.use('/api/notification', routers.notification);
server.use('/api/queue', routers.queue);
server.use('/api/star', routers.star);
// catch 404 and forward to error handler
server.use((req, res, next) => {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// 500 error handlers
// Development error handler: print stacktrace
server.use((err, req, res, next) => {
res.status(err.status || 500);
err.statusCode = 500;
if (env.NODE_ENV !== 'production' && req.xhr) {
res.send(err);
} else if (req.xhr) {
res.send(err.message);
}
next(err);
});
// Then start webserver if not already running
serverContainer = http.createServer(server);
serverContainer.on('error', err => {
if (err.code === 'EADDRINUSE') {
console.log('Development server is already started at port ' + cluster_port);
} else {
throw err;
}
});
serverContainer.listen(cluster_port);
server.setMaxListeners(0);
serverContainer.setMaxListeners(0);
process.setMaxListeners(0);
});
}