| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.CreateCollectionOperation = void 0;
- exports.createCollections = createCollections;
- const constants_1 = require("../cmap/wire_protocol/constants");
- const responses_1 = require("../cmap/wire_protocol/responses");
- const collection_1 = require("../collection");
- const error_1 = require("../error");
- const timeout_1 = require("../timeout");
- const utils_1 = require("../utils");
- const command_1 = require("./command");
- const execute_operation_1 = require("./execute_operation");
- const indexes_1 = require("./indexes");
- const operation_1 = require("./operation");
- const ILLEGAL_COMMAND_FIELDS = new Set([
- 'w',
- 'wtimeout',
- 'timeoutMS',
- 'j',
- 'fsync',
- 'pkFactory',
- 'raw',
- 'readPreference',
- 'session',
- 'readConcern',
- 'writeConcern',
- 'raw',
- 'fieldsAsRaw',
- 'useBigInt64',
- 'promoteLongs',
- 'promoteValues',
- 'promoteBuffers',
- 'bsonRegExp',
- 'serializeFunctions',
- 'ignoreUndefined',
- 'enableUtf8Validation'
- ]);
- /* @internal */
- const INVALID_QE_VERSION = 'Driver support of Queryable Encryption is incompatible with server. Upgrade server to use Queryable Encryption.';
- /** @internal */
- class CreateCollectionOperation extends command_1.CommandOperation {
- constructor(db, name, options = {}) {
- super(db, options);
- this.SERVER_COMMAND_RESPONSE_TYPE = responses_1.MongoDBResponse;
- this.options = options;
- this.db = db;
- this.name = name;
- }
- get commandName() {
- return 'create';
- }
- buildCommandDocument(_connection, _session) {
- const isOptionValid = ([k, v]) => v != null && typeof v !== 'function' && !ILLEGAL_COMMAND_FIELDS.has(k);
- return {
- create: this.name,
- ...Object.fromEntries(Object.entries(this.options).filter(isOptionValid))
- };
- }
- handleOk(_response) {
- return new collection_1.Collection(this.db, this.name, this.options);
- }
- }
- exports.CreateCollectionOperation = CreateCollectionOperation;
- async function createCollections(db, name, options) {
- const timeoutContext = timeout_1.TimeoutContext.create({
- session: options.session,
- serverSelectionTimeoutMS: db.client.s.options.serverSelectionTimeoutMS,
- waitQueueTimeoutMS: db.client.s.options.waitQueueTimeoutMS,
- timeoutMS: options.timeoutMS
- });
- const encryptedFields = options.encryptedFields ??
- db.client.s.options.autoEncryption?.encryptedFieldsMap?.[`${db.databaseName}.${name}`];
- if (encryptedFields) {
- class CreateSupportingFLEv2CollectionOperation extends CreateCollectionOperation {
- buildCommandDocument(connection, session) {
- if (!connection.description.loadBalanced &&
- (0, utils_1.maxWireVersion)(connection) < constants_1.MIN_SUPPORTED_QE_WIRE_VERSION) {
- throw new error_1.MongoCompatibilityError(`${INVALID_QE_VERSION} The minimum server version required is ${constants_1.MIN_SUPPORTED_QE_SERVER_VERSION}`);
- }
- return super.buildCommandDocument(connection, session);
- }
- }
- // Create auxilliary collections for queryable encryption support.
- const escCollection = encryptedFields.escCollection ?? `enxcol_.${name}.esc`;
- const ecocCollection = encryptedFields.ecocCollection ?? `enxcol_.${name}.ecoc`;
- for (const collectionName of [escCollection, ecocCollection]) {
- const createOp = new CreateSupportingFLEv2CollectionOperation(db, collectionName, {
- clusteredIndex: {
- key: { _id: 1 },
- unique: true
- },
- session: options.session
- });
- await (0, execute_operation_1.executeOperation)(db.client, createOp, timeoutContext);
- }
- if (!options.encryptedFields) {
- options = { ...options, encryptedFields };
- }
- }
- const coll = await (0, execute_operation_1.executeOperation)(db.client, new CreateCollectionOperation(db, name, options), timeoutContext);
- if (encryptedFields) {
- // Create the required index for queryable encryption support.
- const createIndexOp = indexes_1.CreateIndexesOperation.fromIndexSpecification(db, name, { __safeContent__: 1 }, { session: options.session });
- await (0, execute_operation_1.executeOperation)(db.client, createIndexOp, timeoutContext);
- }
- return coll;
- }
- (0, operation_1.defineAspects)(CreateCollectionOperation, [operation_1.Aspect.WRITE_OPERATION]);
- //# sourceMappingURL=create_collection.js.map
|