@resolveio/server-lib 20.4.17 → 20.4.18
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 __awaiter=this&&this.__awaiter||function(e,n,o,s){return new(o=o||Promise)(function(i,t){function fulfilled(e){try{step(s.next(e))}catch(e){t(e)}}function rejected(e){try{step(s.throw(e))}catch(e){t(e)}}function step(e){var t;e.done?i(e.value):((t=e.value)instanceof o?t:new o(function(e){e(t)})).then(fulfilled,rejected)}step((s=s.apply(e,n||[])).next())})},__generator=this&&this.__generator||function(n,o){var s,r,a,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(u[Symbol.iterator]=function(){return this}),u;function verb(i){return function(e){var t=[i,e];if(s)throw new TypeError("Generator is already executing.");for(;c=u&&t[u=0]?0:c;)try{if(s=1,r&&(a=2&t[0]?r.return:t[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,t[1])).done)return a;switch(r=0,(t=a?[2&t[0],a.value]:t)[0]){case 0:case 1:a=t;break;case 4:return c.label++,{value:t[1],done:!1};case 5:c.label++,r=t[1],t=[0];continue;case 7:t=c.ops.pop(),c.trys.pop();continue;default:if(!(a=0<(a=c.trys).length&&a[a.length-1])&&(6===t[0]||2===t[0])){c=0;continue}if(3===t[0]&&(!a||t[1]>a[0]&&t[1]<a[3]))c.label=t[1];else if(6===t[0]&&c.label<a[1])c.label=a[1],a=t;else{if(!(a&&c.label<a[2])){a[2]&&c.ops.pop(),c.trys.pop();continue}c.label=a[2],c.ops.push(t)}}t=o.call(n,c)}catch(e){t=[6,e],r=0}finally{s=a=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},__values=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,i=t&&e[t],n=0;if(i)return i.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&n>=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},__read=this&&this.__read||function(e,t){var i="function"==typeof Symbol&&e[Symbol.iterator];if(!i)return e;var n,o,s=i.call(e),r=[];try{for(;(void 0===t||0<t--)&&!(n=s.next()).done;)r.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(i=s.return)&&i.call(s)}finally{if(o)throw o.error}}return r},__spreadArray=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var n,o=0,s=t.length;o<s;o++)!n&&o in t||((n=n||Array.prototype.slice.call(t,0,o))[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},logs_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.SubscriptionManager=void 0,require("../publications/logs")),app_status_1=require("../publications/app-status"),files_1=require("../publications/files"),super_admin_1=require("../publications/super-admin"),logged_in_users_collection_1=require("../collections/logged-in-users.collection"),cron_jobs_1=require("../publications/cron-jobs"),flags_1=require("../publications/flags"),method_responses_1=require("../publications/method-responses"),index_1=require("../index"),notifications_1=require("../publications/notifications"),report_builder_reports_1=require("../publications/report-builder-reports"),report_builder_libraries_1=require("../publications/report-builder-libraries"),user_groups_1=require("../publications/user-groups"),user_guides_1=require("../publications/user-guides"),report_builder_dashboard_builders_1=require("../publications/report-builder-dashboard-builders"),mongo_manager_1=require("./mongo.manager"),common_1=require("../util/common"),NodeCache=require("node-cache"),flag_collection_1=require("../collections/flag.collection"),os_1=require("os"),numCPUs=(0,os_1.cpus)().length,v8=require("v8"),SubscriptionManager=function(){function SubscriptionManager(e,t,i,n){var o=this;this._publications={},this._subscriptions=[],this._loggedInUsers=[],this._mongoQueue=[],this._mongoQueueId=0,this._cacheId=1,this._heapSize=v8.getHeapStatistics()/numCPUs,this._enableDebug=!1,this._debugOplogCollections=[],this._debugOplogHits=0,this._debugSubCollections=[],this._debugSubHits=0,this._debugUnSubHits=0,this._debugUnSubAllHits=0,this._debugMongoQueueHits=0,this._debugMongoQueueCollections=[],this._debugSendQueueHits=0,this._debugRemoveCacheHits=0,this._oplogRetryCount=0,this._mainServer=e,this._websocketManager=this._mainServer.getWebSocketManager(),this._monitorManagerFunction=n,this._nodeCache=new NodeCache({stdTTL:0,checkperiod:0}),this.serverConfig=i,this._wss=t,(0,super_admin_1.loadSuperAdminPublications)(this),(0,app_status_1.loadAppStatusPublications)(this),(0,logs_1.loadLogPublications)(this),(0,files_1.loadFilePublications)(this),(0,cron_jobs_1.loadCronJobPublications)(this),(0,flags_1.loadFlagsPublications)(this),(0,method_responses_1.loadMethodResponsePublications)(this),(0,notifications_1.loadNotificationPublications)(this),(0,report_builder_reports_1.loadReportBuilderReportPublications)(this),(0,report_builder_libraries_1.loadReportBuilderLibraryPublications)(this),(0,user_groups_1.loadUserGroupPublications)(this),(0,user_guides_1.loadUserGuidePublications)(this),(0,report_builder_dashboard_builders_1.loadReportBuilderDashboardBuilderPublications)(this),this.tailOpLog(),setInterval(function(){o._oplogRetryCount=0},15e3),setInterval(function(){o.getEnableDebug()&&(console.log(new Date,"Sub Manager","Subs",o._subscriptions.length),console.log(new Date,"Sub Manager","Logged In Users",o._loggedInUsers.length),console.log(new Date,"Sub Manager","Mongo Queue",o._mongoQueue.length),console.log(new Date,"Sub Manager","Mongo Queue Hits",o._debugMongoQueueHits),console.log(new Date,"Sub Manager","Mongo Queue Collections",JSON.stringify(o._debugMongoQueueCollections.sort(function(e,t){return e.collection.localeCompare(t.collection)||e.publication.localeCompare(t.publication)}),null,2)),console.log(new Date,"Sub Manager","Oplog Hits",o._debugOplogHits),console.log(new Date,"Sub Manager","Oplog Collections",JSON.stringify(o._debugOplogCollections.sort(function(e,t){return e.collection.localeCompare(t.collection)||e.type.localeCompare(t.type)}),null,2)),console.log(new Date,"Sub Manager","Send Queue Hits",o._debugSendQueueHits),console.log(new Date,"Sub Manager","Sub Hits",o._debugSubHits),console.log(new Date,"Sub Manager","Sub Collections",JSON.stringify(o._debugSubCollections.sort(function(e,t){return e.publication.localeCompare(t.publication)}),null,2)),console.log(new Date,"Sub Manager","Unsub Hits",o._debugUnSubHits),console.log(new Date,"Sub Manager","Unsub All Hits",o._debugUnSubAllHits),console.log(new Date,"Sub Manager","Cache Cleanup Hits",o._debugRemoveCacheHits)),o._debugOplogHits=0,o._debugOplogCollections=[],o._debugSubCollections=[],o._debugMongoQueueHits=0,o._debugMongoQueueCollections=[],o._debugSendQueueHits=0,o._debugSubHits=0,o._debugUnSubHits=0,o._debugUnSubAllHits=0,o._debugRemoveCacheHits=0},6e4),setInterval(function(){return __awaiter(o,void 0,void 0,function(){var t,n,i,o,s,r,a,c,u;return __generator(this,function(e){switch(e.label){case 0:return t=this,[4,logged_in_users_collection_1.LoggedInUsers.find()];case 1:for(t._loggedInUsers=e.sent(),n=(0,common_1.deepCopy)(this._loggedInUsers),i=function(e){var i=n[e];(!i.date||12e4<Date.now()-i.date.getTime())&&(o._websocketManager.getWebSocket(i.id_ws)?(o.getEnableDebug()&&console.log(new Date,"Sub Manager","Unsub WS",o._websocketManager.getWebSocket(i.id_ws).user,o._websocketManager.getWebSocket(i.id_ws).id_socket,2),o.unsubscribeAll(o._websocketManager.getWebSocket(i.id_ws))):(o._subscriptions.forEach(function(e){for(var t=e.clients.length-1;0<=t;t--)e.clients[t].id_socket===i.id_ws&&e.clients.splice(t,1)}),logged_in_users_collection_1.LoggedInUsers.deleteOne({_id:i._id}),0<=o._loggedInUsers.findIndex(function(e){return e._id===i._id})&&o._loggedInUsers.splice(o._loggedInUsers.findIndex(function(e){return e._id===i._id}),1)))},s=(o=this)._loggedInUsers.length-1;0<=s;s--)i(s);for(s=0;s<this._subscriptions.length;s++)for(r=this._subscriptions[s],a=function(e){var t=r.clients[e];c._loggedInUsers.some(function(e){return e.id_ws===t.id_socket})||r.clients.splice(e,1)},c=this,u=r.clients.length-1;0<=u;u--)a(u);return[2]}})})},3e4),flag_collection_1.Flags.findOne({type:"Enable Debug"}).then(function(e){e&&e.value?o._enableDebug=!0:o._enableDebug=!1}),this.setCacheLimit()}return SubscriptionManager.prototype.setCacheLimit=function(){"true"===process.env.IS_WORKERS_ENABLED?this._heapLimit=.4*this._heapSize:this._heapLimit=.3*this._heapSize},SubscriptionManager.prototype.invalidatePubsCache=function(l,g){return __awaiter(this,void 0,void 0,function(){var t,i,o,n,s,r,a,c,u=this;return __generator(this,function(e){index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(l),t=this._subscriptions.filter(function(e){return e.collections.includes(l)}),i=function(n){o._publications[n.publication].user_specific?Promise.all(n.clients.map(function(i){return __awaiter(u,void 0,void 0,function(){var t;return __generator(this,function(e){if((t=this._websocketManager.getWebSocket(i.id_socket))&&t.readyState===t.OPEN)try{this.sendDataToOne(t,i.messageId,n,g,l)}catch(e){this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+this.serverConfig.CLIENT_NAME,"Error Detected During sendDataToOne - User Specific - Socket: "+i.id_socket+", User: "+i.id_user+", MessageId: "+i.messageId+", Pub: "+n.publication+", Err: "+JSON.stringify(e,null,2))}return[2]})})})):o.sendDataToAll(n)},o=this;try{for(n=__values(t),s=n.next();!s.done;s=n.next())r=s.value,i(r)}catch(e){a={error:e}}finally{try{s&&!s.done&&(c=n.return)&&c.call(n)}finally{if(a)throw a.error}}return[2]})})},SubscriptionManager.prototype.publications=function(e){this._publications=Object.assign(this._publications,e)},SubscriptionManager.prototype.loggedInLatency=function(t){var i=this,e=this._loggedInUsers.find(function(e){return e.id_ws===t.id_socket});e&&(e.date=new Date,logged_in_users_collection_1.LoggedInUsers.updateOne({id_ws:t.id_socket},{$set:{latency:t.latency,date:e.date}}).then(function(e){e||(i.unsubscribeAll(t),i.getEnableDebug()&&console.log(new Date,"Sub Manager","Unsub WS",t.user,t.id_socket,3))},function(){i.unsubscribeAll(t),i.getEnableDebug()&&console.log(new Date,"Sub Manager","Unsub WS",t.user,t.id_socket,4)}))},SubscriptionManager.prototype.subscribe=function(t,e,i,n,o,s){var r=this,a=(this._debugSubHits+=1,this._debugSubCollections.some(function(e){return e.publication===o})?this._debugSubCollections.find(function(e){return e.publication===o}).hits+=1:this._debugSubCollections.push({publication:o,hits:1}),this._publications[o]);if(a){if(1<s.length||s[0]){if(!a.check)return void console.error(new Date,"No Check Function For Pub "+o);if(!a.check._schema)return void console.error(new Date,"No Check Schema For Pub "+o);for(var c={},u=Object.keys(a.check._schema).filter(function(e){return!e.includes(".")}),l=0;l<s.length;l++)c[u[l]]=s[l];try{a.check.validate(c)}catch(e){if(e)return void console.error(new Date,"Error in Pub Check ("+o+")",e)}}"Bypass"!==t&&(a=t.split("/"),g="",_=a[0],""===a[0]&&(g="/",_=a[1]),g+=_,1<a.length&&(g+="/"),(_=this._subscriptions.filter(function(e){return e.clients.some(function(e){return e.id_socket===i.id_socket&&"Bypass"!==e.messageRoute&&"/"!==e.messageRoute&&e.messageRoute!==t&&!e.messageRoute.startsWith(g)})})).length)&&(this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Detected Undestroyed Subscription - "+this.serverConfig.CLIENT_NAME,"USER: "+i.user+" (Socket: "+i.id_socket+") is on route: "+t+" but has the following subscriptions on other routes:"+JSON.stringify(_,null,2)),_.forEach(function(t){t.clients.filter(function(e){return e.id_socket===i.id_socket}).forEach(function(e){r.unsubscribe(e.messageRoute,new Date,i,e.messageId,t.publication,t.subscriptionData)})}));var g,_,a=this._subscriptions.find(function(e){return e.publication===o&&JSON.stringify(e.subscriptionData)===JSON.stringify(s)});a?a.clients.some(function(e){return e.id_socket===i.id_socket&&e.messageId===n})||a.clients.push({id_user:i.id_user,messageId:n,id_socket:i.id_socket,messageRoute:t}):this._subscriptions.push({publication:o,subscriptionData:s,collections:this.getPublicationCollections(o),clients:[{id_user:i.id_user,messageId:n,id_socket:i.id_socket,messageRoute:t}],cacheId:0}),a=a||this._subscriptions.find(function(e){return e.publication===o&&JSON.stringify(e.subscriptionData)===JSON.stringify(s)}),this.processSubscription(a,i,n)}else console.error(new Date,"No Publication: "+o)},SubscriptionManager.prototype.createLoggedInUser=function(n){return __awaiter(this,void 0,void 0,function(){var t=this;return __generator(this,function(e){return[2,new Promise(function(i,e){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n))?(t={_id:(0,mongo_manager_1.objectIdHexString)(),__v:0,date:new Date,id_user:t.id_user,user:t.user,id_ws:t.id_socket},this._loggedInUsers.push(t),logged_in_users_collection_1.LoggedInUsers.insertOne(t),i(t)):i(null),[2]})})})]})})},SubscriptionManager.prototype.unsubscribe=function(e,t,i,n,o,s){if(this._debugUnSubHits+=1,this._publications[o]){var r=this._subscriptions.find(function(e){return e.publication===o&&JSON.stringify(e.subscriptionData)===JSON.stringify(s)});if(r)for(var a=r.clients.length-1;0<=a;a--)r.clients[a].id_user===i.id_user&&r.clients[a].messageId===n&&r.clients[a].id_socket===i.id_socket&&r.clients.splice(a,1)}else console.log("No Publication: "+o)},SubscriptionManager.prototype.unsubscribeAll=function(r){return __awaiter(this,void 0,void 0,function(){var t,i,n,o,s;return __generator(this,function(e){switch(e.label){case 0:return(this._debugUnSubAllHits+=1,r)?[4,logged_in_users_collection_1.LoggedInUsers.findOne({id_ws:r.id_socket})]:[3,2];case 1:for((t=e.sent())&&(0<=this._loggedInUsers.map(function(e){return e._id}).indexOf(t._id)&&this._loggedInUsers.splice(this._loggedInUsers.map(function(e){return e._id}).indexOf(t._id),1),logged_in_users_collection_1.LoggedInUsers.deleteOne({_id:t._id})),i=this._subscriptions.filter(function(e){return e.clients.some(function(e){return e.id_user===r.id_user&&e.id_socket===r.id_socket})}),n=i.length-1;0<=n;n--)for(o=i[n],s=o.clients.length-1;0<=s;s--)o.clients[s].id_socket===r.id_socket&&o.clients.splice(s,1);this._websocketManager.removeWebSocket(r),e.label=2;case 2:return[2]}})})},SubscriptionManager.prototype.getActiveSubscriptions=function(){return this._subscriptions},SubscriptionManager.prototype.getPublicationCollections=function(e){return this._publications[e].collections},SubscriptionManager.prototype.tailOpLog=function(t){return __awaiter(this,void 0,void 0,function(){var i,n=this;return __generator(this,function(e){switch(e.label){case 0:return this._oplog$&&!this._oplog$.closed&&(this._oplog$.removeAllListeners(),this._oplog$.close(),this._oplog$=null),[4,new Promise(function(e){return setTimeout(e,1e3)})];case 1:if(e.sent(),!this._oplog$||this._oplog$.closed){if(this._oplogRetryCount+=1,5<this._oplogRetryCount&&(console.error("****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************"),process.exit(1)),t){i=t;try{this._oplog$=index_1.ResolveIOServer.getMainDB().watch([],{resumeAfter:t})}catch(e){return this._oplog$&&(this._oplog$.removeAllListeners(),this._oplog$.close(),this._oplog$=null),this.tailOpLog(t),[2]}}else this._oplog$=index_1.ResolveIOServer.getMainDB().watch();console.log(new Date,"oplog started"),this._oplog$.on("change",function(t){var e;t.ns&&(e=t.ns.coll,n._debugOplogCollections.some(function(e){return e.collection===t.ns.coll&&e.type===t.operationType})?n._debugOplogCollections.find(function(e){return e.collection===t.ns.coll&&e.type===t.operationType}).hits+=1:n._debugOplogCollections.push({collection:t.ns.coll,type:t.operationType,hits:1}),!e||e.endsWith(".versions")||e.startsWith("monitor-")||"logs"===e||"log-method-latencies"===e||"log-subscriptions"===e||(n._debugOplogHits+=1,"insert"===t.operationType?("support-tickets"===e&&"https://resolveio.com"===n.serverConfig.ROOT_URL&&(n._mainServer.getMethodManager().callMethodInternal.call(n._mainServer.getMethodManager(),"sendSupportTicketEmail",t.documentKey._id),n.invalidatePubsCache(e,"insert")),"method-responses"!==e&&n.invalidatePubsCache(e,"insert")):"update"===t.operationType||"replace"===t.operationType?"method-responses"!==e&&n.invalidatePubsCache(e,"update"):"delete"===t.operationType&&"method-responses"!==e&&n.invalidatePubsCache(e,"delete")),"flags"===e&&flag_collection_1.Flags.findOne({type:"Enable Debug"}).then(function(e){e&&e.value?n._enableDebug=!0:n._enableDebug=!1}),i=t._id)}),this._oplog$.on("error",function(e){console.log(new Date,"oplog error",e),n._oplog$.removeAllListeners(),n._oplog$.close(),n._oplog$=null,n.tailOpLog(i)}),this._oplog$.on("end",function(){console.log(new Date,"oplog end"),n._oplog$.removeAllListeners(),n._oplog$.close(),n._oplog$=null,n.tailOpLog(i)}),this._oplog$.on("close",function(){console.log(new Date,"oplog close"),n._oplog$.removeAllListeners(),n._oplog$=null,n.tailOpLog(i)})}return[2]}})})},SubscriptionManager.prototype.processSubscription=function(n,o,s){return __awaiter(this,void 0,void 0,function(){var t,i;return __generator(this,function(e){if(this._publications[n.publication].user_specific)this.sendDataToOne(o,s,n,"newSub",n.collections[0]);else if(n.cacheId)try{t=JSON.parse(this._nodeCache.get(n.cacheId),common_1.dateReviver),i={messageId:s,hasError:!1,data:t},this.sendWS(o,i)}catch(e){this._nodeCache.del(n.cacheId),n.cacheId=0,this.sendDataToAll(n)}else this.sendDataToAll(n);return[2]})})},SubscriptionManager.prototype.sendDataToOne=function(s,r,a,e,t){return __awaiter(this,void 0,void 0,function(){var t,i,n,o;return __generator(this,function(e){switch(e.label){case 0:t=this._monitorManagerFunction.startMonitorFunction("User Specific Publication",a.publication,"","",a.subscriptionData),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(o=this._publications[a.publication].function).call.apply(o,__spreadArray([Object.assign({},this,SubscriptionManager.prototype),s.id_user],__read(a.subscriptionData),!1))];case 2:return o=e.sent(),this._monitorManagerFunction.finishMonitorFunction(t),n={messageId:r,hasError:!1,data:o},this.sendWS(s,n),[3,4];case 3:return i=e.sent(),this._monitorManagerFunction.finishMonitorFunction(t),n={messageId:r,hasError:!0,data:i},this.sendWS(s,n),this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+this.serverConfig.CLIENT_NAME,"Error Detected During Subscription "+a.publication+" - (sendDataToOne - WS)\n\nData \n"+JSON.stringify(a.subscriptionData,null,2)+"\n\nErrors\n"+JSON.stringify(i,null,2)),[3,4];case 4:return[2]}})})},SubscriptionManager.prototype.sendDataToAll=function(g){return __awaiter(this,void 0,void 0,function(){var t,o,i,n,s,r,a,c,u,l=this;return __generator(this,function(e){switch(e.label){case 0:return g.clients.length?[3,1]:(g.cacheId&&(this._nodeCache.del(g.cacheId),g.cacheId=0),0<=(u=this._subscriptions.findIndex(function(e){return e.publication===g.publication&&JSON.stringify(e.subscriptionData)===JSON.stringify(g.subscriptionData)}))&&this._subscriptions.splice(u,1),[2]);case 1:t=this._monitorManagerFunction.startMonitorFunction("Publication",g.publication,"","",g.subscriptionData),e.label=2;case 2:return e.trys.push([2,4,,5]),[4,(u=this._publications[g.publication].function).call.apply(u,__spreadArray([Object.assign({},this,SubscriptionManager.prototype)],__read(g.subscriptionData),!1))];case 3:if(o=e.sent(),this._monitorManagerFunction.finishMonitorFunction(t),g.cacheId)try{i=JSON.parse(this._nodeCache.get(g.cacheId),common_1.dateReviver),JSON.stringify(i)!==JSON.stringify(o)&&(Promise.all(g.clients.map(function(n){return __awaiter(l,void 0,void 0,function(){var t,i;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n.id_socket))&&t.readyState===t.OPEN&&(i={messageId:n.messageId,hasError:!1,data:o},this.sendWS(t,i)),[2]})})})),this._nodeCache.del(g.cacheId),g.cacheId=0,!o||Array.isArray(o)&&!o.length||(g.cacheId=this._cacheId++,this._nodeCache.set(g.cacheId,JSON.stringify(o))))}catch(e){Promise.all(g.clients.map(function(n){return __awaiter(l,void 0,void 0,function(){var t,i;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n.id_socket))&&t.readyState===t.OPEN&&(i={messageId:n.messageId,hasError:!1,data:o},this.sendWS(t,i)),[2]})})})),this._nodeCache.del(g.cacheId),g.cacheId=0,!o||Array.isArray(o)&&!o.length||(g.cacheId=this._cacheId++,this._nodeCache.set(g.cacheId,JSON.stringify(o)))}else if(Promise.all(g.clients.map(function(n){return __awaiter(l,void 0,void 0,function(){var t,i;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n.id_socket))&&t.readyState===t.OPEN&&(i={messageId:n.messageId,hasError:!1,data:o},this.sendWS(t,i)),[2]})})})),o&&(!Array.isArray(o)||o.length)&&(g.cacheId=this._cacheId++,this._nodeCache.set(g.cacheId,JSON.stringify(o)),(n=this._nodeCache.getStats().vsize)>this._heapLimit)){for(s=0,r=this._subscriptions.filter(function(e){return e.cacheId&&!e.clients.length}),a=0;a<r.length&&(this._debugRemoveCacheHits+=1,this._nodeCache.del(r[a].cacheId),r[a].cacheId=0,s+=1,!(this._nodeCache.getStats().vsize<.75*this._heapLimit));a++);this._enableDebug&&console.log("Sub Cache: Too Big - "+g.publication+" - Deleted: "+s+" - "+n)}return[3,5];case 4:return c=e.sent(),this._monitorManagerFunction.finishMonitorFunction(t),Promise.all(g.clients.map(function(n){return __awaiter(l,void 0,void 0,function(){var t,i;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n.id_socket))&&t.readyState===t.OPEN&&(i={messageId:n.messageId,hasError:!0,data:c},this.sendWS(t,i)),[2]})})})),this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+this.serverConfig.CLIENT_NAME,"Error Detected During Subscription "+g.publication+" - (sendPubData)\n\nData \n"+JSON.stringify(g.subscriptionData,null,2)+"\n\nErrors\n"+JSON.stringify(c,null,2)),[3,5];case 5:return[2]}})})},SubscriptionManager.prototype.sendWS=function(e,t){this._websocketManager.send(e,t)},SubscriptionManager.prototype.getEnableDebug=function(){return this._enableDebug},SubscriptionManager}();exports.SubscriptionManager=SubscriptionManager;
|
|
1
|
+
"use strict";var __awaiter=this&&this.__awaiter||function(e,n,o,s){return new(o=o||Promise)(function(i,t){function fulfilled(e){try{step(s.next(e))}catch(e){t(e)}}function rejected(e){try{step(s.throw(e))}catch(e){t(e)}}function step(e){var t;e.done?i(e.value):((t=e.value)instanceof o?t:new o(function(e){e(t)})).then(fulfilled,rejected)}step((s=s.apply(e,n||[])).next())})},__generator=this&&this.__generator||function(n,o){var s,r,a,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(u[Symbol.iterator]=function(){return this}),u;function verb(i){return function(e){var t=[i,e];if(s)throw new TypeError("Generator is already executing.");for(;c=u&&t[u=0]?0:c;)try{if(s=1,r&&(a=2&t[0]?r.return:t[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,t[1])).done)return a;switch(r=0,(t=a?[2&t[0],a.value]:t)[0]){case 0:case 1:a=t;break;case 4:return c.label++,{value:t[1],done:!1};case 5:c.label++,r=t[1],t=[0];continue;case 7:t=c.ops.pop(),c.trys.pop();continue;default:if(!(a=0<(a=c.trys).length&&a[a.length-1])&&(6===t[0]||2===t[0])){c=0;continue}if(3===t[0]&&(!a||t[1]>a[0]&&t[1]<a[3]))c.label=t[1];else if(6===t[0]&&c.label<a[1])c.label=a[1],a=t;else{if(!(a&&c.label<a[2])){a[2]&&c.ops.pop(),c.trys.pop();continue}c.label=a[2],c.ops.push(t)}}t=o.call(n,c)}catch(e){t=[6,e],r=0}finally{s=a=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},__values=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,i=t&&e[t],n=0;if(i)return i.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&n>=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},__read=this&&this.__read||function(e,t){var i="function"==typeof Symbol&&e[Symbol.iterator];if(!i)return e;var n,o,s=i.call(e),r=[];try{for(;(void 0===t||0<t--)&&!(n=s.next()).done;)r.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(i=s.return)&&i.call(s)}finally{if(o)throw o.error}}return r},__spreadArray=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var n,o=0,s=t.length;o<s;o++)!n&&o in t||((n=n||Array.prototype.slice.call(t,0,o))[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},logs_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.SubscriptionManager=void 0,require("../publications/logs")),app_status_1=require("../publications/app-status"),files_1=require("../publications/files"),super_admin_1=require("../publications/super-admin"),logged_in_users_collection_1=require("../collections/logged-in-users.collection"),cron_jobs_1=require("../publications/cron-jobs"),flags_1=require("../publications/flags"),method_responses_1=require("../publications/method-responses"),index_1=require("../index"),notifications_1=require("../publications/notifications"),report_builder_reports_1=require("../publications/report-builder-reports"),report_builder_libraries_1=require("../publications/report-builder-libraries"),user_groups_1=require("../publications/user-groups"),user_guides_1=require("../publications/user-guides"),report_builder_dashboard_builders_1=require("../publications/report-builder-dashboard-builders"),mongo_manager_1=require("./mongo.manager"),common_1=require("../util/common"),NodeCache=require("node-cache"),flag_collection_1=require("../collections/flag.collection"),os_1=require("os"),numCPUs=(0,os_1.cpus)().length,v8=require("v8"),SubscriptionManager=function(){function SubscriptionManager(e,t,i,n){var o=this;this._publications={},this._subscriptions=[],this._loggedInUsers=[],this._mongoQueue=[],this._mongoQueueId=0,this._cacheId=1,this._heapSize=v8.getHeapStatistics()/numCPUs,this._enableDebug=!1,this._debugOplogCollections=[],this._debugOplogHits=0,this._debugSubCollections=[],this._debugSubHits=0,this._debugUnSubHits=0,this._debugUnSubAllHits=0,this._debugMongoQueueHits=0,this._debugMongoQueueCollections=[],this._debugSendQueueHits=0,this._debugRemoveCacheHits=0,this._oplogRetryCount=0,this._mainServer=e,this._websocketManager=this._mainServer.getWebSocketManager(),this._monitorManagerFunction=n,this._nodeCache=new NodeCache({stdTTL:0,checkperiod:0}),this.serverConfig=i,this._wss=t,(0,super_admin_1.loadSuperAdminPublications)(this),(0,app_status_1.loadAppStatusPublications)(this),(0,logs_1.loadLogPublications)(this),(0,files_1.loadFilePublications)(this),(0,cron_jobs_1.loadCronJobPublications)(this),(0,flags_1.loadFlagsPublications)(this),(0,method_responses_1.loadMethodResponsePublications)(this),(0,notifications_1.loadNotificationPublications)(this),(0,report_builder_reports_1.loadReportBuilderReportPublications)(this),(0,report_builder_libraries_1.loadReportBuilderLibraryPublications)(this),(0,user_groups_1.loadUserGroupPublications)(this),(0,user_guides_1.loadUserGuidePublications)(this),(0,report_builder_dashboard_builders_1.loadReportBuilderDashboardBuilderPublications)(this),this.tailOpLog(),setInterval(function(){o._oplogRetryCount=0},15e3),setInterval(function(){o.getEnableDebug()&&(console.log(new Date,"Sub Manager","Subs",o._subscriptions.length),console.log(new Date,"Sub Manager","Logged In Users",o._loggedInUsers.length),console.log(new Date,"Sub Manager","Mongo Queue",o._mongoQueue.length),console.log(new Date,"Sub Manager","Mongo Queue Hits",o._debugMongoQueueHits),console.log(new Date,"Sub Manager","Mongo Queue Collections",JSON.stringify(o._debugMongoQueueCollections.sort(function(e,t){return e.collection.localeCompare(t.collection)||e.publication.localeCompare(t.publication)}),null,2)),console.log(new Date,"Sub Manager","Oplog Hits",o._debugOplogHits),console.log(new Date,"Sub Manager","Oplog Collections",JSON.stringify(o._debugOplogCollections.sort(function(e,t){return e.collection.localeCompare(t.collection)||e.type.localeCompare(t.type)}),null,2)),console.log(new Date,"Sub Manager","Send Queue Hits",o._debugSendQueueHits),console.log(new Date,"Sub Manager","Sub Hits",o._debugSubHits),console.log(new Date,"Sub Manager","Sub Collections",JSON.stringify(o._debugSubCollections.sort(function(e,t){return e.publication.localeCompare(t.publication)}),null,2)),console.log(new Date,"Sub Manager","Unsub Hits",o._debugUnSubHits),console.log(new Date,"Sub Manager","Unsub All Hits",o._debugUnSubAllHits),console.log(new Date,"Sub Manager","Cache Cleanup Hits",o._debugRemoveCacheHits)),o._debugOplogHits=0,o._debugOplogCollections=[],o._debugSubCollections=[],o._debugMongoQueueHits=0,o._debugMongoQueueCollections=[],o._debugSendQueueHits=0,o._debugSubHits=0,o._debugUnSubHits=0,o._debugUnSubAllHits=0,o._debugRemoveCacheHits=0},6e4),setInterval(function(){return __awaiter(o,void 0,void 0,function(){var t,n,i,o,s,r,a,c,u;return __generator(this,function(e){switch(e.label){case 0:return t=this,[4,logged_in_users_collection_1.LoggedInUsers.find()];case 1:for(t._loggedInUsers=e.sent(),n=(0,common_1.deepCopy)(this._loggedInUsers),i=function(e){var i=n[e];(!i.date||12e4<Date.now()-i.date.getTime())&&(o._websocketManager.getWebSocket(i.id_ws)?(o.getEnableDebug()&&console.log(new Date,"Sub Manager","Unsub WS",o._websocketManager.getWebSocket(i.id_ws).user,o._websocketManager.getWebSocket(i.id_ws).id_socket,2),o.unsubscribeAll(o._websocketManager.getWebSocket(i.id_ws))):(o._subscriptions.forEach(function(e){for(var t=e.clients.length-1;0<=t;t--)e.clients[t].id_socket===i.id_ws&&e.clients.splice(t,1)}),logged_in_users_collection_1.LoggedInUsers.deleteOne({_id:i._id}),0<=o._loggedInUsers.findIndex(function(e){return e._id===i._id})&&o._loggedInUsers.splice(o._loggedInUsers.findIndex(function(e){return e._id===i._id}),1)))},s=(o=this)._loggedInUsers.length-1;0<=s;s--)i(s);for(s=0;s<this._subscriptions.length;s++)for(r=this._subscriptions[s],a=function(e){var t=r.clients[e];c._loggedInUsers.some(function(e){return e.id_ws===t.id_socket})||r.clients.splice(e,1)},c=this,u=r.clients.length-1;0<=u;u--)a(u);return[2]}})})},3e4),flag_collection_1.Flags.findOne({type:"Enable Debug"}).then(function(e){e&&e.value?o._enableDebug=!0:o._enableDebug=!1}),this.setCacheLimit()}return SubscriptionManager.prototype.setCacheLimit=function(){"true"===process.env.IS_WORKERS_ENABLED?this._heapLimit=.4*this._heapSize:this._heapLimit=.3*this._heapSize},SubscriptionManager.prototype.invalidatePubsCache=function(l,_){return __awaiter(this,void 0,void 0,function(){var t,i,o,n,s,r,a,c,u=this;return __generator(this,function(e){index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(l),t=this._subscriptions.filter(function(e){return e.collections.includes(l)}),i=function(n){o._publications[n.publication].user_specific?Promise.all(n.clients.map(function(i){return __awaiter(u,void 0,void 0,function(){var t;return __generator(this,function(e){if((t=this._websocketManager.getWebSocket(i.id_socket))&&t.readyState===t.OPEN)try{this.sendDataToOne(t,i.messageId,n,_,l)}catch(e){this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+this.serverConfig.CLIENT_NAME,"Error Detected During sendDataToOne - User Specific - Socket: "+i.id_socket+", User: "+i.id_user+", MessageId: "+i.messageId+", Pub: "+n.publication+", Err: "+JSON.stringify(e,null,2))}return[2]})})})):o.sendDataToAll(n)},o=this;try{for(n=__values(t),s=n.next();!s.done;s=n.next())r=s.value,i(r)}catch(e){a={error:e}}finally{try{s&&!s.done&&(c=n.return)&&c.call(n)}finally{if(a)throw a.error}}return[2]})})},SubscriptionManager.prototype.publications=function(e){this._publications=Object.assign(this._publications,e)},SubscriptionManager.prototype.loggedInLatency=function(t){var i=this,e=this._loggedInUsers.find(function(e){return e.id_ws===t.id_socket});e&&(e.date=new Date,logged_in_users_collection_1.LoggedInUsers.updateOne({id_ws:t.id_socket},{$set:{latency:t.latency,date:e.date}}).then(function(e){e||(i.unsubscribeAll(t),i.getEnableDebug()&&console.log(new Date,"Sub Manager","Unsub WS",t.user,t.id_socket,3))},function(){i.unsubscribeAll(t),i.getEnableDebug()&&console.log(new Date,"Sub Manager","Unsub WS",t.user,t.id_socket,4)}))},SubscriptionManager.prototype.subscribe=function(t,e,i,n,o,s){var r=this,a=(this._debugSubHits+=1,this._debugSubCollections.some(function(e){return e.publication===o})?this._debugSubCollections.find(function(e){return e.publication===o}).hits+=1:this._debugSubCollections.push({publication:o,hits:1}),this._publications[o]);if(a){if(1<s.length||s[0]){if(!a.check)return void console.error(new Date,"No Check Function For Pub "+o);if(!a.check._schema)return void console.error(new Date,"No Check Schema For Pub "+o);for(var c={},u=Object.keys(a.check._schema).filter(function(e){return!e.includes(".")}),l=0;l<s.length;l++)c[u[l]]=s[l];try{a.check.validate(c)}catch(e){if(e)return void console.error(new Date,"Error in Pub Check ("+o+")",e)}}"Bypass"!==t&&(a=t.split("/"),_="",g=a[0],""===a[0]&&(_="/",g=a[1]),_+=g,1<a.length&&(_+="/"),(g=this._subscriptions.filter(function(e){return e.clients.some(function(e){return e.id_socket===i.id_socket&&"Bypass"!==e.messageRoute&&"/"!==e.messageRoute&&e.messageRoute!==t&&!e.messageRoute.startsWith(_)})})).length)&&(this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Detected Undestroyed Subscription - "+this.serverConfig.CLIENT_NAME,"USER: "+i.user+" (Socket: "+i.id_socket+") is on route: "+t+" but has the following subscriptions on other routes:"+JSON.stringify(g,null,2)),g.forEach(function(t){t.clients.filter(function(e){return e.id_socket===i.id_socket}).forEach(function(e){r.unsubscribe(e.messageRoute,new Date,i,e.messageId,t.publication,t.subscriptionData)})}));var _,g,a=this._subscriptions.find(function(e){return e.publication===o&&JSON.stringify(e.subscriptionData)===JSON.stringify(s)});a?a.clients.some(function(e){return e.id_socket===i.id_socket&&e.messageId===n})||a.clients.push({id_user:i.id_user,messageId:n,id_socket:i.id_socket,messageRoute:t}):this._subscriptions.push({publication:o,subscriptionData:s,collections:this.getPublicationCollections(o),clients:[{id_user:i.id_user,messageId:n,id_socket:i.id_socket,messageRoute:t}],cacheId:0}),a=a||this._subscriptions.find(function(e){return e.publication===o&&JSON.stringify(e.subscriptionData)===JSON.stringify(s)}),this.processSubscription(a,i,n)}else console.error(new Date,"No Publication: "+o)},SubscriptionManager.prototype.createLoggedInUser=function(n){return __awaiter(this,void 0,void 0,function(){var t=this;return __generator(this,function(e){return[2,new Promise(function(i,e){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n))?(t={_id:(0,mongo_manager_1.objectIdHexString)(),__v:0,date:new Date,id_user:t.id_user,user:t.user,id_ws:t.id_socket},this._loggedInUsers.push(t),logged_in_users_collection_1.LoggedInUsers.insertOne(t),i(t)):i(null),[2]})})})]})})},SubscriptionManager.prototype.unsubscribe=function(e,t,i,n,o,s){if(this._debugUnSubHits+=1,this._publications[o]){var r=this._subscriptions.find(function(e){return e.publication===o&&JSON.stringify(e.subscriptionData)===JSON.stringify(s)});if(r)for(var a=r.clients.length-1;0<=a;a--)r.clients[a].id_user===i.id_user&&r.clients[a].messageId===n&&r.clients[a].id_socket===i.id_socket&&r.clients.splice(a,1)}else console.log("No Publication: "+o)},SubscriptionManager.prototype.unsubscribeAll=function(s){return __awaiter(this,void 0,void 0,function(){var t,i,n,o;return __generator(this,function(e){if(this._debugUnSubAllHits+=1,s){for(0<=this._loggedInUsers.map(function(e){return e.id_ws}).indexOf(s.id_socket)&&this._loggedInUsers.splice(this._loggedInUsers.map(function(e){return e.id_ws}).indexOf(s.id_socket),1),logged_in_users_collection_1.LoggedInUsers.deleteOne({id_ws:s.id_socket}),t=this._subscriptions.filter(function(e){return e.clients.some(function(e){return e.id_user===s.id_user&&e.id_socket===s.id_socket})}),i=t.length-1;0<=i;i--)for(n=t[i],o=n.clients.length-1;0<=o;o--)n.clients[o].id_socket===s.id_socket&&n.clients.splice(o,1);this._websocketManager.removeWebSocket(s)}return[2]})})},SubscriptionManager.prototype.getActiveSubscriptions=function(){return this._subscriptions},SubscriptionManager.prototype.getPublicationCollections=function(e){return this._publications[e].collections},SubscriptionManager.prototype.tailOpLog=function(t){return __awaiter(this,void 0,void 0,function(){var i,n=this;return __generator(this,function(e){switch(e.label){case 0:return this._oplog$&&!this._oplog$.closed&&(this._oplog$.removeAllListeners(),this._oplog$.close(),this._oplog$=null),[4,new Promise(function(e){return setTimeout(e,1e3)})];case 1:if(e.sent(),!this._oplog$||this._oplog$.closed){if(this._oplogRetryCount+=1,5<this._oplogRetryCount&&(console.error("****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************"),process.exit(1)),t){i=t;try{this._oplog$=index_1.ResolveIOServer.getMainDB().watch([],{resumeAfter:t})}catch(e){return this._oplog$&&(this._oplog$.removeAllListeners(),this._oplog$.close(),this._oplog$=null),this.tailOpLog(t),[2]}}else this._oplog$=index_1.ResolveIOServer.getMainDB().watch();console.log(new Date,"oplog started"),this._oplog$.on("change",function(t){var e;t.ns&&(e=t.ns.coll,n._debugOplogCollections.some(function(e){return e.collection===t.ns.coll&&e.type===t.operationType})?n._debugOplogCollections.find(function(e){return e.collection===t.ns.coll&&e.type===t.operationType}).hits+=1:n._debugOplogCollections.push({collection:t.ns.coll,type:t.operationType,hits:1}),!e||e.endsWith(".versions")||e.startsWith("monitor-")||"logs"===e||"log-method-latencies"===e||"log-subscriptions"===e||(n._debugOplogHits+=1,"insert"===t.operationType?("support-tickets"===e&&"https://resolveio.com"===n.serverConfig.ROOT_URL&&(n._mainServer.getMethodManager().callMethodInternal.call(n._mainServer.getMethodManager(),"sendSupportTicketEmail",t.documentKey._id),n.invalidatePubsCache(e,"insert")),"method-responses"!==e&&n.invalidatePubsCache(e,"insert")):"update"===t.operationType||"replace"===t.operationType?"method-responses"!==e&&n.invalidatePubsCache(e,"update"):"delete"===t.operationType&&"method-responses"!==e&&n.invalidatePubsCache(e,"delete")),"flags"===e&&flag_collection_1.Flags.findOne({type:"Enable Debug"}).then(function(e){e&&e.value?n._enableDebug=!0:n._enableDebug=!1}),i=t._id)}),this._oplog$.on("error",function(e){console.log(new Date,"oplog error",e),n._oplog$.removeAllListeners(),n._oplog$.close(),n._oplog$=null,n.tailOpLog(i)}),this._oplog$.on("end",function(){console.log(new Date,"oplog end"),n._oplog$.removeAllListeners(),n._oplog$.close(),n._oplog$=null,n.tailOpLog(i)}),this._oplog$.on("close",function(){console.log(new Date,"oplog close"),n._oplog$.removeAllListeners(),n._oplog$=null,n.tailOpLog(i)})}return[2]}})})},SubscriptionManager.prototype.processSubscription=function(n,o,s){return __awaiter(this,void 0,void 0,function(){var t,i;return __generator(this,function(e){if(this._publications[n.publication].user_specific)this.sendDataToOne(o,s,n,"newSub",n.collections[0]);else if(n.cacheId)try{t=JSON.parse(this._nodeCache.get(n.cacheId),common_1.dateReviver),i={messageId:s,hasError:!1,data:t},this.sendWS(o,i)}catch(e){this._nodeCache.del(n.cacheId),n.cacheId=0,this.sendDataToAll(n)}else this.sendDataToAll(n);return[2]})})},SubscriptionManager.prototype.sendDataToOne=function(s,r,a,e,t){return __awaiter(this,void 0,void 0,function(){var t,i,n,o;return __generator(this,function(e){switch(e.label){case 0:t=this._monitorManagerFunction.startMonitorFunction("User Specific Publication",a.publication,"","",a.subscriptionData),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(o=this._publications[a.publication].function).call.apply(o,__spreadArray([Object.assign({},this,SubscriptionManager.prototype),s.id_user],__read(a.subscriptionData),!1))];case 2:return o=e.sent(),this._monitorManagerFunction.finishMonitorFunction(t),n={messageId:r,hasError:!1,data:o},this.sendWS(s,n),[3,4];case 3:return i=e.sent(),this._monitorManagerFunction.finishMonitorFunction(t),n={messageId:r,hasError:!0,data:i},this.sendWS(s,n),this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+this.serverConfig.CLIENT_NAME,"Error Detected During Subscription "+a.publication+" - (sendDataToOne - WS)\n\nData \n"+JSON.stringify(a.subscriptionData,null,2)+"\n\nErrors\n"+JSON.stringify(i,null,2)),[3,4];case 4:return[2]}})})},SubscriptionManager.prototype.sendDataToAll=function(_){return __awaiter(this,void 0,void 0,function(){var t,o,i,n,s,r,a,c,u,l=this;return __generator(this,function(e){switch(e.label){case 0:return _.clients.length?[3,1]:(_.cacheId&&(this._nodeCache.del(_.cacheId),_.cacheId=0),0<=(u=this._subscriptions.findIndex(function(e){return e.publication===_.publication&&JSON.stringify(e.subscriptionData)===JSON.stringify(_.subscriptionData)}))&&this._subscriptions.splice(u,1),[2]);case 1:t=this._monitorManagerFunction.startMonitorFunction("Publication",_.publication,"","",_.subscriptionData),e.label=2;case 2:return e.trys.push([2,4,,5]),[4,(u=this._publications[_.publication].function).call.apply(u,__spreadArray([Object.assign({},this,SubscriptionManager.prototype)],__read(_.subscriptionData),!1))];case 3:if(o=e.sent(),this._monitorManagerFunction.finishMonitorFunction(t),_.cacheId)try{i=JSON.parse(this._nodeCache.get(_.cacheId),common_1.dateReviver),JSON.stringify(i)!==JSON.stringify(o)&&(Promise.all(_.clients.map(function(n){return __awaiter(l,void 0,void 0,function(){var t,i;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n.id_socket))&&t.readyState===t.OPEN&&(i={messageId:n.messageId,hasError:!1,data:o},this.sendWS(t,i)),[2]})})})),this._nodeCache.del(_.cacheId),_.cacheId=this._cacheId++,this._nodeCache.set(_.cacheId,JSON.stringify(o)))}catch(e){Promise.all(_.clients.map(function(n){return __awaiter(l,void 0,void 0,function(){var t,i;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n.id_socket))&&t.readyState===t.OPEN&&(i={messageId:n.messageId,hasError:!1,data:o},this.sendWS(t,i)),[2]})})})),this._nodeCache.del(_.cacheId),_.cacheId=this._cacheId++,this._nodeCache.set(_.cacheId,JSON.stringify(o))}else if(Promise.all(_.clients.map(function(n){return __awaiter(l,void 0,void 0,function(){var t,i;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n.id_socket))&&t.readyState===t.OPEN&&(i={messageId:n.messageId,hasError:!1,data:o},this.sendWS(t,i)),[2]})})})),_.cacheId=this._cacheId++,this._nodeCache.set(_.cacheId,JSON.stringify(o)),(n=this._nodeCache.getStats().vsize)>this._heapLimit){for(s=0,r=this._subscriptions.filter(function(e){return e.cacheId&&!e.clients.length}),a=0;a<r.length&&(this._debugRemoveCacheHits+=1,this._nodeCache.del(r[a].cacheId),r[a].cacheId=0,s+=1,!(this._nodeCache.getStats().vsize<.75*this._heapLimit));a++);this._enableDebug&&console.log("Sub Cache: Too Big - "+_.publication+" - Deleted: "+s+" - "+n)}return[3,5];case 4:return c=e.sent(),this._monitorManagerFunction.finishMonitorFunction(t),Promise.all(_.clients.map(function(n){return __awaiter(l,void 0,void 0,function(){var t,i;return __generator(this,function(e){return(t=this._websocketManager.getWebSocket(n.id_socket))&&t.readyState===t.OPEN&&(i={messageId:n.messageId,hasError:!0,data:c},this.sendWS(t,i)),[2]})})})),this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+this.serverConfig.CLIENT_NAME,"Error Detected During Subscription "+_.publication+" - (sendPubData)\n\nData \n"+JSON.stringify(_.subscriptionData,null,2)+"\n\nErrors\n"+JSON.stringify(c,null,2)),[3,5];case 5:return[2]}})})},SubscriptionManager.prototype.sendWS=function(e,t){this._websocketManager.send(e,t)},SubscriptionManager.prototype.getEnableDebug=function(){return this._enableDebug},SubscriptionManager}();exports.SubscriptionManager=SubscriptionManager;
|
|
2
2
|
//# sourceMappingURL=subscription.manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/managers/subscription.manager.ts"],"names":["logs_1","require","app_status_1","files_1","super_admin_1","logged_in_users_collection_1","cron_jobs_1","flags_1","method_responses_1","index_1","notifications_1","report_builder_reports_1","report_builder_libraries_1","user_groups_1","user_guides_1","report_builder_dashboard_builders_1","mongo_manager_1","common_1","NodeCache","flag_collection_1","os_1","numCPUs","cpus","length","v8","SubscriptionManager","mainServer","wss","serverConfig","monitorManagerFunction","_this","this","_publications","_subscriptions","_loggedInUsers","_mongoQueue","_mongoQueueId","_cacheId","_heapSize","getHeapStatistics","_enableDebug","_debugOplogCollections","_debugOplogHits","_debugSubCollections","_debugSubHits","_debugUnSubHits","_debugUnSubAllHits","_debugMongoQueueHits","_debugMongoQueueCollections","_debugSendQueueHits","_debugRemoveCacheHits","_oplogRetryCount","_mainServer","_websocketManager","getWebSocketManager","_monitorManagerFunction","_nodeCache","stdTTL","checkperiod","_wss","loadSuperAdminPublications","loadAppStatusPublications","loadLogPublications","loadFilePublications","loadCronJobPublications","loadFlagsPublications","loadMethodResponsePublications","loadNotificationPublications","loadReportBuilderReportPublications","loadReportBuilderLibraryPublications","loadUserGroupPublications","loadUserGuidePublications","loadReportBuilderDashboardBuilderPublications","tailOpLog","setInterval","getEnableDebug","console","log","Date","JSON","stringify","sort","a","b","collection","localeCompare","publication","type","__awaiter","_a","LoggedInUsers","find","_b","sent","userCopy","deepCopy","i","loggedInUser","date","now","getTime","this_1","getWebSocket","id_ws","unsubscribeAll","forEach","sub","j","clients","id_socket","splice","deleteOne","_id","findIndex","client","this_2","some","Flags","findOne","then","flag","value","setCacheLimit","prototype","process","env","IS_WORKERS_ENABLED","_heapLimit","invalidatePubsCache","ResolveIOServer","getMongoManager","invalidateQueryCache","collSubs","filter","collections","includes","this_3","user_specific","Promise","all","map","ws","readyState","OPEN","sendDataToOne","messageId","err","getMethodManager","sendEmail","id_user","sendDataToAll","collSubs_1","__values","collSubs_1_1","next","done","publications","method","Object","assign","loggedInLatency","updateOne","$set","latency","res","subscribe","messageRoute","messageDate","subscriptionData","pub","hits","push","check","error","_schema","valObj","rootKeys","keys","validate","errors","urlData","split","urlModule_1","urlNext","otherRouteSubs","startsWith","otherSub","unsubscribe","getPublicationCollections","cacheId","processSubscription","createLoggedInUser","resolve","reject","user","objectIdHexString","__v","insertOne","indexOf","userSubs","removeWebSocket","getActiveSubscriptions","resumeToken","_oplog$","closed","removeAllListeners","close","setTimeout","exit","lastResumeToken_1","getMainDB","watch","resumeAfter","errOp","on","doc","ns","coll","operationType","endsWith","callMethodInternal","call","documentKey","cacheData","parse","get","dateReviver","serverRes","hasError","data","sendWS","del","monitor","startMonitorFunction","function","apply","__spreadArray","__read","finishMonitorFunction","err_1","subIndex","res_1","Array","isArray","set","nodeCacheSize","getStats","vsize","deleteCount","subArr","zz","err_2","send","exports"],"mappings":"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","file":"subscription.manager.js","sourcesContent":["import { ServerResponseModel } from '../models/server-response.model';\nimport { ActiveSubscriptionModel, SubscriptionModel } from '../models/subscription.model';\nimport * as WebSocket from 'ws';\nimport { loadLogPublications } from '../publications/logs';\nimport { loadAppStatusPublications } from '../publications/app-status';\nimport { loadFilePublications } from '../publications/files';\nimport { loadSuperAdminPublications } from '../publications/super-admin';\nimport { LoggedInUsers } from '../collections/logged-in-users.collection';\nimport { loadCronJobPublications } from '../publications/cron-jobs';\nimport { loadFlagsPublications } from '../publications/flags';\nimport { loadMethodResponsePublications } from '../publications/method-responses';\nimport ResolveIOMainServer from '../server-app';\nimport { ResolveIOServer } from '../index';\nimport { loadNotificationPublications } from '../publications/notifications';\nimport { loadReportBuilderReportPublications } from '../publications/report-builder-reports';\nimport { LoggedInUserModel } from '../models/logged-in-users.model';\n\nimport { ChangeStream, ChangeStreamDeleteDocument, ChangeStreamDocument, ChangeStreamInsertDocument, ChangeStreamReplaceDocument, ChangeStreamUpdateDocument, ResumeToken } from 'mongodb';\nimport { loadReportBuilderLibraryPublications } from '../publications/report-builder-libraries';\nimport { loadUserGroupPublications } from '../publications/user-groups';\nimport { loadUserGuidePublications } from '../publications/user-guides';\nimport { loadReportBuilderDashboardBuilderPublications } from '../publications/report-builder-dashboard-builders';\nimport { objectIdHexString } from './mongo.manager';\nimport { dateReviver, deepCopy } from '../util/common';\nimport * as NodeCache from 'node-cache';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { Flags } from '../collections/flag.collection';\nimport { cpus } from 'os';\nimport { WebSocketManager } from './websocket.manager';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\n\n// Performance Dependencies\n// import * as path from 'path';\n// import { Worker } from 'worker_threads';\n\ninterface MongoQueueModel {\n\t_id: number,\n\ttype: string;\n\tcollection: string;\n\tsubscription: ActiveSubscriptionModel;\n\trunning: boolean;\n\trun_again: boolean;\n}\n\n// interface CurrentPerformanceMonitor {\n// \t_id: number;\n// \tfunction: string;\n// \tpublication: string;\n// \tsubscriptionData: any[];\n// \tdate_start: Date;\n// \tdate_end: Date;\n// \tduration: number;\n// \tresult: string;\n// }\n\nexport class SubscriptionManager {\n\n\tprivate _mainServer: ResolveIOMainServer;\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _publications: SubscriptionModel = {};\n\tprivate _subscriptions: ActiveSubscriptionModel[] = [];\n\tprivate _wss: WebSocket.Server;\n\tprivate _loggedInUsers: LoggedInUserModel[] = [];\n\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\t\n\tprivate _oplog$: ChangeStream;\n\n\tprivate _nodeCache;\n\tprivate _cacheId = 1;\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate serverConfig;\n\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\n\tprivate _enableDebug = false;\n\tprivate _debugOplogCollections = [];\n\tprivate _debugOplogHits = 0;\n\tprivate _debugSubCollections = [];\n\tprivate _debugSubHits = 0;\n\tprivate _debugUnSubHits = 0;\n\tprivate _debugUnSubAllHits = 0;\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _debugSendQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\n\tprivate _oplogRetryCount = 0;\n\n\t// private currentPerfomanceMonitor: CurrentPerformanceMonitor[] = [];\n\t// private idPerformance: number = 0;\n\t// private performanceThread;\n\n\tconstructor(mainServer, wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tthis._mainServer = mainServer;\n\t\tthis._websocketManager = this._mainServer.getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\t// setTimeout(() => {\n\t\t// \tconsole.log('Setting up performance thread');\n\n\t\t// \tthis.performanceThread = new Worker(path.join(__dirname, './subscription.performance.js'));\n\n\t\t// \tthis.performanceThread.on('exit', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD EXITED!!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\n\t\t// \tthis.performanceThread.on('error', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD RECV ERROR !!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\t\t// }, 5000);\n\n\t\t// setInterval(() => {\n\t\t// \tconsole.log('Post thread msg');\n\t\t// \tthis.performanceThread.postMessage(this.currentPerfomanceMonitor);\n\t\t// \tthis.currentPerfomanceMonitor = [];\n\t\t// }, 10000);\n\n\t\tthis.serverConfig = serverConfig;\n\t\tthis._wss = wss;\n\n\t\t// Publications\n\t\tloadSuperAdminPublications(this);\n\t\tloadAppStatusPublications(this);\n\t\tloadLogPublications(this);\n\t\tloadFilePublications(this);\n\t\tloadCronJobPublications(this);\n\t\tloadFlagsPublications(this);\n\t\tloadMethodResponsePublications(this);\n\t\tloadNotificationPublications(this);\n\t\tloadReportBuilderReportPublications(this);\n\t\tloadReportBuilderLibraryPublications(this);\n\t\tloadUserGroupPublications(this);\n\t\tloadUserGuidePublications(this);\n\t\tloadReportBuilderDashboardBuilderPublications(this);\n\n\t\tthis.tailOpLog();\n\n\t\tsetInterval(() => {\n\t\t\tthis._oplogRetryCount = 0;\n\t\t}, 15000);\n\n\t\tsetInterval(() => {\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Subs', this._subscriptions.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Logged In Users', this._loggedInUsers.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue', this._mongoQueue.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Collections', JSON.stringify(this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Hits', this._debugOplogHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Collections', JSON.stringify(this._debugOplogCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.type.localeCompare(b.type)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Hits', this._debugSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Collections', JSON.stringify(this._debugSubCollections.sort((a, b) => a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub Hits', this._debugUnSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub All Hits', this._debugUnSubAllHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Cache Cleanup Hits', this._debugRemoveCacheHits);\n\t\t\t}\n\t\t\t\n\t\t\tthis._debugOplogHits = 0;\n\t\t\tthis._debugOplogCollections = [];\n\t\t\tthis._debugSubCollections = [];\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t\tthis._debugSubHits = 0;\n\t\t\tthis._debugUnSubHits = 0;\n\t\t\tthis._debugUnSubAllHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t}, 60000);\n\n\t\tsetInterval(async () => {\n\t\t\tthis._loggedInUsers = await LoggedInUsers.find();\n\t\n\t\t\tlet userCopy = deepCopy(this._loggedInUsers);\n\t\t\tfor (let i = this._loggedInUsers.length - 1; i >= 0; i--) {\n\t\t\t\tlet loggedInUser = userCopy[i];\n\n\t\t\t\tif (!loggedInUser.date || Date.now() - loggedInUser.date.getTime() > 120000) {\n\t\t\t\t\tif (this._websocketManager.getWebSocket(loggedInUser.id_ws)) {\n\t\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', this._websocketManager.getWebSocket(loggedInUser.id_ws)['user'], this._websocketManager.getWebSocket(loggedInUser.id_ws)['id_socket'], 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.unsubscribeAll(this._websocketManager.getWebSocket(loggedInUser.id_ws));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._subscriptions.forEach(sub => {\n\t\t\t\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\t\t\t\tif (client.id_socket === loggedInUser.id_ws) {\n\t\t\t\t\t\t\t\t\tsub.clients.splice(j, 1);\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\n\t\t\t\t\t\tLoggedInUsers.deleteOne({_id: loggedInUser._id});\n\n\t\t\t\t\t\tif (this._loggedInUsers.findIndex(a => a._id === loggedInUser._id) >= 0) {\n\t\t\t\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.findIndex(a => a._id === loggedInUser._id), 1);\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\tfor (let i = 0; i < this._subscriptions.length; i++) {\n\t\t\t\tlet sub = this._subscriptions[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\tif (!this._loggedInUsers.some(a => a.id_ws === client.id_socket)) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 30000);\n\n\t\tFlags.findOne({type: 'Enable Debug'}).then(flag => {\n\t\t\tif (flag && flag.value) {\n\t\t\t\tthis._enableDebug = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._enableDebug = false;\n\t\t\t}\n\t\t});\n\n\t\tthis.setCacheLimit();\n\t}\n\n\tprivate setCacheLimit() {\t\n\t\tif (process.env.IS_WORKERS_ENABLED === 'true') {\n\t\t\tthis._heapLimit = this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3; // Use 50% of total heap size\n\t\t}\n\t}\n\n\tpublic async invalidatePubsCache(collection: string, type: string) {\n\t\tResolveIOServer.getMongoManager().invalidateQueryCache(collection);\n\n\t\tlet collSubs = this._subscriptions.filter(a => a.collections.includes(collection));\n\n\t\tfor (let sub of collSubs) {\n\t\t\tif (this._publications[sub.publication].user_specific) {\n\t\t\t\t// For user-specific publications, process each client separately\n\t\t\t\tPromise.all(\n\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.sendDataToOne(ws, client.messageId, sub, type, collection);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// Handle error\n\t\t\t\t\t\t\t\tthis._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During sendDataToOne - User Specific - Socket: ' + client.id_socket + ', User: ' + client.id_user + ', MessageId: ' + client.messageId + ', Pub: ' + sub.publication + ', Err: ' + JSON.stringify(err, null, 2));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// For non-user-specific publications, send data to all clients\n\t\t\t\tthis.sendDataToAll(sub);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add all files to publications private object\n\tpublic publications(method: SubscriptionModel) {\n\t\tthis._publications = Object.assign(this._publications, method);\n\t}\n\n\tpublic loggedInLatency(ws: WebSocket) {\n\t\tlet loggedInUser = this._loggedInUsers.find(a => a.id_ws === ws['id_socket']);\n\n\t\tif (loggedInUser) {\n\t\t\tloggedInUser.date = new Date();\n\n\t\t\tLoggedInUsers.updateOne({id_ws: ws['id_socket']}, {$set: {latency: ws['latency'], date: loggedInUser.date}}).then(res => {\n\t\t\t\tif (!res) {\n\t\t\t\t\tthis.unsubscribeAll(ws);\n\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', ws['user'], ws['id_socket'], 3);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, () => {\n\t\t\t\tthis.unsubscribeAll(ws);\n\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', ws['user'], ws['id_socket'], 4);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Subscribe to publication\n\tpublic subscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugSubHits += 1;\n\n\t\tif (!this._debugSubCollections.some(a => a.publication === publication)) {\n\t\t\tthis._debugSubCollections.push({\n\t\t\t\tpublication: publication,\n\t\t\t\thits: 1\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis._debugSubCollections.find(a => a.publication === publication).hits += 1;\n\t\t}\n\n\t\tlet pub = this._publications[publication];\n\n\t\tif (!pub) {\n\t\t\tconsole.error(new Date(), 'No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tif (subscriptionData.length > 1 || subscriptionData[0]) {\n\t\t\t\tif (!pub.check) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Function For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (!pub.check._schema) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Schema For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet valObj = {};\n\t\t\t\t\tlet valKeys = Object.keys(pub.check._schema);\n\n\t\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\n\t\t\t\t\tfor (let i = 0; i < subscriptionData.length; i++) {\n\t\t\t\t\t\tvalObj[rootKeys[i]] = subscriptionData[i];\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpub.check.validate(valObj);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (errors) {\n\t\t\t\t\t\tif (errors) {\n\t\t\t\t\t\t\tconsole.error(new Date(), 'Error in Pub Check (' + publication + ')', errors);\n\t\t\t\t\t\t\treturn;\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\tif (messageRoute !== 'Bypass') {\n\t\t\t\tlet urlData = messageRoute.split('/');\n\t\t\t\tlet urlModule = '';\n\t\t\t\tlet urlNext = urlData[0];\n\n\t\t\t\tif (urlData[0] === '') {\n\t\t\t\t\turlModule = '/';\n\t\t\t\t\turlNext = urlData[1];\n\t\t\t\t}\n\n\t\t\t\turlModule += urlNext;\n\n\t\t\t\tif (urlData.length > 1) {\n\t\t\t\t\turlModule += '/';\n\t\t\t\t}\n\n\t\t\t\tlet otherRouteSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_socket === ws['id_socket'] && b.messageRoute !== 'Bypass' && b.messageRoute !== '/' && b.messageRoute !== messageRoute && !b.messageRoute.startsWith(urlModule)));\n\n\t\t\t\tif (otherRouteSubs.length) {\n\t\t\t\t\tthis._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Detected Undestroyed Subscription - ' + this.serverConfig['CLIENT_NAME'], 'USER: ' + ws['user'] + ' (Socket: ' + ws['id_socket'] + ') ' + ' is on route: ' + messageRoute + ' but has the following subscriptions on other routes:' + JSON.stringify(otherRouteSubs, null, 2));\n\n\t\t\t\t\totherRouteSubs.forEach(otherSub => {\n\t\t\t\t\t\totherSub.clients.filter(a => a.id_socket === ws['id_socket']).forEach(client => {\n\t\t\t\t\t\t\tthis.unsubscribe(client.messageRoute, new Date(), ws, client.messageId, otherSub.publication, otherSub.subscriptionData);\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 sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\t// If sub found (another user watching same data), add client to same sub\n\t\t\tif (sub) {\n\t\t\t\tif (!sub.clients.some(a => a.id_socket === ws['id_socket'] && a.messageId === messageId)) {\n\t\t\t\t\tsub.clients.push({\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If sub not found, create new sub\n\t\t\telse {\n\t\t\t\tthis._subscriptions.push({\n\t\t\t\t\tpublication: publication,\n\t\t\t\t\tsubscriptionData: subscriptionData,\n\t\t\t\t\tcollections: this.getPublicationCollections(publication),\n\t\t\t\t\tclients: [{\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute\n\t\t\t\t\t}],\n\t\t\t\t\tcacheId: 0\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!sub) {\n\t\t\t\tsub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\t\t\t}\n\n\t\t\t// Immediately send data to the new client\n\t\t\tthis.processSubscription(sub, ws, messageId);\n\t\t}\n\t}\n\n\tpublic async createLoggedInUser(id_ws: string): Promise<LoggedInUserModel> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet ws = this._websocketManager.getWebSocket(id_ws);\n\n\t\t\tif (ws) {\n\t\t\t\tlet user = {\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t__v: 0,\n\t\t\t\t\tdate: new Date(),\n\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tthis._loggedInUsers.push(user);\n\t\t\t\tLoggedInUsers.insertOne(user);\n\t\t\t\t\n\t\t\t\tresolve(user);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresolve(null);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Unsubscribe from publication \n\tpublic unsubscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugUnSubHits += 1;\n\n\t\tif (!this._publications[publication]) {\n\t\t\tconsole.log('No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\tif (sub) {\n\t\t\t\tfor (let i = sub.clients.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (sub.clients[i].id_user === ws['id_user'] && sub.clients[i].messageId === messageId && sub.clients[i].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Unsubscribe from publication\n\tpublic async unsubscribeAll(ws: WebSocket) {\n\t\tthis._debugUnSubAllHits += 1;\n\n\t\tif (ws) {\n\t\t\tlet loggedInUser = await LoggedInUsers.findOne({ id_ws: ws['id_socket'] });\n\n\t\t\tif (loggedInUser) {\n\t\t\t\tif (this._loggedInUsers.map(a => a._id).indexOf(loggedInUser._id) >= 0) {\n\t\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.map(a => a._id).indexOf(loggedInUser._id), 1);\n\t\t\t\t}\n\n\t\t\t\tLoggedInUsers.deleteOne({ _id: loggedInUser._id });\n\t\t\t}\n\n\t\t\tlet userSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_user === ws['id_user'] && b.id_socket === ws['id_socket']));\n\n\t\t\tfor (let i = userSubs.length - 1; i >= 0; i--) {\n\t\t\t\tlet sub = userSubs[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tif (sub.clients[j].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._websocketManager.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic getActiveSubscriptions() {\n\t\treturn this._subscriptions;\n\t}\n\n\t// Get publication collection\n\tprivate getPublicationCollections(publication: string) {\n\t\treturn this._publications[publication].collections;\n\t}\n\n\t// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)\n\tprivate async tailOpLog(resumeToken?: ResumeToken) {\n\t\tif (this._oplog$ && !this._oplog$.closed) {\n\t\t\tthis._oplog$.removeAllListeners();\n\t\t\tthis._oplog$.close();\n\t\t\tthis._oplog$ = null;\n\t\t}\n\n\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\n\t\tif (!this._oplog$ || this._oplog$.closed) {\n\t\t\tthis._oplogRetryCount += 1;\n\n\t\t\tif (this._oplogRetryCount > 5) {\n\t\t\t\tconsole.error('****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tlet lastResumeToken: ResumeToken;\n\n\t\t\tif (resumeToken) {\n\t\t\t\tlastResumeToken = resumeToken;\n\t\t\t\ttry {\n\t\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch([], { resumeAfter: resumeToken });\n\t\t\t\t}\n\t\t\t\tcatch (errOp) {\n\t\t\t\t\tif (this._oplog$) {\n\t\t\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\t\t\tthis._oplog$.close();\n\t\t\t\t\t\tthis._oplog$ = null;\n\t\t\t\t\t}\n\t\t\t\t\tthis.tailOpLog(resumeToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch();\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'oplog started');\n\n\t\t\tthis._oplog$.on('change', (doc: ChangeStreamInsertDocument | ChangeStreamUpdateDocument | ChangeStreamReplaceDocument | ChangeStreamDeleteDocument) => {\n\t\t\t\tif (doc.ns) {\n\t\t\t\t\tlet collection = doc.ns.coll;\n\n\t\t\t\t\tif (!this._debugOplogCollections.some(a => a.collection === doc.ns.coll && a.type === doc.operationType)) {\n\t\t\t\t\t\tthis._debugOplogCollections.push({\n\t\t\t\t\t\t\tcollection: doc.ns.coll,\n\t\t\t\t\t\t\ttype: doc.operationType,\n\t\t\t\t\t\t\thits: 1\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\tthis._debugOplogCollections.find(a => a.collection === doc.ns.coll && a.type === doc.operationType).hits += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection && !collection.endsWith('.versions') && !collection.startsWith('monitor-') && collection !== 'logs' && collection !== 'log-method-latencies' && collection !== 'log-subscriptions') {\n\t\t\t\t\t\tthis._debugOplogHits += 1;\n\n\t\t\t\t\t\tif (doc.operationType === 'insert') {\n\t\t\t\t\t\t\tif (collection === 'support-tickets') {\n\t\t\t\t\t\t\t\tif (this.serverConfig['ROOT_URL'] === 'https://resolveio.com') {\n\t\t\t\t\t\t\t\t\tthis._mainServer.getMethodManager().callMethodInternal.call(this._mainServer.getMethodManager(), 'sendSupportTicketEmail', doc.documentKey['_id']);\n\t\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'update' || doc.operationType === 'replace') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'update');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'delete') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'delete');\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\tif (collection === 'flags') {\n\t\t\t\t\t\tFlags.findOne({ type: 'Enable Debug' }).then(flag => {\n\t\t\t\t\t\t\tif (flag && flag.value) {\n\t\t\t\t\t\t\t\tthis._enableDebug = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tthis._enableDebug = false;\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\tlastResumeToken = doc._id;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._oplog$.on('error', error => {\n\t\t\t\tconsole.log(new Date(), 'oplog error', error);\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$.close();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\n\t\t\tthis._oplog$.on('end', () => {\n\t\t\t\tconsole.log(new Date(), 'oplog end');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$.close();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\n\t\t\tthis._oplog$.on('close', () => {\n\t\t\t\tconsole.log(new Date(), 'oplog close');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async processSubscription(sub: ActiveSubscriptionModel, ws: WebSocket, messageId: number) {\n\t\tif (!this._publications[sub.publication].user_specific) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\ttry {\n\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\tdata: cacheData\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\tsub.cacheId = 0;\n\n\t\t\t\t\tthis.sendDataToAll(sub);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.sendDataToAll(sub);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.sendDataToOne(ws, messageId, sub, 'newSub', sub.collections[0]);\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToOne(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, type: string, collection: string) {\n\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('User Specific Publication', sub.publication, '', '', sub.subscriptionData);\n\t\ttry {\n\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ws['id_user'], ...sub.subscriptionData);\n\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: res\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: err\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\n\t\t\tthis._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendDataToOne - WS)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToAll(sub: ActiveSubscriptionModel) {\n\t\tif (!sub.clients.length) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\tsub.cacheId = 0;\n\t\t\t}\n\n\t\t\tlet subIndex = this._subscriptions.findIndex(a => a.publication === sub.publication && JSON.stringify(a.subscriptionData) === JSON.stringify(sub.subscriptionData));\n\t\t\tif (subIndex >= 0) {\n\t\t\t\tthis._subscriptions.splice(subIndex, 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Publication', sub.publication, '', '', sub.subscriptionData);\n\n\t\t\ttry {\n\t\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ...sub.subscriptionData);\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\tif (sub.cacheId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\t\n\t\t\t\t\t\tif (JSON.stringify(cacheData) !== JSON.stringify(res)) {\n\t\t\t\t\t\t\tPromise.all(\n\t\t\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\n\t\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\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\n\t\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\t\t\tsub.cacheId = 0;\n\n\t\t\t\t\t\t\tif (res && (!Array.isArray(res) || res.length)) {\n\t\t\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tPromise.all(\n\t\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\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\n\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (res && (!Array.isArray(res) || res.length)) {\n\t\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\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\tPromise.all(\n\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\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\t\n\t\t\t\t\tif (res && (!Array.isArray(res) || res.length)) {\n\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\n\t\t\t\t\t\tconst nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\t\t\t\t// Evict cache entries as needed\n\t\t\t\t\t\t\tlet deleteCount = 0;\n\t\t\t\t\t\t\tconst subArr = this._subscriptions.filter(a => a.cacheId && !a.clients.length);\n\t\t\t\t\t\n\t\t\t\t\t\t\tfor (let zz = 0; zz < subArr.length; zz++) {\n\t\t\t\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\t\t\t\tthis._nodeCache.del(subArr[zz].cacheId);\n\t\t\t\t\t\t\t\tsubArr[zz].cacheId = 0;\n\t\t\t\t\t\t\t\tdeleteCount += 1;\n\t\t\t\t\t\t\t\tif (this._nodeCache.getStats().vsize < this._heapLimit * 0.75) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t'Sub Cache: ' +\n\t\t\t\t\t\t\t\t\t'Too Big - ' +\n\t\t\t\t\t\t\t\t\tsub.publication +\n\t\t\t\t\t\t\t\t\t' - Deleted: ' +\n\t\t\t\t\t\t\t\t\tdeleteCount +\n\t\t\t\t\t\t\t\t\t' - ' +\n\t\t\t\t\t\t\t\t\tnodeCacheSize\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\tPromise.all(\n\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\thasError: true,\n\t\t\t\t\t\t\t\tdata: err\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\tthis._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendPubData)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate sendWS(ws: WebSocket, data: ServerResponseModel) {\n\t\tthis._websocketManager.send(ws, data);\n\t}\n\n\tpublic getEnableDebug() {\n\t\treturn this._enableDebug;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/managers/subscription.manager.ts"],"names":["logs_1","require","app_status_1","files_1","super_admin_1","logged_in_users_collection_1","cron_jobs_1","flags_1","method_responses_1","index_1","notifications_1","report_builder_reports_1","report_builder_libraries_1","user_groups_1","user_guides_1","report_builder_dashboard_builders_1","mongo_manager_1","common_1","NodeCache","flag_collection_1","os_1","numCPUs","cpus","length","v8","SubscriptionManager","mainServer","wss","serverConfig","monitorManagerFunction","_this","this","_publications","_subscriptions","_loggedInUsers","_mongoQueue","_mongoQueueId","_cacheId","_heapSize","getHeapStatistics","_enableDebug","_debugOplogCollections","_debugOplogHits","_debugSubCollections","_debugSubHits","_debugUnSubHits","_debugUnSubAllHits","_debugMongoQueueHits","_debugMongoQueueCollections","_debugSendQueueHits","_debugRemoveCacheHits","_oplogRetryCount","_mainServer","_websocketManager","getWebSocketManager","_monitorManagerFunction","_nodeCache","stdTTL","checkperiod","_wss","loadSuperAdminPublications","loadAppStatusPublications","loadLogPublications","loadFilePublications","loadCronJobPublications","loadFlagsPublications","loadMethodResponsePublications","loadNotificationPublications","loadReportBuilderReportPublications","loadReportBuilderLibraryPublications","loadUserGroupPublications","loadUserGuidePublications","loadReportBuilderDashboardBuilderPublications","tailOpLog","setInterval","getEnableDebug","console","log","Date","JSON","stringify","sort","a","b","collection","localeCompare","publication","type","__awaiter","_a","LoggedInUsers","find","_b","sent","userCopy","deepCopy","i","loggedInUser","date","now","getTime","this_1","getWebSocket","id_ws","unsubscribeAll","forEach","sub","j","clients","id_socket","splice","deleteOne","_id","findIndex","client","this_2","some","Flags","findOne","then","flag","value","setCacheLimit","prototype","process","env","IS_WORKERS_ENABLED","_heapLimit","invalidatePubsCache","ResolveIOServer","getMongoManager","invalidateQueryCache","collSubs","filter","collections","includes","this_3","user_specific","Promise","all","map","ws","readyState","OPEN","sendDataToOne","messageId","err","getMethodManager","sendEmail","id_user","sendDataToAll","collSubs_1","__values","collSubs_1_1","next","done","publications","method","Object","assign","loggedInLatency","updateOne","$set","latency","res","subscribe","messageRoute","messageDate","subscriptionData","pub","hits","push","check","error","_schema","valObj","rootKeys","keys","validate","errors","urlData","split","urlModule_1","urlNext","otherRouteSubs","startsWith","otherSub","unsubscribe","getPublicationCollections","cacheId","processSubscription","createLoggedInUser","resolve","reject","user","objectIdHexString","__v","insertOne","indexOf","userSubs","removeWebSocket","getActiveSubscriptions","resumeToken","_oplog$","closed","removeAllListeners","close","setTimeout","exit","lastResumeToken_1","getMainDB","watch","resumeAfter","errOp","on","doc","ns","coll","operationType","endsWith","callMethodInternal","call","documentKey","cacheData","parse","get","dateReviver","serverRes","hasError","data","sendWS","del","monitor","startMonitorFunction","function","apply","__spreadArray","__read","finishMonitorFunction","err_1","subIndex","res_1","set","nodeCacheSize","getStats","vsize","deleteCount","subArr","zz","err_2","send","exports"],"mappings":"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","file":"subscription.manager.js","sourcesContent":["import { ServerResponseModel } from '../models/server-response.model';\nimport { ActiveSubscriptionModel, SubscriptionModel } from '../models/subscription.model';\nimport * as WebSocket from 'ws';\nimport { loadLogPublications } from '../publications/logs';\nimport { loadAppStatusPublications } from '../publications/app-status';\nimport { loadFilePublications } from '../publications/files';\nimport { loadSuperAdminPublications } from '../publications/super-admin';\nimport { LoggedInUsers } from '../collections/logged-in-users.collection';\nimport { loadCronJobPublications } from '../publications/cron-jobs';\nimport { loadFlagsPublications } from '../publications/flags';\nimport { loadMethodResponsePublications } from '../publications/method-responses';\nimport ResolveIOMainServer from '../server-app';\nimport { ResolveIOServer } from '../index';\nimport { loadNotificationPublications } from '../publications/notifications';\nimport { loadReportBuilderReportPublications } from '../publications/report-builder-reports';\nimport { LoggedInUserModel } from '../models/logged-in-users.model';\n\nimport { ChangeStream, ChangeStreamDeleteDocument, ChangeStreamDocument, ChangeStreamInsertDocument, ChangeStreamReplaceDocument, ChangeStreamUpdateDocument, ResumeToken } from 'mongodb';\nimport { loadReportBuilderLibraryPublications } from '../publications/report-builder-libraries';\nimport { loadUserGroupPublications } from '../publications/user-groups';\nimport { loadUserGuidePublications } from '../publications/user-guides';\nimport { loadReportBuilderDashboardBuilderPublications } from '../publications/report-builder-dashboard-builders';\nimport { objectIdHexString } from './mongo.manager';\nimport { dateReviver, deepCopy } from '../util/common';\nimport * as NodeCache from 'node-cache';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { Flags } from '../collections/flag.collection';\nimport { cpus } from 'os';\nimport { WebSocketManager } from './websocket.manager';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\n\n// Performance Dependencies\n// import * as path from 'path';\n// import { Worker } from 'worker_threads';\n\ninterface MongoQueueModel {\n\t_id: number,\n\ttype: string;\n\tcollection: string;\n\tsubscription: ActiveSubscriptionModel;\n\trunning: boolean;\n\trun_again: boolean;\n}\n\n// interface CurrentPerformanceMonitor {\n// \t_id: number;\n// \tfunction: string;\n// \tpublication: string;\n// \tsubscriptionData: any[];\n// \tdate_start: Date;\n// \tdate_end: Date;\n// \tduration: number;\n// \tresult: string;\n// }\n\nexport class SubscriptionManager {\n\n\tprivate _mainServer: ResolveIOMainServer;\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _publications: SubscriptionModel = {};\n\tprivate _subscriptions: ActiveSubscriptionModel[] = [];\n\tprivate _wss: WebSocket.Server;\n\tprivate _loggedInUsers: LoggedInUserModel[] = [];\n\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\t\n\tprivate _oplog$: ChangeStream;\n\n\tprivate _nodeCache;\n\tprivate _cacheId = 1;\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate serverConfig;\n\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\n\tprivate _enableDebug = false;\n\tprivate _debugOplogCollections = [];\n\tprivate _debugOplogHits = 0;\n\tprivate _debugSubCollections = [];\n\tprivate _debugSubHits = 0;\n\tprivate _debugUnSubHits = 0;\n\tprivate _debugUnSubAllHits = 0;\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _debugSendQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\n\tprivate _oplogRetryCount = 0;\n\n\t// private currentPerfomanceMonitor: CurrentPerformanceMonitor[] = [];\n\t// private idPerformance: number = 0;\n\t// private performanceThread;\n\n\tconstructor(mainServer, wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tthis._mainServer = mainServer;\n\t\tthis._websocketManager = this._mainServer.getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\t// setTimeout(() => {\n\t\t// \tconsole.log('Setting up performance thread');\n\n\t\t// \tthis.performanceThread = new Worker(path.join(__dirname, './subscription.performance.js'));\n\n\t\t// \tthis.performanceThread.on('exit', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD EXITED!!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\n\t\t// \tthis.performanceThread.on('error', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD RECV ERROR !!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\t\t// }, 5000);\n\n\t\t// setInterval(() => {\n\t\t// \tconsole.log('Post thread msg');\n\t\t// \tthis.performanceThread.postMessage(this.currentPerfomanceMonitor);\n\t\t// \tthis.currentPerfomanceMonitor = [];\n\t\t// }, 10000);\n\n\t\tthis.serverConfig = serverConfig;\n\t\tthis._wss = wss;\n\n\t\t// Publications\n\t\tloadSuperAdminPublications(this);\n\t\tloadAppStatusPublications(this);\n\t\tloadLogPublications(this);\n\t\tloadFilePublications(this);\n\t\tloadCronJobPublications(this);\n\t\tloadFlagsPublications(this);\n\t\tloadMethodResponsePublications(this);\n\t\tloadNotificationPublications(this);\n\t\tloadReportBuilderReportPublications(this);\n\t\tloadReportBuilderLibraryPublications(this);\n\t\tloadUserGroupPublications(this);\n\t\tloadUserGuidePublications(this);\n\t\tloadReportBuilderDashboardBuilderPublications(this);\n\n\t\tthis.tailOpLog();\n\n\t\tsetInterval(() => {\n\t\t\tthis._oplogRetryCount = 0;\n\t\t}, 15000);\n\n\t\tsetInterval(() => {\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Subs', this._subscriptions.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Logged In Users', this._loggedInUsers.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue', this._mongoQueue.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Collections', JSON.stringify(this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Hits', this._debugOplogHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Collections', JSON.stringify(this._debugOplogCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.type.localeCompare(b.type)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Hits', this._debugSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Collections', JSON.stringify(this._debugSubCollections.sort((a, b) => a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub Hits', this._debugUnSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub All Hits', this._debugUnSubAllHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Cache Cleanup Hits', this._debugRemoveCacheHits);\n\t\t\t}\n\t\t\t\n\t\t\tthis._debugOplogHits = 0;\n\t\t\tthis._debugOplogCollections = [];\n\t\t\tthis._debugSubCollections = [];\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t\tthis._debugSubHits = 0;\n\t\t\tthis._debugUnSubHits = 0;\n\t\t\tthis._debugUnSubAllHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t}, 60000);\n\n\t\tsetInterval(async () => {\n\t\t\tthis._loggedInUsers = await LoggedInUsers.find();\n\t\n\t\t\tlet userCopy = deepCopy(this._loggedInUsers);\n\t\t\tfor (let i = this._loggedInUsers.length - 1; i >= 0; i--) {\n\t\t\t\tlet loggedInUser = userCopy[i];\n\n\t\t\t\tif (!loggedInUser.date || Date.now() - loggedInUser.date.getTime() > 120000) {\n\t\t\t\t\tif (this._websocketManager.getWebSocket(loggedInUser.id_ws)) {\n\t\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', this._websocketManager.getWebSocket(loggedInUser.id_ws)['user'], this._websocketManager.getWebSocket(loggedInUser.id_ws)['id_socket'], 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.unsubscribeAll(this._websocketManager.getWebSocket(loggedInUser.id_ws));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._subscriptions.forEach(sub => {\n\t\t\t\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\t\t\t\tif (client.id_socket === loggedInUser.id_ws) {\n\t\t\t\t\t\t\t\t\tsub.clients.splice(j, 1);\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\n\t\t\t\t\t\tLoggedInUsers.deleteOne({_id: loggedInUser._id});\n\n\t\t\t\t\t\tif (this._loggedInUsers.findIndex(a => a._id === loggedInUser._id) >= 0) {\n\t\t\t\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.findIndex(a => a._id === loggedInUser._id), 1);\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\tfor (let i = 0; i < this._subscriptions.length; i++) {\n\t\t\t\tlet sub = this._subscriptions[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\tif (!this._loggedInUsers.some(a => a.id_ws === client.id_socket)) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 30000);\n\n\t\tFlags.findOne({type: 'Enable Debug'}).then(flag => {\n\t\t\tif (flag && flag.value) {\n\t\t\t\tthis._enableDebug = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._enableDebug = false;\n\t\t\t}\n\t\t});\n\n\t\tthis.setCacheLimit();\n\t}\n\n\tprivate setCacheLimit() {\t\n\t\tif (process.env.IS_WORKERS_ENABLED === 'true') {\n\t\t\tthis._heapLimit = this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3; // Use 50% of total heap size\n\t\t}\n\t}\n\n\tpublic async invalidatePubsCache(collection: string, type: string) {\n\t\tResolveIOServer.getMongoManager().invalidateQueryCache(collection);\n\n\t\tlet collSubs = this._subscriptions.filter(a => a.collections.includes(collection));\n\n\t\tfor (let sub of collSubs) {\n\t\t\tif (this._publications[sub.publication].user_specific) {\n\t\t\t\t// For user-specific publications, process each client separately\n\t\t\t\tPromise.all(\n\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.sendDataToOne(ws, client.messageId, sub, type, collection);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// Handle error\n\t\t\t\t\t\t\t\tthis._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During sendDataToOne - User Specific - Socket: ' + client.id_socket + ', User: ' + client.id_user + ', MessageId: ' + client.messageId + ', Pub: ' + sub.publication + ', Err: ' + JSON.stringify(err, null, 2));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// For non-user-specific publications, send data to all clients\n\t\t\t\tthis.sendDataToAll(sub);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add all files to publications private object\n\tpublic publications(method: SubscriptionModel) {\n\t\tthis._publications = Object.assign(this._publications, method);\n\t}\n\n\tpublic loggedInLatency(ws: WebSocket) {\n\t\tlet loggedInUser = this._loggedInUsers.find(a => a.id_ws === ws['id_socket']);\n\n\t\tif (loggedInUser) {\n\t\t\tloggedInUser.date = new Date();\n\n\t\t\tLoggedInUsers.updateOne({id_ws: ws['id_socket']}, {$set: {latency: ws['latency'], date: loggedInUser.date}}).then(res => {\n\t\t\t\tif (!res) {\n\t\t\t\t\tthis.unsubscribeAll(ws);\n\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', ws['user'], ws['id_socket'], 3);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, () => {\n\t\t\t\tthis.unsubscribeAll(ws);\n\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', ws['user'], ws['id_socket'], 4);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Subscribe to publication\n\tpublic subscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugSubHits += 1;\n\n\t\tif (!this._debugSubCollections.some(a => a.publication === publication)) {\n\t\t\tthis._debugSubCollections.push({\n\t\t\t\tpublication: publication,\n\t\t\t\thits: 1\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis._debugSubCollections.find(a => a.publication === publication).hits += 1;\n\t\t}\n\n\t\tlet pub = this._publications[publication];\n\n\t\tif (!pub) {\n\t\t\tconsole.error(new Date(), 'No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tif (subscriptionData.length > 1 || subscriptionData[0]) {\n\t\t\t\tif (!pub.check) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Function For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (!pub.check._schema) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Schema For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet valObj = {};\n\t\t\t\t\tlet valKeys = Object.keys(pub.check._schema);\n\n\t\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\n\t\t\t\t\tfor (let i = 0; i < subscriptionData.length; i++) {\n\t\t\t\t\t\tvalObj[rootKeys[i]] = subscriptionData[i];\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpub.check.validate(valObj);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (errors) {\n\t\t\t\t\t\tif (errors) {\n\t\t\t\t\t\t\tconsole.error(new Date(), 'Error in Pub Check (' + publication + ')', errors);\n\t\t\t\t\t\t\treturn;\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\tif (messageRoute !== 'Bypass') {\n\t\t\t\tlet urlData = messageRoute.split('/');\n\t\t\t\tlet urlModule = '';\n\t\t\t\tlet urlNext = urlData[0];\n\n\t\t\t\tif (urlData[0] === '') {\n\t\t\t\t\turlModule = '/';\n\t\t\t\t\turlNext = urlData[1];\n\t\t\t\t}\n\n\t\t\t\turlModule += urlNext;\n\n\t\t\t\tif (urlData.length > 1) {\n\t\t\t\t\turlModule += '/';\n\t\t\t\t}\n\n\t\t\t\tlet otherRouteSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_socket === ws['id_socket'] && b.messageRoute !== 'Bypass' && b.messageRoute !== '/' && b.messageRoute !== messageRoute && !b.messageRoute.startsWith(urlModule)));\n\n\t\t\t\tif (otherRouteSubs.length) {\n\t\t\t\t\tthis._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Detected Undestroyed Subscription - ' + this.serverConfig['CLIENT_NAME'], 'USER: ' + ws['user'] + ' (Socket: ' + ws['id_socket'] + ') ' + ' is on route: ' + messageRoute + ' but has the following subscriptions on other routes:' + JSON.stringify(otherRouteSubs, null, 2));\n\n\t\t\t\t\totherRouteSubs.forEach(otherSub => {\n\t\t\t\t\t\totherSub.clients.filter(a => a.id_socket === ws['id_socket']).forEach(client => {\n\t\t\t\t\t\t\tthis.unsubscribe(client.messageRoute, new Date(), ws, client.messageId, otherSub.publication, otherSub.subscriptionData);\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 sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\t// If sub found (another user watching same data), add client to same sub\n\t\t\tif (sub) {\n\t\t\t\tif (!sub.clients.some(a => a.id_socket === ws['id_socket'] && a.messageId === messageId)) {\n\t\t\t\t\tsub.clients.push({\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If sub not found, create new sub\n\t\t\telse {\n\t\t\t\tthis._subscriptions.push({\n\t\t\t\t\tpublication: publication,\n\t\t\t\t\tsubscriptionData: subscriptionData,\n\t\t\t\t\tcollections: this.getPublicationCollections(publication),\n\t\t\t\t\tclients: [{\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute\n\t\t\t\t\t}],\n\t\t\t\t\tcacheId: 0\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!sub) {\n\t\t\t\tsub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\t\t\t}\n\n\t\t\t// Immediately send data to the new client\n\t\t\tthis.processSubscription(sub, ws, messageId);\n\t\t}\n\t}\n\n\tpublic async createLoggedInUser(id_ws: string): Promise<LoggedInUserModel> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet ws = this._websocketManager.getWebSocket(id_ws);\n\n\t\t\tif (ws) {\n\t\t\t\tlet user = {\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t__v: 0,\n\t\t\t\t\tdate: new Date(),\n\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tthis._loggedInUsers.push(user);\n\t\t\t\tLoggedInUsers.insertOne(user);\n\t\t\t\t\n\t\t\t\tresolve(user);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresolve(null);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Unsubscribe from publication \n\tpublic unsubscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugUnSubHits += 1;\n\n\t\tif (!this._publications[publication]) {\n\t\t\tconsole.log('No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\tif (sub) {\n\t\t\t\tfor (let i = sub.clients.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (sub.clients[i].id_user === ws['id_user'] && sub.clients[i].messageId === messageId && sub.clients[i].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Unsubscribe from publication\n\tpublic async unsubscribeAll(ws: WebSocket) {\n\t\tthis._debugUnSubAllHits += 1;\n\n\t\tif (ws) {\n\t\t\tif (this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']) >= 0) {\n\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']), 1);\n\t\t\t}\n\t\t\tLoggedInUsers.deleteOne({ id_ws: ws['id_socket'] });\n\n\t\t\tlet userSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_user === ws['id_user'] && b.id_socket === ws['id_socket']));\n\n\t\t\tfor (let i = userSubs.length - 1; i >= 0; i--) {\n\t\t\t\tlet sub = userSubs[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tif (sub.clients[j].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._websocketManager.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic getActiveSubscriptions() {\n\t\treturn this._subscriptions;\n\t}\n\n\t// Get publication collection\n\tprivate getPublicationCollections(publication: string) {\n\t\treturn this._publications[publication].collections;\n\t}\n\n\t// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)\n\tprivate async tailOpLog(resumeToken?: ResumeToken) {\n\t\tif (this._oplog$ && !this._oplog$.closed) {\n\t\t\tthis._oplog$.removeAllListeners();\n\t\t\tthis._oplog$.close();\n\t\t\tthis._oplog$ = null;\n\t\t}\n\n\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\n\t\tif (!this._oplog$ || this._oplog$.closed) {\n\t\t\tthis._oplogRetryCount += 1;\n\n\t\t\tif (this._oplogRetryCount > 5) {\n\t\t\t\tconsole.error('****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tlet lastResumeToken: ResumeToken;\n\n\t\t\tif (resumeToken) {\n\t\t\t\tlastResumeToken = resumeToken;\n\t\t\t\ttry {\n\t\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch([], { resumeAfter: resumeToken });\n\t\t\t\t}\n\t\t\t\tcatch (errOp) {\n\t\t\t\t\tif (this._oplog$) {\n\t\t\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\t\t\tthis._oplog$.close();\n\t\t\t\t\t\tthis._oplog$ = null;\n\t\t\t\t\t}\n\t\t\t\t\tthis.tailOpLog(resumeToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch();\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'oplog started');\n\n\t\t\tthis._oplog$.on('change', (doc: ChangeStreamInsertDocument | ChangeStreamUpdateDocument | ChangeStreamReplaceDocument | ChangeStreamDeleteDocument) => {\n\t\t\t\tif (doc.ns) {\n\t\t\t\t\tlet collection = doc.ns.coll;\n\n\t\t\t\t\tif (!this._debugOplogCollections.some(a => a.collection === doc.ns.coll && a.type === doc.operationType)) {\n\t\t\t\t\t\tthis._debugOplogCollections.push({\n\t\t\t\t\t\t\tcollection: doc.ns.coll,\n\t\t\t\t\t\t\ttype: doc.operationType,\n\t\t\t\t\t\t\thits: 1\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\tthis._debugOplogCollections.find(a => a.collection === doc.ns.coll && a.type === doc.operationType).hits += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection && !collection.endsWith('.versions') && !collection.startsWith('monitor-') && collection !== 'logs' && collection !== 'log-method-latencies' && collection !== 'log-subscriptions') {\n\t\t\t\t\t\tthis._debugOplogHits += 1;\n\n\t\t\t\t\t\tif (doc.operationType === 'insert') {\n\t\t\t\t\t\t\tif (collection === 'support-tickets') {\n\t\t\t\t\t\t\t\tif (this.serverConfig['ROOT_URL'] === 'https://resolveio.com') {\n\t\t\t\t\t\t\t\t\tthis._mainServer.getMethodManager().callMethodInternal.call(this._mainServer.getMethodManager(), 'sendSupportTicketEmail', doc.documentKey['_id']);\n\t\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'update' || doc.operationType === 'replace') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'update');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'delete') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'delete');\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\tif (collection === 'flags') {\n\t\t\t\t\t\tFlags.findOne({ type: 'Enable Debug' }).then(flag => {\n\t\t\t\t\t\t\tif (flag && flag.value) {\n\t\t\t\t\t\t\t\tthis._enableDebug = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tthis._enableDebug = false;\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\tlastResumeToken = doc._id;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._oplog$.on('error', error => {\n\t\t\t\tconsole.log(new Date(), 'oplog error', error);\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$.close();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\n\t\t\tthis._oplog$.on('end', () => {\n\t\t\t\tconsole.log(new Date(), 'oplog end');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$.close();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\n\t\t\tthis._oplog$.on('close', () => {\n\t\t\t\tconsole.log(new Date(), 'oplog close');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async processSubscription(sub: ActiveSubscriptionModel, ws: WebSocket, messageId: number) {\n\t\tif (!this._publications[sub.publication].user_specific) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\ttry {\n\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\tdata: cacheData\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\tsub.cacheId = 0;\n\n\t\t\t\t\tthis.sendDataToAll(sub);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.sendDataToAll(sub);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.sendDataToOne(ws, messageId, sub, 'newSub', sub.collections[0]);\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToOne(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, type: string, collection: string) {\n\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('User Specific Publication', sub.publication, '', '', sub.subscriptionData);\n\t\ttry {\n\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ws['id_user'], ...sub.subscriptionData);\n\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: res\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: err\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\n\t\t\tthis._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendDataToOne - WS)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToAll(sub: ActiveSubscriptionModel) {\n\t\tif (!sub.clients.length) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\tsub.cacheId = 0;\n\t\t\t}\n\n\t\t\tlet subIndex = this._subscriptions.findIndex(a => a.publication === sub.publication && JSON.stringify(a.subscriptionData) === JSON.stringify(sub.subscriptionData));\n\t\t\tif (subIndex >= 0) {\n\t\t\t\tthis._subscriptions.splice(subIndex, 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Publication', sub.publication, '', '', sub.subscriptionData);\n\n\t\t\ttry {\n\t\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ...sub.subscriptionData);\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\tif (sub.cacheId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\t\n\t\t\t\t\t\tif (JSON.stringify(cacheData) !== JSON.stringify(res)) {\n\t\t\t\t\t\t\tPromise.all(\n\t\t\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\n\t\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\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\n\t\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tPromise.all(\n\t\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\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\n\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tPromise.all(\n\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\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\t\n\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\n\t\t\t\t\tconst nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\t\t\t// Evict cache entries as needed\n\t\t\t\t\t\tlet deleteCount = 0;\n\t\t\t\t\t\tconst subArr = this._subscriptions.filter(a => a.cacheId && !a.clients.length);\n\t\t\t\t\n\t\t\t\t\t\tfor (let zz = 0; zz < subArr.length; zz++) {\n\t\t\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\t\t\tthis._nodeCache.del(subArr[zz].cacheId);\n\t\t\t\t\t\t\tsubArr[zz].cacheId = 0;\n\t\t\t\t\t\t\tdeleteCount += 1;\n\t\t\t\t\t\t\tif (this._nodeCache.getStats().vsize < this._heapLimit * 0.75) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t'Sub Cache: ' +\n\t\t\t\t\t\t\t\t'Too Big - ' +\n\t\t\t\t\t\t\t\tsub.publication +\n\t\t\t\t\t\t\t\t' - Deleted: ' +\n\t\t\t\t\t\t\t\tdeleteCount +\n\t\t\t\t\t\t\t\t' - ' +\n\t\t\t\t\t\t\t\tnodeCacheSize\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\tPromise.all(\n\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\thasError: true,\n\t\t\t\t\t\t\t\tdata: err\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\tthis._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendPubData)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate sendWS(ws: WebSocket, data: ServerResponseModel) {\n\t\tthis._websocketManager.send(ws, data);\n\t}\n\n\tpublic getEnableDebug() {\n\t\treturn this._enableDebug;\n\t}\n}\n"]}
|
package/methods/accounts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/methods/accounts.ts"],"names":["simpl_schema_1","require","user_collection_1","handlebars","jwt","index_1","mongo_manager_1","loadAccountMethods","methodManager","methods","incorrectUser","check","default","old_user","type","Object","blackbox","new_user","client_subs","Array","client_subs.$","function","_this","this","Promise","resolve","reject","__awaiter","ws","ResolveIOServer","getMainServer","getWebSocketManager","getWebSocket","id_ws","sendEmail","serverConfig","JSON","stringify","user","id_user","getSubscriptionManager","getActiveSubscriptions","reloadWS","String","unsubscribeWS","reconnectWS","disconnectWS","createUserAndEmailEnrollment","newUser","Users","sendEnrollmentEmail","Boolean","optional","username","toLocaleLowerCase","findOne","$or","email","_a","sent","_id","objectIdHexString","services","enrollment","sign","expiresIn","is_customer","insertOne","emailData_1","fullname","url","encodeURIComponent","readFile","then","html","template","compile","registerHelper","a","b","getClientName","errEmail","resetUserPassword","userId","emailData_2","userToChangePassword","userWhoResetPassword","updateOne","$set","attempts","setUserPassword","password","roles","super_admin","setPassword","exports"],"mappings":"k8CAAAA,gB,yFAAAC,QAAA,cAAA,GACAC,kBAAAD,QAAA,gCAAA,EACAE,WAAAF,QAAA,YAAA,EACAG,IAAAH,QAAA,cAAA,EAGAI,QAAAJ,QAAA,UAAA,EAEAK,gBAAAL,QAAA,2BAAA,EAEA,SAAgBM,mBAAmBC,GAClCA,EAAcC,QAAQ,CACrBC,cAAe,CACdC,MAAO,IAAIX,eAAAY,QAAa,CACvBC,SAAU,CACTC,KAAMC,OACNC,SAAU,CAAA,C,EAEXC,SAAU,CACTH,KAAMC,OACNC,SAAU,CAAA,C,EAEXE,YAAa,CACZJ,KAAMK,K,EAEPC,gBAAiB,CAChBN,KAAMC,OACNC,SAAU,CAAA,C,EAEX,EACDK,SAAU,SAASR,EAAUI,EAAUC,GAA7B,IAAAI,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACpCM,EAAKvB,QAAAwB,gBAAgBC,cAAa,EAAGC,oBAAmB,EAAGC,aAAaT,KAAKU,KAAK,EAEtFV,KAAKW,UAAU,oBAAqB,kCAAoCX,KAAKY,aAA0B,YAAG,yBAA2BC,KAAKC,UAAUT,EAAI,KAAM,CAAC,EAAI,iBAAmBL,KAAKe,KAAO,mBAAqBf,KAAKgB,QAAU,2BAA6BH,KAAKC,UAAUhC,QAAAwB,gBAAgBC,cAAa,EAAGU,uBAAsB,EAAGC,uBAAsB,EAAI,KAAM,CAAC,EAAI,cAAgBL,KAAKC,UAAUxB,EAAU,KAAM,CAAC,EAAI,cAAgBuB,KAAKC,UAAUpB,EAAU,KAAM,CAAC,EAAI,iBAAmBmB,KAAKC,UAAUnB,EAAa,KAAM,CAAC,CAAC,EAE/gBO,EAAQ,CAAA,CAAI,E,QACZ,CACF,C,EAEDiB,SAAU,CACT/B,MAAO,IAAIX,eAAAY,QAAa,CACvBqB,MAAOU,M,CACP,EACDtB,SAAU,SAASY,GAAT,IAAAX,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACpCM,EAAKvB,QAAAwB,gBAAgBC,cAAa,EAAGC,oBAAmB,EAAGC,aAAaC,CAAK,IAGhF5B,QAAAwB,gBAAgBC,cAAa,EAAGc,cAAchB,CAAE,EAChDH,EAAQ,CAAA,CAAI,GAGZC,EAAO,OAAO,E,QAEf,CACF,C,EAEDmB,YAAa,CACZlC,MAAO,IAAIX,eAAAY,QAAa,CACvBqB,MAAOU,M,CACP,EACDtB,SAAU,SAASY,GAAT,IAAAX,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACpCM,EAAKvB,QAAAwB,gBAAgBC,cAAa,EAAGC,oBAAmB,EAAGC,aAAaC,CAAK,IAGhF5B,QAAAwB,gBAAgBC,cAAa,EAAGc,cAAchB,CAAE,EAChDH,EAAQ,CAAA,CAAI,GAGZC,EAAO,OAAO,E,QAEf,CACF,C,EAEDoB,aAAc,CACbnC,MAAO,IAAIX,eAAAY,QAAa,CACvBqB,MAAOU,M,CACP,EACDtB,SAAU,SAASY,GAAT,IAAAX,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACpCM,EAAKvB,QAAAwB,gBAAgBC,cAAa,EAAGC,oBAAmB,EAAGC,aAAaC,CAAK,IAGhF5B,QAAAwB,gBAAgBC,cAAa,EAAGc,cAAchB,CAAE,EAChDH,EAAQ,CAAA,CAAI,GAGZC,EAAO,OAAO,E,QAEf,CACF,C,EAEDqB,6BAA8B,CAC7BpC,MAAO,IAAIX,eAAAY,QAAa,CACvBoC,QAAS,CACRlC,KAAMZ,kBAAA+C,MAAmB,W,EAE1BC,oBAAqB,CACpBpC,KAAMqC,QACNC,SAAU,CAAA,C,EAEX,EACD/B,SAAU,SAAS2B,EAAoBE,GAA7B,IAAA5B,EAAAC,KACT,OADsC,KAAA,IAAA2B,IAAAA,EAAA,CAAA,GAC/B,IAAI1B,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,8EACK,UAAzC0B,EAAQK,SAASC,kBAAiB,EAAlC,CAAA,EAAA,IACH5B,EAAO,2BAA2B,EAClC,CAAA,I,OAGgB,MAAA,CAAA,EAAMxB,kBAAA+C,MAAMM,QAAQ,CACnCC,IAAK,CACJ,CAACH,SAAUL,EAAQK,SAASC,kBAAiB,CAAE,EAC/C,CAACG,MAAOT,EAAQS,MAAMH,kBAAiB,CAAE,E,CAE1C,G,OAED,GAPgBI,EAAAC,KAAA,EASf,OADAjC,EAAO,gCAAgC,EACvC,CAAA,G,iBAcF,OAVAsB,EAAQY,KAAM,EAAAtD,gBAAAuD,mBAAiB,EAE/Bb,EAAQc,SAAW,CAClBC,WAAY3D,IAAI4D,KAAK,CAACzB,QAASS,EAAQY,GAAG,EAAGrC,KAAKY,aAAyB,WAAG,CAC7E8B,UAAY,M,CACZ,C,EAGFjB,EAAQkB,YAAc,CAAA,EAEtB,CAAA,EAAMhE,kBAAA+C,MAAMkB,UAAUnB,CAAO,G,cAA7BU,EAAAC,KAAA,EAEIT,IACCkB,EAAY,CACfC,SAAUrB,EAAQqB,SAClB/B,KAAMf,KAAKe,KACXgC,IAAM/C,KAAKY,aAAuB,SAAI,mBAAqBoC,mBAAmBhD,KAAKY,aAAyB,UAAC,EAAI,IAAMa,EAAQc,SAAqB,U,EAGrJvC,KAAKiD,SAAS,iCAAiC,EAAEC,KAAK,SAAAC,GACjDC,EAAWxE,WAAWyE,QAAQF,CAAI,EACtCvE,WAAW0E,eAAe,SAAU,SAACC,EAAGC,GACvC,OAAOD,IAAMC,CACd,CAAC,EAEDzD,EAAKY,UAAUc,EAAQS,MAAO,cAAgBpD,QAAAwB,gBAAgBmD,cAAa,EAAK,uBAAwB,GAAIL,EAASP,CAAS,EAAG,KAAM,KAAM,EAAE,EAE/I3C,EAAQuB,CAAO,CAChB,EAAG,SAAAiC,GAAY,OAAAvD,EAAOuD,CAAQ,CAAf,CAAgB,G,SAEhC,CACF,C,EAEDC,kBAAmB,CAClBvE,MAAO,IAAIX,eAAAY,QAAa,CACvBuE,OAAQ,CACPrE,KAAM6B,M,EAEP,EACDtB,SAAU,SAAS8D,GAAT,IAAA7D,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,0EAC7B,MAAA,CAAA,EAAMpB,kBAAA+C,MAAMM,QAAQ,CAACK,IAAKuB,CAAM,CAAC,G,cAAxC7C,EAAOoB,EAAAC,KAAA,KAGLrB,EAAKwB,WACTxB,EAAKwB,SAAW,IAGjBxB,EAAKwB,SAA0B,gBAAI1D,IAAI4D,KAAK,CAACzB,QAAS4C,CAAM,EAAG5D,KAAKY,aAAyB,UAAC,EAE1FiD,EAAY,CACfC,qBAAsB/C,EAAK+B,SAC3BiB,qBAAsB/D,KAAKe,KAC3BgC,IAAM/C,KAAKY,aAAuB,SAAI,oBAAsBoC,mBAAmBhD,KAAKY,aAAyB,UAAC,EAAI,IAAMG,EAAKwB,SAA0B,e,EAGxJ5D,kBAAA+C,MAAMsC,UAAU,CAAC3B,IAAKtB,EAAKsB,GAAG,EAAG,CAAC4B,KAAM,CAAC1B,SAAUxB,EAAKwB,SAAU2B,SAAU,CAAC,CAAC,CAAC,EAAEhB,KAAK,WACrFnD,EAAKkD,SAAS,sCAAsC,EAAEC,KAAK,SAAAC,GACtDC,EAAWxE,WAAWyE,QAAQF,CAAI,EACtCvE,WAAW0E,eAAe,SAAU,SAACC,EAAGC,GACvC,OAAOD,IAAMC,CACd,CAAC,EAEDzD,EAAKY,UAAUI,EAAKmB,MAAO,cAAgBpD,QAAAwB,gBAAgBmD,cAAa,EAAK,sBAAuB,GAAIL,EAASS,CAAS,EAAG,KAAM,KAAM,EAAE,EAE3I3D,EAAQ,CAAA,CAAI,CACb,EAAG,SAAAwD,GAAY,OAAAvD,EAAOuD,CAAQ,CAAf,CAAgB,CAChC,EAAG,YAAQ,G,SAEZ,CACF,C,EAEDS,gBAAiB,CAChB/E,MAAO,IAAIX,eAAAY,QAAa,CACvBuE,OAAQ,CACPrE,KAAM6B,M,EAEPgD,SAAU,CACT7E,KAAM6B,M,EAEP,EACDtB,SAAU,SAAS8D,EAAgBQ,GAAzB,IAAArE,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iEAC7B,MAAA,CAAA,EAAMpB,kBAAA+C,MAAMM,QAAQ,CAACK,IAAKuB,CAAM,CAAC,G,aAExC7C,EAFAA,EAAOoB,EAAAC,KAAA,IAEErB,EAAKsD,MAAMC,YAApB,CAAA,EAAA,GACH,CAAA,EAAM3F,kBAAA+C,MAAM6C,YAAYxD,EAAMqD,CAAQ,G,cAAtCjC,EAAAC,KAAA,EAEAlC,EAAQ,CAAA,CAAI,E,aAGZC,EAAO,cAAc,E,gCAEtB,CACF,C,EAED,CACF,CAnNAqE,QAAAxF,mBAAAA","file":"accounts.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { Users } from '../collections/user.collection';\nimport * as handlebars from 'handlebars';\nimport * as jwt from 'jsonwebtoken';\nimport { LoggedInUsers } from '../collections/logged-in-users.collection';\nimport { MethodManager } from '../managers/method.manager';\nimport { ResolveIOServer } from '../index';\nimport { UserModel } from '../models/user.model';\nimport { objectIdHexString } from '../managers/mongo.manager';\n\nexport function loadAccountMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tincorrectUser: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\told_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tnew_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tclient_subs: {\n\t\t\t\t\ttype: Array\n\t\t\t\t},\n\t\t\t\t'client_subs.$': {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(old_user, new_user, client_subs) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(this.id_ws);\n\n\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - WRONG USER Detected - ' + this.serverConfig['CLIENT_NAME'], 'Wrong User Sent!\\nWS: ' + JSON.stringify(ws, null, 2) + '\\nUserMethod: ' + this.user + '\\nIdUserMethod: ' + this.id_user + '\\nSubManagerActiveSubs: ' + JSON.stringify(ResolveIOServer.getMainServer().getSubscriptionManager().getActiveSubscriptions(), null, 2) + '\\nOldUser: ' + JSON.stringify(old_user, null, 2) + '\\nNewUser: ' + JSON.stringify(new_user, null, 2) + '\\nClientSubs: ' + JSON.stringify(client_subs, null, 2));\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treloadWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdisconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcreateUserAndEmailEnrollment: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tnewUser: {\n\t\t\t\t\ttype: Users['simplschema']\n\t\t\t\t},\n\t\t\t\tsendEnrollmentEmail: {\n\t\t\t\t\ttype: Boolean,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(newUser: UserModel, sendEnrollmentEmail = true) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tif (newUser.username.toLocaleLowerCase() === 'admin') {\n\t\t\t\t\t\treject('Username can not be admin');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet otherUser = await Users.findOne({\n\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t{username: newUser.username.toLocaleLowerCase()},\n\t\t\t\t\t\t\t\t{email: newUser.email.toLocaleLowerCase()}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (otherUser) {\n\t\t\t\t\t\t\treject('Username/Email is already used');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tnewUser._id = objectIdHexString();\n\n\t\t\t\t\tnewUser.services = {\n\t\t\t\t\t\tenrollment: jwt.sign({id_user: newUser._id}, this.serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 3 * 24 * 60 * 60 * 1000 // 3 days\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\n\t\t\t\t\tnewUser.is_customer = false;\n\t\t\t\t\t\n\t\t\t\t\tawait Users.insertOne(newUser);\n\n\t\t\t\t\tif (sendEnrollmentEmail) {\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tfullname: newUser.fullname,\n\t\t\t\t\t\t\tuser: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/enroll-account?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + newUser.services['enrollment'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.readFile('email-templates/enrollment.html').then(html => {\n\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\tthis.sendEmail(newUser.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Enrollment Email', '', template(emailData), null, null, '');\n\t\t\n\t\t\t\t\t\t\tresolve(newUser);\n\t\t\t\t\t\t}, errEmail => reject(errEmail));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: userId}, this.serverConfig['JWT_SECRET']);\n\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\t\tuserWhoResetPassword: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {services: user.services, attempts: 0}}).then(() => {\n\t\t\t\t\t\t\tthis.readFile('email-templates/forgot-password.html').then(html => {\n\t\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t\t});\n\t\t\t\n\t\t\t\t\t\t\t\tthis.sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\n\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t}, errEmail => reject(errEmail));\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\tsetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string, password: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user && !user.roles.super_admin) {\n\t\t\t\t\t\tawait Users.setPassword(user, password);\n\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('Invalid User');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/methods/accounts.ts"],"names":["simpl_schema_1","require","user_collection_1","handlebars","jwt","index_1","mongo_manager_1","loadAccountMethods","methodManager","methods","incorrectUser","check","default","old_user","type","Object","blackbox","new_user","client_subs","Array","client_subs.$","function","_this","this","Promise","resolve","reject","__awaiter","ws","ResolveIOServer","getMainServer","getWebSocketManager","getWebSocket","id_ws","sendEmail","serverConfig","JSON","stringify","user","id_user","getSubscriptionManager","getActiveSubscriptions","reloadWS","String","unsubscribeWS","reconnectWS","disconnectWS","createUserAndEmailEnrollment","newUser","Users","sendEnrollmentEmail","Boolean","optional","username","toLocaleLowerCase","findOne","$or","email","_a","sent","_id","objectIdHexString","services","enrollment","sign","expiresIn","is_customer","insertOne","emailData_1","fullname","url","encodeURIComponent","readFile","then","html","template","compile","registerHelper","a","b","getClientName","errEmail","resetUserPassword","userId","emailData_2","userToChangePassword","userWhoResetPassword","updateOne","$set","attempts","setUserPassword","password","roles","super_admin","setPassword","exports"],"mappings":"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","file":"accounts.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { Users } from '../collections/user.collection';\nimport * as handlebars from 'handlebars';\nimport * as jwt from 'jsonwebtoken';\nimport { MethodManager } from '../managers/method.manager';\nimport { ResolveIOServer } from '../index';\nimport { UserModel } from '../models/user.model';\nimport { objectIdHexString } from '../managers/mongo.manager';\n\nexport function loadAccountMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tincorrectUser: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\told_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tnew_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tclient_subs: {\n\t\t\t\t\ttype: Array\n\t\t\t\t},\n\t\t\t\t'client_subs.$': {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(old_user, new_user, client_subs) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(this.id_ws);\n\n\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - WRONG USER Detected - ' + this.serverConfig['CLIENT_NAME'], 'Wrong User Sent!\\nWS: ' + JSON.stringify(ws, null, 2) + '\\nUserMethod: ' + this.user + '\\nIdUserMethod: ' + this.id_user + '\\nSubManagerActiveSubs: ' + JSON.stringify(ResolveIOServer.getMainServer().getSubscriptionManager().getActiveSubscriptions(), null, 2) + '\\nOldUser: ' + JSON.stringify(old_user, null, 2) + '\\nNewUser: ' + JSON.stringify(new_user, null, 2) + '\\nClientSubs: ' + JSON.stringify(client_subs, null, 2));\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treloadWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdisconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcreateUserAndEmailEnrollment: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tnewUser: {\n\t\t\t\t\ttype: Users['simplschema']\n\t\t\t\t},\n\t\t\t\tsendEnrollmentEmail: {\n\t\t\t\t\ttype: Boolean,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(newUser: UserModel, sendEnrollmentEmail = true) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tif (newUser.username.toLocaleLowerCase() === 'admin') {\n\t\t\t\t\t\treject('Username can not be admin');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet otherUser = await Users.findOne({\n\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t{username: newUser.username.toLocaleLowerCase()},\n\t\t\t\t\t\t\t\t{email: newUser.email.toLocaleLowerCase()}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (otherUser) {\n\t\t\t\t\t\t\treject('Username/Email is already used');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tnewUser._id = objectIdHexString();\n\n\t\t\t\t\tnewUser.services = {\n\t\t\t\t\t\tenrollment: jwt.sign({id_user: newUser._id}, this.serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 3 * 24 * 60 * 60 * 1000 // 3 days\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\n\t\t\t\t\tnewUser.is_customer = false;\n\t\t\t\t\t\n\t\t\t\t\tawait Users.insertOne(newUser);\n\n\t\t\t\t\tif (sendEnrollmentEmail) {\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tfullname: newUser.fullname,\n\t\t\t\t\t\t\tuser: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/enroll-account?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + newUser.services['enrollment'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.readFile('email-templates/enrollment.html').then(html => {\n\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\tthis.sendEmail(newUser.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Enrollment Email', '', template(emailData), null, null, '');\n\t\t\n\t\t\t\t\t\t\tresolve(newUser);\n\t\t\t\t\t\t}, errEmail => reject(errEmail));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: userId}, this.serverConfig['JWT_SECRET']);\n\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\t\tuserWhoResetPassword: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {services: user.services, attempts: 0}}).then(() => {\n\t\t\t\t\t\t\tthis.readFile('email-templates/forgot-password.html').then(html => {\n\t\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t\t});\n\t\t\t\n\t\t\t\t\t\t\t\tthis.sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\n\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t}, errEmail => reject(errEmail));\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\tsetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string, password: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user && !user.roles.super_admin) {\n\t\t\t\t\t\tawait Users.setPassword(user, password);\n\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('Invalid User');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n}"]}
|
package/package.json
CHANGED
package/server-app.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var __awaiter=this&&this.__awaiter||function(e,n,s,o){return new(s=s||Promise)(function(t,r){function fulfilled(e){try{step(o.next(e))}catch(e){r(e)}}function rejected(e){try{step(o.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?t(e.value):((r=e.value)instanceof s?r:new s(function(e){e(r)})).then(fulfilled,rejected)}step((o=o.apply(e,n||[])).next())})},__generator=this&&this.__generator||function(n,s){var o,i,a,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(u[Symbol.iterator]=function(){return this}),u;function verb(t){return function(e){var r=[t,e];if(o)throw new TypeError("Generator is already executing.");for(;c=u&&r[u=0]?0:c;)try{if(o=1,i&&(a=2&r[0]?i.return:r[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,r[1])).done)return a;switch(i=0,(r=a?[2&r[0],a.value]:r)[0]){case 0:case 1:a=r;break;case 4:return c.label++,{value:r[1],done:!1};case 5:c.label++,i=r[1],r=[0];continue;case 7:r=c.ops.pop(),c.trys.pop();continue;default:if(!(a=0<(a=c.trys).length&&a[a.length-1])&&(6===r[0]||2===r[0])){c=0;continue}if(3===r[0]&&(!a||r[1]>a[0]&&r[1]<a[3]))c.label=r[1];else if(6===r[0]&&c.label<a[1])c.label=a[1],a=r;else{if(!(a&&c.label<a[2])){a[2]&&c.ops.pop(),c.trys.pop();continue}c.label=a[2],c.ops.push(r)}}r=s.call(n,c)}catch(e){r=[6,e],i=0}finally{o=a=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},__values=this&&this.__values||function(e){var r="function"==typeof Symbol&&Symbol.iterator,t=r&&e[r],n=0;if(t)return t.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&n>=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(r?"Object is not iterable.":"Symbol.iterator is not defined.")},__read=this&&this.__read||function(e,r){var t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var n,s,o=t.call(e),i=[];try{for(;(void 0===r||0<r--)&&!(n=o.next()).done;)i.push(n.value)}catch(e){s={error:e}}finally{try{n&&!n.done&&(t=o.return)&&t.call(o)}finally{if(s)throw s.error}}return i},__spreadArray=this&&this.__spreadArray||function(e,r,t){if(t||2===arguments.length)for(var n,s=0,o=r.length;s<o;s++)!n&&s in r||((n=n||Array.prototype.slice.call(r,0,s))[s]=r[s]);return e.concat(n||Array.prototype.slice.call(r))},http_1=(Object.defineProperty(exports,"__esModule",{value:!0}),require("http")),express=require("express"),bodyParser=require("body-parser"),xmlParser=require("express-xml-bodyparser"),WebSocket=require("ws"),jwt=require("jsonwebtoken"),moment=require("moment-timezone"),common_1=require("./util/common"),mongo_manager_1=require("./managers/mongo.manager"),cron_manager_1=require("./managers/cron.manager"),method_manager_1=require("./managers/method.manager"),subscription_manager_1=require("./managers/subscription.manager"),monitor_manager_1=require("./managers/monitor.manager"),method_response_collection_1=require("./collections/method-response.collection"),log_collection_1=require("./collections/log.collection"),log_method_latency_collection_1=require("./collections/log-method-latency.collection"),user_collection_1=require("./collections/user.collection"),home_1=require("./http/home"),auth_1=require("./http/auth"),health_1=require("./http/health"),index_1=require("./index"),mongodb_1=require("mongodb"),worker_task_request_collection_1=require("./collections/worker-task-request.collection"),worker_task_response_collection_1=require("./collections/worker-task-response.collection"),websocket_manager_1=require("./managers/websocket.manager"),ResolveIOMainServer=function(){function ResolveIOMainServer(e,r,t,n,s,o,i){void 0===i&&(i=!1);var a=this;this._offlineUpdates=[],this.sesMail=!1,this.standardProgram=!1,this.publicProgram=!1,this._rebootFlag=!1,this.LOGGER="ERROR",this._clientRoutes=[],this._lastErrorMsg=null,this._debugMsgRecv=0,this._debugMsgQueue=0,this._isWorkersEnabled=!1,this._isWorkerInstance=!1,this._workerTasks=[],this._safeShutdown=!1,this._serverConfig=r,this._clientRoutes=t,this._clientDir=n,this.sesMail=s,this.standardProgram=o,this.publicProgram=i,this._serverStartTime=new Date,this._lastErrorMsg=null,this._monitorManager=new monitor_manager_1.MonitorManager(e,r),this._monitorManagerFunction=new monitor_manager_1.MonitorManagerFunction,this._isWorkersEnabled="true"===process.env.IS_WORKERS_ENABLED,this._isWorkerInstance="true"===process.env.IS_WORKER_INSTANCE,setInterval(function(){a._subscriptionManager&&a._subscriptionManager.getEnableDebug()&&(console.log(new Date,"Server App","Msg Recv Hits",a._debugMsgRecv),console.log(new Date,"Server App","Msg Queue Hits",a._debugMsgQueue)),a._debugMsgQueue=0,a._debugMsgRecv=0},6e4),process.on("unhandledRejection",function(n,s){return __awaiter(a,void 0,void 0,function(){var r,t=this;return __generator(this,function(e){switch(e.label){case 0:return n&&"MongoError"===n.name&&48===n.code?[2]:(console.error(new Date,"Unhandled Rejection at Promise",[n,s]),r=moment().diff(this._serverStartTime,"seconds"),n&&("MongoNetworkTimeoutError"===n.name||n instanceof mongodb_1.MongoNetworkTimeoutError)?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - MongoNetworkTimeoutError - Quitting NodeJS - "+this._serverConfig.CLIENT_NAME,JSON.stringify({name:n.name,message:n.message,stack:n.stack},null,2))]):[3,2]:[3,3]);case 1:e.sent(),process.exit(1),e.label=2;case 2:return[3,10];case 3:return n&&"MongoError"===n.name&&"not master"===n.message?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - Quitting NodeJS - "+this._serverConfig.CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,5]:[3,6];case 4:e.sent(),e.label=5;case 5:return process.exit(1),[3,10];case 6:return n&&"MongoError"===n.name&&"not master and slaveOk=false"===n.message?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - Quitting NodeJS - "+this._serverConfig.CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,8]:[3,9];case 7:e.sent(),e.label=8;case 8:return process.exit(1),[3,10];case 9:n&&"StatusError"!==n.name&&""!==n.message&&60<r&&!this._lastErrorMsg&&(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - "+this._serverConfig.CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))),e.label=10;case 10:return[2]}})})}),process.on("uncaughtException",function(t){return __awaiter(a,void 0,void 0,function(){var r=this;return __generator(this,function(e){switch(e.label){case 0:return(console.error(t,"Uncaught Exception thrown"),60<moment().diff(this._serverStartTime,"seconds")&&!this._lastErrorMsg)?(this._lastErrorMsg=new Date,setTimeout(function(){r._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Exception - "+this._serverConfig.CLIENT_NAME,JSON.stringify([t.name,t.message,t.stack],null,2))]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),process.on("SIGINT",function(){a._rebootFlag=!0,a._serverHTTP.close(),a.safeShutdown()}),process.on("SIGTERM",function(){a._rebootFlag=!0,a._serverHTTP.close(),a.safeShutdown()}),process.on("SIGQUIT",function(){a._rebootFlag=!0,a._serverHTTP.close(),a.safeShutdown()}),"DEBUG"===this.LOGGER&&console.log("Starting ResolveIO Server"),this._isWorkersEnabled?this._isWorkerInstance?(console.log("Running as a Worker instance"),this._methodManager=new method_manager_1.MethodManager(this,this._serverConfig,this._clientDir,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._cronManager=new cron_manager_1.CronManager(this),this.startWorkerInstance()):(console.log("Running as a Server instance"),this._websocketManager=new websocket_manager_1.WebSocketManager(this),this.startServerInstance(r),this._methodManager=new method_manager_1.MethodManager(this,this._serverConfig,this._clientDir,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=new subscription_manager_1.SubscriptionManager(this,this._serverWSS,this._serverConfig,this._monitorManagerFunction),this.listen()):(console.log("Running with Workers Disabled"),this._websocketManager=new websocket_manager_1.WebSocketManager(this),this.startServerInstance(r),this._methodManager=new method_manager_1.MethodManager(this,this._serverConfig,this._clientDir,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=new subscription_manager_1.SubscriptionManager(this,this._serverWSS,this._serverConfig,this._monitorManagerFunction),this._cronManager=new cron_manager_1.CronManager(this),this.listen())}return ResolveIOMainServer.prototype.startServerInstance=function(e){this._app=express(),this._app.use(bodyParser.json({limit:"50mb",reviver:common_1.dateReviver})),this._app.use(bodyParser.urlencoded({limit:"50mb",extended:!0,parameterLimit:1e6})),this._app.use(xmlParser()),this._portHTTP=process.env.PORT_HTTP||e.PORT_HTTP||8080,this._portWSS=process.env.PORT_WSS||e.PORT_WSS||8081,"DEBUG"===this.LOGGER&&console.log("Setup ports"),this.createServer(),"DEBUG"===this.LOGGER&&console.log("Create server"),this._app.use(function(e,r,t){r.setHeader("Access-Control-Allow-Origin","*"),r.setHeader("Access-Control-Allow-Methods","GET, POST"),r.setHeader("Access-Control-Allow-Headers","X-Requested-With,content-type"),r.setHeader("Access-Control-Allow-Credentials","false"),t()}),"DEBUG"===this.LOGGER&&console.log("Setup cors"),(0,auth_1.setupAuthRoutes)(this,this._app,e),(0,health_1.setupHealthRoutes)(this._app,e),"ResolveIO"!==e.CLIENT_NAME&&!this.standardProgram||(0,home_1.setupHomeRoutes)(this,this._app,e),"DEBUG"===this.LOGGER&&console.log("Setup express routes")},ResolveIOMainServer.prototype.startWorkerInstance=function(){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c=this;return __generator(this,function(e){switch(e.label){case 0:return console.log("Worker instance started, watching worker-task-reqs..."),(r=worker_task_request_collection_1.WorkerTaskRequests.watchCollection([{$match:{"fullDocument.status":"pending"}}],{fullDocument:"updateLookup"})).on("change",function(s){return __awaiter(c,void 0,void 0,function(){var r,t,n=this;return __generator(this,function(e){return"insert"===s.operationType?(r=s.fullDocument)&&setTimeout(function(){n.processTask(r)},25*this._workerTasks.length):"update"===s.operationType&&(t=s.fullDocument)&&"pending"===t.status&&setTimeout(function(){n.processTask(t)},25*this._workerTasks.length),[2]})})}),r.on("error",function(e){console.error("Error in change stream worker task requests:",e),r.close(),setTimeout(function(){return c.startWorkerInstance()},5e3)}),r.on("close",function(){console.log("Change stream worker task requests closed. Restarting..."),setTimeout(function(){return c.startWorkerInstance()},5e3)}),[4,worker_task_request_collection_1.WorkerTaskRequests.find({status:"pending"},{sort:{createdAt:1}})];case 1:t=e.sent();try{for(n=__values(t),s=n.next();!s.done;s=n.next())o=s.value,this.processTask(o)}catch(e){i={error:e}}finally{try{s&&!s.done&&(a=n.return)&&a.call(n)}finally{if(i)throw i.error}}return[2]}})})},ResolveIOMainServer.prototype.processTask=function(s){return __awaiter(this,void 0,void 0,function(){var r=this;return __generator(this,function(e){return this._workerTasks.includes(s._id)||worker_task_request_collection_1.WorkerTaskRequests.updateOne({_id:s._id,status:"pending"},{$set:{status:"processing"}}).then(function(n){return __awaiter(r,void 0,void 0,function(){var r,t;return __generator(this,function(e){switch(e.label){case 0:if(!n)return[3,5];this._workerTasks.push(s._id),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(t=this._methodManager.callMethodInternal).call.apply(t,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:s.id_user,user:s.user,id_ws:s.id_ws}),s.method],__read(s.params),!1))];case 2:return t=e.sent(),worker_task_response_collection_1.WorkerTaskResponses.create({id_request:s._id,has_error:!1,data:t,id_user:s.id_user,user:s.user,id_ws:s.id_ws}),[3,4];case 3:return r=e.sent(),console.error("Worker failed to process task:",s._id,r),worker_task_response_collection_1.WorkerTaskResponses.create({id_request:s._id,has_error:!0,data:r.message,id_user:s.id_user,user:s.user,id_ws:s.id_ws}),[3,4];case 4:this._workerTasks.includes(s._id)&&this._workerTasks.splice(this._workerTasks.indexOf(s._id),1),worker_task_request_collection_1.WorkerTaskRequests.updateOne({_id:s._id},{$set:{status:"complete"}}),e.label=5;case 5:return[2]}})})},function(){}),[2]})})},ResolveIOMainServer.prototype.safeShutdown=function(){var e=this;this._safeShutdown||console.log(new Date,"Safe Shutdown Command Received"),this._monitorManagerFunction.getActiveMonitorFunctions().length||this._offlineUpdates.length?(this._safeShutdown||(this._safeShutdown=!0,setTimeout(function(){e._safeShutdown=!1},1e3),console.log(new Date,"Safe Exit In Progress",this._monitorManagerFunction.getActiveMonitorFunctions().length,this._offlineUpdates.length)),setImmediate(function(){e.safeShutdown()})):index_1.ResolveIOServer.getMongoConnection().close(!1).then(function(){console.log(new Date,"Safe Exit Complete, Process Exit"),process.exit(0)},function(){process.exit(1)})},ResolveIOMainServer.prototype.getIsWorkersEnabled=function(){return this._isWorkersEnabled},ResolveIOMainServer.prototype.getIsWorkerInstance=function(){return this._isWorkerInstance},ResolveIOMainServer.prototype.getWSList=function(){var r=[];return this._serverWSS.clients.forEach(function(e){r.push(e.id_socket)}),r},ResolveIOMainServer.prototype.getWSUserList=function(){var r=[];return this._serverWSS.clients.forEach(function(e){r.push(e.id_user)}),r},ResolveIOMainServer.prototype.getHTTPServer=function(){return this._serverHTTP},ResolveIOMainServer.prototype.getCronManager=function(){return this._cronManager},ResolveIOMainServer.prototype.getMethodManager=function(){return this._methodManager},ResolveIOMainServer.prototype.getSubscriptionManager=function(){return this._subscriptionManager},ResolveIOMainServer.prototype.getMonitorManager=function(){return this._monitorManager},ResolveIOMainServer.prototype.getRebootFlag=function(){return this._rebootFlag},ResolveIOMainServer.prototype.getWebSocketManager=function(){return this._websocketManager},ResolveIOMainServer.prototype.createServer=function(){var e=this;this._serverHTTP=(0,http_1.createServer)(this._app),this._serverHTTP.keepAliveTimeout=65e3,this._serverHTTP.headersTimeout=66e3,this._serverWSS=new WebSocket.Server({port:this._portWSS,verifyClient:this.publicProgram?null:function(o,i){return __awaiter(e,void 0,void 0,function(){var r,s=this;return __generator(this,function(e){return this._rebootFlag?i(!1,409,"Unable To Process"):("DEBUG"===this.LOGGER&&console.log("Verify Client",o,i),r=o.req.headers["sec-websocket-protocol"].split(/,/),(o.origin===this._serverConfig.ROOT_URL||o.origin===this._serverConfig.SEC_ROOT_URL||o.origin===this._serverConfig.RESOLVEIO_URL||o.origin===this._serverConfig.RESOLVEIO_SECONDARY_URL)&&(r=r[0])?jwt.verify(r,this._serverConfig.JWT_SECRET,function(t,n){return __awaiter(s,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return t?(i(!1,401,"Unauthorized"),[3,5]):[3,1];case 1:o.req.id_user=n.id_user,e.label=2;case 2:return e.trys.push([2,4,,5]),[4,user_collection_1.Users.findById(n.id_user)];case 3:return(r=e.sent())?(o.req.user=r.fullname,o.req.user_readonly=r.readonly||!1,o.req.doc_user=r,i(!0)):i(!1),[3,5];case 4:return e.sent(),i(!1),[3,5];case 5:return[2]}})})}):i(!1,401,"Unauthorized")),[2]})})}})},ResolveIOMainServer.prototype.listen=function(){var t=this;this._serverHTTP.listen(this._portHTTP,function(){console.log("Running server on port %s",t._portHTTP)}),this._serverWSS.on("listening",function(){console.log("Running server on port %s",t._portWSS)}),this._serverWSS.on("connection",function(u,e){t.publicProgram||(u.id_user=e.id_user,u.user=e.user,u.user_readonly=e.user_readonly,u.doc_user=e.doc_user,"Admin"!==u.user&&"ResolveIO"!==t._serverConfig.CLIENT_NAME&&t.getMethodManager().callMethodInternal.call(t.getMethodManager(),"supportCreateBillingUser",{id_user:u.id_user,user:u.user,date:new Date,client:index_1.ResolveIOServer.getClientName()})),u.id_socket=(0,mongo_manager_1.objectIdHexString)(),u.retryCnt=0,t._websocketManager.addWebSocket(u),t._subscriptionManager.createLoggedInUser(u.id_socket).then(function(){setTimeout(function(){u.pingTime=new Date,u.send("ping",function(e){e&&(t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),t.unsubscribeWS(u))})},5e3)}),"DEBUG"===t.LOGGER&&console.log("Connection from: "+e.user),u.isAlive=!0,u.on("message",function(c){return __awaiter(t,void 0,void 0,function(){var r,t,n,s,o,i,a=this;return __generator(this,function(e){switch(e.label){case 0:"DEBUG"===this.LOGGER&&console.log("Message from: "+u.user,c),this._debugMsgRecv+=1,s=!1,r=[];try{r=JSON.parse(c,common_1.dateReviver)}catch(e){console.log("Error - JSON.parse",c),this._methodManager.sendEmail("dev@resolveio.com","SERVER - JSON Parse Error - "+this._serverConfig.CLIENT_NAME,JSON.stringify([c,e])),s=!0}if(s)return[3,8];if("string"==typeof r&&"ping"===r)u&&u.readyState===u.OPEN&&u.send("pong",function(e){e&&(a._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Pong"),a.unsubscribeWS(u))});else if("string"==typeof r&&"pong"===r)u.isAlive=!0,u.pongTime=new Date,u.latency=moment.duration(moment(u.pongTime).diff(u.pingTime)).asMilliseconds(),this._subscriptionManager.loggedInLatency(u);else{if(Array.isArray(r[0]))return[3,1];console.log("Invalid message format, expected array:",r)}return[2];case 1:e.trys.push([1,6,7,8]),t=__values(r),n=t.next(),e.label=2;case 2:return n.done?[3,5]:(s=n.value,[4,this.processSocketMessage(u,s)]);case 3:e.sent(),e.label=4;case 4:return n=t.next(),[3,2];case 5:return[3,8];case 6:return o=e.sent(),o={error:o},[3,8];case 7:try{n&&!n.done&&(i=t.return)&&i.call(t)}finally{if(o)throw o.error}return[7];case 8:return[2]}})})}).on("end",function(){t.unsubscribeWS(u),t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","WS End")}).on("close",function(){t.unsubscribeWS(u),t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","WS Close")}).on("error",function(e){t.unsubscribeWS(u),t._subscriptionManager.getEnableDebug()&&console.log(new Date,u.user,u.id_socket,"WS Error")})}),setInterval(function(){t._serverWSS.clients.forEach(function(r){r.pingTime&&2e4<=Date.now()-r.pingTime.getTime()&&(!1===r.isAlive?(r.retryCnt++,3<=r.retryCnt?t.unsubscribeWS(r):(r.pingTime=new Date,r.send("ping",function(e){e&&(t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),t.unsubscribeWS(r))}))):(r.retryCnt=0,r.isAlive=!1,r.pingTime=new Date,r.send("ping",function(e){e&&(t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),t.unsubscribeWS(r))})))})},2e4)},ResolveIOMainServer.prototype.processSocketMessage=function(S,b){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c,u,l,_,g,h,d,p,f,m,v=this;return __generator(this,function(e){switch(e.label){case 0:return(r=b[0],this.publicProgram||!this._clientRoutes.some(function(e){return r.includes(e)})||S.doc_user.roles.groups.some(function(e){return e.views.some(function(e){return r.includes(e)||e.includes(r)})})||S.doc_user.roles.super_admin)?(a=b[1],t=b[2],"subscription"!==(n=b[3])?[3,1]:(i=b[4],f=b[5],"sub"===i?this._subscriptionManager.subscribe(r,a,S,t,f,b.slice(6)):this._subscriptionManager.unsubscribe(r,a,S,t,f,b.slice(6)),[3,11])):[2];case 1:if(this.publicProgram||"offline"!==n)return[3,10];d={messageId:t,hasError:!1,data:"ACK"},S&&S.readyState===S.OPEN&&this._websocketManager.send(S,JSON.stringify(d)),this._offlineUpdates.push(S),s=b[4],o=0,e.label=2;case 2:if(!(o<s.length))return[3,9];if(i=s[o],c=i.data,a={messageId:i.data[2],hasError:!1,data:"ACK"},S&&S.readyState===S.OPEN&&this._websocketManager.send(S,JSON.stringify(a)),c.shift(),c.shift(),c.shift(),c.shift(),p=c.shift(),h=(0,mongo_manager_1.objectIdHexString)(),log_method_latency_collection_1.LogMethodLatencies.create({_id:h,__v:0,date_start:new Date,date_end:null,latency_ms:0,method:p}),"reportBuilderGetResults"!==p&&"reportBuilderGetDistinctValue"!==p&&"reportBuilderBuildTree"!==p&&"generatePDF"!==p&&"getWOOfflineData"!==p&&"countQuery"!==p&&"countWithQuery"!==p&&"countCollectionWithQuery"!==p&&"find"!==p&&"findOne"!==p&&"findWithOptions"!==p&&"getDrivers"!==p&&"processAirdropDistribution"!==p&&log_collection_1.Logs.insertOne({_id:(0,mongo_manager_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(c))<2e5?JSON.stringify(c,null,2):"Too Big",method:p,id_user:S.id_user||"",user:S.user||"",messageId:t,route:r}),!this._methodManager._methods[p])return[3,7];e.label=3;case 3:return e.trys.push([3,5,,6]),[4,(f=this._methodManager.callMethodInternal).call.apply(f,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:S.id_user,user:S.user,id_ws:S.id_socket}),p],__read(c),!1))];case 4:return e.sent(),[3,6];case 5:return u=e.sent(),console.log(new Date,"Offline Error",JSON.stringify(u,null,2)),[3,6];case 6:return"updateDocumentOffline"!==p&&"updateDocumentPropsOffline"!==p||index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(c[0]),[3,8];case 7:console.log("Offline - Could not find method: "+p),e.label=8;case 8:return o++,[3,2];case 9:return this._offlineUpdates.splice(this._offlineUpdates.map(function(e){return e.id_socket}).indexOf(S.id_socket),1),[3,11];case 10:if(c=__spreadArray([],__read(b),!1),u=c.shift(),l=c.shift(),_=c.shift(),"method"===(g=c.shift())){if(p=c.shift(),S.user_readonly)return[2];h=(0,mongo_manager_1.objectIdHexString)(),log_method_latency_collection_1.LogMethodLatencies.create({_id:h,__v:0,date_start:new Date,date_end:null,latency_ms:0,method:p}),"reportBuilderGetResults"!==p&&"reportBuilderGetDistinctValue"!==p&&"reportBuilderBuildTree"!==p&&"generatePDF"!==p&&"getWOOfflineData"!==p&&"countQuery"!==p&&"countWithQuery"!==p&&"countCollectionWithQuery"!==p&&"find"!==p&&"findOne"!==p&&"findWithOptions"!==p&&"getDrivers"!==p&&"processAirdropDistribution"!==p&&log_collection_1.Logs.insertOne({_id:(0,mongo_manager_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(c))<2e5?JSON.stringify(c,null,2):"Too Big",method:p,id_user:S.id_user||"",user:S.user||"",messageId:_,route:u}),d={messageId:_,hasError:!1,data:"ACK"},S&&S.readyState===S.OPEN&&this._websocketManager.send(S,JSON.stringify(d)),this._methodManager._methods[p]?(m=this._methodManager).callMethod.apply(m,__spreadArray([h,S,l,_,p],__read(c),!1)):console.log("Could not find method: "+p)}else"methodResponse"===g&&(p=c.shift(),method_response_collection_1.MethodResponses.findOne({$and:[{id_user:S.id_user},{message_id:_},{method:p},{date:l}]}).then(function(e){e&&S&&S.readyState===S.OPEN&&v._websocketManager.send(S,JSON.stringify(e.response))},function(e){}));e.label=11;case 11:return[2]}})})},ResolveIOMainServer.prototype.unsubscribeWS=function(e){this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Unsub WS",e.user,e.id_socket),this._subscriptionManager.unsubscribeAll(e),e.removeAllListeners()},ResolveIOMainServer.prototype.getApp=function(){return this._app},ResolveIOMainServer.prototype.getServerConfig=function(){return this._serverConfig},ResolveIOMainServer}();exports.default=ResolveIOMainServer;
|
|
1
|
+
"use strict";var __awaiter=this&&this.__awaiter||function(e,n,s,o){return new(s=s||Promise)(function(t,r){function fulfilled(e){try{step(o.next(e))}catch(e){r(e)}}function rejected(e){try{step(o.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?t(e.value):((r=e.value)instanceof s?r:new s(function(e){e(r)})).then(fulfilled,rejected)}step((o=o.apply(e,n||[])).next())})},__generator=this&&this.__generator||function(n,s){var o,i,a,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(u[Symbol.iterator]=function(){return this}),u;function verb(t){return function(e){var r=[t,e];if(o)throw new TypeError("Generator is already executing.");for(;c=u&&r[u=0]?0:c;)try{if(o=1,i&&(a=2&r[0]?i.return:r[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,r[1])).done)return a;switch(i=0,(r=a?[2&r[0],a.value]:r)[0]){case 0:case 1:a=r;break;case 4:return c.label++,{value:r[1],done:!1};case 5:c.label++,i=r[1],r=[0];continue;case 7:r=c.ops.pop(),c.trys.pop();continue;default:if(!(a=0<(a=c.trys).length&&a[a.length-1])&&(6===r[0]||2===r[0])){c=0;continue}if(3===r[0]&&(!a||r[1]>a[0]&&r[1]<a[3]))c.label=r[1];else if(6===r[0]&&c.label<a[1])c.label=a[1],a=r;else{if(!(a&&c.label<a[2])){a[2]&&c.ops.pop(),c.trys.pop();continue}c.label=a[2],c.ops.push(r)}}r=s.call(n,c)}catch(e){r=[6,e],i=0}finally{o=a=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},__values=this&&this.__values||function(e){var r="function"==typeof Symbol&&Symbol.iterator,t=r&&e[r],n=0;if(t)return t.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&n>=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(r?"Object is not iterable.":"Symbol.iterator is not defined.")},__read=this&&this.__read||function(e,r){var t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var n,s,o=t.call(e),i=[];try{for(;(void 0===r||0<r--)&&!(n=o.next()).done;)i.push(n.value)}catch(e){s={error:e}}finally{try{n&&!n.done&&(t=o.return)&&t.call(o)}finally{if(s)throw s.error}}return i},__spreadArray=this&&this.__spreadArray||function(e,r,t){if(t||2===arguments.length)for(var n,s=0,o=r.length;s<o;s++)!n&&s in r||((n=n||Array.prototype.slice.call(r,0,s))[s]=r[s]);return e.concat(n||Array.prototype.slice.call(r))},http_1=(Object.defineProperty(exports,"__esModule",{value:!0}),require("http")),express=require("express"),bodyParser=require("body-parser"),xmlParser=require("express-xml-bodyparser"),WebSocket=require("ws"),jwt=require("jsonwebtoken"),moment=require("moment-timezone"),common_1=require("./util/common"),mongo_manager_1=require("./managers/mongo.manager"),cron_manager_1=require("./managers/cron.manager"),method_manager_1=require("./managers/method.manager"),subscription_manager_1=require("./managers/subscription.manager"),monitor_manager_1=require("./managers/monitor.manager"),method_response_collection_1=require("./collections/method-response.collection"),log_collection_1=require("./collections/log.collection"),log_method_latency_collection_1=require("./collections/log-method-latency.collection"),user_collection_1=require("./collections/user.collection"),home_1=require("./http/home"),auth_1=require("./http/auth"),health_1=require("./http/health"),index_1=require("./index"),mongodb_1=require("mongodb"),worker_task_request_collection_1=require("./collections/worker-task-request.collection"),worker_task_response_collection_1=require("./collections/worker-task-response.collection"),websocket_manager_1=require("./managers/websocket.manager"),ResolveIOMainServer=function(){function ResolveIOMainServer(e,r,t,n,s,o,i){void 0===i&&(i=!1);var a=this;this._offlineUpdates=[],this.sesMail=!1,this.standardProgram=!1,this.publicProgram=!1,this._rebootFlag=!1,this.LOGGER="ERROR",this._clientRoutes=[],this._lastErrorMsg=null,this._debugMsgRecv=0,this._debugMsgQueue=0,this._isWorkersEnabled=!1,this._isWorkerInstance=!1,this._workerTasks=[],this._safeShutdown=!1,this._serverConfig=r,this._clientRoutes=t,this._clientDir=n,this.sesMail=s,this.standardProgram=o,this.publicProgram=i,this._serverStartTime=new Date,this._lastErrorMsg=null,this._monitorManager=new monitor_manager_1.MonitorManager(e,r),this._monitorManagerFunction=new monitor_manager_1.MonitorManagerFunction,this._isWorkersEnabled="true"===process.env.IS_WORKERS_ENABLED,this._isWorkerInstance="true"===process.env.IS_WORKER_INSTANCE,setInterval(function(){a._subscriptionManager&&a._subscriptionManager.getEnableDebug()&&(console.log(new Date,"Server App","Msg Recv Hits",a._debugMsgRecv),console.log(new Date,"Server App","Msg Queue Hits",a._debugMsgQueue)),a._debugMsgQueue=0,a._debugMsgRecv=0},6e4),process.on("unhandledRejection",function(n,s){return __awaiter(a,void 0,void 0,function(){var r,t=this;return __generator(this,function(e){switch(e.label){case 0:return n&&"MongoError"===n.name&&48===n.code?[2]:(console.error(new Date,"Unhandled Rejection at Promise",[n,s]),r=moment().diff(this._serverStartTime,"seconds"),n&&("MongoNetworkTimeoutError"===n.name||n instanceof mongodb_1.MongoNetworkTimeoutError)?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - MongoNetworkTimeoutError - Quitting NodeJS - "+this._serverConfig.CLIENT_NAME,JSON.stringify({name:n.name,message:n.message,stack:n.stack},null,2))]):[3,2]:[3,3]);case 1:e.sent(),process.exit(1),e.label=2;case 2:return[3,10];case 3:return n&&"MongoError"===n.name&&"not master"===n.message?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - Quitting NodeJS - "+this._serverConfig.CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,5]:[3,6];case 4:e.sent(),e.label=5;case 5:return process.exit(1),[3,10];case 6:return n&&"MongoError"===n.name&&"not master and slaveOk=false"===n.message?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - Quitting NodeJS - "+this._serverConfig.CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,8]:[3,9];case 7:e.sent(),e.label=8;case 8:return process.exit(1),[3,10];case 9:n&&"StatusError"!==n.name&&""!==n.message&&60<r&&!this._lastErrorMsg&&(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - "+this._serverConfig.CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))),e.label=10;case 10:return[2]}})})}),process.on("uncaughtException",function(t){return __awaiter(a,void 0,void 0,function(){var r=this;return __generator(this,function(e){switch(e.label){case 0:return(console.error(t,"Uncaught Exception thrown"),60<moment().diff(this._serverStartTime,"seconds")&&!this._lastErrorMsg)?(this._lastErrorMsg=new Date,setTimeout(function(){r._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Exception - "+this._serverConfig.CLIENT_NAME,JSON.stringify([t.name,t.message,t.stack],null,2))]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),process.on("SIGINT",function(){a._rebootFlag=!0,a._serverHTTP.close(),a.safeShutdown()}),process.on("SIGTERM",function(){a._rebootFlag=!0,a._serverHTTP.close(),a.safeShutdown()}),process.on("SIGQUIT",function(){a._rebootFlag=!0,a._serverHTTP.close(),a.safeShutdown()}),"DEBUG"===this.LOGGER&&console.log("Starting ResolveIO Server"),this._isWorkersEnabled?this._isWorkerInstance?(console.log("Running as a Worker instance"),this._methodManager=new method_manager_1.MethodManager(this,this._serverConfig,this._clientDir,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._cronManager=new cron_manager_1.CronManager(this),this.startWorkerInstance()):(console.log("Running as a Server instance"),this._websocketManager=new websocket_manager_1.WebSocketManager(this),this.startServerInstance(r),this._methodManager=new method_manager_1.MethodManager(this,this._serverConfig,this._clientDir,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=new subscription_manager_1.SubscriptionManager(this,this._serverWSS,this._serverConfig,this._monitorManagerFunction),this.listen()):(console.log("Running with Workers Disabled"),this._websocketManager=new websocket_manager_1.WebSocketManager(this),this.startServerInstance(r),this._methodManager=new method_manager_1.MethodManager(this,this._serverConfig,this._clientDir,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=new subscription_manager_1.SubscriptionManager(this,this._serverWSS,this._serverConfig,this._monitorManagerFunction),this._cronManager=new cron_manager_1.CronManager(this),this.listen())}return ResolveIOMainServer.prototype.startServerInstance=function(e){this._app=express(),this._app.use(bodyParser.json({limit:"50mb",reviver:common_1.dateReviver})),this._app.use(bodyParser.urlencoded({limit:"50mb",extended:!0,parameterLimit:1e6})),this._app.use(xmlParser()),this._portHTTP=process.env.PORT_HTTP||e.PORT_HTTP||8080,this._portWSS=process.env.PORT_WSS||e.PORT_WSS||8081,"DEBUG"===this.LOGGER&&console.log("Setup ports"),this.createServer(),"DEBUG"===this.LOGGER&&console.log("Create server"),this._app.use(function(e,r,t){r.setHeader("Access-Control-Allow-Origin","*"),r.setHeader("Access-Control-Allow-Methods","GET, POST"),r.setHeader("Access-Control-Allow-Headers","X-Requested-With,content-type"),r.setHeader("Access-Control-Allow-Credentials","false"),t()}),"DEBUG"===this.LOGGER&&console.log("Setup cors"),(0,auth_1.setupAuthRoutes)(this,this._app,e),(0,health_1.setupHealthRoutes)(this._app,e),"ResolveIO"!==e.CLIENT_NAME&&!this.standardProgram||(0,home_1.setupHomeRoutes)(this,this._app,e),"DEBUG"===this.LOGGER&&console.log("Setup express routes")},ResolveIOMainServer.prototype.startWorkerInstance=function(){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c=this;return __generator(this,function(e){switch(e.label){case 0:return console.log("Worker instance started, watching worker-task-reqs..."),(r=worker_task_request_collection_1.WorkerTaskRequests.watchCollection([{$match:{"fullDocument.status":"pending"}}],{fullDocument:"updateLookup"})).on("change",function(s){return __awaiter(c,void 0,void 0,function(){var r,t,n=this;return __generator(this,function(e){return"insert"===s.operationType?(r=s.fullDocument)&&setTimeout(function(){n.processTask(r)},25*this._workerTasks.length):"update"===s.operationType&&(t=s.fullDocument)&&"pending"===t.status&&setTimeout(function(){n.processTask(t)},25*this._workerTasks.length),[2]})})}),r.on("error",function(e){console.error("Error in change stream worker task requests:",e),r.close(),setTimeout(function(){return c.startWorkerInstance()},5e3)}),r.on("close",function(){console.log("Change stream worker task requests closed. Restarting..."),setTimeout(function(){return c.startWorkerInstance()},5e3)}),[4,worker_task_request_collection_1.WorkerTaskRequests.find({status:"pending"},{sort:{createdAt:1}})];case 1:t=e.sent();try{for(n=__values(t),s=n.next();!s.done;s=n.next())o=s.value,this.processTask(o)}catch(e){i={error:e}}finally{try{s&&!s.done&&(a=n.return)&&a.call(n)}finally{if(i)throw i.error}}return[2]}})})},ResolveIOMainServer.prototype.processTask=function(s){return __awaiter(this,void 0,void 0,function(){var r=this;return __generator(this,function(e){return this._workerTasks.includes(s._id)||worker_task_request_collection_1.WorkerTaskRequests.updateOne({_id:s._id,status:"pending"},{$set:{status:"processing"}}).then(function(n){return __awaiter(r,void 0,void 0,function(){var r,t;return __generator(this,function(e){switch(e.label){case 0:if(!n)return[3,5];this._workerTasks.push(s._id),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(t=this._methodManager.callMethodInternal).call.apply(t,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:s.id_user,user:s.user,id_ws:s.id_ws}),s.method],__read(s.params),!1))];case 2:return t=e.sent(),worker_task_response_collection_1.WorkerTaskResponses.create({id_request:s._id,has_error:!1,data:t,id_user:s.id_user,user:s.user,id_ws:s.id_ws}),[3,4];case 3:return r=e.sent(),console.error("Worker failed to process task:",s._id,r),worker_task_response_collection_1.WorkerTaskResponses.create({id_request:s._id,has_error:!0,data:r.message,id_user:s.id_user,user:s.user,id_ws:s.id_ws}),[3,4];case 4:this._workerTasks.includes(s._id)&&this._workerTasks.splice(this._workerTasks.indexOf(s._id),1),worker_task_request_collection_1.WorkerTaskRequests.updateOne({_id:s._id},{$set:{status:"complete"}}),e.label=5;case 5:return[2]}})})},function(){}),[2]})})},ResolveIOMainServer.prototype.safeShutdown=function(){var e=this;this._safeShutdown||console.log(new Date,"Safe Shutdown Command Received"),this._monitorManagerFunction.getActiveMonitorFunctions().length||this._offlineUpdates.length?(this._safeShutdown||(this._safeShutdown=!0,setTimeout(function(){e._safeShutdown=!1},1e3),console.log(new Date,"Safe Exit In Progress",this._monitorManagerFunction.getActiveMonitorFunctions().length,this._offlineUpdates.length)),setImmediate(function(){e.safeShutdown()})):index_1.ResolveIOServer.getMongoConnection().close(!1).then(function(){console.log(new Date,"Safe Exit Complete, Process Exit"),process.exit(0)},function(){process.exit(1)})},ResolveIOMainServer.prototype.getIsWorkersEnabled=function(){return this._isWorkersEnabled},ResolveIOMainServer.prototype.getIsWorkerInstance=function(){return this._isWorkerInstance},ResolveIOMainServer.prototype.getWSList=function(){var r=[];return this._serverWSS.clients.forEach(function(e){r.push(e.id_socket)}),r},ResolveIOMainServer.prototype.getWSUserList=function(){var r=[];return this._serverWSS.clients.forEach(function(e){r.push(e.id_user)}),r},ResolveIOMainServer.prototype.getHTTPServer=function(){return this._serverHTTP},ResolveIOMainServer.prototype.getCronManager=function(){return this._cronManager},ResolveIOMainServer.prototype.getMethodManager=function(){return this._methodManager},ResolveIOMainServer.prototype.getSubscriptionManager=function(){return this._subscriptionManager},ResolveIOMainServer.prototype.getMonitorManager=function(){return this._monitorManager},ResolveIOMainServer.prototype.getRebootFlag=function(){return this._rebootFlag},ResolveIOMainServer.prototype.getWebSocketManager=function(){return this._websocketManager},ResolveIOMainServer.prototype.createServer=function(){var e=this;this._serverHTTP=(0,http_1.createServer)(this._app),this._serverHTTP.keepAliveTimeout=65e3,this._serverHTTP.headersTimeout=66e3,this._serverWSS=new WebSocket.Server({port:this._portWSS,verifyClient:this.publicProgram?null:function(o,i){return __awaiter(e,void 0,void 0,function(){var r,s=this;return __generator(this,function(e){return this._rebootFlag?i(!1,409,"Unable To Process"):("DEBUG"===this.LOGGER&&console.log("Verify Client",o,i),r=o.req.headers["sec-websocket-protocol"].split(/,/),(o.origin===this._serverConfig.ROOT_URL||o.origin===this._serverConfig.SEC_ROOT_URL||o.origin===this._serverConfig.RESOLVEIO_URL||o.origin===this._serverConfig.RESOLVEIO_SECONDARY_URL)&&(r=r[0])?jwt.verify(r,this._serverConfig.JWT_SECRET,function(t,n){return __awaiter(s,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return t?(i(!1,401,"Unauthorized"),[3,5]):[3,1];case 1:o.req.id_user=n.id_user,e.label=2;case 2:return e.trys.push([2,4,,5]),[4,user_collection_1.Users.findById(n.id_user)];case 3:return(r=e.sent())?(o.req.user=r.fullname,o.req.user_readonly=r.readonly||!1,o.req.doc_user=r,i(!0)):i(!1),[3,5];case 4:return e.sent(),i(!1),[3,5];case 5:return[2]}})})}):i(!1,401,"Unauthorized")),[2]})})}})},ResolveIOMainServer.prototype.listen=function(){var t=this;this._serverHTTP.listen(this._portHTTP,function(){console.log("Running server on port %s",t._portHTTP)}),this._serverWSS.on("listening",function(){console.log("Running server on port %s",t._portWSS)}),this._serverWSS.on("connection",function(u,e){t.publicProgram||(u.id_user=e.id_user,u.user=e.user,u.user_readonly=e.user_readonly,u.doc_user=e.doc_user,"Admin"!==u.user&&"ResolveIO"!==t._serverConfig.CLIENT_NAME&&t.getMethodManager().callMethodInternal.call(t.getMethodManager(),"supportCreateBillingUser",{id_user:u.id_user,user:u.user,date:new Date,client:index_1.ResolveIOServer.getClientName()})),u.id_socket=(0,mongo_manager_1.objectIdHexString)(),u.retryCnt=0,t._websocketManager.addWebSocket(u),t._subscriptionManager.createLoggedInUser(u.id_socket).then(function(){setTimeout(function(){u.pingTime=new Date,u.send("ping",function(e){e&&(t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),t.unsubscribeWS(u))})},5e3)}),"DEBUG"===t.LOGGER&&console.log("Connection from: "+e.user),u.isAlive=!0,u.on("message",function(c){return __awaiter(t,void 0,void 0,function(){var r,t,n,s,o,i,a=this;return __generator(this,function(e){switch(e.label){case 0:"DEBUG"===this.LOGGER&&console.log("Message from: "+u.user,c),this._debugMsgRecv+=1,s=!1,r=[];try{r=JSON.parse(c,common_1.dateReviver)}catch(e){console.log("Error - JSON.parse",c),this._methodManager.sendEmail("dev@resolveio.com","SERVER - JSON Parse Error - "+this._serverConfig.CLIENT_NAME,JSON.stringify([c,e])),s=!0}if(s)return[3,8];if("string"==typeof r&&"ping"===r)u&&u.readyState===u.OPEN&&u.send("pong",function(e){e&&(a._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Pong"),a.unsubscribeWS(u))});else if("string"==typeof r&&"pong"===r)u.isAlive=!0,u.pongTime=new Date,u.latency=moment.duration(moment(u.pongTime).diff(u.pingTime)).asMilliseconds(),this._subscriptionManager.loggedInLatency(u);else{if(Array.isArray(r[0]))return[3,1];console.log("Invalid message format, expected array:",r)}return[2];case 1:e.trys.push([1,6,7,8]),t=__values(r),n=t.next(),e.label=2;case 2:return n.done?[3,5]:(s=n.value,[4,this.processSocketMessage(u,s)]);case 3:e.sent(),e.label=4;case 4:return n=t.next(),[3,2];case 5:return[3,8];case 6:return o=e.sent(),o={error:o},[3,8];case 7:try{n&&!n.done&&(i=t.return)&&i.call(t)}finally{if(o)throw o.error}return[7];case 8:return[2]}})})}).on("end",function(){t.unsubscribeWS(u),t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","WS End")}).on("close",function(){t.unsubscribeWS(u),t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","WS Close")}).on("error",function(e){t.unsubscribeWS(u),t._subscriptionManager.getEnableDebug()&&console.log(new Date,u.user,u.id_socket,"WS Error")})}),setInterval(function(){t._serverWSS.clients.forEach(function(r){r.pingTime&&2e4<=Date.now()-r.pingTime.getTime()&&(!1===r.isAlive?(r.retryCnt++,3<=r.retryCnt?t.unsubscribeWS(r):(r.pingTime=new Date,r.send("ping",function(e){e&&(t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),t.unsubscribeWS(r))}))):(r.retryCnt=0,r.isAlive=!1,r.pingTime=new Date,r.send("ping",function(e){e&&(t._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),t.unsubscribeWS(r))})))})},2e4)},ResolveIOMainServer.prototype.processSocketMessage=function(S,b){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c,u,l,_,g,h,d,p,f,m,v=this;return __generator(this,function(e){switch(e.label){case 0:return(r=b[0],this.publicProgram||!this._clientRoutes.some(function(e){return r.includes(e)})||S.doc_user.roles.groups.some(function(e){return e.views.some(function(e){return r.includes(e)||e.includes(r)})})||S.doc_user.roles.super_admin)?(a=b[1],t=b[2],"subscription"!==(n=b[3])?[3,1]:(i=b[4],f=b[5],"sub"===i?this._subscriptionManager.subscribe(r,a,S,t,f,b.slice(6)):this._subscriptionManager.unsubscribe(r,a,S,t,f,b.slice(6)),[3,11])):[2];case 1:if(this.publicProgram||"offline"!==n)return[3,10];d={messageId:t,hasError:!1,data:"ACK"},S&&S.readyState===S.OPEN&&this._websocketManager.send(S,JSON.stringify(d)),this._offlineUpdates.push(S),s=b[4],o=0,e.label=2;case 2:if(!(o<s.length))return[3,9];if(i=s[o],c=i.data,a={messageId:i.data[2],hasError:!1,data:"ACK"},S&&S.readyState===S.OPEN&&this._websocketManager.send(S,JSON.stringify(a)),c.shift(),c.shift(),c.shift(),c.shift(),p=c.shift(),h=(0,mongo_manager_1.objectIdHexString)(),"insertDocument"===p&&"driver-gps"===c[0])return[3,8];if(log_method_latency_collection_1.LogMethodLatencies.create({_id:h,__v:0,date_start:new Date,date_end:null,latency_ms:0,method:p}),"reportBuilderGetResults"!==p&&"reportBuilderGetDistinctValue"!==p&&"reportBuilderBuildTree"!==p&&"generatePDF"!==p&&"getWOOfflineData"!==p&&"countQuery"!==p&&"countWithQuery"!==p&&"countCollectionWithQuery"!==p&&"find"!==p&&"findOne"!==p&&"findWithOptions"!==p&&"getDrivers"!==p&&"processAirdropDistribution"!==p&&log_collection_1.Logs.insertOne({_id:(0,mongo_manager_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(c))<2e5?JSON.stringify(c,null,2):"Too Big",method:p,id_user:S.id_user||"",user:S.user||"",messageId:t,route:r}),!this._methodManager._methods[p])return[3,7];e.label=3;case 3:return e.trys.push([3,5,,6]),[4,(f=this._methodManager.callMethodInternal).call.apply(f,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:S.id_user,user:S.user,id_ws:S.id_socket}),p],__read(c),!1))];case 4:return e.sent(),[3,6];case 5:return u=e.sent(),console.log(new Date,"Offline Error",JSON.stringify(u,null,2)),[3,6];case 6:return"updateDocumentOffline"!==p&&"updateDocumentPropsOffline"!==p||index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(c[0]),[3,8];case 7:console.log("Offline - Could not find method: "+p),e.label=8;case 8:return o++,[3,2];case 9:return this._offlineUpdates.splice(this._offlineUpdates.map(function(e){return e.id_socket}).indexOf(S.id_socket),1),[3,11];case 10:if(c=__spreadArray([],__read(b),!1),u=c.shift(),l=c.shift(),_=c.shift(),"method"===(g=c.shift())){if(p=c.shift(),S.user_readonly)return[2];h=(0,mongo_manager_1.objectIdHexString)(),log_method_latency_collection_1.LogMethodLatencies.create({_id:h,__v:0,date_start:new Date,date_end:null,latency_ms:0,method:p}),"reportBuilderGetResults"!==p&&"reportBuilderGetDistinctValue"!==p&&"reportBuilderBuildTree"!==p&&"generatePDF"!==p&&"getWOOfflineData"!==p&&"countQuery"!==p&&"countWithQuery"!==p&&"countCollectionWithQuery"!==p&&"find"!==p&&"findOne"!==p&&"findWithOptions"!==p&&"getDrivers"!==p&&"processAirdropDistribution"!==p&&log_collection_1.Logs.insertOne({_id:(0,mongo_manager_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(c))<2e5?JSON.stringify(c,null,2):"Too Big",method:p,id_user:S.id_user||"",user:S.user||"",messageId:_,route:u}),d={messageId:_,hasError:!1,data:"ACK"},S&&S.readyState===S.OPEN&&this._websocketManager.send(S,JSON.stringify(d)),this._methodManager._methods[p]?(m=this._methodManager).callMethod.apply(m,__spreadArray([h,S,l,_,p],__read(c),!1)):console.log("Could not find method: "+p)}else"methodResponse"===g&&(p=c.shift(),method_response_collection_1.MethodResponses.findOne({$and:[{id_user:S.id_user},{message_id:_},{method:p},{date:l}]}).then(function(e){e&&S&&S.readyState===S.OPEN&&v._websocketManager.send(S,JSON.stringify(e.response))},function(e){}));e.label=11;case 11:return[2]}})})},ResolveIOMainServer.prototype.unsubscribeWS=function(e){this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Unsub WS",e.user,e.id_socket),this._subscriptionManager.unsubscribeAll(e),e.removeAllListeners()},ResolveIOMainServer.prototype.getApp=function(){return this._app},ResolveIOMainServer.prototype.getServerConfig=function(){return this._serverConfig},ResolveIOMainServer}();exports.default=ResolveIOMainServer;
|
|
2
2
|
//# sourceMappingURL=server-app.js.map
|
package/server-app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server-app.ts"],"names":["http_1","require","express","bodyParser","xmlParser","WebSocket","jwt","moment","common_1","mongo_manager_1","cron_manager_1","method_manager_1","subscription_manager_1","monitor_manager_1","method_response_collection_1","log_collection_1","log_method_latency_collection_1","user_collection_1","home_1","auth_1","health_1","index_1","mongodb_1","worker_task_request_collection_1","worker_task_response_collection_1","websocket_manager_1","ResolveIOMainServer","mainServer","serverConfig","clientRoutes","clientDir","sesMail","standardProgram","publicProgram","_this","this","_offlineUpdates","_rebootFlag","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_workerTasks","_safeShutdown","_serverConfig","_clientDir","_serverStartTime","Date","_monitorManager","MonitorManager","_monitorManagerFunction","MonitorManagerFunction","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setInterval","_subscriptionManager","getEnableDebug","console","log","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","setTimeout","_methodManager","sendEmail","JSON","stringify","name","message","stack","_a","sent","exit","_serverHTTP","close","safeShutdown","MethodManager","_cronManager","CronManager","startWorkerInstance","_websocketManager","WebSocketManager","startServerInstance","SubscriptionManager","_serverWSS","listen","prototype","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","changeStream","WorkerTaskRequests","watchCollection","$match","fullDocument.status","fullDocument","change","operationType","task_1","processTask","length","task_2","status","find","sort","createdAt","pendingTasks","_b","pendingTasks_1","__values","pendingTasks_1_1","done","task","value","includes","_id","updateOne","$set","then","resReq","push","callMethodInternal","call","apply","__spreadArray","Object","assign","id_user","user","id_ws","method","__read","params","result","WorkerTaskResponses","create","id_request","has_error","data","err_1","splice","indexOf","getActiveMonitorFunctions","setImmediate","ResolveIOServer","getMongoConnection","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","ws","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","port","verifyClient","info","cb","infoData","headers","split","origin","token","verify","err","decoded","Users","findById","fullname","readonly","date","client","getClientName","objectIdHexString","addWebSocket","createLoggedInUser","send","unsubscribeWS","parseErrorFound","socketData","parse","e","readyState","OPEN","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","message_1","processSocketMessage","now","getTime","messageRoute","some","a","roles","groups","views","b","super_admin","messageDate","messageId","type","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","offlineUpdates","i","update","serverResMethod","shift","methodLatencyId","LogMethodLatencies","__v","date_start","date_end","latency_ms","Logs","insertOne","collection","id_document","payload","getBinarySize","route","_methods","_c","err_3","getMongoManager","invalidateQueryCache","map","messageRoute_1","messageDate_1","messageId_1","type_1","callMethod","MethodResponses","findOne","$and","message_id","response","unsubscribeAll","removeAllListeners","getApp","getServerConfig"],"mappings":"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","file":"server-app.js","sourcesContent":["import { createServer, Server } from 'http';\nimport * as express from 'express';\nimport * as bodyParser from 'body-parser';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport * as WebSocket from 'ws';\nimport * as jwt from 'jsonwebtoken';\n// import * as SegfaultHandler from 'segfault-handler';\nimport * as moment from 'moment-timezone';\n\nimport { dateReviver, getBinarySize, deepCopy } from './util/common';\n\nimport { objectIdHexString } from './managers/mongo.manager';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\n\nimport { ServerResponseModel } from './models/server-response.model';\n\nimport { MethodResponses } from './collections/method-response.collection';\nimport { Logs } from './collections/log.collection';\nimport { LogMethodLatencies } from './collections/log-method-latency.collection';\nimport { Users } from './collections/user.collection';\n\nimport { setupHomeRoutes } from './http/home';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { ResolveIOServer } from './index';\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { WorkerTaskRequests } from './collections/worker-task-request.collection';\nimport { WorkerTaskResponses } from './collections/worker-task-response.collection';\nimport { WorkerTaskRequestModel } from './models/worker-task-request.model';\nimport { WebSocketManager } from './managers/websocket.manager';\n\nexport default class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\n\tprivate _portWSS: number;\n\tprivate _serverConfig;\n\tprivate _clientDir;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\tprivate _workerTasks: string[] = [];\n\n\tprivate _safeShutdown = false;\n\n\tconstructor(mainServer, serverConfig, clientRoutes, clientDir, sesMail, standardProgram, publicProgram = false) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._clientRoutes = clientRoutes;\n\t\tthis._clientDir = clientDir;\n\t\tthis.sesMail = sesMail;\n\t\tthis.standardProgram = standardProgram;\n\t\tthis.publicProgram = publicProgram;\n\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = new MonitorManager(mainServer, serverConfig);\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\t// Condition to filter out the MongoError with code 48 (NamespaceExists)\n\t\t\tif (error && error['name'] === 'MongoError' && error['code'] === 48) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tconsole.error(new Date(), 'Unhandled Rejection at Promise', [error, rej]);\n\t\t\t\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\t// If this is a MongoNetworkTimeoutError, handle it specifically\n\t\t\tif (error && (error['name'] === 'MongoNetworkTimeoutError' || error instanceof MongoNetworkTimeoutError)) {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t// Sending email notification (using your existing method)\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - MongoNetworkTimeoutError - Quitting NodeJS - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify({\n\t\t\t\t\t\tname: error['name'],\n\t\t\t\t\t\tmessage: error['message'],\n\t\t\t\t\t\tstack: error['stack']\n\t\t\t\t\t}, null, 2));\n\n\t\t\t\t\t// Exiting the process\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error) {\n\t\t\t\tif (error['name'] !== 'StatusError' && error['message'] !== '') {\n\t\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconsole.error(error, 'Uncaught Exception thrown');\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t}\n\t\t});\n\n\t\t//PM2 wants to reboot/restart\n\t\tprocess.on('SIGINT', () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tthis._serverHTTP.close();\n\t\t\tthis.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tthis._serverHTTP.close();\n\t\t\tthis.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tthis._serverHTTP.close();\n\t\t\tthis.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n if (this._isWorkersEnabled) {\n if (this._isWorkerInstance) {\n console.log('Running as a Worker instance');\n\t\t\t\tthis._methodManager = new MethodManager(this, this._serverConfig, this._clientDir, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n this._cronManager = new CronManager(this);\n\t\t\t\tthis.startWorkerInstance();\n }\n\t\t\telse {\n console.log('Running as a Server instance');\n\t\t\t\tthis._websocketManager = new WebSocketManager(this);\n this.startServerInstance(serverConfig);\n\t\t\t\tthis._methodManager = new MethodManager(this, this._serverConfig, this._clientDir, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._subscriptionManager = new SubscriptionManager(this, this._serverWSS, this._serverConfig, this._monitorManagerFunction);\n\t\t\t\tthis.listen();\n }\n }\n\t\telse {\n console.log('Running with Workers Disabled');\n\t\t\tthis._websocketManager = new WebSocketManager(this);\n this.startServerInstance(serverConfig);\n\t\t\tthis._methodManager = new MethodManager(this, this._serverConfig, this._clientDir, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = new SubscriptionManager(this, this._serverWSS, this._serverConfig, this._monitorManagerFunction);\n this._cronManager = new CronManager(this);\n\t\t\tthis.listen();\n }\n\t}\n\n\tprivate startServerInstance(serverConfig) {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\t// Use body parser for http call (login)\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.PORT_HTTP || serverConfig['PORT_HTTP'] || 8080;\n\t\tthis._portWSS = process.env.PORT_WSS || serverConfig['PORT_WSS'] || 8081;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\n\t\t\t// Website you wish to allow to connect\n\t\t\t// res.setHeader('Access-Control-Allow-Origin', serverConfig['ROOT_URL']);\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\n\t\t\t// Request methods you wish to allow\n\t\t\t// res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\n\t\t\t// Request headers you wish to allow\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\n\t\t\t// Set to true if you need the website to include cookies in the requests sent\n\t\t\t// to the API (e.g. in case you use sessions)\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\n\t\t\t// Pass to next layer of middleware\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, serverConfig);\n\t\tsetupHealthRoutes(this._app, serverConfig);\n\n\t\tif (serverConfig['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, serverConfig);\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tprivate async startWorkerInstance() {\n\t\tconsole.log('Worker instance started, watching worker-task-reqs...');\n\t\n\t\t// Now, set up the change stream to watch for new tasks\n\t\tlet changeStream = WorkerTaskRequests.watchCollection([{ $match: { 'fullDocument.status': 'pending' } }], { fullDocument: 'updateLookup' });\n\t\n\t\tchangeStream.on('change', async (change) => {\n\t\t\tif (change.operationType === 'insert') {\n\t\t\t\tconst task = change.fullDocument;\n\t\t\t\tif (task) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.processTask(task);\n\t\t\t\t\t}, this._workerTasks.length * 25);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (change.operationType === 'update') {\n\t\t\t\tconst task = change.fullDocument;\n\t\t\t\tif (task && task.status === 'pending') {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.processTask(task);\n\t\t\t\t\t}, this._workerTasks.length * 25);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\n\t\tchangeStream.on('error', (error) => {\n\t\t\tconsole.error('Error in change stream worker task requests:', error);\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.startWorkerInstance(), 5000); // Restart after a delay\n\t\t});\n\t\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log('Change stream worker task requests closed. Restarting...');\n\t\t\tsetTimeout(() => this.startWorkerInstance(), 5000); // Restart after a delay\n\t\t});\n\n\t\t// First, process any existing pending tasks in the database\n\t\tconst pendingTasks = await WorkerTaskRequests.find({ status: 'pending' }, {sort: {createdAt: 1}});\n\n\t\tfor (const task of pendingTasks) {\n\t\t\tthis.processTask(task);\n\t\t}\n\t}\n\t\n\t// Process a task (handles both existing and new tasks)\n\tprivate async processTask(task: WorkerTaskRequestModel) {\n\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\treturn;\n\t\t}\n\t\t\t\n\t\tWorkerTaskRequests.updateOne({ _id: task._id, status: 'pending' }, { $set: { status: 'processing' } }).then(async resReq => {\n\t\t\tif (resReq) {\n\t\t\t\tthis._workerTasks.push(task._id);\n\n\t\t\t\ttry {\n\t\t\t\t\t// Run the actual method\n\t\t\t\t\tconst result = await this._methodManager.callMethodInternal.call(Object.assign({}, this._methodManager, MethodManager.prototype, { id_user: task.id_user, user: task.user, id_ws: task.id_ws }), task.method, ...task.params);\n\n\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\thas_error: false,\n\t\t\t\t\t\tdata: result,\n\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tconsole.error('Worker failed to process task:', task._id, err);\n\n\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\thas_error: true,\n\t\t\t\t\t\tdata: err.message,\n\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\t\t\tthis._workerTasks.splice(this._workerTasks.indexOf(task._id), 1);\n\t\t\t\t}\n\n\t\t\t\t// Mark the task as complete\n\t\t\t\tWorkerTaskRequests.updateOne({ _id: task._id }, { $set: { status: 'complete' } });\n\n\t\t\t\t// console.log(new Date(), 'Instance: ' + process.env.NODE_APP_INSTANCE, 'Complete Task', 'Current Jobs: ' + this._workerTasks.length);\n\t\t\t}\n\t\t}, () => {});\n\t}\n\n\tprivate safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length && \n\t\t\t// (!this._monitorManagerFunction.getLastCompletedMonitorFunction() ||\n\t\t\t// Date.now() >= this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime.getTime() + 1500) &&\n\t\t\t!this._offlineUpdates.length\n\t\t) {\n\t\t\tResolveIOServer.getMongoConnection().close(false).then(() => {\n\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\tprocess.exit(0);\n\t\t\t}, () => {process.exit(1)});\n\t\t}\n\t\telse {\n\t\t\tif (!this._safeShutdown) {\n\t\t\t\tthis._safeShutdown = true;\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._safeShutdown = false;\n\t\t\t\t}, 1000);\n\n\t\t\t\tconsole.log(new Date(), \n\t\t\t\t\t'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length, \n\t\t\t\t\t// this._monitorManagerFunction.getLastCompletedMonitorFunction() ? this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime : '',\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(() => {\n\t\t\t\tthis.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\t// Start express server\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000; // This should be bigger than `keepAliveTimeout + your server's expected response time`\n\n\t\t// Start websocket server\n\t\t// Verify client with token before opening socket\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tport: this._portWSS,\n\t\t\tverifyClient: this.publicProgram ? null : async (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (info.origin !== this._serverConfig['ROOT_URL'] && info.origin !== this._serverConfig['SEC_ROOT_URL'] && info.origin !== this._serverConfig['RESOLVEIO_URL'] && info.origin !== this._serverConfig['RESOLVEIO_SECONDARY_URL']) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, this._serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\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\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\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\tcb(false);\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\tcatch (err) {\n\t\t\t\t\t\t\t\t\t\tcb(false);\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\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// Listen to port for websocket\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('listening', () => {\n\t\t\tconsole.log('Running server on port %s', this._portWSS);\n\t\t});\n\n\t\t// On websocket connection (already verified)\n\t\tthis._serverWSS.on('connection', (ws, req) => {\n\t\t\tif (!this.publicProgram) {\n\t\t\t\t// Get user from token\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tif (ws['user'] !== 'Admin' && this._serverConfig['CLIENT_NAME'] !== 'ResolveIO') {\n\t\t\t\t\tthis.getMethodManager().callMethodInternal.call(this.getMethodManager(), 'supportCreateBillingUser', {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tdate: new Date(),\n\t\t\t\t\t\tclient: ResolveIOServer.getClientName()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\tws['retryCnt'] = 0;\n\n\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\tthis._subscriptionManager.createLoggedInUser(ws['id_socket']).then(() => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, 5000);\n\t\t\t});\n\n\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\tconsole.log('Connection from: ' + req['user']);\n\t\t\t}\n\t\t\t\n\t\t\t// Use for keeping connection alive (ping/pong)\n\t\t\tws['isAlive'] = true;\n\t\t\tws.on('message', async (message: string) => {\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Message from: ' + ws['user'], message);\n\t\t\t\t}\n\n\t\t\t\tthis._debugMsgRecv += 1;\n\n\t\t\t\tlet parseErrorFound = false;\n\n\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\n\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - JSON Parse Error - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([message, e]));\n\n\t\t\t\t\tparseErrorFound = true;\n\t\t\t\t}\n\n\t\t\t\tif (!parseErrorFound) {\n\t\t\t\t\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tws.send('pong', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Pong');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\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\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\t\t\t\tws['isAlive'] = true;\n\t\t\t\t\t\tws['pongTime'] = new Date();\n\t\t\t\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\t\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!Array.isArray(socketData[0])) {\n\t\t\t\t\t\t// Not an array, invalid message\n\t\t\t\t\t\tconsole.log('Invalid message format, expected array:', socketData);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (let message of socketData) {\n\t\t\t\t\t\t\tawait this.processSocketMessage(ws, message);\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\t.on('end', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'WS End');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('close', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'WS Close');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('error', error => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), ws['user'], ws['id_socket'], 'WS Error');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t});\n\n\t\t// Keep alive timer to ping/pong\n\t\tsetInterval(() => {\n\t\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\t\tif (ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= 20000) {\n\t\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\t\tws['retryCnt']++;\n\n\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 20000);\n\t}\n\n\tprivate async processSocketMessage(ws: WebSocket, socketData: any[]) {\n\t\tlet messageRoute = socketData[0];\n\n\t\tif (!this.publicProgram && this._clientRoutes.some(a => messageRoute.includes(a)) && !ws['doc_user'].roles.groups.some(a => a.views.some(b => messageRoute.includes(b) || b.includes(messageRoute))) && !ws['doc_user'].roles.super_admin) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet messageDate = socketData[1];\n\t\tlet messageId = socketData[2];\n\t\tlet type = socketData[3];\n\n\t\tif (type === 'subscription') {\n\t\t\tlet subType = socketData[4];\n\t\t\tlet pub = socketData[5];\n\n\t\t\t// Subscribe\n\t\t\tif (subType === 'sub') {\n\t\t\t\tthis._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));\n\t\t\t}\n\t\t\t// Unsubscribe\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));\n\t\t\t}\n\t\t}\n\t\telse if (!this.publicProgram && type === 'offline') {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: 'ACK'\n\t\t\t};\n\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tthis._websocketManager.send(ws, JSON.stringify(serverRes));\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = socketData[4];\n\n\t\t\tfor (let i = 0; i < offlineUpdates.length; i++) {\n\t\t\t\tlet update = offlineUpdates[i];\n\t\t\t\tlet data = update.data;\n\n\t\t\t\tlet serverResMethod: ServerResponseModel = {\n\t\t\t\t\tmessageId: update.data[2],\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, JSON.stringify(serverResMethod));\n\t\t\t\t}\n\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t__v: 0,\n\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\tdate_end: null,\n\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\tmethod: method\n\t\t\t\t});\n\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethodInternal.call(Object.assign({}, this._methodManager, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), method, ...data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Offline Error', JSON.stringify(err, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(data[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Offline - Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.splice(this._offlineUpdates.map(a => a['id_socket']).indexOf(ws['id_socket']), 1);\n\t\t}\n\t\telse { //methods\n\t\t\tlet data = [...socketData];\n\t\t\t\n\t\t\tlet messageRoute: string = data.shift();\n\t\t\tlet messageDate: Date = data.shift();\n\t\t\tlet messageId: number = data.shift();\n\t\t\tlet type: string = data.shift();\n\n\t\t\tif (type === 'method') {\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t__v: 0,\n\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\tdate_end: null,\n\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\tmethod: method\n\t\t\t\t});\n\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, JSON.stringify(serverRes));\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\tthis._methodManager.callMethod(methodLatencyId, ws, messageDate, messageId, method, ...data);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (type === 'methodResponse') {\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tMethodResponses.findOne({ $and: [{ id_user: ws['id_user'] }, { message_id: messageId }, { method: method }, { date: messageDate }] }).then(\n\t\t\t\t\tres => {\n\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tthis._websocketManager.send(ws, JSON.stringify(res.response));\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\terr => {}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tthis._subscriptionManager.unsubscribeAll(ws);\n\t\tws.removeAllListeners();\n\t\tws = null;\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n\n\tpublic getServerConfig() {\n\t\treturn this._serverConfig;\n\t}\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server-app.ts"],"names":["http_1","require","express","bodyParser","xmlParser","WebSocket","jwt","moment","common_1","mongo_manager_1","cron_manager_1","method_manager_1","subscription_manager_1","monitor_manager_1","method_response_collection_1","log_collection_1","log_method_latency_collection_1","user_collection_1","home_1","auth_1","health_1","index_1","mongodb_1","worker_task_request_collection_1","worker_task_response_collection_1","websocket_manager_1","ResolveIOMainServer","mainServer","serverConfig","clientRoutes","clientDir","sesMail","standardProgram","publicProgram","_this","this","_offlineUpdates","_rebootFlag","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_workerTasks","_safeShutdown","_serverConfig","_clientDir","_serverStartTime","Date","_monitorManager","MonitorManager","_monitorManagerFunction","MonitorManagerFunction","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setInterval","_subscriptionManager","getEnableDebug","console","log","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","setTimeout","_methodManager","sendEmail","JSON","stringify","name","message","stack","_a","sent","exit","_serverHTTP","close","safeShutdown","MethodManager","_cronManager","CronManager","startWorkerInstance","_websocketManager","WebSocketManager","startServerInstance","SubscriptionManager","_serverWSS","listen","prototype","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","changeStream","WorkerTaskRequests","watchCollection","$match","fullDocument.status","fullDocument","change","operationType","task_1","processTask","length","task_2","status","find","sort","createdAt","pendingTasks","_b","pendingTasks_1","__values","pendingTasks_1_1","done","task","value","includes","_id","updateOne","$set","then","resReq","push","callMethodInternal","call","apply","__spreadArray","Object","assign","id_user","user","id_ws","method","__read","params","result","WorkerTaskResponses","create","id_request","has_error","data","err_1","splice","indexOf","getActiveMonitorFunctions","setImmediate","ResolveIOServer","getMongoConnection","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","ws","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","port","verifyClient","info","cb","infoData","headers","split","origin","token","verify","err","decoded","Users","findById","fullname","readonly","date","client","getClientName","objectIdHexString","addWebSocket","createLoggedInUser","send","unsubscribeWS","parseErrorFound","socketData","parse","e","readyState","OPEN","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","message_1","processSocketMessage","now","getTime","messageRoute","some","a","roles","groups","views","b","super_admin","messageDate","messageId","type","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","offlineUpdates","i","update","serverResMethod","shift","methodLatencyId","LogMethodLatencies","__v","date_start","date_end","latency_ms","Logs","insertOne","collection","id_document","payload","getBinarySize","route","_methods","_c","err_3","getMongoManager","invalidateQueryCache","map","messageRoute_1","messageDate_1","messageId_1","type_1","callMethod","MethodResponses","findOne","$and","message_id","response","unsubscribeAll","removeAllListeners","getApp","getServerConfig"],"mappings":"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","file":"server-app.js","sourcesContent":["import { createServer, Server } from 'http';\nimport * as express from 'express';\nimport * as bodyParser from 'body-parser';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport * as WebSocket from 'ws';\nimport * as jwt from 'jsonwebtoken';\n// import * as SegfaultHandler from 'segfault-handler';\nimport * as moment from 'moment-timezone';\n\nimport { dateReviver, getBinarySize, deepCopy } from './util/common';\n\nimport { objectIdHexString } from './managers/mongo.manager';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\n\nimport { ServerResponseModel } from './models/server-response.model';\n\nimport { MethodResponses } from './collections/method-response.collection';\nimport { Logs } from './collections/log.collection';\nimport { LogMethodLatencies } from './collections/log-method-latency.collection';\nimport { Users } from './collections/user.collection';\n\nimport { setupHomeRoutes } from './http/home';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { ResolveIOServer } from './index';\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { WorkerTaskRequests } from './collections/worker-task-request.collection';\nimport { WorkerTaskResponses } from './collections/worker-task-response.collection';\nimport { WorkerTaskRequestModel } from './models/worker-task-request.model';\nimport { WebSocketManager } from './managers/websocket.manager';\n\nexport default class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\n\tprivate _portWSS: number;\n\tprivate _serverConfig;\n\tprivate _clientDir;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\tprivate _workerTasks: string[] = [];\n\n\tprivate _safeShutdown = false;\n\n\tconstructor(mainServer, serverConfig, clientRoutes, clientDir, sesMail, standardProgram, publicProgram = false) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._clientRoutes = clientRoutes;\n\t\tthis._clientDir = clientDir;\n\t\tthis.sesMail = sesMail;\n\t\tthis.standardProgram = standardProgram;\n\t\tthis.publicProgram = publicProgram;\n\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = new MonitorManager(mainServer, serverConfig);\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\t// Condition to filter out the MongoError with code 48 (NamespaceExists)\n\t\t\tif (error && error['name'] === 'MongoError' && error['code'] === 48) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tconsole.error(new Date(), 'Unhandled Rejection at Promise', [error, rej]);\n\t\t\t\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\t// If this is a MongoNetworkTimeoutError, handle it specifically\n\t\t\tif (error && (error['name'] === 'MongoNetworkTimeoutError' || error instanceof MongoNetworkTimeoutError)) {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t// Sending email notification (using your existing method)\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - MongoNetworkTimeoutError - Quitting NodeJS - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify({\n\t\t\t\t\t\tname: error['name'],\n\t\t\t\t\t\tmessage: error['message'],\n\t\t\t\t\t\tstack: error['stack']\n\t\t\t\t\t}, null, 2));\n\n\t\t\t\t\t// Exiting the process\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error) {\n\t\t\t\tif (error['name'] !== 'StatusError' && error['message'] !== '') {\n\t\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconsole.error(error, 'Uncaught Exception thrown');\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t}\n\t\t});\n\n\t\t//PM2 wants to reboot/restart\n\t\tprocess.on('SIGINT', () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tthis._serverHTTP.close();\n\t\t\tthis.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tthis._serverHTTP.close();\n\t\t\tthis.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tthis._serverHTTP.close();\n\t\t\tthis.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n if (this._isWorkersEnabled) {\n if (this._isWorkerInstance) {\n console.log('Running as a Worker instance');\n\t\t\t\tthis._methodManager = new MethodManager(this, this._serverConfig, this._clientDir, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n this._cronManager = new CronManager(this);\n\t\t\t\tthis.startWorkerInstance();\n }\n\t\t\telse {\n console.log('Running as a Server instance');\n\t\t\t\tthis._websocketManager = new WebSocketManager(this);\n this.startServerInstance(serverConfig);\n\t\t\t\tthis._methodManager = new MethodManager(this, this._serverConfig, this._clientDir, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._subscriptionManager = new SubscriptionManager(this, this._serverWSS, this._serverConfig, this._monitorManagerFunction);\n\t\t\t\tthis.listen();\n }\n }\n\t\telse {\n console.log('Running with Workers Disabled');\n\t\t\tthis._websocketManager = new WebSocketManager(this);\n this.startServerInstance(serverConfig);\n\t\t\tthis._methodManager = new MethodManager(this, this._serverConfig, this._clientDir, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = new SubscriptionManager(this, this._serverWSS, this._serverConfig, this._monitorManagerFunction);\n this._cronManager = new CronManager(this);\n\t\t\tthis.listen();\n }\n\t}\n\n\tprivate startServerInstance(serverConfig) {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\t// Use body parser for http call (login)\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.PORT_HTTP || serverConfig['PORT_HTTP'] || 8080;\n\t\tthis._portWSS = process.env.PORT_WSS || serverConfig['PORT_WSS'] || 8081;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\n\t\t\t// Website you wish to allow to connect\n\t\t\t// res.setHeader('Access-Control-Allow-Origin', serverConfig['ROOT_URL']);\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\n\t\t\t// Request methods you wish to allow\n\t\t\t// res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\n\t\t\t// Request headers you wish to allow\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\n\t\t\t// Set to true if you need the website to include cookies in the requests sent\n\t\t\t// to the API (e.g. in case you use sessions)\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\n\t\t\t// Pass to next layer of middleware\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, serverConfig);\n\t\tsetupHealthRoutes(this._app, serverConfig);\n\n\t\tif (serverConfig['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, serverConfig);\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tprivate async startWorkerInstance() {\n\t\tconsole.log('Worker instance started, watching worker-task-reqs...');\n\t\n\t\t// Now, set up the change stream to watch for new tasks\n\t\tlet changeStream = WorkerTaskRequests.watchCollection([{ $match: { 'fullDocument.status': 'pending' } }], { fullDocument: 'updateLookup' });\n\t\n\t\tchangeStream.on('change', async (change) => {\n\t\t\tif (change.operationType === 'insert') {\n\t\t\t\tconst task = change.fullDocument;\n\t\t\t\tif (task) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.processTask(task);\n\t\t\t\t\t}, this._workerTasks.length * 25);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (change.operationType === 'update') {\n\t\t\t\tconst task = change.fullDocument;\n\t\t\t\tif (task && task.status === 'pending') {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.processTask(task);\n\t\t\t\t\t}, this._workerTasks.length * 25);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\n\t\tchangeStream.on('error', (error) => {\n\t\t\tconsole.error('Error in change stream worker task requests:', error);\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.startWorkerInstance(), 5000); // Restart after a delay\n\t\t});\n\t\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log('Change stream worker task requests closed. Restarting...');\n\t\t\tsetTimeout(() => this.startWorkerInstance(), 5000); // Restart after a delay\n\t\t});\n\n\t\t// First, process any existing pending tasks in the database\n\t\tconst pendingTasks = await WorkerTaskRequests.find({ status: 'pending' }, {sort: {createdAt: 1}});\n\n\t\tfor (const task of pendingTasks) {\n\t\t\tthis.processTask(task);\n\t\t}\n\t}\n\t\n\t// Process a task (handles both existing and new tasks)\n\tprivate async processTask(task: WorkerTaskRequestModel) {\n\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\treturn;\n\t\t}\n\t\t\t\n\t\tWorkerTaskRequests.updateOne({ _id: task._id, status: 'pending' }, { $set: { status: 'processing' } }).then(async resReq => {\n\t\t\tif (resReq) {\n\t\t\t\tthis._workerTasks.push(task._id);\n\n\t\t\t\ttry {\n\t\t\t\t\t// Run the actual method\n\t\t\t\t\tconst result = await this._methodManager.callMethodInternal.call(Object.assign({}, this._methodManager, MethodManager.prototype, { id_user: task.id_user, user: task.user, id_ws: task.id_ws }), task.method, ...task.params);\n\n\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\thas_error: false,\n\t\t\t\t\t\tdata: result,\n\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tconsole.error('Worker failed to process task:', task._id, err);\n\n\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\thas_error: true,\n\t\t\t\t\t\tdata: err.message,\n\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\t\t\tthis._workerTasks.splice(this._workerTasks.indexOf(task._id), 1);\n\t\t\t\t}\n\n\t\t\t\t// Mark the task as complete\n\t\t\t\tWorkerTaskRequests.updateOne({ _id: task._id }, { $set: { status: 'complete' } });\n\n\t\t\t\t// console.log(new Date(), 'Instance: ' + process.env.NODE_APP_INSTANCE, 'Complete Task', 'Current Jobs: ' + this._workerTasks.length);\n\t\t\t}\n\t\t}, () => {});\n\t}\n\n\tprivate safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length && \n\t\t\t// (!this._monitorManagerFunction.getLastCompletedMonitorFunction() ||\n\t\t\t// Date.now() >= this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime.getTime() + 1500) &&\n\t\t\t!this._offlineUpdates.length\n\t\t) {\n\t\t\tResolveIOServer.getMongoConnection().close(false).then(() => {\n\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\tprocess.exit(0);\n\t\t\t}, () => {process.exit(1)});\n\t\t}\n\t\telse {\n\t\t\tif (!this._safeShutdown) {\n\t\t\t\tthis._safeShutdown = true;\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._safeShutdown = false;\n\t\t\t\t}, 1000);\n\n\t\t\t\tconsole.log(new Date(), \n\t\t\t\t\t'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length, \n\t\t\t\t\t// this._monitorManagerFunction.getLastCompletedMonitorFunction() ? this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime : '',\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(() => {\n\t\t\t\tthis.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\t// Start express server\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000; // This should be bigger than `keepAliveTimeout + your server's expected response time`\n\n\t\t// Start websocket server\n\t\t// Verify client with token before opening socket\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tport: this._portWSS,\n\t\t\tverifyClient: this.publicProgram ? null : async (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (info.origin !== this._serverConfig['ROOT_URL'] && info.origin !== this._serverConfig['SEC_ROOT_URL'] && info.origin !== this._serverConfig['RESOLVEIO_URL'] && info.origin !== this._serverConfig['RESOLVEIO_SECONDARY_URL']) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, this._serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\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\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\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\tcb(false);\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\tcatch (err) {\n\t\t\t\t\t\t\t\t\t\tcb(false);\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\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// Listen to port for websocket\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('listening', () => {\n\t\t\tconsole.log('Running server on port %s', this._portWSS);\n\t\t});\n\n\t\t// On websocket connection (already verified)\n\t\tthis._serverWSS.on('connection', (ws, req) => {\n\t\t\tif (!this.publicProgram) {\n\t\t\t\t// Get user from token\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tif (ws['user'] !== 'Admin' && this._serverConfig['CLIENT_NAME'] !== 'ResolveIO') {\n\t\t\t\t\tthis.getMethodManager().callMethodInternal.call(this.getMethodManager(), 'supportCreateBillingUser', {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tdate: new Date(),\n\t\t\t\t\t\tclient: ResolveIOServer.getClientName()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\tws['retryCnt'] = 0;\n\n\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\tthis._subscriptionManager.createLoggedInUser(ws['id_socket']).then(() => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, 5000);\n\t\t\t});\n\n\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\tconsole.log('Connection from: ' + req['user']);\n\t\t\t}\n\t\t\t\n\t\t\t// Use for keeping connection alive (ping/pong)\n\t\t\tws['isAlive'] = true;\n\t\t\tws.on('message', async (message: string) => {\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Message from: ' + ws['user'], message);\n\t\t\t\t}\n\n\t\t\t\tthis._debugMsgRecv += 1;\n\n\t\t\t\tlet parseErrorFound = false;\n\n\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\n\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - JSON Parse Error - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([message, e]));\n\n\t\t\t\t\tparseErrorFound = true;\n\t\t\t\t}\n\n\t\t\t\tif (!parseErrorFound) {\n\t\t\t\t\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tws.send('pong', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Pong');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\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\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\t\t\t\tws['isAlive'] = true;\n\t\t\t\t\t\tws['pongTime'] = new Date();\n\t\t\t\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\t\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!Array.isArray(socketData[0])) {\n\t\t\t\t\t\t// Not an array, invalid message\n\t\t\t\t\t\tconsole.log('Invalid message format, expected array:', socketData);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (let message of socketData) {\n\t\t\t\t\t\t\tawait this.processSocketMessage(ws, message);\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\t.on('end', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'WS End');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('close', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'WS Close');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('error', error => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), ws['user'], ws['id_socket'], 'WS Error');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t});\n\n\t\t// Keep alive timer to ping/pong\n\t\tsetInterval(() => {\n\t\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\t\tif (ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= 20000) {\n\t\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\t\tws['retryCnt']++;\n\n\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 20000);\n\t}\n\n\tprivate async processSocketMessage(ws: WebSocket, socketData: any[]) {\n\t\tlet messageRoute = socketData[0];\n\n\t\tif (!this.publicProgram && this._clientRoutes.some(a => messageRoute.includes(a)) && !ws['doc_user'].roles.groups.some(a => a.views.some(b => messageRoute.includes(b) || b.includes(messageRoute))) && !ws['doc_user'].roles.super_admin) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet messageDate = socketData[1];\n\t\tlet messageId = socketData[2];\n\t\tlet type = socketData[3];\n\n\t\tif (type === 'subscription') {\n\t\t\tlet subType = socketData[4];\n\t\t\tlet pub = socketData[5];\n\n\t\t\t// Subscribe\n\t\t\tif (subType === 'sub') {\n\t\t\t\tthis._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));\n\t\t\t}\n\t\t\t// Unsubscribe\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));\n\t\t\t}\n\t\t}\n\t\telse if (!this.publicProgram && type === 'offline') {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: 'ACK'\n\t\t\t};\n\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tthis._websocketManager.send(ws, JSON.stringify(serverRes));\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = socketData[4];\n\n\t\t\tfor (let i = 0; i < offlineUpdates.length; i++) {\n\t\t\t\tlet update = offlineUpdates[i];\n\n\t\t\t\tlet data = update.data;\n\n\t\t\t\tlet serverResMethod: ServerResponseModel = {\n\t\t\t\t\tmessageId: update.data[2],\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, JSON.stringify(serverResMethod));\n\t\t\t\t}\n\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\tif (method === 'insertDocument' && data[0] === 'driver-gps') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t__v: 0,\n\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\tdate_end: null,\n\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\tmethod: method\n\t\t\t\t});\n\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethodInternal.call(Object.assign({}, this._methodManager, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), method, ...data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Offline Error', JSON.stringify(err, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(data[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Offline - Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.splice(this._offlineUpdates.map(a => a['id_socket']).indexOf(ws['id_socket']), 1);\n\t\t}\n\t\telse { //methods\n\t\t\tlet data = [...socketData];\n\t\t\t\n\t\t\tlet messageRoute: string = data.shift();\n\t\t\tlet messageDate: Date = data.shift();\n\t\t\tlet messageId: number = data.shift();\n\t\t\tlet type: string = data.shift();\n\n\t\t\tif (type === 'method') {\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t__v: 0,\n\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\tdate_end: null,\n\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\tmethod: method\n\t\t\t\t});\n\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, JSON.stringify(serverRes));\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\tthis._methodManager.callMethod(methodLatencyId, ws, messageDate, messageId, method, ...data);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (type === 'methodResponse') {\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tMethodResponses.findOne({ $and: [{ id_user: ws['id_user'] }, { message_id: messageId }, { method: method }, { date: messageDate }] }).then(\n\t\t\t\t\tres => {\n\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tthis._websocketManager.send(ws, JSON.stringify(res.response));\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\terr => {}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tthis._subscriptionManager.unsubscribeAll(ws);\n\t\tws.removeAllListeners();\n\t\tws = null;\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n\n\tpublic getServerConfig() {\n\t\treturn this._serverConfig;\n\t}\n}"]}
|