2024-05-09 02:38:46 +08:00
import { createClient , SupabaseClient } from "@supabase/supabase-js" ;
2024-09-05 02:57:57 +08:00
import { configDotenv } from "dotenv" ;
configDotenv ( ) ;
2024-07-26 04:47:43 +08:00
2024-05-09 02:38:46 +08:00
// SupabaseService class initializes the Supabase client conditionally based on environment variables.
class SupabaseService {
private client : SupabaseClient | null = null ;
constructor ( ) {
const supabaseUrl = process . env . SUPABASE_URL ;
const supabaseServiceToken = process . env . SUPABASE_SERVICE_TOKEN ;
// Only initialize the Supabase client if both URL and Service Token are provided.
2024-08-13 01:20:41 +08:00
const useDbAuthentication = process . env . USE_DB_AUTHENTICATION === 'true' ;
if ( ! useDbAuthentication ) {
2024-05-09 02:38:46 +08:00
// Warn the user that Authentication is disabled by setting the client to null
console . warn (
2024-07-25 20:48:06 +08:00
"Authentication is disabled. Supabase client will not be initialized."
2024-05-09 02:38:46 +08:00
) ;
this . client = null ;
} else if ( ! supabaseUrl || ! supabaseServiceToken ) {
console . error (
2024-07-25 20:48:06 +08:00
"Supabase environment variables aren't configured correctly. Supabase client will not be initialized. Fix ENV configuration or disable DB authentication with USE_DB_AUTHENTICATION env variable"
2024-05-09 02:38:46 +08:00
) ;
} else {
this . client = createClient ( supabaseUrl , supabaseServiceToken ) ;
}
}
// Provides access to the initialized Supabase client, if available.
getClient ( ) : SupabaseClient | null {
return this . client ;
}
}
// Using a Proxy to handle dynamic access to the Supabase client or service methods.
// This approach ensures that if Supabase is not configured, any attempt to use it will result in a clear error.
export const supabase_service : SupabaseClient = new Proxy (
new SupabaseService ( ) ,
{
get : function ( target , prop , receiver ) {
2024-08-13 01:20:41 +08:00
const useDbAuthentication = process . env . USE_DB_AUTHENTICATION === 'true' ;
if ( ! useDbAuthentication ) {
2024-07-26 04:48:43 +08:00
console . debug (
2024-07-25 20:48:06 +08:00
"Attempted to access Supabase client when it's not configured."
) ;
}
2024-05-09 02:38:46 +08:00
const client = target . getClient ( ) ;
// If the Supabase client is not initialized, intercept property access to provide meaningful error feedback.
if ( client === null ) {
console . error (
"Attempted to access Supabase client when it's not configured."
) ;
return ( ) = > {
throw new Error ( "Supabase client is not configured." ) ;
} ;
}
// Direct access to SupabaseService properties takes precedence.
if ( prop in target ) {
return Reflect . get ( target , prop , receiver ) ;
}
// Otherwise, delegate access to the Supabase client.
return Reflect . get ( client , prop , receiver ) ;
} ,
}
) as unknown as SupabaseClient ;