diff --git a/apps/api/src/db.ts b/apps/api/src/db.ts index ff8edd7..e0fbe33 100644 --- a/apps/api/src/db.ts +++ b/apps/api/src/db.ts @@ -6,19 +6,25 @@ import type { Env } from "./types"; type Database = ReturnType>; +let cachedUrl: string | undefined; +let cachedDb: Database | undefined; + export function getDb(env: Env) { if (!env.SUPABASE_POOLER_DATABASE_URL) { throw new Error("SUPABASE_POOLER_DATABASE_URL is not configured."); } - const client = postgres(env.SUPABASE_POOLER_DATABASE_URL, { - connect_timeout: 10, - fetch_types: false, - idle_timeout: 1, - max: 1, - prepare: false, - ssl: "require", - }); + if (!cachedDb || cachedUrl !== env.SUPABASE_POOLER_DATABASE_URL) { + const client = postgres(env.SUPABASE_POOLER_DATABASE_URL, { + connect_timeout: 10, + idle_timeout: 20, + max: 1, + prepare: false, + }); + + cachedDb = drizzle(client, { schema }); + cachedUrl = env.SUPABASE_POOLER_DATABASE_URL; + } - return drizzle(client, { schema }) satisfies Database; + return cachedDb; } diff --git a/apps/api/src/middleware/auth.ts b/apps/api/src/middleware/auth.ts index bd4cceb..098f1ec 100644 --- a/apps/api/src/middleware/auth.ts +++ b/apps/api/src/middleware/auth.ts @@ -16,7 +16,6 @@ type ClerkClaims = Record & { type AuthOptions = { allowQueryToken?: boolean; - resolveUser?: boolean; }; let cachedClerkClient: ClerkClient | undefined; @@ -168,14 +167,11 @@ async function upsertAuthUser(env: Env, payload: ClerkClaims): Promise return user; } -function authMiddleware({ - allowQueryToken = false, - resolveUser = true, -}: AuthOptions = {}): MiddlewareHandler { +function authMiddleware(options: AuthOptions = {}): MiddlewareHandler { return async (c, next) => { const token = getToken( c.req.header("authorization"), - allowQueryToken ? c.req.query("token") : undefined, + options.allowQueryToken ? c.req.query("token") : undefined, ); if (!hasAuthMaterial(c.req.raw, token)) { @@ -188,16 +184,14 @@ function authMiddleware({ unauthorized(); } - if (resolveUser) { - c.set("authUser", await upsertAuthUser(c.env, payload)); - } + c.set("authUser", await upsertAuthUser(c.env, payload)); await next(); }; } export const requireAuth = authMiddleware(); -export const requireRealtimeAuth = authMiddleware({ allowQueryToken: true, resolveUser: false }); +export const requireRealtimeAuth = authMiddleware({ allowQueryToken: true }); export const optionalAuth: MiddlewareHandler = async (c, next) => { const token = getToken(c.req.header("authorization"), undefined);