@@ -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 ;
@@ -237,11 +239,6 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
237
239
/** @event */
238
240
static readonly TIMEOUT = TIMEOUT ;
239
241
240
- selectServerAsync : (
241
- selector : string | ReadPreference | ServerSelector ,
242
- options : SelectServerOptions
243
- ) => Promise < Server > ;
244
-
245
242
/**
246
243
* @param seedlist - a list of HostAddress instances to connect to
247
244
*/
@@ -253,14 +250,6 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
253
250
super ( ) ;
254
251
255
252
this . client = client ;
256
- this . selectServerAsync = promisify (
257
- (
258
- selector : string | ReadPreference | ServerSelector ,
259
- options : SelectServerOptions ,
260
- callback : ( e : Error , r : Server ) => void
261
- ) => this . selectServer ( selector , options , callback as any )
262
- ) ;
263
-
264
253
// Options should only be undefined in tests, MongoClient will always have defined options
265
254
options = options ?? {
266
255
hosts : [ HostAddress . fromString ( 'localhost:27017' ) ] ,
@@ -463,14 +452,9 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
463
452
464
453
const readPreference = options . readPreference ?? ReadPreference . primary ;
465
454
const selectServerOptions = { operationName : 'ping' , ...options } ;
466
- this . selectServer (
467
- readPreferenceServerSelector ( readPreference ) ,
468
- selectServerOptions ,
469
- ( err , server ) => {
470
- if ( err ) {
471
- return this . close ( { force : false } , ( ) => exitWithError ( err ) ) ;
472
- }
473
455
456
+ this . selectServer ( readPreferenceServerSelector ( readPreference ) , selectServerOptions ) . then (
457
+ server => {
474
458
const skipPingOnConnect = this . s . options [ Symbol . for ( '@@mdb.skipPingOnConnect' ) ] === true ;
475
459
if ( ! skipPingOnConnect && server && this . s . credentials ) {
476
460
server . command ( ns ( 'admin.$cmd' ) , { ping : 1 } , { } ) . then ( ( ) => {
@@ -489,6 +473,9 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
489
473
this . emit ( Topology . CONNECT , this ) ;
490
474
491
475
callback ?.( undefined , this ) ;
476
+ } ,
477
+ error => {
478
+ return this . close ( { force : false } , ( ) => exitWithError ( error ) ) ;
492
479
}
493
480
) ;
494
481
}
@@ -539,11 +526,10 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
539
526
* @param callback - The callback used to indicate success or failure
540
527
* @returns An instance of a `Server` meeting the criteria of the predicate provided
541
528
*/
542
- selectServer (
529
+ async selectServer (
543
530
selector : string | ReadPreference | ServerSelector ,
544
- options : SelectServerOptions ,
545
- callback : Callback < Server >
546
- ) : void {
531
+ options : SelectServerOptions
532
+ ) : Promise < Server > {
547
533
let serverSelector ;
548
534
if ( typeof selector !== 'function' ) {
549
535
if ( typeof selector === 'string' ) {
@@ -594,16 +580,17 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
594
580
)
595
581
) ;
596
582
}
597
- callback ( undefined , transaction . server ) ;
598
- return ;
583
+ return transaction . server ;
599
584
}
600
585
586
+ const { promise : serverPromise , resolve, reject } = promiseWithResolvers < Server > ( ) ;
601
587
const waitQueueMember : ServerSelectionRequest = {
602
588
serverSelector,
603
589
topologyDescription : this . description ,
604
590
mongoLogger : this . client . mongoLogger ,
605
591
transaction,
606
- callback,
592
+ resolve,
593
+ reject,
607
594
timeoutController : new TimeoutController ( options . serverSelectionTimeoutMS ) ,
608
595
startTime : now ( ) ,
609
596
operationName : options . operationName ,
@@ -634,13 +621,14 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
634
621
)
635
622
) ;
636
623
}
637
- waitQueueMember . callback ( timeoutError ) ;
624
+ waitQueueMember . reject ( timeoutError ) ;
638
625
} ) ;
639
626
640
627
this [ kWaitQueue ] . push ( waitQueueMember ) ;
641
628
processWaitQueue ( this ) ;
642
- }
643
629
630
+ return serverPromise ;
631
+ }
644
632
/**
645
633
* Update the internal TopologyDescription with a ServerDescription
646
634
*
@@ -927,7 +915,7 @@ function drainWaitQueue(queue: List<ServerSelectionRequest>, err?: MongoDriverEr
927
915
) ;
928
916
}
929
917
}
930
- waitQueueMember . callback ( err ) ;
918
+ waitQueueMember . reject ( err ) ;
931
919
}
932
920
}
933
921
}
@@ -980,7 +968,7 @@ function processWaitQueue(topology: Topology) {
980
968
)
981
969
) ;
982
970
}
983
- waitQueueMember . callback ( e ) ;
971
+ waitQueueMember . reject ( e ) ;
984
972
continue ;
985
973
}
986
974
@@ -1043,7 +1031,7 @@ function processWaitQueue(topology: Topology) {
1043
1031
)
1044
1032
) ;
1045
1033
}
1046
- waitQueueMember . callback ( error ) ;
1034
+ waitQueueMember . reject ( error ) ;
1047
1035
return ;
1048
1036
}
1049
1037
const transaction = waitQueueMember . transaction ;
@@ -1069,7 +1057,7 @@ function processWaitQueue(topology: Topology) {
1069
1057
)
1070
1058
) ;
1071
1059
}
1072
- waitQueueMember . callback ( undefined , selectedServer ) ;
1060
+ waitQueueMember . resolve ( selectedServer ) ;
1073
1061
}
1074
1062
1075
1063
if ( topology [ kWaitQueue ] . length > 0 ) {
0 commit comments