import type { QueryResult } from '@powersync/common'; import type { WithCacheConfig } from 'drizzle-orm/cache/core/types'; import { entityKind } from 'drizzle-orm/entity'; import type { Logger } from 'drizzle-orm/logger'; import { NoopLogger } from 'drizzle-orm/logger'; import type { RelationalSchemaConfig, TablesRelationalConfig } from 'drizzle-orm/relations'; import { type Query } from 'drizzle-orm/sql/sql'; import type { SQLiteAsyncDialect } from 'drizzle-orm/sqlite-core/dialect'; import type { SelectedFieldsOrdered } from 'drizzle-orm/sqlite-core/query-builders/select.types'; import { SQLiteSession, SQLiteTransaction, type PreparedQueryConfig as PreparedQueryConfigBase, type SQLiteExecuteMethod, type SQLiteTransactionConfig } from 'drizzle-orm/sqlite-core/session'; import { PowerSyncSQLitePreparedQuery, type ContextProvider } from './PowerSyncSQLitePreparedQuery.js'; export interface PowerSyncSQLiteSessionOptions { logger?: Logger; } export type PowerSyncSQLiteTransactionConfig = SQLiteTransactionConfig & { accessMode?: 'read only' | 'read write'; }; export class PowerSyncSQLiteTransaction< TFullSchema extends Record, TSchema extends TablesRelationalConfig > extends SQLiteTransaction<'async', QueryResult, TFullSchema, TSchema> { static readonly [entityKind]: string = 'PowerSyncSQLiteTransaction'; } export class PowerSyncSQLiteBaseSession< TFullSchema extends Record, TSchema extends TablesRelationalConfig > extends SQLiteSession<'async', QueryResult, TFullSchema, TSchema> { static readonly [entityKind]: string = 'PowerSyncSQLiteBaseSession'; protected logger: Logger; constructor( protected contextProvider: ContextProvider, protected dialect: SQLiteAsyncDialect, protected schema: RelationalSchemaConfig | undefined, protected options: PowerSyncSQLiteSessionOptions = {} ) { super(dialect); this.logger = options.logger ?? new NoopLogger(); } prepareQuery( query: Query, fields: SelectedFieldsOrdered | undefined, executeMethod: SQLiteExecuteMethod, isResponseInArrayMode: boolean, customResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown, queryMetadata?: { type: 'select' | 'update' | 'delete' | 'insert'; tables: string[]; }, cacheConfig?: WithCacheConfig ): PowerSyncSQLitePreparedQuery { return new PowerSyncSQLitePreparedQuery( this.contextProvider, query, this.logger, fields, executeMethod, isResponseInArrayMode, customResultMapper, undefined, // cache not supported yet queryMetadata, cacheConfig ); } async transaction( _transaction: (tx: SQLiteTransaction<'async', QueryResult, TFullSchema, TSchema>) => Promise, _config?: PowerSyncSQLiteTransactionConfig ): Promise { throw new Error('Nested transactions are not supported'); } }