@@ -588,7 +588,7 @@ function userExplicitlyEndedTransaction(session: ClientSession) {
588
588
return USER_EXPLICIT_TXN_END_STATES . has ( session . transaction . state ) ;
589
589
}
590
590
591
- function attemptTransaction < T > (
591
+ async function attemptTransaction < T > (
592
592
session : ClientSession ,
593
593
startTime : number ,
594
594
fn : WithTransactionCallback < T > ,
@@ -604,44 +604,37 @@ function attemptTransaction<T>(
604
604
}
605
605
606
606
if ( ! isPromiseLike ( promise ) ) {
607
- session . abortTransaction ( ) . catch ( ( ) => null ) ;
608
- return Promise . reject (
607
+ await session . abortTransaction ( ) . catch ( ( ) => null ) ;
608
+ return await Promise . reject (
609
609
new MongoInvalidArgumentError ( 'Function provided to `withTransaction` must return a Promise' )
610
610
) ;
611
611
}
612
612
613
- return promise . then (
614
- result => {
615
- if ( userExplicitlyEndedTransaction ( session ) ) {
616
- return result ;
617
- }
618
-
619
- return attemptTransactionCommit ( session , startTime , fn , result , options ) ;
620
- } ,
621
- err => {
622
- function maybeRetryOrThrow ( err : MongoError ) : Promise < any > {
623
- if (
624
- err instanceof MongoError &&
625
- err . hasErrorLabel ( MongoErrorLabel . TransientTransactionError ) &&
626
- hasNotTimedOut ( startTime , MAX_WITH_TRANSACTION_TIMEOUT )
627
- ) {
628
- return attemptTransaction ( session , startTime , fn , options ) ;
629
- }
630
-
631
- if ( isMaxTimeMSExpiredError ( err ) ) {
632
- err . addErrorLabel ( MongoErrorLabel . UnknownTransactionCommitResult ) ;
633
- }
634
-
635
- throw err ;
636
- }
613
+ try {
614
+ const result = await promise ;
615
+ if ( userExplicitlyEndedTransaction ( session ) ) {
616
+ return result ;
617
+ }
618
+ return await attemptTransactionCommit ( session , startTime , fn , result , options ) ;
619
+ } catch ( err ) {
620
+ if ( session . inTransaction ( ) ) {
621
+ await session . abortTransaction ( ) ;
622
+ }
637
623
638
- if ( session . inTransaction ( ) ) {
639
- return session . abortTransaction ( ) . then ( ( ) => maybeRetryOrThrow ( err ) ) ;
640
- }
624
+ if (
625
+ err instanceof MongoError &&
626
+ err . hasErrorLabel ( MongoErrorLabel . TransientTransactionError ) &&
627
+ hasNotTimedOut ( startTime , MAX_WITH_TRANSACTION_TIMEOUT )
628
+ ) {
629
+ return await attemptTransaction ( session , startTime , fn , options ) ;
630
+ }
641
631
642
- return maybeRetryOrThrow ( err ) ;
632
+ if ( isMaxTimeMSExpiredError ( err ) ) {
633
+ err . addErrorLabel ( MongoErrorLabel . UnknownTransactionCommitResult ) ;
643
634
}
644
- ) ;
635
+
636
+ throw err ;
637
+ }
645
638
}
646
639
647
640
const endTransactionAsync = promisify (
0 commit comments