{"version":3,"file":"session.cjs","names":["SQLiteAsyncSession","entityKind","NoopLogger","NoopCache","SQLiteAsyncPreparedQuery","sql","SQLiteAsyncTransaction"],"sources":["../../src/sqlite-proxy/session.ts"],"sourcesContent":["import type { BatchItem, BatchResponse } from '~/batch.ts';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport { type Query, type SQL, sql } from '~/sql/sql.ts';\nimport {\n\tSQLiteAsyncPreparedQuery,\n\ttype SQLiteAsyncPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteAsyncSession,\n\tSQLiteAsyncTransaction,\n\ttype SQLiteQueryExecutors,\n} from '~/sqlite-core/async/session.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLiteExecuteMethod, SQLiteTransactionConfig } from '~/sqlite-core/session.ts';\nimport type { AsyncBatchRemoteCallback, RemoteCallback, SqliteRemoteResult } from './driver.ts';\n\nexport interface SQLiteRemoteSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport type PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class SQLiteRemoteSession<\n\tTRelations extends AnyRelations,\n> extends SQLiteAsyncSession<'async', SqliteRemoteResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'SQLiteRemoteSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: RemoteCallback,\n\t\tdialect: SQLiteDialect,\n\t\tprivate relations: TRelations,\n\t\tprivate batchClient?: AsyncBatchRemoteCallback,\n\t\tprivate options: SQLiteRemoteSessionOptions = {},\n\t) {\n\t\tsuper(dialect, 'async');\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\t_prepare: boolean,\n\t\texecuteMethod?: SQLiteExecuteMethod,\n\t\tmapper?: (rows: any[]) => any,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): SQLiteAsyncPreparedQuery<T & { run: SqliteRemoteResult }> {\n\t\t// TODO: client doesn't support object mode querying - revisit api\n\t\tconst executors: SQLiteQueryExecutors<'async'> = {\n\t\t\tall: (params) => this.client(query.sql, params, 'all').then(({ rows }) => rows),\n\t\t\tget: (params) => this.client(query.sql, params, 'get').then(({ rows }) => rows),\n\t\t\trun: (params) => this.client(query.sql, params, 'run'),\n\t\t\tvalues: (params) => this.client(query.sql, params, 'all').then(({ rows }) => rows),\n\t\t};\n\t\treturn new SQLiteAsyncPreparedQuery(\n\t\t\t'async',\n\t\t\texecuteMethod,\n\t\t\texecutors,\n\t\t\tquery,\n\t\t\tmapper,\n\t\t\tmode,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t);\n\t}\n\n\toverride objects<T = unknown>(_query: SQL): Promise<T[]> {\n\t\tthrow new Error(\"Proxy driver doesn't support object-mode querying\");\n\t}\n\n\toverride object<T = unknown>(_query: SQL): Promise<T> {\n\t\tthrow new Error(\"Proxy driver doesn't support object-mode querying\");\n\t}\n\n\tasync batch<T extends BatchItem<'sqlite'>[] | readonly BatchItem<'sqlite'>[]>(queries: T): Promise<BatchResponse<T>> {\n\t\tconst preparedQueries: SQLiteAsyncPreparedQuery<any>[] = [];\n\t\tconst builtQueries: { sql: string; params: any[]; method: SQLiteExecuteMethod }[] = [];\n\n\t\tfor (const query of queries) {\n\t\t\tconst preparedQuery = query._prepare() as SQLiteAsyncPreparedQuery<any>;\n\t\t\tconst builtQuery = preparedQuery.getQuery();\n\t\t\tpreparedQueries.push(preparedQuery);\n\t\t\tbuiltQueries.push({ sql: builtQuery.sql, params: builtQuery.params, method: preparedQuery.executeMethod });\n\t\t}\n\n\t\tconst batchResults = await (this.batchClient as AsyncBatchRemoteCallback)(builtQueries);\n\t\treturn batchResults.map((result, i) => {\n\t\t\tconst { executeMethod, mapper } = preparedQueries[i]!;\n\n\t\t\tif (executeMethod === 'run') return result;\n\t\t\tif (executeMethod === 'values') return result.rows;\n\n\t\t\tconst { rows } = result;\n\t\t\tif (executeMethod === 'get') {\n\t\t\t\tif (!rows) return;\n\t\t\t\tif (!mapper) return rows;\n\n\t\t\t\treturn mapper([rows])[0];\n\t\t\t}\n\n\t\t\tif (!mapper) return rows;\n\n\t\t\treturn mapper(rows);\n\t\t}) as BatchResponse<T>;\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: SQLiteProxyTransaction<TRelations>) => Promise<T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Promise<T> {\n\t\tif (config?.behavior === 'concurrent') throw new Error('Concurrent transactions are not supported by driver');\n\n\t\tconst tx = new SQLiteProxyTransaction('async', this.dialect, this, this.relations);\n\t\tawait this.run(sql.raw(`begin${config?.behavior ? ' ' + config.behavior : ''}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.run(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait this.run(sql`rollback`);\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class SQLiteProxyTransaction<TRelations extends AnyRelations>\n\textends SQLiteAsyncTransaction<'async', SqliteRemoteResult, TRelations>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteProxyTransaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: SQLiteProxyTransaction<TRelations>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new SQLiteProxyTransaction(\n\t\t\t'async',\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis._.relations,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait this.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n"],"mappings":"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"}