@@ -44,6 +44,7 @@ import {
44
44
makeStateMachine ,
45
45
now ,
46
46
ns ,
47
+ promiseWithResolvers ,
47
48
shuffle ,
48
49
TimeoutController
49
50
} from '../utils' ;
@@ -105,7 +106,8 @@ export interface ServerSelectionRequest {
105
106
mongoLogger : MongoLogger | undefined ;
106
107
transaction ?: Transaction ;
107
108
startTime : number ;
108
- callback : ServerSelectionCallback ;
109
+ resolve : ( server : Server ) => void ;
110
+ reject : ( reason ?: any ) => void ;
109
111
[ kCancelled ] ?: boolean ;
110
112
timeoutController : TimeoutController ;
111
113
operationName : string ;
@@ -238,11 +240,6 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
238
240
/** @event */
239
241
static readonly TIMEOUT = TIMEOUT ;
240
242
241
- selectServerAsync : (
242
- selector : string | ReadPreference | ServerSelector ,
243
- options : SelectServerOptions
244
- ) => Promise < Server > ;
245
-
246
243
/**
247
244
* @param seedlist - a list of HostAddress instances to connect to
248
245
*/
@@ -254,14 +251,6 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
254
251
super ( ) ;
255
252
256
253
this . client = client ;
257
- this . selectServerAsync = promisify (
258
- (
259
- selector : string | ReadPreference | ServerSelector ,
260
- options : SelectServerOptions ,
261
- callback : ( e : Error , r : Server ) => void
262
- ) => this . selectServer ( selector , options , callback as any )
263
- ) ;
264
-
265
254
// Options should only be undefined in tests, MongoClient will always have defined options
266
255
options = options ?? {
267
256
hosts : [ HostAddress . fromString ( 'localhost:27017' ) ] ,
@@ -464,15 +453,9 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
464
453
465
454
const readPreference = options . readPreference ?? ReadPreference . primary ;
466
455
const selectServerOptions = { operationName : 'ping' , ...options } ;
467
- this . selectServer (
468
- readPreferenceServerSelector ( readPreference ) ,
469
- selectServerOptions ,
470
- ( err , server ) => {
471
- if ( err ) {
472
- this . close ( ) ;
473
- return exitWithError ( err ) ;
474
- }
475
456
457
+ this . selectServer ( readPreferenceServerSelector ( readPreference ) , selectServerOptions ) . then (
458
+ server => {
476
459
const skipPingOnConnect = this . s . options [ Symbol . for ( '@@mdb.skipPingOnConnect' ) ] === true ;
477
460
if ( ! skipPingOnConnect && server && this . s . credentials ) {
478
461
server . command ( ns ( 'admin.$cmd' ) , { ping : 1 } , { } ) . then ( ( ) => {
@@ -491,6 +474,9 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
491
474
this . emit ( Topology . CONNECT , this ) ;
492
475
493
476
callback ?.( undefined , this ) ;
477
+ } ,
478
+ error => {
479
+ return this . close ( { force : false } , ( ) => exitWithError ( error ) ) ;
494
480
}
495
481
) ;
496
482
}
@@ -533,11 +519,10 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
533
519
* @param callback - The callback used to indicate success or failure
534
520
* @returns An instance of a `Server` meeting the criteria of the predicate provided
535
521
*/
536
- selectServer (
522
+ async selectServer (
537
523
selector : string | ReadPreference | ServerSelector ,
538
- options : SelectServerOptions ,
539
- callback : Callback < Server >
540
- ) : void {
524
+ options : SelectServerOptions
525
+ ) : Promise < Server > {
541
526
let serverSelector ;
542
527
if ( typeof selector !== 'function' ) {
543
528
if ( typeof selector === 'string' ) {
@@ -588,16 +573,17 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
588
573
)
589
574
) ;
590
575
}
591
- callback ( undefined , transaction . server ) ;
592
- return ;
576
+ return transaction . server ;
593
577
}
594
578
579
+ const { promise : serverPromise , resolve, reject } = promiseWithResolvers < Server > ( ) ;
595
580
const waitQueueMember : ServerSelectionRequest = {
596
581
serverSelector,
597
582
topologyDescription : this . description ,
598
583
mongoLogger : this . client . mongoLogger ,
599
584
transaction,
600
- callback,
585
+ resolve,
586
+ reject,
601
587
timeoutController : new TimeoutController ( options . serverSelectionTimeoutMS ) ,
602
588
startTime : now ( ) ,
603
589
operationName : options . operationName ,
@@ -628,13 +614,14 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
628
614
)
629
615
) ;
630
616
}
631
- waitQueueMember . callback ( timeoutError ) ;
617
+ waitQueueMember . reject ( timeoutError ) ;
632
618
} ) ;
633
619
634
620
this [ kWaitQueue ] . push ( waitQueueMember ) ;
635
621
processWaitQueue ( this ) ;
636
- }
637
622
623
+ return serverPromise ;
624
+ }
638
625
/**
639
626
* Update the internal TopologyDescription with a ServerDescription
640
627
*
@@ -911,7 +898,7 @@ function drainWaitQueue(queue: List<ServerSelectionRequest>, err?: MongoDriverEr
911
898
) ;
912
899
}
913
900
}
914
- waitQueueMember . callback ( err ) ;
901
+ waitQueueMember . reject ( err ) ;
915
902
}
916
903
}
917
904
}
@@ -964,7 +951,7 @@ function processWaitQueue(topology: Topology) {
964
951
)
965
952
) ;
966
953
}
967
- waitQueueMember . callback ( e ) ;
954
+ waitQueueMember . reject ( e ) ;
968
955
continue ;
969
956
}
970
957
@@ -1027,7 +1014,7 @@ function processWaitQueue(topology: Topology) {
1027
1014
)
1028
1015
) ;
1029
1016
}
1030
- waitQueueMember . callback ( error ) ;
1017
+ waitQueueMember . reject ( error ) ;
1031
1018
return ;
1032
1019
}
1033
1020
const transaction = waitQueueMember . transaction ;
@@ -1053,7 +1040,7 @@ function processWaitQueue(topology: Topology) {
1053
1040
)
1054
1041
) ;
1055
1042
}
1056
- waitQueueMember . callback ( undefined , selectedServer ) ;
1043
+ waitQueueMember . resolve ( selectedServer ) ;
1057
1044
}
1058
1045
1059
1046
if ( topology [ kWaitQueue ] . length > 0 ) {
0 commit comments