* Returns a copy of this description updated with a given ServerDescription * @internal
(serverDescription: ServerDescription)
| 182 | * @internal |
| 183 | */ |
| 184 | update(serverDescription: ServerDescription): TopologyDescription { |
| 185 | const address = serverDescription.address; |
| 186 | |
| 187 | // potentially mutated values |
| 188 | let { type: topologyType, setName, maxSetVersion, maxElectionId, commonWireVersion } = this; |
| 189 | |
| 190 | const serverType = serverDescription.type; |
| 191 | const serverDescriptions = new Map(this.servers); |
| 192 | |
| 193 | // update common wire version |
| 194 | if (serverDescription.maxWireVersion !== 0) { |
| 195 | if (commonWireVersion === 0) { |
| 196 | commonWireVersion = serverDescription.maxWireVersion; |
| 197 | } else { |
| 198 | commonWireVersion = Math.min(commonWireVersion, serverDescription.maxWireVersion); |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | if ( |
| 203 | typeof serverDescription.setName === 'string' && |
| 204 | typeof setName === 'string' && |
| 205 | serverDescription.setName !== setName |
| 206 | ) { |
| 207 | if (topologyType === TopologyType.Single) { |
| 208 | // "Single" Topology with setName mismatch is direct connection usage, mark unknown do not remove |
| 209 | serverDescription = new ServerDescription(address); |
| 210 | } else { |
| 211 | serverDescriptions.delete(address); |
| 212 | } |
| 213 | } |
| 214 | |
| 215 | // update the actual server description |
| 216 | serverDescriptions.set(address, serverDescription); |
| 217 | |
| 218 | if (topologyType === TopologyType.Single) { |
| 219 | // once we are defined as single, that never changes |
| 220 | return new TopologyDescription( |
| 221 | TopologyType.Single, |
| 222 | serverDescriptions, |
| 223 | setName, |
| 224 | maxSetVersion, |
| 225 | maxElectionId, |
| 226 | commonWireVersion, |
| 227 | { heartbeatFrequencyMS: this.heartbeatFrequencyMS, localThresholdMS: this.localThresholdMS } |
| 228 | ); |
| 229 | } |
| 230 | |
| 231 | if (topologyType === TopologyType.Unknown) { |
| 232 | if (serverType === ServerType.Standalone && this.servers.size !== 1) { |
| 233 | serverDescriptions.delete(address); |
| 234 | } else { |
| 235 | topologyType = topologyTypeForServerType(serverType); |
| 236 | } |
| 237 | } |
| 238 | |
| 239 | if (topologyType === TopologyType.Sharded) { |
| 240 | if (!MONGOS_OR_UNKNOWN.has(serverType)) { |
| 241 | serverDescriptions.delete(address); |
no test coverage detected