mongaku/mongaku

View on GitHub
src/server/server.js

Summary

Maintainability
A
1 hr
Test Coverage
// @flow

const express = require("express");

const init = require("../lib/init");
const config = require("../lib/config");
const db = require("../lib/db");

const expressInit = require("./express");
const passport = require("./passport");
const i18n = require("./i18n");
const routes = require("./routes");
const tmplVars = require("./tmpl-vars");
const cron = require("./cron");

module.exports = (callback: (err: ?Error, server: Server) => void) => {
    const port = config.PORT;
    const app = express();

    init((err?: Error) => {
        /* istanbul ignore if */
        if (err) {
            return callback(err);
        }

        // Load in the main server logic
        expressInit(app);
        passport(app);
        i18n(app);
        tmplVars(app);
        routes(app);

        const server = app.listen(port, () => {
            callback(null, server);

            /* istanbul ignore if */
            if (process.send) {
                process.send("online");
            }
        });

        if (server) {
            server.on("close", () => {
                db.close();
            });
        }

        /* istanbul ignore if */
        if (config.NODE_ENV !== "test") {
            // Start the app by listening on <port>
            console.log(`PORT: ${port}`);

            process.on("message", message => {
                if (message === "shutdown") {
                    process.exit(0);
                }
            });

            process.on("uncaughtException", err => {
                console.error("Exception:", err.stack);

                if (process.send) {
                    process.send("offline");
                }
            });

            cron.start();
        }
    });
};