Client: little app module cleanup
[oweals/peertube.git] / server.js
1 'use strict'
2
3 // ----------- Node modules -----------
4 const bodyParser = require('body-parser')
5 const express = require('express')
6 const expressValidator = require('express-validator')
7 const http = require('http')
8 const morgan = require('morgan')
9 const path = require('path')
10 const TrackerServer = require('bittorrent-tracker').Server
11 const WebSocketServer = require('ws').Server
12
13 // Create our main app
14 const app = express()
15
16 // ----------- Database -----------
17 const config = require('config')
18 const constants = require('./server/initializers/constants')
19 const database = require('./server/initializers/database')
20 const logger = require('./server/helpers/logger')
21
22 database.connect()
23
24 // ----------- Checker -----------
25 const checker = require('./server/initializers/checker')
26
27 const miss = checker.checkConfig()
28 if (miss.length !== 0) {
29   throw new Error('Miss some configurations keys : ' + miss)
30 }
31
32 // ----------- PeerTube modules -----------
33 const customValidators = require('./server/helpers/custom-validators')
34 const installer = require('./server/initializers/installer')
35 const mongoose = require('mongoose')
36 const routes = require('./server/controllers')
37 const utils = require('./server/helpers/utils')
38 const webtorrent = require('./server/lib/webtorrent')
39 const Request = mongoose.model('Request')
40 const Video = mongoose.model('Video')
41
42 // Get configurations
43 const port = config.get('listen.port')
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({ limit: '500kb' }))
53 app.use(bodyParser.urlencoded({ extended: false }))
54 // Validate some params for the API
55 app.use(expressValidator({
56   customValidators: Object.assign(
57     {},
58     customValidators.misc,
59     customValidators.pods,
60     customValidators.users,
61     customValidators.videos
62   )
63 }))
64
65 // ----------- Views, routes and static files -----------
66
67 // Catch sefaults
68 require('segfault-handler').registerHandler()
69
70 // API routes
71 const apiRoute = '/api/' + constants.API_VERSION
72 app.use(apiRoute, routes.api)
73
74 // Static files
75 app.use('/client', express.static(path.join(__dirname, '/client/dist'), { maxAge: 0 }))
76 // 404 for static files not found
77 app.use('/client/*', function (req, res, next) {
78   res.sendStatus(404)
79 })
80
81 // Thumbnails path for express
82 const thumbnailsPhysicalPath = path.join(__dirname, config.get('storage.thumbnails'))
83 app.use(constants.THUMBNAILS_STATIC_PATH, express.static(thumbnailsPhysicalPath, { maxAge: 0 }))
84
85 // Client application
86 app.use('/*', function (req, res, next) {
87   res.sendFile(path.join(__dirname, 'client/dist/index.html'))
88 })
89
90 // ----------- Tracker -----------
91
92 const trackerServer = new TrackerServer({
93   http: false,
94   udp: false,
95   ws: false,
96   dht: false
97 })
98
99 trackerServer.on('error', function (err) {
100   logger.error(err)
101 })
102
103 trackerServer.on('warning', function (err) {
104   logger.error(err)
105 })
106
107 const server = http.createServer(app)
108 const wss = new WebSocketServer({server: server, path: '/tracker/socket'})
109 wss.on('connection', function (ws) {
110   trackerServer.onWebSocketConnection(ws)
111 })
112
113 // ----------- Errors -----------
114
115 // Catch 404 and forward to error handler
116 app.use(function (req, res, next) {
117   const err = new Error('Not Found')
118   err.status = 404
119   next(err)
120 })
121
122 app.use(function (err, req, res, next) {
123   logger.error(err)
124   res.sendStatus(err.status || 500)
125 })
126
127 installer.installApplication(function (err) {
128   if (err) throw err
129
130   // Create/activate the webtorrent module
131   webtorrent.create(function () {
132     function cleanForExit () {
133       utils.cleanForExit(webtorrent.app)
134     }
135
136     function exitGracefullyOnSignal () {
137       process.exit(-1)
138     }
139
140     process.on('exit', cleanForExit)
141     process.on('SIGINT', exitGracefullyOnSignal)
142     process.on('SIGTERM', exitGracefullyOnSignal)
143
144     // ----------- Make the server listening -----------
145     server.listen(port, function () {
146       // Activate the pool requests
147       Request.activate()
148
149       Video.seedAllExisting(function (err) {
150         if (err) throw err
151
152         logger.info('Seeded all the videos')
153         logger.info('Server listening on port %d', port)
154         app.emit('ready')
155       })
156     })
157   })
158 })
159
160 module.exports = app