UNPKG

3.81 kBJavaScriptView Raw
1/*
2 * pub server.js
3 *
4 * launches (express) server after resolving opts
5 * invoke directly via node command line, or via require()
6 * see: https://nodejs.org/api/modules.html#modules_accessing_the_main_module
7 *
8 * copyright 2015-2019, Jurgen Leschner - github.com/jldec - MIT license
9 */
10
11var debug = require('debug')('pub:server');
12
13var events = require('events');
14var path = require('path');
15var u = require('pub-util');
16
17if (require.main === module) {
18 pubServer().run();
19}
20else {
21 module.exports = pubServer;
22}
23
24u.inherits(pubServer, events.EventEmitter);
25
26//--//--//--//--//--//--//--//--//--//--//--//--//
27
28function pubServer(opts) {
29
30 if (!(this instanceof pubServer)) return new pubServer(opts);
31 events.EventEmitter.call(this);
32
33 var server = this;
34
35 // pass platform-specific ./node_modules path to resolve-opts for builtin packages
36 server.opts = opts = require('pub-resolve-opts')(opts, path.join(__dirname, 'node_modules'));
37
38 opts.production = opts.production || (process.env.NODE_ENV === 'production');
39 opts.port = opts.port || process.env.PORT || '3001';
40 opts.appUrl = opts.appUrl || process.env.APP || ('http://localhost:' + opts.port);
41
42 server.run = run;
43
44 var generator = server.generator = require('pub-generator')(opts);
45
46 u.each(opts.serverPlugins.reverse(), function(plugin) {
47 debug('server plugin:', plugin.inspect());
48 require(plugin.path)(server);
49 });
50
51 u.each(opts.generatorPlugins.reverse(), function(plugin) {
52 debug('generator plugin:', plugin.path, plugin.inspect());
53 require(plugin.path)(generator);
54 });
55
56 var log = opts.log;
57
58 //--//--//--//--//--//--//--//--//--//--//--//
59
60 function run() {
61 generator.load(function(err) {
62 if (err) return log(err);
63
64 if (opts.outputOnly) {
65 generator.outputPages(function(err, result) {
66 if (err) { log(err); }
67 log('output %s generated pages', u.flatten(result).length);
68 });
69
70 var statics = require('./server/serve-statics')(opts, function(){
71 statics.outputAll();
72 });
73 require('./server/serve-scripts')(opts).outputAll(generator);
74 generator.unload();
75 return;
76 }
77
78 if (opts.logPages) {
79 generator.logPages();
80 generator.unload();
81 return;
82 }
83
84 require('./server/watch-sources')(generator);
85 generator.listen(true);
86
87 if (!opts['no-server']) { expressApp(); }
88 });
89 }
90
91 function expressApp() {
92
93 server.app = require('express')();
94 server.http = require('http').Server(server.app);
95 require('./server/serve-sockets')(server);
96
97 server.app.disable('x-powered-by');
98
99 // log(err) shouldn't throw anymore
100 log.logger.noErrors = true;
101
102 // sessions come with optional redis logger
103 server.sessions = require('pub-serve-sessions')(server);
104 log('starting up', opts.appUrl);
105
106 // other default middleware
107 var bodyParser = require('body-parser');
108 server.app.use(bodyParser.json());
109 server.app.use(bodyParser.urlencoded({ extended: false }));
110 server.app.use(require('compression')());
111
112 server.emit('init-app-first');
113 server.sessions.authorizeRoutes();
114
115 if (!opts.staticOnly) {
116 require('./server/serve-pages')(server);
117 server.scripts = require('./server/serve-scripts')(opts).serveRoutes(server);
118 }
119 server.statics = require('./server/serve-statics')(opts).serveRoutes(server);
120
121 server.emit('init-app-last');
122
123 require('./server/handle-errors')(server);
124
125 server.http.listen(opts.port);
126 log('listening on port', opts.port);
127
128 process.on('SIGTERM', function() {
129 log('shutting down');
130 server.http.close(function() {
131 generator.unload();
132 server.emit('shutdown');
133 process.exit();
134 });
135 });
136
137 }
138
139}