From d38e17cb26e46da4fbee697fc2974d7b4664e2e2 Mon Sep 17 00:00:00 2001 From: Luke Policinski Date: Mon, 28 Sep 2026 11:56:05 -0400 Subject: [PATCH] chore: cloudflare worker url from the panel config --- src/configs/app.ts | 3 ++ src/configs/types/AppConfig.ts | 1 + src/hasura/hasura.service.ts | 9 ++++ test/cloudflare-worker-url.spec.ts | 84 ++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 test/cloudflare-worker-url.spec.ts diff --git a/src/configs/app.ts b/src/configs/app.ts index 642170ac..38862c40 100644 --- a/src/configs/app.ts +++ b/src/configs/app.ts @@ -13,6 +13,9 @@ export default (): { relayDomain: `https://${process.env.RELAY_DOMAIN}`, demosDomain: `https://${process.env.DEMOS_DOMAIN}`, gameStreamDomain: `https://${process.env.GAME_STREAM_DOMAIN}`, + cloudflareWorkerUrl: process.env.CLOUDFLARE_WORKER_DOMAIN + ? `https://${process.env.CLOUDFLARE_WORKER_DOMAIN}` + : undefined, authCookieDomain: process.env.AUTH_COOKIE_DOMAIN || `.${process.env.WEB_DOMAIN}`, // Full origins, scheme and all -- `https://dev.5stack.gg`, not diff --git a/src/configs/types/AppConfig.ts b/src/configs/types/AppConfig.ts index e01bdecd..4ddfc9f0 100644 --- a/src/configs/types/AppConfig.ts +++ b/src/configs/types/AppConfig.ts @@ -8,6 +8,7 @@ export type AppConfig = { relayDomain: string; demosDomain: string; gameStreamDomain: string; + cloudflareWorkerUrl?: string; authCookieDomain: string; extraCorsOrigins: Array; demoParserUrl: string; diff --git a/src/hasura/hasura.service.ts b/src/hasura/hasura.service.ts index 31de6b01..6edd8a03 100644 --- a/src/hasura/hasura.service.ts +++ b/src/hasura/hasura.service.ts @@ -161,6 +161,15 @@ export class HasuraService { [this.appConfig.relayDomain], ); + // Left alone when unset, so a URL saved from the old settings-page field + // keeps working on panels that have not run ./backblaze-proxy.sh since. + if (this.appConfig.cloudflareWorkerUrl) { + await this.postgresService.query( + "insert into settings (name, value) values ('cloudflare_worker_url', $1) on conflict (name) do update set value = $1", + [this.appConfig.cloudflareWorkerUrl], + ); + } + // Steam presence bot is on by default; seed the row so the admin toggle // reflects it. `do nothing` preserves an admin's explicit off. await this.postgresService.query( diff --git a/test/cloudflare-worker-url.spec.ts b/test/cloudflare-worker-url.spec.ts new file mode 100644 index 00000000..93853325 --- /dev/null +++ b/test/cloudflare-worker-url.spec.ts @@ -0,0 +1,84 @@ +import { Logger } from "@nestjs/common"; +import { ConfigService } from "@nestjs/config"; +import { HasuraService } from "../src/hasura/hasura.service"; +import { PostgresService } from "../src/postgres/postgres.service"; +import { bootMigratedDb, SqlTestDb } from "./utils/sql-test-db"; + +// CLOUDFLARE_WORKER_DOMAIN in the panel's config is copied into the +// cloudflare_worker_url setting at boot, which every download URL is built from. +describe("cloudflare worker url setting", () => { + let db: SqlTestDb; + let postgres: PostgresService; + + beforeAll(async () => { + db = await bootMigratedDb("CloudflareWorkerUrlTest"); + postgres = db.postgres; + }, 600_000); + + afterAll(async () => { + await db?.stop(); + }); + + beforeEach(async () => { + await postgres.query( + "DELETE FROM settings WHERE name = 'cloudflare_worker_url'", + ); + }); + + const boot = (cloudflareWorkerUrl?: string) => { + const hasura = new HasuraService( + new Logger("CloudflareWorkerUrlTest"), + null as never, + new ConfigService({ + app: { + demosDomain: "demos.test", + relayDomain: "relay.test", + cloudflareWorkerUrl, + }, + }), + postgres, + ); + return ( + hasura as unknown as { updateSettings(): Promise } + ).updateSettings(); + }; + + const workerUrl = async () => { + const rows = await postgres.query>( + "SELECT value FROM settings WHERE name = 'cloudflare_worker_url'", + ); + return rows.at(0)?.value; + }; + + it("sets the worker url from the panel config", async () => { + await boot("https://cf.example.test"); + + expect(await workerUrl()).toBe("https://cf.example.test"); + }); + + it("replaces a url saved from the settings page", async () => { + await postgres.query( + "INSERT INTO settings (name, value) VALUES ('cloudflare_worker_url', 'https://demo-dl.example.test')", + ); + + await boot("https://cf.example.test"); + + expect(await workerUrl()).toBe("https://cf.example.test"); + }); + + it("leaves a saved url alone when the panel config has none", async () => { + await postgres.query( + "INSERT INTO settings (name, value) VALUES ('cloudflare_worker_url', 'https://demo-dl.example.test')", + ); + + await boot(undefined); + + expect(await workerUrl()).toBe("https://demo-dl.example.test"); + }); + + it("does not create the setting when the panel config has none", async () => { + await boot(undefined); + + expect(await workerUrl()).toBeUndefined(); + }); +});