@resolveio/server-lib 20.4.58 → 20.4.59

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,2 +1,2 @@
1
- "use strict";var __extends=this&&this.__extends||function(){var t=function(e,n){return(t=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,n){e.__proto__=n}:function(e,n){for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=n[t])}))(e,n)};return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function __(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(__.prototype=n.prototype,new __)}}(),__awaiter=this&&this.__awaiter||function(e,o,i,r){return new(i=i||Promise)(function(t,n){function fulfilled(e){try{step(r.next(e))}catch(e){n(e)}}function rejected(e){try{step(r.throw(e))}catch(e){n(e)}}function step(e){var n;e.done?t(e.value):((n=e.value)instanceof i?n:new i(function(e){e(n)})).then(fulfilled,rejected)}step((r=r.apply(e,o||[])).next())})},__generator=this&&this.__generator||function(o,i){var r,a,s,c={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]},l={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function verb(t){return function(e){var n=[t,e];if(r)throw new TypeError("Generator is already executing.");for(;c=l&&n[l=0]?0:c;)try{if(r=1,a&&(s=2&n[0]?a.return:n[0]?a.throw||((s=a.return)&&s.call(a),0):a.next)&&!(s=s.call(a,n[1])).done)return s;switch(a=0,(n=s?[2&n[0],s.value]:n)[0]){case 0:case 1:s=n;break;case 4:return c.label++,{value:n[1],done:!1};case 5:c.label++,a=n[1],n=[0];continue;case 7:n=c.ops.pop(),c.trys.pop();continue;default:if(!(s=0<(s=c.trys).length&&s[s.length-1])&&(6===n[0]||2===n[0])){c=0;continue}if(3===n[0]&&(!s||n[1]>s[0]&&n[1]<s[3]))c.label=n[1];else if(6===n[0]&&c.label<s[1])c.label=s[1],s=n;else{if(!(s&&c.label<s[2])){s[2]&&c.ops.pop(),c.trys.pop();continue}c.label=s[2],c.ops.push(n)}}n=i.call(o,c)}catch(e){n=[6,e],a=0}finally{r=s=0}if(5&n[0])throw n[1];return{value:n[0]?n[1]:void 0,done:!0}}}},__read=this&&this.__read||function(e,n){var t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var o,i,r=t.call(e),a=[];try{for(;(void 0===n||0<n--)&&!(o=r.next()).done;)a.push(o.value)}catch(e){i={error:e}}finally{try{o&&!o.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a},__spreadArray=this&&this.__spreadArray||function(e,n,t){if(t||2===arguments.length)for(var o,i=0,r=n.length;i<r;i++)!o&&i in n||((o=o||Array.prototype.slice.call(n,0,i))[i]=n[i]);return e.concat(o||Array.prototype.slice.call(n))},__values=this&&this.__values||function(e){var n="function"==typeof Symbol&&Symbol.iterator,t=n&&e[n],o=0;if(t)return t.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&o>=e.length?void 0:e)&&e[o++],done:!e}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")},simpl_schema_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.objectIdHexString=exports.MongoManagerUserCollection=exports.MongoManagerCollection=exports.MongoManagerModel=exports.MongoManager=void 0,require("simpl-schema")),mongodb_1=require("mongodb"),index_1=require("../index"),user_collection_1=require("../collections/user.collection"),common_1=require("../util/common"),log_collection_1=require("../collections/log.collection"),NodeCache=require("node-cache"),crypto=require("crypto"),scmp=require("scmp"),monitor_manager_1=require("./monitor.manager"),os_1=require("os"),numCPUs=(0,os_1.cpus)().length,v8=require("v8"),async_1=require("async"),sift_1=require("sift"),MongoManager=function(){function MongoManager(e){this._collections=[],this._cacheMap=[],this._operationInProgress=new Map,this._heapSize=v8.getHeapStatistics()/numCPUs,this._serverCollections=[],this._serverConfig=null,this._isWorkersEnabled=!1,this._isWorkerInstance=!1,this._serverConfig=e,this._nodeCache=new NodeCache({stdTTL:0,checkperiod:0}),this._isWorkersEnabled="true"===process.env.IS_WORKERS_ENABLED,this._isWorkerInstance="true"===process.env.IS_WORKER_INSTANCE,this.setCacheLimit(),this.initServerCollections(),this._isWorkersEnabled&&this._isWorkerInstance&&this.setupChangeStream()}return MongoManager.prototype.setCacheLimit=function(){this._isWorkersEnabled?this._heapLimit=this._isWorkerInstance?.8*this._heapSize:.4*this._heapSize:this._heapLimit=.3*this._heapSize},MongoManager.prototype.initServerCollections=function(){return __awaiter(this,void 0,void 0,function(){var n;return __generator(this,function(e){switch(e.label){case 0:return[4,index_1.ResolveIOServer.getMainDB().listCollections().toArray()];case 1:return n=e.sent(),this._serverCollections=n,[2]}})})},MongoManager.prototype.getServerCollections=function(){return this._serverCollections},MongoManager.prototype.registerCollection=function(n){var e=this;n.collectionOptions&&n.collectionOptions.timeseries&&n.collectionOptions.timeseries.timeField&&this._serverCollections.some(function(e){return e.name===n.collectionName&&"collection"===e.type})&&index_1.ResolveIOServer.getMainDB().dropCollection(n.collectionName).then(function(){e.createCollection(n)}),this._collections.push(n)},MongoManager.prototype.createCollection=function(e){index_1.ResolveIOServer.getMainDB().createCollection(e.collectionName,e.collectionOptions)},MongoManager.prototype.collections=function(){return this._collections},MongoManager.prototype.collection=function(n){return this._collections.find(function(e){return e.collectionName===n})},MongoManager.prototype.delay=function(n){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){return[2,new Promise(function(e){return setTimeout(e,n)})]})})},MongoManager.prototype.find=function(i,r,a){return void 0===r&&(r={}),__awaiter(this,void 0,void 0,function(){var n,t,o=this;return __generator(this,function(e){return n=this.generateCacheKey([i],"find",[r,a]),void 0!==(t=this.getFromCache(n))?[2,t]:this._operationInProgress.has(n)?[2,this._operationInProgress.get(n).promise]:(t=this.executeFind(i,r,a,n),this._operationInProgress.set(n,{promise:t,invalidatedDuringExecution:!1}),t.finally(function(){return o._operationInProgress.delete(n)}),[2,t])})})},MongoManager.prototype.executeFind=function(o,i,r,a){return __awaiter(this,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return n=index_1.ResolveIOServer.getMainDB().collection(o),t=new monitor_manager_1.MonitorMongo("find",o,JSON.stringify([i,r])),[4,n.find(i,r).toArray()];case 1:return n=e.sent(),t.finish(),this._operationInProgress.get(a).invalidatedDuringExecution||this.addToCache([o],a,n),[2,n]}})})},MongoManager.prototype.findOne=function(i,r,a){return void 0===r&&(r={}),__awaiter(this,void 0,void 0,function(){var n,t,o=this;return __generator(this,function(e){return n=this.generateCacheKey([i],"findOne",[r,a]),void 0!==(t=this.getFromCache(n))?[2,t]:this._operationInProgress.has(n)?[2,this._operationInProgress.get(n).promise]:(t=this.executeFindOne(i,r,a,n),this._operationInProgress.set(n,{promise:t,invalidatedDuringExecution:!1}),t.finally(function(){return o._operationInProgress.delete(n)}),[2,t])})})},MongoManager.prototype.executeFindOne=function(o,i,r,a){return __awaiter(this,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return n=index_1.ResolveIOServer.getMainDB().collection(o),t=new monitor_manager_1.MonitorMongo("findOne",o,JSON.stringify([i,r])),[4,n.findOne(i,r)];case 1:return n=e.sent(),t.finish(),this._operationInProgress.get(a).invalidatedDuringExecution||this.addToCache([o],a,n),[2,n]}})})},MongoManager.prototype.aggregate=function(r,a,s){return __awaiter(this,void 0,void 0,function(){var n,t,o,i=this;return __generator(this,function(e){return n=__spreadArray([r],__read(a.flatMap(function(e){var n;return null!=(n=e.$lookup)&&n.from?[e.$lookup.from]:[]})),!1),t=this.generateCacheKey(n,"aggregate",[a,s]),void 0!==(o=this.getFromCache(t))?[2,o]:this._operationInProgress.has(t)?[2,this._operationInProgress.get(t).promise]:(o=this.executeAggregate(r,a,s,t,n),this._operationInProgress.set(t,{promise:o,invalidatedDuringExecution:!1}),o.finally(function(){return i._operationInProgress.delete(t)}),[2,o])})})},MongoManager.prototype.executeAggregate=function(o,i,r,a,s){return __awaiter(this,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return n=index_1.ResolveIOServer.getMainDB().collection(o),t=new monitor_manager_1.MonitorMongo("aggregate",o,JSON.stringify([i,r])),[4,n.aggregate(i,r).toArray()];case 1:return n=e.sent(),t.finish(),this._operationInProgress.get(a).invalidatedDuringExecution||this.addToCache(s,a,n),[2,n]}})})},MongoManager.prototype.countDocuments=function(i,r,a){return void 0===r&&(r={}),__awaiter(this,void 0,void 0,function(){var n,t,o=this;return __generator(this,function(e){return n=this.generateCacheKey([i],"countDocuments",[r,a]),void 0!==(t=this.getFromCache(n))?[2,t]:this._operationInProgress.has(n)?[2,this._operationInProgress.get(n).promise]:(t=this.executeCountDocuments(i,r,a,n),this._operationInProgress.set(n,{promise:t,invalidatedDuringExecution:!1}),t.finally(function(){return o._operationInProgress.delete(n)}),[2,t])})})},MongoManager.prototype.executeCountDocuments=function(o,i,r,a){return __awaiter(this,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return n=index_1.ResolveIOServer.getMainDB().collection(o),t=new monitor_manager_1.MonitorMongo("countDocuments",o,JSON.stringify([i,r])),[4,n.countDocuments(i,r)];case 1:return n=e.sent(),t.finish(),this._operationInProgress.get(a).invalidatedDuringExecution||this.addToCache([o],a,n),[2,n]}})})},MongoManager.prototype.generateCacheKey=function(e,n,t){e=JSON.stringify({collections:e,functionName:n,args:t});return crypto.createHash("sha256").update(e).digest("hex")},MongoManager.prototype.getFromCache=function(n){try{var e=this._nodeCache.get(n);if(e)return JSON.parse(e,common_1.dateReviver)}catch(e){this._nodeCache.del(n)}},MongoManager.prototype.addToCache=function(e,n,t){var o,i;if((0,common_1.getBinarySize)(JSON.stringify(t))<1e6){var r=this._nodeCache.getStats().vsize;if(r>this._heapLimit){var a=0,s=this._nodeCache.keys();try{for(var c=__values(s),l=c.next();!l.done;l=c.next()){var d=l.value;if(this._nodeCache.del(d),a+=1,(r=this._nodeCache.getStats().vsize)<.75*this._heapLimit)break}}catch(e){o={error:e}}finally{try{l&&!l.done&&(i=c.return)&&i.call(c)}finally{if(o)throw o.error}}console.log("Query Cache: Too Big, - Deleted: "+a+" - "+r)}this._nodeCache.set(n,JSON.stringify(t)),this._cacheMap.push({collections:e,key:n})}},MongoManager.prototype.invalidateQueryCache=function(n){var t,e,o=this._cacheMap.filter(function(e){return e.collections.includes(n)});try{for(var i=__values(o),r=i.next();!r.done;r=i.next()){var a=r.value;this._nodeCache.del(a.key),this._operationInProgress.has(a.key)&&(this._operationInProgress.get(a.key).invalidatedDuringExecution=!0)}}catch(e){t={error:e}}finally{try{r&&!r.done&&(e=i.return)&&e.call(i)}finally{if(t)throw t.error}}this._cacheMap=this._cacheMap.filter(function(e){return!e.collections.includes(n)})},MongoManager.prototype.setupChangeStream=function(){var n=this,t=index_1.ResolveIOServer.getMainDB().watch([{$match:{$and:[{"ns.coll":{$nin:["logs","log-method-latencies","log-subscriptions"]}},{"ns.coll":{$not:/.*\.versions$/}},{"ns.coll":{$not:/^monitor-/}}]}}]);t.on("change",function(t){return __awaiter(n,void 0,void 0,function(){var n;return __generator(this,function(e){return t.ns&&t.ns.coll&&(n=t.ns.coll,this.collection(n))&&this.invalidateQueryCache(n),[2]})})}),t.on("error",function(e){console.log(new Date,"Mongo change stream error. Restart..."),t.close(),setTimeout(function(){return n.setupChangeStream()},5e3)}),t.on("close",function(){console.log(new Date,"Mongo change stream closed. Restarting..."),setTimeout(function(){return n.setupChangeStream()},5e3)})},MongoManager}(),MongoManagerModel=(exports.MongoManager=MongoManager,function(e){var n;this.collection_main=null,this.collection_version=null,"users"===e.collectionName?this.collection_main=new MongoManagerUserCollection(e):this.collection_main=new MongoManagerCollection(e),e.useVersionCollection&&(this.collection_main.useVersions=!0,(n=(0,common_1.deepCopy)(e.schema))._id.type="Object",n._id.blackbox=!0,n={collectionName:e.collectionName+".versions",schema:n,useVersionCollection:!1,useReportBuilder:!1,reportBuilderLookupTables:[],timestamps:!0,createLogs:!1,checkSchema:!1,collectionOptions:null},"users"===e.collectionName?this.collection_version=new MongoManagerUserCollection(n):this.collection_version=new MongoManagerCollection(n),this.collection_version.createIndex({"_id._id":1,"_id.__v":1}),this.collection_main.versionCollection=e.collectionName+".versions")}),MongoManagerCollection=(exports.MongoManagerModel=MongoManagerModel,function(){function MongoManagerCollection(e){var n,t=this,o=(this.collectionName="",this.checkSchema=!1,this.simplschema=null,this.rbSchema=null,this.timestamps=!1,this.useVersions=!1,this.versionCollection="",this.createLogs=!0,this.useRB=!1,this.collectionName=e.collectionName,this.simplschema=new simpl_schema_1.default(e.schema),this.timestamps=e.timestamps,this.createLogs=e.createLogs,this.checkSchema=e.checkSchema,this.collectionOptions=e.collectionOptions,e.useReportBuilder&&(this.useRB=!0,n=(0,common_1.deepCopy)(e.schema),e=(0,common_1.buildRbLookups)(e.reportBuilderLookupTables,n,[]),this.rbSchema=(0,common_1.buildRbSchema)(e)),setInterval(function(){index_1.ResolveIOServer&&index_1.ResolveIOServer.getMainServer()&&index_1.ResolveIOServer.getMongoManager()&&index_1.ResolveIOServer.getMongoManager().getServerCollections().length&&(index_1.ResolveIOServer.getMongoManager().registerCollection(t),clearInterval(o))},1))}var e;return MongoManagerCollection.prototype.extractIndexNameFromError=function(e){var n=e.match(/Index already exists with a different name: (\S+)/);return(n=!n||n.length<=1?e.match(/existing index:.*name: "([^"]+)"/):n)&&1<n.length?n[1]:null},MongoManagerCollection.prototype.aggregate=function(i,r,e){var a=this;return void 0===e&&(e=!1),new Promise(function(n,t){var o;e?(o=new monitor_manager_1.MonitorMongo("aggregate",a.collectionName,JSON.stringify([i,r])),index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).aggregate(i,r).toArray().then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Aggregate",a.collectionName,i,r,e),t(e)})):index_1.ResolveIOServer.getMongoManager().aggregate(a.collectionName,i,r).then(function(e){n(e)},function(e){t(e)})})},MongoManagerCollection.prototype.aggregateCount=function(r,a){return __awaiter(this,void 0,void 0,function(){var i=this;return __generator(this,function(e){return[2,new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("aggregateCount",i.collectionName,JSON.stringify([r,a]));index_1.ResolveIOServer.getMainDB().collection(i.collectionName,i.collectionOptions).aggregate(r,a).toArray().then(function(e){o.finish(),n(e.length)},function(e){o.finish(),console.log(new Date,"Error Aggregate",i.collectionName,r,a,e),t(0)})})]})})},MongoManagerCollection.prototype.aggregateCursor=function(e,n){var t=new monitor_manager_1.MonitorMongo("aggregateCursor",this.collectionName,JSON.stringify([e,n])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).aggregate(e,n);return e.on("close",function(e){return t.finish(),e}),e},MongoManagerCollection.prototype.aggregateStream=function(e,n,t){var o=new monitor_manager_1.MonitorMongo("aggregateStream",this.collectionName,JSON.stringify([e,n,t])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).aggregate(e,n).stream(t);return e.on("end",function(e){return o.finish(),e}).on("error",function(e){return o.finish(),e}).on("close",function(e){return o.finish(),e}),e},MongoManagerCollection.prototype.bulkWrite=function(P,j,L,U){return void 0===L&&(L=!1),void 0===U&&(U=!1),__awaiter(this,void 0,void 0,function(){var n,t,o,i,r,a,s,c,l,d,u,g,_,h,m,f,v,p,M,y,O,S,N,x,w,I,C,D,b,R,A,B,E,$,J,k;return __generator(this,function(e){switch(e.label){case 0:if(!P.length)return[2,null];for(n=[],t=[],o=new Set,i=[],r=new Set,a=0;a<P.length;a++)if(s=P[a],c=Object.keys(s)[0],C=s[c],"insertOne"===c){if(C.document._id||(C.document._id=objectIdHexString()),this.useVersions&&void 0===C.document.__v&&(C.document.__v=0),this.timestamps&&(l=new Date,C.document.createdAt=C.document.createdAt||l,C.document.updatedAt=C.document.updatedAt||l),this.checkSchema&&!U&&!(d=this.simplschema.newContext()).validate(C.document))throw new Error("Schema validation failed for insertOne: ".concat(JSON.stringify(d.validationErrors())));n.push(s),!L&&this.createLogs&&t.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:C.document._id,payload:(0,common_1.getBinarySize)(JSON.stringify([s,j]))<2e5?JSON.stringify([s,j],null,2):"Too Big",method:c,id_user:"",user:"",messageId:0,route:""}}}),this.useVersions&&o.add(C.document._id)}else if("updateOne"===c||"replaceOne"===c){if("updateOne"===c){if(C.update.$set||(C.update.$set={}),this.timestamps&&(C.update.$set.updatedAt=new Date),this.useVersions&&(C.update.$inc||(C.update.$inc={}),C.update.$inc.__v=1),C.upsert&&(C.update.$setOnInsert||(C.update.$setOnInsert={}),C.update.$setOnInsert._id||(C.update.$setOnInsert._id=objectIdHexString()),this.timestamps&&(C.update.$setOnInsert.createdAt=new Date),this.useVersions)&&(C.update.$setOnInsert.__v=0),this.checkSchema&&!U&&!(d=this.simplschema.newContext()).validate(C.update,{modifier:!0}))throw new Error("Schema validation failed for updateOne: ".concat(JSON.stringify(d.validationErrors())))}else if("replaceOne"===c&&(this.timestamps&&(C.replacement.updatedAt=new Date,C.upsert)&&!C.replacement.createdAt&&(C.replacement.createdAt=new Date),this.useVersions&&(C.replacement.__v=void 0!==C.replacement.__v?C.replacement.__v+1:0),this.checkSchema)&&!U&&!(d=this.simplschema.newContext()).validate(C.replacement))throw new Error("Schema validation failed for replaceOne: ".concat(JSON.stringify(d.validationErrors())));n.push(s),!L&&this.createLogs?(u="",C.filter&&C.filter._id?(u=C.filter._id,this.useVersions&&o.add(C.filter._id)):(i.push({filter:C.filter,opIndex:t.length,isSingle:!0}),this.extractFieldNames(C.filter,r)),t.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:u,payload:(0,common_1.getBinarySize)(JSON.stringify([s,j]))<2e5?JSON.stringify([s,j],null,2):"Too Big",method:c,id_user:"",user:"",messageId:0,route:""}}})):C.filter&&C.filter._id&&this.useVersions?o.add(C.filter._id):this.useVersions&&(i.push({filter:C.filter,opIndex:null,isSingle:!0}),this.extractFieldNames(C.filter,r))}else if("updateMany"===c){if(C.update.$set||(C.update.$set={}),this.timestamps&&(C.update.$set.updatedAt=new Date),this.useVersions&&(C.update.$inc||(C.update.$inc={}),C.update.$inc.__v=1),this.checkSchema&&!U&&!(d=this.simplschema.newContext()).validate(C.update,{modifier:!0}))throw new Error("Schema validation failed for updateMany: ".concat(JSON.stringify(d.validationErrors())));n.push(s),!L&&this.createLogs&&(i.push({filter:C.filter,opIndex:t.length,isUpdateMany:!0}),this.extractFieldNames(C.filter,r),t.push({insertMany:[]})),this.useVersions&&(i.push({filter:C.filter,opIndex:null,isUpdateMany:!0}),this.extractFieldNames(C.filter,r))}else{if("deleteOne"!==c&&"deleteMany"!==c)throw new Error("Unsupported operation type: ".concat(c));n.push(s),!L&&this.createLogs&&(u="",C.filter&&C.filter._id?(u=C.filter._id,this.useVersions&&o.add(C.filter._id)):(i.push({filter:C.filter,opIndex:t.length,isDeleteMany:"deleteMany"===c}),this.extractFieldNames(C.filter,r)),t.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:u,payload:(0,common_1.getBinarySize)(JSON.stringify([s,j]))<2e5?JSON.stringify([s,j],null,2):"Too Big",method:c,id_user:"",user:"",messageId:0,route:""}}})),this.useVersions&&(C.filter&&C.filter._id?o.add(C.filter._id):(i.push({filter:C.filter,opIndex:null,isDeleteMany:"deleteMany"===c}),this.extractFieldNames(C.filter,r)))}e.label=1;case 1:return(e.trys.push([1,10,,11]),i.length)?(_={$or:i.map(function(e){return e.filter})},g={_id:1},r.forEach(function(e){g[e]=1}),[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName).find(_,{projection:g}).toArray()]):[3,3];case 2:_=e.sent();try{for(h=__values(_),m=h.next();!m.done;m=h.next()){C=m.value;try{for(A=void 0,f=__values(i),v=f.next();!v.done;v=f.next())p=v.value,(0,sift_1.default)(p.filter)(C)&&(null!==p.opIndex&&(p.isUpdateMany||p.isDeleteMany?(t[p.opIndex].insertMany||(t[p.opIndex].insertMany=[]),t[p.opIndex].insertMany.push({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:C._id,payload:(0,common_1.getBinarySize)(JSON.stringify([P[p.opIndex],j]))<2e5?JSON.stringify([P[p.opIndex],j],null,2):"Too Big",method:P[p.opIndex]?Object.keys(P[p.opIndex])[0]:"",id_user:"",user:"",messageId:0,route:""})):p.isSingle&&(t[p.opIndex].insertOne.document.id_document=C._id)),this.useVersions)&&o.add(C._id)}catch(e){A={error:e}}finally{try{v&&!v.done&&(B=f.return)&&B.call(f)}finally{if(A)throw A.error}}}}catch(e){b={error:e}}finally{try{m&&!m.done&&(R=h.return)&&R.call(h)}finally{if(b)throw b.error}}e.label=3;case 3:return[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(n,j)];case 4:return(M=e.sent(),this.useVersions&&0<o.size)?(y=Array.from(o),[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName).aggregate([{$match:{_id:{$in:y}}},{$addFields:{_id:{_id:"$_id",__v:"$__v"}}},{$project:{__v:0}},{$merge:{into:this.versionCollection,whenMatched:"insert",whenNotMatched:"insert"}}]).toArray()]):[3,7];case 5:return(e.sent(),(D=y.map(function(e){return{deleteMany:{filter:{"_id._id":e,"_id.__v":{$lte:{$subtract:[{$toInt:"$$CURRENT.__v"},5]}}}}}})).length)?[4,index_1.ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(D,{ordered:!1})]:[3,7];case 6:e.sent(),e.label=7;case 7:if(L||!t.length)return[3,9];O=[];try{for(S=__values(t),N=S.next();!N.done;N=S.next())if((x=N.value).insertOne)O.push(x);else if(x.insertMany)try{for(J=void 0,w=__values(x.insertMany),I=w.next();!I.done;I=w.next())C=I.value,O.push({insertOne:{document:C}})}catch(e){J={error:e}}finally{try{I&&!I.done&&(k=w.return)&&k.call(w)}finally{if(J)throw J.error}}}catch(e){E={error:e}}finally{try{N&&!N.done&&($=S.return)&&$.call(S)}finally{if(E)throw E.error}}return O.length?[4,log_collection_1.Logs.bulkWrite(O,{ordered:!1})]:[3,9];case 8:e.sent(),e.label=9;case 9:return index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName),[2,M];case 10:throw D=e.sent(),console.error("Error in bulkWrite:",D),D;case 11:return[2]}})})},MongoManagerCollection.prototype.extractFieldNames=function(e,n,t){var o=this;if(void 0===t&&(t=""),"object"==typeof e&&null!=e)for(var i in e){var r=e[i];i.startsWith("$")?Array.isArray(r)?r.forEach(function(e){return o.extractFieldNames(e,n,t)}):"object"==typeof r&&this.extractFieldNames(r,n,t):(i=t?"".concat(t,".").concat(i):i,"object"!=typeof r||null===r||Array.isArray(r)?n.add(i):(n.add(i),this.extractFieldNames(r,n,i)))}},MongoManagerCollection.prototype.countDocuments=function(a,s,c){var e=this;return void 0===a&&(a={}),void 0===c&&(c=!1),new Promise(function(i,r){return __awaiter(e,void 0,void 0,function(){var n,t,o=this;return __generator(this,function(e){switch(e.label){case 0:return(e.trys.push([0,4,,5]),0===Object.keys(a).length)?[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).estimatedDocumentCount(s)]:[3,2];case 1:return t=e.sent(),i(t),[3,3];case 2:c?(n=new monitor_manager_1.MonitorMongo("countDocuments",this.collectionName,JSON.stringify([a,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).countDocuments(a,s).then(function(e){n.finish(),i(e)},function(e){n.finish(),console.log(new Date,"Error Count Documents",o.collectionName,a,s,e),r(e)})):index_1.ResolveIOServer.getMongoManager().countDocuments(this.collectionName,a,s).then(function(e){return i(e)},function(e){return r(e)}),e.label=3;case 3:return[3,5];case 4:return t=e.sent(),console.log(new Date,"Error Count Documents (Stats)",this.collectionName,a,s,t),r(t),[3,5];case 5:return[2]}})})})},MongoManagerCollection.prototype.create=function(e,n){return Array.isArray(e)?1===e.length?this.insertOne(e[0],n):this.insertMany(e,n):this.insertOne(e,n)},MongoManagerCollection.prototype.createIndex=function(i,r){var e=this;return new Promise(function(t,o){return __awaiter(e,void 0,void 0,function(){var n;return __generator(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).indexes()];case 1:return(n=e.sent(),n.some(function(e){return JSON.stringify(e.key)===JSON.stringify(i)}))?[2,t("Index already exists")]:(MongoManagerCollection.indexQueue.push({action:"createIndex",collection:this,specs:[i],options:r},function(e,n){e?o(e):t(n)}),[3,3]);case 2:return n=e.sent(),o(n),[3,3];case 3:return[2]}})})})},MongoManagerCollection.prototype.createIndexes=function(r,a){var e=this;return new Promise(function(o,i){return __awaiter(e,void 0,void 0,function(){var t,n;return __generator(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).indexes()];case 1:return(t=e.sent(),0===(n=r.filter(function(n){return!t.some(function(e){return JSON.stringify(e.key)===JSON.stringify(n.key)})})).length)?[2,o(["All indexes already exist"])]:(MongoManagerCollection.indexQueue.push({action:"createIndexes",collection:this,specs:[n],options:a},function(e,n){e?i(e):o(n)}),[3,3]);case 2:return n=e.sent(),i(n),[3,3];case 3:return[2]}})})})},MongoManagerCollection.prototype.deleteMany=function(l,d,u){var e=this;return void 0===l&&(l={}),void 0===u&&(u=!1),new Promise(function(s,c){return __awaiter(e,void 0,void 0,function(){var n,t,o,i,r,a=this;return __generator(this,function(e){switch(e.label){case 0:return!this.createLogs||u?[3,2]:[4,this.find(l)];case 1:for(n=e.sent(),t=0;t<n.length;t++)o=n[t],log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:o._id,payload:(0,common_1.getBinarySize)(JSON.stringify([o,l,d]))<2e5?JSON.stringify([o,l,d],null,2):"Too Big",method:"deleteMany",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((i=(0,common_1.deepCopy)(o))._id={_id:o._id,__v:o.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:o._id,__v:o.__v}},i,{upsert:!0}),index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":o._id},{"_id.__v":{$lt:o.__v-1}}]}));e.label=2;case 2:return r=new monitor_manager_1.MonitorMongo("deleteMany",this.collectionName,JSON.stringify([l,d])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).deleteMany(l,d).then(function(e){r.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),s(e.deletedCount)):c(e.acknowledged)},function(e){r.finish(),console.log(new Date,"Error Delete Many",a.collectionName,l,d,e),c(e)}),[2]}})})})},MongoManagerCollection.prototype.deleteOne=function(a,s,c){var e=this;return void 0===a&&(a={}),void 0===c&&(c=!1),new Promise(function(r,o){return __awaiter(e,void 0,void 0,function(){var i,n,t=this;return __generator(this,function(e){return this.createLogs&&!c?(i=new monitor_manager_1.MonitorMongo("findOneAndDelete",this.collectionName,JSON.stringify([a,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndDelete(a,s).then(function(o){return __awaiter(t,void 0,void 0,function(){var n,t;return __generator(this,function(e){return i.finish(),(n=o)?(this.createLogs&&!c&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,a,s]))<2e5?JSON.stringify([n,a,s],null,2):"Too Big",method:"deleteOne",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((t=(0,common_1.deepCopy)(n))._id={_id:n._id,__v:n.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:n._id,__v:n.__v}},t,{upsert:!0}),index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":n._id},{"_id.__v":{$lt:n.__v-1}}]})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName),r(1)):r(0),[2]})})},function(e){i.finish(),console.log(new Date,"Error Find One And Delete",t.collectionName,a,s,e),o(e)})):(n=new monitor_manager_1.MonitorMongo("deleteOne",this.collectionName,JSON.stringify([a,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).deleteOne(a,s).then(function(e){n.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(t.collectionName),r(e.deletedCount)):o(e.acknowledged)},function(e){n.finish(),console.log(new Date,"Error Delete One",t.collectionName,a,s,e),o(e)})),[2]})})})},MongoManagerCollection.prototype.distinct=function(e,i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("distinct",a.collectionName,JSON.stringify([e,i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).distinct(e,i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Distinct",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.drop=function(i){var r=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("drop",r.collectionName,JSON.stringify([i]));index_1.ResolveIOServer.getMainDB().collection(r.collectionName,r.collectionOptions).drop(i).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Count Documents",r.collectionName,i,e),t(e)})})},MongoManagerCollection.prototype.dropIndex=function(i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("dropIndex",a.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).dropIndex(i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Drop Index",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.dropIndexes=function(i){var r=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("dropIndexes",r.collectionName,JSON.stringify([i]));index_1.ResolveIOServer.getMainDB().collection(r.collectionName,r.collectionOptions).dropIndexes(i).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Drop Indexes",r.collectionName,i,e),t(e)})})},MongoManagerCollection.prototype.find=function(r,a,s){var e=this;return void 0===r&&(r={}),void 0===s&&(s=!1),new Promise(function(o,i){return __awaiter(e,void 0,void 0,function(){var n,t=this;return __generator(this,function(e){return s?(n=new monitor_manager_1.MonitorMongo("find",this.collectionName,JSON.stringify([r,a])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(r,a).toArray().then(function(e){n.finish(),o(e)},function(e){n.finish(),console.log(new Date,"Error Find",t.collectionName,r,a,e),i(e)})):index_1.ResolveIOServer.getMongoManager().find(this.collectionName,r,a).then(function(e){o(e)},function(e){i(e)}),[2]})})})},MongoManagerCollection.prototype.findById=function(i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("findById",a.collectionName,JSON.stringify([{_id:i},r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).findOne({_id:i},r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Find By Id",a.collectionName,{_id:i},r,e),t(e)})})},MongoManagerCollection.prototype.findCount=function(i,r){var a=this;return void 0===i&&(i={}),new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("findCount",a.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).find(i,r).count().then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Find Count",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.findCursor=function(e,n){void 0===e&&(e={});var t=new monitor_manager_1.MonitorMongo("findCursor",this.collectionName,JSON.stringify([e,n])),o=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(e,n);return o.on("close",function(e){return t.finish(),o.removeAllListeners(),e}),o},MongoManagerCollection.prototype.findStream=function(e,n,t){void 0===e&&(e={});var o=new monitor_manager_1.MonitorMongo("findStream",this.collectionName,JSON.stringify([e,n,t])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(e,n).stream(t);return e.on("end",function(e){return o.finish(),e}).on("error",function(e){return o.finish(),e}).on("close",function(e){return o.finish(),e}),e},MongoManagerCollection.prototype.findOne=function(i,r,e){var a=this;return void 0===i&&(i={}),void 0===e&&(e=!1),new Promise(function(n,t){var o;e?(o=new monitor_manager_1.MonitorMongo("findOne",a.collectionName,JSON.stringify([i,r])),index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).findOne(i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Find One",a.collectionName,i,r,e),t(e)})):index_1.ResolveIOServer.getMongoManager().findOne(a.collectionName,i,r).then(function(e){n(e)},function(e){t(e)})})},MongoManagerCollection.prototype.findOneAndDelete=function(r,a,s){var e=this;return void 0===r&&(r={}),void 0===s&&(s=!1),new Promise(function(i,n){return __awaiter(e,void 0,void 0,function(){var t,o=this;return __generator(this,function(e){return t=new monitor_manager_1.MonitorMongo("findOneAndDelete",this.collectionName,JSON.stringify([r,a])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndDelete(r,a).then(function(e){t.finish();var n;e?(o.createLogs&&!s&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:o.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,r,a]))<2e5?JSON.stringify([e,r,a],null,2):"Too Big",method:"findOneAndDelete",id_user:"",user:"",messageId:0,route:""}),o.useVersions&&((n=(0,common_1.deepCopy)(e))._id={_id:e._id,__v:e.__v},index_1.ResolveIOServer.getMongoManager().collection(o.versionCollection).replaceOne({_id:{_id:e._id,__v:e.__v}},n,{upsert:!0})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(o.collectionName),i(e)):i(null)},function(e){t.finish(),console.log(new Date,"Error Find One And Delete",o.collectionName,r,a,e),n(e)}),[2]})})})},MongoManagerCollection.prototype.findOneAndReplace=function(s,c,l,d,u){var e=this;return void 0===s&&(s={}),void 0===d&&(d=!1),void 0===u&&(u=!1),new Promise(function(r,a){return __awaiter(e,void 0,void 0,function(){var n,t,o,i=this;return __generator(this,function(e){return!this.checkSchema||u||(n=this.simplschema.newContext(),n.validate(c))?(t=new Date,this.timestamps&&(c.updatedAt=t),l&&l.upsert&&(c._id||(c._id=objectIdHexString()),this.useVersions&&(c.__v=0),this.timestamps)&&!c.createdAt&&(c.createdAt=t),o=new monitor_manager_1.MonitorMongo("findOneAndReplace",this.collectionName,JSON.stringify([s,c,l])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndReplace(s,c,l).then(function(e){o.finish();var n;e?(i.createLogs&&!d&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:i.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,s,c,l]))<2e5?JSON.stringify([e,s,c,l],null,2):"Too Big",method:"findOneAndReplace",id_user:"",user:"",messageId:0,route:""}),i.useVersions&&((n=(0,common_1.deepCopy)(e))._id={_id:e._id,__v:e.__v},index_1.ResolveIOServer.getMongoManager().collection(i.versionCollection).replaceOne({_id:{_id:e._id,__v:e.__v}},n,{upsert:!0})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(i.collectionName),r(e)):r(null)},function(e){o.finish(),console.log(new Date,"Error Find One And Replace",i.collectionName,s,l,e),a(e)})):(console.log(new Date,this.collectionName,"Schema Errors - findOneAndReplace",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on findOneAndReplace - "+this.collectionName,[n.validationErrors(),c]),a(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.findOneAndUpdate=function(s,c,l,d,u){var e=this;return void 0===s&&(s={}),void 0===d&&(d=!1),void 0===u&&(u=!1),new Promise(function(r,a){return __awaiter(e,void 0,void 0,function(){var n,t,o,i=this;return __generator(this,function(e){return!this.checkSchema||u||(n=this.simplschema.newContext(),n.validate(c,{modifier:!0}))?(this.timestamps&&(t=new Date,c.$set?c.$set.updatedAt=t:c.$set={updatedAt:t}),l&&l.upsert&&(c.$setOnInsert?(c.$setOnInsert._id||(c.$setOnInsert._id=objectIdHexString()),this.timestamps&&!c.$setOnInsert.createdAt&&(c.$setOnInsert.createdAt=new Date)):this.timestamps?c.$setOnInsert={_id:objectIdHexString(),createdAt:new Date}:c.$setOnInsert={_id:objectIdHexString()}),o=new monitor_manager_1.MonitorMongo("findOneAndUpdate",this.collectionName,JSON.stringify([s,c,l])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndUpdate(s,c,l).then(function(e){o.finish();var n;e?(i.createLogs&&!d&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:i.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,s,c,l]))<2e5?JSON.stringify([e,s,c,l],null,2):"Too Big",method:"findOneAndUpdate",id_user:"",user:"",messageId:0,route:""}),i.useVersions&&((n=(0,common_1.deepCopy)(e))._id={_id:e._id,__v:e.__v},index_1.ResolveIOServer.getMongoManager().collection(i.versionCollection).replaceOne({_id:{_id:e._id,__v:e.__v}},n,{upsert:!0})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(i.collectionName),r(e)):r(null)},function(e){o.finish(),console.log(new Date,"Error Find One And Update",i.collectionName,s,l,e),a(e)})):(console.log(new Date,this.collectionName,"Schema Errors - findOneAndUpdate",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on findOneAndUpdate - "+this.collectionName,[n.validationErrors(),c]),a(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.indexes=function(i){var r=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("indexes",r.collectionName,JSON.stringify([i]));index_1.ResolveIOServer.getMainDB().collection(r.collectionName,r.collectionOptions).indexes(i).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Indexes",r.collectionName,i,e),t(e)})})},MongoManagerCollection.prototype.indexExists=function(i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("indexExists",a.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).indexExists(i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Index Exists",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.insertMany=function(d,u,g,_,h){var e=this;return void 0===g&&(g=!1),void 0===_&&(_=!1),void 0===h&&(h=!1),new Promise(function(c,l){return __awaiter(e,void 0,void 0,function(){var t,n,o,i,r,a,s=this;return __generator(this,function(e){if(d.length){for(t=[],this.checkSchema&&!_&&d.forEach(function(e){var n=s.simplschema.newContext();n.validate(e)?t.push(!0):(console.log(new Date,s.collectionName,"Schema Errors - insertMany",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on insertMany - "+s.collectionName,[n.validationErrors(),e]),t.push(!1))}),n=this.checkSchema?d.filter(function(e,n){return t[n]}):d,o=0;o<n.length;o++)(i=n[o])._id||(i._id=objectIdHexString()),this.timestamps&&(r=new Date,i.createdAt||(i.createdAt=r),i.updatedAt||(i.updatedAt=r)),this.useVersions&&!i.hasOwnProperty("__v")&&(i.__v=0),this.createLogs&&!g&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:i._id,payload:(0,common_1.getBinarySize)(JSON.stringify([i,u]))<2e5?JSON.stringify([i,u],null,2):"Too Big",method:"insertMany",id_user:"",user:"",messageId:0,route:""});n.length&&(a=null,h||(a=new monitor_manager_1.MonitorMongo("insertMany",this.collectionName,JSON.stringify([n,u]))),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).insertMany(n,u).then(function(e){a&&a.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(n)):l(e.acknowledged)},function(e){a&&a.finish(),console.log(new Date,"Error Insert Many",s.collectionName,n,u,e),l(e)}))}else c([]);return[2]})})})},MongoManagerCollection.prototype.insertOne=function(s,c,l,d){var e=this;return void 0===l&&(l=!1),void 0===d&&(d=!1),new Promise(function(r,a){return __awaiter(e,void 0,void 0,function(){var n,t,o,i=this;return __generator(this,function(e){return s._id||(s._id=objectIdHexString()),!this.checkSchema||d||(n=this.simplschema.newContext(),n.validate(s))?(this.timestamps&&(t=new Date,s.createdAt||(s.createdAt=t),s.updatedAt||(s.updatedAt=t)),this.createLogs&&!l&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:s._id,payload:(0,common_1.getBinarySize)(JSON.stringify([s,c]))<2e5?JSON.stringify([s,c],null,2):"Too Big",method:"insertOne",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&!s.hasOwnProperty("__v")&&(s.__v=0),o=new monitor_manager_1.MonitorMongo("insertOne",this.collectionName,JSON.stringify([s,c])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).insertOne(s,c).then(function(e){o.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(i.collectionName),r(s)):a(e.acknowledged)},function(e){o.finish(),console.log(new Date,"Error Insert One",i.collectionName,s,c,e),a(e)})):(console.log(new Date,this.collectionName,"Schema Errors - insertOne",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on insertOne - "+this.collectionName,[n.validationErrors(),s]),a(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.listIndexes=function(e){var n=new monitor_manager_1.MonitorMongo("listIndexes",this.collectionName,JSON.stringify([e])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).listIndexes(e);return e.on("close",function(e){return n.finish(),e}),e},MongoManagerCollection.prototype.rename=function(i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("rename",a.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).rename(i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Rename",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.replaceOne=function(m,f,v,p,M,y){var e=this;return void 0===p&&(p=!1),void 0===M&&(M=!1),void 0===y&&(y=null),new Promise(function(_,h){return __awaiter(e,void 0,void 0,function(){var n,t,o,i,r,a,s,c,l,d,u,g=this;return __generator(this,function(e){switch(e.label){case 0:return!this.checkSchema||M||(t=this.simplschema.newContext(),t.validate(f))?(n=new Date,this.timestamps&&(f.updatedAt=n),this.useVersions?y?[3,2]:[4,this.findOne(m,null,!0)]:[3,8]):(console.log(new Date,this.collectionName,"Schema Errors - replaceOne",t.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on replaceOne - "+this.collectionName,[t.validationErrors(),f]),h(t.validationErrors()),[2]);case 1:y=e.sent(),e.label=2;case 2:return y?(this.timestamps&&!f.createdAt&&y.createdAt&&(f.createdAt=y.createdAt),y.__v!==f.__v?[3,3]:(f.__v+=1,(t=(0,common_1.deepCopy)(y))._id={_id:y._id,__v:y.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:y._id,__v:y.__v}},t,{upsert:!0}),4<=y.__v&&index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":y._id},{"_id.__v":{$lt:y.__v-4}}]}),this.createLogs&&!p&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:y._id,payload:(0,common_1.getBinarySize)(JSON.stringify([y,m,f,v]))<2e5?JSON.stringify([y,m,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),o=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([m,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(m,f,v).then(function(e){o.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(e.modifiedCount)):h(e.acknowledged)},function(e){o.finish(),console.log(new Date,"Error Replace One",g.collectionName,m,f,v,e),h(e)}),[3,5])):[3,6];case 3:return console.log("invalid version - "+this.collectionName,y.__v,f.__v),[4,index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({_id:{_id:y._id,__v:f.__v}},null,!0)];case 4:(i=e.sent())?(r=y._id,a=y.__v,(s=(0,common_1.getMongoMergeUpdatedDoc)(f,y,i))._id=r,s.__v=a+1,this.createLogs&&!p&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:r,payload:(0,common_1.getBinarySize)(JSON.stringify(["invalidVersion - merge",y,m,s,v]))<2e5?JSON.stringify(["invalidVersion - merge",y,m,s,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),c=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([m,s,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(m,s,v).then(function(e){c.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(e.modifiedCount)):h(e.acknowledged)},function(e){c.finish(),console.log(new Date,"Error Replace One",g.collectionName,m,s,v,e),h(e)})):h("Invalid Version And Could Not Find History - DB: "+y.__v+", Trying to update with :"+f.__v),e.label=5;case 5:return[3,7];case 6:v&&v.upsert?(this.timestamps&&(f.createdAt=n),f._id||(f._id=objectIdHexString()),f.__v=0,this.createLogs&&!p&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:f._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",m,f,v]))<2e5?JSON.stringify(["upsert",m,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),l=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([m,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(m,f,v).then(function(e){l.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(e.modifiedCount)):h(e.acknowledged)},function(e){l.finish(),console.log(new Date,"Error Replace One",g.collectionName,m,f,v,e),h(e)})):h("No Document"),e.label=7;case 7:return[3,9];case 8:v&&v.upsert&&(this.timestamps&&!f.createdAt&&(f.createdAt=n),f._id||(f._id=objectIdHexString()),f.__v=0),this.createLogs&&!p?(v?v.returnDocument="before":v={returnDocument:"before"},d=new monitor_manager_1.MonitorMongo("findOneAndReplace",this.collectionName,JSON.stringify([m,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndReplace(m,f,v).then(function(e){d.finish();e?log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:g.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,m,f,v]))<2e5?JSON.stringify([e,m,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}):log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:g.collectionName,id_document:f._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",m,f,v]))<2e5?JSON.stringify(["upsert",m,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(1)},function(e){d.finish(),console.log(new Date,"Error Find One And Replace",g.collectionName,m,f,v,e),h(e)})):(u=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([m,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(m,f,v).then(function(e){u.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(e.modifiedCount)):h(e.acknowledged)},function(e){u.finish(),console.log(new Date,"Error Replace One",g.collectionName,m,f,v,e),h(e)})),e.label=9;case 9:return[2]}})})})},MongoManagerCollection.prototype.updateMany=function(d,u,g,_,h,m){var e=this;return void 0===_&&(_=!1),void 0===h&&(h=!1),void 0===m&&(m=!1),new Promise(function(c,l){return __awaiter(e,void 0,void 0,function(){var n,t,o,i,r,a,s=this;return __generator(this,function(e){switch(e.label){case 0:return u.$inc&&"{}"!==JSON.stringify(u.$inc)||u.$set&&"{}"!==JSON.stringify(u.$set)||u.$setOnInsert&&"{}"!==JSON.stringify(u.$setOnInsert)||u.$unset&&"{}"!==JSON.stringify(u.$unset)?(this.timestamps&&(n=new Date,u.$set?u.$set.updatedAt=n:u.$set={updatedAt:n}),!this.checkSchema||h||(n=this.simplschema.newContext(),n.validate(u,{modifier:!0}))?this.useVersions&&!m||this.createLogs&&!_?[4,this.find(d)]:[3,2]:(console.log(new Date,this.collectionName,"Schema Errors - updateMany",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on updateMany - "+this.collectionName,[n.validationErrors(),u]),l(n.validationErrors()),[2])):(c(1),[2]);case 1:for(t=e.sent(),o=0;o<t.length;o++)i=t[o],this.createLogs&&!_&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:i._id,payload:(0,common_1.getBinarySize)(JSON.stringify([i,d,u,g]))<2e5?JSON.stringify([i,d,u,g],null,2):"Too Big",method:"updateMany",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((r=(0,common_1.deepCopy)(i))._id={_id:i._id,__v:i.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:i._id,__v:i.__v}},r,{upsert:!0}),4<=i.__v&&index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":i._id},{"_id.__v":{$lt:i.__v-4}}]}),objectContainsPropertyDeep(u,"__v")||(u.$inc?u.$inc.__v||(u.$inc.__v=1):u.$inc={__v:1}));e.label=2;case 2:return a=new monitor_manager_1.MonitorMongo("updateMany",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateMany(d,u,g).then(function(e){a.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.modifiedCount)):l(e.acknowledged)},function(e){a.finish(),console.log(new Date,"Error Update Many",s.collectionName,d,u,g,e),l(e)}),[2]}})})})},MongoManagerCollection.prototype.updateOne=function(d,u,g,_,h){var e=this;return void 0===_&&(_=!1),void 0===h&&(h=!1),new Promise(function(c,l){return __awaiter(e,void 0,void 0,function(){var n,t,o,i,r,a,s=this;return __generator(this,function(e){switch(e.label){case 0:return!this.checkSchema||h||(t=this.simplschema.newContext(),t.validate(u,{modifier:!0}))?u.$inc&&"{}"!==JSON.stringify(u.$inc)||u.$set&&"{}"!==JSON.stringify(u.$set)||u.$setOnInsert&&"{}"!==JSON.stringify(u.$setOnInsert)||u.$unset&&"{}"!==JSON.stringify(u.$unset)?(n=new Date,this.timestamps&&(u.$set?u.$set.updatedAt=n:u.$set={updatedAt:n}),this.useVersions?[4,this.findOne(d,null,!0)]:[3,2]):(c(1),[2]):(console.log(new Date,this.collectionName,"Schema Errors - updateOne",t.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on updateOne - "+this.collectionName,[t.validationErrors(),u]),l(t.validationErrors()),[2]);case 1:return(n=e.sent())?(this.createLogs&&!_&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,d,u,g]))<2e5?JSON.stringify([n,d,u,g],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),(t=(0,common_1.deepCopy)(n))._id={_id:n._id,__v:n.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:n._id,__v:n.__v}},t,{upsert:!0}),4<=n.__v&&index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":n._id},{"_id.__v":{$lt:n.__v-4}}]}),objectContainsPropertyDeep(u,"__v")||(u.$inc?u.$inc.__v||(u.$inc.__v=1):u.$inc={__v:1}),o=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,g).then(function(e){o.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.modifiedCount)):l(e.acknowledged)},function(e){o.finish(),console.log(new Date,"Error Update One",s.collectionName,d,u,g,e),l(e)})):g&&g.upsert?(u.$setOnInsert?(u.$setOnInsert._id||(u.$setOnInsert._id=objectIdHexString()),this.timestamps&&!u.$setOnInsert.createdAt&&(u.$setOnInsert.createdAt=new Date)):this.timestamps?u.$setOnInsert={_id:objectIdHexString(),__v:0,createdAt:new Date}:u.$setOnInsert={_id:objectIdHexString(),__v:0},this.createLogs&&!_&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:u.$setOnInsert._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",d,u,g]))<2e5?JSON.stringify(["upsert",d,u,g],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),i=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,g).then(function(e){i.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.modifiedCount)):l(e.acknowledged)},function(e){i.finish(),console.log(new Date,"Error Update One",s.collectionName,d,u,g,e),l(e)})):l("No Document"),[3,3];case 2:g&&g.upsert&&(u.$setOnInsert?(u.$setOnInsert._id||(u.$setOnInsert._id=objectIdHexString()),this.timestamps&&!u.$setOnInsert.createdAt&&(u.$setOnInsert.createdAt=new Date)):this.timestamps?u.$setOnInsert={_id:objectIdHexString(),createdAt:new Date}:u.$setOnInsert={_id:objectIdHexString()}),this.createLogs&&!_?(g?g.returnDocument="before":g={returnDocument:"before"},r=new monitor_manager_1.MonitorMongo("findOneAndUpdate",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndUpdate(d,u,g).then(function(e){r.finish();var n=e.value;n?(log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:s.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,d,u,g]))<2e5?JSON.stringify([n,d,u,g],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),c(e.ok)):u.$setOnInsert?(log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:s.collectionName,id_document:u.$setOnInsert._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",d,u,g]))<2e5?JSON.stringify(["upsert",d,u,g],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.ok)):c(0)},function(e){r.finish(),console.log(new Date,"Error Find One And Update",s.collectionName,d,u,g,e),l(e)})):(a=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,g).then(function(e){a.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.modifiedCount)):l(e.acknowledged)},function(e){a.finish(),console.log(new Date,"Error Update One",s.collectionName,d,u,g,e),l(e)})),e.label=3;case 3:return[2]}})})})},MongoManagerCollection.prototype.watchCollection=function(e,n){return void 0===e&&(e=[]),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).watch(e,n)},(e=MongoManagerCollection).indexQueue=async_1.default.queue(function(d,u){return __awaiter(void 0,void 0,void 0,function(){var n,t,o,i,r,a,s,c,l;return __generator(e,function(e){switch(e.label){case 0:if(n=d.action,t=d.collection,o=d.specs,i=d.options,!(r=index_1.ResolveIOServer.getMainDB().collection(t.collectionName,t.collectionOptions)))return[2,u(new Error("Collection ".concat(t.collectionName," not found")))];a=new monitor_manager_1.MonitorMongo(n,t.collectionName,JSON.stringify([o,i])),e.label=1;case 1:return e.trys.push([1,3,,10]),[4,r[n].apply(r,__spreadArray(__spreadArray([],__read(o),!1),[i],!1))];case 2:return c=e.sent(),a.finish(),u(null,c),[3,10];case 3:if(85!==(s=e.sent()).code&&!s.message.includes("IndexOptionsConflict"))return[3,9];e.label=4;case 4:return(e.trys.push([4,8,,9]),l=t.extractIndexNameFromError(s.message))?[4,r.dropIndex(l)]:[3,7];case 5:return e.sent(),[4,r[n].apply(r,__spreadArray(__spreadArray([],__read(o),!1),[i],!1))];case 6:return c=e.sent(),a.finish(),u(null,c),[2];case 7:return[3,9];case 8:return l=e.sent(),u(l),[3,9];case 9:return a.finish(),u(s),[3,10];case 10:return[2]}})})},1),MongoManagerCollection}()),MongoManagerUserCollection=function(e){function MongoManagerUserCollection(){return null!==e&&e.apply(this,arguments)||this}return __extends(MongoManagerUserCollection,e),MongoManagerUserCollection.prototype.authenticate=function(a,t){var e=this;return new Promise(function(i,r){return __awaiter(e,void 0,void 0,function(){var n,o=this;return __generator(this,function(e){switch(e.label){case 0:return(n=Math.pow(100,Math.log(a.attempts+1)),n=n<3e5?n:3e5,a.last)?Date.now()-a.last.getTime()<n?(a.last=new Date,[4,user_collection_1.Users.updateOne({_id:a._id},{$set:{last:a.last}})]):[3,2]:[3,3];case 1:return e.sent(),i({data:null,error:"Attempt Too Soon"}),[2];case 2:return[3,4];case 3:a.last=new Date,e.label=4;case 4:return 5<=a.attempts?i({data:null,error:"Too Many Attempts"}):a.salt?pbkdf2(t,a.salt,{iterations:25e3,keylen:512,digestAlgorithm:"sha256"},function(n,t){return __awaiter(o,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return n?[2,r(n)]:scmp(t,Buffer.from(a.hash,"hex"))?(a.last=new Date,a.attempts=0,[4,user_collection_1.Users.updateOne({_id:a._id},{$set:{last:a.last,attempts:a.attempts}})]):[3,2];case 1:return e.sent(),i({data:a,error:""}),[3,4];case 2:return a.last=new Date,a.attempts=a.attempts+1,[4,user_collection_1.Users.updateOne({_id:a._id},{$set:{last:a.last,attempts:a.attempts}})];case 3:e.sent(),5<=a.attempts?i({data:null,error:"Too Many Attempts"}):i({data:null,error:"Invalid Username And Password"}),e.label=4;case 4:return[2]}})})}):i({data:null,error:"No Salt Value Stored"}),[2]}})})})},MongoManagerUserCollection.prototype.serializeUser=function(){return function(e,n){n(null,e.username)}},MongoManagerUserCollection.prototype.deserializeUser=function(){return function(e,n){user_collection_1.Users.findOne({username:e}).then(function(e){n(null,e)},function(e){n(e,null)})}},MongoManagerUserCollection.prototype.setPassword=function(r,a){var e=this;return new Promise(function(o,i){return __awaiter(e,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return r?[3,1]:(i("No User"),[3,5]);case 1:return a?[3,2]:(i("No Password"),[3,5]);case 2:return[4,randomBytes(32)];case 3:return n=e.sent(),n=n.toString("hex"),[4,pbkdf2Promisified(a,n,{iterations:25e3,keylen:512,digestAlgorithm:"sha256"})];case 4:t=e.sent(),t=Buffer.from(t,"binary").toString("hex"),user_collection_1.Users.updateOne({_id:r._id},{$set:{hash:t,salt:n,services:{},attempts:0}}).then(function(e){return o(e)},function(e){return i(e)}),e.label=5;case 5:return[2]}})})})},MongoManagerUserCollection.prototype.changePassword=function(i,r,a){var e=this;return new Promise(function(t,o){return __awaiter(e,void 0,void 0,function(){var n;return __generator(this,function(e){switch(e.label){case 0:return i?[3,1]:(o("Missing User"),[3,4]);case 1:return r&&a?[3,2]:(o("Missing Password"),[3,4]);case 2:return[4,this.authenticate(i,r)];case 3:(n=e.sent()).data?this.setPassword(i,a).then(function(e){return t(e)},function(e){return o(e)}):o(n.error),e.label=4;case 4:return[2]}})})})},MongoManagerUserCollection.prototype.register=function(o,i){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return o.username?[3,1]:(t("Missing Username"),[3,5]);case 1:return[4,user_collection_1.Users.findOne({username:o.username})];case 2:return e.sent()?(t("Username Exists"),[3,5]):[3,3];case 3:return[4,user_collection_1.Users.findOne({email:o.email})];case 4:e.sent()?t("Email Exists"):(o.setPassword(i),n(o)),e.label=5;case 5:return[2]}})})})},MongoManagerUserCollection.prototype.resetAttempts=function(e){return user_collection_1.Users.updateOne({_id:e._id},{$set:{attempts:0}})},MongoManagerUserCollection}(exports.MongoManagerCollection=MongoManagerCollection);function objectIdHexString(){return(new mongodb_1.ObjectId).toHexString()}function pbkdf2(e,n,t,o){crypto.pbkdf2(e,n,t.iterations,t.keylen,t.digestAlgorithm,o)}function pbkdf2Promisified(e,n,i){return new Promise(function(t,o){return pbkdf2(e,n,i,function(e,n){return e?o(e):t(n)})})}function randomBytes(e){return new Promise(function(t,o){return crypto.randomBytes(e,function(e,n){return e?o(e):t(n)})})}function objectContainsPropertyDeep(e,n){var t=Object.keys(e);if(t.some(function(e){return e===n}))return!0;for(var o=0;o<t.length;o++){var i=t[o];if(e[i]&&"object"==typeof e[i]&&objectContainsPropertyDeep(e[i],n))return!0}return!1}exports.MongoManagerUserCollection=MongoManagerUserCollection,exports.objectIdHexString=objectIdHexString;
1
+ "use strict";var __extends=this&&this.__extends||function(){var t=function(e,n){return(t=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,n){e.__proto__=n}:function(e,n){for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=n[t])}))(e,n)};return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function __(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(__.prototype=n.prototype,new __)}}(),__awaiter=this&&this.__awaiter||function(e,o,i,r){return new(i=i||Promise)(function(t,n){function fulfilled(e){try{step(r.next(e))}catch(e){n(e)}}function rejected(e){try{step(r.throw(e))}catch(e){n(e)}}function step(e){var n;e.done?t(e.value):((n=e.value)instanceof i?n:new i(function(e){e(n)})).then(fulfilled,rejected)}step((r=r.apply(e,o||[])).next())})},__generator=this&&this.__generator||function(o,i){var r,a,s,c={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]},l={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function verb(t){return function(e){var n=[t,e];if(r)throw new TypeError("Generator is already executing.");for(;c=l&&n[l=0]?0:c;)try{if(r=1,a&&(s=2&n[0]?a.return:n[0]?a.throw||((s=a.return)&&s.call(a),0):a.next)&&!(s=s.call(a,n[1])).done)return s;switch(a=0,(n=s?[2&n[0],s.value]:n)[0]){case 0:case 1:s=n;break;case 4:return c.label++,{value:n[1],done:!1};case 5:c.label++,a=n[1],n=[0];continue;case 7:n=c.ops.pop(),c.trys.pop();continue;default:if(!(s=0<(s=c.trys).length&&s[s.length-1])&&(6===n[0]||2===n[0])){c=0;continue}if(3===n[0]&&(!s||n[1]>s[0]&&n[1]<s[3]))c.label=n[1];else if(6===n[0]&&c.label<s[1])c.label=s[1],s=n;else{if(!(s&&c.label<s[2])){s[2]&&c.ops.pop(),c.trys.pop();continue}c.label=s[2],c.ops.push(n)}}n=i.call(o,c)}catch(e){n=[6,e],a=0}finally{r=s=0}if(5&n[0])throw n[1];return{value:n[0]?n[1]:void 0,done:!0}}}},__read=this&&this.__read||function(e,n){var t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var o,i,r=t.call(e),a=[];try{for(;(void 0===n||0<n--)&&!(o=r.next()).done;)a.push(o.value)}catch(e){i={error:e}}finally{try{o&&!o.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a},__spreadArray=this&&this.__spreadArray||function(e,n,t){if(t||2===arguments.length)for(var o,i=0,r=n.length;i<r;i++)!o&&i in n||((o=o||Array.prototype.slice.call(n,0,i))[i]=n[i]);return e.concat(o||Array.prototype.slice.call(n))},__values=this&&this.__values||function(e){var n="function"==typeof Symbol&&Symbol.iterator,t=n&&e[n],o=0;if(t)return t.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&o>=e.length?void 0:e)&&e[o++],done:!e}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")},simpl_schema_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.objectIdHexString=exports.MongoManagerUserCollection=exports.MongoManagerCollection=exports.MongoManagerModel=exports.MongoManager=void 0,require("simpl-schema")),mongodb_1=require("mongodb"),index_1=require("../index"),user_collection_1=require("../collections/user.collection"),common_1=require("../util/common"),log_collection_1=require("../collections/log.collection"),NodeCache=require("node-cache"),crypto=require("crypto"),scmp=require("scmp"),monitor_manager_1=require("./monitor.manager"),os_1=require("os"),numCPUs=(0,os_1.cpus)().length,v8=require("v8"),async_1=require("async"),sift_1=require("sift"),MongoManager=function(){function MongoManager(e){this._collections=[],this._cacheMap=[],this._operationInProgress=new Map,this._heapSize=v8.getHeapStatistics()/numCPUs,this._serverCollections=[],this._serverConfig=null,this._isWorkersEnabled=!1,this._isWorkerInstance=!1,this._serverConfig=e,this._nodeCache=new NodeCache({stdTTL:0,checkperiod:0}),this._isWorkersEnabled="true"===process.env.IS_WORKERS_ENABLED,this._isWorkerInstance="true"===process.env.IS_WORKER_INSTANCE,this.setCacheLimit(),this.initServerCollections(),this._isWorkersEnabled&&this._isWorkerInstance&&this.setupChangeStream()}return MongoManager.prototype.setCacheLimit=function(){this._isWorkersEnabled?this._heapLimit=this._isWorkerInstance?.8*this._heapSize:.4*this._heapSize:this._heapLimit=.3*this._heapSize},MongoManager.prototype.initServerCollections=function(){return __awaiter(this,void 0,void 0,function(){var n;return __generator(this,function(e){switch(e.label){case 0:return[4,index_1.ResolveIOServer.getMainDB().listCollections().toArray()];case 1:return n=e.sent(),this._serverCollections=n,[2]}})})},MongoManager.prototype.getServerCollections=function(){return this._serverCollections},MongoManager.prototype.registerCollection=function(n){var e=this;n.collectionOptions&&n.collectionOptions.timeseries&&n.collectionOptions.timeseries.timeField&&this._serverCollections.some(function(e){return e.name===n.collectionName&&"collection"===e.type})&&index_1.ResolveIOServer.getMainDB().dropCollection(n.collectionName).then(function(){e.createCollection(n)}),this._collections.push(n)},MongoManager.prototype.createCollection=function(e){index_1.ResolveIOServer.getMainDB().createCollection(e.collectionName,e.collectionOptions)},MongoManager.prototype.collections=function(){return this._collections},MongoManager.prototype.collection=function(n){return this._collections.find(function(e){return e.collectionName===n})},MongoManager.prototype.delay=function(n){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){return[2,new Promise(function(e){return setTimeout(e,n)})]})})},MongoManager.prototype.find=function(i,r,a){return void 0===r&&(r={}),__awaiter(this,void 0,void 0,function(){var n,t,o=this;return __generator(this,function(e){return n=this.generateCacheKey([i],"find",[r,a]),void 0!==(t=this.getFromCache(n))?[2,t]:this._operationInProgress.has(n)?[2,this._operationInProgress.get(n).promise]:(t=this.executeFind(i,r,a,n),this._operationInProgress.set(n,{promise:t,invalidatedDuringExecution:!1}),t.finally(function(){return o._operationInProgress.delete(n)}),[2,t])})})},MongoManager.prototype.executeFind=function(o,i,r,a){return __awaiter(this,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return n=index_1.ResolveIOServer.getMainDB().collection(o),t=new monitor_manager_1.MonitorMongo("find",o,JSON.stringify([i,r])),[4,n.find(i,r).toArray()];case 1:return n=e.sent(),t.finish(),this._operationInProgress.get(a).invalidatedDuringExecution||this.addToCache([o],a,n),[2,n]}})})},MongoManager.prototype.findOne=function(i,r,a){return void 0===r&&(r={}),__awaiter(this,void 0,void 0,function(){var n,t,o=this;return __generator(this,function(e){return n=this.generateCacheKey([i],"findOne",[r,a]),void 0!==(t=this.getFromCache(n))?[2,t]:this._operationInProgress.has(n)?[2,this._operationInProgress.get(n).promise]:(t=this.executeFindOne(i,r,a,n),this._operationInProgress.set(n,{promise:t,invalidatedDuringExecution:!1}),t.finally(function(){return o._operationInProgress.delete(n)}),[2,t])})})},MongoManager.prototype.executeFindOne=function(o,i,r,a){return __awaiter(this,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return n=index_1.ResolveIOServer.getMainDB().collection(o),t=new monitor_manager_1.MonitorMongo("findOne",o,JSON.stringify([i,r])),[4,n.findOne(i,r)];case 1:return n=e.sent(),t.finish(),this._operationInProgress.get(a).invalidatedDuringExecution||this.addToCache([o],a,n),[2,n]}})})},MongoManager.prototype.aggregate=function(r,a,s){return __awaiter(this,void 0,void 0,function(){var n,t,o,i=this;return __generator(this,function(e){return n=__spreadArray([r],__read(a.flatMap(function(e){var n;return null!=(n=e.$lookup)&&n.from?[e.$lookup.from]:[]})),!1),t=this.generateCacheKey(n,"aggregate",[a,s]),void 0!==(o=this.getFromCache(t))?[2,o]:this._operationInProgress.has(t)?[2,this._operationInProgress.get(t).promise]:(o=this.executeAggregate(r,a,s,t,n),this._operationInProgress.set(t,{promise:o,invalidatedDuringExecution:!1}),o.finally(function(){return i._operationInProgress.delete(t)}),[2,o])})})},MongoManager.prototype.executeAggregate=function(o,i,r,a,s){return __awaiter(this,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return n=index_1.ResolveIOServer.getMainDB().collection(o),t=new monitor_manager_1.MonitorMongo("aggregate",o,JSON.stringify([i,r])),[4,n.aggregate(i,r).toArray()];case 1:return n=e.sent(),t.finish(),this._operationInProgress.get(a).invalidatedDuringExecution||this.addToCache(s,a,n),[2,n]}})})},MongoManager.prototype.countDocuments=function(i,r,a){return void 0===r&&(r={}),__awaiter(this,void 0,void 0,function(){var n,t,o=this;return __generator(this,function(e){return n=this.generateCacheKey([i],"countDocuments",[r,a]),void 0!==(t=this.getFromCache(n))?[2,t]:this._operationInProgress.has(n)?[2,this._operationInProgress.get(n).promise]:(t=this.executeCountDocuments(i,r,a,n),this._operationInProgress.set(n,{promise:t,invalidatedDuringExecution:!1}),t.finally(function(){return o._operationInProgress.delete(n)}),[2,t])})})},MongoManager.prototype.executeCountDocuments=function(o,i,r,a){return __awaiter(this,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return n=index_1.ResolveIOServer.getMainDB().collection(o),t=new monitor_manager_1.MonitorMongo("countDocuments",o,JSON.stringify([i,r])),[4,n.countDocuments(i,r)];case 1:return n=e.sent(),t.finish(),this._operationInProgress.get(a).invalidatedDuringExecution||this.addToCache([o],a,n),[2,n]}})})},MongoManager.prototype.generateCacheKey=function(e,n,t){e=JSON.stringify({collections:e,functionName:n,args:t});return crypto.createHash("sha256").update(e).digest("hex")},MongoManager.prototype.getFromCache=function(n){try{var e=this._nodeCache.get(n);if(e)return JSON.parse(e,common_1.dateReviver)}catch(e){this._nodeCache.del(n)}},MongoManager.prototype.addToCache=function(e,n,t){var o,i;if((0,common_1.getBinarySize)(JSON.stringify(t))<1e6){var r=this._nodeCache.getStats().vsize;if(r>this._heapLimit){var a=0,s=this._nodeCache.keys();try{for(var c=__values(s),l=c.next();!l.done;l=c.next()){var d=l.value;if(this._nodeCache.del(d),a+=1,(r=this._nodeCache.getStats().vsize)<.75*this._heapLimit)break}}catch(e){o={error:e}}finally{try{l&&!l.done&&(i=c.return)&&i.call(c)}finally{if(o)throw o.error}}console.log("Query Cache: Too Big, - Deleted: "+a+" - "+r)}this._nodeCache.set(n,JSON.stringify(t)),this._cacheMap.push({collections:e,key:n})}},MongoManager.prototype.invalidateQueryCache=function(n){var t,e,o=this._cacheMap.filter(function(e){return e.collections.includes(n)});try{for(var i=__values(o),r=i.next();!r.done;r=i.next()){var a=r.value;this._nodeCache.del(a.key),this._operationInProgress.has(a.key)&&(this._operationInProgress.get(a.key).invalidatedDuringExecution=!0)}}catch(e){t={error:e}}finally{try{r&&!r.done&&(e=i.return)&&e.call(i)}finally{if(t)throw t.error}}this._cacheMap=this._cacheMap.filter(function(e){return!e.collections.includes(n)})},MongoManager.prototype.setupChangeStream=function(){var n=this,t=index_1.ResolveIOServer.getMainDB().watch([{$match:{$and:[{"ns.coll":{$nin:["logs","log-method-latencies","log-subscriptions"]}},{"ns.coll":{$not:/.*\.versions$/}},{"ns.coll":{$not:/^monitor-/}}]}}]);t.on("change",function(t){return __awaiter(n,void 0,void 0,function(){var n;return __generator(this,function(e){return t.ns&&t.ns.coll&&(n=t.ns.coll,this.collection(n))&&this.invalidateQueryCache(n),[2]})})}),t.on("error",function(e){console.log(new Date,"Mongo change stream error. Restart..."),t.close(),setTimeout(function(){return n.setupChangeStream()},5e3)}),t.on("close",function(){console.log(new Date,"Mongo change stream closed. Restarting..."),setTimeout(function(){return n.setupChangeStream()},5e3)})},MongoManager}(),MongoManagerModel=(exports.MongoManager=MongoManager,function(e){var n;this.collection_main=null,this.collection_version=null,"users"===e.collectionName?this.collection_main=new MongoManagerUserCollection(e):this.collection_main=new MongoManagerCollection(e),e.useVersionCollection&&(this.collection_main.useVersions=!0,(n=(0,common_1.deepCopy)(e.schema))._id.type="Object",n._id.blackbox=!0,n={collectionName:e.collectionName+".versions",schema:n,useVersionCollection:!1,useReportBuilder:!1,reportBuilderLookupTables:[],timestamps:!0,createLogs:!1,checkSchema:!1,collectionOptions:null},"users"===e.collectionName?this.collection_version=new MongoManagerUserCollection(n):this.collection_version=new MongoManagerCollection(n),this.collection_version.createIndex({"_id._id":1,"_id.__v":1}),this.collection_main.versionCollection=e.collectionName+".versions")}),MongoManagerCollection=(exports.MongoManagerModel=MongoManagerModel,function(){function MongoManagerCollection(e){var n,t=this,o=(this.collectionName="",this.checkSchema=!1,this.simplschema=null,this.rbSchema=null,this.timestamps=!1,this.useVersions=!1,this.versionCollection="",this.createLogs=!0,this.useRB=!1,this.collectionName=e.collectionName,this.simplschema=new simpl_schema_1.default(e.schema),this.timestamps=e.timestamps,this.createLogs=e.createLogs,this.checkSchema=e.checkSchema,this.collectionOptions=e.collectionOptions,e.useReportBuilder&&(this.useRB=!0,n=(0,common_1.deepCopy)(e.schema),e=(0,common_1.buildRbLookups)(e.reportBuilderLookupTables,n,[]),this.rbSchema=(0,common_1.buildRbSchema)(e)),setInterval(function(){index_1.ResolveIOServer&&index_1.ResolveIOServer.getMainServer()&&index_1.ResolveIOServer.getMongoManager()&&index_1.ResolveIOServer.getMongoManager().getServerCollections().length&&(index_1.ResolveIOServer.getMongoManager().registerCollection(t),clearInterval(o))},1))}var e;return MongoManagerCollection.prototype.extractIndexNameFromError=function(e){var n=e.match(/Index already exists with a different name: (\S+)/);return(n=!n||n.length<=1?e.match(/existing index:.*name: "([^"]+)"/):n)&&1<n.length?n[1]:null},MongoManagerCollection.prototype.aggregate=function(i,r,e){var a=this;return void 0===e&&(e=!1),new Promise(function(n,t){var o;e?(o=new monitor_manager_1.MonitorMongo("aggregate",a.collectionName,JSON.stringify([i,r])),index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).aggregate(i,r).toArray().then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Aggregate",a.collectionName,i,r,e),t(e)})):index_1.ResolveIOServer.getMongoManager().aggregate(a.collectionName,i,r).then(function(e){n(e)},function(e){t(e)})})},MongoManagerCollection.prototype.aggregateCount=function(r,a){return __awaiter(this,void 0,void 0,function(){var i=this;return __generator(this,function(e){return[2,new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("aggregateCount",i.collectionName,JSON.stringify([r,a]));index_1.ResolveIOServer.getMainDB().collection(i.collectionName,i.collectionOptions).aggregate(r,a).toArray().then(function(e){o.finish(),n(e.length)},function(e){o.finish(),console.log(new Date,"Error Aggregate",i.collectionName,r,a,e),t(0)})})]})})},MongoManagerCollection.prototype.aggregateCursor=function(e,n){var t=new monitor_manager_1.MonitorMongo("aggregateCursor",this.collectionName,JSON.stringify([e,n])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).aggregate(e,n);return e.on("close",function(e){return t.finish(),e}),e},MongoManagerCollection.prototype.aggregateStream=function(e,n,t){var o=new monitor_manager_1.MonitorMongo("aggregateStream",this.collectionName,JSON.stringify([e,n,t])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).aggregate(e,n).stream(t);return e.on("end",function(e){return o.finish(),e}).on("error",function(e){return o.finish(),e}).on("close",function(e){return o.finish(),e}),e},MongoManagerCollection.prototype.bulkWrite=function(k,P,j,L){return void 0===j&&(j=!1),void 0===L&&(L=!1),__awaiter(this,void 0,void 0,function(){var n,t,o,i,r,a,s,c,l,d,u,g,_,h,m,f,v,p,M,y,O,S,N,x,w,I,C,D,b,R,A,B,E,$,J;return __generator(this,function(e){switch(e.label){case 0:if(!k.length)return[2,null];for(n=[],t=[],o=new Set,i=[],r=new Set,a=0;a<k.length;a++)if(s=k[a],c=Object.keys(s)[0],I=s[c],"insertOne"===c){if(I.document._id||(I.document._id=objectIdHexString()),this.useVersions&&void 0===I.document.__v&&(I.document.__v=0),this.timestamps&&(l=new Date,I.document.createdAt=I.document.createdAt||l,I.document.updatedAt=I.document.updatedAt||l),this.checkSchema&&!L&&!(d=this.simplschema.newContext()).validate(I.document))throw new Error("Schema validation failed for insertOne: ".concat(JSON.stringify(d.validationErrors())));n.push(s),!j&&this.createLogs&&t.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:I.document._id,payload:(0,common_1.getBinarySize)(JSON.stringify([s,P]))<2e5?JSON.stringify([s,P],null,2):"Too Big",method:c,id_user:"",user:"",messageId:0,route:""}}}),this.useVersions&&o.add(I.document._id)}else if("updateOne"===c||"replaceOne"===c){if("updateOne"===c){if(I.update.$set||(I.update.$set={}),this.timestamps&&(I.update.$set.updatedAt=new Date),this.useVersions&&(I.update.$inc||(I.update.$inc={}),I.update.$inc.__v=1),I.upsert&&(I.update.$setOnInsert||(I.update.$setOnInsert={}),I.update.$setOnInsert._id||(I.update.$setOnInsert._id=objectIdHexString()),this.timestamps&&(I.update.$setOnInsert.createdAt=new Date),this.useVersions)&&(I.update.$setOnInsert.__v=0),this.checkSchema&&!L&&!(d=this.simplschema.newContext()).validate(I.update,{modifier:!0}))throw new Error("Schema validation failed for updateOne: ".concat(JSON.stringify(d.validationErrors())))}else if("replaceOne"===c&&(this.timestamps&&(I.replacement.updatedAt=new Date,I.upsert)&&!I.replacement.createdAt&&(I.replacement.createdAt=new Date),this.useVersions&&(I.replacement.__v=void 0!==I.replacement.__v?I.replacement.__v+1:0),this.checkSchema)&&!L&&!(d=this.simplschema.newContext()).validate(I.replacement))throw new Error("Schema validation failed for replaceOne: ".concat(JSON.stringify(d.validationErrors())));n.push(s),!j&&this.createLogs?(u="",I.filter&&I.filter._id?(u=I.filter._id,this.useVersions&&o.add(I.filter._id)):(i.push({filter:I.filter,opIndex:t.length,isSingle:!0}),this.extractFieldNames(I.filter,r)),t.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:u,payload:(0,common_1.getBinarySize)(JSON.stringify([s,P]))<2e5?JSON.stringify([s,P],null,2):"Too Big",method:c,id_user:"",user:"",messageId:0,route:""}}})):I.filter&&I.filter._id&&this.useVersions?o.add(I.filter._id):this.useVersions&&(i.push({filter:I.filter,opIndex:null,isSingle:!0}),this.extractFieldNames(I.filter,r))}else if("updateMany"===c){if(I.update.$set||(I.update.$set={}),this.timestamps&&(I.update.$set.updatedAt=new Date),this.useVersions&&(I.update.$inc||(I.update.$inc={}),I.update.$inc.__v=1),this.checkSchema&&!L&&!(d=this.simplschema.newContext()).validate(I.update,{modifier:!0}))throw new Error("Schema validation failed for updateMany: ".concat(JSON.stringify(d.validationErrors())));n.push(s),!j&&this.createLogs&&(i.push({filter:I.filter,opIndex:t.length,isUpdateMany:!0}),this.extractFieldNames(I.filter,r),t.push({insertMany:[]})),this.useVersions&&(i.push({filter:I.filter,opIndex:null,isUpdateMany:!0}),this.extractFieldNames(I.filter,r))}else{if("deleteOne"!==c&&"deleteMany"!==c)throw new Error("Unsupported operation type: ".concat(c));n.push(s),!j&&this.createLogs&&(u="",I.filter&&I.filter._id?(u=I.filter._id,this.useVersions&&o.add(I.filter._id)):(i.push({filter:I.filter,opIndex:t.length,isDeleteMany:"deleteMany"===c}),this.extractFieldNames(I.filter,r)),t.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:u,payload:(0,common_1.getBinarySize)(JSON.stringify([s,P]))<2e5?JSON.stringify([s,P],null,2):"Too Big",method:c,id_user:"",user:"",messageId:0,route:""}}})),this.useVersions&&(I.filter&&I.filter._id?o.add(I.filter._id):(i.push({filter:I.filter,opIndex:null,isDeleteMany:"deleteMany"===c}),this.extractFieldNames(I.filter,r)))}e.label=1;case 1:return(e.trys.push([1,5,,6]),i.length)?(_={$or:i.map(function(e){return e.filter})},g={_id:1},r.forEach(function(e){g[e]=1}),[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName).find(_,{projection:g}).toArray()]):[3,3];case 2:_=e.sent();try{for(h=__values(_),m=h.next();!m.done;m=h.next()){I=m.value;try{for(R=void 0,f=__values(i),v=f.next();!v.done;v=f.next())p=v.value,(0,sift_1.default)(p.filter)(I)&&(null!==p.opIndex&&(p.isUpdateMany||p.isDeleteMany?(t[p.opIndex].insertMany||(t[p.opIndex].insertMany=[]),t[p.opIndex].insertMany.push({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:I._id,payload:(0,common_1.getBinarySize)(JSON.stringify([k[p.opIndex],P]))<2e5?JSON.stringify([k[p.opIndex],P],null,2):"Too Big",method:k[p.opIndex]?Object.keys(k[p.opIndex])[0]:"",id_user:"",user:"",messageId:0,route:""})):p.isSingle&&(t[p.opIndex].insertOne.document.id_document=I._id)),this.useVersions)&&o.add(I._id)}catch(e){R={error:e}}finally{try{v&&!v.done&&(A=f.return)&&A.call(f)}finally{if(R)throw R.error}}}}catch(e){D={error:e}}finally{try{m&&!m.done&&(b=h.return)&&b.call(h)}finally{if(D)throw D.error}}e.label=3;case 3:return[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(n,P)];case 4:if(M=e.sent(),this.useVersions&&0<o.size&&(C=Array.from(o),index_1.ResolveIOServer.getMainDB().collection(this.collectionName).aggregate([{$match:{_id:{$in:C}}},{$addFields:{_id:{_id:"$_id",__v:"$__v"}}},{$project:{__v:0}},{$merge:{into:this.versionCollection,whenMatched:"insert",whenNotMatched:"insert"}}]).toArray(),(C=C.map(function(e){return{deleteMany:{filter:{"_id._id":e,"_id.__v":{$lte:{$subtract:[{$toInt:"$$CURRENT.__v"},5]}}}}}})).length)&&index_1.ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(C,{ordered:!1}),!j&&t.length){y=[];try{for(O=__values(t),S=O.next();!S.done;S=O.next())if((N=S.value).insertOne)y.push(N);else if(N.insertMany)try{for($=void 0,x=__values(N.insertMany),w=x.next();!w.done;w=x.next())I=w.value,y.push({insertOne:{document:I}})}catch(e){$={error:e}}finally{try{w&&!w.done&&(J=x.return)&&J.call(x)}finally{if($)throw $.error}}}catch(e){B={error:e}}finally{try{S&&!S.done&&(E=O.return)&&E.call(O)}finally{if(B)throw B.error}}y.length&&log_collection_1.Logs.bulkWrite(y,{ordered:!1})}return index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName),[2,M];case 5:throw C=e.sent(),console.error("Error in bulkWrite:",C),C;case 6:return[2]}})})},MongoManagerCollection.prototype.extractFieldNames=function(e,n,t){var o=this;if(void 0===t&&(t=""),"object"==typeof e&&null!=e)for(var i in e){var r=e[i];i.startsWith("$")?Array.isArray(r)?r.forEach(function(e){return o.extractFieldNames(e,n,t)}):"object"==typeof r&&this.extractFieldNames(r,n,t):(i=t?"".concat(t,".").concat(i):i,"object"!=typeof r||null===r||Array.isArray(r)?n.add(i):(n.add(i),this.extractFieldNames(r,n,i)))}},MongoManagerCollection.prototype.countDocuments=function(a,s,c){var e=this;return void 0===a&&(a={}),void 0===c&&(c=!1),new Promise(function(i,r){return __awaiter(e,void 0,void 0,function(){var n,t,o=this;return __generator(this,function(e){switch(e.label){case 0:return(e.trys.push([0,4,,5]),0===Object.keys(a).length)?[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).estimatedDocumentCount(s)]:[3,2];case 1:return t=e.sent(),i(t),[3,3];case 2:c?(n=new monitor_manager_1.MonitorMongo("countDocuments",this.collectionName,JSON.stringify([a,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).countDocuments(a,s).then(function(e){n.finish(),i(e)},function(e){n.finish(),console.log(new Date,"Error Count Documents",o.collectionName,a,s,e),r(e)})):index_1.ResolveIOServer.getMongoManager().countDocuments(this.collectionName,a,s).then(function(e){return i(e)},function(e){return r(e)}),e.label=3;case 3:return[3,5];case 4:return t=e.sent(),console.log(new Date,"Error Count Documents (Stats)",this.collectionName,a,s,t),r(t),[3,5];case 5:return[2]}})})})},MongoManagerCollection.prototype.create=function(e,n){return Array.isArray(e)?1===e.length?this.insertOne(e[0],n):this.insertMany(e,n):this.insertOne(e,n)},MongoManagerCollection.prototype.createIndex=function(i,r){var e=this;return new Promise(function(t,o){return __awaiter(e,void 0,void 0,function(){var n;return __generator(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).indexes()];case 1:return(n=e.sent(),n.some(function(e){return JSON.stringify(e.key)===JSON.stringify(i)}))?[2,t("Index already exists")]:(MongoManagerCollection.indexQueue.push({action:"createIndex",collection:this,specs:[i],options:r},function(e,n){e?o(e):t(n)}),[3,3]);case 2:return n=e.sent(),o(n),[3,3];case 3:return[2]}})})})},MongoManagerCollection.prototype.createIndexes=function(r,a){var e=this;return new Promise(function(o,i){return __awaiter(e,void 0,void 0,function(){var t,n;return __generator(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).indexes()];case 1:return(t=e.sent(),0===(n=r.filter(function(n){return!t.some(function(e){return JSON.stringify(e.key)===JSON.stringify(n.key)})})).length)?[2,o(["All indexes already exist"])]:(MongoManagerCollection.indexQueue.push({action:"createIndexes",collection:this,specs:[n],options:a},function(e,n){e?i(e):o(n)}),[3,3]);case 2:return n=e.sent(),i(n),[3,3];case 3:return[2]}})})})},MongoManagerCollection.prototype.deleteMany=function(l,d,u){var e=this;return void 0===l&&(l={}),void 0===u&&(u=!1),new Promise(function(s,c){return __awaiter(e,void 0,void 0,function(){var n,t,o,i,r,a=this;return __generator(this,function(e){switch(e.label){case 0:return!this.createLogs||u?[3,2]:[4,this.find(l)];case 1:for(n=e.sent(),t=0;t<n.length;t++)o=n[t],log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:o._id,payload:(0,common_1.getBinarySize)(JSON.stringify([o,l,d]))<2e5?JSON.stringify([o,l,d],null,2):"Too Big",method:"deleteMany",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((i=(0,common_1.deepCopy)(o))._id={_id:o._id,__v:o.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:o._id,__v:o.__v}},i,{upsert:!0}),index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":o._id},{"_id.__v":{$lt:o.__v-1}}]}));e.label=2;case 2:return r=new monitor_manager_1.MonitorMongo("deleteMany",this.collectionName,JSON.stringify([l,d])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).deleteMany(l,d).then(function(e){r.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),s(e.deletedCount)):c(e.acknowledged)},function(e){r.finish(),console.log(new Date,"Error Delete Many",a.collectionName,l,d,e),c(e)}),[2]}})})})},MongoManagerCollection.prototype.deleteOne=function(a,s,c){var e=this;return void 0===a&&(a={}),void 0===c&&(c=!1),new Promise(function(r,o){return __awaiter(e,void 0,void 0,function(){var i,n,t=this;return __generator(this,function(e){return this.createLogs&&!c?(i=new monitor_manager_1.MonitorMongo("findOneAndDelete",this.collectionName,JSON.stringify([a,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndDelete(a,s).then(function(o){return __awaiter(t,void 0,void 0,function(){var n,t;return __generator(this,function(e){return i.finish(),(n=o)?(this.createLogs&&!c&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,a,s]))<2e5?JSON.stringify([n,a,s],null,2):"Too Big",method:"deleteOne",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((t=(0,common_1.deepCopy)(n))._id={_id:n._id,__v:n.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:n._id,__v:n.__v}},t,{upsert:!0}),index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":n._id},{"_id.__v":{$lt:n.__v-1}}]})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName),r(1)):r(0),[2]})})},function(e){i.finish(),console.log(new Date,"Error Find One And Delete",t.collectionName,a,s,e),o(e)})):(n=new monitor_manager_1.MonitorMongo("deleteOne",this.collectionName,JSON.stringify([a,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).deleteOne(a,s).then(function(e){n.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(t.collectionName),r(e.deletedCount)):o(e.acknowledged)},function(e){n.finish(),console.log(new Date,"Error Delete One",t.collectionName,a,s,e),o(e)})),[2]})})})},MongoManagerCollection.prototype.distinct=function(e,i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("distinct",a.collectionName,JSON.stringify([e,i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).distinct(e,i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Distinct",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.drop=function(i){var r=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("drop",r.collectionName,JSON.stringify([i]));index_1.ResolveIOServer.getMainDB().collection(r.collectionName,r.collectionOptions).drop(i).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Count Documents",r.collectionName,i,e),t(e)})})},MongoManagerCollection.prototype.dropIndex=function(i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("dropIndex",a.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).dropIndex(i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Drop Index",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.dropIndexes=function(i){var r=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("dropIndexes",r.collectionName,JSON.stringify([i]));index_1.ResolveIOServer.getMainDB().collection(r.collectionName,r.collectionOptions).dropIndexes(i).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Drop Indexes",r.collectionName,i,e),t(e)})})},MongoManagerCollection.prototype.find=function(r,a,s){var e=this;return void 0===r&&(r={}),void 0===s&&(s=!1),new Promise(function(o,i){return __awaiter(e,void 0,void 0,function(){var n,t=this;return __generator(this,function(e){return s?(n=new monitor_manager_1.MonitorMongo("find",this.collectionName,JSON.stringify([r,a])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(r,a).toArray().then(function(e){n.finish(),o(e)},function(e){n.finish(),console.log(new Date,"Error Find",t.collectionName,r,a,e),i(e)})):index_1.ResolveIOServer.getMongoManager().find(this.collectionName,r,a).then(function(e){o(e)},function(e){i(e)}),[2]})})})},MongoManagerCollection.prototype.findById=function(i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("findById",a.collectionName,JSON.stringify([{_id:i},r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).findOne({_id:i},r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Find By Id",a.collectionName,{_id:i},r,e),t(e)})})},MongoManagerCollection.prototype.findCount=function(i,r){var a=this;return void 0===i&&(i={}),new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("findCount",a.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).find(i,r).count().then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Find Count",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.findCursor=function(e,n){void 0===e&&(e={});var t=new monitor_manager_1.MonitorMongo("findCursor",this.collectionName,JSON.stringify([e,n])),o=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(e,n);return o.on("close",function(e){return t.finish(),o.removeAllListeners(),e}),o},MongoManagerCollection.prototype.findStream=function(e,n,t){void 0===e&&(e={});var o=new monitor_manager_1.MonitorMongo("findStream",this.collectionName,JSON.stringify([e,n,t])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(e,n).stream(t);return e.on("end",function(e){return o.finish(),e}).on("error",function(e){return o.finish(),e}).on("close",function(e){return o.finish(),e}),e},MongoManagerCollection.prototype.findOne=function(i,r,e){var a=this;return void 0===i&&(i={}),void 0===e&&(e=!1),new Promise(function(n,t){var o;e?(o=new monitor_manager_1.MonitorMongo("findOne",a.collectionName,JSON.stringify([i,r])),index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).findOne(i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Find One",a.collectionName,i,r,e),t(e)})):index_1.ResolveIOServer.getMongoManager().findOne(a.collectionName,i,r).then(function(e){n(e)},function(e){t(e)})})},MongoManagerCollection.prototype.findOneAndDelete=function(r,a,s){var e=this;return void 0===r&&(r={}),void 0===s&&(s=!1),new Promise(function(i,n){return __awaiter(e,void 0,void 0,function(){var t,o=this;return __generator(this,function(e){return t=new monitor_manager_1.MonitorMongo("findOneAndDelete",this.collectionName,JSON.stringify([r,a])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndDelete(r,a).then(function(e){t.finish();var n;e?(o.createLogs&&!s&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:o.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,r,a]))<2e5?JSON.stringify([e,r,a],null,2):"Too Big",method:"findOneAndDelete",id_user:"",user:"",messageId:0,route:""}),o.useVersions&&((n=(0,common_1.deepCopy)(e))._id={_id:e._id,__v:e.__v},index_1.ResolveIOServer.getMongoManager().collection(o.versionCollection).replaceOne({_id:{_id:e._id,__v:e.__v}},n,{upsert:!0})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(o.collectionName),i(e)):i(null)},function(e){t.finish(),console.log(new Date,"Error Find One And Delete",o.collectionName,r,a,e),n(e)}),[2]})})})},MongoManagerCollection.prototype.findOneAndReplace=function(s,c,l,d,u){var e=this;return void 0===s&&(s={}),void 0===d&&(d=!1),void 0===u&&(u=!1),new Promise(function(r,a){return __awaiter(e,void 0,void 0,function(){var n,t,o,i=this;return __generator(this,function(e){return!this.checkSchema||u||(n=this.simplschema.newContext(),n.validate(c))?(t=new Date,this.timestamps&&(c.updatedAt=t),l&&l.upsert&&(c._id||(c._id=objectIdHexString()),this.useVersions&&(c.__v=0),this.timestamps)&&!c.createdAt&&(c.createdAt=t),o=new monitor_manager_1.MonitorMongo("findOneAndReplace",this.collectionName,JSON.stringify([s,c,l])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndReplace(s,c,l).then(function(e){o.finish();var n;e?(i.createLogs&&!d&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:i.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,s,c,l]))<2e5?JSON.stringify([e,s,c,l],null,2):"Too Big",method:"findOneAndReplace",id_user:"",user:"",messageId:0,route:""}),i.useVersions&&((n=(0,common_1.deepCopy)(e))._id={_id:e._id,__v:e.__v},index_1.ResolveIOServer.getMongoManager().collection(i.versionCollection).replaceOne({_id:{_id:e._id,__v:e.__v}},n,{upsert:!0})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(i.collectionName),r(e)):r(null)},function(e){o.finish(),console.log(new Date,"Error Find One And Replace",i.collectionName,s,l,e),a(e)})):(console.log(new Date,this.collectionName,"Schema Errors - findOneAndReplace",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on findOneAndReplace - "+this.collectionName,[n.validationErrors(),c]),a(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.findOneAndUpdate=function(s,c,l,d,u){var e=this;return void 0===s&&(s={}),void 0===d&&(d=!1),void 0===u&&(u=!1),new Promise(function(r,a){return __awaiter(e,void 0,void 0,function(){var n,t,o,i=this;return __generator(this,function(e){return!this.checkSchema||u||(n=this.simplschema.newContext(),n.validate(c,{modifier:!0}))?(this.timestamps&&(t=new Date,c.$set?c.$set.updatedAt=t:c.$set={updatedAt:t}),l&&l.upsert&&(c.$setOnInsert?(c.$setOnInsert._id||(c.$setOnInsert._id=objectIdHexString()),this.timestamps&&!c.$setOnInsert.createdAt&&(c.$setOnInsert.createdAt=new Date)):this.timestamps?c.$setOnInsert={_id:objectIdHexString(),createdAt:new Date}:c.$setOnInsert={_id:objectIdHexString()}),o=new monitor_manager_1.MonitorMongo("findOneAndUpdate",this.collectionName,JSON.stringify([s,c,l])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndUpdate(s,c,l).then(function(e){o.finish();var n;e?(i.createLogs&&!d&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:i.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,s,c,l]))<2e5?JSON.stringify([e,s,c,l],null,2):"Too Big",method:"findOneAndUpdate",id_user:"",user:"",messageId:0,route:""}),i.useVersions&&((n=(0,common_1.deepCopy)(e))._id={_id:e._id,__v:e.__v},index_1.ResolveIOServer.getMongoManager().collection(i.versionCollection).replaceOne({_id:{_id:e._id,__v:e.__v}},n,{upsert:!0})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(i.collectionName),r(e)):r(null)},function(e){o.finish(),console.log(new Date,"Error Find One And Update",i.collectionName,s,l,e),a(e)})):(console.log(new Date,this.collectionName,"Schema Errors - findOneAndUpdate",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on findOneAndUpdate - "+this.collectionName,[n.validationErrors(),c]),a(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.indexes=function(i){var r=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("indexes",r.collectionName,JSON.stringify([i]));index_1.ResolveIOServer.getMainDB().collection(r.collectionName,r.collectionOptions).indexes(i).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Indexes",r.collectionName,i,e),t(e)})})},MongoManagerCollection.prototype.indexExists=function(i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("indexExists",a.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).indexExists(i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Index Exists",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.insertMany=function(d,u,g,_,h){var e=this;return void 0===g&&(g=!1),void 0===_&&(_=!1),void 0===h&&(h=!1),new Promise(function(c,l){return __awaiter(e,void 0,void 0,function(){var t,n,o,i,r,a,s=this;return __generator(this,function(e){if(d.length){for(t=[],this.checkSchema&&!_&&d.forEach(function(e){var n=s.simplschema.newContext();n.validate(e)?t.push(!0):(console.log(new Date,s.collectionName,"Schema Errors - insertMany",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on insertMany - "+s.collectionName,[n.validationErrors(),e]),t.push(!1))}),n=this.checkSchema?d.filter(function(e,n){return t[n]}):d,o=0;o<n.length;o++)(i=n[o])._id||(i._id=objectIdHexString()),this.timestamps&&(r=new Date,i.createdAt||(i.createdAt=r),i.updatedAt||(i.updatedAt=r)),this.useVersions&&!i.hasOwnProperty("__v")&&(i.__v=0),this.createLogs&&!g&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:i._id,payload:(0,common_1.getBinarySize)(JSON.stringify([i,u]))<2e5?JSON.stringify([i,u],null,2):"Too Big",method:"insertMany",id_user:"",user:"",messageId:0,route:""});n.length&&(a=null,h||(a=new monitor_manager_1.MonitorMongo("insertMany",this.collectionName,JSON.stringify([n,u]))),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).insertMany(n,u).then(function(e){a&&a.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(n)):l(e.acknowledged)},function(e){a&&a.finish(),console.log(new Date,"Error Insert Many",s.collectionName,n,u,e),l(e)}))}else c([]);return[2]})})})},MongoManagerCollection.prototype.insertOne=function(s,c,l,d){var e=this;return void 0===l&&(l=!1),void 0===d&&(d=!1),new Promise(function(r,a){return __awaiter(e,void 0,void 0,function(){var n,t,o,i=this;return __generator(this,function(e){return s._id||(s._id=objectIdHexString()),!this.checkSchema||d||(n=this.simplschema.newContext(),n.validate(s))?(this.timestamps&&(t=new Date,s.createdAt||(s.createdAt=t),s.updatedAt||(s.updatedAt=t)),this.createLogs&&!l&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:s._id,payload:(0,common_1.getBinarySize)(JSON.stringify([s,c]))<2e5?JSON.stringify([s,c],null,2):"Too Big",method:"insertOne",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&!s.hasOwnProperty("__v")&&(s.__v=0),o=new monitor_manager_1.MonitorMongo("insertOne",this.collectionName,JSON.stringify([s,c])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).insertOne(s,c).then(function(e){o.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(i.collectionName),r(s)):a(e.acknowledged)},function(e){o.finish(),console.log(new Date,"Error Insert One",i.collectionName,s,c,e),a(e)})):(console.log(new Date,this.collectionName,"Schema Errors - insertOne",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on insertOne - "+this.collectionName,[n.validationErrors(),s]),a(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.listIndexes=function(e){var n=new monitor_manager_1.MonitorMongo("listIndexes",this.collectionName,JSON.stringify([e])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).listIndexes(e);return e.on("close",function(e){return n.finish(),e}),e},MongoManagerCollection.prototype.rename=function(i,r){var a=this;return new Promise(function(n,t){var o=new monitor_manager_1.MonitorMongo("rename",a.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(a.collectionName,a.collectionOptions).rename(i,r).then(function(e){o.finish(),n(e)},function(e){o.finish(),console.log(new Date,"Error Rename",a.collectionName,i,r,e),t(e)})})},MongoManagerCollection.prototype.replaceOne=function(m,f,v,p,M,y){var e=this;return void 0===p&&(p=!1),void 0===M&&(M=!1),void 0===y&&(y=null),new Promise(function(_,h){return __awaiter(e,void 0,void 0,function(){var n,t,o,i,r,a,s,c,l,d,u,g=this;return __generator(this,function(e){switch(e.label){case 0:return!this.checkSchema||M||(t=this.simplschema.newContext(),t.validate(f))?(n=new Date,this.timestamps&&(f.updatedAt=n),this.useVersions?y?[3,2]:[4,this.findOne(m,null,!0)]:[3,8]):(console.log(new Date,this.collectionName,"Schema Errors - replaceOne",t.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on replaceOne - "+this.collectionName,[t.validationErrors(),f]),h(t.validationErrors()),[2]);case 1:y=e.sent(),e.label=2;case 2:return y?(this.timestamps&&!f.createdAt&&y.createdAt&&(f.createdAt=y.createdAt),y.__v!==f.__v?[3,3]:(f.__v+=1,(t=(0,common_1.deepCopy)(y))._id={_id:y._id,__v:y.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:y._id,__v:y.__v}},t,{upsert:!0}),4<=y.__v&&index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":y._id},{"_id.__v":{$lt:y.__v-4}}]}),this.createLogs&&!p&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:y._id,payload:(0,common_1.getBinarySize)(JSON.stringify([y,m,f,v]))<2e5?JSON.stringify([y,m,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),o=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([m,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(m,f,v).then(function(e){o.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(e.modifiedCount)):h(e.acknowledged)},function(e){o.finish(),console.log(new Date,"Error Replace One",g.collectionName,m,f,v,e),h(e)}),[3,5])):[3,6];case 3:return console.log("invalid version - "+this.collectionName,y.__v,f.__v),[4,index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({_id:{_id:y._id,__v:f.__v}},null,!0)];case 4:(i=e.sent())?(r=y._id,a=y.__v,(s=(0,common_1.getMongoMergeUpdatedDoc)(f,y,i))._id=r,s.__v=a+1,this.createLogs&&!p&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:r,payload:(0,common_1.getBinarySize)(JSON.stringify(["invalidVersion - merge",y,m,s,v]))<2e5?JSON.stringify(["invalidVersion - merge",y,m,s,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),c=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([m,s,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(m,s,v).then(function(e){c.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(e.modifiedCount)):h(e.acknowledged)},function(e){c.finish(),console.log(new Date,"Error Replace One",g.collectionName,m,s,v,e),h(e)})):h("Invalid Version And Could Not Find History - DB: "+y.__v+", Trying to update with :"+f.__v),e.label=5;case 5:return[3,7];case 6:v&&v.upsert?(this.timestamps&&(f.createdAt=n),f._id||(f._id=objectIdHexString()),f.__v=0,this.createLogs&&!p&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:f._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",m,f,v]))<2e5?JSON.stringify(["upsert",m,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),l=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([m,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(m,f,v).then(function(e){l.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(e.modifiedCount)):h(e.acknowledged)},function(e){l.finish(),console.log(new Date,"Error Replace One",g.collectionName,m,f,v,e),h(e)})):h("No Document"),e.label=7;case 7:return[3,9];case 8:v&&v.upsert&&(this.timestamps&&!f.createdAt&&(f.createdAt=n),f._id||(f._id=objectIdHexString()),f.__v=0),this.createLogs&&!p?(v?v.returnDocument="before":v={returnDocument:"before"},d=new monitor_manager_1.MonitorMongo("findOneAndReplace",this.collectionName,JSON.stringify([m,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndReplace(m,f,v).then(function(e){d.finish();e?log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:g.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,m,f,v]))<2e5?JSON.stringify([e,m,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}):log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:g.collectionName,id_document:f._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",m,f,v]))<2e5?JSON.stringify(["upsert",m,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(1)},function(e){d.finish(),console.log(new Date,"Error Find One And Replace",g.collectionName,m,f,v,e),h(e)})):(u=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([m,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(m,f,v).then(function(e){u.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(g.collectionName),_(e.modifiedCount)):h(e.acknowledged)},function(e){u.finish(),console.log(new Date,"Error Replace One",g.collectionName,m,f,v,e),h(e)})),e.label=9;case 9:return[2]}})})})},MongoManagerCollection.prototype.updateMany=function(d,u,g,_,h,m){var e=this;return void 0===_&&(_=!1),void 0===h&&(h=!1),void 0===m&&(m=!1),new Promise(function(c,l){return __awaiter(e,void 0,void 0,function(){var n,t,o,i,r,a,s=this;return __generator(this,function(e){switch(e.label){case 0:return u.$inc&&"{}"!==JSON.stringify(u.$inc)||u.$set&&"{}"!==JSON.stringify(u.$set)||u.$setOnInsert&&"{}"!==JSON.stringify(u.$setOnInsert)||u.$unset&&"{}"!==JSON.stringify(u.$unset)?(this.timestamps&&(n=new Date,u.$set?u.$set.updatedAt=n:u.$set={updatedAt:n}),!this.checkSchema||h||(n=this.simplschema.newContext(),n.validate(u,{modifier:!0}))?this.useVersions&&!m||this.createLogs&&!_?[4,this.find(d)]:[3,2]:(console.log(new Date,this.collectionName,"Schema Errors - updateMany",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on updateMany - "+this.collectionName,[n.validationErrors(),u]),l(n.validationErrors()),[2])):(c(1),[2]);case 1:for(t=e.sent(),o=0;o<t.length;o++)i=t[o],this.createLogs&&!_&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:i._id,payload:(0,common_1.getBinarySize)(JSON.stringify([i,d,u,g]))<2e5?JSON.stringify([i,d,u,g],null,2):"Too Big",method:"updateMany",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((r=(0,common_1.deepCopy)(i))._id={_id:i._id,__v:i.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:i._id,__v:i.__v}},r,{upsert:!0}),4<=i.__v&&index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":i._id},{"_id.__v":{$lt:i.__v-4}}]}),objectContainsPropertyDeep(u,"__v")||(u.$inc?u.$inc.__v||(u.$inc.__v=1):u.$inc={__v:1}));e.label=2;case 2:return a=new monitor_manager_1.MonitorMongo("updateMany",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateMany(d,u,g).then(function(e){a.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.modifiedCount)):l(e.acknowledged)},function(e){a.finish(),console.log(new Date,"Error Update Many",s.collectionName,d,u,g,e),l(e)}),[2]}})})})},MongoManagerCollection.prototype.updateOne=function(d,u,g,_,h){var e=this;return void 0===_&&(_=!1),void 0===h&&(h=!1),new Promise(function(c,l){return __awaiter(e,void 0,void 0,function(){var n,t,o,i,r,a,s=this;return __generator(this,function(e){switch(e.label){case 0:return!this.checkSchema||h||(t=this.simplschema.newContext(),t.validate(u,{modifier:!0}))?u.$inc&&"{}"!==JSON.stringify(u.$inc)||u.$set&&"{}"!==JSON.stringify(u.$set)||u.$setOnInsert&&"{}"!==JSON.stringify(u.$setOnInsert)||u.$unset&&"{}"!==JSON.stringify(u.$unset)?(n=new Date,this.timestamps&&(u.$set?u.$set.updatedAt=n:u.$set={updatedAt:n}),this.useVersions?[4,this.findOne(d,null,!0)]:[3,2]):(c(1),[2]):(console.log(new Date,this.collectionName,"Schema Errors - updateOne",t.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on updateOne - "+this.collectionName,[t.validationErrors(),u]),l(t.validationErrors()),[2]);case 1:return(n=e.sent())?(this.createLogs&&!_&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,d,u,g]))<2e5?JSON.stringify([n,d,u,g],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),(t=(0,common_1.deepCopy)(n))._id={_id:n._id,__v:n.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:n._id,__v:n.__v}},t,{upsert:!0}),4<=n.__v&&index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":n._id},{"_id.__v":{$lt:n.__v-4}}]}),objectContainsPropertyDeep(u,"__v")||(u.$inc?u.$inc.__v||(u.$inc.__v=1):u.$inc={__v:1}),o=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,g).then(function(e){o.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.modifiedCount)):l(e.acknowledged)},function(e){o.finish(),console.log(new Date,"Error Update One",s.collectionName,d,u,g,e),l(e)})):g&&g.upsert?(u.$setOnInsert?(u.$setOnInsert._id||(u.$setOnInsert._id=objectIdHexString()),this.timestamps&&!u.$setOnInsert.createdAt&&(u.$setOnInsert.createdAt=new Date)):this.timestamps?u.$setOnInsert={_id:objectIdHexString(),__v:0,createdAt:new Date}:u.$setOnInsert={_id:objectIdHexString(),__v:0},this.createLogs&&!_&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:u.$setOnInsert._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",d,u,g]))<2e5?JSON.stringify(["upsert",d,u,g],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),i=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,g).then(function(e){i.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.modifiedCount)):l(e.acknowledged)},function(e){i.finish(),console.log(new Date,"Error Update One",s.collectionName,d,u,g,e),l(e)})):l("No Document"),[3,3];case 2:g&&g.upsert&&(u.$setOnInsert?(u.$setOnInsert._id||(u.$setOnInsert._id=objectIdHexString()),this.timestamps&&!u.$setOnInsert.createdAt&&(u.$setOnInsert.createdAt=new Date)):this.timestamps?u.$setOnInsert={_id:objectIdHexString(),createdAt:new Date}:u.$setOnInsert={_id:objectIdHexString()}),this.createLogs&&!_?(g?g.returnDocument="before":g={returnDocument:"before"},r=new monitor_manager_1.MonitorMongo("findOneAndUpdate",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndUpdate(d,u,g).then(function(e){r.finish();var n=e.value;n?(log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:s.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,d,u,g]))<2e5?JSON.stringify([n,d,u,g],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),c(e.ok)):u.$setOnInsert?(log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:s.collectionName,id_document:u.$setOnInsert._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",d,u,g]))<2e5?JSON.stringify(["upsert",d,u,g],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.ok)):c(0)},function(e){r.finish(),console.log(new Date,"Error Find One And Update",s.collectionName,d,u,g,e),l(e)})):(a=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,g])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,g).then(function(e){a.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(s.collectionName),c(e.modifiedCount)):l(e.acknowledged)},function(e){a.finish(),console.log(new Date,"Error Update One",s.collectionName,d,u,g,e),l(e)})),e.label=3;case 3:return[2]}})})})},MongoManagerCollection.prototype.watchCollection=function(e,n){return void 0===e&&(e=[]),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).watch(e,n)},(e=MongoManagerCollection).indexQueue=async_1.default.queue(function(d,u){return __awaiter(void 0,void 0,void 0,function(){var n,t,o,i,r,a,s,c,l;return __generator(e,function(e){switch(e.label){case 0:if(n=d.action,t=d.collection,o=d.specs,i=d.options,!(r=index_1.ResolveIOServer.getMainDB().collection(t.collectionName,t.collectionOptions)))return[2,u(new Error("Collection ".concat(t.collectionName," not found")))];a=new monitor_manager_1.MonitorMongo(n,t.collectionName,JSON.stringify([o,i])),e.label=1;case 1:return e.trys.push([1,3,,10]),[4,r[n].apply(r,__spreadArray(__spreadArray([],__read(o),!1),[i],!1))];case 2:return c=e.sent(),a.finish(),u(null,c),[3,10];case 3:if(85!==(s=e.sent()).code&&!s.message.includes("IndexOptionsConflict"))return[3,9];e.label=4;case 4:return(e.trys.push([4,8,,9]),l=t.extractIndexNameFromError(s.message))?[4,r.dropIndex(l)]:[3,7];case 5:return e.sent(),[4,r[n].apply(r,__spreadArray(__spreadArray([],__read(o),!1),[i],!1))];case 6:return c=e.sent(),a.finish(),u(null,c),[2];case 7:return[3,9];case 8:return l=e.sent(),u(l),[3,9];case 9:return a.finish(),u(s),[3,10];case 10:return[2]}})})},1),MongoManagerCollection}()),MongoManagerUserCollection=function(e){function MongoManagerUserCollection(){return null!==e&&e.apply(this,arguments)||this}return __extends(MongoManagerUserCollection,e),MongoManagerUserCollection.prototype.authenticate=function(a,t){var e=this;return new Promise(function(i,r){return __awaiter(e,void 0,void 0,function(){var n,o=this;return __generator(this,function(e){switch(e.label){case 0:return(n=Math.pow(100,Math.log(a.attempts+1)),n=n<3e5?n:3e5,a.last)?Date.now()-a.last.getTime()<n?(a.last=new Date,[4,user_collection_1.Users.updateOne({_id:a._id},{$set:{last:a.last}})]):[3,2]:[3,3];case 1:return e.sent(),i({data:null,error:"Attempt Too Soon"}),[2];case 2:return[3,4];case 3:a.last=new Date,e.label=4;case 4:return 5<=a.attempts?i({data:null,error:"Too Many Attempts"}):a.salt?pbkdf2(t,a.salt,{iterations:25e3,keylen:512,digestAlgorithm:"sha256"},function(n,t){return __awaiter(o,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return n?[2,r(n)]:scmp(t,Buffer.from(a.hash,"hex"))?(a.last=new Date,a.attempts=0,[4,user_collection_1.Users.updateOne({_id:a._id},{$set:{last:a.last,attempts:a.attempts}})]):[3,2];case 1:return e.sent(),i({data:a,error:""}),[3,4];case 2:return a.last=new Date,a.attempts=a.attempts+1,[4,user_collection_1.Users.updateOne({_id:a._id},{$set:{last:a.last,attempts:a.attempts}})];case 3:e.sent(),5<=a.attempts?i({data:null,error:"Too Many Attempts"}):i({data:null,error:"Invalid Username And Password"}),e.label=4;case 4:return[2]}})})}):i({data:null,error:"No Salt Value Stored"}),[2]}})})})},MongoManagerUserCollection.prototype.serializeUser=function(){return function(e,n){n(null,e.username)}},MongoManagerUserCollection.prototype.deserializeUser=function(){return function(e,n){user_collection_1.Users.findOne({username:e}).then(function(e){n(null,e)},function(e){n(e,null)})}},MongoManagerUserCollection.prototype.setPassword=function(r,a){var e=this;return new Promise(function(o,i){return __awaiter(e,void 0,void 0,function(){var n,t;return __generator(this,function(e){switch(e.label){case 0:return r?[3,1]:(i("No User"),[3,5]);case 1:return a?[3,2]:(i("No Password"),[3,5]);case 2:return[4,randomBytes(32)];case 3:return n=e.sent(),n=n.toString("hex"),[4,pbkdf2Promisified(a,n,{iterations:25e3,keylen:512,digestAlgorithm:"sha256"})];case 4:t=e.sent(),t=Buffer.from(t,"binary").toString("hex"),user_collection_1.Users.updateOne({_id:r._id},{$set:{hash:t,salt:n,services:{},attempts:0}}).then(function(e){return o(e)},function(e){return i(e)}),e.label=5;case 5:return[2]}})})})},MongoManagerUserCollection.prototype.changePassword=function(i,r,a){var e=this;return new Promise(function(t,o){return __awaiter(e,void 0,void 0,function(){var n;return __generator(this,function(e){switch(e.label){case 0:return i?[3,1]:(o("Missing User"),[3,4]);case 1:return r&&a?[3,2]:(o("Missing Password"),[3,4]);case 2:return[4,this.authenticate(i,r)];case 3:(n=e.sent()).data?this.setPassword(i,a).then(function(e){return t(e)},function(e){return o(e)}):o(n.error),e.label=4;case 4:return[2]}})})})},MongoManagerUserCollection.prototype.register=function(o,i){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return o.username?[3,1]:(t("Missing Username"),[3,5]);case 1:return[4,user_collection_1.Users.findOne({username:o.username})];case 2:return e.sent()?(t("Username Exists"),[3,5]):[3,3];case 3:return[4,user_collection_1.Users.findOne({email:o.email})];case 4:e.sent()?t("Email Exists"):(o.setPassword(i),n(o)),e.label=5;case 5:return[2]}})})})},MongoManagerUserCollection.prototype.resetAttempts=function(e){return user_collection_1.Users.updateOne({_id:e._id},{$set:{attempts:0}})},MongoManagerUserCollection}(exports.MongoManagerCollection=MongoManagerCollection);function objectIdHexString(){return(new mongodb_1.ObjectId).toHexString()}function pbkdf2(e,n,t,o){crypto.pbkdf2(e,n,t.iterations,t.keylen,t.digestAlgorithm,o)}function pbkdf2Promisified(e,n,i){return new Promise(function(t,o){return pbkdf2(e,n,i,function(e,n){return e?o(e):t(n)})})}function randomBytes(e){return new Promise(function(t,o){return crypto.randomBytes(e,function(e,n){return e?o(e):t(n)})})}function objectContainsPropertyDeep(e,n){var t=Object.keys(e);if(t.some(function(e){return e===n}))return!0;for(var o=0;o<t.length;o++){var i=t[o];if(e[i]&&"object"==typeof e[i]&&objectContainsPropertyDeep(e[i],n))return!0}return!1}exports.MongoManagerUserCollection=MongoManagerUserCollection,exports.objectIdHexString=objectIdHexString;
2
2
  //# sourceMappingURL=mongo.manager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","log_collection_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","sift_1","MongoManager","serverConfig","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","initServerCollections","setupChangeStream","prototype","_heapLimit","ResolveIOServer","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","_this","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","Promise","resolve","setTimeout","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","finish","addToCache","findOne","executeFindOne","aggregate","pipeline","__spreadArray","__read","flatMap","stage","$lookup","from","executeAggregate","countDocuments","executeCountDocuments","functionName","args","keyString","createHash","update","digest","cachedData","parse","dateReviver","error","del","data","getBinarySize","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","console","log","invalidateQueryCache","collectionCacheMap","includes","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","changeStream","watch","$match","$and","ns.coll","$nin","$not","on","change","__awaiter","coll","err","Date","close","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","setInterval","getMainServer","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","bulkOps","logs","modifiedIds","Set","additionalFilters","fieldNamesSet","opIndex","op","opType","Object","doc","document","objectIdHexString","__v","date","createdAt","updatedAt","validation","newContext","validate","Error","concat","validationErrors","insertOne","id_document","payload","method","id_user","user","messageId","route","add","$set","$inc","upsert","$setOnInsert","modifier","replacement","isSingle","extractFieldNames","isUpdateMany","insertMany","isDeleteMany","combinedFilter","$or","map","item","projection_1","forEach","field","projection","docs","_h","docs_1","docs_1_1","e_4","additionalFilters_1","additionalFilters_1_1","mainResult","size","modifiedIdsArray","Array","$in","$addFields","$project","$merge","into","whenMatched","whenNotMatched","versionDeleteOps","docId","deleteMany","$lte","$subtract","$toInt","ordered","expandedLogs","logs_1","logs_1_1","e_6","_b","_c","Logs","err_1","prefix","startsWith","isArray","subFilter","fullPath","estimatedDocumentCount","monitor_2","err_2","create","f_docs","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_3","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_4","i","versionDoc","replaceOne","$lt","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","getMethodManager","callMethodInternal","call","findOneAndUpdate","indexExists","bypassMonitor","validationResults","validDocs","idx","hasOwnProperty","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","bypassVersions","$unset","objectContainsPropertyDeep","updateOne","monitor_13","monitor_14","monitor_15","ok","monitor_16","watchCollection","queue","task","callback","dbCollection","apply","code","err_5","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"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","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions, ChangeStreamDocument } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\nimport sift from 'sift';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheMap: { collections: string[], key: string }[] = [];\n\tprivate _operationInProgress: Map<string, { promise: Promise<any>, invalidatedDuringExecution: boolean }> = new Map();\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\n\tprivate _serverConfig = null;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor(serverConfig) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });\n\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\t\tthis.setCacheLimit();\n\n\t\tthis.initServerCollections();\n\n\t\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tprivate setCacheLimit() {\n\t\tif (this._isWorkersEnabled) {\n\t\t\tthis._heapLimit = this._isWorkerInstance ? this._heapSize * 0.8 : this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3;\n\t\t}\n\t}\n\n\tasync initServerCollections() {\n\t\tlet collections = await ResolveIOServer.getMainDB().listCollections().toArray();\n\t\tthis._serverCollections = collections;\n\t}\n\n\tgetServerCollections() {\n\t\treturn this._serverCollections;\n\t}\n\n\tregisterCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tif (\n\t\t\tcollection.collectionOptions &&\n\t\t\tcollection.collectionOptions.timeseries &&\n\t\t\tcollection.collectionOptions.timeseries.timeField &&\n\t\t\tthis._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')\n\t\t) {\n\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t.dropCollection(collection.collectionName)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.createCollection(collection);\n\t\t\t\t});\n\t\t}\n\n\t\tthis._collections.push(collection);\n\t}\n\n\tcreateCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tResolveIOServer.getMainDB().createCollection<CollectionDocument>(collection.collectionName, collection.collectionOptions);\n\t}\n\n\tcollections() {\n\t\treturn this._collections;\n\t}\n\n\tcollection(collectionName: string): MongoManagerCollection<CollectionDocument> | MongoManagerUserCollection<CollectionDocument> {\n\t\treturn this._collections.find(a => a.collectionName === collectionName);\n\t}\n\n\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tpublic async find<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T[]> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFind<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// FindOne Operation\n\tpublic async findOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFindOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.findOne(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Aggregate Operation\n\tpublic async aggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions?: AggregateOptions\n\t): Promise<any[]> {\n\t\tconst collections = [collectionName, ...pipeline.flatMap(stage => stage.$lookup?.from ? [stage.$lookup.from] : [])];\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeAggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions: AggregateOptions | undefined,\n\t\tcacheKey: string,\n\t\tcollections: string[]\n\t): Promise<any[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\tmonitor.finish();\n\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache(collections, cacheKey, result);\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n\tpublic async countDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions\n\t): Promise<number> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeCountDocuments<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeCountDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: CountDocumentsOptions,\n\t\tcacheKey: string\n\t): Promise<number> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.countDocuments(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Cache and Invalidation Setup\n\tprivate generateCacheKey(collections: string[], functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collections, functionName, args });\n\t\treturn crypto.createHash('sha256').update(keyString).digest('hex');\n\t}\n\n\tprivate getFromCache(cacheKey: string): any | undefined {\n\t\ttry {\n\t\t\tconst cachedData = this._nodeCache.get(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\treturn JSON.parse(cachedData, dateReviver);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collections: string[], cacheKey: string, data: any) {\n\t\tif (getBinarySize(JSON.stringify(data)) < 1000000) {\n\t\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\tlet deleteCount = 0;\n\t\t\t\tconst keys = this._nodeCache.keys();\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tthis._nodeCache.del(key);\n\t\t\t\t\tdeleteCount += 1;\n\n\t\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t\t}\n\t\t\t\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\t\t\tthis._cacheMap.push({ collections, key: cacheKey });\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tconst collectionCacheMap = this._cacheMap.filter(a => a.collections.includes(collection));\n\n\t\tfor (const cacheMap of collectionCacheMap) {\n\t\t\tthis._nodeCache.del(cacheMap.key);\n\t\t\t\n\t\t\tif (this._operationInProgress.has(cacheMap.key)) {\n\t\t\t\tthis._operationInProgress.get(cacheMap.key).invalidatedDuringExecution = true;\n\t\t\t}\n\t\t}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => !a.collections.includes(collection));\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMainDB();\n\n\t\tconst pipeline = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$and: [\n\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst changeStream = db.watch(pipeline);\n\n\t\tchangeStream.on('change', async (change: ChangeStreamDocument) => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\t\t\t\tif (this.collection(collectionName)) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchangeStream.on('error', err => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream error. Restart...');\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream closed. Restarting...');\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\t}\n}\n\nexport class MongoManagerModel<T extends CollectionDocument> {\n\tcollection_main: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\tcollection_version: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tif (options.collectionName === 'users') {\n\t\t\tthis.collection_main = new MongoManagerUserCollection<T>(options);\n\t\t}\n\t\telse {\n\t\t\tthis.collection_main = new MongoManagerCollection<T>(options);\n\t\t}\n\n\t\tif (options.useVersionCollection) {\n\t\t\tthis.collection_main.useVersions = true;\n\t\t\t\n\t\t\tlet versionSchema = deepCopy(options.schema);\n\t\t\tversionSchema._id.type = 'Object';\n\t\t\tversionSchema._id.blackbox = true;\n\n\t\t\tlet versionOptions: MongoManagerCollectionOptions = {\n\t\t\t\tcollectionName: options.collectionName + '.versions',\n\t\t\t\tschema: versionSchema,\n\t\t\t\tuseVersionCollection: false,\n\t\t\t\tuseReportBuilder: false,\n\t\t\t\treportBuilderLookupTables: [],\n\t\t\t\ttimestamps: true,\n\t\t\t\tcreateLogs: false,\n\t\t\t\tcheckSchema: false,\n\t\t\t\tcollectionOptions: null\n\t\t\t};\n\n\t\t\tif (options.collectionName === 'users') {\t\n\t\t\t\tthis.collection_version = new MongoManagerUserCollection<T>(versionOptions);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.collection_version = new MongoManagerCollection<T>(versionOptions);\n\t\t\t}\n\n\t\t\tthis.collection_version.createIndex({'_id._id': 1, '_id.__v': 1});\n\t\t\tthis.collection_main.versionCollection = options.collectionName + '.versions';\n\t\t}\n\t}\n}\n\nexport interface MongoManagerCollectionOptions {\n\tcollectionName: string;\n\tschema: object;\n\tuseVersionCollection: boolean;\n\tuseReportBuilder: boolean;\n\treportBuilderLookupTables: LookupTables[]\n\ttimestamps: boolean;\n\tcreateLogs: boolean;\n\tcheckSchema: boolean;\n\tcollectionOptions: CreateCollectionOptions;\n}\n\nexport class MongoManagerCollection<T extends CollectionDocument> {\n\tcollectionName = '';\n\tcheckSchema = false;\n\tsimplschema = null;\n\trbSchema = null;\n\ttimestamps = false;\n\tuseVersions = false;\n\tversionCollection = '';\n\tcreateLogs = true;\n\tuseRB = false;\n\tcollectionOptions: CreateCollectionOptions;\n\t\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tthis.collectionName = options.collectionName;\n\t\tthis.simplschema = new SimpleSchema(options.schema);\n\t\tthis.timestamps = options.timestamps;\n\t\tthis.createLogs = options.createLogs;\n\t\tthis.checkSchema = options.checkSchema;\n\t\tthis.collectionOptions = options.collectionOptions;\n\n\t\tif (options.useReportBuilder) {\n\t\t\tthis.useRB = true;\n\t\t\tlet schemaCopy = deepCopy(options.schema);\n\t\t\tlet rbSchema = buildRbLookups(options.reportBuilderLookupTables, schemaCopy, []);\n\t\t\tthis.rbSchema = buildRbSchema(rbSchema);\n\t\t}\n\n\t\tlet interval = setInterval(() => {\n\t\t\tif (ResolveIOServer && ResolveIOServer.getMainServer() && ResolveIOServer.getMongoManager() && ResolveIOServer.getMongoManager().getServerCollections().length) {\n\t\t\t\tResolveIOServer.getMongoManager().registerCollection(this);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1);\n\t}\n\n\tprivate static indexQueue = async.queue(async (task, callback) => {\n\t\tconst { action, collection, specs, options } = task;\n\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n\t\n\t\tif (!dbCollection) {\n\t\t\treturn callback(new Error(`Collection ${collection.collectionName} not found`));\n\t\t}\n\t\n\t\tlet monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\t\n\t\ttry {\n\t\t\t// Try creating the index, will auto-skip if already checked in createIndex/createIndexes\n\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\tmonitor.finish();\n\t\t\tcallback(null, result);\n\t\t} catch (err) {\n\t\t\t// Handle any specific errors related to index creation\n\t\t\tif (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existingIndexName = collection.extractIndexNameFromError(err.message);\n\t\t\t\t\tif (existingIndexName) {\n\t\t\t\t\t\tawait dbCollection.dropIndex(existingIndexName);\n\t\t\t\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tcallback(null, result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (innerError) {\n\t\t\t\t\tcallback(innerError);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonitor.finish();\n\t\t\tcallback(err);\n\t\t}\n\t}, 1);\n\n // Method to extract index name from error message\n extractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tasync bulkWrite(\n\t\toperations: any[],\n\t\toptions?: BulkWriteOptions,\n\t\tbypassLogs = false,\n\t\tbypassCheckSchema = false\n\t): Promise<BulkWriteResult> {\n\t\tif (!operations.length) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tconst bulkOps = [];\n\t\tconst logs = [];\n\t\tconst modifiedIds = new Set<string>();\n\t\n\t\tconst additionalFilters = [];\n\t\tconst fieldNamesSet = new Set<string>();\n\t\n\t\tfor (let opIndex = 0; opIndex < operations.length; opIndex++) {\n\t\t\tconst op = operations[opIndex];\n\t\t\tconst opType = Object.keys(op)[0];\n\t\t\tconst doc = op[opType];\n\t\n\t\t\tif (opType === 'insertOne') {\n\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t}\n\t\t\t\tif (this.useVersions && doc.document.__v === undefined) {\n\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t}\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tconst date = new Date();\n\t\t\t\t\tdoc.document.createdAt = doc.document.createdAt || date;\n\t\t\t\t\tdoc.document.updatedAt = doc.document.updatedAt || date;\n\t\t\t\t}\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tif (!validation.validate(doc.document)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for insertOne: ${JSON.stringify(validation.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tmodifiedIds.add(doc.document._id);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'updateOne' || opType === 'replaceOne') {\n\t\t\t\tif (opType === 'updateOne') {\n\t\t\t\t\tif (!doc.update.$set) doc.update.$set = {};\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!doc.update.$inc) doc.update.$inc = {};\n\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\tif (!doc.update.$setOnInsert) doc.update.$setOnInsert = {};\n\t\t\t\t\t\tif (!doc.update.$setOnInsert._id) doc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\tif (!validation.validate(doc.update, { modifier: true })) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Schema validation failed for updateOne: ${JSON.stringify(validation.validationErrors())}`\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\telse if (opType === 'replaceOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t\tif (doc.upsert && !doc.replacement.createdAt) {\n\t\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tdoc.replacement.__v = doc.replacement.__v !== undefined ? doc.replacement.__v + 1 : 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\tif (!validation.validate(doc.replacement)) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Schema validation failed for replaceOne: ${JSON.stringify(validation.validationErrors())}`\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\tbulkOps.push(op);\n\t\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlet id_document = '';\n\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\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\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isSingle: true });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: id_document,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (doc.filter && doc.filter._id && this.useVersions) {\n\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.useVersions) {\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isSingle: true });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'updateMany') {\n\t\t\t\tif (!doc.update.$set) doc.update.$set = {};\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t}\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tif (!doc.update.$inc) doc.update.$inc = {};\n\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t}\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tif (!validation.validate(doc.update, { modifier: true })) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for updateMany: ${JSON.stringify(validation.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isUpdateMany: true });\n\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertMany: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isUpdateMany: true });\n\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlet id_document = '';\n\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\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\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isDeleteMany: opType === 'deleteMany' });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: id_document,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isDeleteMany: opType === 'deleteMany' });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t}\n\t\t}\n\t\n\t\ttry {\n\t\t\tif (additionalFilters.length) {\n\t\t\t\tconst combinedFilter = {\n\t\t\t\t\t$or: additionalFilters.map(item => item.filter)\n\t\t\t\t};\n\t\n\t\t\t\tconst projection: any = { _id: 1 };\n\t\t\t\tfieldNamesSet.forEach(field => {\n\t\t\t\t\tprojection[field] = 1;\n\t\t\t\t});\n\t\n\t\t\t\tconst cursor = ResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.find(combinedFilter, { projection });\n\t\n\t\t\t\tconst docs = await cursor.toArray();\n\t\n\t\t\t\tfor (const doc of docs) {\n\t\t\t\t\tfor (const item of additionalFilters) {\n\t\t\t\t\t\tif (sift(item.filter)(doc)) {\n\t\t\t\t\t\t\tif (item.opIndex !== null) {\n\t\t\t\t\t\t\t\tif (item.isUpdateMany || item.isDeleteMany) {\n\t\t\t\t\t\t\t\t\tif (!logs[item.opIndex].insertMany) {\n\t\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertMany = [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertMany.push({\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([operations[item.opIndex], options])) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify([operations[item.opIndex], options], 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\t\tmethod: operations[item.opIndex] ? Object.keys(operations[item.opIndex])[0] : '',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (item.isSingle) {\n\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertOne.document.id_document = doc._id;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tmodifiedIds.add(<string>doc._id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tconst mainResult = await ResolveIOServer.getMainDB()\n\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t.bulkWrite(bulkOps, options);\n\t\n\t\t\tif (this.useVersions && modifiedIds.size > 0) {\n\t\t\t\tconst modifiedIdsArray = Array.from(modifiedIds);\n\t\n\t\t\t\tawait ResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.aggregate([\n\t\t\t\t\t\t{ $match: { _id: { $in: modifiedIdsArray } } },\n\t\t\t\t\t\t{ $addFields: { '_id': { _id: '$_id', __v: '$__v' } } },\n\t\t\t\t\t\t{ $project: { '__v': 0 } },\n\t\t\t\t\t\t{ $merge: { into: this.versionCollection, whenMatched: 'insert', whenNotMatched: 'insert' } }\n\t\t\t\t\t])\n\t\t\t\t\t.toArray();\n\t\n\t\t\t\tconst versionDeleteOps = modifiedIdsArray.map(docId => ({\n\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t'_id._id': docId,\n\t\t\t\t\t\t\t'_id.__v': { $lte: { $subtract: [ { $toInt: '$$CURRENT.__v' }, 5 ] } }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\n\t\t\t\tif (versionDeleteOps.length) {\n\t\t\t\t\tawait ResolveIOServer.getMainDB()\n\t\t\t\t\t\t.collection<T>(this.versionCollection)\n\t\t\t\t\t\t.bulkWrite(<any>versionDeleteOps, { ordered: false });\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\tconst expandedLogs = [];\n\t\t\t\tfor (const log of logs) {\n\t\t\t\t\tif (log.insertOne) {\n\t\t\t\t\t\texpandedLogs.push(log);\n\t\t\t\t\t}\n\t\t\t\t\telse if (log.insertMany) {\n\t\t\t\t\t\tfor (const doc of log.insertMany) {\n\t\t\t\t\t\t\texpandedLogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: doc\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\t\t\t}\n\t\n\t\t\t\tif (expandedLogs.length) {\n\t\t\t\t\tawait Logs.bulkWrite(expandedLogs, { ordered: false });\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\n\t\t\treturn mainResult;\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Error in bulkWrite:', err);\n\t\t\tthrow err;\n\t\t}\n\t}\n\t\n\t// Helper function to extract field names from filters\n\tprivate extractFieldNames(filter: any, fieldNamesSet: Set<string>, prefix = '') {\n\t\tif (typeof filter !== 'object' || filter == null) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tfor (const key in filter) {\n\t\t\tconst value = filter[key];\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\t// Logical operator ($and, $or, etc.)\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach(subFilter => this.extractFieldNames(subFilter, fieldNamesSet, prefix));\n\t\t\t\t}\n\t\t\t\telse if (typeof value === 'object') {\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst fullPath = prefix ? `${prefix}.${key}` : key;\n\t\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n\t\t\t\t\t// May contain operators like $eq, $gt, etc.\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, fullPath);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcountDocuments(\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions,\n\t\tskipCache = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if the filter is empty\n\t\t\t\tconst isUnfiltered = Object.keys(filter).length === 0;\n\t\n\t\t\t\tif (isUnfiltered) {\n\t\t\t\t\t// Use collection stats for an unfiltered count\n\t\t\t\t\tconst res = await ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).estimatedDocumentCount(options);\n\t\t\t\t\tresolve(res);\n\t\t\t\t}\n\t\t\t\telse if (!skipCache) {\n\t\t\t\t\t// Use cached count if skipCache is false\n\t\t\t\t\tResolveIOServer.getMongoManager().countDocuments(this.collectionName, filter, options).then(\n\t\t\t\t\t\tres => resolve(res),\n\t\t\t\t\t\terr => reject(err)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Fallback to direct countDocuments call with monitoring if skipCache is true\n\t\t\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(\n\t\t\t\t\t\tres => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if index already exists based on the key\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Check if an index with the same key already exists\n\t\t\t\tconst indexExists = existingIndexes.some(index => \n\t\t\t\t\tJSON.stringify(index.key) === JSON.stringify(fieldOrSpec)\n\t\t\t\t);\n\t\n\t\t\t\tif (indexExists) {\n\t\t\t\t\treturn resolve('Index already exists'); // Skip creation if index exists\n\t\t\t\t}\n\t\n\t\t\t\t// If index doesn't exist, push it to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndex',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Filter out indexes that already exist based on the key\n\t\t\t\tconst indexesToCreate = indexSpecs.filter(indexSpec => \n\t\t\t\t\t!existingIndexes.some(existingIndex => \n\t\t\t\t\t\tJSON.stringify(existingIndex.key) === JSON.stringify(indexSpec.key)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\n\t\t\t\t// If no new indexes to create, resolve early\n\t\t\t\tif (indexesToCreate.length === 0) {\n\t\t\t\t\treturn resolve(['All indexes already exist']);\n\t\t\t\t}\n\t\n\t\t\t\t// Push only new indexes to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndexes',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [indexesToCreate],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal;\n\n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tLogs.insertOne({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: ''\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}
