summary refs log tree commit diff
path: root/src/bundle
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-12-17 11:00:51 +0100
committerRory& <root@rory.gay>2025-12-17 11:01:27 +0100
commit491c0de845a886954262e3ddb24959ba37a014b6 (patch)
treec0251f3779a5cd2842320e1278232b48fbea0390 /src/bundle
parentPre-commit: use spaces for formatting, regenerate schemas if changed (diff)
downloadserver-ts-491c0de845a886954262e3ddb24959ba37a014b6.tar.xz
lintstagedrc: regenerate schemas/openapi if schemas changed
Diffstat (limited to 'src/bundle')
-rw-r--r--src/bundle/Server.ts52
-rw-r--r--src/bundle/start.ts132
-rw-r--r--src/bundle/stats.ts68
3 files changed, 126 insertions, 126 deletions
diff --git a/src/bundle/Server.ts b/src/bundle/Server.ts

index 520b7602..bcc567d7 100644 --- a/src/bundle/Server.ts +++ b/src/bundle/Server.ts
@@ -41,41 +41,41 @@ const api = new Api.SpacebarServer({ server, port, production, app }); const cdn = new CDNServer({ server, port, production, app }); const gateway = new Gateway.Server({ server, port, production }); const webrtc = new Webrtc.Server({ - server: undefined, - port: wrtcWsPort, - production, + server: undefined, + port: wrtcWsPort, + production, }); process.on("SIGTERM", async () => { - console.log("Shutting down due to SIGTERM"); - await gateway.stop(); - await cdn.stop(); - await api.stop(); - await webrtc.stop(); - server.close(); + console.log("Shutting down due to SIGTERM"); + await gateway.stop(); + await cdn.stop(); + await api.stop(); + await webrtc.stop(); + server.close(); }); async function main() { - await initDatabase(); - await Config.init(); + await initDatabase(); + await Config.init(); - const logRequests = process.env["LOG_REQUESTS"] != undefined; - if (logRequests) { - app.use( - morgan("combined", { - skip: (req, res) => { - let skip = !(process.env["LOG_REQUESTS"]?.includes(res.statusCode.toString()) ?? false); - if (process.env["LOG_REQUESTS"]?.charAt(0) == "-") skip = !skip; - return skip; - }, - }), - ); - } + const logRequests = process.env["LOG_REQUESTS"] != undefined; + if (logRequests) { + app.use( + morgan("combined", { + skip: (req, res) => { + let skip = !(process.env["LOG_REQUESTS"]?.includes(res.statusCode.toString()) ?? false); + if (process.env["LOG_REQUESTS"]?.charAt(0) == "-") skip = !skip; + return skip; + }, + }), + ); + } - await new Promise((resolve) => server.listen({ port }, () => resolve(undefined))); - await Promise.all([api.start(), cdn.start(), gateway.start(), webrtc.start()]); + await new Promise((resolve) => server.listen({ port }, () => resolve(undefined))); + await Promise.all([api.start(), cdn.start(), gateway.start(), webrtc.start()]); - console.log(`[Server] ${green(`Listening on port ${bold(port)}`)}`); + console.log(`[Server] ${green(`Listening on port ${bold(port)}`)}`); } main().catch(console.error); diff --git a/src/bundle/start.ts b/src/bundle/start.ts
index 37c5b24c..af288f8e 100644 --- a/src/bundle/start.ts +++ b/src/bundle/start.ts
@@ -36,85 +36,85 @@ import path from "path"; const cores = process.env.THREADS ? parseInt(process.env.THREADS) : 1; 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"); } diff --git a/src/bundle/stats.ts b/src/bundle/stats.ts
index dec5e2e3..d4ad8177 100644 --- a/src/bundle/stats.ts +++ b/src/bundle/stats.ts
@@ -21,39 +21,39 @@ import { readFileSync } from "node:fs"; import { red } from "picocolors"; export function initStats() { - console.log(`[Path] Running in ${process.cwd()}`); - console.log(`[Path] Running from ${__dirname}`); - try { - console.log(`[CPU] ${os.cpus()[0].model} (x${os.cpus().length})`); - } catch { - console.log("[CPU] Failed to get CPU model!"); - } + console.log(`[Path] Running in ${process.cwd()}`); + console.log(`[Path] Running from ${__dirname}`); + try { + console.log(`[CPU] ${os.cpus()[0].model} (x${os.cpus().length})`); + } catch { + console.log("[CPU] Failed to get CPU model!"); + } - console.log(`[System] ${os.platform()} ${os.release()} ${os.arch()}`); - if (os.platform() == "linux") { - try { - const osReleaseLines = readFileSync("/etc/os-release", "utf8").split("\n"); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - //@ts-ignore - const osRelease: { [key: string]: string } = {}; - for (const line of osReleaseLines) { - if (!line) continue; - const [key, value] = line.match(/(.*?)="?([^"]*)"?/)!.slice(1); - osRelease[key] = value; - } - console.log(`[System]\x1b[${osRelease.ANSI_COLOR}m ${osRelease.NAME ?? "Unknown"} ${osRelease.VERSION ?? "Unknown"} (${osRelease.BUILD_ID ?? "No build ID"})\x1b[0m`); - } catch (e) { - console.log("[System] Unknown Linux distribution (missing /etc/os-release)"); - console.log(e); - } - } - console.log(`[Process] Running with PID: ${process.pid}`); - if (process.getuid && process.getuid() === 0) { - console.warn( - red( - `[Process] Warning Spacebar is running as root, this highly discouraged and might expose your system vulnerable to attackers.` + - `Please run Spacebar as a user without root privileges.`, - ), - ); - } + console.log(`[System] ${os.platform()} ${os.release()} ${os.arch()}`); + if (os.platform() == "linux") { + try { + const osReleaseLines = readFileSync("/etc/os-release", "utf8").split("\n"); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + const osRelease: { [key: string]: string } = {}; + for (const line of osReleaseLines) { + if (!line) continue; + const [key, value] = line.match(/(.*?)="?([^"]*)"?/)!.slice(1); + osRelease[key] = value; + } + console.log(`[System]\x1b[${osRelease.ANSI_COLOR}m ${osRelease.NAME ?? "Unknown"} ${osRelease.VERSION ?? "Unknown"} (${osRelease.BUILD_ID ?? "No build ID"})\x1b[0m`); + } catch (e) { + console.log("[System] Unknown Linux distribution (missing /etc/os-release)"); + console.log(e); + } + } + console.log(`[Process] Running with PID: ${process.pid}`); + if (process.getuid && process.getuid() === 0) { + console.warn( + red( + `[Process] Warning Spacebar is running as root, this highly discouraged and might expose your system vulnerable to attackers.` + + `Please run Spacebar as a user without root privileges.`, + ), + ); + } }