From e891f8dd332a2b31fac7f6dfba510914ef4b2be6 Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Fri, 2 Jan 2026 14:21:10 +0100 Subject: [PATCH] fix: video generation API routing and worker URL configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix itty-router route patterns: :endpoint(*) -> :endpoint+ The (*) syntax is invalid; :endpoint+ correctly captures multi-segment paths - Update getWorkerApiUrl() to use VITE_WORKER_ENV for all environments - Fix dev/staging worker URLs to use jeffemmett-canvas-automerge-dev - Update wrangler.toml dev environment to use shared D1 database 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/constants/workerUrl.ts | 4 ++-- src/lib/clientConfig.ts | 23 +++++++++++++++-------- worker/worker.ts | 9 +++++---- wrangler.toml | 4 ++-- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/constants/workerUrl.ts b/src/constants/workerUrl.ts index a1978b6..470a3e7 100644 --- a/src/constants/workerUrl.ts +++ b/src/constants/workerUrl.ts @@ -11,8 +11,8 @@ const WORKER_ENV = import.meta.env.VITE_WORKER_ENV || 'production' // Default to const WORKER_URLS = { local: `http://${window.location.hostname}:5172`, - dev: "https://jeffemmett-canvas-dev.jeffemmett.workers.dev", - staging: "https://jeffemmett-canvas-dev.jeffemmett.workers.dev", + dev: "https://jeffemmett-canvas-automerge-dev.jeffemmett.workers.dev", + staging: "https://jeffemmett-canvas-automerge-dev.jeffemmett.workers.dev", production: "https://jeffemmett-canvas.jeffemmett.workers.dev" } diff --git a/src/lib/clientConfig.ts b/src/lib/clientConfig.ts index 5a900e3..3c38d9c 100644 --- a/src/lib/clientConfig.ts +++ b/src/lib/clientConfig.ts @@ -107,8 +107,11 @@ export function getClientConfig(): ClientConfig { /** * Get the worker API URL for proxied requests - * In production, this will be the same origin as the app - * In development, we need to use the worker's dev port + * Uses centralized WORKER_URL configuration based on VITE_WORKER_ENV: + * - local: localhost:5172 + * - dev: jeffemmett-canvas-dev.jeffemmett.workers.dev + * - staging: jeffemmett-canvas-dev.jeffemmett.workers.dev + * - production: jeffemmett-canvas.jeffemmett.workers.dev */ export function getWorkerApiUrl(): string { // Check for explicit worker URL override (useful for development) @@ -117,14 +120,18 @@ export function getWorkerApiUrl(): string { return workerUrl } - // In production, use same origin (worker is served from same domain) - if (typeof window !== 'undefined' && window.location.hostname !== 'localhost') { - return '' // Empty string = same origin + // Determine worker URL based on VITE_WORKER_ENV + // This mirrors the logic in src/constants/workerUrl.ts + const workerEnv = import.meta.env.VITE_WORKER_ENV || 'production' + + const workerUrls: Record = { + local: typeof window !== 'undefined' ? `http://${window.location.hostname}:5172` : 'http://localhost:5172', + dev: 'https://jeffemmett-canvas-automerge-dev.jeffemmett.workers.dev', + staging: 'https://jeffemmett-canvas-automerge-dev.jeffemmett.workers.dev', + production: 'https://jeffemmett-canvas.jeffemmett.workers.dev' } - // In development, use the worker dev server - // Default to port 5172 as configured in wrangler.toml - return 'http://localhost:5172' + return workerUrls[workerEnv] || workerUrls.production } /** diff --git a/worker/worker.ts b/worker/worker.ts index 2aef82e..36aed88 100644 --- a/worker/worker.ts +++ b/worker/worker.ts @@ -1085,7 +1085,8 @@ const router = AutoRouter({ // ============================================================================= // Fal.ai proxy - submit job to queue - .post("/api/fal/queue/:endpoint(*)", async (req, env) => { + // Use :endpoint+ for greedy named wildcard that captures multiple path segments + .post("/api/fal/queue/:endpoint+", async (req, env) => { if (!env.FAL_API_KEY) { return new Response(JSON.stringify({ error: 'FAL_API_KEY not configured' }), { status: 500, @@ -1131,7 +1132,7 @@ const router = AutoRouter({ }) // Fal.ai proxy - check job status - .get("/api/fal/queue/:endpoint(*)/status/:requestId", async (req, env) => { + .get("/api/fal/queue/:endpoint+/status/:requestId", async (req, env) => { if (!env.FAL_API_KEY) { return new Response(JSON.stringify({ error: 'FAL_API_KEY not configured' }), { status: 500, @@ -1171,7 +1172,7 @@ const router = AutoRouter({ }) // Fal.ai proxy - get job result - .get("/api/fal/queue/:endpoint(*)/result/:requestId", async (req, env) => { + .get("/api/fal/queue/:endpoint+/result/:requestId", async (req, env) => { if (!env.FAL_API_KEY) { return new Response(JSON.stringify({ error: 'FAL_API_KEY not configured' }), { status: 500, @@ -1211,7 +1212,7 @@ const router = AutoRouter({ }) // Fal.ai subscribe (synchronous generation) - used by LiveImage - .post("/api/fal/subscribe/:endpoint(*)", async (req, env) => { + .post("/api/fal/subscribe/:endpoint+", async (req, env) => { if (!env.FAL_API_KEY) { return new Response(JSON.stringify({ error: 'FAL_API_KEY not configured' }), { status: 500, diff --git a/wrangler.toml b/wrangler.toml index b35ba01..ab7f3e7 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -98,8 +98,8 @@ bucket_name = 'board-backups-preview' [[env.dev.d1_databases]] binding = "CRYPTID_DB" -database_name = "cryptid-auth-dev" -database_id = "placeholder-will-be-created-dev" +database_name = "cryptid-auth" +database_id = "35fbe755-0e7c-4b9a-a454-34f945e5f7cc" [env.dev.triggers] crons = ["0 0 * * *"] # Run at midnight UTC every day