import type { AnyDrizzleClient } from "./drizzle-client.ts" export interface DatabaseClientExecuteRawSqlOptions { sql: string } export interface DatabaseClientOnceOptions< DrizzleClient extends AnyDrizzleClient = AnyDrizzleClient, Result = unknown, > { run: (drizzleClient: DrizzleClient) => Promise } export interface DatabaseClientOptions { drizzleClient: DrizzleClient } export abstract class DatabaseClient { protected managedDrizzleClient: DrizzleClient constructor(options: DatabaseClientOptions) { this.managedDrizzleClient = options.drizzleClient } getDrizzleClient(): DrizzleClient { return this.managedDrizzleClient } abstract executeRawSql(options: DatabaseClientExecuteRawSqlOptions): Promise // 底层数据库实例的关闭方法不同,如 `postgres.js` 使用 `client.end()`, // `@electric-sql/pglite` 使用 `client.close()`,因此在这里定义一个抽 // 象方法,由具体的客户端实现类来实现。 abstract close(): Promise async once(options: DatabaseClientOnceOptions): Promise { const { run } = options const drizzleClient = this.getDrizzleClient() try { const result = await run(drizzleClient) return result } finally { await this.close() } } } export const isDatabaseClient = ( target: unknown, ): target is DatabaseClient => { return target instanceof DatabaseClient }