1
1
'use strict' ;
2
2
const EventEmitter = require ( 'events' ) ;
3
3
const ServerDescription = require ( './server_description' ) . ServerDescription ;
4
+ const ServerType = require ( './server_description' ) . ServerType ;
4
5
const TopologyDescription = require ( './topology_description' ) . TopologyDescription ;
5
6
const TopologyType = require ( './topology_description' ) . TopologyType ;
6
7
const monitoring = require ( './monitoring' ) ;
@@ -19,7 +20,6 @@ const createCompressionInfo = require('../topologies/shared').createCompressionI
19
20
const isRetryableError = require ( '../error' ) . isRetryableError ;
20
21
const MongoParseError = require ( '../error' ) . MongoParseError ;
21
22
const ClientSession = require ( '../sessions' ) . ClientSession ;
22
- const ServerType = require ( './server_description' ) . ServerType ;
23
23
const createClientInfo = require ( '../topologies/shared' ) . createClientInfo ;
24
24
const MongoError = require ( '../error' ) . MongoError ;
25
25
const resolveClusterTime = require ( '../topologies/shared' ) . resolveClusterTime ;
@@ -122,6 +122,7 @@ class Topology extends EventEmitter {
122
122
options . replicaSet ,
123
123
null ,
124
124
null ,
125
+ null ,
125
126
options
126
127
) ,
127
128
serverSelectionTimeoutMS : options . serverSelectionTimeoutMS ,
@@ -201,7 +202,10 @@ class Topology extends EventEmitter {
201
202
202
203
// otherwise, wait for a server to properly connect based on user provided read preference,
203
204
// or primary.
204
- const readPreference = resolveReadPreference ( options ) ;
205
+
206
+ translateReadPreference ( options ) ;
207
+ const readPreference = options . readPreference || ReadPreference . primary ;
208
+
205
209
this . selectServer ( readPreferenceServerSelector ( readPreference ) , ( err , server ) => {
206
210
if ( err ) {
207
211
if ( typeof callback === 'function' ) {
@@ -486,9 +490,8 @@ class Topology extends EventEmitter {
486
490
( callback = options ) , ( options = { } ) , ( options = options || { } ) ;
487
491
}
488
492
489
- // TODO: type resolution should happen elsewhere
490
- const readPreference = resolveReadPreference ( options ) ;
491
- options = Object . assign ( options , { readPreference } ) ;
493
+ translateReadPreference ( options ) ;
494
+ const readPreference = options . readPreference || ReadPreference . primary ;
492
495
493
496
this . selectServer ( readPreferenceServerSelector ( readPreference ) , ( err , server ) => {
494
497
if ( err ) {
@@ -548,6 +551,7 @@ class Topology extends EventEmitter {
548
551
options = options || { } ;
549
552
const topology = options . topology || this ;
550
553
const CursorClass = options . cursorFactory || this . s . Cursor ;
554
+ translateReadPreference ( options ) ;
551
555
552
556
return new CursorClass ( this . s . bson , ns , cmd , options , topology , this . s . options ) ;
553
557
}
@@ -577,7 +581,10 @@ class Topology extends EventEmitter {
577
581
lastIsMaster ( ) {
578
582
const serverDescriptions = Array . from ( this . description . servers . values ( ) ) ;
579
583
if ( serverDescriptions . length === 0 ) return { } ;
580
- return serverDescriptions . filter ( sd => sd . type !== ServerType . Unknown ) [ 0 ] || { } ;
584
+
585
+ const sd = serverDescriptions . filter ( sd => sd . type !== ServerType . Unknown ) [ 0 ] ;
586
+ const result = sd || { maxWireVersion : this . description . commonWireVersion } ;
587
+ return result ;
581
588
}
582
589
583
590
get logicalSessionTimeoutMinutes ( ) {
@@ -911,17 +918,26 @@ function resetServerState(server, error, options) {
911
918
resetState ( ) ;
912
919
}
913
920
914
- function resolveReadPreference ( options ) {
915
- let readPreference = options . readPreference || new ReadPreference ( 'primary' ) ;
916
- if ( typeof readPreference === 'string' ) {
917
- readPreference = new ReadPreference ( readPreference ) ;
921
+ function translateReadPreference ( options ) {
922
+ if ( options . readPreference == null ) {
923
+ return ;
918
924
}
919
925
920
- if ( ! ( readPreference instanceof ReadPreference ) ) {
921
- throw new MongoError ( 'read preference must be a ReadPreference instance' ) ;
926
+ let r = options . readPreference ;
927
+ if ( typeof r === 'string' ) {
928
+ options . readPreference = new ReadPreference ( r ) ;
929
+ } else if ( r && ! ( r instanceof ReadPreference ) && typeof r === 'object' ) {
930
+ const mode = r . mode || r . preference ;
931
+ if ( mode && typeof mode === 'string' ) {
932
+ options . readPreference = new ReadPreference ( mode , r . tags , {
933
+ maxStalenessSeconds : r . maxStalenessSeconds
934
+ } ) ;
935
+ }
936
+ } else if ( ! ( r instanceof ReadPreference ) ) {
937
+ throw new TypeError ( 'Invalid read preference: ' + r ) ;
922
938
}
923
939
924
- return readPreference ;
940
+ return options ;
925
941
}
926
942
927
943
/**
0 commit comments