diff --git a/src/util/config/EnvConfig.ts b/src/util/config/EnvConfig.ts new file mode 100644 index 000000000..25fa531c7 --- /dev/null +++ b/src/util/config/EnvConfig.ts @@ -0,0 +1,54 @@ +/* + Spacebar: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2025 Spacebar and Spacebar Contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +import { LogEnvConfiguration } from "./envTypes/LogEnvConfiguration"; +import { DatabaseEnvConfiguration } from "./envTypes/DatabaseEnvConfiguration"; +import os from "os"; +import { ConfigurationEnvConfiguration } from "./envTypes/ConfigurationEnvConfiguration"; + +export class EnvConfig { + private static logConfig = new LogEnvConfiguration(); + private static databaseConfig = new DatabaseEnvConfiguration(); + private static configurationConfig = new ConfigurationEnvConfiguration(); + + static get logging(): LogEnvConfiguration { + return this.logConfig; + } + + static get database(): DatabaseEnvConfiguration { + return this.databaseConfig; + } + + static get configuration(): ConfigurationEnvConfiguration { + return this.configurationConfig; + } + + static get threads(): number { + try { + return Number(process.env.THREADS) || os.cpus().length; + } catch { + console.log("[EnvConfig] Failed to get thread count! Using 1..."); + return 1; + } + } +} + +// Deprecations: +if (process.env.GATEWAY) console.warn("[EnvConfig] GATEWAY is deprecated and no longer does anything. Please configure cdn_endpointPublic in configuration instead."); + +if (process.env.CDN) console.warn("[EnvConfig] CDN is deprecated and no longer does anything. Please configure cdn_endpointPublic in configuration instead."); diff --git a/src/util/config/envTypes/ConfigurationEnvConfiguration.ts b/src/util/config/envTypes/ConfigurationEnvConfiguration.ts new file mode 100644 index 000000000..33d2f81a8 --- /dev/null +++ b/src/util/config/envTypes/ConfigurationEnvConfiguration.ts @@ -0,0 +1,49 @@ +/* + Spacebar: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2025 Spacebar and Spacebar Contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +export class ConfigurationEnvConfiguration { + get enabled(): boolean { + return process.env.CONFIG_PATH !== undefined; + } + + get path(): string { + if (process.env.CONFIG_PATH === undefined && this.enabled) { + throw new Error("BUGBUG: enabled() determined that JSON config is enabled, but it is not?"); + } + + return process.env.CONFIG_PATH!; + } + + get writebackEnabled(): boolean { + return process.env.CONFIG_WRITEBACK === "true" || process.env.CONFIG_WRITEBACK === undefined; + } + + /** + * Gets the configuration mode. + * - "override": Config file overrides settings at runtime + * - "overwrite": Config file overwrites database values at runtime + * - "single": Database is not used + */ + get mode(): ("override" | "overwrite" | "single") { + if (process.env.CONFIG_MODE === "override" || process.env.CONFIG_MODE === "overwrite" || process.env.CONFIG_MODE === "single") { + return process.env.CONFIG_MODE; + } + + return "override"; + } +} diff --git a/src/util/config/envTypes/DatabaseEnvConfiguration.ts b/src/util/config/envTypes/DatabaseEnvConfiguration.ts new file mode 100644 index 000000000..af0377b96 --- /dev/null +++ b/src/util/config/envTypes/DatabaseEnvConfiguration.ts @@ -0,0 +1,45 @@ +/* + Spacebar: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2025 Spacebar and Spacebar Contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +export class DatabaseEnvConfiguration { + get unsafeSchemaSync(): boolean { + if (process.env.DB_UNSAFE_SCHEMA_SYNC !== undefined) { + return process.env.DB_UNSAFE_SCHEMA_SYNC === "true"; + } + + if (process.env.DB_SYNC !== undefined) { + console.warn("[EnvConfig] DB_SYNC is deprecated. Please use DB_UNSAFE_SCHEMA_SYNC instead."); + return process.env.DB_SYNC === "true"; + } + + return false; + } + + get disableJoins(): boolean { + if (process.env.DB_DISABLE_JOINS !== undefined) { + return process.env.DB_DISABLE_JOINS === "true"; + } + + if (process.env.DB_NO_JOINS !== undefined) { + console.warn("[EnvConfig] DB_NO_JOINS is deprecated. Please use DB_DISABLE_JOINS instead."); + return process.env.DB_NO_JOINS === "true"; + } + + return false; + } +} diff --git a/src/util/config/envTypes/LogEnvConfiguration.ts b/src/util/config/envTypes/LogEnvConfiguration.ts new file mode 100644 index 000000000..29c076aad --- /dev/null +++ b/src/util/config/envTypes/LogEnvConfiguration.ts @@ -0,0 +1,65 @@ +/* + Spacebar: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2025 Spacebar and Spacebar Contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +export class LogEnvConfiguration { + get logGatewayEvents(): boolean { + if (process.env.LOG_GATEWAY_EVENTS === "true") return true; + if (process.env.WS_LOGEVENTS !== undefined) { + console.warn("[EnvConfig] WS_LOGEVENTS is deprecated. Please use LOG_GATEWAY_EVENTS instead."); + return process.env.WS_LOGEVENTS === "true"; + } + return false; + } + + get logDatabaseQueries(): boolean { + if (process.env.LOG_DATABASE_QUERIES === "true") return true; + if (process.env.DB_LOGGING !== undefined) { + console.warn("[EnvConfig] DB_LOGGING is deprecated. Please use LOG_DATABASE_QUERIES instead."); + return process.env.DB_LOGGING === "true"; + } + return false; + } + + get logRequests(): string { + return process.env.LOG_REQUESTS || ""; + } + + get logValidationErrors(): boolean { + return process.env.LOG_VALIDATION_ERRORS === "true"; + } + + get logGatewayTraces(): boolean { + return process.env.LOG_GATEWAY_TRACES === "true"; + } + + get logProtoUpdates(): string[] { + if (process.env.LOG_PROTO_UPDATES === "true") return ["FRECENCY", "SETTINGS"]; + return (process.env.LOG_PROTO_UPDATES || "") + .split(",") + .map((s) => s.trim().toUpperCase()) + .filter((s) => s.length > 0); + } + + get logAuthentication(): boolean { + return process.env.LOG_AUTHENTICATION === "true"; + } + + get logCdnSignatures(): boolean { + return process.env.LOG_CDN_SIGNATURES === "true"; + } +} diff --git a/src/util/config/index.ts b/src/util/config/index.ts index d68660267..3e4cc897f 100644 --- a/src/util/config/index.ts +++ b/src/util/config/index.ts @@ -17,3 +17,4 @@ */ export * from "./Config"; +export * from "./EnvConfig";