]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server.js
add robustness when we run the electron process and move the exit
[github/Chocobozzz/PeerTube.git] / server.js
1 ;(function () {
2 'use strict'
3
4 // ----------- Node modules -----------
5 var express = require('express')
6 var path = require('path')
7 var morgan = require('morgan')
8 var bodyParser = require('body-parser')
9 var multer = require('multer')
10 var TrackerServer = require('bittorrent-tracker').Server
11 var WebSocketServer = require('ws').Server
12 var app = express()
13 var http = require('http')
14
15 // ----------- Checker -----------
16 var checker = require('./src/checker')
17
18 var miss = checker.checkConfig()
19 if (miss.length !== 0) {
20 // Do not use logger module
21 console.error('Miss some configurations keys.', { miss: miss })
22 process.exit(0)
23 }
24
25 checker.createDirectories()
26
27 // ----------- PeerTube modules -----------
28 var config = require('config')
29 var logger = require('./src/logger')
30 var routes = require('./routes')
31 var api = require('./routes/api')
32 var utils = require('./src/utils')
33 var videos = require('./src/videos')
34 var webtorrent = require('./src/webTorrentNode')
35
36 var compression
37 var port = config.get('listen.port')
38 var uploads = config.get('storage.uploads')
39
40 // ----------- Command line -----------
41
42 // ----------- App -----------
43 app.use(morgan('combined', { stream: logger.stream }))
44 app.use(bodyParser.json())
45 app.use(multer({ dest: uploads }))
46 app.use(bodyParser.urlencoded({ extended: false }))
47
48 // ----------- Views, routes and static files -----------
49
50 if (process.env.NODE_ENV === 'production') {
51 // logger.log('Production : static files in dist/\n')
52
53 // GZip compression
54 compression = require('compression')
55 app.use(compression())
56
57 // A month
58 var maxAge = 86400000 * 30
59
60 // TODO
61 app.get(/^\/(index|(partials\/[a-z\/]+))?$/, function (req, res, next) {
62 if (req.url === '/') {
63 req.url = '/index'
64 }
65
66 req.url += '.html'
67 next()
68 })
69
70 app.use(express.static(path.join(__dirname, '/dist/public'), { maxAge: maxAge }))
71 app.use(express.static(path.join(__dirname, '/dist/views'), { maxAge: maxAge }))
72 } else {
73 // Livereload
74 app.use(require('connect-livereload')({
75 port: 35729
76 }))
77
78 require('segfault-handler').registerHandler()
79
80 app.use(express.static(path.join(__dirname, '/public'), { maxAge: 0 }))
81
82 // Jade template from ./views directory
83 app.set('views', path.join(__dirname, '/views'))
84 app.set('view engine', 'jade')
85
86 // Views routes
87 app.use('/', routes)
88 }
89
90 // ----------- Routes -----------
91 app.use('/api/videos', api.videos)
92 app.use('/api/remotevideos', api.remoteVideos)
93 app.use('/api/pods', api.pods)
94
95 // ----------- Tracker -----------
96
97 var trackerServer = new TrackerServer({
98 http: false,
99 udp: false,
100 ws: false,
101 dht: false
102 })
103
104 trackerServer.on('error', function (err) {
105 logger.error(err)
106 })
107
108 trackerServer.on('warning', function (err) {
109 logger.error(err)
110 })
111
112 var server = http.createServer(app)
113 var wss = new WebSocketServer({server: server, path: '/tracker/socket'})
114 wss.on('connection', function (ws) {
115 trackerServer.onWebSocketConnection(ws)
116 })
117
118 // ----------- Errors -----------
119
120 // Catch 404 and forward to error handler
121 app.use(function (req, res, next) {
122 var err = new Error('Not Found')
123 err.status = 404
124 next(err)
125 })
126
127 // Prod : no stacktraces leaked to user
128 if (process.env.NODE_ENV === 'production') {
129 app.use(function (err, req, res, next) {
130 logger.error('Error : ' + err.message, { error: err })
131 res.status(err.status || 500)
132 res.render('error', {
133 message: err.message,
134 error: {}
135 })
136 })
137 } else {
138 app.use(function (err, req, res, next) {
139 logger.error('Error : ' + err.message, { error: err })
140 res.status(err.status || 500)
141 res.render('error', {
142 message: err.message,
143 error: err
144 })
145 })
146 }
147
148 // ----------- Create the certificates if they don't already exist -----------
149 utils.createCertsIfNotExist(function (err) {
150 if (err) throw err
151 // Create/activate the webtorrent module
152 webtorrent.create(function () {
153 function cleanForExit () {
154 utils.cleanForExit(webtorrent.app)
155 }
156
157 function exitGracefullyOnSignal () {
158 process.exit()
159 }
160
161 process.on('exit', cleanForExit)
162 process.on('SIGINT', exitGracefullyOnSignal)
163 process.on('SIGTERM', exitGracefullyOnSignal)
164
165 // ----------- Make the server listening -----------
166 server.listen(port, function () {
167 videos.seedAll(function () {
168 logger.info('Seeded all the videos')
169 logger.info('Server listening on port %d', port)
170 app.emit('ready')
171 })
172 })
173 })
174 })
175
176 module.exports = app
177 })()