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.
		
		
		
		
		
			
		
			
				
					
					
						
							78 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
	
	
							78 lines
						
					
					
						
							3.4 KiB
						
					
					
				"use strict";
 | 
						|
Object.defineProperty(exports, "__esModule", { value: true });
 | 
						|
exports.CommandOperation = void 0;
 | 
						|
const error_1 = require("../error");
 | 
						|
const explain_1 = require("../explain");
 | 
						|
const read_concern_1 = require("../read_concern");
 | 
						|
const server_selection_1 = require("../sdam/server_selection");
 | 
						|
const utils_1 = require("../utils");
 | 
						|
const write_concern_1 = require("../write_concern");
 | 
						|
const operation_1 = require("./operation");
 | 
						|
/** @internal */
 | 
						|
class CommandOperation extends operation_1.AbstractOperation {
 | 
						|
    constructor(parent, options) {
 | 
						|
        super(options);
 | 
						|
        this.options = options ?? {};
 | 
						|
        // NOTE: this was explicitly added for the add/remove user operations, it's likely
 | 
						|
        //       something we'd want to reconsider. Perhaps those commands can use `Admin`
 | 
						|
        //       as a parent?
 | 
						|
        const dbNameOverride = options?.dbName || options?.authdb;
 | 
						|
        if (dbNameOverride) {
 | 
						|
            this.ns = new utils_1.MongoDBNamespace(dbNameOverride, '$cmd');
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            this.ns = parent
 | 
						|
                ? parent.s.namespace.withCollection('$cmd')
 | 
						|
                : new utils_1.MongoDBNamespace('admin', '$cmd');
 | 
						|
        }
 | 
						|
        this.readConcern = read_concern_1.ReadConcern.fromOptions(options);
 | 
						|
        this.writeConcern = write_concern_1.WriteConcern.fromOptions(options);
 | 
						|
        if (this.hasAspect(operation_1.Aspect.EXPLAINABLE)) {
 | 
						|
            this.explain = explain_1.Explain.fromOptions(options);
 | 
						|
        }
 | 
						|
        else if (options?.explain != null) {
 | 
						|
            throw new error_1.MongoInvalidArgumentError(`Option "explain" is not supported on this command`);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    get canRetryWrite() {
 | 
						|
        if (this.hasAspect(operation_1.Aspect.EXPLAINABLE)) {
 | 
						|
            return this.explain == null;
 | 
						|
        }
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    executeCommand(server, session, cmd, callback) {
 | 
						|
        // TODO: consider making this a non-enumerable property
 | 
						|
        this.server = server;
 | 
						|
        const options = {
 | 
						|
            ...this.options,
 | 
						|
            ...this.bsonOptions,
 | 
						|
            readPreference: this.readPreference,
 | 
						|
            session
 | 
						|
        };
 | 
						|
        const serverWireVersion = (0, utils_1.maxWireVersion)(server);
 | 
						|
        const inTransaction = this.session && this.session.inTransaction();
 | 
						|
        if (this.readConcern && (0, utils_1.commandSupportsReadConcern)(cmd) && !inTransaction) {
 | 
						|
            Object.assign(cmd, { readConcern: this.readConcern });
 | 
						|
        }
 | 
						|
        if (this.trySecondaryWrite && serverWireVersion < server_selection_1.MIN_SECONDARY_WRITE_WIRE_VERSION) {
 | 
						|
            options.omitReadPreference = true;
 | 
						|
        }
 | 
						|
        if (this.writeConcern && this.hasAspect(operation_1.Aspect.WRITE_OPERATION) && !inTransaction) {
 | 
						|
            Object.assign(cmd, { writeConcern: this.writeConcern });
 | 
						|
        }
 | 
						|
        if (options.collation &&
 | 
						|
            typeof options.collation === 'object' &&
 | 
						|
            !this.hasAspect(operation_1.Aspect.SKIP_COLLATION)) {
 | 
						|
            Object.assign(cmd, { collation: options.collation });
 | 
						|
        }
 | 
						|
        if (typeof options.maxTimeMS === 'number') {
 | 
						|
            cmd.maxTimeMS = options.maxTimeMS;
 | 
						|
        }
 | 
						|
        if (this.hasAspect(operation_1.Aspect.EXPLAINABLE) && this.explain) {
 | 
						|
            cmd = (0, utils_1.decorateWithExplain)(cmd, this.explain);
 | 
						|
        }
 | 
						|
        server.command(this.ns, cmd, options, callback);
 | 
						|
    }
 | 
						|
}
 | 
						|
exports.CommandOperation = CommandOperation;
 | 
						|
//# sourceMappingURL=command.js.map
 |