import 'server-only'; import { type NextRequest, NextResponse } from 'next/server'; import { createServerClient } from '@supabase/ssr'; import { Database } from '../database.types'; import { getSupabaseClientKeys } from '../get-supabase-client-keys'; /** * Creates a middleware client for Supabase. * * Uses SUPABASE_INTERNAL_URL when available for reliable Docker networking, * with cookieOptions.name matching the external URL's cookie key. */ export function createMiddlewareClient( request: NextRequest, response: NextResponse, ) { const keys = getSupabaseClientKeys(); const internalUrl = process.env.SUPABASE_INTERNAL_URL; const url = internalUrl || keys.url; const cookieOptions = internalUrl ? { name: deriveCookieName(keys.url) } : undefined; return createServerClient(url, keys.publicKey, { ...(cookieOptions ? { cookieOptions } : {}), cookies: { getAll() { return request.cookies.getAll(); }, setAll(cookiesToSet) { cookiesToSet.forEach(({ name, value }) => request.cookies.set(name, value), ); cookiesToSet.forEach(({ name, value, options }) => response.cookies.set(name, value, options), ); }, }, }); } function deriveCookieName(supabaseUrl: string): string { try { const hostname = new URL(supabaseUrl).hostname; const ref = hostname.split('.')[0]!; return `sb-${ref}-auth-token`; } catch { return 'sb-localhost-auth-token'; } }