const path = require("path");
const throng = require("throng");

const createServer = require("./modules/createServer");
const createDevServer = require("./modules/createDevServer");
const serverConfig = require("./modules/serverConfig");

require("./modules/clientRuntime");

function startServer(id) {
  const server =
    process.env.NODE_ENV === "production"
      ? createServer(
          path.resolve(__dirname, "public"),
          path.resolve(__dirname, "stats.json")
        )
      : createDevServer(
          path.resolve(__dirname, "public"),
          require("./webpack.config"),
          serverConfig.origin
        );

  server.listen(serverConfig.port, () => {
    console.log(
      "Server #%s listening on port %s, Ctrl+C to stop",
      id,
      serverConfig.port
    );
  });
}

throng({
  workers: process.env.WEB_CONCURRENCY || 1,
  start: startServer,
  lifetime: Infinity,

  // In production, increase throng's default grace period to allow
  // servers that are still handling requests to finish. Heroku shuts
  // down processes forcefully after 30 seconds, so exit before that
  // happens to avoid an exit timeout.
  // https://devcenter.heroku.com/articles/dynos#shutdown
  grace: process.env.NODE_ENV === "production" ? 25000 : 5000
});