Skip to content
Snippets Groups Projects
server.js 4.45 KiB
Newer Older
Chocobozzz's avatar
Chocobozzz committed
;(function () {
  'use strict'

  // ----------- Node modules -----------
Chocobozzz's avatar
Chocobozzz committed
  var bodyParser = require('body-parser')
Chocobozzz's avatar
Chocobozzz committed
  var express = require('express')
  var expressValidator = require('express-validator')
Chocobozzz's avatar
Chocobozzz committed
  var http = require('http')
Chocobozzz's avatar
Chocobozzz committed
  var morgan = require('morgan')
Chocobozzz's avatar
Chocobozzz committed
  var path = require('path')
Chocobozzz's avatar
Chocobozzz committed
  var TrackerServer = require('bittorrent-tracker').Server
  var WebSocketServer = require('ws').Server
Chocobozzz's avatar
Chocobozzz committed

  // Create our main app
Chocobozzz's avatar
Chocobozzz committed
  var app = express()

  // ----------- Checker -----------
Chocobozzz's avatar
Chocobozzz committed
  var checker = require('./initializers/checker')
Chocobozzz's avatar
Chocobozzz committed

  var miss = checker.checkConfig()
  if (miss.length !== 0) {
    // Do not use logger module
    console.error('Miss some configurations keys.', { miss: miss })
    process.exit(0)
  }

Chocobozzz's avatar
Chocobozzz committed
  checker.createDirectoriesIfNotExist()
Chocobozzz's avatar
Chocobozzz committed

  // ----------- PeerTube modules -----------
Chocobozzz's avatar
Chocobozzz committed
  var config = require('config')
Chocobozzz's avatar
Chocobozzz committed
  var constants = require('./initializers/constants')
  var customValidators = require('./helpers/customValidators')
Chocobozzz's avatar
Chocobozzz committed
  var database = require('./initializers/database')
Chocobozzz's avatar
Chocobozzz committed
  var logger = require('./helpers/logger')
Chocobozzz's avatar
Chocobozzz committed
  var peertubeCrypto = require('./helpers/peertubeCrypto')
Chocobozzz's avatar
Chocobozzz committed
  var poolRequests = require('./lib/poolRequests')
  var routes = require('./controllers')
  var utils = require('./helpers/utils')
Chocobozzz's avatar
Chocobozzz committed
  var videos = require('./lib/videos')
  var webtorrent = require('./lib/webtorrent')
Chocobozzz's avatar
Chocobozzz committed

Chocobozzz's avatar
Chocobozzz committed
  // Get configurations
Chocobozzz's avatar
Chocobozzz committed
  var port = config.get('listen.port')

Chocobozzz's avatar
Chocobozzz committed
  // ----------- Database -----------
  database.connect()

Chocobozzz's avatar
Chocobozzz committed
  // ----------- Command line -----------

  // ----------- App -----------
Chocobozzz's avatar
Chocobozzz committed

  // For the logger
Chocobozzz's avatar
Chocobozzz committed
  app.use(morgan('combined', { stream: logger.stream }))
Chocobozzz's avatar
Chocobozzz committed
  // For body requests
Chocobozzz's avatar
Chocobozzz committed
  app.use(bodyParser.json())
  app.use(bodyParser.urlencoded({ extended: false }))
Chocobozzz's avatar
Chocobozzz committed
  // Validate some params for the API
  app.use(expressValidator({
    customValidators: customValidators
  }))
Chocobozzz's avatar
Chocobozzz committed

  // ----------- Views, routes and static files -----------

Chocobozzz's avatar
Chocobozzz committed
  // Livereload
  app.use(require('connect-livereload')({
    port: 35729
  }))
Chocobozzz's avatar
Chocobozzz committed

Chocobozzz's avatar
Chocobozzz committed
  // Catch sefaults
Chocobozzz's avatar
Chocobozzz committed
  require('segfault-handler').registerHandler()
Chocobozzz's avatar
Chocobozzz committed

Chocobozzz's avatar
Chocobozzz committed
  // Static files
Chocobozzz's avatar
Chocobozzz committed
  app.use(express.static(path.join(__dirname, '/public'), { maxAge: 0 }))
Chocobozzz's avatar
Chocobozzz committed

Chocobozzz's avatar
Chocobozzz committed
  // Jade template from ./views directory
  app.set('views', path.join(__dirname, '/views'))
  app.set('view engine', 'jade')
Chocobozzz's avatar
Chocobozzz committed

Chocobozzz's avatar
Chocobozzz committed
  // API routes
  var api_route = '/api/' + constants.API_VERSION
Chocobozzz's avatar
Chocobozzz committed
  app.use(api_route, routes.api)

  // Views routes
  app.use('/', routes.views)
Chocobozzz's avatar
Chocobozzz committed

  // ----------- Tracker -----------

  var trackerServer = new TrackerServer({
    http: false,
    udp: false,
    ws: false,
    dht: false
  })

  trackerServer.on('error', function (err) {
    logger.error(err)
  })

  trackerServer.on('warning', function (err) {
    logger.error(err)
  })

  var server = http.createServer(app)
  var wss = new WebSocketServer({server: server, path: '/tracker/socket'})
  wss.on('connection', function (ws) {
    trackerServer.onWebSocketConnection(ws)
  })

  // ----------- Errors -----------

  // Catch 404 and forward to error handler
  app.use(function (req, res, next) {
    var err = new Error('Not Found')
    err.status = 404
    next(err)
  })

  // Prod : no stacktraces leaked to user
  if (process.env.NODE_ENV === 'production') {
    app.use(function (err, req, res, next) {
Chocobozzz's avatar
Chocobozzz committed
      logger.error(err)
Chocobozzz's avatar
Chocobozzz committed
      res.status(err.status || 500)
      res.render('error', {
        message: err.message,
        error: {}
      })
    })
  } else {
    app.use(function (err, req, res, next) {
Chocobozzz's avatar
Chocobozzz committed
      logger.error(err)
Chocobozzz's avatar
Chocobozzz committed
      res.status(err.status || 500)
      res.render('error', {
        message: err.message,
        error: err
      })
    })
  }

  // ----------- Create the certificates if they don't already exist -----------
Chocobozzz's avatar
Chocobozzz committed
  peertubeCrypto.createCertsIfNotExist(function (err) {
Chocobozzz's avatar
Chocobozzz committed
    if (err) throw err
    // Create/activate the webtorrent module
    webtorrent.create(function () {
      function cleanForExit () {
        utils.cleanForExit(webtorrent.app)
      }

      function exitGracefullyOnSignal () {
        process.exit()
      }

      process.on('exit', cleanForExit)
      process.on('SIGINT', exitGracefullyOnSignal)
      process.on('SIGTERM', exitGracefullyOnSignal)

Chocobozzz's avatar
Chocobozzz committed
      // ----------- Make the server listening -----------
      server.listen(port, function () {
        // Activate the pool requests
        poolRequests.activate()

Chocobozzz's avatar
Chocobozzz committed
        videos.seedAllExisting(function () {
Chocobozzz's avatar
Chocobozzz committed
          logger.info('Seeded all the videos')
          logger.info('Server listening on port %d', port)
          app.emit('ready')
        })
      })
    })
  })

  module.exports = app
})()