Use getter for EnvConfig

This commit is contained in:
Rory& committed 2026-11-03 02:06:17 +01:00
1 parent b0c5b5997a
commit 4e7ff64068
14 files changed
+60 -54

No files matched your search

+3 -3
View File
@@ -65,13 +65,13 @@ export class SpacebarServer extends Server {
// await BcryptWorkerPool.Init(8); // TODO: make configurable
await GifProviderManager.init();
const logRequests = EnvConfig.logging.logRequests !== "";
const logRequests = EnvConfig.get().logging.logRequests !== "";
if (logRequests) {
this.app.use(
morgan("combined", {
skip: (req, res) => {
let skip = !(EnvConfig.logging.logRequests.includes(res.statusCode.toString()) ?? false);
if (EnvConfig.logging.logRequests.charAt(0) == "-") skip = !skip;
let skip = !(EnvConfig.get().logging.logRequests.includes(res.statusCode.toString()) ?? false);
if (EnvConfig.get().logging.logRequests.charAt(0) == "-") skip = !skip;
return skip;
},
}),
+1 -1
View File
@@ -189,7 +189,7 @@ export function route(opts: RouteOptions) {
message: x.message || "",
}),
);
if (EnvConfig.logging.logValidationErrors) {
if (EnvConfig.get().logging.logValidationErrors) {
console.log(`[VALIDATION ERROR] ${req.method} ${req.originalUrl} - SCHEMA='${opts.requestBody}' -`, validate?.errors);
if (process.env.LOG_VALIDATION_ERROR_SCHEMAS) console.log(validate.schema);
}
+1 -1
View File
@@ -142,7 +142,7 @@ async function patchUserSettings(userId: string, updatedSettings: PreloadedUserS
};
}
if (EnvConfig.logging.logProtoUpdates.includes("SETTINGS")) console.log(`Updating user settings for user ${userId} with atomic=${atomic}:`, updatedSettings);
if (EnvConfig.get().logging.logProtoUpdates.includes("SETTINGS")) console.log(`Updating user settings for user ${userId} with atomic=${atomic}:`, updatedSettings);
if (!atomic) {
settings = PreloadedUserSettings.fromJson(
+1 -1
View File
@@ -142,7 +142,7 @@ async function patchUserSettings(userId: string, updatedSettings: FrecencyUserSe
};
}
if (EnvConfig.logging.logProtoUpdates.includes("FRECENCY")) console.log(`Updating frecency settings for user ${userId} with atomic=${atomic}:`, updatedSettings);
if (EnvConfig.get().logging.logProtoUpdates.includes("FRECENCY")) console.log(`Updating frecency settings for user ${userId} with atomic=${atomic}:`, updatedSettings);
if (!atomic) {
settings = FrecencyUserSettings.fromJson(
+1 -1
View File
@@ -41,7 +41,7 @@ if (cluster.isPrimary && process.env.NODE_ENV == "production") {
console.log(`Primary PID: ${process.pid}`);
// Fork workers.
for (let i = 0; i < EnvConfig.threads; i++) {
for (let i = 0; i < EnvConfig.get().threads; i++) {
cluster.fork();
}
+3 -3
View File
@@ -61,13 +61,13 @@ async function main() {
await initDatabase();
await Config.init();
const logRequests = EnvConfig.logging.logRequests != "";
const logRequests = EnvConfig.get().logging.logRequests != "";
if (logRequests) {
app.use(
morgan("combined", {
skip: (req, res) => {
let skip = !(EnvConfig.logging.logRequests.includes(res.statusCode.toString()) ?? false);
if (EnvConfig.logging.logRequests.charAt(0) == "-") skip = !skip;
let skip = !(EnvConfig.get().logging.logRequests.includes(res.statusCode.toString()) ?? false);
if (EnvConfig.get().logging.logRequests.charAt(0) == "-") skip = !skip;
return skip;
},
}),
+1 -1
View File
@@ -33,7 +33,7 @@ import { centerString } from "@spacebar/extensions";
import { getRevInfoOrFail, Logo, EnvConfig } from "@spacebar/util";
import { initStats } from "./stats";
const cores = EnvConfig.threads;
const cores = EnvConfig.get().threads;
if (cluster.isPrimary) {
const revInfo = getRevInfoOrFail();
+3 -3
View File
@@ -49,13 +49,13 @@ export class CDNServer extends Server {
(_) => console.log("[CDN] Attachment migration failed"),
);
const logRequests = EnvConfig.logging.logRequests != undefined;
const logRequests = EnvConfig.get().logging.logRequests != undefined;
if (logRequests) {
this.app.use(
morgan("combined", {
skip: (req, res) => {
let skip = !(EnvConfig.logging.logRequests.includes(res.statusCode.toString()) ?? false);
if (EnvConfig.logging.logRequests.charAt(0) == "-") skip = !skip;
let skip = !(EnvConfig.get().logging.logRequests.includes(res.statusCode.toString()) ?? false);
if (EnvConfig.get().logging.logRequests.charAt(0) == "-") skip = !skip;
return skip;
},
}),
+4 -4
View File
@@ -59,10 +59,10 @@ export const DataSourceOptions = isHeadlessProcess
charset: "utf8mb4",
url: process.env.DATABASE,
entities: [path.join(__dirname, "entities", "*.js")],
synchronize: EnvConfig.database.unsafeSchemaSync,
logging: EnvConfig.logging.logDatabaseQueries,
synchronize: EnvConfig.get().database.unsafeSchemaSync,
logging: EnvConfig.get().logging.logDatabaseQueries,
// Figure out why this doesn't work someday.
// relationLoadStrategy: EnvConfig.database.disableJoins ? "query" : undefined, // mirrors DB_NO_JOINS
// relationLoadStrategy: EnvConfig.get().database.disableJoins ? "query" : undefined, // mirrors DB_NO_JOINS
bigNumberStrings: false,
supportBigNumbers: true,
name: "default",
@@ -85,7 +85,7 @@ export function getDatabase(): DataSource | null {
export async function initDatabase(): Promise<DataSource> {
if (dbConnection) return dbConnection;
if (!EnvConfig.database.unsafeSchemaSync) {
if (!EnvConfig.get().database.unsafeSchemaSync) {
const supported = ["postgres"];
if (!supported.includes(DatabaseType)) {
console.log(
+1 -1
View File
@@ -113,7 +113,7 @@ export async function Connection(this: WS.Server, rawSocket: WS, request: Incomi
console.log(`[Gateway] New connection from ${ipAddress}, total ${this.clients.size}`);
if (EnvConfig.logging.logGatewayEvents)
if (EnvConfig.get().logging.logGatewayEvents)
[
"close",
"error",
+12 -12
View File
@@ -45,7 +45,7 @@ export class NewUrlSignatureData extends NewUrlUserSignatureData {
throw new Error("Either path or url must be provided for URL signing");
}
if (this.path && this.url) {
if (EnvConfig.logging.logCdnSignatures) console.warn("[Signing] Both path and url are provided, using path for signing", this, new Error().stack);
if (EnvConfig.get().logging.logCdnSignatures) console.warn("[Signing] Both path and url are provided, using path for signing", this, new Error().stack);
}
if (this.url) {
try {
@@ -94,10 +94,10 @@ export class UrlSignResult {
static fromUrl(url: URL | string): UrlSignResult {
if (typeof url === "string") {
if (EnvConfig.logging.logCdnSignatures) console.debug("[Signing] Parsing URL from string:", url);
if (EnvConfig.get().logging.logCdnSignatures) console.debug("[Signing] Parsing URL from string:", url);
url = new URL(url);
}
if (EnvConfig.logging.logCdnSignatures) console.debug("[Signing] Parsing URL from URL object:", url.toString());
if (EnvConfig.get().logging.logCdnSignatures) console.debug("[Signing] Parsing URL from URL object:", url.toString());
const ex = url.searchParams.get("ex");
const is = url.searchParams.get("is");
const hm = url.searchParams.get("hm");
@@ -149,7 +149,7 @@ function calculateHash(request: UrlSignatureData): UrlSignResult {
"[Signing] CDN Signature IP is enabled but we couldn't find the IP field in the request. This may cause issues with signature validation. Please report this to the Spacebar team!",
);
else {
if (EnvConfig.logging.logCdnSignatures) console.log("[Signing] CDN Signature IP is enabled, adding IP to hash:", request.ip);
if (EnvConfig.get().logging.logCdnSignatures) console.log("[Signing] CDN Signature IP is enabled, adding IP to hash:", request.ip);
data.update(request.ip!);
ipData = new Int8Array(new TextEncoder().encode(request.ip!));
}
@@ -162,7 +162,7 @@ function calculateHash(request: UrlSignatureData): UrlSignResult {
"[Signing] CDN Signature User-Agent is enabled but we couldn't find the user-agent header in the request. This may cause issues with signature validation. Please report this to the Spacebar team!",
);
else {
if (EnvConfig.logging.logCdnSignatures) console.log("[Signing] CDN Signature User-Agent is enabled, adding User-Agent to hash:", request.userAgent);
if (EnvConfig.get().logging.logCdnSignatures) console.log("[Signing] CDN Signature User-Agent is enabled, adding User-Agent to hash:", request.userAgent);
data.update(request.userAgent!);
userAgentData = new Int8Array(new TextEncoder().encode(request.userAgent!));
}
@@ -193,7 +193,7 @@ function calculateHash(request: UrlSignatureData): UrlSignResult {
expiresAt: request.expiresAt,
hash,
});
if (EnvConfig.logging.logCdnSignatures)
if (EnvConfig.get().logging.logCdnSignatures)
console.log(
"[Signing]",
{
@@ -214,7 +214,7 @@ export const isExpired = (data: UrlSignResult | UrlSignatureData) => {
const expiresAt = parseInt(data.expiresAt, 16);
if (Number.isNaN(issuedAt) || Number.isNaN(expiresAt)) {
if (EnvConfig.logging.logCdnSignatures) console.debug("[Signing] Invalid timestamps in query");
if (EnvConfig.get().logging.logCdnSignatures) console.debug("[Signing] Invalid timestamps in query");
return true;
}
@@ -222,13 +222,13 @@ export const isExpired = (data: UrlSignResult | UrlSignatureData) => {
const isExpired = expiresAt < currentTime;
if (isExpired) {
if (EnvConfig.logging.logCdnSignatures) console.debug("[Signing] Signature expired");
if (EnvConfig.get().logging.logCdnSignatures) console.debug("[Signing] Signature expired");
return true;
}
const isValidIssuedAt = issuedAt < currentTime;
if (!isValidIssuedAt) {
if (EnvConfig.logging.logCdnSignatures) console.debug("[Signing] Signature issued in the future");
if (EnvConfig.get().logging.logCdnSignatures) console.debug("[Signing] Signature issued in the future");
return true;
}
@@ -238,13 +238,13 @@ export const isExpired = (data: UrlSignResult | UrlSignatureData) => {
export const hasValidSignature = (req: NewUrlUserSignatureData, sig: UrlSignResult) => {
// if the required query parameters are not present, return false
if (!sig.expiresAt || !sig.issuedAt || !sig.hash) {
if (EnvConfig.logging.logCdnSignatures) console.warn("[Signing] Missing required query parameters for signature validation");
if (EnvConfig.get().logging.logCdnSignatures) console.warn("[Signing] Missing required query parameters for signature validation");
return false;
}
// check if the signature is expired
if (isExpired(sig)) {
if (EnvConfig.logging.logCdnSignatures) console.warn("[Signing] Signature is expired");
if (EnvConfig.get().logging.logCdnSignatures) console.warn("[Signing] Signature is expired");
return false;
}
@@ -279,7 +279,7 @@ export const hasValidSignature = (req: NewUrlUserSignatureData, sig: UrlSignResu
const isHashValid = calculated.length === received.length && timingSafeEqual(calculated, received);
if (!isHashValid)
if (EnvConfig.logging.logCdnSignatures)
if (EnvConfig.get().logging.logCdnSignatures)
console.warn(`Signature validation for ${sig.path} (is=${sig.issuedAt}, ex=${sig.expiresAt}) failed: calculated: ${calcd}, received: ${sig.hash}`);
return isHashValid;
+27 -21
View File
@@ -16,36 +16,42 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import os from "node:os";
import { LogEnvConfiguration } from "./envTypes/LogEnvConfiguration";
import { DatabaseEnvConfiguration } from "./envTypes/DatabaseEnvConfiguration";
import os from "os";
import { ConfigurationEnvConfiguration } from "./envTypes/ConfigurationEnvConfiguration";
const logConfig = new LogEnvConfiguration();
const databaseConfig = new DatabaseEnvConfiguration();
const configurationConfig = new ConfigurationEnvConfiguration();
export class EnvConfig {
private static logConfig = new LogEnvConfiguration();
private static databaseConfig = new DatabaseEnvConfiguration();
private static configurationConfig = new ConfigurationEnvConfiguration();
private static _instance: EnvConfig;
static get() {
if (!this._instance) this._instance = new EnvConfig();
return this._instance;
}
static get logging(): LogEnvConfiguration {
return this.logConfig;
}
get logging(): LogEnvConfiguration {
return logConfig;
}
static get database(): DatabaseEnvConfiguration {
return this.databaseConfig;
}
get database(): DatabaseEnvConfiguration {
return databaseConfig;
}
static get configuration(): ConfigurationEnvConfiguration {
return this.configurationConfig;
}
get configuration(): ConfigurationEnvConfiguration {
return 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;
}
}
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:
+1 -1
View File
@@ -52,7 +52,7 @@ export type UserTokenData = {
};
function logAuth(text: string) {
if (!EnvConfig.logging.logAuthentication) return;
if (!EnvConfig.get().logging.logAuthentication) return;
console.log(`[AUTH] ${text}`);
}
+1 -1
View File
@@ -36,7 +36,7 @@ export async function Connection(this: WS.Server, rawSocket: WS, request: Incomi
socket.rawSocket.on("message", (data, isBinary) => onMessage(socket, data as Buffer));
console.log("[WebRTC] new connection", request.url);
if (EnvConfig.logging.logGatewayEvents) {
if (EnvConfig.get().logging.logGatewayEvents) {
[
"close",
"error",