35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
import { createClient, SupabaseClient } from '@supabase/supabase-js';
|
|
|
|
let _admin: SupabaseClient | null = null;
|
|
|
|
export function getSupabaseAdmin(): SupabaseClient {
|
|
if (_admin) return _admin;
|
|
const url = process.env.NEXT_PUBLIC_SUPABASE_URL;
|
|
const key = process.env.SUPABASE_SERVICE_ROLE_KEY;
|
|
if (!url || !key) {
|
|
throw new Error('Supabase admin env not configured');
|
|
}
|
|
_admin = createClient(url, key, {
|
|
auth: { autoRefreshToken: false, persistSession: false },
|
|
global: {
|
|
// Force every request the admin client makes (GoTrue listUsers and
|
|
// PostgREST reads alike) to bypass Next's fetch Data Cache, so the admin
|
|
// surface always reflects current state regardless of page config.
|
|
fetch: (input: RequestInfo | URL, init?: RequestInit) =>
|
|
fetch(input, { ...init, cache: 'no-store' }),
|
|
},
|
|
});
|
|
return _admin;
|
|
}
|
|
|
|
export function getSupabaseAnon(): SupabaseClient {
|
|
const url = process.env.NEXT_PUBLIC_SUPABASE_URL;
|
|
const key = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;
|
|
if (!url || !key) {
|
|
throw new Error('Supabase anon env not configured');
|
|
}
|
|
return createClient(url, key, {
|
|
auth: { autoRefreshToken: false, persistSession: false },
|
|
});
|
|
}
|