1
+ {"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","log_collection_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","sift_1","MongoManager","serverConfig","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","initServerCollections","setupChangeStream","prototype","_heapLimit","ResolveIOServer","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","_this","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","Promise","resolve","setTimeout","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","finish","addToCache","findOne","executeFindOne","aggregate","pipeline","__spreadArray","__read","flatMap","stage","$lookup","from","executeAggregate","countDocuments","executeCountDocuments","functionName","args","keyString","createHash","update","digest","cachedData","parse","dateReviver","error","del","data","getBinarySize","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","console","log","invalidateQueryCache","collectionCacheMap","includes","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","changeStream","watch","$match","$and","ns.coll","$nin","$not","on","change","__awaiter","coll","err","Date","close","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","setInterval","getMainServer","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","bulkOps","logs","modifiedIds","Set","additionalFilters","fieldNamesSet","opIndex","op","opType","Object","doc","document","objectIdHexString","__v","date","createdAt","updatedAt","validation","newContext","validate","Error","concat","validationErrors","insertOne","id_document","payload","method","id_user","user","messageId","route","add","$set","$inc","upsert","$setOnInsert","modifier","replacement","isSingle","extractFieldNames","isUpdateMany","insertMany","isDeleteMany","combinedFilter","$or","map","item","projection_1","forEach","field","projection","docs","_h","docs_1","docs_1_1","e_4","additionalFilters_1","additionalFilters_1_1","mainResult","size","modifiedIdsArray","Array","$in","$addFields","$project","$merge","into","whenMatched","whenNotMatched","versionDeleteOps","docId","deleteMany","$lte","$subtract","$toInt","ordered","expandedLogs","logs_1","logs_1_1","e_6","_b","_c","Logs","err_1","prefix","startsWith","isArray","subFilter","fullPath","estimatedDocumentCount","monitor_2","err_2","create","f_docs","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_3","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_4","i","versionDoc","replaceOne","$lt","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","getMethodManager","callMethodInternal","call","findOneAndUpdate","indexExists","bypassMonitor","validationResults","validDocs","idx","hasOwnProperty","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","bypassVersions","$unset","objectContainsPropertyDeep","updateOne","monitor_13","monitor_14","monitor_15","ok","monitor_16","watchCollection","queue","task","callback","dbCollection","apply","code","err_5","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"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","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions, ChangeStreamDocument } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\nimport sift from 'sift';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheMap: { collections: string[], key: string }[] = [];\n\tprivate _operationInProgress: Map<string, { promise: Promise<any>, invalidatedDuringExecution: boolean }> = new Map();\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\n\tprivate _serverConfig = null;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor(serverConfig) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });\n\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\t\tthis.setCacheLimit();\n\n\t\tthis.initServerCollections();\n\n\t\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tprivate setCacheLimit() {\n\t\tif (this._isWorkersEnabled) {\n\t\t\tthis._heapLimit = this._isWorkerInstance ? this._heapSize * 0.8 : this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3;\n\t\t}\n\t}\n\n\tasync initServerCollections() {\n\t\tlet collections = await ResolveIOServer.getMainDB().listCollections().toArray();\n\t\tthis._serverCollections = collections;\n\t}\n\n\tgetServerCollections() {\n\t\treturn this._serverCollections;\n\t}\n\n\tregisterCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tif (\n\t\t\tcollection.collectionOptions &&\n\t\t\tcollection.collectionOptions.timeseries &&\n\t\t\tcollection.collectionOptions.timeseries.timeField &&\n\t\t\tthis._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')\n\t\t) {\n\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t.dropCollection(collection.collectionName)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.createCollection(collection);\n\t\t\t\t});\n\t\t}\n\n\t\tthis._collections.push(collection);\n\t}\n\n\tcreateCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tResolveIOServer.getMainDB().createCollection<CollectionDocument>(collection.collectionName, collection.collectionOptions);\n\t}\n\n\tcollections() {\n\t\treturn this._collections;\n\t}\n\n\tcollection(collectionName: string): MongoManagerCollection<CollectionDocument> | MongoManagerUserCollection<CollectionDocument> {\n\t\treturn this._collections.find(a => a.collectionName === collectionName);\n\t}\n\n\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tpublic async find<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T[]> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFind<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// FindOne Operation\n\tpublic async findOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFindOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.findOne(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Aggregate Operation\n\tpublic async aggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions?: AggregateOptions\n\t): Promise<any[]> {\n\t\tconst collections = [collectionName, ...pipeline.flatMap(stage => stage.$lookup?.from ? [stage.$lookup.from] : [])];\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeAggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions: AggregateOptions | undefined,\n\t\tcacheKey: string,\n\t\tcollections: string[]\n\t): Promise<any[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\tmonitor.finish();\n\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache(collections, cacheKey, result);\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n\tpublic async countDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions\n\t): Promise<number> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeCountDocuments<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeCountDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: CountDocumentsOptions,\n\t\tcacheKey: string\n\t): Promise<number> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.countDocuments(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Cache and Invalidation Setup\n\tprivate generateCacheKey(collections: string[], functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collections, functionName, args });\n\t\treturn crypto.createHash('sha256').update(keyString).digest('hex');\n\t}\n\n\tprivate getFromCache(cacheKey: string): any | undefined {\n\t\ttry {\n\t\t\tconst cachedData = this._nodeCache.get(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\treturn JSON.parse(cachedData, dateReviver);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collections: string[], cacheKey: string, data: any) {\n\t\tif (getBinarySize(JSON.stringify(data)) < 1000000) {\n\t\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\tlet deleteCount = 0;\n\t\t\t\tconst keys = this._nodeCache.keys();\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tthis._nodeCache.del(key);\n\t\t\t\t\tdeleteCount += 1;\n\n\t\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t\t}\n\t\t\t\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\t\t\tthis._cacheMap.push({ collections, key: cacheKey });\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tconst collectionCacheMap = this._cacheMap.filter(a => a.collections.includes(collection));\n\n\t\tfor (const cacheMap of collectionCacheMap) {\n\t\t\tthis._nodeCache.del(cacheMap.key);\n\t\t\t\n\t\t\tif (this._operationInProgress.has(cacheMap.key)) {\n\t\t\t\tthis._operationInProgress.get(cacheMap.key).invalidatedDuringExecution = true;\n\t\t\t}\n\t\t}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => !a.collections.includes(collection));\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMainDB();\n\n\t\tconst pipeline = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$and: [\n\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst changeStream = db.watch(pipeline);\n\n\t\tchangeStream.on('change', async (change: ChangeStreamDocument) => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\t\t\t\tif (this.collection(collectionName)) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchangeStream.on('error', err => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream error. Restart...');\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream closed. Restarting...');\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\t}\n}\n\nexport class MongoManagerModel<T extends CollectionDocument> {\n\tcollection_main: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\tcollection_version: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tif (options.collectionName === 'users') {\n\t\t\tthis.collection_main = new MongoManagerUserCollection<T>(options);\n\t\t}\n\t\telse {\n\t\t\tthis.collection_main = new MongoManagerCollection<T>(options);\n\t\t}\n\n\t\tif (options.useVersionCollection) {\n\t\t\tthis.collection_main.useVersions = true;\n\t\t\t\n\t\t\tlet versionSchema = deepCopy(options.schema);\n\t\t\tversionSchema._id.type = 'Object';\n\t\t\tversionSchema._id.blackbox = true;\n\n\t\t\tlet versionOptions: MongoManagerCollectionOptions = {\n\t\t\t\tcollectionName: options.collectionName + '.versions',\n\t\t\t\tschema: versionSchema,\n\t\t\t\tuseVersionCollection: false,\n\t\t\t\tuseReportBuilder: false,\n\t\t\t\treportBuilderLookupTables: [],\n\t\t\t\ttimestamps: true,\n\t\t\t\tcreateLogs: false,\n\t\t\t\tcheckSchema: false,\n\t\t\t\tcollectionOptions: null\n\t\t\t};\n\n\t\t\tif (options.collectionName === 'users') {\t\n\t\t\t\tthis.collection_version = new MongoManagerUserCollection<T>(versionOptions);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.collection_version = new MongoManagerCollection<T>(versionOptions);\n\t\t\t}\n\n\t\t\tthis.collection_version.createIndex({'_id._id': 1, '_id.__v': 1});\n\t\t\tthis.collection_main.versionCollection = options.collectionName + '.versions';\n\t\t}\n\t}\n}\n\nexport interface MongoManagerCollectionOptions {\n\tcollectionName: string;\n\tschema: object;\n\tuseVersionCollection: boolean;\n\tuseReportBuilder: boolean;\n\treportBuilderLookupTables: LookupTables[]\n\ttimestamps: boolean;\n\tcreateLogs: boolean;\n\tcheckSchema: boolean;\n\tcollectionOptions: CreateCollectionOptions;\n}\n\nexport class MongoManagerCollection<T extends CollectionDocument> {\n\tcollectionName = '';\n\tcheckSchema = false;\n\tsimplschema = null;\n\trbSchema = null;\n\ttimestamps = false;\n\tuseVersions = false;\n\tversionCollection = '';\n\tcreateLogs = true;\n\tuseRB = false;\n\tcollectionOptions: CreateCollectionOptions;\n\t\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tthis.collectionName = options.collectionName;\n\t\tthis.simplschema = new SimpleSchema(options.schema);\n\t\tthis.timestamps = options.timestamps;\n\t\tthis.createLogs = options.createLogs;\n\t\tthis.checkSchema = options.checkSchema;\n\t\tthis.collectionOptions = options.collectionOptions;\n\n\t\tif (options.useReportBuilder) {\n\t\t\tthis.useRB = true;\n\t\t\tlet schemaCopy = deepCopy(options.schema);\n\t\t\tlet rbSchema = buildRbLookups(options.reportBuilderLookupTables, schemaCopy, []);\n\t\t\tthis.rbSchema = buildRbSchema(rbSchema);\n\t\t}\n\n\t\tlet interval = setInterval(() => {\n\t\t\tif (ResolveIOServer && ResolveIOServer.getMainServer() && ResolveIOServer.getMongoManager() && ResolveIOServer.getMongoManager().getServerCollections().length) {\n\t\t\t\tResolveIOServer.getMongoManager().registerCollection(this);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1);\n\t}\n\n\tprivate static indexQueue = async.queue(async (task, callback) => {\n\t\tconst { action, collection, specs, options } = task;\n\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n\t\n\t\tif (!dbCollection) {\n\t\t\treturn callback(new Error(`Collection ${collection.collectionName} not found`));\n\t\t}\n\t\n\t\tlet monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\t\n\t\ttry {\n\t\t\t// Try creating the index, will auto-skip if already checked in createIndex/createIndexes\n\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\tmonitor.finish();\n\t\t\tcallback(null, result);\n\t\t} catch (err) {\n\t\t\t// Handle any specific errors related to index creation\n\t\t\tif (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existingIndexName = collection.extractIndexNameFromError(err.message);\n\t\t\t\t\tif (existingIndexName) {\n\t\t\t\t\t\tawait dbCollection.dropIndex(existingIndexName);\n\t\t\t\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tcallback(null, result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (innerError) {\n\t\t\t\t\tcallback(innerError);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonitor.finish();\n\t\t\tcallback(err);\n\t\t}\n\t}, 1);\n\n // Method to extract index name from error message\n extractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tasync bulkWrite(\n\t\toperations: any[],\n\t\toptions?: BulkWriteOptions,\n\t\tbypassLogs = false,\n\t\tbypassCheckSchema = false\n\t): Promise<BulkWriteResult> {\n\t\tif (!operations.length) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tconst bulkOps = [];\n\t\tconst logs = [];\n\t\tconst modifiedIds = new Set<string>();\n\t\n\t\tconst additionalFilters = [];\n\t\tconst fieldNamesSet = new Set<string>();\n\t\n\t\tfor (let opIndex = 0; opIndex < operations.length; opIndex++) {\n\t\t\tconst op = operations[opIndex];\n\t\t\tconst opType = Object.keys(op)[0];\n\t\t\tconst doc = op[opType];\n\t\n\t\t\tif (opType === 'insertOne') {\n\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t}\n\t\t\t\tif (this.useVersions && doc.document.__v === undefined) {\n\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t}\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tconst date = new Date();\n\t\t\t\t\tdoc.document.createdAt = doc.document.createdAt || date;\n\t\t\t\t\tdoc.document.updatedAt = doc.document.updatedAt || date;\n\t\t\t\t}\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tif (!validation.validate(doc.document)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for insertOne: ${JSON.stringify(validation.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tmodifiedIds.add(doc.document._id);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'updateOne' || opType === 'replaceOne') {\n\t\t\t\tif (opType === 'updateOne') {\n\t\t\t\t\tif (!doc.update.$set) doc.update.$set = {};\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!doc.update.$inc) doc.update.$inc = {};\n\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\tif (!doc.update.$setOnInsert) doc.update.$setOnInsert = {};\n\t\t\t\t\t\tif (!doc.update.$setOnInsert._id) doc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\tif (!validation.validate(doc.update, { modifier: true })) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Schema validation failed for updateOne: ${JSON.stringify(validation.validationErrors())}`\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\telse if (opType === 'replaceOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t\tif (doc.upsert && !doc.replacement.createdAt) {\n\t\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tdoc.replacement.__v = doc.replacement.__v !== undefined ? doc.replacement.__v + 1 : 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\tif (!validation.validate(doc.replacement)) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Schema validation failed for replaceOne: ${JSON.stringify(validation.validationErrors())}`\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\tbulkOps.push(op);\n\t\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlet id_document = '';\n\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\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\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isSingle: true });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: id_document,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (doc.filter && doc.filter._id && this.useVersions) {\n\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.useVersions) {\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isSingle: true });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'updateMany') {\n\t\t\t\tif (!doc.update.$set) doc.update.$set = {};\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t}\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tif (!doc.update.$inc) doc.update.$inc = {};\n\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t}\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tif (!validation.validate(doc.update, { modifier: true })) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for updateMany: ${JSON.stringify(validation.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isUpdateMany: true });\n\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertMany: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isUpdateMany: true });\n\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlet id_document = '';\n\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\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\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isDeleteMany: opType === 'deleteMany' });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: id_document,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isDeleteMany: opType === 'deleteMany' });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t}\n\t\t}\n\t\n\t\ttry {\n\t\t\tif (additionalFilters.length) {\n\t\t\t\tconst combinedFilter = {\n\t\t\t\t\t$or: additionalFilters.map(item => item.filter)\n\t\t\t\t};\n\t\n\t\t\t\tconst projection: any = { _id: 1 };\n\t\t\t\tfieldNamesSet.forEach(field => {\n\t\t\t\t\tprojection[field] = 1;\n\t\t\t\t});\n\t\n\t\t\t\tconst cursor = ResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.find(combinedFilter, { projection });\n\t\n\t\t\t\tconst docs = await cursor.toArray();\n\t\n\t\t\t\tfor (const doc of docs) {\n\t\t\t\t\tfor (const item of additionalFilters) {\n\t\t\t\t\t\tif (sift(item.filter)(doc)) {\n\t\t\t\t\t\t\tif (item.opIndex !== null) {\n\t\t\t\t\t\t\t\tif (item.isUpdateMany || item.isDeleteMany) {\n\t\t\t\t\t\t\t\t\tif (!logs[item.opIndex].insertMany) {\n\t\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertMany = [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertMany.push({\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([operations[item.opIndex], options])) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify([operations[item.opIndex], options], 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\t\tmethod: operations[item.opIndex] ? Object.keys(operations[item.opIndex])[0] : '',\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (item.isSingle) {\n\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertOne.document.id_document = doc._id;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tmodifiedIds.add(<string>doc._id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tconst mainResult = await ResolveIOServer.getMainDB()\n\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t.bulkWrite(bulkOps, options);\n\t\n\t\t\tif (this.useVersions && modifiedIds.size > 0) {\n\t\t\t\tconst modifiedIdsArray = Array.from(modifiedIds);\n\t\n\t\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.aggregate([\n\t\t\t\t\t\t{ $match: { _id: { $in: modifiedIdsArray } } },\n\t\t\t\t\t\t{ $addFields: { '_id': { _id: '$_id', __v: '$__v' } } },\n\t\t\t\t\t\t{ $project: { '__v': 0 } },\n\t\t\t\t\t\t{ $merge: { into: this.versionCollection, whenMatched: 'insert', whenNotMatched: 'insert' } }\n\t\t\t\t\t])\n\t\t\t\t\t.toArray();\n\t\n\t\t\t\tconst versionDeleteOps = modifiedIdsArray.map(docId => ({\n\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t'_id._id': docId,\n\t\t\t\t\t\t\t'_id.__v': { $lte: { $subtract: [ { $toInt: '$$CURRENT.__v' }, 5 ] } }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\n\t\t\t\tif (versionDeleteOps.length) {\n\t\t\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t\t\t.collection<T>(this.versionCollection)\n\t\t\t\t\t\t.bulkWrite(<any>versionDeleteOps, { ordered: false });\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\tconst expandedLogs = [];\n\t\t\t\tfor (const log of logs) {\n\t\t\t\t\tif (log.insertOne) {\n\t\t\t\t\t\texpandedLogs.push(log);\n\t\t\t\t\t}\n\t\t\t\t\telse if (log.insertMany) {\n\t\t\t\t\t\tfor (const doc of log.insertMany) {\n\t\t\t\t\t\t\texpandedLogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: doc\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\t\t\t}\n\t\n\t\t\t\tif (expandedLogs.length) {\n\t\t\t\t\tLogs.bulkWrite(expandedLogs, { ordered: false });\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\n\t\t\treturn mainResult;\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Error in bulkWrite:', err);\n\t\t\tthrow err;\n\t\t}\n\t}\n\t\n\t// Helper function to extract field names from filters\n\tprivate extractFieldNames(filter: any, fieldNamesSet: Set<string>, prefix = '') {\n\t\tif (typeof filter !== 'object' || filter == null) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tfor (const key in filter) {\n\t\t\tconst value = filter[key];\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\t// Logical operator ($and, $or, etc.)\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach(subFilter => this.extractFieldNames(subFilter, fieldNamesSet, prefix));\n\t\t\t\t}\n\t\t\t\telse if (typeof value === 'object') {\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst fullPath = prefix ? `${prefix}.${key}` : key;\n\t\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n\t\t\t\t\t// May contain operators like $eq, $gt, etc.\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, fullPath);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcountDocuments(\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions,\n\t\tskipCache = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if the filter is empty\n\t\t\t\tconst isUnfiltered = Object.keys(filter).length === 0;\n\t\n\t\t\t\tif (isUnfiltered) {\n\t\t\t\t\t// Use collection stats for an unfiltered count\n\t\t\t\t\tconst res = await ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).estimatedDocumentCount(options);\n\t\t\t\t\tresolve(res);\n\t\t\t\t}\n\t\t\t\telse if (!skipCache) {\n\t\t\t\t\t// Use cached count if skipCache is false\n\t\t\t\t\tResolveIOServer.getMongoManager().countDocuments(this.collectionName, filter, options).then(\n\t\t\t\t\t\tres => resolve(res),\n\t\t\t\t\t\terr => reject(err)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Fallback to direct countDocuments call with monitoring if skipCache is true\n\t\t\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(\n\t\t\t\t\t\tres => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if index already exists based on the key\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Check if an index with the same key already exists\n\t\t\t\tconst indexExists = existingIndexes.some(index => \n\t\t\t\t\tJSON.stringify(index.key) === JSON.stringify(fieldOrSpec)\n\t\t\t\t);\n\t\n\t\t\t\tif (indexExists) {\n\t\t\t\t\treturn resolve('Index already exists'); // Skip creation if index exists\n\t\t\t\t}\n\t\n\t\t\t\t// If index doesn't exist, push it to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndex',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Filter out indexes that already exist based on the key\n\t\t\t\tconst indexesToCreate = indexSpecs.filter(indexSpec => \n\t\t\t\t\t!existingIndexes.some(existingIndex => \n\t\t\t\t\t\tJSON.stringify(existingIndex.key) === JSON.stringify(indexSpec.key)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\n\t\t\t\t// If no new indexes to create, resolve early\n\t\t\t\tif (indexesToCreate.length === 0) {\n\t\t\t\t\treturn resolve(['All indexes already exist']);\n\t\t\t\t}\n\t\n\t\t\t\t// Push only new indexes to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndexes',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [indexesToCreate],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal;\n\n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tLogs.insertOne({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: ''\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "20.4.58",
3
+ "version": "20.4.59",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",