diff options
author | Madeline <46743919+MaddyUnderStars@users.noreply.github.com> | 2022-08-30 15:05:23 +1000 |
---|---|---|
committer | Madeline <46743919+MaddyUnderStars@users.noreply.github.com> | 2022-08-30 15:08:18 +1000 |
commit | 16315a3170ec018a834e68360e06b506415446d2 (patch) | |
tree | 90cfe456040fce35b904e88462886e3c73a2f3f2 /src/start.ts | |
parent | Start listening after database and config has been loaded (diff) | |
parent | Oop, deprecated typeorm call (diff) | |
download | server-16315a3170ec018a834e68360e06b506415446d2.tar.xz |
Merge branch 'staging' into dev/Maddy/fix/listeningAfterDb
Diffstat (limited to 'src/start.ts')
-rw-r--r-- | src/start.ts | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/start.ts b/src/start.ts new file mode 100644 index 00000000..cf1a42a5 --- /dev/null +++ b/src/start.ts @@ -0,0 +1,83 @@ +// process.env.MONGOMS_DEBUG = "true"; +import { execSync } from "child_process"; +import cluster, { Worker } from "cluster"; +import { config } from "dotenv"; +import os from "os"; +import { bold, cyan, red, yellow } from "picocolors"; +import "reflect-metadata"; +import { initStats } from "./stats"; +config(); + +// TODO: add socket event transmission +let cores = 1; +try { + cores = Number(process.env.THREADS) || os.cpus().length; +} catch { + console.log("[API] Failed to get thread count! Using 1..."); +} + +if (cluster.isMaster) { + function getCommitOrFail() { + try { + return execSync("git rev-parse HEAD").toString().trim(); + } catch (e) { + return null; + } + } + const commit = getCommitOrFail(); + + console.log( + bold(` +███████╗ ██████╗ ███████╗███████╗ ██████╗ ██████╗ ██████╗ ██████╗ +██╔════╝██╔═══██╗██╔════╝██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔══██╗ +█████╗ ██║ ██║███████╗███████╗██║ ██║ ██║██████╔╝██║ ██║ +██╔══╝ ██║ ██║╚════██║╚════██║██║ ██║ ██║██╔══██╗██║ ██║ +██║ ╚██████╔╝███████║███████║╚██████╗╚██████╔╝██║ ██║██████╔╝ +╚═╝ ╚═════╝ ╚══════╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ + + fosscord-server | ${yellow(`Pre-release (${commit !== null ? commit.slice(0, 7) : "Unknown (Git cannot be found)"})`)} + +Commit Hash: ${commit !== null ? `${cyan(commit)} (${yellow(commit.slice(0, 7))})` : "Unknown (Git cannot be found)"} +Cores: ${cyan(os.cpus().length)} (Using ${cores} thread(s).) +`) + ); + + if (commit == null) { + console.log(yellow(`Warning: Git is not installed or not in PATH.`)); + } + + initStats(); + + console.log(`[Process] starting with ${cores} threads`); + + if (cores === 1) { + require("./Server"); + } else { + process.env.EVENT_TRANSMISSION = "process"; + + // Fork workers. + for (let i = 0; i < cores; i++) { + // Delay each worker start if using sqlite database to prevent locking it + let delay = process.env.DATABASE?.includes("://") ? 0 : i * 1000; + setTimeout(() => { + cluster.fork(); + console.log(`[Process] worker ${cyan(i)} started.`); + }, delay); + } + + cluster.on("message", (sender: Worker, message: any) => { + for (const id in cluster.workers) { + const worker = cluster.workers[id]; + if (worker === sender || !worker) continue; + worker.send(message); + } + }); + + cluster.on("exit", (worker: any, code: any, signal: any) => { + console.log(`[Worker] ${red(`died with PID: ${worker.process.pid} , restarting ...`)}`); + cluster.fork(); + }); + } +} else { + require("./Server"); +} |