UNPKG

3.56 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: http://nodejs.org/api/modules.html#modules_accessing_the_main_module
7 *
8 * copyright 2015, 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 server.opts = opts = require('pub-resolve-opts')(opts, path.join(__dirname, 'node_modules'));
36
37 opts.production = opts.production || (process.env.NODE_ENV === 'production');
38 opts.port = opts.port || process.env.PORT || '3001';
39 opts.appUrl = opts.appUrl || process.env.APP || ('http://localhost:' + opts.port);
40
41 server.run = run;
42
43 var generator = server.generator = require('pub-generator')(opts);
44
45 u.each(opts.serverPlugins.reverse(), function(plugin) {
46 debug('server plugin:', plugin.inspect());
47 require(plugin.path)(server);
48 });
49
50 u.each(opts.generatorPlugins.reverse(), function(plugin) {
51 debug('generator plugin:', plugin.path, plugin.inspect());
52 require(plugin.path)(generator);
53 });
54
55 var log = opts.log;
56
57 //--//--//--//--//--//--//--//--//--//--//--//
58
59 function run() {
60
61 generator.load(function(err) {
62 if (err) return log(err);
63
64 if (opts.outputOnly) {
65 generator.outputPages();
66
67 var statics = require('./server/serve-statics')(opts, function(){
68 statics.outputAll();
69 });
70 require('./server/serve-scripts')(opts).outputAll(generator);
71 generator.unload();
72 return;
73 }
74
75 if (opts.logPages) {
76 generator.logPages();
77 generator.unload();
78 return;
79 }
80
81 require('./server/watch-sources')(generator);
82 generator.listen(true);
83
84 if (!opts['no-server']) { expressApp(); }
85 });
86 }
87
88 function expressApp() {
89
90 server.app = require('express')();
91 server.http = require('http').Server(server.app);
92 require('./server/serve-sockets')(server);
93
94 server.app.disable('x-powered-by');
95
96 // log(err) shouldn't throw anymore
97 log.logger.noErrors = true;
98
99 // sessions come with optional redis logger
100 server.sessions = require('pub-serve-sessions')(server);
101 log('starting up', opts.appUrl);
102
103 // other default middleware
104 var bodyParser = require('body-parser');
105 server.app.use(bodyParser.json());
106 server.app.use(bodyParser.urlencoded({ extended: false }));
107 server.app.use(require('compression')());
108
109 server.emit('init-app-first');
110 server.sessions.authorizeRoutes();
111
112 if (!opts.staticOnly) {
113 require('./server/serve-pages')(server);
114 server.scripts = require('./server/serve-scripts')(opts).serveRoutes(server);
115 }
116 server.statics = require('./server/serve-statics')(opts).serveRoutes(server);
117
118 server.emit('init-app-last');
119
120 require('./server/handle-errors')(server);
121
122 server.http.listen(opts.port);
123 log('listening on port', opts.port);
124
125 process.on('SIGTERM', function() {
126 log('shutting down');
127 server.http.close(function() {
128 server.emit('shutdown');
129 process.exit();
130 });
131 });
132
133 }
134
135}