UNPKG

2.33 kBJavaScriptView Raw
1const debug = require('./debug')('server');
2const http = require('http');
3
4let server;
5let port;
6
7/**
8 * Get port from nconf
9 */
10
11/**
12 * @description Create a Node HTTP server.
13 *
14 * @param {Express} app
15 * @return {Object}
16 */
17const start = function start(app) {
18 const config = require('./config')();
19 port = normalizePort(config.get('port'));
20 server = http.createServer(app);
21
22 /**
23 * Listen on provided port, on all network interfaces.
24 */
25
26 app.set('port', port);
27 server.listen(port);
28 server.on('error', onError);
29 server.on('listening', onListening);
30
31 return server;
32};
33
34/**
35 * @description Stop Node HTTP server.
36 * @param {Function} done
37 */
38const stop = function stop(done) {
39 try {
40 server.close(done);
41 } catch(e) {
42 /*jshint unused:false*/
43 }
44};
45
46/**
47 * Normalize a port into a number, string, or false.
48 */
49
50/**
51 * @description Normalize a port.
52 * @param {Number} val
53 * @return {Boolean|Number|String}
54 */
55function normalizePort(val) {
56 const port = parseInt(val, 10);
57
58 if (isNaN(port)) {
59 // CASE: Named pipe
60 return val;
61 }
62
63 if (port >= 0) {
64 // port number
65 return port;
66 }
67
68 return false;
69}
70
71/**
72 * Event listener for HTTP server "error" event.
73 */
74
75/**
76 * @description Event handler for HTTP server "error" event.
77 * @param {Error} error
78 */
79function onError(error) {
80 if (error.syscall !== 'listen') {
81 throw error;
82 }
83
84 const bind = typeof port === 'string'
85 ? `Pipe ${port}`
86 : `Port ${port}`;
87
88 // handle specific listen errors with friendly messages
89 switch (error.code) {
90 case 'EACCES':
91 console.error(`${bind} requires elevated privileges`);
92 process.exit(1);
93 break;
94 case 'EADDRINUSE':
95 console.error(`${bind} is already in use`);
96 process.exit(1);
97 break;
98 default:
99 throw error;
100 }
101}
102
103/**
104 * @description Event handler for HTTP server "listening" event.
105 */
106function onListening() {
107 const addr = server.address();
108 const bind = typeof addr === 'string'
109 ? 'pipe ' + addr
110 : 'port ' + addr.port;
111 debug('Server ready');
112 console.log(`Listening on ${bind} \n`);
113}
114
115
116module.exports.start = start;
117module.exports.stop = stop;