@resolveio/server-lib 20.4.54 → 20.4.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","log_collection_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","MongoManager","serverConfig","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","initServerCollections","setupChangeStream","prototype","_heapLimit","ResolveIOServer","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","_this","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","Promise","resolve","setTimeout","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","finish","addToCache","findOne","executeFindOne","aggregate","pipeline","__spreadArray","__read","flatMap","stage","$lookup","from","executeAggregate","countDocuments","executeCountDocuments","functionName","args","keyString","createHash","update","digest","cachedData","parse","dateReviver","error","del","data","getBinarySize","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","console","log","invalidateQueryCache","collectionCacheMap","includes","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","changeStream","getMongoConnection","db","watch","on","change","__awaiter","coll","err","Date","close","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","setInterval","getMainServer","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","logs","versionOps","deleteOldVersionsOps","bulkOps","updateFilters","updateManyFilters","deleteManyFilters","forEach","op","opType","Object","$or","_b","_d","currentDocs","getNestedValue","doc","split","reduce","acc","part","Array","isArray","map","item","val","findMatchingDocs","matchDocument","every","startsWith","subFilter","Error","concat","docValue","evaluateCondition","condition","RegExp","operator","operand","$options","test","date","document","objectIdHexString","this_1","hasOwnProperty","__v","createdAt","updatedAt","validation","newContext","validate","validationErrors","getMethodManager","callMethodInternal","call","insertOne","id_document","payload","method","id_user","user","messageId","route","matchingDocs","e_4","matchingDocs_1","matchingDocs_1_1","currentDoc","$set","modifier","versionDoc","objectContainsPropertyDeep","$inc","deleteMany","$lt","upsert","$setOnInsert","replacement","e_5","matchingDocs_2","matchingDocs_2_1","e_6","matchingDocs_3","matchingDocs_3_1","operations_1","operations_1_1","slice","mainResult","Logs","err_1","estimatedDocumentCount","monitor_2","err_2","create","f_docs","insertMany","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_3","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_4","docs","i","replaceOne","$and","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","findOneAndUpdate","indexExists","bypassMonitor","validationResults","validDocs","idx","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","bypassVersions","$unset","updateOne","monitor_13","monitor_14","monitor_15","ok","monitor_16","watchCollection","queue","task","callback","dbCollection","apply","code","err_5","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"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","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheMap: { collections: string[], key: string }[] = [];\n\tprivate _operationInProgress: Map<string, { promise: Promise<any>, invalidatedDuringExecution: boolean }> = new Map();\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\n\tprivate _serverConfig = null;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor(serverConfig) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });\n\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\t\tthis.setCacheLimit();\n\n\t\tthis.initServerCollections();\n\n\t\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tprivate setCacheLimit() {\n\t\tif (this._isWorkersEnabled) {\n\t\t\tthis._heapLimit = this._isWorkerInstance ? this._heapSize * 0.8 : this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3;\n\t\t}\n\t}\n\n\tasync initServerCollections() {\n\t\tlet collections = await ResolveIOServer.getMainDB().listCollections().toArray();\n\t\tthis._serverCollections = collections;\n\t}\n\n\tgetServerCollections() {\n\t\treturn this._serverCollections;\n\t}\n\n\tregisterCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tif (\n\t\t\tcollection.collectionOptions &&\n\t\t\tcollection.collectionOptions.timeseries &&\n\t\t\tcollection.collectionOptions.timeseries.timeField &&\n\t\t\tthis._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')\n\t\t) {\n\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t.dropCollection(collection.collectionName)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.createCollection(collection);\n\t\t\t\t});\n\t\t}\n\n\t\tthis._collections.push(collection);\n\t}\n\n\tcreateCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tResolveIOServer.getMainDB().createCollection<CollectionDocument>(collection.collectionName, collection.collectionOptions);\n\t}\n\n\tcollections() {\n\t\treturn this._collections;\n\t}\n\n\tcollection(collectionName: string): MongoManagerCollection<CollectionDocument> | MongoManagerUserCollection<CollectionDocument> {\n\t\treturn this._collections.find(a => a.collectionName === collectionName);\n\t}\n\n\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tpublic async find<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T[]> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFind<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// FindOne Operation\n\tpublic async findOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFindOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.findOne(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Aggregate Operation\n\tpublic async aggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions?: AggregateOptions\n\t): Promise<any[]> {\n\t\tconst collections = [collectionName, ...pipeline.flatMap(stage => stage.$lookup?.from ? [stage.$lookup.from] : [])];\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeAggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions: AggregateOptions | undefined,\n\t\tcacheKey: string,\n\t\tcollections: string[]\n\t): Promise<any[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\tmonitor.finish();\n\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache(collections, cacheKey, result);\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n\tpublic async countDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions\n\t): Promise<number> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeCountDocuments<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeCountDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: CountDocumentsOptions,\n\t\tcacheKey: string\n\t): Promise<number> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.countDocuments(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Cache and Invalidation Setup\n\tprivate generateCacheKey(collections: string[], functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collections, functionName, args });\n\t\treturn crypto.createHash('sha256').update(keyString).digest('hex');\n\t}\n\n\tprivate getFromCache(cacheKey: string): any | undefined {\n\t\ttry {\n\t\t\tconst cachedData = this._nodeCache.get(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\treturn JSON.parse(cachedData, dateReviver);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collections: string[], cacheKey: string, data: any) {\n\t\tif (getBinarySize(JSON.stringify(data)) < 1000000) {\n\t\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\tlet deleteCount = 0;\n\t\t\t\tconst keys = this._nodeCache.keys();\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tthis._nodeCache.del(key);\n\t\t\t\t\tdeleteCount += 1;\n\n\t\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t\t}\n\t\t\t\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\t\t\tthis._cacheMap.push({ collections, key: cacheKey });\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tconst collectionCacheMap = this._cacheMap.filter(a => a.collections.includes(collection));\n\n\t\tfor (const cacheMap of collectionCacheMap) {\n\t\t\tthis._nodeCache.del(cacheMap.key);\n\t\t\t\n\t\t\tif (this._operationInProgress.has(cacheMap.key)) {\n\t\t\t\tthis._operationInProgress.get(cacheMap.key).invalidatedDuringExecution = true;\n\t\t\t}\n\t\t}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => !a.collections.includes(collection));\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMongoConnection().db(this._serverConfig['DATABASE']);\n\t\tconst changeStream = db.watch();\n\n\t\tchangeStream.on('change', async change => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\t\t\t\tif (this.collection(collectionName)) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchangeStream.on('error', err => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream error. Restart...');\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream closed. Restarting...');\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\t}\n}\n\nexport class MongoManagerModel<T extends CollectionDocument> {\n\tcollection_main: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\tcollection_version: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tif (options.collectionName === 'users') {\n\t\t\tthis.collection_main = new MongoManagerUserCollection<T>(options);\n\t\t}\n\t\telse {\n\t\t\tthis.collection_main = new MongoManagerCollection<T>(options);\n\t\t}\n\n\t\tif (options.useVersionCollection) {\n\t\t\tthis.collection_main.useVersions = true;\n\t\t\t\n\t\t\tlet versionSchema = deepCopy(options.schema);\n\t\t\tversionSchema._id.type = 'Object';\n\t\t\tversionSchema._id.blackbox = true;\n\n\t\t\tlet versionOptions: MongoManagerCollectionOptions = {\n\t\t\t\tcollectionName: options.collectionName + '.versions',\n\t\t\t\tschema: versionSchema,\n\t\t\t\tuseVersionCollection: false,\n\t\t\t\tuseReportBuilder: false,\n\t\t\t\treportBuilderLookupTables: [],\n\t\t\t\ttimestamps: true,\n\t\t\t\tcreateLogs: false,\n\t\t\t\tcheckSchema: false,\n\t\t\t\tcollectionOptions: null\n\t\t\t};\n\n\t\t\tif (options.collectionName === 'users') {\t\n\t\t\t\tthis.collection_version = new MongoManagerUserCollection<T>(versionOptions);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.collection_version = new MongoManagerCollection<T>(versionOptions);\n\t\t\t}\n\n\t\t\tthis.collection_version.createIndex({'_id._id': 1, '_id.__v': 1});\n\t\t\tthis.collection_main.versionCollection = options.collectionName + '.versions';\n\t\t}\n\t}\n}\n\nexport interface MongoManagerCollectionOptions {\n\tcollectionName: string;\n\tschema: object;\n\tuseVersionCollection: boolean;\n\tuseReportBuilder: boolean;\n\treportBuilderLookupTables: LookupTables[]\n\ttimestamps: boolean;\n\tcreateLogs: boolean;\n\tcheckSchema: boolean;\n\tcollectionOptions: CreateCollectionOptions;\n}\n\nexport class MongoManagerCollection<T extends CollectionDocument> {\n\tcollectionName = '';\n\tcheckSchema = false;\n\tsimplschema = null;\n\trbSchema = null;\n\ttimestamps = false;\n\tuseVersions = false;\n\tversionCollection = '';\n\tcreateLogs = true;\n\tuseRB = false;\n\tcollectionOptions: CreateCollectionOptions;\n\t\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tthis.collectionName = options.collectionName;\n\t\tthis.simplschema = new SimpleSchema(options.schema);\n\t\tthis.timestamps = options.timestamps;\n\t\tthis.createLogs = options.createLogs;\n\t\tthis.checkSchema = options.checkSchema;\n\t\tthis.collectionOptions = options.collectionOptions;\n\n\t\tif (options.useReportBuilder) {\n\t\t\tthis.useRB = true;\n\t\t\tlet schemaCopy = deepCopy(options.schema);\n\t\t\tlet rbSchema = buildRbLookups(options.reportBuilderLookupTables, schemaCopy, []);\n\t\t\tthis.rbSchema = buildRbSchema(rbSchema);\n\t\t}\n\n\t\tlet interval = setInterval(() => {\n\t\t\tif (ResolveIOServer && ResolveIOServer.getMainServer() && ResolveIOServer.getMongoManager() && ResolveIOServer.getMongoManager().getServerCollections().length) {\n\t\t\t\tResolveIOServer.getMongoManager().registerCollection(this);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1);\n\t}\n\n\tprivate static indexQueue = async.queue(async (task, callback) => {\n\t\tconst { action, collection, specs, options } = task;\n\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n\t\n\t\tif (!dbCollection) {\n\t\t\treturn callback(new Error(`Collection ${collection.collectionName} not found`));\n\t\t}\n\t\n\t\tlet monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\t\n\t\ttry {\n\t\t\t// Try creating the index, will auto-skip if already checked in createIndex/createIndexes\n\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\tmonitor.finish();\n\t\t\tcallback(null, result);\n\t\t} catch (err) {\n\t\t\t// Handle any specific errors related to index creation\n\t\t\tif (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existingIndexName = collection.extractIndexNameFromError(err.message);\n\t\t\t\t\tif (existingIndexName) {\n\t\t\t\t\t\tawait dbCollection.dropIndex(existingIndexName);\n\t\t\t\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tcallback(null, result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (innerError) {\n\t\t\t\t\tcallback(innerError);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonitor.finish();\n\t\t\tcallback(err);\n\t\t}\n\t}, 1);\n\n // Method to extract index name from error message\n extractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tbulkWrite(operations: any[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false): Promise<BulkWriteResult> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!operations.length) {\n\t\t\t\tresolve(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = []; // For storing versioning ops\n\t\t\tconst deleteOldVersionsOps = []; // For deleteMany operations to remove older versions\n\t\t\tconst bulkOps = [];\n\t\t\tconst updateFilters = [];\n\t\t\tconst updateManyFilters = [];\n\t\t\tconst deleteManyFilters = [];\n\t\n\t\t\t// Collect filters for all operations\n\t\t\toperations.forEach(op => {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tif (opType === 'updateOne' || opType === 'deleteOne' || opType === 'replaceOne') {\n\t\t\t\t\tupdateFilters.push(op[opType].filter); // Store filters for updateOne, deleteOne, and replaceOne\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tupdateManyFilters.push(op[opType].filter); // Store the entire filter for updateMany\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\tdeleteManyFilters.push(op[opType].filter); // Store the entire filter for deleteMany\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t// Pre-fetch all documents based on the filters before proceeding with the bulk operations\n\t\t\tconst currentDocs = updateFilters.length || updateManyFilters.length || deleteManyFilters.length\n\t\t\t\t? await this.find(<any>{ $or: [...updateFilters, ...updateManyFilters, ...deleteManyFilters] })\n\t\t\t\t: [];\n\n\t\t\t// Helper function to get the value from a document using a dot-notated key (e.g., 'obj.property')\n\t\t\t// This will also handle arrays of objects (e.g., 'obj.arrayOfObjects.property')\n\t\t\tconst getNestedValue = (doc, key) => {\n\t\t\t\tconst parts = key.split('.');\n\n\t\t\t\treturn parts.reduce((acc, part) => {\n\t\t\t\t\tif (Array.isArray(acc)) {\n\t\t\t\t\t\t// If we're dealing with an array, return an array of values for each element\n\t\t\t\t\t\treturn acc.map(item => item[part]).filter(val => val !== undefined);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc && acc[part];\n\t\t\t\t}, doc);\n\t\t\t};\n\t\n\t\t\t// Helper function to locally find matching documents based on filter\n\t\t\tconst findMatchingDocs = (filter) => {\n\t\t\t\treturn currentDocs.filter(doc => {\n\t\t\t\t\treturn matchDocument(filter, doc);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst matchDocument = (filter, doc) => {\n\t\t\t\tif (typeof filter !== 'object' || filter == null) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\n\t\t\t\treturn Object.keys(filter).every(key => {\n\t\t\t\t\tconst value = filter[key];\n\t\t\t\n\t\t\t\t\tif (key.startsWith('$')) {\n\t\t\t\t\t\t// Handle logical operators\n\t\t\t\t\t\tif (key === '$and') {\n\t\t\t\t\t\t\treturn Array.isArray(value) && value.every(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t\t} else if (key === '$or') {\n\t\t\t\t\t\t\treturn Array.isArray(value) && value.some(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t\t} else if (key === '$nor') {\n\t\t\t\t\t\t\treturn Array.isArray(value) && !value.some(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t\t} else if (key === '$not') {\n\t\t\t\t\t\t\treturn !matchDocument(value, doc);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(`Unsupported operator in filter: ${key}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst docValue = getNestedValue(doc, key);\n\t\t\t\n\t\t\t\t\t\t// If docValue is an array, apply filter conditions to each element\n\t\t\t\t\t\tif (Array.isArray(docValue)) {\n\t\t\t\t\t\t\treturn docValue.some(val => evaluateCondition(value, val));\n\t\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t\t// Otherwise, apply the condition to the single value\n\t\t\t\t\t\treturn evaluateCondition(value, docValue);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\tconst evaluateCondition = (condition, docValue) => {\n\t\t\t\tif (condition instanceof Object && !(condition instanceof RegExp)) {\n\t\t\t\t\treturn Object.keys(condition).every(operator => {\n\t\t\t\t\t\tconst operand = condition[operator];\n\t\t\t\t\t\tswitch(operator) {\n\t\t\t\t\t\t\tcase '$in':\n\t\t\t\t\t\t\t\treturn Array.isArray(operand) && operand.includes(docValue);\n\t\t\t\t\t\t\tcase '$nin':\n\t\t\t\t\t\t\t\treturn Array.isArray(operand) && !operand.includes(docValue);\n\t\t\t\t\t\t\tcase '$ne':\n\t\t\t\t\t\t\t\treturn docValue !== operand;\n\t\t\t\t\t\t\tcase '$gt':\n\t\t\t\t\t\t\t\treturn docValue > operand;\n\t\t\t\t\t\t\tcase '$gte':\n\t\t\t\t\t\t\t\treturn docValue >= operand;\n\t\t\t\t\t\t\tcase '$lt':\n\t\t\t\t\t\t\t\treturn docValue < operand;\n\t\t\t\t\t\t\tcase '$lte':\n\t\t\t\t\t\t\t\treturn docValue <= operand;\n\t\t\t\t\t\t\tcase '$exists':\n\t\t\t\t\t\t\t\treturn (docValue !== undefined) === operand;\n\t\t\t\t\t\t\tcase '$regex':\n\t\t\t\t\t\t\t\tconst regex = new RegExp(operand, condition.$options || '');\n\t\t\t\t\t\t\t\treturn regex.test(docValue);\n\t\t\t\t\t\t\tcase '$eq':\n\t\t\t\t\t\t\t\treturn docValue === operand;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthrow new Error(`Unsupported operator in condition: ${operator}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Handle regular equality comparison\n\t\t\t\treturn docValue === condition;\n\t\t\t};\n\t\n\t\t\tfor (const op of operations) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tlet doc = op[opType];\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Ensure _id and __v for insertOne operations\n\t\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions && !doc.document.hasOwnProperty('__v')) {\n\t\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\t\tif (!doc.document.createdAt) {\n\t\t\t\t\t\t\tdoc.document.createdAt = date;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!doc.document.updatedAt) {\n\t\t\t\t\t\t\tdoc.document.updatedAt = date;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\tconst isValid = validation.validate(doc.document);\n\t\t\n\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite insertOne - ' + this.collectionName, [validation.validationErrors(), doc.document]);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t// Log the operation\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tbulkOps.push(op); // Add insertOne operation to bulkOps\n\t\t\t\t} \n\t\t\t\telse if (opType === 'updateOne') {\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tdoc.update.$set = { updatedAt: new Date() };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update, currentDoc]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '_id')) {\n\t\t\t\t\t\t\t\tdoc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.update])) < 200000 ? JSON.stringify([op, options, doc.update], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tdoc.replacement.__v = versionDoc.__v + 1;\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - replaceOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '_id')) {\n\t\t\t\t\t\t\t\tdoc.replacement._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.replacement._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.replacement])) < 200000 ? JSON.stringify([op, options, doc.replacement], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne') {\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\t\t\t\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoc.update.$set = {\n\t\t\t\t\t\t\t\tupdatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Process all documents matching the updateMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\n\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateMany - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateMany operation to bulkOps\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\t// Process all documents matching the deleteMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteMany operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ttry {\n\t\t\t\tif (bulkOps.length) {\n\t\t\t\t\tlet monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([bulkOps.slice(-100), options]));\n\t\t\t\t\t\n\t\t\t\t\t// First, perform the main bulk operations on the collection\n\t\t\t\t\tconst mainResult = await ResolveIOServer.getMainDB().collection<T>(this.collectionName).bulkWrite(bulkOps, options);\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\t// Separate bulkWrite for versions (if any versioning is required)\n\t\t\t\t\tif (versionOps.length || deleteOldVersionsOps.length) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection<T>(this.versionCollection).bulkWrite([...versionOps, ...deleteOldVersionsOps]);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\t// Separate bulkWrite for logs (if logging is enabled)\n\t\t\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\t\t\tawait Logs.bulkWrite(logs);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tmonitor.finish();\n\t\n\t\t\t\t\tresolve(mainResult); // Resolve with the result of the main bulkWrite\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Bulk Write', this.collectionName, bulkOps.slice(-100), options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\tcountDocuments(\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions,\n\t\tskipCache = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if the filter is empty\n\t\t\t\tconst isUnfiltered = Object.keys(filter).length === 0;\n\t\n\t\t\t\tif (isUnfiltered) {\n\t\t\t\t\t// Use collection stats for an unfiltered count\n\t\t\t\t\tconst res = await ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).estimatedDocumentCount(options);\n\t\t\t\t\tresolve(res);\n\t\t\t\t}\n\t\t\t\telse if (!skipCache) {\n\t\t\t\t\t// Use cached count if skipCache is false\n\t\t\t\t\tResolveIOServer.getMongoManager().countDocuments(this.collectionName, filter, options).then(\n\t\t\t\t\t\tres => resolve(res),\n\t\t\t\t\t\terr => reject(err)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Fallback to direct countDocuments call with monitoring if skipCache is true\n\t\t\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(\n\t\t\t\t\t\tres => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if index already exists based on the key\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Check if an index with the same key already exists\n\t\t\t\tconst indexExists = existingIndexes.some(index => \n\t\t\t\t\tJSON.stringify(index.key) === JSON.stringify(fieldOrSpec)\n\t\t\t\t);\n\t\n\t\t\t\tif (indexExists) {\n\t\t\t\t\treturn resolve('Index already exists'); // Skip creation if index exists\n\t\t\t\t}\n\t\n\t\t\t\t// If index doesn't exist, push it to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndex',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Filter out indexes that already exist based on the key\n\t\t\t\tconst indexesToCreate = indexSpecs.filter(indexSpec => \n\t\t\t\t\t!existingIndexes.some(existingIndex => \n\t\t\t\t\t\tJSON.stringify(existingIndex.key) === JSON.stringify(indexSpec.key)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\n\t\t\t\t// If no new indexes to create, resolve early\n\t\t\t\tif (indexesToCreate.length === 0) {\n\t\t\t\t\treturn resolve(['All indexes already exist']);\n\t\t\t\t}\n\t\n\t\t\t\t// Push only new indexes to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndexes',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [indexesToCreate],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal;\n\n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tLogs.insertOne({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: ''\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}
1
+ {"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","log_collection_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","sift_1","MongoManager","serverConfig","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","initServerCollections","setupChangeStream","prototype","_heapLimit","ResolveIOServer","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","_this","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","Promise","resolve","setTimeout","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","finish","addToCache","findOne","executeFindOne","aggregate","pipeline","__spreadArray","__read","flatMap","stage","$lookup","from","executeAggregate","countDocuments","executeCountDocuments","functionName","args","keyString","createHash","update","digest","cachedData","parse","dateReviver","error","del","data","getBinarySize","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","console","log","invalidateQueryCache","collectionCacheMap","includes","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","changeStream","getMongoConnection","db","watch","on","change","__awaiter","coll","err","Date","close","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","setInterval","getMainServer","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","bulkOps","versionFilters","logs","additionalFilters","fieldNamesSet","Set","operations_1","operations_1_1","op","opType","Object","doc","document","objectIdHexString","__v","date","createdAt","updatedAt","validation","newContext","validate","Error","concat","validationErrors","insertOne","id_document","payload","method","id_user","user","messageId","route","$set","$inc","upsert","$setOnInsert","modifier","opIndex","extractFieldNames","replacement","combinedFilter","$or","map","item","projection_1","forEach","field","projection","docs","_e","docs_1","docs_1_1","e_5","additionalFilters_1","additionalFilters_1_1","matchesFilter","versionPipeline","$match","$addFields","$merge","into","whenMatched","whenNotMatched","allowDiskUse","mainResult","Logs","err_1","prefix","startsWith","Array","isArray","subFilter","fullPath","add","estimatedDocumentCount","_b","monitor_2","err_2","create","f_docs","insertMany","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_3","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_4","deleteMany","i","versionDoc","replaceOne","$and","$lt","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","getMethodManager","callMethodInternal","call","findOneAndUpdate","indexExists","bypassMonitor","validationResults","validDocs","idx","hasOwnProperty","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","bypassVersions","$unset","objectContainsPropertyDeep","updateOne","monitor_13","monitor_14","monitor_15","ok","monitor_16","watchCollection","queue","task","callback","dbCollection","apply","code","err_5","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"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","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\nimport sift from 'sift';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheMap: { collections: string[], key: string }[] = [];\n\tprivate _operationInProgress: Map<string, { promise: Promise<any>, invalidatedDuringExecution: boolean }> = new Map();\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\n\tprivate _serverConfig = null;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor(serverConfig) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });\n\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\t\tthis.setCacheLimit();\n\n\t\tthis.initServerCollections();\n\n\t\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tprivate setCacheLimit() {\n\t\tif (this._isWorkersEnabled) {\n\t\t\tthis._heapLimit = this._isWorkerInstance ? this._heapSize * 0.8 : this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3;\n\t\t}\n\t}\n\n\tasync initServerCollections() {\n\t\tlet collections = await ResolveIOServer.getMainDB().listCollections().toArray();\n\t\tthis._serverCollections = collections;\n\t}\n\n\tgetServerCollections() {\n\t\treturn this._serverCollections;\n\t}\n\n\tregisterCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tif (\n\t\t\tcollection.collectionOptions &&\n\t\t\tcollection.collectionOptions.timeseries &&\n\t\t\tcollection.collectionOptions.timeseries.timeField &&\n\t\t\tthis._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')\n\t\t) {\n\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t.dropCollection(collection.collectionName)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.createCollection(collection);\n\t\t\t\t});\n\t\t}\n\n\t\tthis._collections.push(collection);\n\t}\n\n\tcreateCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tResolveIOServer.getMainDB().createCollection<CollectionDocument>(collection.collectionName, collection.collectionOptions);\n\t}\n\n\tcollections() {\n\t\treturn this._collections;\n\t}\n\n\tcollection(collectionName: string): MongoManagerCollection<CollectionDocument> | MongoManagerUserCollection<CollectionDocument> {\n\t\treturn this._collections.find(a => a.collectionName === collectionName);\n\t}\n\n\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tpublic async find<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T[]> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFind<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// FindOne Operation\n\tpublic async findOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFindOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.findOne(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Aggregate Operation\n\tpublic async aggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions?: AggregateOptions\n\t): Promise<any[]> {\n\t\tconst collections = [collectionName, ...pipeline.flatMap(stage => stage.$lookup?.from ? [stage.$lookup.from] : [])];\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeAggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions: AggregateOptions | undefined,\n\t\tcacheKey: string,\n\t\tcollections: string[]\n\t): Promise<any[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\tmonitor.finish();\n\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache(collections, cacheKey, result);\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n\tpublic async countDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions\n\t): Promise<number> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeCountDocuments<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeCountDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: CountDocumentsOptions,\n\t\tcacheKey: string\n\t): Promise<number> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.countDocuments(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Cache and Invalidation Setup\n\tprivate generateCacheKey(collections: string[], functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collections, functionName, args });\n\t\treturn crypto.createHash('sha256').update(keyString).digest('hex');\n\t}\n\n\tprivate getFromCache(cacheKey: string): any | undefined {\n\t\ttry {\n\t\t\tconst cachedData = this._nodeCache.get(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\treturn JSON.parse(cachedData, dateReviver);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collections: string[], cacheKey: string, data: any) {\n\t\tif (getBinarySize(JSON.stringify(data)) < 1000000) {\n\t\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\tlet deleteCount = 0;\n\t\t\t\tconst keys = this._nodeCache.keys();\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tthis._nodeCache.del(key);\n\t\t\t\t\tdeleteCount += 1;\n\n\t\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t\t}\n\t\t\t\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\t\t\tthis._cacheMap.push({ collections, key: cacheKey });\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tconst collectionCacheMap = this._cacheMap.filter(a => a.collections.includes(collection));\n\n\t\tfor (const cacheMap of collectionCacheMap) {\n\t\t\tthis._nodeCache.del(cacheMap.key);\n\t\t\t\n\t\t\tif (this._operationInProgress.has(cacheMap.key)) {\n\t\t\t\tthis._operationInProgress.get(cacheMap.key).invalidatedDuringExecution = true;\n\t\t\t}\n\t\t}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => !a.collections.includes(collection));\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMongoConnection().db(this._serverConfig['DATABASE']);\n\t\tconst changeStream = db.watch();\n\n\t\tchangeStream.on('change', async change => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\t\t\t\tif (this.collection(collectionName)) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchangeStream.on('error', err => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream error. Restart...');\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream closed. Restarting...');\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\t}\n}\n\nexport class MongoManagerModel<T extends CollectionDocument> {\n\tcollection_main: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\tcollection_version: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tif (options.collectionName === 'users') {\n\t\t\tthis.collection_main = new MongoManagerUserCollection<T>(options);\n\t\t}\n\t\telse {\n\t\t\tthis.collection_main = new MongoManagerCollection<T>(options);\n\t\t}\n\n\t\tif (options.useVersionCollection) {\n\t\t\tthis.collection_main.useVersions = true;\n\t\t\t\n\t\t\tlet versionSchema = deepCopy(options.schema);\n\t\t\tversionSchema._id.type = 'Object';\n\t\t\tversionSchema._id.blackbox = true;\n\n\t\t\tlet versionOptions: MongoManagerCollectionOptions = {\n\t\t\t\tcollectionName: options.collectionName + '.versions',\n\t\t\t\tschema: versionSchema,\n\t\t\t\tuseVersionCollection: false,\n\t\t\t\tuseReportBuilder: false,\n\t\t\t\treportBuilderLookupTables: [],\n\t\t\t\ttimestamps: true,\n\t\t\t\tcreateLogs: false,\n\t\t\t\tcheckSchema: false,\n\t\t\t\tcollectionOptions: null\n\t\t\t};\n\n\t\t\tif (options.collectionName === 'users') {\t\n\t\t\t\tthis.collection_version = new MongoManagerUserCollection<T>(versionOptions);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.collection_version = new MongoManagerCollection<T>(versionOptions);\n\t\t\t}\n\n\t\t\tthis.collection_version.createIndex({'_id._id': 1, '_id.__v': 1});\n\t\t\tthis.collection_main.versionCollection = options.collectionName + '.versions';\n\t\t}\n\t}\n}\n\nexport interface MongoManagerCollectionOptions {\n\tcollectionName: string;\n\tschema: object;\n\tuseVersionCollection: boolean;\n\tuseReportBuilder: boolean;\n\treportBuilderLookupTables: LookupTables[]\n\ttimestamps: boolean;\n\tcreateLogs: boolean;\n\tcheckSchema: boolean;\n\tcollectionOptions: CreateCollectionOptions;\n}\n\nexport class MongoManagerCollection<T extends CollectionDocument> {\n\tcollectionName = '';\n\tcheckSchema = false;\n\tsimplschema = null;\n\trbSchema = null;\n\ttimestamps = false;\n\tuseVersions = false;\n\tversionCollection = '';\n\tcreateLogs = true;\n\tuseRB = false;\n\tcollectionOptions: CreateCollectionOptions;\n\t\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tthis.collectionName = options.collectionName;\n\t\tthis.simplschema = new SimpleSchema(options.schema);\n\t\tthis.timestamps = options.timestamps;\n\t\tthis.createLogs = options.createLogs;\n\t\tthis.checkSchema = options.checkSchema;\n\t\tthis.collectionOptions = options.collectionOptions;\n\n\t\tif (options.useReportBuilder) {\n\t\t\tthis.useRB = true;\n\t\t\tlet schemaCopy = deepCopy(options.schema);\n\t\t\tlet rbSchema = buildRbLookups(options.reportBuilderLookupTables, schemaCopy, []);\n\t\t\tthis.rbSchema = buildRbSchema(rbSchema);\n\t\t}\n\n\t\tlet interval = setInterval(() => {\n\t\t\tif (ResolveIOServer && ResolveIOServer.getMainServer() && ResolveIOServer.getMongoManager() && ResolveIOServer.getMongoManager().getServerCollections().length) {\n\t\t\t\tResolveIOServer.getMongoManager().registerCollection(this);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1);\n\t}\n\n\tprivate static indexQueue = async.queue(async (task, callback) => {\n\t\tconst { action, collection, specs, options } = task;\n\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n\t\n\t\tif (!dbCollection) {\n\t\t\treturn callback(new Error(`Collection ${collection.collectionName} not found`));\n\t\t}\n\t\n\t\tlet monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\t\n\t\ttry {\n\t\t\t// Try creating the index, will auto-skip if already checked in createIndex/createIndexes\n\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\tmonitor.finish();\n\t\t\tcallback(null, result);\n\t\t} catch (err) {\n\t\t\t// Handle any specific errors related to index creation\n\t\t\tif (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existingIndexName = collection.extractIndexNameFromError(err.message);\n\t\t\t\t\tif (existingIndexName) {\n\t\t\t\t\t\tawait dbCollection.dropIndex(existingIndexName);\n\t\t\t\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tcallback(null, result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (innerError) {\n\t\t\t\t\tcallback(innerError);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonitor.finish();\n\t\t\tcallback(err);\n\t\t}\n\t}, 1);\n\n // Method to extract index name from error message\n extractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tasync bulkWrite(\n\t\toperations: any[],\n\t\toptions?: BulkWriteOptions,\n\t\tbypassLogs = false,\n\t\tbypassCheckSchema = false\n\t): Promise<BulkWriteResult> {\n\t\tif (!operations.length) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tconst bulkOps = [];\n\t\tconst versionFilters = [];\n\t\tconst logs = [];\n\t\tconst additionalFilters = [];\n\t\n\t\t// Collect all field names used in filters\n\t\tconst fieldNamesSet = new Set<string>();\n\t\n\t\t// Prepare bulk operations and collect filters for versioning and logs\n\t\tfor (const op of operations) {\n\t\t\tconst opType = Object.keys(op)[0];\n\t\t\tconst doc = op[opType];\n\t\n\t\t\tif (opType === 'insertOne') {\n\t\t\t\t// Handle insertOne\n\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t}\n\t\t\t\tif (this.useVersions && doc.document.__v === undefined) {\n\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t}\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tconst date = new Date();\n\t\t\t\t\tdoc.document.createdAt = doc.document.createdAt || date;\n\t\t\t\t\tdoc.document.updatedAt = doc.document.updatedAt || date;\n\t\t\t\t}\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tif (!validation.validate(doc.document)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for insertOne: ${JSON.stringify(validation.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\t// Collect logs if necessary\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '', // Fill with actual user ID if available\n\t\t\t\t\t\t\t\tuser: '', // Fill with actual user info if available\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t// Handle updateOne and updateMany\n\t\t\t\tif (!doc.update.$set) doc.update.$set = {};\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t}\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tif (!doc.update.$inc) doc.update.$inc = {};\n\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t}\n\t\t\t\tif (doc.upsert) {\n\t\t\t\t\tif (!doc.update.$setOnInsert) doc.update.$setOnInsert = {};\n\t\t\t\t\tif (!doc.update.$setOnInsert._id) doc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tif (!validation.validate(doc.update, { modifier: true })) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for update: ${JSON.stringify(validation.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbulkOps.push(op);\n\t\t\t\tversionFilters.push(doc.filter);\n\t\n\t\t\t\t// Collect logs if necessary\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlet id_document = '';\n\t\n\t\t\t\t\tif (doc.filter._id) {\n\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Collect filters for additional querying\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length });\n\t\t\t\t\t\t// Extract field names from filter\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: id_document,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t// Handle replaceOne\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\tif (doc.upsert && !doc.replacement.createdAt) {\n\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tdoc.replacement.__v = doc.replacement.__v !== undefined ? doc.replacement.__v + 1 : 0;\n\t\t\t\t}\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tif (!validation.validate(doc.replacement)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for replaceOne: ${JSON.stringify(validation.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbulkOps.push(op);\n\t\t\t\tversionFilters.push(doc.filter);\n\t\n\t\t\t\t// Collect logs if necessary\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlet id_document = '';\n\t\n\t\t\t\t\tif (doc.filter._id) {\n\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t}\n\t\t\t\t\telse if (doc.replacement._id) {\n\t\t\t\t\t\tid_document = doc.replacement._id;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Collect filters for additional querying\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length });\n\t\t\t\t\t\t// Extract field names from filter\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: id_document,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t// Handle deleteOne and deleteMany\n\t\t\t\tbulkOps.push(op);\n\t\t\t\tversionFilters.push(doc.filter);\n\t\n\t\t\t\t// Collect logs if necessary\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlet id_document = '';\n\t\n\t\t\t\t\tif (doc.filter._id) {\n\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Collect filters for additional querying\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length });\n\t\t\t\t\t\t// Extract field names from filter\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: id_document,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t}\n\t\t}\n\t\n\t\ttry {\n\t\t\t// Fetch necessary fields for logs where required\n\t\t\tif (additionalFilters.length) {\n\t\t\t\t// Combine all filters into one query using $or\n\t\t\t\tconst combinedFilter = {\n\t\t\t\t\t$or: additionalFilters.map(item => item.filter)\n\t\t\t\t};\n\t\n\t\t\t\t// Build the projection object with necessary fields\n\t\t\t\tconst projection: any = { _id: 1 };\n\t\t\t\tfieldNamesSet.forEach(field => {\n\t\t\t\t\tprojection[field] = 1;\n\t\t\t\t});\n\t\n\t\t\t\t// Fetch matching documents with necessary fields\n\t\t\t\tconst cursor = ResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.find(combinedFilter, { projection });\n\t\n\t\t\t\tconst docs = await cursor.toArray();\n\t\n\t\t\t\t// Map documents to their filters\n\t\t\t\tfor (const doc of docs) {\n\t\t\t\t\t// Find all filters that match this document\n\t\t\t\t\tfor (const item of additionalFilters) {\n\t\t\t\t\t\tif (this.matchesFilter(doc, item.filter)) {\n\t\t\t\t\t\t\t// Update the corresponding log entry with the _id\n\t\t\t\t\t\t\tlogs[item.opIndex].insertOne.document.id_document = doc._id;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Versioning: Copy matching documents to the version collection before the bulk operation\n\t\t\tif (this.useVersions && versionFilters.length) {\n\t\t\t\tconst versionMatch = { $or: versionFilters };\n\t\t\t\tconst versionPipeline = [\n\t\t\t\t\t{ $match: versionMatch },\n\t\t\t\t\t{\n\t\t\t\t\t\t$addFields: {\n\t\t\t\t\t\t\t_id: { _id: '$_id', __v: '$__v' },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t$merge: {\n\t\t\t\t\t\t\tinto: this.versionCollection,\n\t\t\t\t\t\t\ton: '_id',\n\t\t\t\t\t\t\twhenMatched: 'fail',\n\t\t\t\t\t\t\twhenNotMatched: 'insert',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\t\n\t\t\t\t// Execute the aggregation pipeline to copy documents to the version collection\n\t\t\t\tawait ResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.aggregate(versionPipeline, { allowDiskUse: true })\n\t\t\t\t\t.toArray(); // Ensure the pipeline executes\n\t\t\t}\n\t\n\t\t\t// Perform the bulkWrite operations\n\t\t\tconst mainResult = await ResolveIOServer.getMainDB()\n\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t.bulkWrite(bulkOps, options);\n\t\n\t\t\t// Perform logging if necessary\n\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\tawait Logs.bulkWrite(logs);\n\t\t\t}\n\t\n\t\t\t// Invalidate cache\n\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\n\t\t\treturn mainResult;\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Error in bulkWrite:', err);\n\t\t\tthrow err;\n\t\t}\n\t}\n\t\n\t// Helper function to check if a document matches a filter\n\tprivate matchesFilter(doc: any, filter: any): boolean {\n\t\t// Implement a filter matcher using the document fields\n\t\treturn sift(filter)(doc);\n\t}\n\t\n\t// Helper function to extract field names from filters\n\textractFieldNames(filter: any, fieldNamesSet: Set<string>, prefix = '') {\n\t\tif (typeof filter !== 'object' || filter == null) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tfor (const key in filter) {\n\t\t\tconst value = filter[key];\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\t// Logical operator ($and, $or, etc.)\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach(subFilter => this.extractFieldNames(subFilter, fieldNamesSet, prefix));\n\t\t\t\t}\n\t\t\t\telse if (typeof value === 'object') {\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst fullPath = prefix ? `${prefix}.${key}` : key;\n\t\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n\t\t\t\t\t// May contain operators like $eq, $gt, etc.\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, fullPath);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcountDocuments(\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions,\n\t\tskipCache = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if the filter is empty\n\t\t\t\tconst isUnfiltered = Object.keys(filter).length === 0;\n\t\n\t\t\t\tif (isUnfiltered) {\n\t\t\t\t\t// Use collection stats for an unfiltered count\n\t\t\t\t\tconst res = await ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).estimatedDocumentCount(options);\n\t\t\t\t\tresolve(res);\n\t\t\t\t}\n\t\t\t\telse if (!skipCache) {\n\t\t\t\t\t// Use cached count if skipCache is false\n\t\t\t\t\tResolveIOServer.getMongoManager().countDocuments(this.collectionName, filter, options).then(\n\t\t\t\t\t\tres => resolve(res),\n\t\t\t\t\t\terr => reject(err)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Fallback to direct countDocuments call with monitoring if skipCache is true\n\t\t\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(\n\t\t\t\t\t\tres => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if index already exists based on the key\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Check if an index with the same key already exists\n\t\t\t\tconst indexExists = existingIndexes.some(index => \n\t\t\t\t\tJSON.stringify(index.key) === JSON.stringify(fieldOrSpec)\n\t\t\t\t);\n\t\n\t\t\t\tif (indexExists) {\n\t\t\t\t\treturn resolve('Index already exists'); // Skip creation if index exists\n\t\t\t\t}\n\t\n\t\t\t\t// If index doesn't exist, push it to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndex',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Filter out indexes that already exist based on the key\n\t\t\t\tconst indexesToCreate = indexSpecs.filter(indexSpec => \n\t\t\t\t\t!existingIndexes.some(existingIndex => \n\t\t\t\t\t\tJSON.stringify(existingIndex.key) === JSON.stringify(indexSpec.key)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\n\t\t\t\t// If no new indexes to create, resolve early\n\t\t\t\tif (indexesToCreate.length === 0) {\n\t\t\t\t\treturn resolve(['All indexes already exist']);\n\t\t\t\t}\n\t\n\t\t\t\t// Push only new indexes to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndexes',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [indexesToCreate],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal;\n\n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tLogs.insertOne({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: ''\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}