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