diff --git a/src/api/start.ts b/src/api/start.ts index 96c0c348a..9fb33b29c 100644 --- a/src/api/start.ts +++ b/src/api/start.ts @@ -25,33 +25,27 @@ import { config } from "dotenv"; config({ quiet: true }); import { SpacebarServer } from "./Server"; import cluster from "cluster"; -import os from "os"; -let cores = 1; -try { - cores = Number(process.env.THREADS) || os.cpus().length; -} catch { - console.log("[API] Failed to get thread count! Using 1..."); -} +import { EnvConfig } from "@spacebar/util"; if (cluster.isPrimary && process.env.NODE_ENV == "production") { - console.log(`Primary PID: ${process.pid}`); + console.log(`Primary PID: ${process.pid}`); - // Fork workers. - for (let i = 0; i < cores; i++) { - cluster.fork(); - } + // Fork workers. + for (let i = 0; i < EnvConfig.threads; i++) { + cluster.fork(); + } - cluster.on("exit", (worker) => { - console.log(`Worker ${worker.process.pid} died, restarting worker`); - cluster.fork(); - }); + cluster.on("exit", (worker) => { + console.log(`Worker ${worker.process.pid} died, restarting worker`); + cluster.fork(); + }); } else { - const port = Number(process.env.PORT) || 3001; + const port = Number(process.env.PORT) || 3001; - const server = new SpacebarServer({ port }); - server.start().catch(console.error); + const server = new SpacebarServer({ port }); + server.start().catch(console.error); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - global.server = server; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + global.server = server; } diff --git a/src/bundle/start.ts b/src/bundle/start.ts index af288f8ee..97f0d08de 100644 --- a/src/bundle/start.ts +++ b/src/bundle/start.ts @@ -29,92 +29,92 @@ import { config } from "dotenv"; config({ quiet: true }); import { execSync } from "child_process"; -import { centerString, Logo } from "@spacebar/util"; +import { centerString, EnvConfig, Logo } from "@spacebar/util"; import fs from "fs"; import path from "path"; -const cores = process.env.THREADS ? parseInt(process.env.THREADS) : 1; +const cores = EnvConfig.threads; function getRevInfoOrFail(): { rev: string | null; lastModified: number } { - const rootDir = path.join(__dirname, "../../"); - // sanity check - if (!fs.existsSync(path.join(rootDir, "package.json"))) { - console.log(red("Error: Cannot find package.json in root directory. Are you running from the correct location?")); - } + const rootDir = path.join(__dirname, "../../"); + // sanity check + if (!fs.existsSync(path.join(rootDir, "package.json"))) { + console.log(red("Error: Cannot find package.json in root directory. Are you running from the correct location?")); + } - // use .rev file if it exists - if (fs.existsSync(path.join(__dirname, "../../.rev"))) { - return JSON.parse(fs.readFileSync(path.join(rootDir, ".rev"), "utf-8")); - } + // use .rev file if it exists + if (fs.existsSync(path.join(__dirname, "../../.rev"))) { + return JSON.parse(fs.readFileSync(path.join(rootDir, ".rev"), "utf-8")); + } - // fall back to invoking git - try { - const rev = execSync(`git -C "${rootDir}" rev-parse HEAD`).toString().trim(); - const lastModified = Number(execSync(`git -C "${rootDir}" log -1 --format=%cd --date=unix`).toString().trim()); - return { - rev, - lastModified, - }; - } catch (e) { - return { rev: null, lastModified: 0 }; - } + // fall back to invoking git + try { + const rev = execSync(`git -C "${rootDir}" rev-parse HEAD`).toString().trim(); + const lastModified = Number(execSync(`git -C "${rootDir}" log -1 --format=%cd --date=unix`).toString().trim()); + return { + rev, + lastModified, + }; + } catch (e) { + return { rev: null, lastModified: 0 }; + } } if (cluster.isPrimary) { - const revInfo = getRevInfoOrFail(); - Logo.printLogo().then(() => { - const unformatted = `spacebar-server | !! Pre-release build !!`; - const formatted = `${blueBright("spacebar-server")} | ${redBright("⚠️ Pre-release build ⚠️")}`; - console.log(bold(centerString(unformatted, 86).replace(unformatted, formatted))); + const revInfo = getRevInfoOrFail(); + Logo.printLogo().then(() => { + const unformatted = `spacebar-server | !! Pre-release build !!`; + const formatted = `${blueBright("spacebar-server")} | ${redBright("⚠️ Pre-release build ⚠️")}`; + console.log(bold(centerString(unformatted, 86).replace(unformatted, formatted))); - const shortRev = revInfo.rev ? revInfo.rev.slice(0, 7) : "unknown"; - const unformattedRevisionHeader = `Commit Hash: ${revInfo.rev !== null ? `${revInfo.rev} (${shortRev})` : "Unknown"}`; - const formattedRevisionHeader = `Commit Hash: ${revInfo.rev !== null ? `${cyan(revInfo.rev)} (${yellow(shortRev)})` : "Unknown"}`; - console.log(bold(centerString(unformattedRevisionHeader, 86).replace(unformattedRevisionHeader, formattedRevisionHeader))); + const shortRev = revInfo.rev ? revInfo.rev.slice(0, 7) : "unknown"; + const unformattedRevisionHeader = `Commit Hash: ${revInfo.rev !== null ? `${revInfo.rev} (${shortRev})` : "Unknown"}`; + const formattedRevisionHeader = `Commit Hash: ${revInfo.rev !== null ? `${cyan(revInfo.rev)} (${yellow(shortRev)})` : "Unknown"}`; + console.log(bold(centerString(unformattedRevisionHeader, 86).replace(unformattedRevisionHeader, formattedRevisionHeader))); - const modifiedTime = new Date(revInfo.lastModified * 1000); - const unformattedLastModified = `Last Updated: ${revInfo.lastModified !== 0 ? `${modifiedTime.toUTCString()}` : "Unknown"}`; - const formattedLastModified = `Last Updated: ${revInfo.lastModified !== 0 ? `${cyan(modifiedTime.toUTCString())}` : "Unknown"}`; - console.log(bold(centerString(unformattedLastModified, 86).replace(unformattedLastModified, formattedLastModified))); + const modifiedTime = new Date(revInfo.lastModified * 1000); + const unformattedLastModified = `Last Updated: ${revInfo.lastModified !== 0 ? `${modifiedTime.toUTCString()}` : "Unknown"}`; + const formattedLastModified = `Last Updated: ${revInfo.lastModified !== 0 ? `${cyan(modifiedTime.toUTCString())}` : "Unknown"}`; + console.log(bold(centerString(unformattedLastModified, 86).replace(unformattedLastModified, formattedLastModified))); - if (revInfo.rev == null) { - console.log(yellow(`Warning: Git is not installed or not in PATH, or the server is not running from a Git repository.`)); - } + if (revInfo.rev == null) { + console.log(yellow(`Warning: Git is not installed or not in PATH, or the server is not running from a Git repository.`)); + } - console.log(`Cores: ${cyan(os.cpus().length)} (Using ${cores} thread(s).)`); - initStats(); + console.log(`Cores: ${cyan(os.cpus().length)} (Using ${cores} thread(s).)`); + initStats(); - console.log(`[Process] Starting with ${cores} threads`); + console.log(`[Process] Starting with ${cores} threads`); - if (cores === 1) { - require("./Server"); - } else { - process.env.EVENT_TRANSMISSION = "process"; + 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 - const delay = process.env.DATABASE?.includes("://") ? 0 : i * 1000; - setTimeout(() => { - cluster.fork(); - console.log(`[Process] Worker ${cyan(i)} started.`); - }, delay); - } + // Fork workers. + for (let i = 0; i < cores; i++) { + // Delay each worker start if using sqlite database to prevent locking it + const 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) => { - for (const id in cluster.workers) { - const worker = cluster.workers[id]; - if (worker === sender || !worker) continue; - worker.send(message); - } - }); + cluster.on("message", (sender: Worker, message) => { + for (const id in cluster.workers) { + const worker = cluster.workers[id]; + if (worker === sender || !worker) continue; + worker.send(message); + } + }); - cluster.on("exit", (worker) => { - console.log(`[Worker] ${red(`PID ${worker.process.pid} died, restarting ...`)}`); - cluster.fork(); - }); - } - }); + cluster.on("exit", (worker) => { + console.log(`[Worker] ${red(`PID ${worker.process.pid} died, restarting ...`)}`); + cluster.fork(); + }); + } + }); } else { - require("./Server"); + require("./Server"); }