app/server.js

/**
 * Initiate app server
 * @module
 */

require('dotenvs')();
var app = require('app');
var debug = require('app/lib/debug')('syncServer:server');
var fs = require('fs');
var https = require('https');
var logger = require('app/lib/logger');
var passportSocketIO = require('app/lib/passportSocketIO');
var path = require('path');
var socketEvents = require('app/socketEvents');
var socketIO = require('socket.io');

var caPath = path.resolve(process.env.SYNC_SERVER_CERTS_DIR, 'ca');
var certPath = path.resolve(process.env.SYNC_SERVER_CERTS_DIR, 'crt');
var keyPath = path.resolve(process.env.SYNC_SERVER_CERTS_DIR, 'key');

if (!fs.existsSync(caPath)) {
  throw new Error('App server failed to find SSL intermediate CA certificate file');
}

if (!fs.existsSync(certPath)) {
  throw new Error('App server failed to find SSL certificate file');
}

if (!fs.existsSync(keyPath)) {
  throw new Error('App server failed to find SSL key file');
}

var server = https.createServer({ 
  ca: fs.readFileSync(caPath, 'utf8'),
  cert: fs.readFileSync(certPath, 'utf8'),
  key: fs.readFileSync(keyPath, 'utf8')
}, app).listen(app.port, function() {
  logger.info('App server started listening for HTTPS requests', { port: app.port });
});

server.io = socketIO(server);

server.io.on('connection', function(socket) {
  debug('opened socket.io connection');

  var listeners = socketEvents(server, socket);

  debug('listeners count: %s', Object.keys(listeners).length);

  socket.on('disconnect', function() {
    debug('closed socket.io connection');

    Object.keys(listeners).forEach(function(key) {
      app.removeListener(key, listeners[key]);
    });
  });
});

server.io.use(passportSocketIO);

logger.info('App server started listening for WebSocket connections');