@@ -15,10 +15,13 @@ export type SQL = <T extends any[] = unknown[], P extends any[] = unknown[]>(
15
15
...values : P
16
16
) => Query < T >
17
17
18
+ export type RegisterPrecommitHook = ( fn : ( ) => Promise < void > | void ) => void ;
19
+
18
20
export type TX = SQL & {
19
21
nodeId : bigint
20
22
sessionId : string
21
23
transactionId : string
24
+ registerPrecommitHook : RegisterPrecommitHook
22
25
}
23
26
24
27
interface SessionContextCallback < T > {
@@ -166,9 +169,24 @@ export function query(driver: Driver): QueryClient {
166
169
store . transactionId = beginTransactionResult . txMeta ?. id
167
170
168
171
try {
169
- let tx = Object . assign ( yqlQuery , { nodeId : store . nodeId , sessionId : store . sessionId , transactionId : store . transactionId } ) as TX
172
+ let tx = Object . assign ( yqlQuery , {
173
+ nodeId : store . nodeId ,
174
+ sessionId : store . sessionId ,
175
+ transactionId : store . transactionId ,
176
+ registerPrecommitHook : ( fn : ( ) => Promise < void > | void ) => {
177
+ if ( ! store . precommitHooks ) store . precommitHooks = [ ] ;
178
+ store . precommitHooks . push ( fn ) ;
179
+ } ,
180
+ } ) as TX
170
181
let result = await ctx . run ( store , ( ) => caller ! ( tx , signal ) )
171
182
183
+ // --- precommit hooks: call before commit ---
184
+ if ( store . precommitHooks && store . precommitHooks . length > 0 ) {
185
+ for ( const hook of store . precommitHooks ) {
186
+ await hook ( ) ;
187
+ }
188
+ }
189
+
172
190
let commitResult = await client . commitTransaction ( { sessionId : store . sessionId , txId : store . transactionId } , { signal } )
173
191
if ( commitResult . status !== StatusIds_StatusCode . SUCCESS ) {
174
192
throw new CommitError ( "Transaction commit failed." , new YDBError ( commitResult . status , commitResult . issues ) )
0 commit comments