Files
talk/src/index.ts
T
Kiwi 6da97c57d7 [CORL-314] Rename to Coral (#2318)
* chore: rename talk to coral

* fix: lint and unit tests

* fix: snapshot
2019-05-22 21:32:24 +02:00

112 lines
3.0 KiB
TypeScript

import dotenv from "dotenv";
import { rewrite } from "env-rewrite";
import sourceMapSupport from "source-map-support";
// Configure the source map support so stack traces will reference the source
// files rather than the transpiled code.
sourceMapSupport.install({
environment: "node",
});
// Ensure that we always process the rewrites silently, otherwise it may fail in
// environments like Heroku.
process.env.REWRITE_ENV_SILENT = "TRUE";
// Perform rewrites to the runtime environment variables based on the contents
// of the process.env.REWRITE_ENV if it exists. This is done here as it is the
// entrypoint for the entire applications configuration.
rewrite();
// Apply all the configuration provided in the .env file if it isn't already in
// the environment.
dotenv.config();
// Makes the script crash on unhandled rejections instead of silently
// ignoring them. In the future, promise rejections that are not handled will
// terminate the Node.js process with a non-zero exit code.
process.on("unhandledRejection", err => {
throw err;
});
import express from "express";
import throng from "throng";
import createCoral from "./core";
import Server from "./core/server";
import logger from "./core/server/logger";
// Create the app that will serve as the mounting point for the Coral Server.
const parent = express();
// worker will start the worker process.
async function worker(server: Server) {
try {
// Start the server.
await server.start({ parent });
logger.debug("started server worker");
} catch (err) {
logger.error({ err }, "can not start server in worker mode");
throw err;
}
}
// master will start the master process.
async function master(server: Server) {
const workerCount = server.config.get("concurrency");
logger.debug({ workerCount }, "spawning workers to handle traffic");
try {
// Process jobs.
await server.process();
logger.debug("started server master");
} catch (err) {
logger.error({ err }, "can not start server in master mode");
throw err;
}
}
// bootstrap will create a new Coral server, and start it up.
async function bootstrap() {
try {
logger.debug("starting bootstrap");
// Create the server instance.
const server = createCoral();
// Determine the number of workers.
const workerCount = server.config.get("concurrency");
// Connect the server to databases.
await server.connect();
if (workerCount === 1) {
logger.debug(
{ workerCount },
"not utilizing cluster as concurrency level is 1"
);
// Start processing jobs.
await server.process();
// Start the server.
await server.start({ parent });
} else {
// Launch the server start within throng.
throng({
workers: workerCount,
start: () => worker(server),
master: () => master(server),
});
}
} catch (err) {
logger.error({ err }, "can not bootstrap server");
throw err;
}
}
bootstrap().catch(() => {
process.exit(1);
});