From 8931cd361a8969f591c340527c9513075c333115 Mon Sep 17 00:00:00 2001 From: Brian Richter Date: Tue, 28 Apr 2026 23:41:50 -0700 Subject: [PATCH] Normalize base domains for site URLs --- convex/siteActions.ts | 12 +++++++++++- scripts/sites.test.mjs | 5 +++++ server.ts | 15 +++++++++++++-- src/lib/sites.ts | 14 ++++++++++++-- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/convex/siteActions.ts b/convex/siteActions.ts index 0680bc9..ae01394 100644 --- a/convex/siteActions.ts +++ b/convex/siteActions.ts @@ -109,6 +109,15 @@ function safeLabel(value: string): string { .replace(/-+/g, "-"); } +function normalizeBaseDomain(baseDomain: string): string { + return baseDomain + .replace(/^https?:\/\//i, "") + .split("/")[0] + .split(":")[0] + .trim() + .toLowerCase(); +} + function randomChoice(values: string[]): string { return values[randomBytes(1)[0] % values.length]; } @@ -118,9 +127,10 @@ function randomDigits(): string { } function buildHostname(baseDomain: string): string { + const normalizedBaseDomain = normalizeBaseDomain(baseDomain); return `${safeLabel(randomChoice(ADJECTIVES))}-${safeLabel( randomChoice(NOUNS) - )}-${randomDigits()}.${baseDomain}`; + )}-${randomDigits()}.${normalizedBaseDomain}`; } function encryptionKey(secret: string): Buffer { diff --git a/scripts/sites.test.mjs b/scripts/sites.test.mjs index 0407a20..3d397b0 100644 --- a/scripts/sites.test.mjs +++ b/scripts/sites.test.mjs @@ -26,6 +26,11 @@ const sites = await loadSitesModule(); assert.equal(hostname, "brisk-paper-07.boop.ad"); } +{ + const hostname = sites.buildBoopHostname("tiny", "paper", 0, "https://trypoo.app"); + assert.equal(hostname, "tiny-paper-00.trypoo.app"); +} + { let calls = 0; const hostname = await sites.generateMemorableHostname({ diff --git a/server.ts b/server.ts index 41db524..a953c5e 100644 --- a/server.ts +++ b/server.ts @@ -5,13 +5,24 @@ const port = Number(process.env.PORT || 3000); const distDir = join(process.cwd(), "dist"); const siteCacheControl = "public, max-age=300, s-maxage=86400"; +function normalizeBaseDomain(baseDomain: string): string { + return baseDomain + .replace(/^https?:\/\//i, "") + .split("/")[0] + .split(":")[0] + .trim() + .toLowerCase(); +} + function configuredAppHostnames(): Set { const explicit = process.env.APP_HOSTNAMES; - const baseDomain = process.env.SITE_BASE_DOMAIN || process.env.WEBVH_DOMAIN || "boop.ad"; + const baseDomain = normalizeBaseDomain( + process.env.SITE_BASE_DOMAIN || process.env.WEBVH_DOMAIN || "boop.ad" + ); const values = explicit ? explicit.split(",") : [baseDomain, `www.${baseDomain}`, "localhost", "127.0.0.1", "0.0.0.0"]; - return new Set(values.map((value) => value.trim().toLowerCase()).filter(Boolean)); + return new Set(values.map((value) => normalizeBaseDomain(value)).filter(Boolean)); } const appHostnames = configuredAppHostnames(); diff --git a/src/lib/sites.ts b/src/lib/sites.ts index 33717c4..530f9df 100644 --- a/src/lib/sites.ts +++ b/src/lib/sites.ts @@ -41,6 +41,15 @@ function safeLabel(value: string): string { .replace(/-+/g, "-"); } +export function normalizeBaseDomain(baseDomain: string): string { + return baseDomain + .replace(/^https?:\/\//i, "") + .split("/")[0] + .split(":")[0] + .trim() + .toLowerCase(); +} + export function buildBoopHostname( adjective: string, noun: string, @@ -48,7 +57,7 @@ export function buildBoopHostname( baseDomain: string ): string { const suffix = String(Math.abs(digits) % 100).padStart(2, "0"); - return `${safeLabel(adjective)}-${safeLabel(noun)}-${suffix}.${baseDomain}`; + return `${safeLabel(adjective)}-${safeLabel(noun)}-${suffix}.${normalizeBaseDomain(baseDomain)}`; } export async function generateMemorableHostname( @@ -101,5 +110,6 @@ export async function sha256Hex(input: string): Promise { } export function appHostnameSet(baseDomain: string): Set { - return new Set([baseDomain, `www.${baseDomain}`]); + const normalized = normalizeBaseDomain(baseDomain); + return new Set([normalized, `www.${normalized}`]); }