@@ -27,7 +27,7 @@ import {
27
27
} from '../error' ;
28
28
import { CancellationToken , TypedEventEmitter } from '../mongo_types' ;
29
29
import type { Server } from '../sdam/server' ;
30
- import { type Callback , eachAsync , List , makeCounter } from '../utils' ;
30
+ import { type Callback , eachAsync , List , makeCounter , TimeoutController } from '../utils' ;
31
31
import { AUTH_PROVIDERS , connect } from './connect' ;
32
32
import { Connection , type ConnectionEvents , type ConnectionOptions } from './connection' ;
33
33
import {
@@ -101,7 +101,7 @@ export interface ConnectionPoolOptions extends Omit<ConnectionOptions, 'id' | 'g
101
101
/** @internal */
102
102
export interface WaitQueueMember {
103
103
callback : Callback < Connection > ;
104
- timer ?: NodeJS . Timeout ;
104
+ timeoutController : TimeoutController ;
105
105
[ kCancelled ] ?: boolean ;
106
106
}
107
107
@@ -356,27 +356,29 @@ export class ConnectionPool extends TypedEventEmitter<ConnectionPoolEvents> {
356
356
new ConnectionCheckOutStartedEvent ( this )
357
357
) ;
358
358
359
- const waitQueueMember : WaitQueueMember = { callback } ;
360
359
const waitQueueTimeoutMS = this . options . waitQueueTimeoutMS ;
361
- if ( waitQueueTimeoutMS ) {
362
- waitQueueMember . timer = setTimeout ( ( ) => {
363
- waitQueueMember [ kCancelled ] = true ;
364
- waitQueueMember . timer = undefined ;
365
360
366
- this . emitAndLog (
367
- ConnectionPool . CONNECTION_CHECK_OUT_FAILED ,
368
- new ConnectionCheckOutFailedEvent ( this , 'timeout' )
369
- ) ;
370
- waitQueueMember . callback (
371
- new WaitQueueTimeoutError (
372
- this . loadBalanced
373
- ? this . waitQueueErrorMetrics ( )
374
- : 'Timed out while checking out a connection from connection pool' ,
375
- this . address
376
- )
377
- ) ;
378
- } , waitQueueTimeoutMS ) ;
379
- }
361
+ const waitQueueMember : WaitQueueMember = {
362
+ callback,
363
+ timeoutController : new TimeoutController ( waitQueueTimeoutMS )
364
+ } ;
365
+ waitQueueMember . timeoutController . signal . addEventListener ( 'abort' , ( ) => {
366
+ waitQueueMember [ kCancelled ] = true ;
367
+ waitQueueMember . timeoutController . clear ( ) ;
368
+
369
+ this . emitAndLog (
370
+ ConnectionPool . CONNECTION_CHECK_OUT_FAILED ,
371
+ new ConnectionCheckOutFailedEvent ( this , 'timeout' )
372
+ ) ;
373
+ waitQueueMember . callback (
374
+ new WaitQueueTimeoutError (
375
+ this . loadBalanced
376
+ ? this . waitQueueErrorMetrics ( )
377
+ : 'Timed out while checking out a connection from connection pool' ,
378
+ this . address
379
+ )
380
+ ) ;
381
+ } ) ;
380
382
381
383
this [ kWaitQueue ] . push ( waitQueueMember ) ;
382
384
process . nextTick ( ( ) => this . processWaitQueue ( ) ) ;
@@ -831,9 +833,7 @@ export class ConnectionPool extends TypedEventEmitter<ConnectionPoolEvents> {
831
833
ConnectionPool . CONNECTION_CHECK_OUT_FAILED ,
832
834
new ConnectionCheckOutFailedEvent ( this , reason , error )
833
835
) ;
834
- if ( waitQueueMember . timer ) {
835
- clearTimeout ( waitQueueMember . timer ) ;
836
- }
836
+ waitQueueMember . timeoutController . clear ( ) ;
837
837
this [ kWaitQueue ] . shift ( ) ;
838
838
waitQueueMember . callback ( error ) ;
839
839
continue ;
@@ -854,9 +854,7 @@ export class ConnectionPool extends TypedEventEmitter<ConnectionPoolEvents> {
854
854
ConnectionPool . CONNECTION_CHECKED_OUT ,
855
855
new ConnectionCheckedOutEvent ( this , connection )
856
856
) ;
857
- if ( waitQueueMember . timer ) {
858
- clearTimeout ( waitQueueMember . timer ) ;
859
- }
857
+ waitQueueMember . timeoutController . clear ( ) ;
860
858
861
859
this [ kWaitQueue ] . shift ( ) ;
862
860
waitQueueMember . callback ( undefined , connection ) ;
@@ -893,9 +891,7 @@ export class ConnectionPool extends TypedEventEmitter<ConnectionPoolEvents> {
893
891
) ;
894
892
}
895
893
896
- if ( waitQueueMember . timer ) {
897
- clearTimeout ( waitQueueMember . timer ) ;
898
- }
894
+ waitQueueMember . timeoutController . clear ( ) ;
899
895
waitQueueMember . callback ( err , connection ) ;
900
896
}
901
897
process . nextTick ( ( ) => this . processWaitQueue ( ) ) ;
0 commit comments