{"version":3,"file":"session.cjs","names":["MySqlAsyncSession","entityKind","NoopLogger","NoopCache","MySqlAsyncPreparedQuery","MySqlAsyncTransaction","sql"],"sources":["../../src/tidb-serverless/session.ts"],"sourcesContent":["import type { Connection, FullResult, Tx } from '@tidbcloud/serverless';\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 { MySqlAsyncPreparedQuery, MySqlAsyncSession, MySqlAsyncTransaction } from '~/mysql-core/async/session.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { MySqlPreparedQueryConfig, MySqlQueryResultHKT, MySqlTransactionConfig } from '~/mysql-core/session.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport { type Query, sql } from '~/sql/sql.ts';\n\nexport interface TiDBServerlessSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nfunction tidbBeginOptions(\n\tconfig: MySqlTransactionConfig | undefined,\n): { isolation?: 'READ COMMITTED' | 'REPEATABLE READ' } | undefined {\n\tif (!config) return undefined;\n\tif (config.accessMode !== undefined) {\n\t\tthrow new Error('Access mode transaction config is not supported by driver');\n\t}\n\tif (config.withConsistentSnapshot !== undefined) {\n\t\tthrow new Error('Consistent snapshot transaction config is not supported by driver');\n\t}\n\tswitch (config.isolationLevel) {\n\t\tcase undefined:\n\t\t\treturn undefined;\n\t\tcase 'read committed':\n\t\t\treturn { isolation: 'READ COMMITTED' };\n\t\tcase 'repeatable read':\n\t\t\treturn { isolation: 'REPEATABLE READ' };\n\t\tdefault:\n\t\t\tthrow new Error(`Isolation level '${config.isolationLevel}' is not supported by driver`);\n\t}\n}\n\nexport class TiDBServerlessSession<\n\tTRelations extends AnyRelations,\n> extends MySqlAsyncSession<\n\tTiDBServerlessQueryResultHKT,\n\tTRelations\n> {\n\tstatic override readonly [entityKind]: string = 'TiDBServerlessSession';\n\n\tprivate logger: Logger;\n\tprivate client: Tx | Connection;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate baseClient: Connection,\n\t\tdialect: MySqlDialect,\n\t\ttx: Tx | undefined,\n\t\tprivate relations: TRelations,\n\t\tprivate options: TiDBServerlessSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.client = tx ?? baseClient;\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends MySqlPreparedQueryConfig = MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tmapper?: (response: Record<string, unknown>[] | unknown[][] | { insertId: number; affectedRows: number }) => 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): MySqlAsyncPreparedQuery<T> {\n\t\tconst { client } = this;\n\t\tconst queryConfig = mode === 'arrays'\n\t\t\t? { arrayMode: true }\n\t\t\t: { fullResult: true };\n\n\t\tconst executor = async (params: any[] = []) => {\n\t\t\tconst raw = client.execute(\n\t\t\t\tquery.sql,\n\t\t\t\tparams,\n\t\t\t\tqueryConfig,\n\t\t\t);\n\n\t\t\tif (mode === 'arrays') return raw;\n\t\t\tif (mode === 'objects') return raw.then((res) => (<FullResult> res).rows);\n\t\t\tif (!mapper) return raw;\n\n\t\t\treturn raw.then((res) => ({\n\t\t\t\tinsertId: (<FullResult> res).lastInsertId ?? 0,\n\t\t\t\taffectedRows: (<FullResult> res).rowsAffected ?? 0,\n\t\t\t}));\n\t\t};\n\n\t\treturn new MySqlAsyncPreparedQuery(\n\t\t\texecutor,\n\t\t\tundefined,\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 async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TRelations>) => Promise<T>,\n\t\tconfig?: MySqlTransactionConfig,\n\t): Promise<T> {\n\t\tconst nativeTx = await this.baseClient.begin(tidbBeginOptions(config));\n\t\ttry {\n\t\t\tconst session = new TiDBServerlessSession(\n\t\t\t\tthis.baseClient,\n\t\t\t\tthis.dialect,\n\t\t\t\tnativeTx,\n\t\t\t\tthis.relations,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tconst tx = new TiDBServerlessTransaction<TRelations>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession as MySqlAsyncSession<any, any>,\n\t\t\t\tthis.relations,\n\t\t\t);\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait nativeTx.commit();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait nativeTx.rollback();\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class TiDBServerlessTransaction<\n\tTRelations extends AnyRelations,\n> extends MySqlAsyncTransaction<\n\tTiDBServerlessQueryResultHKT,\n\tTRelations\n> {\n\tstatic override readonly [entityKind]: string = 'TiDBServerlessTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlAsyncSession,\n\t\trelations: TRelations,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, relations, nestedIndex);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TRelations>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new TiDBServerlessTransaction<TRelations>(\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 tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface TiDBServerlessQueryResultHKT extends MySqlQueryResultHKT {\n\ttype: FullResult;\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAS,iBACR,QACmE;AACnE,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,OAAO,eAAe,OACzB,OAAM,IAAI,MAAM,4DAA4D;AAE7E,KAAI,OAAO,2BAA2B,OACrC,OAAM,IAAI,MAAM,oEAAoE;AAErF,SAAQ,OAAO,gBAAf;EACC,KAAK,OACJ;EACD,KAAK,iBACJ,QAAO,EAAE,WAAW,kBAAkB;EACvC,KAAK,kBACJ,QAAO,EAAE,WAAW,mBAAmB;EACxC,QACC,OAAM,IAAI,MAAM,oBAAoB,OAAO,eAAe,8BAA8B;;;AAI3F,IAAa,wBAAb,MAAa,8BAEHA,gDAGR;CACD,QAA0BC,0BAAsB;CAEhD,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACC,AAAQ,YACR,SACA,IACA,AAAQ,WACR,AAAQ,UAAwC,EAAE,EACjD;AACD,QAAM,QAAQ;EANN;EAGA;EACA;AAGR,OAAK,SAAS,MAAM;AACpB,OAAK,SAAS,QAAQ,UAAU,IAAIC,wBAAY;AAChD,OAAK,QAAQ,QAAQ,SAAS,IAAIC,iCAAW;;CAG9C,aACC,OACA,MACA,QACA,eAIA,aAC6B;EAC7B,MAAM,EAAE,WAAW;EACnB,MAAM,cAAc,SAAS,WAC1B,EAAE,WAAW,MAAM,GACnB,EAAE,YAAY,MAAM;EAEvB,MAAM,WAAW,OAAO,SAAgB,EAAE,KAAK;GAC9C,MAAM,MAAM,OAAO,QAClB,MAAM,KACN,QACA,YACA;AAED,OAAI,SAAS,SAAU,QAAO;AAC9B,OAAI,SAAS,UAAW,QAAO,IAAI,MAAM,QAAsB,IAAK,KAAK;AACzE,OAAI,CAAC,OAAQ,QAAO;AAEpB,UAAO,IAAI,MAAM,SAAS;IACzB,UAAwB,IAAK,gBAAgB;IAC7C,cAA4B,IAAK,gBAAgB;IACjD,EAAE;;AAGJ,SAAO,IAAIC,sDACV,UACA,QACA,OACA,QACA,MACA,KAAK,QACL,KAAK,OACL,eACA,YACA;;CAGF,MAAe,YACd,aACA,QACa;EACb,MAAM,WAAW,MAAM,KAAK,WAAW,MAAM,iBAAiB,OAAO,CAAC;AACtE,MAAI;GACH,MAAM,UAAU,IAAI,sBACnB,KAAK,YACL,KAAK,SACL,UACA,KAAK,WACL,KAAK,QACL;GAMD,MAAM,SAAS,MAAM,YALV,IAAI,0BACd,KAAK,SACL,SACA,KAAK,UACL,CACmC;AACpC,SAAM,SAAS,QAAQ;AACvB,UAAO;WACC,KAAK;AACb,SAAM,SAAS,UAAU;AACzB,SAAM;;;;AAKT,IAAa,4BAAb,MAAa,kCAEHC,oDAGR;CACD,QAA0BJ,0BAAsB;CAEhD,YACC,SACA,SACA,WACA,cAAc,GACb;AACD,QAAM,SAAS,SAAS,WAAW,YAAY;;CAGhD,MAAe,YACd,aACa;EACb,MAAM,gBAAgB,KAAK,KAAK,cAAc;EAC9C,MAAM,KAAK,IAAI,0BACd,KAAK,SACL,KAAK,SACL,KAAK,WACL,KAAK,cAAc,EACnB;AACD,QAAM,GAAG,QAAQK,iBAAI,IAAI,aAAa,gBAAgB,CAAC;AACvD,MAAI;GACH,MAAM,SAAS,MAAM,YAAY,GAAG;AACpC,SAAM,GAAG,QAAQA,iBAAI,IAAI,qBAAqB,gBAAgB,CAAC;AAC/D,UAAO;WACC,KAAK;AACb,SAAM,GAAG,QAAQA,iBAAI,IAAI,yBAAyB,gBAAgB,CAAC;AACnE,SAAM"}