Use EnvConfig for thread count

This commit is contained in:
Rory&
2025-12-17 11:04:15 +01:00
parent 30b2624587
commit fe2b7b7807
2 changed files with 84 additions and 90 deletions
+16 -22
View File
@@ -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;
}
+68 -68
View File
@@ -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");
}