Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/configs/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/configs/types/AppConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export type AppConfig = {
relayDomain: string;
demosDomain: string;
gameStreamDomain: string;
cloudflareWorkerUrl?: string;
authCookieDomain: string;
extraCorsOrigins: Array<string>;
demoParserUrl: string;
Expand Down
9 changes: 9 additions & 0 deletions src/hasura/hasura.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
84 changes: 84 additions & 0 deletions test/cloudflare-worker-url.spec.ts
Original file line number Diff line number Diff line change
@@ -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<void> }
).updateSettings();
};

const workerUrl = async () => {
const rows = await postgres.query<Array<{ value: string }>>(
"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();
});
});
Loading