@resolveio/server-lib 20.7.5 → 20.7.6
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","resolveio_server_app_1","user_collection_1","common_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","AsyncLocalStorage","asyncLocalStorage","MongoManager","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","setupChangeStream","prototype","oneTimeTransaction","fn","Promise","resolve","reject","run","__awaiter","_this","session","ResolveIOServer","getMongoConnection","startSession","getStore","withTransaction","result","_a","sent","err_1","endSession","store","getSession","_heapLimit","initServerCollections","getMainDB","listCollections","toArray","collections","getServerCollections","registerCollection","collection","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","setTimeout","filter","options","safeOptions","__rest","cacheKey","generateCacheKey","undefined","getFromCache","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","_b","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","coll","err","close","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","skipCache","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","bypassSession","default","buildRbLookups","buildRbSchema","setInterval","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","safeOptions_1","monitor_1","mongoSession","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassCheckSchema","bypassLogs","bypassVersions","BATCH_SIZE","opIndex","sessionOptions","batchOps","slice","logs","versionOps","e_5","batchOps_1","batchOps_1_1","op","opType","Object","doc","validationContext","newContext","isValid","validate","document","replacement","modifier","Error","concat","validationErrors","createdAt","updatedAt","insertOne","objectIdHexString","id_document","payload","method","id_user","user","messageId","route","versionDoc","__assign","__v","$set","$inc","affectedDocs","versionFilters","map","v","$or","versionInserts","bwOptions","ordered","e_4","getServerConfig","getLocalLogManager","writeLogs","affectedDocIds","$in","$sort","$group","versions","$push","$project","versionsToDelete","$slice","$size","$unwind","$replaceRoot","newRoot","oldVersions","deleteMany","error_1","setImmediate","ok","estimatedDocumentCount","monitor_2","err_2","create","f_docs","Array","isArray","insertMany","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_3","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_4","docs","i","writeLog","upsert","replaceOne","$lt","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","monitor_6","findCount","count","findCursor","removeAllListeners","findStream","safeOptions_2","monitor_7","findOneAndReplace","validation","date","getMethodManager","callMethod","call","findOneAndUpdate","$setOnInsert","indexExists","bypassMonitor","validationResults","forEach","validDocs","idx","hasOwnProperty","monitor_8","listIndexes","rename","newName","monitor_9","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_10","monitor_11","returnDocument","safeOptions_3","monitor_12","monitor_13","updateMany","$unset","objectContainsPropertyDeep","updateOne","monitor_14","monitor_15","monitor_16","monitor_17","watchCollection","queue","task","callback","dbCollection","apply","code","err_5","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","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 '../resolveio-server-app';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc, objectIdHexString } from '../util/common';\nimport { UserModel } from '../models/user.model';\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';\nconst { AsyncLocalStorage } = require('async_hooks');\nconst asyncLocalStorage = new AsyncLocalStorage();\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 _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor() {\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\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tasync oneTimeTransaction(fn) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tasyncLocalStorage.run({}, async () => {\n\t\t\t\tconst session = ResolveIOServer.getMongoConnection().startSession();\n\t\t\t\tasyncLocalStorage.getStore().session = session;\n\n\t\t\t\ttry {\n\t\t\t\t\t// Let withTransaction return the value from fn()\n\t\t\t\t\tlet result = await session.withTransaction(async () => {\n\t\t\t\t\t\treturn fn(); // If fn returns something, we capture it in `result`\n\t\t\t\t\t});\n\n\t\t\t\t\t// If we got here, transaction committed successfully\n\t\t\t\t\tresolve(result);\n\t\t\t\t} \n\t\t\t\tcatch (err) {\n\t\t\t\t\treject(err);\n\t\t\t\t} \n\t\t\t\tfinally {\n\t\t\t\t\tsession.endSession();\n\t\t\t\t\t\n\t\t\t\t\tconst store = asyncLocalStorage.getStore();\n\t\t\t\t\tif (store) {\n\t\t\t\t\t\tdelete store.session; // or store.session = undefined\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\t\n\tgetSession() {\n\t\tlet store = asyncLocalStorage.getStore();\n\t\treturn store ? store.session : null;\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(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\tlet { session, ...safeOptions } = options || {};\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, safeOptions]);\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(collectionName);\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, safeOptions]));\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\tlet { session, ...safeOptions } = options || {};\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, safeOptions]);\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(collectionName);\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, safeOptions]));\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\tlet { session, ...safeOptions } = options || {};\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, safeOptions]);\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(collectionName);\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, safeOptions]));\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\tlet { session, ...safeOptions } = options || {};\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, safeOptions]);\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(collectionName);\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, safeOptions]));\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.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: [\n\t\t\t\t\t\t\t'log-method-latencies', \n\t\t\t\t\t\t\t'log-subscriptions', \n\t\t\t\t\t\t\t'logs', \n\t\t\t\t\t\t\t'counters', \n\t\t\t\t\t\t\t'cron-job-histories', \n\t\t\t\t\t\t\t'email-histories',\n\t\t\t\t\t\t\t'qb-soap-request-histories', \n\t\t\t\t\t\t\t'qb-soap-request-responses', \n\t\t\t\t\t\t\t'qb-soap-requests',\n\t\t\t\t\t\t\t'qb-soap-retries'\n\t\t\t\t\t\t] }},\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\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\tskipCache: true\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\tskipCache?: boolean;\n\tbypassSession?: boolean;\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\tskipCache = false;\n\tbypassSession = false;\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\t\tthis.skipCache = options.skipCache || false;\n\t\tthis.bypassSession = options.bypassSession || false;\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\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\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\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\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}\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false, bypassSession = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!skipCache && !this.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 { session, ...safeOptions } = options || {};\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, safeOptions]));\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, safeOptions, 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, bypassSession = false) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions, bypassSession = false): AggregationCursor {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {\n\t\t\t\t\tsession: mongoSession\n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, safeOptions]));\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, bypassSession = false) {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {\n\t\t\t\t\tsession: mongoSession\n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, safeOptions, 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\tbypassLogs = false,\n\t\tbypassVersions = false, \n\t\tbypassSession = 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\n\t\tlet sessionOptions = null;\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session: mongoSession};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\n\t\t\tsessionOptions = {session: mongoSession};\n\t\t}\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 logs and version operations\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = [];\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 process the operations\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// If this.timestamps is true, set createdAt and updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (!doc.document.createdAt) {\n\t\t\t\t\t\t\tdoc.document.createdAt = new Date();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!doc.document.updatedAt) {\n\t\t\t\t\t\t\tdoc.document.updatedAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id || objectIdHexString(),\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\tcreatedAt: 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 document\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tconst versionDoc = {\n\t\t\t\t\t\t\t...doc.document,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t_id: { _id: doc.document._id || objectIdHexString(), __v: 0 },\n\t\t\t\t\t\t};\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: versionDoc\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// Since we might have modified doc.document, update the operation\n\t\t\t\t\top[opType].document = doc.document;\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t// If this.timestamps is true, add updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (!doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If this.useVersions is true, increment __v\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\tdoc.update.$inc = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.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.update)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.update, 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\tcreatedAt: 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// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// No need to modify the operation further\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\t// If this.timestamps is true, set updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If this.useVersions is true, increment __v\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tdoc.replacement.__v = (doc.replacement.__v || 0) + 1;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.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\tcreatedAt: 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// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Since we might have modified doc.replacement, update the operation\n\t\t\t\t\top[opType].replacement = doc.replacement;\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.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\tcreatedAt: 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// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// No need to modify the operation\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\n\t\t\tlet affectedDocs = [];\n\t\n\t\t\t// Handle versioning\n\t\t\tif (!bypassVersions && this.useVersions && versionOps.length > 0) {\n\t\t\t\ttry {\n\t\t\t\t\t// Fetch the affected documents\n\t\t\t\t\tconst versionFilters = versionOps.map((v) => v.filter);\n\t\t\t\t\taffectedDocs = await ResolveIOServer.getMainDB().collection(this.collectionName).find({ $or: versionFilters }, sessionOptions).toArray();\n\t\t\n\t\t\t\t\t// Prepare version documents\n\t\t\t\t\tconst versionInserts = affectedDocs.map((doc) => ({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t...doc,\n\t\t\t\t\t\t\t\t_id: { _id: doc._id, __v: doc.__v },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\t// Insert versions in bulk\n\t\t\t\t\tif (versionInserts.length > 0) {\n\t\t\t\t\t\tlet bwOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tbwOptions = {ordered: false};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tbwOptions = {session: mongoSession, ordered: false};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(<any>versionInserts, bwOptions);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tconsole.error('Error during version creation:', e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\t// Execute bulkWrite\n\t\t\tconst monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([batchOps, safeOptions]));\n\t\t\tawait ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(batchOps, options);\n\t\t\tmonitor.finish();\n\t\n\t\t\t// Insert logs in bulk\n\t\t\tif (!bypassLogs && this.createLogs && logs.length > 0) {\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t) {\n\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLogs(logs.map(a => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: a\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\tlet bwOptions = null;\n\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\tbwOptions = {ordered: false};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbwOptions = {session: mongoSession, ordered: false};\n\t\t\t\t\t}\n\n\t\t\t\t\tawait ResolveIOServer.getMainDB().collection('logs').bulkWrite(logs, bwOptions);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t// Delete old versions beyond the latest 5\n\t\t\t\ttry {\n\t\t\t\t\tconst affectedDocIds = affectedDocs.map((doc) => doc._id);\n\t\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: affectedDocIds } },\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, sessionOptions).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) } }, sessionOptions);\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\tif (!this.skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t}\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\tbypassSession = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\ttry {\n\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 && !this.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, safeOptions]));\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, safeOptions, 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}\n\t\t\tcatch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', this.collectionName, filter, safeOptions, 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, bypassSession = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\t\t\t\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif ((this.createLogs && !bypassLogs) || this.useVersions) {\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\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'deleteMany',\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\tcreatedAt: 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\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: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteMany',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session: mongoSession, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, 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, bypassSession = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, safeOptions]));\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: doc._id as string,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'deleteOne',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\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\n\t\t\t\t\t\t\tlet versionOptions = null;\n\t\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\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}}]}, sessionOptions);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t}\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, safeOptions, 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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t}\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, safeOptions, 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, bypassSession = false): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions, bypassSession = false): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions, bypassSession = false): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions, bypassSession = false): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([safeOptions]));\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, safeOptions, 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, bypassSession = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif (!skipCache && !this.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, safeOptions]));\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, safeOptions, 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>, skipCache = false, bypassSession = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif (!skipCache && !this.skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, {_id: id}, 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('findById', this.collectionName, JSON.stringify([{_id: id}, safeOptions]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, 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 By Id', this.collectionName, {_id: id}, safeOptions, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, bypassSession = false): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, safeOptions]));\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, safeOptions, 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>, bypassSession = false): FindCursor {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session: mongoSession};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet { session, ...safeOptions } = options || {};\n\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, safeOptions]));\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, bypassSession = false) {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session: mongoSession};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet { session, ...safeOptions } = options || {};\n\t\t\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, safeOptions, 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, bypassSession = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!skipCache && !this.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 { session, ...safeOptions } = options || {};\n\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, safeOptions]));\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, safeOptions, 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, bypassSession = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, safeOptions]));\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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\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\tcreatedAt: 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\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: doc._id as string,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, safeOptions]));\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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\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\tcreatedAt: 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\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: doc._id as string,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, safeOptions]));\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) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\t\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\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: <string>doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\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\tcreatedAt: 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\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: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions, bypassSession = false): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions, bypassSession = false): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, safeOptions]));\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\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\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\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, safeOptions])) < 200000 ? JSON.stringify([doc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'insertMany',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\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, safeOptions])) < 200000 ? JSON.stringify([doc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'insertMany',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t}\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t) {\n\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\tdata: {\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, safeOptions])) < 200000 ? JSON.stringify([doc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'insertOne',\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\tcreatedAt: new Date()\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\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, safeOptions])) < 200000 ? JSON.stringify([doc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertOne',\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\tcreatedAt: new Date()\n\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions, bypassSession = false): ListIndexesCursor {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session: mongoSession};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet { session, ...safeOptions } = options || {};\n\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([safeOptions]));\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, bypassSession = false): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\nif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, safeOptions]));\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, safeOptions, 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, bypassSession = 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();\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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\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}}]}, sessionOptions);\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t}\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, safeOptions, 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\tif (\n\t\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, safeOptions])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, safeOptions])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\t}\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, safeOptions, 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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\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: replacement._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, replacement, safeOptions], 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\tcreatedAt: 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\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, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, replacement, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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 { session, ...safeOptions } = options || {};\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, safeOptions]));\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: <string>doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: replacement._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, replacement, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t}\n\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, safeOptions, 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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateMany',\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\tcreatedAt: 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\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: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateMany',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\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}}]}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\n\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, safeOptions, 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, bypassSession = 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().callMethod.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\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\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\tcreatedAt: 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\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: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\n\t\t\t\t\tlet versionOptions = null;\n\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t}\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\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}}]}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\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: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\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\tcreatedAt: 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\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: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, update, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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, safeOptions]));\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: <any>doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\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 {\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, safeOptions, 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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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, bypassSession = false): ChangeStream<T> {\n\t\tconst session = ResolveIOServer.getMongoManager().getSession();\n\t\tif (session && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = session;\n\t\t\t}\n\t\t}\n\t\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\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","resolveio_server_app_1","user_collection_1","common_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","AsyncLocalStorage","asyncLocalStorage","MongoManager","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","setupChangeStream","prototype","oneTimeTransaction","fn","Promise","resolve","reject","run","__awaiter","_this","session","ResolveIOServer","getMongoConnection","startSession","getStore","withTransaction","result","_a","sent","err_1","endSession","store","getSession","_heapLimit","initServerCollections","getMainDB","listCollections","toArray","collections","getServerCollections","registerCollection","collection","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","setTimeout","filter","options","safeOptions","__rest","cacheKey","generateCacheKey","undefined","getFromCache","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","_b","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","coll","err","close","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","skipCache","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","bypassSession","default","buildRbLookups","buildRbSchema","setInterval","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","safeOptions_1","monitor_1","mongoSession","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassCheckSchema","bypassLogs","bypassVersions","BATCH_SIZE","opIndex","sessionOptions","batchOps","slice","logs","versionOps","e_5","batchOps_1","batchOps_1_1","op","opType","Object","doc","validationContext","newContext","isValid","validate","document","replacement","modifier","Error","concat","validationErrors","createdAt","updatedAt","insertOne","objectIdHexString","id_document","payload","method","id_user","user","messageId","route","versionDoc","__assign","__v","$set","$inc","affectedDocs","versionFilters","map","v","$or","versionInserts","bwOptions","ordered","e_4","getServerConfig","getLocalLogManager","writeLogs","affectedDocIds","$in","$sort","$group","versions","$push","$project","versionsToDelete","$slice","$size","$unwind","$replaceRoot","newRoot","oldVersions","deleteMany","error_1","setImmediate","ok","estimatedDocumentCount","monitor_2","err_2","create","f_docs","Array","isArray","insertMany","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_3","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_4","docs","i","writeLog","upsert","replaceOne","$lt","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","monitor_6","findCount","count","findCursor","removeAllListeners","findStream","safeOptions_2","monitor_7","findOneAndReplace","validation","date","getMethodManager","callMethod","call","findOneAndUpdate","$setOnInsert","indexExists","bypassMonitor","validationResults","forEach","validDocs","idx","hasOwnProperty","monitor_8","listIndexes","rename","newName","monitor_9","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_10","monitor_11","returnDocument","safeOptions_3","monitor_12","monitor_13","updateMany","$unset","objectContainsPropertyDeep","updateOne","monitor_14","monitor_15","monitor_16","monitor_17","watchCollection","queue","task","callback","dbCollection","apply","code","err_5","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","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 '../resolveio-server-app';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc, objectIdHexString } from '../util/common';\nimport { UserModel } from '../models/user.model';\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';\nconst { AsyncLocalStorage } = require('async_hooks');\nconst asyncLocalStorage = new AsyncLocalStorage();\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 _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor() {\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\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tasync oneTimeTransaction(fn) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tasyncLocalStorage.run({}, async () => {\n\t\t\t\tconst session = ResolveIOServer.getMongoConnection().startSession();\n\t\t\t\tasyncLocalStorage.getStore().session = session;\n\n\t\t\t\ttry {\n\t\t\t\t\t// Let withTransaction return the value from fn()\n\t\t\t\t\tlet result = await session.withTransaction(async () => {\n\t\t\t\t\t\treturn fn(); // If fn returns something, we capture it in `result`\n\t\t\t\t\t});\n\n\t\t\t\t\t// If we got here, transaction committed successfully\n\t\t\t\t\tresolve(result);\n\t\t\t\t} \n\t\t\t\tcatch (err) {\n\t\t\t\t\treject(err);\n\t\t\t\t} \n\t\t\t\tfinally {\n\t\t\t\t\tsession.endSession();\n\t\t\t\t\t\n\t\t\t\t\tlet store = asyncLocalStorage.getStore();\n\t\t\t\t\tif (store) {\n\t\t\t\t\t\tdelete store.session; // or store.session = undefined\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\t\n\tgetSession() {\n\t\tconst store = asyncLocalStorage.getStore();\n\t\treturn store ? store.session : null;\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(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\tlet { session, ...safeOptions } = options || {};\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, safeOptions]);\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(collectionName);\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, safeOptions]));\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\tlet { session, ...safeOptions } = options || {};\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, safeOptions]);\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(collectionName);\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, safeOptions]));\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\tlet { session, ...safeOptions } = options || {};\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, safeOptions]);\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(collectionName);\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, safeOptions]));\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\tlet { session, ...safeOptions } = options || {};\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, safeOptions]);\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(collectionName);\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, safeOptions]));\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.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: [\n\t\t\t\t\t\t\t'log-method-latencies', \n\t\t\t\t\t\t\t'log-subscriptions', \n\t\t\t\t\t\t\t'logs', \n\t\t\t\t\t\t\t'counters', \n\t\t\t\t\t\t\t'cron-job-histories', \n\t\t\t\t\t\t\t'email-histories',\n\t\t\t\t\t\t\t'qb-soap-request-histories', \n\t\t\t\t\t\t\t'qb-soap-request-responses', \n\t\t\t\t\t\t\t'qb-soap-requests',\n\t\t\t\t\t\t\t'qb-soap-retries'\n\t\t\t\t\t\t] }},\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\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\tskipCache: true\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\tskipCache?: boolean;\n\tbypassSession?: boolean;\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\tskipCache = false;\n\tbypassSession = false;\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\t\tthis.skipCache = options.skipCache || false;\n\t\tthis.bypassSession = options.bypassSession || false;\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\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\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\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\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}\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false, bypassSession = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!skipCache && !this.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 { session, ...safeOptions } = options || {};\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, safeOptions]));\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, safeOptions, 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, bypassSession = false) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions, bypassSession = false): AggregationCursor {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {\n\t\t\t\t\tsession: mongoSession\n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, safeOptions]));\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, bypassSession = false) {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {\n\t\t\t\t\tsession: mongoSession\n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\n\t\tlet { session, ...safeOptions } = options || {};\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, safeOptions, 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\tbypassLogs = false,\n\t\tbypassVersions = false, \n\t\tbypassSession = 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\n\t\tlet sessionOptions = null;\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session: mongoSession};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\n\t\t\tsessionOptions = {session: mongoSession};\n\t\t}\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 logs and version operations\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = [];\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 process the operations\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// If this.timestamps is true, set createdAt and updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (!doc.document.createdAt) {\n\t\t\t\t\t\t\tdoc.document.createdAt = new Date();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!doc.document.updatedAt) {\n\t\t\t\t\t\t\tdoc.document.updatedAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id || objectIdHexString(),\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\tcreatedAt: 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 document\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tconst versionDoc = {\n\t\t\t\t\t\t\t...doc.document,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t_id: { _id: doc.document._id || objectIdHexString(), __v: 0 },\n\t\t\t\t\t\t};\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: versionDoc\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// Since we might have modified doc.document, update the operation\n\t\t\t\t\top[opType].document = doc.document;\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t// If this.timestamps is true, add updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (!doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If this.useVersions is true, increment __v\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\tdoc.update.$inc = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.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.update)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.update, 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\tcreatedAt: 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// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// No need to modify the operation further\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\t// If this.timestamps is true, set updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If this.useVersions is true, increment __v\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tdoc.replacement.__v = (doc.replacement.__v || 0) + 1;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.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\tcreatedAt: 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// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Since we might have modified doc.replacement, update the operation\n\t\t\t\t\top[opType].replacement = doc.replacement;\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.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\tcreatedAt: 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// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// No need to modify the operation\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\n\t\t\tlet affectedDocs = [];\n\t\n\t\t\t// Handle versioning\n\t\t\tif (!bypassVersions && this.useVersions && versionOps.length > 0) {\n\t\t\t\ttry {\n\t\t\t\t\t// Fetch the affected documents\n\t\t\t\t\tconst versionFilters = versionOps.map((v) => v.filter);\n\t\t\t\t\taffectedDocs = await ResolveIOServer.getMainDB().collection(this.collectionName).find({ $or: versionFilters }, sessionOptions).toArray();\n\t\t\n\t\t\t\t\t// Prepare version documents\n\t\t\t\t\tconst versionInserts = affectedDocs.map((doc) => ({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t...doc,\n\t\t\t\t\t\t\t\t_id: { _id: doc._id, __v: doc.__v },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\t// Insert versions in bulk\n\t\t\t\t\tif (versionInserts.length > 0) {\n\t\t\t\t\t\tlet bwOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tbwOptions = {ordered: false};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tbwOptions = {session: mongoSession, ordered: false};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(<any>versionInserts, bwOptions);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tconsole.error('Error during version creation:', e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\t// Execute bulkWrite\n\t\t\tconst monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([batchOps, safeOptions]));\n\t\t\tawait ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(batchOps, options);\n\t\t\tmonitor.finish();\n\t\n\t\t\t// Insert logs in bulk\n\t\t\tif (!bypassLogs && this.createLogs && logs.length > 0) {\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t) {\n\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLogs(logs.map(a => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: a\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\tlet bwOptions = null;\n\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\tbwOptions = {ordered: false};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbwOptions = {session: mongoSession, ordered: false};\n\t\t\t\t\t}\n\n\t\t\t\t\tawait ResolveIOServer.getMainDB().collection('logs').bulkWrite(logs, bwOptions);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t// Delete old versions beyond the latest 5\n\t\t\t\ttry {\n\t\t\t\t\tconst affectedDocIds = affectedDocs.map((doc) => doc._id);\n\t\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: affectedDocIds } },\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, sessionOptions).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) } }, sessionOptions);\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\tif (!this.skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t}\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\tbypassSession = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\ttry {\n\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 && !this.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, safeOptions]));\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, safeOptions, 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}\n\t\t\tcatch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', this.collectionName, filter, safeOptions, 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, bypassSession = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\t\t\t\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif ((this.createLogs && !bypassLogs) || this.useVersions) {\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\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'deleteMany',\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\tcreatedAt: 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\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: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteMany',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session: mongoSession, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, 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, bypassSession = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, safeOptions]));\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: doc._id as string,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'deleteOne',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\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\n\t\t\t\t\t\t\tlet versionOptions = null;\n\t\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\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}}]}, sessionOptions);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t}\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, safeOptions, 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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t}\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, safeOptions, 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, bypassSession = false): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions, bypassSession = false): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions, bypassSession = false): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions, bypassSession = false): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([safeOptions]));\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, safeOptions, 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, bypassSession = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif (!skipCache && !this.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, safeOptions]));\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, safeOptions, 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>, skipCache = false, bypassSession = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif (!skipCache && !this.skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, {_id: id}, 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('findById', this.collectionName, JSON.stringify([{_id: id}, safeOptions]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, 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 By Id', this.collectionName, {_id: id}, safeOptions, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, bypassSession = false): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, safeOptions]));\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, safeOptions, 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>, bypassSession = false): FindCursor {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session: mongoSession};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet { session, ...safeOptions } = options || {};\n\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, safeOptions]));\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, bypassSession = false) {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session: mongoSession};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet { session, ...safeOptions } = options || {};\n\t\t\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, safeOptions, 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, bypassSession = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!skipCache && !this.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 { session, ...safeOptions } = options || {};\n\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, safeOptions]));\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, safeOptions, 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, bypassSession = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, safeOptions]));\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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\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\tcreatedAt: 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\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: doc._id as string,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, safeOptions])) < 200000 ? JSON.stringify([doc, filter, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, safeOptions]));\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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\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\tcreatedAt: 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\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: doc._id as string,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, safeOptions]));\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) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\t\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\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: <string>doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\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\tcreatedAt: 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\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: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions, bypassSession = false): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([safeOptions]));\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions, bypassSession = false): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, safeOptions]));\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\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\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\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, safeOptions])) < 200000 ? JSON.stringify([doc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'insertMany',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\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, safeOptions])) < 200000 ? JSON.stringify([doc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'insertMany',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t}\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t) {\n\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\tdata: {\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, safeOptions])) < 200000 ? JSON.stringify([doc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'insertOne',\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\tcreatedAt: new Date()\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\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, safeOptions])) < 200000 ? JSON.stringify([doc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertOne',\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\tcreatedAt: new Date()\n\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\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, safeOptions, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions, bypassSession = false): ListIndexesCursor {\n\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session: mongoSession};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = mongoSession;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet { session, ...safeOptions } = options || {};\n\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([safeOptions]));\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, bypassSession = false): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\nif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tsession: mongoSession\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\n\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, safeOptions]));\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, safeOptions, 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, bypassSession = 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();\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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\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}}]}, sessionOptions);\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t}\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, safeOptions, 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\tif (\n\t\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, safeOptions])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, safeOptions])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\t}\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, safeOptions, 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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\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: replacement._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, replacement, safeOptions], 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\tcreatedAt: 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\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, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, replacement, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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 { session, ...safeOptions } = options || {};\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, safeOptions]));\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: <string>doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, safeOptions])) < 200000 ? JSON.stringify([doc, filter, replacement, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, replacement, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: replacement._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, replacement, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t}\n\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, safeOptions, 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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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, bypassSession = 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().callMethod.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\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateMany',\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\tcreatedAt: 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\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: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateMany',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\tlet versionOptions = null;\n\t\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\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}}]}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t}\n\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, safeOptions, 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, bypassSession = 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().callMethod.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\n\t\t\tconst mongoSession = ResolveIOServer.getMongoManager().getSession();\n\t\t\tlet sessionOptions = null;\n\t\t\tif (mongoSession && !bypassSession && !this.bypassSession) {\n\t\t\t\tif (!options) {\n\t\t\t\t\toptions = {session: mongoSession};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptions.session = mongoSession;\n\t\t\t\t}\n\n\t\t\t\tsessionOptions = {session: mongoSession};\n\t\t\t}\n\n\t\t\tlet { session, ...safeOptions } = options || {};\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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\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\tcreatedAt: 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\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: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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\n\t\t\t\t\tlet versionOptions = null;\n\t\t\t\t\tif (!sessionOptions) {\n\t\t\t\t\t\tversionOptions = {upsert: true};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tversionOptions = {session, upsert: true};\n\t\t\t\t\t}\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, versionOptions);\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}}]}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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\tif (\n\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\tdata: {\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: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\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\tcreatedAt: 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\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: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, update, safeOptions], 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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t}, sessionOptions);\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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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, safeOptions]));\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: <any>doc._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, safeOptions])) < 200000 ? JSON.stringify([doc, filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t}, sessionOptions);\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\tif (\n\t\t\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\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\telse {\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: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, safeOptions])) < 200000 ? JSON.stringify(['upsert', filter, update, safeOptions], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'updateOne',\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\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\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 {\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, safeOptions, 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, safeOptions]));\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\tif (!this.skipCache) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t}\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, safeOptions, 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, bypassSession = false): ChangeStream<T> {\n\t\tconst session = ResolveIOServer.getMongoManager().getSession();\n\t\tif (session && !bypassSession && !this.bypassSession) {\n\t\t\tif (!options) {\n\t\t\t\toptions = {session};\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.session = session;\n\t\t\t}\n\t\t}\n\t\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\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}"]}
|