@resolveio/server-lib 20.4.68 → 20.4.69
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","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","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","includes","endsWith","startsWith","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","invalidateQueryCache","collectionCacheMap","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","_c","entries","_d","_e","changeStream","watch","$match","$and","ns.coll","$nin","$not","fullDocument","on","change","__awaiter","coll","err","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","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassCheckSchema","BATCH_SIZE","opIndex","batchOps","slice","transformedOps","logs","versionFilters","e_4","batchOps_1","batchOps_1_1","op","opType","Object","doc","validationContext","newContext","isValid","validate","document","replacement","modifier","Error","concat","validationErrors","ObjectId","updateOne","$set","__assign","createdAt","$ifNull","updatedAt","__v","upsert","insertOne","id_document","payload","method","id_user","user","messageId","route","timestamp","originalUpdate","updatePipeline","setOps","unsetOps","incOps","pushOps","addToSetOps","setOnInsertOps","assign","$unset","apply","$inc","e_5","_b","field","$add","$push","e_6","_f","_g","$concatArrays","$addToSet","e_7","_h","_j","_k","$setUnion","Array","isArray","$setOnInsert","pipelineStage","_q","$replaceWith","_r","Logs","$or","affectedDocs","versionDocs","map","replaceOne","$in","$sort","$group","versions","$project","versionsToDelete","$slice","$size","$unwind","$replaceRoot","newRoot","oldVersions","deleteMany","v","error_1","setImmediate","ok","estimatedDocumentCount","monitor_2","err_1","create","f_docs","insertMany","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_2","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_3","bypassLogs","docs","i","objectIdHexString","versionDoc","$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","validation","date","getMethodManager","callMethodInternal","call","findOneAndUpdate","indexExists","bypassMonitor","validationResults","forEach","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","objectContainsPropertyDeep","monitor_13","monitor_14","monitor_15","monitor_16","watchCollection","queue","task","callback","dbCollection","code","err_4","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","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, ChangeStreamDocument } 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\t$gt?: P;\n\t$gte?: P;\n\t$in?: P extends Array<any> ? P : P[];\n\t$lt?: P;\n\t$lte?: P;\n\t$ne?: P;\n\t$nin?: P extends Array<any> ? P : P[];\n\t$not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n\t$exists?: boolean;\n\t$expr?: any[]\n\t$regex?: P extends string ? RegExpConstructor | string : never;\n\t$options?: P extends string ? string : never;\n\t$geoIntersects?: {\n\t\t$geometry: Document;\n\t};\n\t$geoWithin?: Document;\n\t$near?: Document;\n\t$nearSphere?: Document;\n\t$maxDistance?: number;\n\t$all?: any[];\n\t$elemMatch?: Document;\n\t$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\t$and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$text?: {\n\t\t$search: string;\n\t\t$language?: string;\n\t\t$caseSensitive?: boolean;\n\t\t$diacriticSensitive?: boolean;\n\t};\n\t$where?: string | ((this: T) => boolean);\n\t$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\t$inc?: MongoManagerIncFilter<T> | Document;\n\t$set?: MongoManagerFilter<T> | Document;\n\t$setOnInsert?: MongoManagerFilter<T> | Document;\n\t$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, collections: string[] }> = 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\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Cache', collectionName);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Already running', collectionName);\n\t\t\t}\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Find - Running', collectionName);\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Done', collectionName);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\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\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Cache', collectionName);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Already running', collectionName);\n\t\t\t}\n\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo FindOne - Running', collectionName);\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Done', collectionName);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\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\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Cache', collections);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Already running', collections);\n\t\t\t}\n\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Agg - Running', collections);\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: collections\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Done', collections);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\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, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\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\t!collections.includes('logs') &&\n\t\t\t!collections.includes('log-method-latencies') &&\n\t\t\t!collections.includes('log-subscriptions') &&\n\t\t\t!collections.find(a => a.endsWith('.versions')) &&\n\t\t\t!collections.find(a => a.startsWith('monitor-'))\n\t\t) {\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\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Invalidate Cache', collection);\n\t\t}\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\n\t\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Mongo Invalidated During Execution', cacheMap.collections);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [key, operation] of this._operationInProgress.entries()) {\n\t\t\tif (operation.collections.includes(collection)) {\n\t\t\t\toperation.invalidatedDuringExecution = true;\n\t\t\n\t\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Mongo Invalidated During Execution (No cache)', operation.collections);\n\t\t\t\t}\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.getMainDB();\n\n\t\tconst pipeline = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$and: [\n\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst changeStream = db.watch(pipeline, { fullDocument: 'updateLookup' });\n\n\t\tchangeStream.on('change', async (change: any) => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\t\t\t\tconst collection = this.collection(collectionName);\n\n\t\t\t\tif (collection) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\n\t\t\t\t\t// if ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && process.env.WORKER_INDEX === '0') {\n\t\t\t\t\t// \tconst { operationType, fullDocument, documentKey, updateDescription } = change;\n\t\t\t\t\t// \tconst docId = documentKey._id;\n\n\t\t\t\t\t// \tlet oldDocument = null;\n\n\t\t\t\t\t// \t// For updates and deletes, you might need to fetch the old document if not provided\n\t\t\t\t\t// \tif (operationType === 'update' || operationType === 'replace' || operationType === 'delete') {\n\t\t\t\t\t// \t\t// Assuming the old document can be obtained via changeStream\n\t\t\t\t\t// \t\toldDocument = change.fullDocumentBeforeChange || await collection.findOne({ _id: docId });\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// \t// Handle Versioning\n\t\t\t\t\t// \tif (collection.useVersions && oldDocument) {\n\t\t\t\t\t// \t\tawait db.collection('yourCollection_versions').insertOne({\n\t\t\t\t\t// \t\t\t...oldDocument,\n\t\t\t\t\t// \t\t\t_id: { _id: oldDocument._id, __v: oldDocument.__v },\n\t\t\t\t\t// \t\t});\n\n\t\t\t\t\t// \t\t// Optionally, delete old versions (keep only the latest N versions)\n\t\t\t\t\t// \t\tconst versionsToKeep = 5;\n\t\t\t\t\t// \t\tawait db.collection('yourCollection_versions').deleteMany({\n\t\t\t\t\t// \t\t\t'_id._id': oldDocument._id,\n\t\t\t\t\t// \t\t\t'_id.__v': { $lt: oldDocument.__v - versionsToKeep + 1 },\n\t\t\t\t\t// \t\t});\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// \t// Handle Logging\n\t\t\t\t\t// \tif (this.createLogs) {\n\t\t\t\t\t// \tawait db.collection('logs').insertOne({\n\t\t\t\t\t// \t\t_id: new ObjectId(),\n\t\t\t\t\t// \t\ttype: 'document',\n\t\t\t\t\t// \t\tcollection: 'yourCollection',\n\t\t\t\t\t// \t\tid_document: docId,\n\t\t\t\t\t// \t\toldDocument,\n\t\t\t\t\t// \t\tnewDocument: fullDocument,\n\t\t\t\t\t// \t\tmethod: operationType,\n\t\t\t\t\t// \t\ttimestamp: new Date(),\n\t\t\t\t\t// \t\t// Include any additional information like user, messageId, route, etc.\n\t\t\t\t\t// \t});\n\n\t\t\t\t\t// \tchangeStream.on('error', (error) => {\n\t\t\t\t\t// \t\tconsole.error('Error in Change Stream:', error);\n\t\t\t\t\t// \t\t// Handle error, possibly restarting the stream\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\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\t// Method to extract index name from error message\n\textractIndexNameFromError(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\tasync bulkWrite(\n\t\toperations: any[],\n\t\toptions?: BulkWriteOptions,\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 BATCH_SIZE = 1000;\n\t\tlet opIndex = 0;\n\t\n\t\twhile (opIndex < operations.length) {\n\t\t\tconst batchOps = operations.slice(opIndex, opIndex + BATCH_SIZE);\n\t\n\t\t\t// Initialize arrays for transformed operations, logs, and version filters\n\t\t\tconst transformedOps = [];\n\t\t\tconst logs = [];\n\t\t\tconst versionFilters = [];\n\t\n\t\t\tfor (const op of batchOps) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tconst doc = op[opType];\n\t\n\t\t\t\t// Skip validation if bypassCheckSchema is true\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validationContext = this.simplschema.newContext();\n\t\t\t\t\tlet isValid: boolean;\n\t\n\t\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t\tisValid = validationContext.validate(doc.document);\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\t\tisValid = validationContext.validate(doc.replacement);\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t\t// For updates, validate the update modifier\n\t\t\t\t\t\tisValid = validationContext.validate(doc.update, { modifier: true });\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t\t// No validation needed for deletes\n\t\t\t\t\t\tisValid = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for ${opType}: ${JSON.stringify(validationContext.validationErrors())}`\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// Now proceed to transform the operations\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Convert insertOne to updateOne with upsert and aggregation pipeline\n\t\t\t\t\tconst filter = { _id: doc.document._id || new ObjectId() };\n\t\t\t\t\ttransformedOps.push({\n\t\t\t\t\t\tupdateOne: {\n\t\t\t\t\t\t\tfilter,\n\t\t\t\t\t\t\tupdate: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\t\t...doc.document,\n\t\t\t\t\t\t\t\t\t\tcreatedAt: { $ifNull: ['$createdAt', '$$NOW'] },\n\t\t\t\t\t\t\t\t\t\tupdatedAt: '$$NOW',\n\t\t\t\t\t\t\t\t\t\t__v: { $ifNull: ['$__v', 0] },\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\tupsert: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (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: new ObjectId(),\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: filter._id,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.document)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.document, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\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\ttimestamp: new Date(),\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\t// Prepare version filter\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionFilters.push({ _id: filter._id });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t// Store the original update for logging/versioning if needed\n\t\t\t\t\tconst originalUpdate = doc.update;\n\t\n\t\t\t\t\t// Now transform the update into an aggregation pipeline\n\t\t\t\t\t// Use aggregation pipeline to handle various update operators\n\t\t\t\t\tconst updatePipeline = [];\n\t\t\t\t\tconst setOps = {};\n\t\t\t\t\tconst unsetOps = [];\n\t\t\t\t\tconst incOps = {};\n\t\t\t\t\tconst pushOps = {};\n\t\t\t\t\tconst addToSetOps = {};\n\t\t\t\t\tconst setOnInsertOps = {};\n\t\n\t\t\t\t\t// Handle $set operations\n\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\tObject.assign(setOps, doc.update.$set);\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Handle $unset operations\n\t\t\t\t\tif (doc.update.$unset) {\n\t\t\t\t\t\tunsetOps.push(...Object.keys(doc.update.$unset));\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Handle $inc operations\n\t\t\t\t\tif (doc.update.$inc) {\n\t\t\t\t\t\tfor (const [field, value] of Object.entries(doc.update.$inc)) {\n\t\t\t\t\t\t\tincOps[field] = { $add: [`$${field}`, value] };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Handle $push operations\n\t\t\t\t\tif (doc.update.$push) {\n\t\t\t\t\t\tfor (const [field, value] of Object.entries(doc.update.$push)) {\n\t\t\t\t\t\t\tpushOps[field] = { $concatArrays: [`$${field}`, [value]] };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Handle $addToSet operations\n\t\t\t\t\tif (doc.update.$addToSet) {\n\t\t\t\t\t\tfor (const [field, value] of Object.entries(doc.update.$addToSet)) {\n\t\t\t\t\t\t\taddToSetOps[field] = {\n\t\t\t\t\t\t\t\t$setUnion: [`$${field}`, Array.isArray(value) ? value : [value]],\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// Handle $setOnInsert operations (for upserts)\n\t\t\t\t\tif (doc.update.$setOnInsert) {\n\t\t\t\t\t\tObject.assign(setOnInsertOps, doc.update.$setOnInsert);\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Construct the aggregation pipeline\n\t\t\t\t\tconst pipelineStage: any = {\n\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\tupdatedAt: '$$NOW',\n\t\t\t\t\t\t\t__v: { $add: [{ $ifNull: ['$__v', 0] }, 1] },\n\t\t\t\t\t\t\t...setOps,\n\t\t\t\t\t\t\t...incOps,\n\t\t\t\t\t\t\t...pushOps,\n\t\t\t\t\t\t\t...addToSetOps,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\n\t\t\t\t\tif (Object.keys(setOnInsertOps).length > 0) {\n\t\t\t\t\t\tpipelineStage.$setOnInsert = {\n\t\t\t\t\t\t\tcreatedAt: '$$NOW',\n\t\t\t\t\t\t\t...setOnInsertOps,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\n\t\t\t\t\tupdatePipeline.push(pipelineStage);\n\t\n\t\t\t\t\tif (unsetOps.length > 0) {\n\t\t\t\t\t\tupdatePipeline.push({\n\t\t\t\t\t\t\t$unset: unsetOps,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\ttransformedOps.push({\n\t\t\t\t\t\t[opType]: {\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t\tupdate: updatePipeline,\n\t\t\t\t\t\t\tupsert: doc.upsert || false,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (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: new ObjectId(),\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.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(originalUpdate)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(originalUpdate, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\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\ttimestamp: new Date(),\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\t// Prepare version filter\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionFilters.push(doc.filter);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\tconst filter = doc.filter;\n\t\t\t\t\ttransformedOps.push({\n\t\t\t\t\t\tupdateOne: {\n\t\t\t\t\t\t\tfilter,\n\t\t\t\t\t\t\tupdate: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$replaceWith: {\n\t\t\t\t\t\t\t\t\t\t...doc.replacement,\n\t\t\t\t\t\t\t\t\t\tupdatedAt: '$$NOW',\n\t\t\t\t\t\t\t\t\t\t__v: { $add: [{ $ifNull: ['$__v', 0] }, 1] },\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\tupsert: doc.upsert || false,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (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: new ObjectId(),\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: filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.replacement)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.replacement, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\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\ttimestamp: new Date(),\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\t// Prepare version filter\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionFilters.push(filter);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t// Keep delete operations as they are\n\t\t\t\t\ttransformedOps.push(op);\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (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: new ObjectId(),\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.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.filter)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.filter, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\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\ttimestamp: new Date(),\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\t// Prepare version filter\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionFilters.push(doc.filter);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Execute bulkWrite\n\t\t\tconst monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([transformedOps, options]));\n\t\t\tawait ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(transformedOps, options);\n\t\t\tmonitor.finish();\n\t\n\t\t\t// Insert logs in bulk\n\t\t\tif (this.createLogs && logs.length > 0) {\n\t\t\t\tawait Logs.bulkWrite(logs);\n\t\t\t}\n\t\n\t\t\t// Handle versioning\n\t\t\tif (this.useVersions && versionFilters.length > 0) {\n\t\t\t\t// Fetch the affected documents\n\t\t\t\tconst affectedDocs = await ResolveIOServer.getMainDB().collection(this.collectionName).find({ $or: versionFilters }).toArray();\n\t\n\t\t\t\t// Prepare version documents\n\t\t\t\tconst versionDocs = affectedDocs.map((doc) => ({\n\t\t\t\t\treplaceOne: {\n\t\t\t\t\t\tfilter: { _id: { _id: doc._id, __v: doc.__v } },\n\t\t\t\t\t\treplacement: {\n\t\t\t\t\t\t\t_id: { _id: doc._id, __v: doc.__v },\n\t\t\t\t\t\t\t...doc,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tupsert: true,\n\t\t\t\t\t},\n\t\t\t\t}));\n\t\n\t\t\t\t// Insert versions in bulk\n\t\t\t\tif (versionDocs.length > 0) {\n\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(versionDocs);\n\t\t\t\t}\n\t\n\t\t\t\t// Delete old versions beyond the latest 5\n\t\t\t\ttry {\n\t\t\t\t\tconst pipeline = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: { '_id._id': { $in: affectedDocs.map((doc) => doc._id) } },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$sort: { '_id._id': 1, '_id.__v': -1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t_id: '$_id._id',\n\t\t\t\t\t\t\t\tversions: { $push: '$_id' },\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\t\t$project: {\n\t\t\t\t\t\t\t\tversionsToDelete: { $slice: ['$versions', 5, { $size: '$versions' }] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $unwind: '$versionsToDelete' },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$replaceRoot: { newRoot: { _id: '$versionsToDelete' } },\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\n\t\t\t\t\tconst oldVersions = await ResolveIOServer.getMainDB().collection(this.collectionName).aggregate(pipeline).toArray();\n\t\n\t\t\t\t\tif (oldVersions.length > 0) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).deleteMany({ _id: { $in: oldVersions.map((v) => v._id) } });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (error) {\n\t\t\t\t\tconsole.error('Error during version cleanup:', error);\n\t\t\t\t\t// Handle the error as needed\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\topIndex += BATCH_SIZE;\n\t\n\t\t\t// Yield to the event loop\n\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\n\t\t\t// Invalidate cache\n\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t}\n\t\n\t\treturn { ok: 1 } as BulkWriteResult; // Adjust return value as per your requirements\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\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.value;\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: doc._id as string,\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<Document> {\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.value;\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: doc._id as string,\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.value;\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 as string,\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.value;\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.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: <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","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","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","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","includes","endsWith","startsWith","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","invalidateQueryCache","collectionCacheMap","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","_c","entries","_d","_e","changeStream","watch","$match","$and","ns.coll","$nin","$not","fullDocument","on","change","__awaiter","coll","err","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","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassCheckSchema","BATCH_SIZE","opIndex","batchOps","slice","transformedOps","logs","versionFilters","e_4","batchOps_1","batchOps_1_1","op","opType","Object","doc","validationContext","newContext","isValid","validate","document","replacement","modifier","Error","concat","validationErrors","ObjectId","_b","documentWithoutId","__rest","updateOne","$set","__assign","createdAt","$ifNull","updatedAt","__v","upsert","insertOne","id_document","payload","method","id_user","user","messageId","route","timestamp","originalUpdate","updatePipeline","setOps","unsetOps","incOps","pushOps","addToSetOps","setOnInsertOps","setWithoutId","assign","$unset","apply","$inc","e_5","_f","field","$add","$push","e_6","_g","_h","_j","$concatArrays","$addToSet","e_7","_k","_l","_m","$setUnion","Array","isArray","$setOnInsert","_o","setOnInsertWithoutId","pipelineStage","_u","_p","replacementWithoutId","$replaceWith","_v","$or","affectedDocs","versionDocs","map","replaceOne","$in","$sort","$group","versions","$project","versionsToDelete","$slice","$size","$unwind","$replaceRoot","newRoot","oldVersions","deleteMany","v","error_1","setImmediate","ok","estimatedDocumentCount","monitor_2","err_1","create","f_docs","insertMany","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_2","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_3","bypassLogs","docs","i","objectIdHexString","versionDoc","$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","validation","date","getMethodManager","callMethodInternal","call","findOneAndUpdate","indexExists","bypassMonitor","validationResults","forEach","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","objectContainsPropertyDeep","monitor_13","monitor_14","monitor_15","monitor_16","watchCollection","queue","task","callback","dbCollection","code","err_4","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","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, ChangeStreamDocument } 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\t$gt?: P;\n\t$gte?: P;\n\t$in?: P extends Array<any> ? P : P[];\n\t$lt?: P;\n\t$lte?: P;\n\t$ne?: P;\n\t$nin?: P extends Array<any> ? P : P[];\n\t$not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n\t$exists?: boolean;\n\t$expr?: any[]\n\t$regex?: P extends string ? RegExpConstructor | string : never;\n\t$options?: P extends string ? string : never;\n\t$geoIntersects?: {\n\t\t$geometry: Document;\n\t};\n\t$geoWithin?: Document;\n\t$near?: Document;\n\t$nearSphere?: Document;\n\t$maxDistance?: number;\n\t$all?: any[];\n\t$elemMatch?: Document;\n\t$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\t$and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$text?: {\n\t\t$search: string;\n\t\t$language?: string;\n\t\t$caseSensitive?: boolean;\n\t\t$diacriticSensitive?: boolean;\n\t};\n\t$where?: string | ((this: T) => boolean);\n\t$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\t$inc?: MongoManagerIncFilter<T> | Document;\n\t$set?: MongoManagerFilter<T> | Document;\n\t$setOnInsert?: MongoManagerFilter<T> | Document;\n\t$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, collections: string[] }> = 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\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Cache', collectionName);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Already running', collectionName);\n\t\t\t}\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Find - Running', collectionName);\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Done', collectionName);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\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\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Cache', collectionName);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Already running', collectionName);\n\t\t\t}\n\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo FindOne - Running', collectionName);\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Done', collectionName);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\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\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Cache', collections);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Already running', collections);\n\t\t\t}\n\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Agg - Running', collections);\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: collections\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Done', collections);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\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, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\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\t!collections.includes('logs') &&\n\t\t\t!collections.includes('log-method-latencies') &&\n\t\t\t!collections.includes('log-subscriptions') &&\n\t\t\t!collections.find(a => a.endsWith('.versions')) &&\n\t\t\t!collections.find(a => a.startsWith('monitor-'))\n\t\t) {\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\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Invalidate Cache', collection);\n\t\t}\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\n\t\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Mongo Invalidated During Execution', cacheMap.collections);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [key, operation] of this._operationInProgress.entries()) {\n\t\t\tif (operation.collections.includes(collection)) {\n\t\t\t\toperation.invalidatedDuringExecution = true;\n\t\t\n\t\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Mongo Invalidated During Execution (No cache)', operation.collections);\n\t\t\t\t}\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.getMainDB();\n\n\t\tconst pipeline = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$and: [\n\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst changeStream = db.watch(pipeline, { fullDocument: 'updateLookup' });\n\n\t\tchangeStream.on('change', async (change: any) => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\t\t\t\tconst collection = this.collection(collectionName);\n\n\t\t\t\tif (collection) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\n\t\t\t\t\t// if ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && process.env.WORKER_INDEX === '0') {\n\t\t\t\t\t// \tconst { operationType, fullDocument, documentKey, updateDescription } = change;\n\t\t\t\t\t// \tconst docId = documentKey._id;\n\n\t\t\t\t\t// \tlet oldDocument = null;\n\n\t\t\t\t\t// \t// For updates and deletes, you might need to fetch the old document if not provided\n\t\t\t\t\t// \tif (operationType === 'update' || operationType === 'replace' || operationType === 'delete') {\n\t\t\t\t\t// \t\t// Assuming the old document can be obtained via changeStream\n\t\t\t\t\t// \t\toldDocument = change.fullDocumentBeforeChange || await collection.findOne({ _id: docId });\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// \t// Handle Versioning\n\t\t\t\t\t// \tif (collection.useVersions && oldDocument) {\n\t\t\t\t\t// \t\tawait db.collection('yourCollection_versions').insertOne({\n\t\t\t\t\t// \t\t\t...oldDocument,\n\t\t\t\t\t// \t\t\t_id: { _id: oldDocument._id, __v: oldDocument.__v },\n\t\t\t\t\t// \t\t});\n\n\t\t\t\t\t// \t\t// Optionally, delete old versions (keep only the latest N versions)\n\t\t\t\t\t// \t\tconst versionsToKeep = 5;\n\t\t\t\t\t// \t\tawait db.collection('yourCollection_versions').deleteMany({\n\t\t\t\t\t// \t\t\t'_id._id': oldDocument._id,\n\t\t\t\t\t// \t\t\t'_id.__v': { $lt: oldDocument.__v - versionsToKeep + 1 },\n\t\t\t\t\t// \t\t});\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// \t// Handle Logging\n\t\t\t\t\t// \tif (this.createLogs) {\n\t\t\t\t\t// \tawait db.collection('logs').insertOne({\n\t\t\t\t\t// \t\t_id: new ObjectId(),\n\t\t\t\t\t// \t\ttype: 'document',\n\t\t\t\t\t// \t\tcollection: 'yourCollection',\n\t\t\t\t\t// \t\tid_document: docId,\n\t\t\t\t\t// \t\toldDocument,\n\t\t\t\t\t// \t\tnewDocument: fullDocument,\n\t\t\t\t\t// \t\tmethod: operationType,\n\t\t\t\t\t// \t\ttimestamp: new Date(),\n\t\t\t\t\t// \t\t// Include any additional information like user, messageId, route, etc.\n\t\t\t\t\t// \t});\n\n\t\t\t\t\t// \tchangeStream.on('error', (error) => {\n\t\t\t\t\t// \t\tconsole.error('Error in Change Stream:', error);\n\t\t\t\t\t// \t\t// Handle error, possibly restarting the stream\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\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\t// Method to extract index name from error message\n\textractIndexNameFromError(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\tasync bulkWrite(\n\t\toperations: any[],\n\t\toptions?: BulkWriteOptions,\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 BATCH_SIZE = 1000;\n\t\tlet opIndex = 0;\n\t\n\t\twhile (opIndex < operations.length) {\n\t\t\tconst batchOps = operations.slice(opIndex, opIndex + BATCH_SIZE);\n\t\n\t\t\t// Initialize arrays for transformed operations, logs, and version filters\n\t\t\tconst transformedOps = [];\n\t\t\tconst logs = [];\n\t\t\tconst versionFilters = [];\n\t\n\t\t\tfor (const op of batchOps) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tconst doc = op[opType];\n\t\n\t\t\t\t// Skip validation if bypassCheckSchema is true\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validationContext = this.simplschema.newContext();\n\t\t\t\t\tlet isValid: boolean;\n\t\n\t\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t\tisValid = validationContext.validate(doc.document);\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\t\tisValid = validationContext.validate(doc.replacement);\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t\t// For updates, validate the update modifier\n\t\t\t\t\t\tisValid = validationContext.validate(doc.update, { modifier: true });\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t\t// No validation needed for deletes\n\t\t\t\t\t\tisValid = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for ${opType}: ${JSON.stringify(validationContext.validationErrors())}`\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// Now proceed to transform the operations\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Convert insertOne to updateOne with upsert and aggregation pipeline\n\t\t\t\t\tconst filter = { _id: doc.document._id || new ObjectId() };\n\t\t\t\t\tconst { _id, ...documentWithoutId } = doc.document; // Exclude _id from $set\n\t\n\t\t\t\t\ttransformedOps.push({\n\t\t\t\t\t\tupdateOne: {\n\t\t\t\t\t\t\tfilter,\n\t\t\t\t\t\t\tupdate: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\t\t...documentWithoutId,\n\t\t\t\t\t\t\t\t\t\tcreatedAt: { $ifNull: ['$createdAt', '$$NOW'] },\n\t\t\t\t\t\t\t\t\t\tupdatedAt: '$$NOW',\n\t\t\t\t\t\t\t\t\t\t__v: { $ifNull: ['$__v', 0] },\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\tupsert: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (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: new ObjectId(),\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: filter._id,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.document)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.document, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\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\ttimestamp: new Date(),\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\t// Prepare version filter\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionFilters.push({ _id: filter._id });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t// Store the original update for logging/versioning if needed\n\t\t\t\t\tconst originalUpdate = doc.update;\n\t\n\t\t\t\t\t// Now transform the update into an aggregation pipeline\n\t\t\t\t\t// Use aggregation pipeline to handle various update operators\n\t\t\t\t\tconst updatePipeline = [];\n\t\t\t\t\tconst setOps = {};\n\t\t\t\t\tconst unsetOps = [];\n\t\t\t\t\tconst incOps = {};\n\t\t\t\t\tconst pushOps = {};\n\t\t\t\t\tconst addToSetOps = {};\n\t\t\t\t\tconst setOnInsertOps = {};\n\t\n\t\t\t\t\t// Handle $set operations\n\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t// Exclude _id from $set\n\t\t\t\t\t\tconst { _id, ...setWithoutId } = doc.update.$set;\n\t\t\t\t\t\tObject.assign(setOps, setWithoutId);\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Handle $unset operations\n\t\t\t\t\tif (doc.update.$unset) {\n\t\t\t\t\t\tunsetOps.push(...Object.keys(doc.update.$unset));\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Handle $inc operations\n\t\t\t\t\tif (doc.update.$inc) {\n\t\t\t\t\t\tfor (const [field, value] of Object.entries(doc.update.$inc)) {\n\t\t\t\t\t\t\tincOps[field] = { $add: [`$${field}`, value] };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Handle $push operations\n\t\t\t\t\tif (doc.update.$push) {\n\t\t\t\t\t\tfor (const [field, value] of Object.entries(doc.update.$push)) {\n\t\t\t\t\t\t\tpushOps[field] = { $concatArrays: [`$${field}`, [value]] };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Handle $addToSet operations\n\t\t\t\t\tif (doc.update.$addToSet) {\n\t\t\t\t\t\tfor (const [field, value] of Object.entries(doc.update.$addToSet)) {\n\t\t\t\t\t\t\taddToSetOps[field] = {\n\t\t\t\t\t\t\t\t$setUnion: [`$${field}`, Array.isArray(value) ? value : [value]],\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// Handle $setOnInsert operations (for upserts)\n\t\t\t\t\tif (doc.update.$setOnInsert) {\n\t\t\t\t\t\t// Exclude _id from $setOnInsert\n\t\t\t\t\t\tconst { _id, ...setOnInsertWithoutId } = doc.update.$setOnInsert;\n\t\t\t\t\t\tObject.assign(setOnInsertOps, setOnInsertWithoutId);\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Construct the aggregation pipeline\n\t\t\t\t\tconst pipelineStage: any = {\n\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\tupdatedAt: '$$NOW',\n\t\t\t\t\t\t\t__v: { $add: [{ $ifNull: ['$__v', 0] }, 1] },\n\t\t\t\t\t\t\t...setOps,\n\t\t\t\t\t\t\t...incOps,\n\t\t\t\t\t\t\t...pushOps,\n\t\t\t\t\t\t\t...addToSetOps,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\n\t\t\t\t\tif (Object.keys(setOnInsertOps).length > 0) {\n\t\t\t\t\t\tpipelineStage.$setOnInsert = {\n\t\t\t\t\t\t\tcreatedAt: '$$NOW',\n\t\t\t\t\t\t\t...setOnInsertOps,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\n\t\t\t\t\tupdatePipeline.push(pipelineStage);\n\t\n\t\t\t\t\tif (unsetOps.length > 0) {\n\t\t\t\t\t\tupdatePipeline.push({\n\t\t\t\t\t\t\t$unset: unsetOps,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\ttransformedOps.push({\n\t\t\t\t\t\t[opType]: {\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t\tupdate: updatePipeline,\n\t\t\t\t\t\t\tupsert: doc.upsert || false,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (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: new ObjectId(),\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.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(originalUpdate)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(originalUpdate, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\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\ttimestamp: new Date(),\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\t// Prepare version filter\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionFilters.push(doc.filter);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\tconst filter = doc.filter;\n\t\t\t\t\tconst { _id, ...replacementWithoutId } = doc.replacement; // Exclude _id\n\t\n\t\t\t\t\ttransformedOps.push({\n\t\t\t\t\t\tupdateOne: {\n\t\t\t\t\t\t\tfilter,\n\t\t\t\t\t\t\tupdate: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$replaceWith: {\n\t\t\t\t\t\t\t\t\t\t...replacementWithoutId,\n\t\t\t\t\t\t\t\t\t\tupdatedAt: '$$NOW',\n\t\t\t\t\t\t\t\t\t\t__v: { $add: [{ $ifNull: ['$__v', 0] }, 1] },\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\tupsert: doc.upsert || false,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (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: new ObjectId(),\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: filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.replacement)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.replacement, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\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\ttimestamp: new Date(),\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\t// Prepare version filter\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionFilters.push(filter);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t// Keep delete operations as they are\n\t\t\t\t\ttransformedOps.push(op);\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (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: new ObjectId(),\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.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.filter)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.filter, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\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\ttimestamp: new Date(),\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\t// Prepare version filter\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionFilters.push(doc.filter);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Execute bulkWrite\n\t\t\tconst monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([transformedOps, options]));\n\t\t\tawait ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(transformedOps, options);\n\t\t\tmonitor.finish();\n\t\n\t\t\t// Insert logs in bulk\n\t\t\tif (this.createLogs && logs.length > 0) {\n\t\t\t\tawait ResolveIOServer.getMainDB().collection('logs').bulkWrite(logs);\n\t\t\t}\n\t\n\t\t\t// Handle versioning\n\t\t\tif (this.useVersions && versionFilters.length > 0) {\n\t\t\t\t// Fetch the affected documents\n\t\t\t\tconst affectedDocs = await ResolveIOServer.getMainDB().collection(this.collectionName).find({ $or: versionFilters }).toArray();\n\t\n\t\t\t\t// Prepare version documents\n\t\t\t\tconst versionDocs = affectedDocs.map((doc) => ({\n\t\t\t\t\treplaceOne: {\n\t\t\t\t\t\tfilter: { _id: { _id: doc._id, __v: doc.__v } },\n\t\t\t\t\t\treplacement: {\n\t\t\t\t\t\t\t_id: { _id: doc._id, __v: doc.__v },\n\t\t\t\t\t\t\t...doc,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tupsert: true,\n\t\t\t\t\t},\n\t\t\t\t}));\n\t\n\t\t\t\t// Insert versions in bulk\n\t\t\t\tif (versionDocs.length > 0) {\n\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(versionDocs);\n\t\t\t\t}\n\t\n\t\t\t\t// Delete old versions beyond the latest 5\n\t\t\t\ttry {\n\t\t\t\t\tconst pipeline = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: { '_id._id': { $in: affectedDocs.map((doc) => doc._id) } },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$sort: { '_id._id': 1, '_id.__v': -1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t_id: '$_id._id',\n\t\t\t\t\t\t\t\tversions: { $push: '$_id' },\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\t\t$project: {\n\t\t\t\t\t\t\t\tversionsToDelete: { $slice: ['$versions', 5, { $size: '$versions' }] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $unwind: '$versionsToDelete' },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$replaceRoot: { newRoot: { _id: '$versionsToDelete' } },\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\n\t\t\t\t\tconst oldVersions = await ResolveIOServer.getMainDB().collection(this.versionCollection).aggregate(pipeline).toArray();\n\t\n\t\t\t\t\tif (oldVersions.length > 0) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).deleteMany({ _id: { $in: oldVersions.map((v) => v._id) } });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (error) {\n\t\t\t\t\tconsole.error('Error during version cleanup:', error);\n\t\t\t\t\t// Handle the error as needed\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\topIndex += BATCH_SIZE;\n\t\n\t\t\t// Yield to the event loop\n\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\n\t\t\t// Invalidate cache\n\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t}\n\t\n\t\treturn { ok: 1 } as BulkWriteResult; // Adjust return value as per your requirements\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\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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.value;\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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 as string,\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<Document> {\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.value;\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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 as string,\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.value;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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 as string,\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.value;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\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}"]}
|