@@ -47,7 +47,7 @@ function maxStalenessReducer(readPreference, topologyDescription, servers) {
47
47
}
48
48
49
49
if ( topologyDescription . type === TopologyType . ReplicaSetWithPrimary ) {
50
- const primary = servers . filter ( primaryFilter ) [ 0 ] ;
50
+ const primary = Array . from ( topologyDescription . servers . values ( ) ) . filter ( primaryFilter ) [ 0 ] ;
51
51
return servers . reduce ( ( result , server ) => {
52
52
const stalenessMS =
53
53
server . lastUpdateTime -
@@ -196,50 +196,32 @@ function readPreferenceServerSelector(readPreference) {
196
196
return latencyWindowReducer ( topologyDescription , servers . filter ( knownFilter ) ) ;
197
197
}
198
198
199
- if ( readPreference . mode === ReadPreference . PRIMARY ) {
199
+ const mode = readPreference . mode ;
200
+ if ( mode === ReadPreference . PRIMARY ) {
200
201
return servers . filter ( primaryFilter ) ;
201
202
}
202
203
203
- if ( readPreference . mode === ReadPreference . SECONDARY ) {
204
- return latencyWindowReducer (
205
- topologyDescription ,
206
- tagSetReducer (
207
- readPreference ,
208
- maxStalenessReducer ( readPreference , topologyDescription , servers )
209
- )
210
- ) . filter ( secondaryFilter ) ;
211
- } else if ( readPreference . mode === ReadPreference . NEAREST ) {
212
- return latencyWindowReducer (
213
- topologyDescription ,
214
- tagSetReducer (
215
- readPreference ,
216
- maxStalenessReducer ( readPreference , topologyDescription , servers )
217
- )
218
- ) . filter ( nearestFilter ) ;
219
- } else if ( readPreference . mode === ReadPreference . SECONDARY_PREFERRED ) {
220
- const result = latencyWindowReducer (
221
- topologyDescription ,
222
- tagSetReducer (
223
- readPreference ,
224
- maxStalenessReducer ( readPreference , topologyDescription , servers )
225
- )
226
- ) . filter ( secondaryFilter ) ;
227
-
228
- return result . length === 0 ? servers . filter ( primaryFilter ) : result ;
229
- } else if ( readPreference . mode === ReadPreference . PRIMARY_PREFERRED ) {
204
+ if ( mode === ReadPreference . PRIMARY_PREFERRED ) {
230
205
const result = servers . filter ( primaryFilter ) ;
231
206
if ( result . length ) {
232
207
return result ;
233
208
}
209
+ }
210
+
211
+ const filter = mode === ReadPreference . NEAREST ? nearestFilter : secondaryFilter ;
212
+ const selectedServers = latencyWindowReducer (
213
+ topologyDescription ,
214
+ tagSetReducer (
215
+ readPreference ,
216
+ maxStalenessReducer ( readPreference , topologyDescription , servers . filter ( filter ) )
217
+ )
218
+ ) ;
234
219
235
- return latencyWindowReducer (
236
- topologyDescription ,
237
- tagSetReducer (
238
- readPreference ,
239
- maxStalenessReducer ( readPreference , topologyDescription , servers )
240
- )
241
- ) . filter ( secondaryFilter ) ;
220
+ if ( mode === ReadPreference . SECONDARY_PREFERRED && selectedServers . length === 0 ) {
221
+ return servers . filter ( primaryFilter ) ;
242
222
}
223
+
224
+ return selectedServers ;
243
225
} ;
244
226
}
245
227
0 commit comments