import Router from "@koa/router"; import dgram from "dgram"; import kill from "kill-port"; import { default as Koa } from "koa"; import installQS from "koa-qs"; import { Middlewares } from "sealious"; import TheApp from "./app.js"; import { PORT, SEALIOUS_KILLSWITCH_PORT, SEALIOUS_SANITY } from "./config.js"; import { mainRouter } from "./routes/index.js"; import { waitForMeilisearch } from "./services/meilisearch.js"; import { TheFileManager } from "./file-manager.js"; import { imageRouter } from "./image-router.js"; export const the_app = new TheApp({ fileManager: TheFileManager, imageRouter: imageRouter, }); void (async function () { await kill(PORT); await kill(PORT); try { await waitForMeilisearch(10); } catch (e) { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions if ((e as Error).message === "timeout") { console.log("Meilisearch must be running before the app starts!"); // eslint-disable-line no-console process.exit(1); } else { throw e; } } try { const koa_app = new Koa(); const router = new Router(); installQS(koa_app); koa_app.use(Middlewares.handleError()); koa_app.context.$app = the_app; the_app.on("started", async () => { mainRouter(the_app, koa_app, router); }); if (SEALIOUS_KILLSWITCH_PORT) { const server = dgram.createSocket("udp4"); server.on("message", () => { process.exit(0); }); server.bind(SEALIOUS_KILLSWITCH_PORT); } await the_app.start(); koa_app.listen(PORT, "0.0.0.0"); the_app.Logger.info( "STARTED", `App running. URL set in manifest: ${the_app.manifest.base_url}` ); if (SEALIOUS_SANITY) { console.error("Exiting with error code 0"); process.exit(0); } } catch (error) { console.error(error); if (SEALIOUS_SANITY) { console.error("EXITING WITH STATUS 1"); } // we need to always exit with an error status so the systemd unit knows to restart process.exit(1); } })();