@resolveio/server-lib 20.2.8 → 20.2.9
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 o=function(e,n){return(o=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,n){e.__proto__=n}:function(e,n){for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}))(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}o(e,n),e.prototype=null===n?Object.create(n):(__.prototype=n.prototype,new __)}}(),__awaiter=this&&this.__awaiter||function(e,t,i,r){return new(i=i||Promise)(function(o,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?o(e.value):((n=e.value)instanceof i?n:new i(function(e){e(n)})).then(fulfilled,rejected)}step((r=r.apply(e,t||[])).next())})},__generator=this&&this.__generator||function(t,i){var r,c,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},s={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function verb(o){return function(e){var n=[o,e];if(r)throw new TypeError("Generator is already executing.");for(;l=s&&n[s=0]?0:l;)try{if(r=1,c&&(a=2&n[0]?c.return:n[0]?c.throw||((a=c.return)&&a.call(c),0):c.next)&&!(a=a.call(c,n[1])).done)return a;switch(c=0,(n=a?[2&n[0],a.value]:n)[0]){case 0:case 1:a=n;break;case 4:return l.label++,{value:n[1],done:!1};case 5:l.label++,c=n[1],n=[0];continue;case 7:n=l.ops.pop(),l.trys.pop();continue;default:if(!(a=0<(a=l.trys).length&&a[a.length-1])&&(6===n[0]||2===n[0])){l=0;continue}if(3===n[0]&&(!a||n[1]>a[0]&&n[1]<a[3]))l.label=n[1];else if(6===n[0]&&l.label<a[1])l.label=a[1],a=n;else{if(!(a&&l.label<a[2])){a[2]&&l.ops.pop(),l.trys.pop();continue}l.label=a[2],l.ops.push(n)}}n=i.call(t,l)}catch(e){n=[6,e],c=0}finally{r=a=0}if(5&n[0])throw n[1];return{value:n[0]?n[1]:void 0,done:!0}}}},__spreadArray=this&&this.__spreadArray||function(e,n,o){if(o||2===arguments.length)for(var t,i=0,r=n.length;i<r;i++)!t&&i in n||((t=t||Array.prototype.slice.call(n,0,i))[i]=n[i]);return e.concat(t||Array.prototype.slice.call(n))},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"),MongoManager=function(){function MongoManager(){var e=this;this._collections=[],this._mongoQueue=[],this._mongoQueueId=0,this._mongoQueueRunning=!1,this._mongoQueueCacheId=1,this._heapStats=v8.getHeapStatistics(),this._heapLimit=this._heapStats.heap_size_limit/numCPUs/8,this._serverCollections=[],this._debugMongoQueueHits=0,this._debugRemoveCacheHits=0,this._debugMongoQueueCollections=[],this._nodeCache=new NodeCache({stdTTL:0,checkperiod:0}),setInterval(function(){index_1.ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()&&(console.log(new Date,"Mongo Manager","Collections",e._collections.length),console.log(new Date,"Mongo Manager","Mongo Queue",e._mongoQueue.length,JSON.stringify(e._mongoQueue.sort(function(e,n){return e.name_collection.localeCompare(n.name_collection)}),null,2)),console.log(new Date,"Mongo Manager","Server Collections",e._serverCollections.length),console.log(new Date,"Mongo Manager","Mongo Queue Hits",e._debugMongoQueueHits),console.log(new Date,"Mongo Manager","Mongo Queue Collections",e._debugMongoQueueCollections.sort(function(e,n){return e.collection.localeCompare(n.collection)||e.function.localeCompare(n.function)})),console.log(new Date,"Mongo Manager","Cache Cleanup Hits",JSON.stringify(e._debugRemoveCacheHits,null,2))),e._debugMongoQueueHits=0,e._debugRemoveCacheHits=0,e._debugMongoQueueCollections=[]},6e4),this.initServerCollections(),this.runQueue()}return 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.filter(function(e){return e.collectionName===n})[0]},MongoManager.prototype.addToQueue=function(n){var e=this._mongoQueue.filter(function(e){return e.name_collection===n.name_collection&&e.name_function===n.name_function&&e.name_function_addt===n.name_function_addt&&JSON.stringify(e.data_function)===JSON.stringify(n.data_function)&&JSON.stringify(e.data_function_addt)===JSON.stringify(n.data_function_addt)})[0];e?(e.running?e.cbs_next:e.cbs).push(n.cbs[0]):(n._id=this._mongoQueueId,this._mongoQueueId+=1,this._mongoQueue.splice(0,0,n))},MongoManager.prototype.runQueue=function(){return __awaiter(this,void 0,void 0,function(){var c=this;return __generator(this,function(e){return setInterval(function(){if(!c._mongoQueueRunning){var o=c._mongoQueue.filter(function(e){return!e.running&&e.cbs.length});if(o.length){c._mongoQueueRunning=!0;for(var e=o.length-1;0<=e;e--)!function(e){c._debugMongoQueueHits+=1;var t,i,r=o[e];if(c._debugMongoQueueCollections.some(function(e){return e.collection===r.name_collection&&e.function===r.name_function})?c._debugMongoQueueCollections.filter(function(e){return e.collection===r.name_collection&&e.function===r.name_function})[0].hits+=1:c._debugMongoQueueCollections.push({collection:r.name_collection,function:r.name_function,hits:1}),r.running=!0,r.invalidateFlag=!1,r.cacheId)try{var n=JSON.parse(c._nodeCache.get(r.cacheId),common_1.dateReviver);r.cbs.forEach(function(e){e(null,n,!0)}),r.cbs=[],r.running=!1}catch(e){r.cacheId=0}r.cacheId||(r.name_function_addt?(t=new monitor_manager_1.MonitorMongo(r.name_function,r.name_collection,JSON.stringify(__spreadArray(__spreadArray(__spreadArray([],r.data_function,!0),[r.name_function_addt],!1),r.data_function_addt,!0))),(e=(e=index_1.ResolveIOServer.getMainDB().collection(r.name_collection))[r.name_function].apply(e,r.data_function))[r.name_function_addt].apply(e,r.data_function_addt).then(function(n){if(t.finish(),r.invalidateFlag)5<=r.invalidateCount&&(r.invalidateCount=0,r.cbs.forEach(function(e){e(null,n,!1)})),r.cbs=r.cbs.concat(r.cbs_next),r.cbs_next=[];else{var e=r.invalidateCount=0,o=!1;try{e=JSON.stringify(n).replace(/[\[\]\,\"]/g,"").length}catch(e){o=!0}!o&&null!=n&&(!Array.isArray(n)||n.length)&&e<1e7?(r.cacheId=c._mongoQueueCacheId,c._mongoQueueCacheId+=1,c.addToCache(r.cacheId,n)):r.cacheId=0,r.cbs.forEach(function(e){e(null,n,!1)}),r.cbs_next.length?(r.cbs=r.cbs_next,r.cbs_next=[]):r.cbs=[]}r.running=!1},function(n){t.finish(),r.cbs.forEach(function(e){e(n,null,!1)}),r.cbs_next.forEach(function(e){e(n,null,!1)}),0<=c._mongoQueue.map(function(e){return e._id}).indexOf(r._id)&&c._mongoQueue.splice(c._mongoQueue.map(function(e){return e._id}).indexOf(r._id),1)})):(i=new monitor_manager_1.MonitorMongo(r.name_function,r.name_collection,JSON.stringify(r.data_function)),(e=index_1.ResolveIOServer.getMainDB().collection(r.name_collection))[r.name_function].apply(e,r.data_function).then(function(n){if(i.finish(),r.invalidateFlag)5<=r.invalidateCount&&(r.invalidateCount=0,r.cbs.forEach(function(e){e(null,n,!1)})),r.cbs=r.cbs.concat(r.cbs_next),r.cbs_next=[];else{var e=r.invalidateCount=0,o=!1;try{e=JSON.stringify(n).replace(/[\[\]\,\"]/g,"").length}catch(e){o=!0}!o&&null!=n&&(!Array.isArray(n)||n.length)&&e<1e7?(r.cacheId=c._mongoQueueCacheId,c._mongoQueueCacheId+=1,c.addToCache(r.cacheId,n)):r.cacheId=0,r.cbs.forEach(function(e){e(null,n,!1)}),r.cbs_next.length?(r.cbs=r.cbs_next,r.cbs_next=[]):r.cbs=[]}r.running=!1},function(n){i.finish(),console.log.apply(console,__spreadArray(__spreadArray([new Date,"Error "+r.name_function,r.name_collection],r.data_function,!1),[n],!1)),r.cbs.forEach(function(e){e(n,null,!1)}),r.cbs_next.forEach(function(e){e(n,null,!1)}),0<=c._mongoQueue.map(function(e){return e._id}).indexOf(r._id)&&c._mongoQueue.splice(c._mongoQueue.map(function(e){return e._id}).indexOf(r._id),1)})))}(e);c._mongoQueueRunning=!1}}},25),[2]})})},MongoManager.prototype.addToCache=function(e,n){var o=this._nodeCache.getStats().vsize;if(o>this._heapLimit){for(var t=0,i=this._mongoQueue.filter(function(e){return e.cacheId&&!e.running&&!e.cbs.length}),r=i.length-1;0<=r;r--){this._debugRemoveCacheHits+=1;var c=i[r];if(this._nodeCache.del(c.cacheId),(c.cacheId=0)<=this._mongoQueue.map(function(e){return e._id}).indexOf(c._id)&&this._mongoQueue.splice(this._mongoQueue.map(function(e){return e._id}).indexOf(c._id),1),t+=1,(o=this._nodeCache.getStats().vsize)<.75*this._heapLimit)break}console.log("Query Cache: Too Big, - Deleted: "+t+" - "+o)}this._nodeCache.set(e,JSON.stringify(n))},MongoManager.prototype.invalidateQueryCache=function(n){for(var e=this._mongoQueue.filter(function(e){return e.name_collection===n||e.lookup_collections.includes(n)}),o=e.length-1;0<=o;o--){var t=e[o];t.cacheId&&(this._nodeCache.del(t.cacheId),t.cacheId=0),t.running?(t.invalidateFlag=!0,t.invalidateCount+=1):t.cbs.length||0<=this._mongoQueue.map(function(e){return e._id}).indexOf(t._id)&&this._mongoQueue.splice(this._mongoQueue.map(function(e){return e._id}).indexOf(t._id),1)}},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,o=this,t=(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(o),clearInterval(t))},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 c=this;return void 0===e&&(e=!1),new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("aggregate",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).aggregate(i,r).toArray().then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Aggregate",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.aggregateCount=function(e,n){var o=this;return new Promise(function(t,i){index_1.ResolveIOServer.getMongoManager().addToQueue({_id:0,name_collection:o.collectionName,name_function:"aggregate",name_function_addt:"count",data_function:[e,n],data_function_addt:[],cbs:[function(e,n,o){e?i(e):t(n)}],cbs_next:[],running:!1,cacheId:0,lookup_collections:e.filter(function(e){return e.$lookup&&e.$lookup.from}).map(function(e){return e.$lookup.from}).filter(function(e,n,o){return n===o.indexOf(e)}),invalidateFlag:!1,invalidateCount:0})})},MongoManagerCollection.prototype.aggregateCursor=function(e,n){var o=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 o.finish(),e}),e},MongoManagerCollection.prototype.aggregateStream=function(e,n,o){var t=new monitor_manager_1.MonitorMongo("aggregateStream",this.collectionName,JSON.stringify([e,n,o])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).aggregate(e,n).stream(o);return e.on("end",function(e){return t.finish(),e}).on("error",function(e){return t.finish(),e}).on("close",function(e){return t.finish(),e}),e},MongoManagerCollection.prototype.bulkWrite=function(w,x,C,e){var n=this;return void 0===C&&(C=!1),void 0===e&&(e=!1),new Promise(function(N,I){return __awaiter(n,void 0,void 0,function(){var i,r,c,a,o,t,l,s,n,d,u,_,g,m,h,f,v,p,M,O,y,S=this;return __generator(this,function(e){switch(e.label){case 0:return w.length?(i=[],r=[],c=[],a=[],o=[],t=[],l=[],w.forEach(function(e){var n=Object.keys(e)[0];"updateOne"===n||"deleteOne"===n||"replaceOne"===n?o.push(e[n].filter):"updateMany"===n?t.push(e[n].filter):"deleteMany"===n&&l.push(e[n].filter)}),o.length||t.length||l.length?[4,this.find({$or:__spreadArray(__spreadArray(__spreadArray([],o,!0),t,!0),l,!0)})]:[3,2]):(N(null),[2]);case 1:return n=e.sent(),[3,3];case 2:n=[],e.label=3;case 3:for(s=n,d=function(e,n){return n.split(".").reduce(function(e,n){return Array.isArray(e)?e.map(function(e){return e[n]}).filter(function(e){return void 0!==e}):e&&e[n]},e)},u=function(n){return s.filter(function(e){return _(n,e)})},_=function(t,i){return Object.keys(t).every(function(e){var n=t[e],o=d(i,e);return"$and"===e?n.every(function(e){return _(e,i)}):"$or"===e?n.some(function(e){return _(e,i)}):Array.isArray(o)?o.some(function(e){return g(n,e)}):g(n,o)})},g=function(e,n){if(e instanceof Object){if("$in"in e)return e.$in.includes(n);if("$nin"in e)return!e.$nin.includes(n);if("$ne"in e)return n!==e.$ne;if("$gt"in e)return n>e.$gt;if("$gte"in e)return n>=e.$gte;if("$lt"in e)return n<e.$lt;if("$lte"in e)return n<=e.$lte;if("$exists"in e)return void 0!==n===e.$exists;if("$regex"in e)return new RegExp(e.$regex,e.$options||"").test(n)}return n===e},m=function(n){var e,o=Object.keys(n)[0],t=n[o];"insertOne"===o?(t.document._id||(t.document._id=objectIdHexString()),h.useVersions&&!t.document.hasOwnProperty("__v")&&(t.document.__v=0),h.timestamps&&(e=new Date,t.document.createdAt=e,t.document.updatedAt=e),!C&&h.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:h.collectionName,id_document:t.document._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)):"updateOne"===o?(h.timestamps&&(t.update.$set?t.update.$set.updatedAt=new Date:t.update.$set={updatedAt:new Date}),u(n[o].filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),t.update.$inc?t.update.$inc.__v=1:t.update.$inc={__v:1},4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)})):"replaceOne"===o?(h.timestamps&&(t.replacement.updatedAt=new Date),u(n[o].filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),t.replacement.__v=e.__v+1,4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)})):"deleteOne"===o?u(t.filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)}):"updateMany"===o?(h.timestamps&&(t.update.$set?t.update.$set.updatedAt=new Date:t.update.$set={updatedAt:new Date}),h.useVersions&&(t.update.$inc?t.update.$inc.__v=1:t.update.$inc={__v:1}),u(t.filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)})):"deleteMany"===o&&u(t.filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)})},h=this,f=0,v=w;f<v.length;f++)p=v[f],m(p);e.label=4;case 4:return e.trys.push([4,10,,11]),M=new monitor_manager_1.MonitorMongo("bulkWrite",this.collectionName,JSON.stringify([a.slice(-100),x])),[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(a,x)];case 5:return(O=e.sent(),r.length)?[4,index_1.ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(__spreadArray(__spreadArray([],r,!0),c,!0))]:[3,7];case 6:e.sent(),e.label=7;case 7:return C||!i.length?[3,9]:[4,log_collection_1.Logs.bulkWrite(i)];case 8:e.sent(),e.label=9;case 9:return M.finish(),N(O),[3,11];case 10:return y=e.sent(),console.log(new Date,"Error Bulk Write",this.collectionName,a.slice(-100),x,y),I(y),[3,11];case 11:return[2]}})})})},MongoManagerCollection.prototype.countDocuments=function(i,r){var c=this;return void 0===i&&(i={}),new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("countDocuments",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).countDocuments(i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Count Documents",c.collectionName,i,r,e),o(e)})})},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(e,n){var i=this;return new Promise(function(o,t){MongoManagerCollection.indexQueue.push({action:"createIndex",collection:i,specs:[e],options:n},function(e,n){e?t(e):o(n)})})},MongoManagerCollection.prototype.createIndexes=function(e,n){var i=this;return new Promise(function(o,t){MongoManagerCollection.indexQueue.push({action:"createIndexes",collection:i,specs:[e],options:n},function(e,n){e?t(e):o(n)})})},MongoManagerCollection.prototype.deleteMany=function(s,d,u){var e=this;return void 0===s&&(s={}),void 0===u&&(u=!1),new Promise(function(a,l){return __awaiter(e,void 0,void 0,function(){var n,o,t,i,r,c=this;return __generator(this,function(e){switch(e.label){case 0:return!this.createLogs||u?[3,2]:[4,this.find(s)];case 1:for(n=e.sent(),o=0;o<n.length;o++)t=n[o],log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:t._id,payload:(0,common_1.getBinarySize)(JSON.stringify([t,s,d]))<2e5?JSON.stringify([t,s,d],null,2):"Too Big",method:"deleteMany",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((i=(0,common_1.deepCopy)(t))._id={_id:t._id,__v:t.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:t._id,__v:t.__v}},i,{upsert:!0}),index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":t._id},{"_id.__v":{$lt:t.__v-1}}]}));e.label=2;case 2:return r=new monitor_manager_1.MonitorMongo("deleteMany",this.collectionName,JSON.stringify([s,d])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).deleteMany(s,d).then(function(e){r.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(c.collectionName),a(e.deletedCount)):l(e.acknowledged)},function(e){r.finish(),console.log(new Date,"Error Delete Many",c.collectionName,s,d,e),l(e)}),[2]}})})})},MongoManagerCollection.prototype.deleteOne=function(c,a,l){var e=this;return void 0===c&&(c={}),void 0===l&&(l=!1),new Promise(function(r,t){return __awaiter(e,void 0,void 0,function(){var i,n,o=this;return __generator(this,function(e){return this.createLogs&&!l?(i=new monitor_manager_1.MonitorMongo("findOneAndDelete",this.collectionName,JSON.stringify([c,a])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndDelete(c,a).then(function(t){return __awaiter(o,void 0,void 0,function(){var n,o;return __generator(this,function(e){return i.finish(),(n=t)?(this.createLogs&&!l&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,c,a]))<2e5?JSON.stringify([n,c,a],null,2):"Too Big",method:"deleteOne",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((o=(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}},o,{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",o.collectionName,c,a,e),t(e)})):(n=new monitor_manager_1.MonitorMongo("deleteOne",this.collectionName,JSON.stringify([c,a])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).deleteOne(c,a).then(function(e){n.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(o.collectionName),r(e.deletedCount)):t(e.acknowledged)},function(e){n.finish(),console.log(new Date,"Error Delete One",o.collectionName,c,a,e),t(e)})),[2]})})})},MongoManagerCollection.prototype.distinct=function(e,i,r){var c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("distinct",c.collectionName,JSON.stringify([e,i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).distinct(e,i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Distinct",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.drop=function(i){var r=this;return new Promise(function(n,o){var t=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){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Count Documents",r.collectionName,i,e),o(e)})})},MongoManagerCollection.prototype.dropIndex=function(i,r){var c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("dropIndex",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).dropIndex(i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Drop Index",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.dropIndexes=function(i){var r=this;return new Promise(function(n,o){var t=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){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Drop Indexes",r.collectionName,i,e),o(e)})})},MongoManagerCollection.prototype.find=function(r,c,a){var e=this;return void 0===r&&(r={}),void 0===a&&(a=!1),new Promise(function(t,i){return __awaiter(e,void 0,void 0,function(){var n,o=this;return __generator(this,function(e){return a?(n=new monitor_manager_1.MonitorMongo("find",this.collectionName,JSON.stringify([r,c])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(r,c).toArray().then(function(e){n.finish(),t(e)},function(e){n.finish(),console.log(new Date,"Error Find",o.collectionName,r,c,e),i(e)})):index_1.ResolveIOServer.getMongoManager().addToQueue({_id:0,name_collection:this.collectionName,name_function:"find",name_function_addt:"toArray",data_function:[r,c],data_function_addt:[],cbs:[function(e,n,o){e?i(e):t(n)}],cbs_next:[],running:!1,cacheId:0,lookup_collections:[],invalidateFlag:!1,invalidateCount:0}),[2]})})})},MongoManagerCollection.prototype.findById=function(i,r){var c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("findById",c.collectionName,JSON.stringify([{_id:i},r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).findOne({_id:i},r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Find By Id",c.collectionName,{_id:i},r,e),o(e)})})},MongoManagerCollection.prototype.findCount=function(i,r){var c=this;return void 0===i&&(i={}),new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("findCount",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).find(i,r).count().then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Find Count",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.findCursor=function(e,n){void 0===e&&(e={});var o=new monitor_manager_1.MonitorMongo("findCursor",this.collectionName,JSON.stringify([e,n])),t=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(e,n);return t.on("close",function(e){return o.finish(),t.removeAllListeners(),e}),t},MongoManagerCollection.prototype.findStream=function(e,n,o){void 0===e&&(e={});var t=new monitor_manager_1.MonitorMongo("findStream",this.collectionName,JSON.stringify([e,n,o])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(e,n).stream(o);return e.on("end",function(e){return t.finish(),e}).on("error",function(e){return t.finish(),e}).on("close",function(e){return t.finish(),e}),e},MongoManagerCollection.prototype.findOne=function(o,r,e){var c=this;return void 0===o&&(o={}),void 0===e&&(e=!1),new Promise(function(t,i){var n;e?(n=new monitor_manager_1.MonitorMongo("findOne",c.collectionName,JSON.stringify([o,r])),index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).findOne(o,r).then(function(e){n.finish(),t(e)},function(e){n.finish(),console.log(new Date,"Error Find One",c.collectionName,o,r,e),i(e)})):index_1.ResolveIOServer.getMongoManager().addToQueue({_id:0,name_collection:c.collectionName,name_function:"findOne",name_function_addt:"",data_function:[o,r],data_function_addt:[],cbs:[function(e,n,o){e?i(e):t(n)}],cbs_next:[],running:!1,cacheId:0,lookup_collections:[],invalidateFlag:!1,invalidateCount:0})})},MongoManagerCollection.prototype.findOneAndDelete=function(r,c,a){var e=this;return void 0===r&&(r={}),void 0===a&&(a=!1),new Promise(function(i,n){return __awaiter(e,void 0,void 0,function(){var o,t=this;return __generator(this,function(e){return o=new monitor_manager_1.MonitorMongo("findOneAndDelete",this.collectionName,JSON.stringify([r,c])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndDelete(r,c).then(function(e){o.finish();var n;e?(t.createLogs&&!a&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:t.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,r,c]))<2e5?JSON.stringify([e,r,c],null,2):"Too Big",method:"findOneAndDelete",id_user:"",user:"",messageId:0,route:""}),t.useVersions&&((n=(0,common_1.deepCopy)(e))._id={_id:e._id,__v:e.__v},index_1.ResolveIOServer.getMongoManager().collection(t.versionCollection).replaceOne({_id:{_id:e._id,__v:e.__v}},n,{upsert:!0})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(t.collectionName),i(e)):i(null)},function(e){o.finish(),console.log(new Date,"Error Find One And Delete",t.collectionName,r,c,e),n(e)}),[2]})})})},MongoManagerCollection.prototype.findOneAndReplace=function(a,l,s,d,u){var e=this;return void 0===a&&(a={}),void 0===d&&(d=!1),void 0===u&&(u=!1),new Promise(function(r,c){return __awaiter(e,void 0,void 0,function(){var n,o,t,i=this;return __generator(this,function(e){return!this.checkSchema||u||(n=this.simplschema.newContext(),n.validate(l))?(o=new Date,this.timestamps&&(l.updatedAt=o),s&&s.upsert&&(l._id||(l._id=objectIdHexString()),this.useVersions&&(l.__v=0),this.timestamps)&&!l.createdAt&&(l.createdAt=o),t=new monitor_manager_1.MonitorMongo("findOneAndReplace",this.collectionName,JSON.stringify([a,l,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndReplace(a,l,s).then(function(e){t.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,a,l,s]))<2e5?JSON.stringify([e,a,l,s],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){t.finish(),console.log(new Date,"Error Find One And Replace",i.collectionName,a,s,e),c(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(),l]),c(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.findOneAndUpdate=function(a,l,s,d,u){var e=this;return void 0===a&&(a={}),void 0===d&&(d=!1),void 0===u&&(u=!1),new Promise(function(r,c){return __awaiter(e,void 0,void 0,function(){var n,o,t,i=this;return __generator(this,function(e){return!this.checkSchema||u||(n=this.simplschema.newContext(),n.validate(l,{modifier:!0}))?(this.timestamps&&(o=new Date,l.$set?l.$set.updatedAt=o:l.$set={updatedAt:o}),s&&s.upsert&&(l.$setOnInsert?(l.$setOnInsert._id||(l.$setOnInsert._id=objectIdHexString()),this.timestamps&&(l.$setOnInsert.createdAt=new Date)):this.timestamps?l.$setOnInsert={_id:objectIdHexString(),createdAt:new Date}:l.$setOnInsert={_id:objectIdHexString()}),t=new monitor_manager_1.MonitorMongo("findOneAndUpdate",this.collectionName,JSON.stringify([a,l,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndUpdate(a,l,s).then(function(e){t.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,a,l,s]))<2e5?JSON.stringify([e,a,l,s],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){t.finish(),console.log(new Date,"Error Find One And Update",i.collectionName,a,s,e),c(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(),l]),c(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.indexes=function(i){var r=this;return new Promise(function(n,o){var t=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){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Indexes",r.collectionName,i,e),o(e)})})},MongoManagerCollection.prototype.indexExists=function(i,r){var c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("indexExists",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).indexExists(i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Index Exists",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.insertMany=function(d,u,_,g,m){var e=this;return void 0===_&&(_=!1),void 0===g&&(g=!1),void 0===m&&(m=!1),new Promise(function(l,s){return __awaiter(e,void 0,void 0,function(){var o,n,t,i,r,c,a=this;return __generator(this,function(e){if(d.length){for(o=[],this.checkSchema&&!g&&d.forEach(function(e){var n=a.simplschema.newContext();n.validate(e)?o.push(!0):(console.log(new Date,a.collectionName,"Schema Errors - insertMany",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on insertMany - "+a.collectionName,[n.validationErrors(),e]),o.push(!1))}),n=this.checkSchema?d.filter(function(e,n){return o[n]}):d,t=0;t<n.length;t++)(i=n[t])._id||(i._id=objectIdHexString()),this.timestamps&&(r=new Date,i.createdAt=r,i.updatedAt=r),this.useVersions&&!i.hasOwnProperty("__v")&&(i.__v=0),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,u]))<2e5?JSON.stringify([i,u],null,2):"Too Big",method:"insertMany",id_user:"",user:"",messageId:0,route:""});n.length&&(c=null,m||(c=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){c&&c.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(n)):s(e.acknowledged)},function(e){c&&c.finish(),console.log(new Date,"Error Insert Many",a.collectionName,n,u,e),s(e)}))}else l([]);return[2]})})})},MongoManagerCollection.prototype.insertOne=function(a,l,s,d){var e=this;return void 0===s&&(s=!1),void 0===d&&(d=!1),new Promise(function(r,c){return __awaiter(e,void 0,void 0,function(){var n,o,t,i=this;return __generator(this,function(e){return a._id||(a._id=objectIdHexString()),!this.checkSchema||d||(n=this.simplschema.newContext(),n.validate(a))?(this.timestamps&&(o=new Date,a.createdAt=o,a.updatedAt=o),this.createLogs&&!s&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:a._id,payload:(0,common_1.getBinarySize)(JSON.stringify([a,l]))<2e5?JSON.stringify([a,l],null,2):"Too Big",method:"insertOne",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&!a.hasOwnProperty("__v")&&(a.__v=0),t=new monitor_manager_1.MonitorMongo("insertOne",this.collectionName,JSON.stringify([a,l])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).insertOne(a,l).then(function(e){t.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(i.collectionName),r(a)):c(e.acknowledged)},function(e){t.finish(),console.log(new Date,"Error Insert One",i.collectionName,a,l,e),c(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(),a]),c(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 c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("rename",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).rename(i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Rename",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.replaceOne=function(h,f,v,p,M,O){var e=this;return void 0===p&&(p=!1),void 0===M&&(M=!1),void 0===O&&(O=null),new Promise(function(g,m){return __awaiter(e,void 0,void 0,function(){var n,o,t,i,r,c,a,l,s,d,u,_=this;return __generator(this,function(e){switch(e.label){case 0:return!this.checkSchema||M||(o=this.simplschema.newContext(),o.validate(f))?(n=new Date,this.timestamps&&(f.updatedAt=n),this.useVersions?O?[3,2]:[4,this.findOne(h,null,!0)]:[3,8]):(console.log(new Date,this.collectionName,"Schema Errors - replaceOne",o.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on replaceOne - "+this.collectionName,[o.validationErrors(),f]),m(o.validationErrors()),[2]);case 1:O=e.sent(),e.label=2;case 2:return O?(this.timestamps&&!f.createdAt&&O.createdAt&&(f.createdAt=O.createdAt),O.__v!==f.__v?[3,3]:(f.__v+=1,(o=(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}},o,{upsert:!0}),4<=O.__v&&index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":O._id},{"_id.__v":{$lt:O.__v-4}}]}),this.createLogs&&!p&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:O._id,payload:(0,common_1.getBinarySize)(JSON.stringify([O,h,f,v]))<2e5?JSON.stringify([O,h,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),t=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([h,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(h,f,v).then(function(e){t.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(e.modifiedCount)):m(e.acknowledged)},function(e){t.finish(),console.log(new Date,"Error Replace One",_.collectionName,h,f,v,e),m(e)}),[3,5])):[3,6];case 3:return console.log("invalid version - "+this.collectionName,O.__v,f.__v),[4,index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({_id:{_id:O._id,__v:f.__v}},null,!0)];case 4:(i=e.sent())?(r=O._id,c=O.__v,(a=(0,common_1.getMongoMergeUpdatedDoc)(f,O,i))._id=r,a.__v=c+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",O,h,a,v]))<2e5?JSON.stringify(["invalidVersion - merge",O,h,a,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),l=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([h,a,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(h,a,v).then(function(e){l.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(e.modifiedCount)):m(e.acknowledged)},function(e){l.finish(),console.log(new Date,"Error Replace One",_.collectionName,h,a,v,e),m(e)})):m("Invalid Version And Could Not Find History - DB: "+O.__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",h,f,v]))<2e5?JSON.stringify(["upsert",h,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),s=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([h,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(h,f,v).then(function(e){s.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(e.modifiedCount)):m(e.acknowledged)},function(e){s.finish(),console.log(new Date,"Error Replace One",_.collectionName,h,f,v,e),m(e)})):m("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([h,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndReplace(h,f,v).then(function(e){d.finish();e?log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:_.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,h,f,v]))<2e5?JSON.stringify([e,h,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}):log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:_.collectionName,id_document:f._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",h,f,v]))<2e5?JSON.stringify(["upsert",h,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(1)},function(e){d.finish(),console.log(new Date,"Error Find One And Replace",_.collectionName,h,f,v,e),m(e)})):(u=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([h,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(h,f,v).then(function(e){u.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(e.modifiedCount)):m(e.acknowledged)},function(e){u.finish(),console.log(new Date,"Error Replace One",_.collectionName,h,f,v,e),m(e)})),e.label=9;case 9:return[2]}})})})},MongoManagerCollection.prototype.updateMany=function(d,u,_,g,m,h){var e=this;return void 0===g&&(g=!1),void 0===m&&(m=!1),void 0===h&&(h=!1),new Promise(function(l,s){return __awaiter(e,void 0,void 0,function(){var n,o,t,i,r,c,a=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||m||(n=this.simplschema.newContext(),n.validate(u,{modifier:!0}))?this.useVersions&&!h||this.createLogs&&!g?[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]),s(n.validationErrors()),[2])):(l(1),[2]);case 1:for(o=e.sent(),t=0;t<o.length;t++)i=o[t],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,d,u,_]))<2e5?JSON.stringify([i,d,u,_],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 c=new monitor_manager_1.MonitorMongo("updateMany",this.collectionName,JSON.stringify([d,u,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateMany(d,u,_).then(function(e){c.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.modifiedCount)):s(e.acknowledged)},function(e){c.finish(),console.log(new Date,"Error Update Many",a.collectionName,d,u,_,e),s(e)}),[2]}})})})},MongoManagerCollection.prototype.updateOne=function(d,u,_,g,m){var e=this;return void 0===g&&(g=!1),void 0===m&&(m=!1),new Promise(function(l,s){return __awaiter(e,void 0,void 0,function(){var n,o,t,i,r,c,a=this;return __generator(this,function(e){switch(e.label){case 0:return!this.checkSchema||m||(o=this.simplschema.newContext(),o.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]):(l(1),[2]):(console.log(new Date,this.collectionName,"Schema Errors - updateOne",o.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on updateOne - "+this.collectionName,[o.validationErrors(),u]),s(o.validationErrors()),[2]);case 1:return(n=e.sent())?(this.createLogs&&!g&&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,_]))<2e5?JSON.stringify([n,d,u,_],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),(o=(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}},o,{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}),t=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,_).then(function(e){t.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.modifiedCount)):s(e.acknowledged)},function(e){t.finish(),console.log(new Date,"Error Update One",a.collectionName,d,u,_,e),s(e)})):_&&_.upsert?(u.$setOnInsert?(u.$setOnInsert._id||(u.$setOnInsert._id=objectIdHexString()),this.timestamps&&(u.$setOnInsert.createdAt=new Date)):this.timestamps?u.$setOnInsert={_id:objectIdHexString(),__v:0,createdAt:new Date}:u.$setOnInsert={_id:objectIdHexString(),__v:0},this.createLogs&&!g&&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,_]))<2e5?JSON.stringify(["upsert",d,u,_],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,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,_).then(function(e){i.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.modifiedCount)):s(e.acknowledged)},function(e){i.finish(),console.log(new Date,"Error Update One",a.collectionName,d,u,_,e),s(e)})):s("No Document"),[3,3];case 2:_&&_.upsert&&(u.$setOnInsert?(u.$setOnInsert._id||(u.$setOnInsert._id=objectIdHexString()),this.timestamps&&(u.$setOnInsert.createdAt=new Date)):this.timestamps?u.$setOnInsert={_id:objectIdHexString(),createdAt:new Date}:u.$setOnInsert={_id:objectIdHexString()}),this.createLogs&&!g?(_?_.returnDocument="before":_={returnDocument:"before"},r=new monitor_manager_1.MonitorMongo("findOneAndUpdate",this.collectionName,JSON.stringify([d,u,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndUpdate(d,u,_).then(function(e){r.finish();var n=e.value;n?(log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:a.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,d,u,_]))<2e5?JSON.stringify([n,d,u,_],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),l(e.ok)):u.$setOnInsert?(log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:a.collectionName,id_document:u.$setOnInsert._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",d,u,_]))<2e5?JSON.stringify(["upsert",d,u,_],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.ok)):l(0)},function(e){r.finish(),console.log(new Date,"Error Find One And Update",a.collectionName,d,u,_,e),s(e)})):(c=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,_).then(function(e){c.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.modifiedCount)):s(e.acknowledged)},function(e){c.finish(),console.log(new Date,"Error Update One",a.collectionName,d,u,_,e),s(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)},MongoManagerCollection.prototype.watchCollectionWithAggregate=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(n,u){return __awaiter(void 0,void 0,void 0,function(){var i,r,c,a,l,s,d;return __generator(e,function(e){switch(e.label){case 0:return(i=n.action,r=n.collection,c=n.specs,a=n.options,l=index_1.ResolveIOServer.getMainDB().collection(r.collectionName,r.collectionOptions))?(s=new monitor_manager_1.MonitorMongo(i,r.collectionName,JSON.stringify([c,a])),[4,(d=function(){return __awaiter(void 0,void 0,void 0,function(){var n,o,t;return __generator(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,9]),[4,l[i].apply(l,__spreadArray(__spreadArray([],c,!1),[a],!1))];case 1:return o=e.sent(),s.finish(),u(null,o),[3,9];case 2:if(85!==(n=e.sent()).code&&!n.message.includes("IndexOptionsConflict"))return[3,8];e.label=3;case 3:return(e.trys.push([3,7,,8]),o=r.extractIndexNameFromError(n.message))?[4,l.dropIndex(o)]:[3,6];case 4:return e.sent(),[4,d()];case 5:return[2,e.sent()];case 6:return[3,8];case 7:return t=e.sent(),u(t),[3,8];case 8:return s.finish(),u(n),[3,9];case 9:return[2]}})})})()]):[2,u(new Error("Collection ".concat(r.collectionName," not found")))];case 1:return e.sent(),[2]}})})},1),MongoManagerCollection}()),MongoManagerUserCollection=function(e){function MongoManagerUserCollection(){return null!==e&&e.apply(this,arguments)||this}return __extends(MongoManagerUserCollection,e),MongoManagerUserCollection.prototype.authenticate=function(c,o){var e=this;return new Promise(function(i,r){return __awaiter(e,void 0,void 0,function(){var n,t=this;return __generator(this,function(e){switch(e.label){case 0:return(n=Math.pow(100,Math.log(c.attempts+1)),n=n<3e5?n:3e5,c.last)?Date.now()-c.last.getTime()<n?(c.last=new Date,[4,user_collection_1.Users.updateOne({_id:c._id},{$set:{last:c.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:c.last=new Date,e.label=4;case 4:return 5<=c.attempts?i({data:null,error:"Too Many Attempts"}):c.salt?pbkdf2(o,c.salt,{iterations:25e3,keylen:512,digestAlgorithm:"sha256"},function(n,o){return __awaiter(t,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return n?[2,r(n)]:scmp(o,Buffer.from(c.hash,"hex"))?(c.last=new Date,c.attempts=0,[4,user_collection_1.Users.updateOne({_id:c._id},{$set:{last:c.last,attempts:c.attempts}})]):[3,2];case 1:return e.sent(),i({data:c,error:""}),[3,4];case 2:return c.last=new Date,c.attempts=c.attempts+1,[4,user_collection_1.Users.updateOne({_id:c._id},{$set:{last:c.last,attempts:c.attempts}})];case 3:e.sent(),5<=c.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,c){var e=this;return new Promise(function(t,i){return __awaiter(e,void 0,void 0,function(){var n,o;return __generator(this,function(e){switch(e.label){case 0:return r?[3,1]:(i("No User"),[3,5]);case 1:return c?[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(c,n,{iterations:25e3,keylen:512,digestAlgorithm:"sha256"})];case 4:o=e.sent(),o=Buffer.from(o,"binary").toString("hex"),user_collection_1.Users.updateOne({_id:r._id},{$set:{hash:o,salt:n,services:{},attempts:0}}).then(function(e){return t(e)},function(e){return i(e)}),e.label=5;case 5:return[2]}})})})},MongoManagerUserCollection.prototype.changePassword=function(i,r,c){var e=this;return new Promise(function(o,t){return __awaiter(e,void 0,void 0,function(){var n;return __generator(this,function(e){switch(e.label){case 0:return i?[3,1]:(t("Missing User"),[3,4]);case 1:return r&&c?[3,2]:(t("Missing Password"),[3,4]);case 2:return[4,this.authenticate(i,r)];case 3:(n=e.sent()).data?this.setPassword(i,c).then(function(e){return o(e)},function(e){return t(e)}):t(n.error),e.label=4;case 4:return[2]}})})})},MongoManagerUserCollection.prototype.register=function(t,i){var e=this;return new Promise(function(n,o){return __awaiter(e,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return t.username?[3,1]:(o("Missing Username"),[3,5]);case 1:return[4,user_collection_1.Users.findOne({username:t.username})];case 2:return e.sent()?(o("Username Exists"),[3,5]):[3,3];case 3:return[4,user_collection_1.Users.findOne({email:t.email})];case 4:e.sent()?o("Email Exists"):(t.setPassword(i),n(t)),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,o,t){crypto.pbkdf2(e,n,o.iterations,o.keylen,o.digestAlgorithm,t)}function pbkdf2Promisified(e,n,i){return new Promise(function(o,t){return pbkdf2(e,n,i,function(e,n){return e?t(e):o(n)})})}function randomBytes(e){return new Promise(function(o,t){return crypto.randomBytes(e,function(e,n){return e?t(e):o(n)})})}function objectContainsPropertyDeep(e,n){var o=Object.keys(e);if(o.some(function(e){return e===n}))return!0;for(var t=0;t<o.length;t++){var i=o[t];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 o=function(e,n){return(o=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,n){e.__proto__=n}:function(e,n){for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}))(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}o(e,n),e.prototype=null===n?Object.create(n):(__.prototype=n.prototype,new __)}}(),__awaiter=this&&this.__awaiter||function(e,t,i,r){return new(i=i||Promise)(function(o,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?o(e.value):((n=e.value)instanceof i?n:new i(function(e){e(n)})).then(fulfilled,rejected)}step((r=r.apply(e,t||[])).next())})},__generator=this&&this.__generator||function(t,i){var r,c,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},s={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function verb(o){return function(e){var n=[o,e];if(r)throw new TypeError("Generator is already executing.");for(;l=s&&n[s=0]?0:l;)try{if(r=1,c&&(a=2&n[0]?c.return:n[0]?c.throw||((a=c.return)&&a.call(c),0):c.next)&&!(a=a.call(c,n[1])).done)return a;switch(c=0,(n=a?[2&n[0],a.value]:n)[0]){case 0:case 1:a=n;break;case 4:return l.label++,{value:n[1],done:!1};case 5:l.label++,c=n[1],n=[0];continue;case 7:n=l.ops.pop(),l.trys.pop();continue;default:if(!(a=0<(a=l.trys).length&&a[a.length-1])&&(6===n[0]||2===n[0])){l=0;continue}if(3===n[0]&&(!a||n[1]>a[0]&&n[1]<a[3]))l.label=n[1];else if(6===n[0]&&l.label<a[1])l.label=a[1],a=n;else{if(!(a&&l.label<a[2])){a[2]&&l.ops.pop(),l.trys.pop();continue}l.label=a[2],l.ops.push(n)}}n=i.call(t,l)}catch(e){n=[6,e],c=0}finally{r=a=0}if(5&n[0])throw n[1];return{value:n[0]?n[1]:void 0,done:!0}}}},__spreadArray=this&&this.__spreadArray||function(e,n,o){if(o||2===arguments.length)for(var t,i=0,r=n.length;i<r;i++)!t&&i in n||((t=t||Array.prototype.slice.call(n,0,i))[i]=n[i]);return e.concat(t||Array.prototype.slice.call(n))},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"),MongoManager=function(){function MongoManager(){var e=this;this._collections=[],this._mongoQueue=[],this._mongoQueueId=0,this._mongoQueueRunning=!1,this._mongoQueueCacheId=1,this._heapStats=v8.getHeapStatistics(),this._heapLimit=this._heapStats.heap_size_limit/numCPUs/8,this._serverCollections=[],this._debugMongoQueueHits=0,this._debugRemoveCacheHits=0,this._debugMongoQueueCollections=[],this._nodeCache=new NodeCache({stdTTL:0,checkperiod:0}),setInterval(function(){index_1.ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()&&(console.log(new Date,"Mongo Manager","Collections",e._collections.length),console.log(new Date,"Mongo Manager","Mongo Queue",e._mongoQueue.length,JSON.stringify(e._mongoQueue.sort(function(e,n){return e.name_collection.localeCompare(n.name_collection)}),null,2)),console.log(new Date,"Mongo Manager","Server Collections",e._serverCollections.length),console.log(new Date,"Mongo Manager","Mongo Queue Hits",e._debugMongoQueueHits),console.log(new Date,"Mongo Manager","Mongo Queue Collections",e._debugMongoQueueCollections.sort(function(e,n){return e.collection.localeCompare(n.collection)||e.function.localeCompare(n.function)})),console.log(new Date,"Mongo Manager","Cache Cleanup Hits",JSON.stringify(e._debugRemoveCacheHits,null,2))),e._debugMongoQueueHits=0,e._debugRemoveCacheHits=0,e._debugMongoQueueCollections=[]},6e4),this.initServerCollections(),this.runQueue()}return 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.filter(function(e){return e.collectionName===n})[0]},MongoManager.prototype.addToQueue=function(n){var e=this._mongoQueue.filter(function(e){return e.name_collection===n.name_collection&&e.name_function===n.name_function&&e.name_function_addt===n.name_function_addt&&JSON.stringify(e.data_function)===JSON.stringify(n.data_function)&&JSON.stringify(e.data_function_addt)===JSON.stringify(n.data_function_addt)})[0];e?(e.running?e.cbs_next:e.cbs).push(n.cbs[0]):(n._id=this._mongoQueueId,this._mongoQueueId+=1,this._mongoQueue.splice(0,0,n))},MongoManager.prototype.runQueue=function(){return __awaiter(this,void 0,void 0,function(){var c=this;return __generator(this,function(e){return setInterval(function(){if(!c._mongoQueueRunning){var o=c._mongoQueue.filter(function(e){return!e.running&&e.cbs.length});if(o.length){c._mongoQueueRunning=!0;for(var e=o.length-1;0<=e;e--)!function(e){c._debugMongoQueueHits+=1;var t,i,r=o[e];if(c._debugMongoQueueCollections.some(function(e){return e.collection===r.name_collection&&e.function===r.name_function})?c._debugMongoQueueCollections.filter(function(e){return e.collection===r.name_collection&&e.function===r.name_function})[0].hits+=1:c._debugMongoQueueCollections.push({collection:r.name_collection,function:r.name_function,hits:1}),r.running=!0,r.invalidateFlag=!1,r.cacheId)try{var n=JSON.parse(c._nodeCache.get(r.cacheId),common_1.dateReviver);r.cbs.forEach(function(e){e(null,n,!0)}),r.cbs=[],r.running=!1}catch(e){r.cacheId=0}r.cacheId||(r.name_function_addt?(t=new monitor_manager_1.MonitorMongo(r.name_function,r.name_collection,JSON.stringify(__spreadArray(__spreadArray(__spreadArray([],r.data_function,!0),[r.name_function_addt],!1),r.data_function_addt,!0))),(e=(e=index_1.ResolveIOServer.getMainDB().collection(r.name_collection))[r.name_function].apply(e,r.data_function))[r.name_function_addt].apply(e,r.data_function_addt).then(function(n){if(t.finish(),r.invalidateFlag)5<=r.invalidateCount&&(r.invalidateCount=0,r.cbs.forEach(function(e){e(null,n,!1)})),r.cbs=r.cbs.concat(r.cbs_next),r.cbs_next=[];else{var e=r.invalidateCount=0,o=!1;try{e=JSON.stringify(n).replace(/[\[\]\,\"]/g,"").length}catch(e){o=!0}!o&&null!=n&&(!Array.isArray(n)||n.length)&&e<1e7?(r.cacheId=c._mongoQueueCacheId,c._mongoQueueCacheId+=1,c.addToCache(r.cacheId,n)):r.cacheId=0,r.cbs.forEach(function(e){e(null,n,!1)}),r.cbs_next.length?(r.cbs=r.cbs_next,r.cbs_next=[]):r.cbs=[]}r.running=!1},function(n){t.finish(),r.cbs.forEach(function(e){e(n,null,!1)}),r.cbs_next.forEach(function(e){e(n,null,!1)}),0<=c._mongoQueue.map(function(e){return e._id}).indexOf(r._id)&&c._mongoQueue.splice(c._mongoQueue.map(function(e){return e._id}).indexOf(r._id),1)})):(i=new monitor_manager_1.MonitorMongo(r.name_function,r.name_collection,JSON.stringify(r.data_function)),(e=index_1.ResolveIOServer.getMainDB().collection(r.name_collection))[r.name_function].apply(e,r.data_function).then(function(n){if(i.finish(),r.invalidateFlag)5<=r.invalidateCount&&(r.invalidateCount=0,r.cbs.forEach(function(e){e(null,n,!1)})),r.cbs=r.cbs.concat(r.cbs_next),r.cbs_next=[];else{var e=r.invalidateCount=0,o=!1;try{e=JSON.stringify(n).replace(/[\[\]\,\"]/g,"").length}catch(e){o=!0}!o&&null!=n&&(!Array.isArray(n)||n.length)&&e<1e7?(r.cacheId=c._mongoQueueCacheId,c._mongoQueueCacheId+=1,c.addToCache(r.cacheId,n)):r.cacheId=0,r.cbs.forEach(function(e){e(null,n,!1)}),r.cbs_next.length?(r.cbs=r.cbs_next,r.cbs_next=[]):r.cbs=[]}r.running=!1},function(n){i.finish(),console.log.apply(console,__spreadArray(__spreadArray([new Date,"Error "+r.name_function,r.name_collection],r.data_function,!1),[n],!1)),r.cbs.forEach(function(e){e(n,null,!1)}),r.cbs_next.forEach(function(e){e(n,null,!1)}),0<=c._mongoQueue.map(function(e){return e._id}).indexOf(r._id)&&c._mongoQueue.splice(c._mongoQueue.map(function(e){return e._id}).indexOf(r._id),1)})))}(e);c._mongoQueueRunning=!1}}},25),[2]})})},MongoManager.prototype.addToCache=function(e,n){var o=this._nodeCache.getStats().vsize;if(o>this._heapLimit){for(var t=0,i=this._mongoQueue.filter(function(e){return e.cacheId&&!e.running&&!e.cbs.length}),r=i.length-1;0<=r;r--){this._debugRemoveCacheHits+=1;var c=i[r];if(this._nodeCache.del(c.cacheId),(c.cacheId=0)<=this._mongoQueue.map(function(e){return e._id}).indexOf(c._id)&&this._mongoQueue.splice(this._mongoQueue.map(function(e){return e._id}).indexOf(c._id),1),t+=1,(o=this._nodeCache.getStats().vsize)<.75*this._heapLimit)break}console.log("Query Cache: Too Big, - Deleted: "+t+" - "+o)}this._nodeCache.set(e,JSON.stringify(n))},MongoManager.prototype.invalidateQueryCache=function(n){for(var e=this._mongoQueue.filter(function(e){return e.name_collection===n||e.lookup_collections.includes(n)}),o=e.length-1;0<=o;o--){var t=e[o];t.cacheId&&(this._nodeCache.del(t.cacheId),t.cacheId=0),t.running?(t.invalidateFlag=!0,t.invalidateCount+=1):t.cbs.length||0<=this._mongoQueue.map(function(e){return e._id}).indexOf(t._id)&&this._mongoQueue.splice(this._mongoQueue.map(function(e){return e._id}).indexOf(t._id),1)}},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,o=this,t=(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(o),clearInterval(t))},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 c=this;return void 0===e&&(e=!1),new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("aggregate",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).aggregate(i,r).toArray().then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Aggregate",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.aggregateCount=function(e,n){var o=this;return new Promise(function(t,i){index_1.ResolveIOServer.getMongoManager().addToQueue({_id:0,name_collection:o.collectionName,name_function:"aggregate",name_function_addt:"count",data_function:[e,n],data_function_addt:[],cbs:[function(e,n,o){e?i(e):t(n)}],cbs_next:[],running:!1,cacheId:0,lookup_collections:e.filter(function(e){return e.$lookup&&e.$lookup.from}).map(function(e){return e.$lookup.from}).filter(function(e,n,o){return n===o.indexOf(e)}),invalidateFlag:!1,invalidateCount:0})})},MongoManagerCollection.prototype.aggregateCursor=function(e,n){var o=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 o.finish(),e}),e},MongoManagerCollection.prototype.aggregateStream=function(e,n,o){var t=new monitor_manager_1.MonitorMongo("aggregateStream",this.collectionName,JSON.stringify([e,n,o])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).aggregate(e,n).stream(o);return e.on("end",function(e){return t.finish(),e}).on("error",function(e){return t.finish(),e}).on("close",function(e){return t.finish(),e}),e},MongoManagerCollection.prototype.bulkWrite=function(w,x,C,e){var n=this;return void 0===C&&(C=!1),void 0===e&&(e=!1),new Promise(function(N,I){return __awaiter(n,void 0,void 0,function(){var i,r,c,a,o,t,l,s,n,d,u,_,g,m,h,f,v,p,M,O,y,S=this;return __generator(this,function(e){switch(e.label){case 0:return w.length?(i=[],r=[],c=[],a=[],o=[],t=[],l=[],w.forEach(function(e){var n=Object.keys(e)[0];"updateOne"===n||"deleteOne"===n||"replaceOne"===n?o.push(e[n].filter):"updateMany"===n?t.push(e[n].filter):"deleteMany"===n&&l.push(e[n].filter)}),o.length||t.length||l.length?[4,this.find({$or:__spreadArray(__spreadArray(__spreadArray([],o,!0),t,!0),l,!0)})]:[3,2]):(N(null),[2]);case 1:return n=e.sent(),[3,3];case 2:n=[],e.label=3;case 3:for(s=n,d=function(e,n){return n.split(".").reduce(function(e,n){return Array.isArray(e)?e.map(function(e){return e[n]}).filter(function(e){return void 0!==e}):e&&e[n]},e)},u=function(n){return s.filter(function(e){return _(n,e)})},_=function(t,i){return Object.keys(t).every(function(e){var n=t[e],o=d(i,e);return"$and"===e?n.every(function(e){return _(e,i)}):"$or"===e?n.some(function(e){return _(e,i)}):Array.isArray(o)?o.some(function(e){return g(n,e)}):g(n,o)})},g=function(e,n){if(e instanceof Object){if("$in"in e)return e.$in.includes(n);if("$nin"in e)return!e.$nin.includes(n);if("$ne"in e)return n!==e.$ne;if("$gt"in e)return n>e.$gt;if("$gte"in e)return n>=e.$gte;if("$lt"in e)return n<e.$lt;if("$lte"in e)return n<=e.$lte;if("$exists"in e)return void 0!==n===e.$exists;if("$regex"in e)return new RegExp(e.$regex,e.$options||"").test(n)}return n===e},m=function(n){var e,o=Object.keys(n)[0],t=n[o];"insertOne"===o?(t.document._id||(t.document._id=objectIdHexString()),h.useVersions&&!t.document.hasOwnProperty("__v")&&(t.document.__v=0),h.timestamps&&(e=new Date,t.document.createdAt=e,t.document.updatedAt=e),!C&&h.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:h.collectionName,id_document:t.document._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)):"updateOne"===o?(h.timestamps&&(t.update.$set?t.update.$set.updatedAt=new Date:t.update.$set={updatedAt:new Date}),u(n[o].filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),t.update.$inc?t.update.$inc.__v=1:t.update.$inc={__v:1},4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)})):"replaceOne"===o?(h.timestamps&&(t.replacement.updatedAt=new Date),u(n[o].filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),t.replacement.__v=e.__v+1,4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)})):"deleteOne"===o?u(t.filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)}):"updateMany"===o?(h.timestamps&&(t.update.$set?t.update.$set.updatedAt=new Date:t.update.$set={updatedAt:new Date}),h.useVersions&&(t.update.$inc?t.update.$inc.__v=1:t.update.$inc={__v:1}),u(t.filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)})):"deleteMany"===o&&u(t.filter).forEach(function(e){S.useVersions&&(e._id={_id:e._id,__v:e.__v},r.push({insertOne:{document:e}}),4<=e.__v)&&c.push({deleteMany:{filter:{"_id._id":e._id,"_id.__v":{$lt:e.__v-4}}}}),!C&&S.createLogs&&i.push({insertOne:{document:{_id:objectIdHexString(),type:"document",collection:S.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,x]))<2e5?JSON.stringify([n,x],null,2):"Too Big",method:o,id_user:"",user:"",messageId:0,route:""}}}),a.push(n)})},h=this,f=0,v=w;f<v.length;f++)p=v[f],m(p);e.label=4;case 4:return(e.trys.push([4,12,,13]),a.length)?(M=new monitor_manager_1.MonitorMongo("bulkWrite",this.collectionName,JSON.stringify([a.slice(-100),x])),[4,index_1.ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(a,x)]):[3,10];case 5:return(O=e.sent(),r.length||c.length)?[4,index_1.ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(__spreadArray(__spreadArray([],r,!0),c,!0))]:[3,7];case 6:e.sent(),e.label=7;case 7:return C||!i.length?[3,9]:[4,log_collection_1.Logs.bulkWrite(i)];case 8:e.sent(),e.label=9;case 9:return M.finish(),N(O),[3,11];case 10:N(null),e.label=11;case 11:return[3,13];case 12:return y=e.sent(),console.log(new Date,"Error Bulk Write",this.collectionName,a.slice(-100),x,y),I(y),[3,13];case 13:return[2]}})})})},MongoManagerCollection.prototype.countDocuments=function(i,r){var c=this;return void 0===i&&(i={}),new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("countDocuments",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).countDocuments(i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Count Documents",c.collectionName,i,r,e),o(e)})})},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(e,n){var i=this;return new Promise(function(o,t){MongoManagerCollection.indexQueue.push({action:"createIndex",collection:i,specs:[e],options:n},function(e,n){e?t(e):o(n)})})},MongoManagerCollection.prototype.createIndexes=function(e,n){var i=this;return new Promise(function(o,t){MongoManagerCollection.indexQueue.push({action:"createIndexes",collection:i,specs:[e],options:n},function(e,n){e?t(e):o(n)})})},MongoManagerCollection.prototype.deleteMany=function(s,d,u){var e=this;return void 0===s&&(s={}),void 0===u&&(u=!1),new Promise(function(a,l){return __awaiter(e,void 0,void 0,function(){var n,o,t,i,r,c=this;return __generator(this,function(e){switch(e.label){case 0:return!this.createLogs||u?[3,2]:[4,this.find(s)];case 1:for(n=e.sent(),o=0;o<n.length;o++)t=n[o],log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:t._id,payload:(0,common_1.getBinarySize)(JSON.stringify([t,s,d]))<2e5?JSON.stringify([t,s,d],null,2):"Too Big",method:"deleteMany",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((i=(0,common_1.deepCopy)(t))._id={_id:t._id,__v:t.__v},index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne({_id:{_id:t._id,__v:t.__v}},i,{upsert:!0}),index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":t._id},{"_id.__v":{$lt:t.__v-1}}]}));e.label=2;case 2:return r=new monitor_manager_1.MonitorMongo("deleteMany",this.collectionName,JSON.stringify([s,d])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).deleteMany(s,d).then(function(e){r.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(c.collectionName),a(e.deletedCount)):l(e.acknowledged)},function(e){r.finish(),console.log(new Date,"Error Delete Many",c.collectionName,s,d,e),l(e)}),[2]}})})})},MongoManagerCollection.prototype.deleteOne=function(c,a,l){var e=this;return void 0===c&&(c={}),void 0===l&&(l=!1),new Promise(function(r,t){return __awaiter(e,void 0,void 0,function(){var i,n,o=this;return __generator(this,function(e){return this.createLogs&&!l?(i=new monitor_manager_1.MonitorMongo("findOneAndDelete",this.collectionName,JSON.stringify([c,a])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndDelete(c,a).then(function(t){return __awaiter(o,void 0,void 0,function(){var n,o;return __generator(this,function(e){return i.finish(),(n=t)?(this.createLogs&&!l&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,c,a]))<2e5?JSON.stringify([n,c,a],null,2):"Too Big",method:"deleteOne",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&((o=(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}},o,{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",o.collectionName,c,a,e),t(e)})):(n=new monitor_manager_1.MonitorMongo("deleteOne",this.collectionName,JSON.stringify([c,a])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).deleteOne(c,a).then(function(e){n.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(o.collectionName),r(e.deletedCount)):t(e.acknowledged)},function(e){n.finish(),console.log(new Date,"Error Delete One",o.collectionName,c,a,e),t(e)})),[2]})})})},MongoManagerCollection.prototype.distinct=function(e,i,r){var c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("distinct",c.collectionName,JSON.stringify([e,i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).distinct(e,i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Distinct",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.drop=function(i){var r=this;return new Promise(function(n,o){var t=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){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Count Documents",r.collectionName,i,e),o(e)})})},MongoManagerCollection.prototype.dropIndex=function(i,r){var c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("dropIndex",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).dropIndex(i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Drop Index",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.dropIndexes=function(i){var r=this;return new Promise(function(n,o){var t=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){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Drop Indexes",r.collectionName,i,e),o(e)})})},MongoManagerCollection.prototype.find=function(r,c,a){var e=this;return void 0===r&&(r={}),void 0===a&&(a=!1),new Promise(function(t,i){return __awaiter(e,void 0,void 0,function(){var n,o=this;return __generator(this,function(e){return a?(n=new monitor_manager_1.MonitorMongo("find",this.collectionName,JSON.stringify([r,c])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(r,c).toArray().then(function(e){n.finish(),t(e)},function(e){n.finish(),console.log(new Date,"Error Find",o.collectionName,r,c,e),i(e)})):index_1.ResolveIOServer.getMongoManager().addToQueue({_id:0,name_collection:this.collectionName,name_function:"find",name_function_addt:"toArray",data_function:[r,c],data_function_addt:[],cbs:[function(e,n,o){e?i(e):t(n)}],cbs_next:[],running:!1,cacheId:0,lookup_collections:[],invalidateFlag:!1,invalidateCount:0}),[2]})})})},MongoManagerCollection.prototype.findById=function(i,r){var c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("findById",c.collectionName,JSON.stringify([{_id:i},r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).findOne({_id:i},r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Find By Id",c.collectionName,{_id:i},r,e),o(e)})})},MongoManagerCollection.prototype.findCount=function(i,r){var c=this;return void 0===i&&(i={}),new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("findCount",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).find(i,r).count().then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Find Count",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.findCursor=function(e,n){void 0===e&&(e={});var o=new monitor_manager_1.MonitorMongo("findCursor",this.collectionName,JSON.stringify([e,n])),t=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(e,n);return t.on("close",function(e){return o.finish(),t.removeAllListeners(),e}),t},MongoManagerCollection.prototype.findStream=function(e,n,o){void 0===e&&(e={});var t=new monitor_manager_1.MonitorMongo("findStream",this.collectionName,JSON.stringify([e,n,o])),e=index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).find(e,n).stream(o);return e.on("end",function(e){return t.finish(),e}).on("error",function(e){return t.finish(),e}).on("close",function(e){return t.finish(),e}),e},MongoManagerCollection.prototype.findOne=function(o,r,e){var c=this;return void 0===o&&(o={}),void 0===e&&(e=!1),new Promise(function(t,i){var n;e?(n=new monitor_manager_1.MonitorMongo("findOne",c.collectionName,JSON.stringify([o,r])),index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).findOne(o,r).then(function(e){n.finish(),t(e)},function(e){n.finish(),console.log(new Date,"Error Find One",c.collectionName,o,r,e),i(e)})):index_1.ResolveIOServer.getMongoManager().addToQueue({_id:0,name_collection:c.collectionName,name_function:"findOne",name_function_addt:"",data_function:[o,r],data_function_addt:[],cbs:[function(e,n,o){e?i(e):t(n)}],cbs_next:[],running:!1,cacheId:0,lookup_collections:[],invalidateFlag:!1,invalidateCount:0})})},MongoManagerCollection.prototype.findOneAndDelete=function(r,c,a){var e=this;return void 0===r&&(r={}),void 0===a&&(a=!1),new Promise(function(i,n){return __awaiter(e,void 0,void 0,function(){var o,t=this;return __generator(this,function(e){return o=new monitor_manager_1.MonitorMongo("findOneAndDelete",this.collectionName,JSON.stringify([r,c])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndDelete(r,c).then(function(e){o.finish();var n;e?(t.createLogs&&!a&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:t.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,r,c]))<2e5?JSON.stringify([e,r,c],null,2):"Too Big",method:"findOneAndDelete",id_user:"",user:"",messageId:0,route:""}),t.useVersions&&((n=(0,common_1.deepCopy)(e))._id={_id:e._id,__v:e.__v},index_1.ResolveIOServer.getMongoManager().collection(t.versionCollection).replaceOne({_id:{_id:e._id,__v:e.__v}},n,{upsert:!0})),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(t.collectionName),i(e)):i(null)},function(e){o.finish(),console.log(new Date,"Error Find One And Delete",t.collectionName,r,c,e),n(e)}),[2]})})})},MongoManagerCollection.prototype.findOneAndReplace=function(a,l,s,d,u){var e=this;return void 0===a&&(a={}),void 0===d&&(d=!1),void 0===u&&(u=!1),new Promise(function(r,c){return __awaiter(e,void 0,void 0,function(){var n,o,t,i=this;return __generator(this,function(e){return!this.checkSchema||u||(n=this.simplschema.newContext(),n.validate(l))?(o=new Date,this.timestamps&&(l.updatedAt=o),s&&s.upsert&&(l._id||(l._id=objectIdHexString()),this.useVersions&&(l.__v=0),this.timestamps)&&!l.createdAt&&(l.createdAt=o),t=new monitor_manager_1.MonitorMongo("findOneAndReplace",this.collectionName,JSON.stringify([a,l,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndReplace(a,l,s).then(function(e){t.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,a,l,s]))<2e5?JSON.stringify([e,a,l,s],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){t.finish(),console.log(new Date,"Error Find One And Replace",i.collectionName,a,s,e),c(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(),l]),c(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.findOneAndUpdate=function(a,l,s,d,u){var e=this;return void 0===a&&(a={}),void 0===d&&(d=!1),void 0===u&&(u=!1),new Promise(function(r,c){return __awaiter(e,void 0,void 0,function(){var n,o,t,i=this;return __generator(this,function(e){return!this.checkSchema||u||(n=this.simplschema.newContext(),n.validate(l,{modifier:!0}))?(this.timestamps&&(o=new Date,l.$set?l.$set.updatedAt=o:l.$set={updatedAt:o}),s&&s.upsert&&(l.$setOnInsert?(l.$setOnInsert._id||(l.$setOnInsert._id=objectIdHexString()),this.timestamps&&(l.$setOnInsert.createdAt=new Date)):this.timestamps?l.$setOnInsert={_id:objectIdHexString(),createdAt:new Date}:l.$setOnInsert={_id:objectIdHexString()}),t=new monitor_manager_1.MonitorMongo("findOneAndUpdate",this.collectionName,JSON.stringify([a,l,s])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndUpdate(a,l,s).then(function(e){t.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,a,l,s]))<2e5?JSON.stringify([e,a,l,s],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){t.finish(),console.log(new Date,"Error Find One And Update",i.collectionName,a,s,e),c(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(),l]),c(n.validationErrors())),[2]})})})},MongoManagerCollection.prototype.indexes=function(i){var r=this;return new Promise(function(n,o){var t=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){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Indexes",r.collectionName,i,e),o(e)})})},MongoManagerCollection.prototype.indexExists=function(i,r){var c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("indexExists",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).indexExists(i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Index Exists",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.insertMany=function(d,u,_,g,m){var e=this;return void 0===_&&(_=!1),void 0===g&&(g=!1),void 0===m&&(m=!1),new Promise(function(l,s){return __awaiter(e,void 0,void 0,function(){var o,n,t,i,r,c,a=this;return __generator(this,function(e){if(d.length){for(o=[],this.checkSchema&&!g&&d.forEach(function(e){var n=a.simplschema.newContext();n.validate(e)?o.push(!0):(console.log(new Date,a.collectionName,"Schema Errors - insertMany",n.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on insertMany - "+a.collectionName,[n.validationErrors(),e]),o.push(!1))}),n=this.checkSchema?d.filter(function(e,n){return o[n]}):d,t=0;t<n.length;t++)(i=n[t])._id||(i._id=objectIdHexString()),this.timestamps&&(r=new Date,i.createdAt=r,i.updatedAt=r),this.useVersions&&!i.hasOwnProperty("__v")&&(i.__v=0),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,u]))<2e5?JSON.stringify([i,u],null,2):"Too Big",method:"insertMany",id_user:"",user:"",messageId:0,route:""});n.length&&(c=null,m||(c=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){c&&c.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(n)):s(e.acknowledged)},function(e){c&&c.finish(),console.log(new Date,"Error Insert Many",a.collectionName,n,u,e),s(e)}))}else l([]);return[2]})})})},MongoManagerCollection.prototype.insertOne=function(a,l,s,d){var e=this;return void 0===s&&(s=!1),void 0===d&&(d=!1),new Promise(function(r,c){return __awaiter(e,void 0,void 0,function(){var n,o,t,i=this;return __generator(this,function(e){return a._id||(a._id=objectIdHexString()),!this.checkSchema||d||(n=this.simplschema.newContext(),n.validate(a))?(this.timestamps&&(o=new Date,a.createdAt=o,a.updatedAt=o),this.createLogs&&!s&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:a._id,payload:(0,common_1.getBinarySize)(JSON.stringify([a,l]))<2e5?JSON.stringify([a,l],null,2):"Too Big",method:"insertOne",id_user:"",user:"",messageId:0,route:""}),this.useVersions&&!a.hasOwnProperty("__v")&&(a.__v=0),t=new monitor_manager_1.MonitorMongo("insertOne",this.collectionName,JSON.stringify([a,l])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).insertOne(a,l).then(function(e){t.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(i.collectionName),r(a)):c(e.acknowledged)},function(e){t.finish(),console.log(new Date,"Error Insert One",i.collectionName,a,l,e),c(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(),a]),c(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 c=this;return new Promise(function(n,o){var t=new monitor_manager_1.MonitorMongo("rename",c.collectionName,JSON.stringify([i,r]));index_1.ResolveIOServer.getMainDB().collection(c.collectionName,c.collectionOptions).rename(i,r).then(function(e){t.finish(),n(e)},function(e){t.finish(),console.log(new Date,"Error Rename",c.collectionName,i,r,e),o(e)})})},MongoManagerCollection.prototype.replaceOne=function(h,f,v,p,M,O){var e=this;return void 0===p&&(p=!1),void 0===M&&(M=!1),void 0===O&&(O=null),new Promise(function(g,m){return __awaiter(e,void 0,void 0,function(){var n,o,t,i,r,c,a,l,s,d,u,_=this;return __generator(this,function(e){switch(e.label){case 0:return!this.checkSchema||M||(o=this.simplschema.newContext(),o.validate(f))?(n=new Date,this.timestamps&&(f.updatedAt=n),this.useVersions?O?[3,2]:[4,this.findOne(h,null,!0)]:[3,8]):(console.log(new Date,this.collectionName,"Schema Errors - replaceOne",o.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on replaceOne - "+this.collectionName,[o.validationErrors(),f]),m(o.validationErrors()),[2]);case 1:O=e.sent(),e.label=2;case 2:return O?(this.timestamps&&!f.createdAt&&O.createdAt&&(f.createdAt=O.createdAt),O.__v!==f.__v?[3,3]:(f.__v+=1,(o=(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}},o,{upsert:!0}),4<=O.__v&&index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany({$and:[{"_id._id":O._id},{"_id.__v":{$lt:O.__v-4}}]}),this.createLogs&&!p&&log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:this.collectionName,id_document:O._id,payload:(0,common_1.getBinarySize)(JSON.stringify([O,h,f,v]))<2e5?JSON.stringify([O,h,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),t=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([h,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(h,f,v).then(function(e){t.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(e.modifiedCount)):m(e.acknowledged)},function(e){t.finish(),console.log(new Date,"Error Replace One",_.collectionName,h,f,v,e),m(e)}),[3,5])):[3,6];case 3:return console.log("invalid version - "+this.collectionName,O.__v,f.__v),[4,index_1.ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({_id:{_id:O._id,__v:f.__v}},null,!0)];case 4:(i=e.sent())?(r=O._id,c=O.__v,(a=(0,common_1.getMongoMergeUpdatedDoc)(f,O,i))._id=r,a.__v=c+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",O,h,a,v]))<2e5?JSON.stringify(["invalidVersion - merge",O,h,a,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),l=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([h,a,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(h,a,v).then(function(e){l.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(e.modifiedCount)):m(e.acknowledged)},function(e){l.finish(),console.log(new Date,"Error Replace One",_.collectionName,h,a,v,e),m(e)})):m("Invalid Version And Could Not Find History - DB: "+O.__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",h,f,v]))<2e5?JSON.stringify(["upsert",h,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),s=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([h,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(h,f,v).then(function(e){s.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(e.modifiedCount)):m(e.acknowledged)},function(e){s.finish(),console.log(new Date,"Error Replace One",_.collectionName,h,f,v,e),m(e)})):m("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([h,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndReplace(h,f,v).then(function(e){d.finish();e?log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:_.collectionName,id_document:e._id,payload:(0,common_1.getBinarySize)(JSON.stringify([e,h,f,v]))<2e5?JSON.stringify([e,h,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}):log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:_.collectionName,id_document:f._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",h,f,v]))<2e5?JSON.stringify(["upsert",h,f,v],null,2):"Too Big",method:"replaceOne",id_user:"",user:"",messageId:0,route:""}),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(1)},function(e){d.finish(),console.log(new Date,"Error Find One And Replace",_.collectionName,h,f,v,e),m(e)})):(u=new monitor_manager_1.MonitorMongo("replaceOne",this.collectionName,JSON.stringify([h,f,v])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).replaceOne(h,f,v).then(function(e){u.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(_.collectionName),g(e.modifiedCount)):m(e.acknowledged)},function(e){u.finish(),console.log(new Date,"Error Replace One",_.collectionName,h,f,v,e),m(e)})),e.label=9;case 9:return[2]}})})})},MongoManagerCollection.prototype.updateMany=function(d,u,_,g,m,h){var e=this;return void 0===g&&(g=!1),void 0===m&&(m=!1),void 0===h&&(h=!1),new Promise(function(l,s){return __awaiter(e,void 0,void 0,function(){var n,o,t,i,r,c,a=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||m||(n=this.simplschema.newContext(),n.validate(u,{modifier:!0}))?this.useVersions&&!h||this.createLogs&&!g?[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]),s(n.validationErrors()),[2])):(l(1),[2]);case 1:for(o=e.sent(),t=0;t<o.length;t++)i=o[t],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,d,u,_]))<2e5?JSON.stringify([i,d,u,_],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 c=new monitor_manager_1.MonitorMongo("updateMany",this.collectionName,JSON.stringify([d,u,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateMany(d,u,_).then(function(e){c.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.modifiedCount)):s(e.acknowledged)},function(e){c.finish(),console.log(new Date,"Error Update Many",a.collectionName,d,u,_,e),s(e)}),[2]}})})})},MongoManagerCollection.prototype.updateOne=function(d,u,_,g,m){var e=this;return void 0===g&&(g=!1),void 0===m&&(m=!1),new Promise(function(l,s){return __awaiter(e,void 0,void 0,function(){var n,o,t,i,r,c,a=this;return __generator(this,function(e){switch(e.label){case 0:return!this.checkSchema||m||(o=this.simplschema.newContext(),o.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]):(l(1),[2]):(console.log(new Date,this.collectionName,"Schema Errors - updateOne",o.validationErrors()),index_1.ResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(index_1.ResolveIOServer.getMainServer().getMethodManager(),"insertErrorLog","Schema Failed on updateOne - "+this.collectionName,[o.validationErrors(),u]),s(o.validationErrors()),[2]);case 1:return(n=e.sent())?(this.createLogs&&!g&&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,_]))<2e5?JSON.stringify([n,d,u,_],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),(o=(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}},o,{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}),t=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,_).then(function(e){t.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.modifiedCount)):s(e.acknowledged)},function(e){t.finish(),console.log(new Date,"Error Update One",a.collectionName,d,u,_,e),s(e)})):_&&_.upsert?(u.$setOnInsert?(u.$setOnInsert._id||(u.$setOnInsert._id=objectIdHexString()),this.timestamps&&(u.$setOnInsert.createdAt=new Date)):this.timestamps?u.$setOnInsert={_id:objectIdHexString(),__v:0,createdAt:new Date}:u.$setOnInsert={_id:objectIdHexString(),__v:0},this.createLogs&&!g&&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,_]))<2e5?JSON.stringify(["upsert",d,u,_],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,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,_).then(function(e){i.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.modifiedCount)):s(e.acknowledged)},function(e){i.finish(),console.log(new Date,"Error Update One",a.collectionName,d,u,_,e),s(e)})):s("No Document"),[3,3];case 2:_&&_.upsert&&(u.$setOnInsert?(u.$setOnInsert._id||(u.$setOnInsert._id=objectIdHexString()),this.timestamps&&(u.$setOnInsert.createdAt=new Date)):this.timestamps?u.$setOnInsert={_id:objectIdHexString(),createdAt:new Date}:u.$setOnInsert={_id:objectIdHexString()}),this.createLogs&&!g?(_?_.returnDocument="before":_={returnDocument:"before"},r=new monitor_manager_1.MonitorMongo("findOneAndUpdate",this.collectionName,JSON.stringify([d,u,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).findOneAndUpdate(d,u,_).then(function(e){r.finish();var n=e.value;n?(log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:a.collectionName,id_document:n._id,payload:(0,common_1.getBinarySize)(JSON.stringify([n,d,u,_]))<2e5?JSON.stringify([n,d,u,_],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),l(e.ok)):u.$setOnInsert?(log_collection_1.Logs.insertOne({_id:objectIdHexString(),type:"document",collection:a.collectionName,id_document:u.$setOnInsert._id,payload:(0,common_1.getBinarySize)(JSON.stringify(["upsert",d,u,_]))<2e5?JSON.stringify(["upsert",d,u,_],null,2):"Too Big",method:"updateOne",id_user:"",user:"",messageId:0,route:""}),index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.ok)):l(0)},function(e){r.finish(),console.log(new Date,"Error Find One And Update",a.collectionName,d,u,_,e),s(e)})):(c=new monitor_manager_1.MonitorMongo("updateOne",this.collectionName,JSON.stringify([d,u,_])),index_1.ResolveIOServer.getMainDB().collection(this.collectionName,this.collectionOptions).updateOne(d,u,_).then(function(e){c.finish(),e.acknowledged?(index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(a.collectionName),l(e.modifiedCount)):s(e.acknowledged)},function(e){c.finish(),console.log(new Date,"Error Update One",a.collectionName,d,u,_,e),s(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)},MongoManagerCollection.prototype.watchCollectionWithAggregate=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(n,u){return __awaiter(void 0,void 0,void 0,function(){var i,r,c,a,l,s,d;return __generator(e,function(e){switch(e.label){case 0:return(i=n.action,r=n.collection,c=n.specs,a=n.options,l=index_1.ResolveIOServer.getMainDB().collection(r.collectionName,r.collectionOptions))?(s=new monitor_manager_1.MonitorMongo(i,r.collectionName,JSON.stringify([c,a])),[4,(d=function(){return __awaiter(void 0,void 0,void 0,function(){var n,o,t;return __generator(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,9]),[4,l[i].apply(l,__spreadArray(__spreadArray([],c,!1),[a],!1))];case 1:return o=e.sent(),s.finish(),u(null,o),[3,9];case 2:if(85!==(n=e.sent()).code&&!n.message.includes("IndexOptionsConflict"))return[3,8];e.label=3;case 3:return(e.trys.push([3,7,,8]),o=r.extractIndexNameFromError(n.message))?[4,l.dropIndex(o)]:[3,6];case 4:return e.sent(),[4,d()];case 5:return[2,e.sent()];case 6:return[3,8];case 7:return t=e.sent(),u(t),[3,8];case 8:return s.finish(),u(n),[3,9];case 9:return[2]}})})})()]):[2,u(new Error("Collection ".concat(r.collectionName," not found")))];case 1:return e.sent(),[2]}})})},1),MongoManagerCollection}()),MongoManagerUserCollection=function(e){function MongoManagerUserCollection(){return null!==e&&e.apply(this,arguments)||this}return __extends(MongoManagerUserCollection,e),MongoManagerUserCollection.prototype.authenticate=function(c,o){var e=this;return new Promise(function(i,r){return __awaiter(e,void 0,void 0,function(){var n,t=this;return __generator(this,function(e){switch(e.label){case 0:return(n=Math.pow(100,Math.log(c.attempts+1)),n=n<3e5?n:3e5,c.last)?Date.now()-c.last.getTime()<n?(c.last=new Date,[4,user_collection_1.Users.updateOne({_id:c._id},{$set:{last:c.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:c.last=new Date,e.label=4;case 4:return 5<=c.attempts?i({data:null,error:"Too Many Attempts"}):c.salt?pbkdf2(o,c.salt,{iterations:25e3,keylen:512,digestAlgorithm:"sha256"},function(n,o){return __awaiter(t,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return n?[2,r(n)]:scmp(o,Buffer.from(c.hash,"hex"))?(c.last=new Date,c.attempts=0,[4,user_collection_1.Users.updateOne({_id:c._id},{$set:{last:c.last,attempts:c.attempts}})]):[3,2];case 1:return e.sent(),i({data:c,error:""}),[3,4];case 2:return c.last=new Date,c.attempts=c.attempts+1,[4,user_collection_1.Users.updateOne({_id:c._id},{$set:{last:c.last,attempts:c.attempts}})];case 3:e.sent(),5<=c.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,c){var e=this;return new Promise(function(t,i){return __awaiter(e,void 0,void 0,function(){var n,o;return __generator(this,function(e){switch(e.label){case 0:return r?[3,1]:(i("No User"),[3,5]);case 1:return c?[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(c,n,{iterations:25e3,keylen:512,digestAlgorithm:"sha256"})];case 4:o=e.sent(),o=Buffer.from(o,"binary").toString("hex"),user_collection_1.Users.updateOne({_id:r._id},{$set:{hash:o,salt:n,services:{},attempts:0}}).then(function(e){return t(e)},function(e){return i(e)}),e.label=5;case 5:return[2]}})})})},MongoManagerUserCollection.prototype.changePassword=function(i,r,c){var e=this;return new Promise(function(o,t){return __awaiter(e,void 0,void 0,function(){var n;return __generator(this,function(e){switch(e.label){case 0:return i?[3,1]:(t("Missing User"),[3,4]);case 1:return r&&c?[3,2]:(t("Missing Password"),[3,4]);case 2:return[4,this.authenticate(i,r)];case 3:(n=e.sent()).data?this.setPassword(i,c).then(function(e){return o(e)},function(e){return t(e)}):t(n.error),e.label=4;case 4:return[2]}})})})},MongoManagerUserCollection.prototype.register=function(t,i){var e=this;return new Promise(function(n,o){return __awaiter(e,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return t.username?[3,1]:(o("Missing Username"),[3,5]);case 1:return[4,user_collection_1.Users.findOne({username:t.username})];case 2:return e.sent()?(o("Username Exists"),[3,5]):[3,3];case 3:return[4,user_collection_1.Users.findOne({email:t.email})];case 4:e.sent()?o("Email Exists"):(t.setPassword(i),n(t)),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,o,t){crypto.pbkdf2(e,n,o.iterations,o.keylen,o.digestAlgorithm,t)}function pbkdf2Promisified(e,n,i){return new Promise(function(o,t){return pbkdf2(e,n,i,function(e,n){return e?t(e):o(n)})})}function randomBytes(e){return new Promise(function(o,t){return crypto.randomBytes(e,function(e,n){return e?t(e):o(n)})})}function objectContainsPropertyDeep(e,n){var o=Object.keys(e);if(o.some(function(e){return e===n}))return!0;for(var t=0;t<o.length;t++){var i=o[t];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","MongoManager","_this","this","_collections","_mongoQueue","_mongoQueueId","_mongoQueueRunning","_mongoQueueCacheId","_heapStats","getHeapStatistics","_heapLimit","heap_size_limit","_serverCollections","_debugMongoQueueHits","_debugRemoveCacheHits","_debugMongoQueueCollections","_nodeCache","stdTTL","checkperiod","setInterval","ResolveIOServer","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","JSON","stringify","sort","a","b","name_collection","localeCompare","collection","function","initServerCollections","runQueue","prototype","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collectionOptions","timeseries","timeField","some","name","collectionName","type","dropCollection","then","createCollection","push","filter","addToQueue","mongoQueue","name_function","name_function_addt","data_function","data_function_addt","running","cbs_next","cbs","_id","splice","queueArr","i","monitor_2","monitor_1","hits","invalidateFlag","cacheId","res_1","parse","get","dateReviver","forEach","cb","_d","MonitorMongo","__spreadArray","_b","_c","apply","res","finish","invalidateCount","concat","stringifyLength","stringifyFail","replace","e","Array","isArray","addToCache","err","map","indexOf","id","data","nodeCacheSize","getStats","vsize","deleteCount","zz","queue","del","set","invalidateQueryCache","lookup_collections","includes","MongoManagerModel","exports","options","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","aggregate","pipeline","skipCache","Promise","resolve","reject","monitor","aggregateCount","cached","from","elem","index","self","aggregateCursor","cursor","on","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","__awaiter","logs","versionOps","deleteOldVersionsOps","bulkOps","updateFilters","updateManyFilters","deleteManyFilters","op","opType","Object","keys","find","$or","currentDocs","getNestedValue","doc","key","split","reduce","acc","part","item","val","undefined","findMatchingDocs","matchDocument","every","value","docValue","subFilter","evaluateCondition","condition","$in","$nin","$ne","$gt","$gte","$lt","$lte","$exists","RegExp","$regex","$options","test","date","document","objectIdHexString","this_1","hasOwnProperty","__v","createdAt","updatedAt","insertOne","id_document","payload","getBinarySize","method","id_user","user","messageId","route","update","$set","currentDoc","$inc","deleteMany","replacement","_i","operations_1","slice","mainResult","Logs","err_1","countDocuments","create","f_docs","insertMany","fieldOrSpec","indexQueue","action","specs","result","createIndexes","indexSpecs","docs","versionDoc","replaceOne","upsert","$and","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","findOne","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","validation","newContext","validate","validationErrors","getMethodManager","callMethodInternal","call","findOneAndUpdate","modifier","$setOnInsert","indexes","indexExists","bypassMonitor","validationResults","validDocs","idx","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","bypassVersions","$unset","objectContainsPropertyDeep","updateOne","monitor_13","monitor_14","monitor_15","ok","monitor_16","watchCollection","watch","watchCollectionWithAggregate","task","callback","dbCollection","code","err_2","message","existingIndexName","innerError_1","Error","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","error","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"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","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\tprivate _mongoQueueRunning = false;\n\n\tprivate _nodeCache;\n\tprivate _mongoQueueCacheId = 1;\n\n\tprivate _heapStats = v8.getHeapStatistics();\n\tprivate _heapLimit = this._heapStats.heap_size_limit / numCPUs / 8;\n\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, \"name\" | \"type\">)[] = [];\n\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\n\tconstructor() {\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\tsetInterval(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Collections', this._collections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Mongo Queue', this._mongoQueue.length, JSON.stringify(this._mongoQueue.sort((a, b) => a.name_collection.localeCompare(b.name_collection)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Server Collections', this._serverCollections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Mongo Queue Collections', this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.function.localeCompare(b.function)));\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Cache Cleanup Hits', JSON.stringify(this._debugRemoveCacheHits, null, 2));\n\t\t\t}\n\t\t\t\t\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t}, 60000);\n\n\t\tthis.initServerCollections();\n\n\t\tthis.runQueue();\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 (collection.collectionOptions && collection.collectionOptions.timeseries && collection.collectionOptions.timeseries.timeField && this._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')) {\n\t\t\tResolveIOServer.getMainDB().dropCollection(collection.collectionName).then(() => {\n\t\t\t\tthis.createCollection(collection);\n\t\t\t});\n\t\t}\n\t\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.filter(a => a.collectionName === collectionName)[0];\n\t}\n\n\taddToQueue(mongoQueue: MongoQueueModel) {\n\t\tlet _mongoQueue = this._mongoQueue.filter(a => a.name_collection === mongoQueue.name_collection && a.name_function === mongoQueue.name_function && a.name_function_addt === mongoQueue.name_function_addt && JSON.stringify(a.data_function) === JSON.stringify(mongoQueue.data_function) && JSON.stringify(a.data_function_addt) === JSON.stringify(mongoQueue.data_function_addt))[0];\n\t\t\n\t\tif (_mongoQueue) {\n\t\t\tif (!_mongoQueue.running) {\n\t\t\t\t_mongoQueue.cbs.push(mongoQueue.cbs[0]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_mongoQueue.cbs_next.push(mongoQueue.cbs[0]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tmongoQueue._id = this._mongoQueueId;\n\t\t\tthis._mongoQueueId += 1;\n\n\t\t\tthis._mongoQueue.splice(0, 0, mongoQueue);\n\t\t}\n\t}\n\n\tprivate async runQueue() {\n\t\tsetInterval(() => {\n\t\t\tif (!this._mongoQueueRunning) {\n\t\t\t\tconst queueArr = this._mongoQueue.filter(a => !a.running && a.cbs.length);\n\t\t\t\tif (queueArr.length) {\n\t\t\t\t\tthis._mongoQueueRunning = true;\n\t\t\t\t\t\n\t\t\t\t\tfor (let i = queueArr.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tthis._debugMongoQueueHits += 1;\n\n\t\t\t\t\t\tlet mongoQueue = queueArr[i];\n\n\t\t\t\t\t\tif (!this._debugMongoQueueCollections.some(a => a.collection === mongoQueue.name_collection && a.function === mongoQueue.name_function)) {\n\t\t\t\t\t\t\tthis._debugMongoQueueCollections.push({\n\t\t\t\t\t\t\t\tcollection: mongoQueue.name_collection,\n\t\t\t\t\t\t\t\tfunction: mongoQueue.name_function,\n\t\t\t\t\t\t\t\thits: 1\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\tthis._debugMongoQueueCollections.filter(a => a.collection === mongoQueue.name_collection && a.function === mongoQueue.name_function)[0].hits += 1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmongoQueue.running = true;\n\t\t\t\t\t\tmongoQueue.invalidateFlag = false;\n\n\t\t\t\t\t\tif (mongoQueue.cacheId) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tlet res = JSON.parse(this._nodeCache.get(mongoQueue.cacheId), dateReviver);\n\n\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\tcb(null, res, true);\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tmongoQueue.cbs = [];\n\t\t\t\t\t\t\t\tmongoQueue.running = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t\tmongoQueue.cacheId = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!mongoQueue.cacheId) {\n\t\t\t\t\t\t\tif (!mongoQueue.name_function_addt) {\n\t\t\t\t\t\t\t\tlet monitor = new MonitorMongo(mongoQueue.name_function, mongoQueue.name_collection, JSON.stringify(mongoQueue.data_function));\n\t\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection(mongoQueue.name_collection)[mongoQueue.name_function](...mongoQueue.data_function).then(res => {\n\t\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\t\tif (!mongoQueue.invalidateFlag) {\n\t\t\t\t\t\t\t\t\t\tmongoQueue.invalidateCount = 0;\n\n\t\t\t\t\t\t\t\t\t\tlet stringifyLength = 0;\n\t\t\t\t\t\t\t\t\t\tlet stringifyFail = false;\n\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tlet stringify = JSON.stringify(res).replace(/[\\[\\]\\,\\\"]/g,'');\n\t\t\t\t\t\t\t\t\t\t\tstringifyLength\t = stringify.length;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcatch(e) {\n\t\t\t\t\t\t\t\t\t\t\tstringifyFail = true;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (!stringifyFail && res !== null && res !== undefined && (!Array.isArray(res) || res.length) && stringifyLength < 10000000) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cacheId = this._mongoQueueCacheId;\n\t\t\t\t\t\t\t\t\t\t\tthis._mongoQueueCacheId += 1;\n\n\t\t\t\t\t\t\t\t\t\t\tthis.addToCache(mongoQueue.cacheId, res);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cacheId = 0;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\t\tcb(null, res, false);\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tif (mongoQueue.cbs_next.length) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = mongoQueue.cbs_next;\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next = [];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = [];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tif (mongoQueue.invalidateCount >= 5) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.invalidateCount = 0;\n\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\t\t\tcb(null, res, false);\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = mongoQueue.cbs.concat(mongoQueue.cbs_next);\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next = [];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tmongoQueue.running = false;\n\t\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\t\tmonitor.finish();\n\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error ' + mongoQueue.name_function, mongoQueue.name_collection, ...mongoQueue.data_function, err);\n\n\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\tcb(err, null, false);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\tcb(err, null, false);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (this._mongoQueue.map(a => a._id).indexOf(mongoQueue._id) >= 0) {\n\t\t\t\t\t\t\t\t\t\tthis._mongoQueue.splice(this._mongoQueue.map(a => a._id).indexOf(mongoQueue._id), 1);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tlet monitor = new MonitorMongo(mongoQueue.name_function, mongoQueue.name_collection, JSON.stringify([...mongoQueue.data_function, mongoQueue.name_function_addt, ...mongoQueue.data_function_addt]));\n\t\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection(mongoQueue.name_collection)[mongoQueue.name_function](...mongoQueue.data_function)[mongoQueue.name_function_addt](...mongoQueue.data_function_addt).then(res => {\n\t\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\t\tif (!mongoQueue.invalidateFlag) {\n\t\t\t\t\t\t\t\t\t\tmongoQueue.invalidateCount = 0;\n\n\t\t\t\t\t\t\t\t\t\tlet stringifyLength = 0;\n\t\t\t\t\t\t\t\t\t\tlet stringifyFail = false;\n\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tlet stringify = JSON.stringify(res).replace(/[\\[\\]\\,\\\"]/g,'');\n\t\t\t\t\t\t\t\t\t\t\tstringifyLength\t = stringify.length;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcatch(e) {\n\t\t\t\t\t\t\t\t\t\t\tstringifyFail = true;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tif (!stringifyFail && res !== null && res !== undefined && (!Array.isArray(res) || res.length) && stringifyLength < 10000000) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cacheId = this._mongoQueueCacheId;\n\t\t\t\t\t\t\t\t\t\t\tthis._mongoQueueCacheId += 1;\n\t\t\t\t\t\t\t\t\t\t\tthis.addToCache(mongoQueue.cacheId, res);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cacheId = 0;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\t\tcb(null, res, false);\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tif (mongoQueue.cbs_next.length) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = mongoQueue.cbs_next;\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next = [];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = [];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tif (mongoQueue.invalidateCount >= 5) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.invalidateCount = 0;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\t\t\tcb(null, res, false);\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = mongoQueue.cbs.concat(mongoQueue.cbs_next);\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next = [];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tmongoQueue.running = false;\n\t\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\tcb(err, null, false);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\tcb(err, null, false);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (this._mongoQueue.map(a => a._id).indexOf(mongoQueue._id) >= 0) {\n\t\t\t\t\t\t\t\t\t\tthis._mongoQueue.splice(this._mongoQueue.map(a => a._id).indexOf(mongoQueue._id), 1);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._mongoQueueRunning = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}, 25);\n\t}\n\n\tprivate addToCache(id, data) {\n\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\t\t\t\t\t\t\n\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\tlet deleteCount = 0;\n\n\t\t\tconst queueArr = this._mongoQueue.filter(a => a.cacheId && !a.running && !a.cbs.length);\n\n\t\t\tfor (let zz = queueArr.length - 1; zz >= 0; zz--) {\n\t\t\t\tthis._debugRemoveCacheHits += 1;\n\n\t\t\t\tlet queue = queueArr[zz];\n\n\t\t\t\tthis._nodeCache.del(queue.cacheId);\n\t\t\t\tqueue.cacheId = 0;\n\n\t\t\t\tif (this._mongoQueue.map(a => a._id).indexOf(queue._id) >= 0) {\n\t\t\t\t\tthis._mongoQueue.splice(this._mongoQueue.map(a => a._id).indexOf(queue._id), 1);\n\t\t\t\t}\n\n\t\t\t\tdeleteCount += 1;\n\n\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t}\n\n\t\tthis._nodeCache.set(id, JSON.stringify(data));\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tlet queueArr = this._mongoQueue.filter(a => (a.name_collection === collection || a.lookup_collections.includes(collection)));\n\t\tfor (let i = queueArr.length - 1; i >= 0; i--) {\n\t\t\tlet queue = queueArr[i];\t\t\t\n\t\t\tif (queue.cacheId) {\n\t\t\t\tthis._nodeCache.del(queue.cacheId);\n\t\t\t\tqueue.cacheId = 0;\n\t\t\t}\n\n\t\t\tif (queue.running) {\n\t\t\t\tqueue.invalidateFlag = true;\n\t\t\t\tqueue.invalidateCount += 1;\n\t\t\t}\n\t\t\telse if (!queue.cbs.length) {\n\t\t\t\tif (this._mongoQueue.map(a => a._id).indexOf(queue._id) >= 0) {\n\t\t\t\t\tthis._mongoQueue.splice(this._mongoQueue.map(a => a._id).indexOf(queue._id), 1);\n\t\t\t\t}\n\t\t\t}\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 const { action, collection, specs, options } = task;\n \n const dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n \n if (!dbCollection) {\n return callback(new Error(`Collection ${collection.collectionName} not found`));\n }\n\n let monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\n const createIndex = async () => {\n try {\n const result = await dbCollection[action](...specs, options);\n monitor.finish();\n callback(null, result);\n } catch (err) {\n if (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n try {\n const existingIndexName = collection.extractIndexNameFromError(err.message);\n if (existingIndexName) {\n await dbCollection.dropIndex(existingIndexName);\n return await createIndex();\n }\n } catch (innerError) {\n callback(innerError);\n }\n }\n monitor.finish();\n callback(err);\n }\n };\n\n await createIndex();\n }, 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\t// if (!skipCache) {\n\t\t\t// \tResolveIOServer.getMongoManager().addToQueue({\n\t\t\t// \t\t_id: 0,\n\t\t\t// \t\tname_collection: this.collectionName,\n\t\t\t// \t\tname_function: 'aggregate',\n\t\t\t// \t\tname_function_addt: 'toArray',\n\t\t\t// \t\tdata_function: [pipeline, options],\n\t\t\t// \t\tdata_function_addt: [],\n\t\t\t// \t\tcbs: [(err, res, cached) => {\n\t\t\t// \t\t\tif (err) {\n\t\t\t// \t\t\t\treject(err);\n\t\t\t// \t\t\t}\n\t\t\t// \t\t\telse {\n\t\t\t// \t\t\t\tresolve(res);\n\t\t\t// \t\t\t}\n\t\t\t// \t\t}],\n\t\t\t// \t\tcbs_next: [],\n\t\t\t// \t\trunning: false,\n\t\t\t// \t\tcacheId: 0,\n\t\t\t// \t\tlookup_collections: pipeline.filter(a => a['$lookup'] && a['$lookup'].from).map(a => a['$lookup'].from).filter((elem, index, self) => {\n\t\t\t// \t\t\treturn index === self.indexOf(elem);\n\t\t\t// \t\t}),\n\t\t\t// \t\tinvalidateFlag: false,\n\t\t\t// \t\tinvalidateCount: 0\n\t\t\t// \t});\n\t\t\t// }\n\t\t\t// else {\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\n\t\t\tlet monitor = new MonitorMongo('aggregate', 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);\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(err);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tResolveIOServer.getMongoManager().addToQueue({\n\t\t\t\t_id: 0,\n\t\t\t\tname_collection: this.collectionName,\n\t\t\t\tname_function: 'aggregate',\n\t\t\t\tname_function_addt: 'count',\n\t\t\t\tdata_function: [pipeline, options],\n\t\t\t\tdata_function_addt: [],\n\t\t\t\tcbs: [(err, res, cached) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t}\n\t\t\t\t}],\n\t\t\t\tcbs_next: [],\n\t\t\t\trunning: false,\n\t\t\t\tcacheId: 0,\n\t\t\t\tlookup_collections: pipeline.filter(a => a['$lookup'] && a['$lookup'].from).map(a => a['$lookup'].from).filter((elem, index, self) => {\n\t\t\t\t\treturn index === self.indexOf(elem);\n\t\t\t\t}),\n\t\t\t\tinvalidateFlag: false,\n\t\t\t\tinvalidateCount: 0\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tbulkWrite(operations: any[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false): Promise<BulkWriteResult> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!operations.length) {\n\t\t\t\tresolve(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = []; // For storing versioning ops\n\t\t\tconst deleteOldVersionsOps = []; // For deleteMany operations to remove older versions\n\t\t\tconst bulkOps = [];\n\t\t\tconst updateFilters = [];\n\t\t\tconst updateManyFilters = [];\n\t\t\tconst deleteManyFilters = [];\n\t\n\t\t\t// Collect filters for all operations\n\t\t\toperations.forEach(op => {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tif (opType === 'updateOne' || opType === 'deleteOne' || opType === 'replaceOne') {\n\t\t\t\t\tupdateFilters.push(op[opType].filter); // Store filters for updateOne, deleteOne, and replaceOne\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tupdateManyFilters.push(op[opType].filter); // Store the entire filter for updateMany\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\tdeleteManyFilters.push(op[opType].filter); // Store the entire filter for deleteMany\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t// Pre-fetch all documents based on the filters before proceeding with the bulk operations\n\t\t\tconst currentDocs = updateFilters.length || updateManyFilters.length || deleteManyFilters.length\n\t\t\t\t? await this.find(<any>{ $or: [...updateFilters, ...updateManyFilters, ...deleteManyFilters] })\n\t\t\t\t: [];\n\n\t\t\t// Helper function to get the value from a document using a dot-notated key (e.g., 'obj.property')\n\t\t\t// This will also handle arrays of objects (e.g., 'obj.arrayOfObjects.property')\n\t\t\tconst getNestedValue = (doc, key) => {\n\t\t\t\tconst parts = key.split('.');\n\n\t\t\t\treturn parts.reduce((acc, part) => {\n\t\t\t\t\tif (Array.isArray(acc)) {\n\t\t\t\t\t\t// If we're dealing with an array, return an array of values for each element\n\t\t\t\t\t\treturn acc.map(item => item[part]).filter(val => val !== undefined);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc && acc[part];\n\t\t\t\t}, doc);\n\t\t\t};\n\t\n\t\t\t// Helper function to locally find matching documents based on filter\n\t\t\tconst findMatchingDocs = (filter) => {\n\t\t\t\treturn currentDocs.filter(doc => {\n\t\t\t\t\treturn matchDocument(filter, doc);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst matchDocument = (filter, doc) => {\n\t\t\t\treturn Object.keys(filter).every(key => {\n\t\t\t\t\tconst value = filter[key];\n\t\t\t\t\tconst docValue = getNestedValue(doc, key); // Get nested value from the document\n\t\t\t\n\t\t\t\t\t// Handle logical operators\n\t\t\t\t\tif (key === '$and') {\n\t\t\t\t\t\treturn value.every(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tif (key === '$or') {\n\t\t\t\t\t\treturn value.some(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// If docValue is an array, apply filter conditions to each element\n\t\t\t\t\tif (Array.isArray(docValue)) {\n\t\t\t\t\t\treturn docValue.some(val => evaluateCondition(value, val));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// Otherwise, apply the condition to the single value\n\t\t\t\t\treturn evaluateCondition(value, docValue);\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\t// Helper function to evaluate the condition (value) against the document value (docValue)\n\t\t\tconst evaluateCondition = (condition, docValue) => {\n\t\t\t\t// If condition is an object, handle operators like $in, $nin, $ne, etc.\n\t\t\t\tif (condition instanceof Object) {\n\t\t\t\t\tif ('$in' in condition) {\n\t\t\t\t\t\treturn condition.$in.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$nin' in condition) {\n\t\t\t\t\t\treturn !condition.$nin.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$ne' in condition) {\n\t\t\t\t\t\treturn docValue !== condition.$ne;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gt' in condition) {\n\t\t\t\t\t\treturn docValue > condition.$gt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gte' in condition) {\n\t\t\t\t\t\treturn docValue >= condition.$gte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lt' in condition) {\n\t\t\t\t\t\treturn docValue < condition.$lt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lte' in condition) {\n\t\t\t\t\t\treturn docValue <= condition.$lte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$exists' in condition) {\n\t\t\t\t\t\treturn (docValue !== undefined) === condition.$exists;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$regex' in condition) {\n\t\t\t\t\t\tconst regex = new RegExp(condition.$regex, condition.$options || '');\n\t\t\t\t\t\treturn regex.test(docValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// Handle regular equality comparison\n\t\t\t\treturn docValue === condition;\n\t\t\t};\n\t\n\t\t\tfor (const op of operations) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tlet doc = op[opType];\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Ensure _id and __v for insertOne operations\n\t\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions && !doc.document.hasOwnProperty('__v')) {\n\t\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tlet date = new Date();\n\t\t\t\t\t\tdoc.document.createdAt = date;\n\t\t\t\t\t\tdoc.document.updatedAt = date;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Log the operation\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tbulkOps.push(op); // Add insertOne operation to bulkOps\n\t\t\t\t} \n\t\t\t\telse if (opType === 'updateOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdoc.update.$set = { updatedAt: new Date() };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(op[opType].filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(op[opType].filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\tdoc.replacement.__v = currentDoc.__v + 1;\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne') {\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\t\t\t\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoc.update.$set = {\n\t\t\t\t\t\t\t\tupdatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t// Increment __v for the update\n\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Process all documents matching the updateMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateMany operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\t// Process all documents matching the deleteMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteMany operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ttry {\n\t\t\t\tlet monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([bulkOps.slice(-100), options]));\n\t\t\t\t\n\t\t\t\t// First, perform the main bulk operations on the collection\n\t\t\t\tconst mainResult = await ResolveIOServer.getMainDB().collection<T>(this.collectionName).bulkWrite(bulkOps, options);\n\t\t\t\t\n\t\t\t\t// Separate bulkWrite for versions (if any versioning is required)\n\t\t\t\tif (versionOps.length) {\n\t\t\t\t\tawait ResolveIOServer.getMainDB().collection<T>(this.versionCollection).bulkWrite([...versionOps, ...deleteOldVersionsOps]);\n\t\t\t\t}\n\t\n\t\t\t\t// Separate bulkWrite for logs (if logging is enabled)\n\t\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\t\tawait Logs.bulkWrite(logs);\n\t\t\t\t}\n\t\n\t\t\t\tmonitor.finish();\n\t\n\t\t\t\tresolve(mainResult); // Resolve with the result of the main bulkWrite\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Bulk Write', this.collectionName, bulkOps.slice(-100), options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\tcountDocuments(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: CountDocumentsOptions): Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<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 Count Documents', 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((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndex',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndexes',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [indexSpecs],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\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: 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().addToQueue({\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tname_collection: this.collectionName,\n\t\t\t\t\tname_function: 'find',\n\t\t\t\t\tname_function_addt: 'toArray',\n\t\t\t\t\tdata_function: [filter, options],\n\t\t\t\t\tdata_function_addt: [],\n\t\t\t\t\tcbs: [(err, res, cached) => {\t\t\t\t\t\n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t}\n\t\t\t\t\t}],\n\t\t\t\t\tcbs_next: [],\n\t\t\t\t\trunning: false,\n\t\t\t\t\tcacheId: 0,\n\t\t\t\t\tlookup_collections: [],\n\t\t\t\t\tinvalidateFlag: false,\n\t\t\t\t\tinvalidateCount: 0\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().addToQueue({\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tname_collection: this.collectionName,\n\t\t\t\t\tname_function: 'findOne',\n\t\t\t\t\tname_function_addt: '',\n\t\t\t\t\tdata_function: [filter, options],\n\t\t\t\t\tdata_function_addt: [],\n\t\t\t\t\tcbs: [(err, res, cached) => {\n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t}\n\t\t\t\t\t}],\n\t\t\t\t\tcbs_next: [],\n\t\t\t\t\trunning: false,\n\t\t\t\t\tcacheId: 0,\n\t\t\t\t\tlookup_collections: [],\n\t\t\t\t\tinvalidateFlag: false,\n\t\t\t\t\tinvalidateCount: 0\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: 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: 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) {\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: 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\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\tdoc.updatedAt = date;\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\tdoc.createdAt = date;\n\t\t\t\tdoc.updatedAt = date;\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: 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) {\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) {\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\twatchCollectionWithAggregate(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","MongoManager","_this","this","_collections","_mongoQueue","_mongoQueueId","_mongoQueueRunning","_mongoQueueCacheId","_heapStats","getHeapStatistics","_heapLimit","heap_size_limit","_serverCollections","_debugMongoQueueHits","_debugRemoveCacheHits","_debugMongoQueueCollections","_nodeCache","stdTTL","checkperiod","setInterval","ResolveIOServer","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","JSON","stringify","sort","a","b","name_collection","localeCompare","collection","function","initServerCollections","runQueue","prototype","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collectionOptions","timeseries","timeField","some","name","collectionName","type","dropCollection","then","createCollection","push","filter","addToQueue","mongoQueue","name_function","name_function_addt","data_function","data_function_addt","running","cbs_next","cbs","_id","splice","queueArr","i","monitor_2","monitor_1","hits","invalidateFlag","cacheId","res_1","parse","get","dateReviver","forEach","cb","_d","MonitorMongo","__spreadArray","_b","_c","apply","res","finish","invalidateCount","concat","stringifyLength","stringifyFail","replace","e","Array","isArray","addToCache","err","map","indexOf","id","data","nodeCacheSize","getStats","vsize","deleteCount","zz","queue","del","set","invalidateQueryCache","lookup_collections","includes","MongoManagerModel","exports","options","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","aggregate","pipeline","skipCache","Promise","resolve","reject","monitor","aggregateCount","cached","from","elem","index","self","aggregateCursor","cursor","on","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","__awaiter","logs","versionOps","deleteOldVersionsOps","bulkOps","updateFilters","updateManyFilters","deleteManyFilters","op","opType","Object","keys","find","$or","currentDocs","getNestedValue","doc","key","split","reduce","acc","part","item","val","undefined","findMatchingDocs","matchDocument","every","value","docValue","subFilter","evaluateCondition","condition","$in","$nin","$ne","$gt","$gte","$lt","$lte","$exists","RegExp","$regex","$options","test","date","document","objectIdHexString","this_1","hasOwnProperty","__v","createdAt","updatedAt","insertOne","id_document","payload","getBinarySize","method","id_user","user","messageId","route","update","$set","currentDoc","$inc","deleteMany","replacement","_i","operations_1","slice","mainResult","Logs","err_1","countDocuments","create","f_docs","insertMany","fieldOrSpec","indexQueue","action","specs","result","createIndexes","indexSpecs","docs","versionDoc","replaceOne","upsert","$and","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","findOne","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","validation","newContext","validate","validationErrors","getMethodManager","callMethodInternal","call","findOneAndUpdate","modifier","$setOnInsert","indexes","indexExists","bypassMonitor","validationResults","validDocs","idx","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","bypassVersions","$unset","objectContainsPropertyDeep","updateOne","monitor_13","monitor_14","monitor_15","ok","monitor_16","watchCollection","watch","watchCollectionWithAggregate","task","callback","dbCollection","code","err_2","message","existingIndexName","innerError_1","Error","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","error","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"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","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\tprivate _mongoQueueRunning = false;\n\n\tprivate _nodeCache;\n\tprivate _mongoQueueCacheId = 1;\n\n\tprivate _heapStats = v8.getHeapStatistics();\n\tprivate _heapLimit = this._heapStats.heap_size_limit / numCPUs / 8;\n\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, \"name\" | \"type\">)[] = [];\n\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\n\tconstructor() {\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\tsetInterval(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Collections', this._collections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Mongo Queue', this._mongoQueue.length, JSON.stringify(this._mongoQueue.sort((a, b) => a.name_collection.localeCompare(b.name_collection)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Server Collections', this._serverCollections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Mongo Queue Collections', this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.function.localeCompare(b.function)));\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Cache Cleanup Hits', JSON.stringify(this._debugRemoveCacheHits, null, 2));\n\t\t\t}\n\t\t\t\t\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t}, 60000);\n\n\t\tthis.initServerCollections();\n\n\t\tthis.runQueue();\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 (collection.collectionOptions && collection.collectionOptions.timeseries && collection.collectionOptions.timeseries.timeField && this._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')) {\n\t\t\tResolveIOServer.getMainDB().dropCollection(collection.collectionName).then(() => {\n\t\t\t\tthis.createCollection(collection);\n\t\t\t});\n\t\t}\n\t\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.filter(a => a.collectionName === collectionName)[0];\n\t}\n\n\taddToQueue(mongoQueue: MongoQueueModel) {\n\t\tlet _mongoQueue = this._mongoQueue.filter(a => a.name_collection === mongoQueue.name_collection && a.name_function === mongoQueue.name_function && a.name_function_addt === mongoQueue.name_function_addt && JSON.stringify(a.data_function) === JSON.stringify(mongoQueue.data_function) && JSON.stringify(a.data_function_addt) === JSON.stringify(mongoQueue.data_function_addt))[0];\n\t\t\n\t\tif (_mongoQueue) {\n\t\t\tif (!_mongoQueue.running) {\n\t\t\t\t_mongoQueue.cbs.push(mongoQueue.cbs[0]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_mongoQueue.cbs_next.push(mongoQueue.cbs[0]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tmongoQueue._id = this._mongoQueueId;\n\t\t\tthis._mongoQueueId += 1;\n\n\t\t\tthis._mongoQueue.splice(0, 0, mongoQueue);\n\t\t}\n\t}\n\n\tprivate async runQueue() {\n\t\tsetInterval(() => {\n\t\t\tif (!this._mongoQueueRunning) {\n\t\t\t\tconst queueArr = this._mongoQueue.filter(a => !a.running && a.cbs.length);\n\t\t\t\tif (queueArr.length) {\n\t\t\t\t\tthis._mongoQueueRunning = true;\n\t\t\t\t\t\n\t\t\t\t\tfor (let i = queueArr.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tthis._debugMongoQueueHits += 1;\n\n\t\t\t\t\t\tlet mongoQueue = queueArr[i];\n\n\t\t\t\t\t\tif (!this._debugMongoQueueCollections.some(a => a.collection === mongoQueue.name_collection && a.function === mongoQueue.name_function)) {\n\t\t\t\t\t\t\tthis._debugMongoQueueCollections.push({\n\t\t\t\t\t\t\t\tcollection: mongoQueue.name_collection,\n\t\t\t\t\t\t\t\tfunction: mongoQueue.name_function,\n\t\t\t\t\t\t\t\thits: 1\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\tthis._debugMongoQueueCollections.filter(a => a.collection === mongoQueue.name_collection && a.function === mongoQueue.name_function)[0].hits += 1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmongoQueue.running = true;\n\t\t\t\t\t\tmongoQueue.invalidateFlag = false;\n\n\t\t\t\t\t\tif (mongoQueue.cacheId) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tlet res = JSON.parse(this._nodeCache.get(mongoQueue.cacheId), dateReviver);\n\n\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\tcb(null, res, true);\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tmongoQueue.cbs = [];\n\t\t\t\t\t\t\t\tmongoQueue.running = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t\tmongoQueue.cacheId = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!mongoQueue.cacheId) {\n\t\t\t\t\t\t\tif (!mongoQueue.name_function_addt) {\n\t\t\t\t\t\t\t\tlet monitor = new MonitorMongo(mongoQueue.name_function, mongoQueue.name_collection, JSON.stringify(mongoQueue.data_function));\n\t\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection(mongoQueue.name_collection)[mongoQueue.name_function](...mongoQueue.data_function).then(res => {\n\t\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\t\tif (!mongoQueue.invalidateFlag) {\n\t\t\t\t\t\t\t\t\t\tmongoQueue.invalidateCount = 0;\n\n\t\t\t\t\t\t\t\t\t\tlet stringifyLength = 0;\n\t\t\t\t\t\t\t\t\t\tlet stringifyFail = false;\n\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tlet stringify = JSON.stringify(res).replace(/[\\[\\]\\,\\\"]/g,'');\n\t\t\t\t\t\t\t\t\t\t\tstringifyLength\t = stringify.length;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcatch(e) {\n\t\t\t\t\t\t\t\t\t\t\tstringifyFail = true;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (!stringifyFail && res !== null && res !== undefined && (!Array.isArray(res) || res.length) && stringifyLength < 10000000) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cacheId = this._mongoQueueCacheId;\n\t\t\t\t\t\t\t\t\t\t\tthis._mongoQueueCacheId += 1;\n\n\t\t\t\t\t\t\t\t\t\t\tthis.addToCache(mongoQueue.cacheId, res);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cacheId = 0;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\t\tcb(null, res, false);\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tif (mongoQueue.cbs_next.length) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = mongoQueue.cbs_next;\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next = [];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = [];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tif (mongoQueue.invalidateCount >= 5) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.invalidateCount = 0;\n\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\t\t\tcb(null, res, false);\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = mongoQueue.cbs.concat(mongoQueue.cbs_next);\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next = [];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tmongoQueue.running = false;\n\t\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\t\tmonitor.finish();\n\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error ' + mongoQueue.name_function, mongoQueue.name_collection, ...mongoQueue.data_function, err);\n\n\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\tcb(err, null, false);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\tcb(err, null, false);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (this._mongoQueue.map(a => a._id).indexOf(mongoQueue._id) >= 0) {\n\t\t\t\t\t\t\t\t\t\tthis._mongoQueue.splice(this._mongoQueue.map(a => a._id).indexOf(mongoQueue._id), 1);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tlet monitor = new MonitorMongo(mongoQueue.name_function, mongoQueue.name_collection, JSON.stringify([...mongoQueue.data_function, mongoQueue.name_function_addt, ...mongoQueue.data_function_addt]));\n\t\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection(mongoQueue.name_collection)[mongoQueue.name_function](...mongoQueue.data_function)[mongoQueue.name_function_addt](...mongoQueue.data_function_addt).then(res => {\n\t\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\t\tif (!mongoQueue.invalidateFlag) {\n\t\t\t\t\t\t\t\t\t\tmongoQueue.invalidateCount = 0;\n\n\t\t\t\t\t\t\t\t\t\tlet stringifyLength = 0;\n\t\t\t\t\t\t\t\t\t\tlet stringifyFail = false;\n\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tlet stringify = JSON.stringify(res).replace(/[\\[\\]\\,\\\"]/g,'');\n\t\t\t\t\t\t\t\t\t\t\tstringifyLength\t = stringify.length;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcatch(e) {\n\t\t\t\t\t\t\t\t\t\t\tstringifyFail = true;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tif (!stringifyFail && res !== null && res !== undefined && (!Array.isArray(res) || res.length) && stringifyLength < 10000000) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cacheId = this._mongoQueueCacheId;\n\t\t\t\t\t\t\t\t\t\t\tthis._mongoQueueCacheId += 1;\n\t\t\t\t\t\t\t\t\t\t\tthis.addToCache(mongoQueue.cacheId, res);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cacheId = 0;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\t\tcb(null, res, false);\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tif (mongoQueue.cbs_next.length) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = mongoQueue.cbs_next;\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next = [];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = [];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tif (mongoQueue.invalidateCount >= 5) {\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.invalidateCount = 0;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\t\t\tcb(null, res, false);\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs = mongoQueue.cbs.concat(mongoQueue.cbs_next);\n\t\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next = [];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tmongoQueue.running = false;\n\t\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tmongoQueue.cbs.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\tcb(err, null, false);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\t\t\t\t\tmongoQueue.cbs_next.forEach(cb => {\n\t\t\t\t\t\t\t\t\t\tcb(err, null, false);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (this._mongoQueue.map(a => a._id).indexOf(mongoQueue._id) >= 0) {\n\t\t\t\t\t\t\t\t\t\tthis._mongoQueue.splice(this._mongoQueue.map(a => a._id).indexOf(mongoQueue._id), 1);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._mongoQueueRunning = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}, 25);\n\t}\n\n\tprivate addToCache(id, data) {\n\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\t\t\t\t\t\t\n\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\tlet deleteCount = 0;\n\n\t\t\tconst queueArr = this._mongoQueue.filter(a => a.cacheId && !a.running && !a.cbs.length);\n\n\t\t\tfor (let zz = queueArr.length - 1; zz >= 0; zz--) {\n\t\t\t\tthis._debugRemoveCacheHits += 1;\n\n\t\t\t\tlet queue = queueArr[zz];\n\n\t\t\t\tthis._nodeCache.del(queue.cacheId);\n\t\t\t\tqueue.cacheId = 0;\n\n\t\t\t\tif (this._mongoQueue.map(a => a._id).indexOf(queue._id) >= 0) {\n\t\t\t\t\tthis._mongoQueue.splice(this._mongoQueue.map(a => a._id).indexOf(queue._id), 1);\n\t\t\t\t}\n\n\t\t\t\tdeleteCount += 1;\n\n\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t}\n\n\t\tthis._nodeCache.set(id, JSON.stringify(data));\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tlet queueArr = this._mongoQueue.filter(a => (a.name_collection === collection || a.lookup_collections.includes(collection)));\n\t\tfor (let i = queueArr.length - 1; i >= 0; i--) {\n\t\t\tlet queue = queueArr[i];\t\t\t\n\t\t\tif (queue.cacheId) {\n\t\t\t\tthis._nodeCache.del(queue.cacheId);\n\t\t\t\tqueue.cacheId = 0;\n\t\t\t}\n\n\t\t\tif (queue.running) {\n\t\t\t\tqueue.invalidateFlag = true;\n\t\t\t\tqueue.invalidateCount += 1;\n\t\t\t}\n\t\t\telse if (!queue.cbs.length) {\n\t\t\t\tif (this._mongoQueue.map(a => a._id).indexOf(queue._id) >= 0) {\n\t\t\t\t\tthis._mongoQueue.splice(this._mongoQueue.map(a => a._id).indexOf(queue._id), 1);\n\t\t\t\t}\n\t\t\t}\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 const { action, collection, specs, options } = task;\n \n const dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n \n if (!dbCollection) {\n return callback(new Error(`Collection ${collection.collectionName} not found`));\n }\n\n let monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\n const createIndex = async () => {\n try {\n const result = await dbCollection[action](...specs, options);\n monitor.finish();\n callback(null, result);\n } catch (err) {\n if (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n try {\n const existingIndexName = collection.extractIndexNameFromError(err.message);\n if (existingIndexName) {\n await dbCollection.dropIndex(existingIndexName);\n return await createIndex();\n }\n } catch (innerError) {\n callback(innerError);\n }\n }\n monitor.finish();\n callback(err);\n }\n };\n\n await createIndex();\n }, 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\t// if (!skipCache) {\n\t\t\t// \tResolveIOServer.getMongoManager().addToQueue({\n\t\t\t// \t\t_id: 0,\n\t\t\t// \t\tname_collection: this.collectionName,\n\t\t\t// \t\tname_function: 'aggregate',\n\t\t\t// \t\tname_function_addt: 'toArray',\n\t\t\t// \t\tdata_function: [pipeline, options],\n\t\t\t// \t\tdata_function_addt: [],\n\t\t\t// \t\tcbs: [(err, res, cached) => {\n\t\t\t// \t\t\tif (err) {\n\t\t\t// \t\t\t\treject(err);\n\t\t\t// \t\t\t}\n\t\t\t// \t\t\telse {\n\t\t\t// \t\t\t\tresolve(res);\n\t\t\t// \t\t\t}\n\t\t\t// \t\t}],\n\t\t\t// \t\tcbs_next: [],\n\t\t\t// \t\trunning: false,\n\t\t\t// \t\tcacheId: 0,\n\t\t\t// \t\tlookup_collections: pipeline.filter(a => a['$lookup'] && a['$lookup'].from).map(a => a['$lookup'].from).filter((elem, index, self) => {\n\t\t\t// \t\t\treturn index === self.indexOf(elem);\n\t\t\t// \t\t}),\n\t\t\t// \t\tinvalidateFlag: false,\n\t\t\t// \t\tinvalidateCount: 0\n\t\t\t// \t});\n\t\t\t// }\n\t\t\t// else {\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\n\t\t\tlet monitor = new MonitorMongo('aggregate', 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);\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(err);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tResolveIOServer.getMongoManager().addToQueue({\n\t\t\t\t_id: 0,\n\t\t\t\tname_collection: this.collectionName,\n\t\t\t\tname_function: 'aggregate',\n\t\t\t\tname_function_addt: 'count',\n\t\t\t\tdata_function: [pipeline, options],\n\t\t\t\tdata_function_addt: [],\n\t\t\t\tcbs: [(err, res, cached) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t}\n\t\t\t\t}],\n\t\t\t\tcbs_next: [],\n\t\t\t\trunning: false,\n\t\t\t\tcacheId: 0,\n\t\t\t\tlookup_collections: pipeline.filter(a => a['$lookup'] && a['$lookup'].from).map(a => a['$lookup'].from).filter((elem, index, self) => {\n\t\t\t\t\treturn index === self.indexOf(elem);\n\t\t\t\t}),\n\t\t\t\tinvalidateFlag: false,\n\t\t\t\tinvalidateCount: 0\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tbulkWrite(operations: any[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false): Promise<BulkWriteResult> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!operations.length) {\n\t\t\t\tresolve(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = []; // For storing versioning ops\n\t\t\tconst deleteOldVersionsOps = []; // For deleteMany operations to remove older versions\n\t\t\tconst bulkOps = [];\n\t\t\tconst updateFilters = [];\n\t\t\tconst updateManyFilters = [];\n\t\t\tconst deleteManyFilters = [];\n\t\n\t\t\t// Collect filters for all operations\n\t\t\toperations.forEach(op => {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tif (opType === 'updateOne' || opType === 'deleteOne' || opType === 'replaceOne') {\n\t\t\t\t\tupdateFilters.push(op[opType].filter); // Store filters for updateOne, deleteOne, and replaceOne\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tupdateManyFilters.push(op[opType].filter); // Store the entire filter for updateMany\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\tdeleteManyFilters.push(op[opType].filter); // Store the entire filter for deleteMany\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t// Pre-fetch all documents based on the filters before proceeding with the bulk operations\n\t\t\tconst currentDocs = updateFilters.length || updateManyFilters.length || deleteManyFilters.length\n\t\t\t\t? await this.find(<any>{ $or: [...updateFilters, ...updateManyFilters, ...deleteManyFilters] })\n\t\t\t\t: [];\n\n\t\t\t// Helper function to get the value from a document using a dot-notated key (e.g., 'obj.property')\n\t\t\t// This will also handle arrays of objects (e.g., 'obj.arrayOfObjects.property')\n\t\t\tconst getNestedValue = (doc, key) => {\n\t\t\t\tconst parts = key.split('.');\n\n\t\t\t\treturn parts.reduce((acc, part) => {\n\t\t\t\t\tif (Array.isArray(acc)) {\n\t\t\t\t\t\t// If we're dealing with an array, return an array of values for each element\n\t\t\t\t\t\treturn acc.map(item => item[part]).filter(val => val !== undefined);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc && acc[part];\n\t\t\t\t}, doc);\n\t\t\t};\n\t\n\t\t\t// Helper function to locally find matching documents based on filter\n\t\t\tconst findMatchingDocs = (filter) => {\n\t\t\t\treturn currentDocs.filter(doc => {\n\t\t\t\t\treturn matchDocument(filter, doc);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst matchDocument = (filter, doc) => {\n\t\t\t\treturn Object.keys(filter).every(key => {\n\t\t\t\t\tconst value = filter[key];\n\t\t\t\t\tconst docValue = getNestedValue(doc, key); // Get nested value from the document\n\t\t\t\n\t\t\t\t\t// Handle logical operators\n\t\t\t\t\tif (key === '$and') {\n\t\t\t\t\t\treturn value.every(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tif (key === '$or') {\n\t\t\t\t\t\treturn value.some(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// If docValue is an array, apply filter conditions to each element\n\t\t\t\t\tif (Array.isArray(docValue)) {\n\t\t\t\t\t\treturn docValue.some(val => evaluateCondition(value, val));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// Otherwise, apply the condition to the single value\n\t\t\t\t\treturn evaluateCondition(value, docValue);\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\t// Helper function to evaluate the condition (value) against the document value (docValue)\n\t\t\tconst evaluateCondition = (condition, docValue) => {\n\t\t\t\t// If condition is an object, handle operators like $in, $nin, $ne, etc.\n\t\t\t\tif (condition instanceof Object) {\n\t\t\t\t\tif ('$in' in condition) {\n\t\t\t\t\t\treturn condition.$in.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$nin' in condition) {\n\t\t\t\t\t\treturn !condition.$nin.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$ne' in condition) {\n\t\t\t\t\t\treturn docValue !== condition.$ne;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gt' in condition) {\n\t\t\t\t\t\treturn docValue > condition.$gt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gte' in condition) {\n\t\t\t\t\t\treturn docValue >= condition.$gte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lt' in condition) {\n\t\t\t\t\t\treturn docValue < condition.$lt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lte' in condition) {\n\t\t\t\t\t\treturn docValue <= condition.$lte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$exists' in condition) {\n\t\t\t\t\t\treturn (docValue !== undefined) === condition.$exists;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$regex' in condition) {\n\t\t\t\t\t\tconst regex = new RegExp(condition.$regex, condition.$options || '');\n\t\t\t\t\t\treturn regex.test(docValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// Handle regular equality comparison\n\t\t\t\treturn docValue === condition;\n\t\t\t};\n\t\n\t\t\tfor (const op of operations) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tlet doc = op[opType];\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Ensure _id and __v for insertOne operations\n\t\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions && !doc.document.hasOwnProperty('__v')) {\n\t\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tlet date = new Date();\n\t\t\t\t\t\tdoc.document.createdAt = date;\n\t\t\t\t\t\tdoc.document.updatedAt = date;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Log the operation\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tbulkOps.push(op); // Add insertOne operation to bulkOps\n\t\t\t\t} \n\t\t\t\telse if (opType === 'updateOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdoc.update.$set = { updatedAt: new Date() };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(op[opType].filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(op[opType].filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\tdoc.replacement.__v = currentDoc.__v + 1;\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne') {\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\t\t\t\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoc.update.$set = {\n\t\t\t\t\t\t\t\tupdatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t// Increment __v for the update\n\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Process all documents matching the updateMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateMany operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\t// Process all documents matching the deleteMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tcurrentDoc._id = <any>{_id: currentDoc._id, __v: currentDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: currentDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (currentDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: currentDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteMany operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ttry {\n\t\t\t\tif (bulkOps.length) {\n\t\t\t\t\tlet monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([bulkOps.slice(-100), options]));\n\t\t\t\t\t\n\t\t\t\t\t// First, perform the main bulk operations on the collection\n\t\t\t\t\tconst mainResult = await ResolveIOServer.getMainDB().collection<T>(this.collectionName).bulkWrite(bulkOps, options);\n\t\t\t\t\t\n\t\t\t\t\t// Separate bulkWrite for versions (if any versioning is required)\n\t\t\t\t\tif (versionOps.length || deleteOldVersionsOps.length) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection<T>(this.versionCollection).bulkWrite([...versionOps, ...deleteOldVersionsOps]);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\t// Separate bulkWrite for logs (if logging is enabled)\n\t\t\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\t\t\tawait Logs.bulkWrite(logs);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tmonitor.finish();\n\t\n\t\t\t\t\tresolve(mainResult); // Resolve with the result of the main bulkWrite\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Bulk Write', this.collectionName, bulkOps.slice(-100), options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\tcountDocuments(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: CountDocumentsOptions): Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<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 Count Documents', 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((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndex',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndexes',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [indexSpecs],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\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: 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().addToQueue({\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tname_collection: this.collectionName,\n\t\t\t\t\tname_function: 'find',\n\t\t\t\t\tname_function_addt: 'toArray',\n\t\t\t\t\tdata_function: [filter, options],\n\t\t\t\t\tdata_function_addt: [],\n\t\t\t\t\tcbs: [(err, res, cached) => {\t\t\t\t\t\n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t}\n\t\t\t\t\t}],\n\t\t\t\t\tcbs_next: [],\n\t\t\t\t\trunning: false,\n\t\t\t\t\tcacheId: 0,\n\t\t\t\t\tlookup_collections: [],\n\t\t\t\t\tinvalidateFlag: false,\n\t\t\t\t\tinvalidateCount: 0\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().addToQueue({\n\t\t\t\t\t_id: 0,\n\t\t\t\t\tname_collection: this.collectionName,\n\t\t\t\t\tname_function: 'findOne',\n\t\t\t\t\tname_function_addt: '',\n\t\t\t\t\tdata_function: [filter, options],\n\t\t\t\t\tdata_function_addt: [],\n\t\t\t\t\tcbs: [(err, res, cached) => {\n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t}\n\t\t\t\t\t}],\n\t\t\t\t\tcbs_next: [],\n\t\t\t\t\trunning: false,\n\t\t\t\t\tcacheId: 0,\n\t\t\t\t\tlookup_collections: [],\n\t\t\t\t\tinvalidateFlag: false,\n\t\t\t\t\tinvalidateCount: 0\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: 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: 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) {\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: 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\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\tdoc.updatedAt = date;\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\tdoc.createdAt = date;\n\t\t\t\tdoc.updatedAt = date;\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: 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) {\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) {\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\twatchCollectionWithAggregate(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}"]}
|