/
index.js
124 lines (104 loc) · 3.55 KB
/
index.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
const http = require('http');
const path = require('path');
const cors = require('cors');
const helmet = require('helmet');
const express = require('express');
const bodyParser = require('body-parser');
const compression = require('compression');
// connect module configurations
const localConfig = require('./config.json');
// create application instance
const app = express();
const server = http.createServer(app);
// configure default options
const corsOptions = {};
// const toobusy = require('toobusy-js');
// toobusy.maxLag(100);
// toobusy.interval(500);
module.exports = ({ ACTIONS, ROUTER, show }) => {
/**
******************
* Access headers *
******************
* @param {Object} localConfig - config for express application
* @param {Object} origin - access to server from external resources
* @param {Object} headers - http headers ex: [content-type, auth]
* @param {Object} methods - RESTfull methods ex: [get. post...]
*/
ACTIONS.on('api.access.headers', () => {
// ToDo: Nginx configuration for access headers!
const { origin, headers, methods} = localConfig;
corsOptions.origin = origin;
corsOptions.allowedHeaders = headers;
corsOptions.methods = methods;
});
/**
********************************
* Configure additional plugins *
********************************
*/
ACTIONS.on('api.configure', () => {
// get local server directory path
const serverPath = path.dirname(require.main.filename);
// ToDo: Nginx configuration for limit connections!
app.use(helmet());
app.use(cors(corsOptions));
app.use(compression());
app.use(bodyParser.json({ limit: '10mb' }));
app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }));
app.use(express.static(path.join(serverPath, '../public')));
// set static path
app.get('/', (req, res) => {
res.sendFile(path.join(serverPath, '../public'));
});
});
/**
*************************
* Configure middlewares *
*************************
*/
ACTIONS.on('api.middlewares', () => {
const allMiddlewares = ROUTER.get('middlewares');
for (let _mw in allMiddlewares) {
app.use(allMiddlewares[_mw]);
}
});
/**
**********************************
* Connect api routing to modules *
**********************************
*/
ACTIONS.on('api.routes', () => {
const allRoutes = ROUTER.get('routes');
const allMiddlewares = ROUTER.get('middlewares', 'routes');
for (let _route in allRoutes) {
const route = allRoutes[_route];
const mw = (route.middlewares || [])
.map((mwName) => allMiddlewares[mwName]);
app[route.method](`/${route.path}`, mw, (req, res, next) => {
const { headers, query, body, params, auth } = req;
const props = { headers, query, body, params, auth };
ACTIONS.send(_route.replace('_', '.'), props)
.then((data) => res.send(data))
.catch((error) => res.send(error));
});
}
});
/**
*********************************
* Create server and listen port *
*********************************
*/
ACTIONS.on('api.create.server', () => {
const port = process.env.PORT || localConfig.port || 8080;
server.listen(port, '0.0.0.0', () =>
show.log(`API running at :${port} port`));
return Promise.resolve();
});
/**
************************************************************
* Stop and clear hardly accessible events, ex: listen port *
************************************************************
*/
ACTIONS.on('clear.api', () => server.close());
};