You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							195 lines
						
					
					
						
							7.9 KiB
						
					
					
				
			
		
		
	
	
							195 lines
						
					
					
						
							7.9 KiB
						
					
					
				| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.ReadPreference = exports.ReadPreferenceMode = void 0;
 | |
| const error_1 = require("./error");
 | |
| /** @public */
 | |
| exports.ReadPreferenceMode = Object.freeze({
 | |
|     primary: 'primary',
 | |
|     primaryPreferred: 'primaryPreferred',
 | |
|     secondary: 'secondary',
 | |
|     secondaryPreferred: 'secondaryPreferred',
 | |
|     nearest: 'nearest'
 | |
| });
 | |
| /**
 | |
|  * The **ReadPreference** class is a class that represents a MongoDB ReadPreference and is
 | |
|  * used to construct connections.
 | |
|  * @public
 | |
|  *
 | |
|  * @see https://docs.mongodb.com/manual/core/read-preference/
 | |
|  */
 | |
| class ReadPreference {
 | |
|     /**
 | |
|      * @param mode - A string describing the read preference mode (primary|primaryPreferred|secondary|secondaryPreferred|nearest)
 | |
|      * @param tags - A tag set used to target reads to members with the specified tag(s). tagSet is not available if using read preference mode primary.
 | |
|      * @param options - Additional read preference options
 | |
|      */
 | |
|     constructor(mode, tags, options) {
 | |
|         if (!ReadPreference.isValid(mode)) {
 | |
|             throw new error_1.MongoInvalidArgumentError(`Invalid read preference mode ${JSON.stringify(mode)}`);
 | |
|         }
 | |
|         if (options == null && typeof tags === 'object' && !Array.isArray(tags)) {
 | |
|             options = tags;
 | |
|             tags = undefined;
 | |
|         }
 | |
|         else if (tags && !Array.isArray(tags)) {
 | |
|             throw new error_1.MongoInvalidArgumentError('ReadPreference tags must be an array');
 | |
|         }
 | |
|         this.mode = mode;
 | |
|         this.tags = tags;
 | |
|         this.hedge = options?.hedge;
 | |
|         this.maxStalenessSeconds = undefined;
 | |
|         this.minWireVersion = undefined;
 | |
|         options = options ?? {};
 | |
|         if (options.maxStalenessSeconds != null) {
 | |
|             if (options.maxStalenessSeconds <= 0) {
 | |
|                 throw new error_1.MongoInvalidArgumentError('maxStalenessSeconds must be a positive integer');
 | |
|             }
 | |
|             this.maxStalenessSeconds = options.maxStalenessSeconds;
 | |
|             // NOTE: The minimum required wire version is 5 for this read preference. If the existing
 | |
|             //       topology has a lower value then a MongoError will be thrown during server selection.
 | |
|             this.minWireVersion = 5;
 | |
|         }
 | |
|         if (this.mode === ReadPreference.PRIMARY) {
 | |
|             if (this.tags && Array.isArray(this.tags) && this.tags.length > 0) {
 | |
|                 throw new error_1.MongoInvalidArgumentError('Primary read preference cannot be combined with tags');
 | |
|             }
 | |
|             if (this.maxStalenessSeconds) {
 | |
|                 throw new error_1.MongoInvalidArgumentError('Primary read preference cannot be combined with maxStalenessSeconds');
 | |
|             }
 | |
|             if (this.hedge) {
 | |
|                 throw new error_1.MongoInvalidArgumentError('Primary read preference cannot be combined with hedge');
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     // Support the deprecated `preference` property introduced in the porcelain layer
 | |
|     get preference() {
 | |
|         return this.mode;
 | |
|     }
 | |
|     static fromString(mode) {
 | |
|         return new ReadPreference(mode);
 | |
|     }
 | |
|     /**
 | |
|      * Construct a ReadPreference given an options object.
 | |
|      *
 | |
|      * @param options - The options object from which to extract the read preference.
 | |
|      */
 | |
|     static fromOptions(options) {
 | |
|         if (!options)
 | |
|             return;
 | |
|         const readPreference = options.readPreference ?? options.session?.transaction.options.readPreference;
 | |
|         const readPreferenceTags = options.readPreferenceTags;
 | |
|         if (readPreference == null) {
 | |
|             return;
 | |
|         }
 | |
|         if (typeof readPreference === 'string') {
 | |
|             return new ReadPreference(readPreference, readPreferenceTags, {
 | |
|                 maxStalenessSeconds: options.maxStalenessSeconds,
 | |
|                 hedge: options.hedge
 | |
|             });
 | |
|         }
 | |
|         else if (!(readPreference instanceof ReadPreference) && typeof readPreference === 'object') {
 | |
|             const mode = readPreference.mode || readPreference.preference;
 | |
|             if (mode && typeof mode === 'string') {
 | |
|                 return new ReadPreference(mode, readPreference.tags ?? readPreferenceTags, {
 | |
|                     maxStalenessSeconds: readPreference.maxStalenessSeconds,
 | |
|                     hedge: options.hedge
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
|         if (readPreferenceTags) {
 | |
|             readPreference.tags = readPreferenceTags;
 | |
|         }
 | |
|         return readPreference;
 | |
|     }
 | |
|     /**
 | |
|      * Replaces options.readPreference with a ReadPreference instance
 | |
|      */
 | |
|     static translate(options) {
 | |
|         if (options.readPreference == null)
 | |
|             return options;
 | |
|         const r = options.readPreference;
 | |
|         if (typeof r === 'string') {
 | |
|             options.readPreference = new ReadPreference(r);
 | |
|         }
 | |
|         else if (r && !(r instanceof ReadPreference) && typeof r === 'object') {
 | |
|             const mode = r.mode || r.preference;
 | |
|             if (mode && typeof mode === 'string') {
 | |
|                 options.readPreference = new ReadPreference(mode, r.tags, {
 | |
|                     maxStalenessSeconds: r.maxStalenessSeconds
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
|         else if (!(r instanceof ReadPreference)) {
 | |
|             throw new error_1.MongoInvalidArgumentError(`Invalid read preference: ${r}`);
 | |
|         }
 | |
|         return options;
 | |
|     }
 | |
|     /**
 | |
|      * Validate if a mode is legal
 | |
|      *
 | |
|      * @param mode - The string representing the read preference mode.
 | |
|      */
 | |
|     static isValid(mode) {
 | |
|         const VALID_MODES = new Set([
 | |
|             ReadPreference.PRIMARY,
 | |
|             ReadPreference.PRIMARY_PREFERRED,
 | |
|             ReadPreference.SECONDARY,
 | |
|             ReadPreference.SECONDARY_PREFERRED,
 | |
|             ReadPreference.NEAREST,
 | |
|             null
 | |
|         ]);
 | |
|         return VALID_MODES.has(mode);
 | |
|     }
 | |
|     /**
 | |
|      * Validate if a mode is legal
 | |
|      *
 | |
|      * @param mode - The string representing the read preference mode.
 | |
|      */
 | |
|     isValid(mode) {
 | |
|         return ReadPreference.isValid(typeof mode === 'string' ? mode : this.mode);
 | |
|     }
 | |
|     /**
 | |
|      * Indicates that this readPreference needs the "SecondaryOk" bit when sent over the wire
 | |
|      * @see https://docs.mongodb.com/manual/reference/mongodb-wire-protocol/#op-query
 | |
|      */
 | |
|     secondaryOk() {
 | |
|         const NEEDS_SECONDARYOK = new Set([
 | |
|             ReadPreference.PRIMARY_PREFERRED,
 | |
|             ReadPreference.SECONDARY,
 | |
|             ReadPreference.SECONDARY_PREFERRED,
 | |
|             ReadPreference.NEAREST
 | |
|         ]);
 | |
|         return NEEDS_SECONDARYOK.has(this.mode);
 | |
|     }
 | |
|     /**
 | |
|      * Check if the two ReadPreferences are equivalent
 | |
|      *
 | |
|      * @param readPreference - The read preference with which to check equality
 | |
|      */
 | |
|     equals(readPreference) {
 | |
|         return readPreference.mode === this.mode;
 | |
|     }
 | |
|     /** Return JSON representation */
 | |
|     toJSON() {
 | |
|         const readPreference = { mode: this.mode };
 | |
|         if (Array.isArray(this.tags))
 | |
|             readPreference.tags = this.tags;
 | |
|         if (this.maxStalenessSeconds)
 | |
|             readPreference.maxStalenessSeconds = this.maxStalenessSeconds;
 | |
|         if (this.hedge)
 | |
|             readPreference.hedge = this.hedge;
 | |
|         return readPreference;
 | |
|     }
 | |
| }
 | |
| exports.ReadPreference = ReadPreference;
 | |
| ReadPreference.PRIMARY = exports.ReadPreferenceMode.primary;
 | |
| ReadPreference.PRIMARY_PREFERRED = exports.ReadPreferenceMode.primaryPreferred;
 | |
| ReadPreference.SECONDARY = exports.ReadPreferenceMode.secondary;
 | |
| ReadPreference.SECONDARY_PREFERRED = exports.ReadPreferenceMode.secondaryPreferred;
 | |
| ReadPreference.NEAREST = exports.ReadPreferenceMode.nearest;
 | |
| ReadPreference.primary = new ReadPreference(exports.ReadPreferenceMode.primary);
 | |
| ReadPreference.primaryPreferred = new ReadPreference(exports.ReadPreferenceMode.primaryPreferred);
 | |
| ReadPreference.secondary = new ReadPreference(exports.ReadPreferenceMode.secondary);
 | |
| ReadPreference.secondaryPreferred = new ReadPreference(exports.ReadPreferenceMode.secondaryPreferred);
 | |
| ReadPreference.nearest = new ReadPreference(exports.ReadPreferenceMode.nearest);
 | |
| //# sourceMappingURL=read_preference.js.map
 |