FunnelEnvy/optimizely-cli

View on GitHub
lib/commands/host.js

Summary

Maintainability
A
3 hrs
Test Coverage
/**
 * Module dependencies
 */
var express = require("express");
var path = require('path');
var fs = require('fs');
var open = require('open');
var logger = require('../logger');

var LocalController = require('../server/controller');
var Variation = require('../variation');

var getSSLCredentials = function() {
  var originalPath = path.join(
    path.dirname(fs.realpathSync(__filename)),
    '../../');
  var credentials = {
    key: fs.readFileSync(originalPath + "ssl/server.key", 'utf8'),
    cert: fs.readFileSync(originalPath + "ssl/server.crt", 'utf8')
  };
  return credentials;
};

var handleStartupError = function(error){
  if(error.errno === 'EADDRINUSE') {
    logger.log('error', 'Port already in use. Kill the other process or use another port.');
  } else {
    logger.log("error", error.message);
  }
};


module.exports = function(varPath, port, program) {
  //Start Server
  var app = express();
  var localController;

  app.set('view engine', 'ejs');

  //configure the controller
  varPath = path.resolve(process.cwd(), varPath);
  var variation = new Variation({}, varPath);
  variation.loadFromFile();

  if (!variation) {
    return logger.log("error", "No variation at path: \"" + varPath +
      "\" found");
  }

  //local controller for the requests
  try {
    localController = new LocalController(variation, port);
  } catch(error) {
    logger.log("error", error.message);
    return;
  }

  //set the routes
  app.get("/", localController.installUserScript.bind(localController)); 
  app.get("/install.user.js", localController.userScript.bind(localController));
  app.get("/variation.js", localController.variationJS.bind(localController));
  app.get("/variation.css", localController.variationCSS.bind(localController));

  //start the server
  var onStartup = function(){
    if(!program.silence){
      console.log("Serving variation " + varPath + " at port " + localController.port);
      console.log("point your browser to http" + (program.ssl ? "s" : "") + "://localhost:" + localController.port);
      console.log("Ctrl-c to quit");
    }
    if(program.open){
      open("http" + (program.ssl ? "s" : "") + "://localhost:" + localController.port);
    }
  };

  if (program.ssl) {
     return require('https').createServer(getSSLCredentials(), app)
       .listen(localController.port, onStartup)
       .on('error', handleStartupError);
  } else {
    return app
      .listen(localController.port, onStartup)
      .on('error', handleStartupError);
  }
};