/** * Electric SQL client setup * This initializes the Electric SQL client with local PGlite database (PostgreSQL in browser) */ import { PGlite } from '@electric-sql/pglite' import { electrify } from 'electric-sql/pglite' import { getElectricAuthToken } from './auth' // We'll generate the schema after running electric:generate // For now, we'll use a placeholder type type Electric = any type Schema = any let electric: Electric | null = null let isInitializing = false let initPromise: Promise | null = null export async function initElectric(): Promise { if (electric) { return electric } if (isInitializing && initPromise) { return initPromise } isInitializing = true initPromise = (async () => { try { const config = { auth: { token: await getElectricAuthToken(), }, url: process.env.NEXT_PUBLIC_ELECTRIC_URL || 'http://localhost:5133', } // Initialize PGlite database (PostgreSQL in browser) // Use idb:// prefix for IndexedDB storage in browser // relaxedDurability improves responsiveness by scheduling flush after query returns const conn = new PGlite('idb://surfsense.db', { relaxedDurability: true, }) // Import schema (will be generated by electric:generate) // For now, we'll use a dynamic import that will work after schema generation let schema: Schema try { const schemaModule = await import('./generated/schema') schema = schemaModule.schema } catch (error) { console.warn( 'Electric SQL schema not found. Run "pnpm electric:generate" to generate it.', error ) // Return a mock electric client for now return null as any } // Electrify the PGlite database connection electric = await electrify(conn, schema, config) console.log('Electric SQL initialized successfully with PGlite') return electric } catch (error) { console.error('Failed to initialize Electric SQL:', error) throw error } finally { isInitializing = false } })() return initPromise } export function getElectric(): Electric { if (!electric) { throw new Error('Electric not initialized. Call initElectric() first.') } return electric } export function isElectricInitialized(): boolean { return electric !== null }