@resolveio/server-lib 20.7.71 → 20.7.72
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";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerDispatcherManager=void 0;var common_1=require("../util/common"),WorkerDispatcherManager=function(){function WorkerDispatcherManager(){this._workers=[],this._taskQueue=[],this._clientRequests={},this._pendingTasks=new Map,this.MAX_CONCURRENCY=10}return WorkerDispatcherManager.create=function(e,t){var r=new WorkerDispatcherManager;return r.initialize(e,t),r},WorkerDispatcherManager.prototype.initialize=function(e,t){var r=this;this._websocketManager=e,this._methodManager=t,setInterval(function(){console.log(new Date,JSON.stringify(r._workers.map(function(e){return e.activeTasks}),null,2))},5e3)},WorkerDispatcherManager.prototype.isSafeShutdown=function(){return!this._taskQueue.length&&!this._pendingTasks.size},WorkerDispatcherManager.prototype.addWorker=function(e){this._workers.push({id:e.id_worker,ws:e,activeTasks:[]}),this._taskQueue.length&&this.dispatchQueue()},WorkerDispatcherManager.prototype.disconnectWorker=function(t){this._workers=this._workers.filter(function(e){return e.id!==t})},WorkerDispatcherManager.prototype.sendClientTask=function(e,t,r,s){var a="task-"+(0,common_1.objectIdHexString)();this._taskQueue.push({type:"task",taskId:a,messageId:e,method:t,params:r,userContext:s}),s&&s.id_ws&&(this._clientRequests[a]=s.id_ws),this.dispatchQueue()},WorkerDispatcherManager.prototype.sendInternalTask=function(e,t){void 0===t&&(t=[]),Array.isArray(t)||(t=[t]);var r="task-"+(0,common_1.objectIdHexString)();this._taskQueue.push({type:"task",taskId:r,method:e,params:t,messageId:0,userContext:{user:"Internal System"}}),this.dispatchQueue()},WorkerDispatcherManager.prototype.dispatchQueue=function(){var e=this;if(this._taskQueue.length)for(;0<this._taskQueue.length;){var t=this.findAvailableWorker();if(!t)return void setTimeout(function(){e.dispatchQueue()},25);var r=this._taskQueue.shift();this.assignTaskToWorker(t,r)}},WorkerDispatcherManager.prototype.findAvailableWorker=function(){var t=this,e=this._workers.filter(function(e){return e.activeTasks.length<t.MAX_CONCURRENCY});return e.length?(e.sort(function(e,t){return e.activeTasks.map(function(e){return e.weight}).reduce(function(e,t){return e+t},0)-t.activeTasks.map(function(e){return e.weight}).reduce(function(e,t){return e+t},0)}),e[0]):null},WorkerDispatcherManager.prototype.assignTaskToWorker=function(r,s){var a=this,e=this._methodManager.getMethod(s.method);if(e){r.activeTasks.push({taskId:s.taskId,weight:e&&e.workerTaskWeight?e.workerTaskWeight:1});var e={type:"task",taskId:s.taskId,messageId:s.messageId,method:s.method,params:s.params,userContext:s.userContext||{}},t=setTimeout(function(){var e,t;a._pendingTasks.has(s.taskId)&&a._pendingTasks.delete(s.taskId),console.log(new Date,"TIMEOUT HIT","task",s.taskId,s.messageId,s.method,JSON.stringify(a._workers)),r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s.taskId}),s.userContext&&s.userContext.id_ws&&(e={messageId:s.messageId,hasError:!0,data:"Task timed out after 2m in WorkerDispatcherManager for method: "+s.method},t=a._websocketManager.getWebSocket(s.userContext.id_ws))&&a._websocketManager.send(t,e)},12e4);this._pendingTasks.set(s.taskId,{timeout:t});try{this.sendWorkerPayload(r.ws,e)}catch(e){console.error("Failed to send task to worker:",e),clearTimeout(t),r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s.taskId}),this._taskQueue.unshift(s),this.dispatchQueue()}}else console.error("Failed to send task to worker - Could not find method:",s.method)},WorkerDispatcherManager.prototype.handleWorkerMessage=function(t,r){var s,e,a,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerDispatcherManager=void 0;var common_1=require("../util/common"),WorkerDispatcherManager=function(){function WorkerDispatcherManager(){this._workers=[],this._taskQueue=[],this._clientRequests={},this._pendingTasks=new Map,this.MAX_CONCURRENCY=10}return WorkerDispatcherManager.create=function(e,t){var r=new WorkerDispatcherManager;return r.initialize(e,t),r},WorkerDispatcherManager.prototype.initialize=function(e,t){var r=this;this._websocketManager=e,this._methodManager=t,setInterval(function(){console.log(new Date,JSON.stringify(r._workers.map(function(e){return e.activeTasks}),null,2))},5e3)},WorkerDispatcherManager.prototype.isSafeShutdown=function(){return!this._taskQueue.length&&!this._pendingTasks.size},WorkerDispatcherManager.prototype.addWorker=function(e){this._workers.push({id:e.id_worker,ws:e,activeTasks:[]}),this._taskQueue.length&&this.dispatchQueue()},WorkerDispatcherManager.prototype.disconnectWorker=function(t){this._workers=this._workers.filter(function(e){return e.id!==t})},WorkerDispatcherManager.prototype.sendClientTask=function(e,t,r,s){var a="task-"+(0,common_1.objectIdHexString)();this._taskQueue.push({type:"task",taskId:a,messageId:e,method:t,params:r,userContext:s}),s&&s.id_ws&&(this._clientRequests[a]=s.id_ws),this.dispatchQueue()},WorkerDispatcherManager.prototype.sendInternalTask=function(e,t){void 0===t&&(t=[]),Array.isArray(t)||(t=[t]);var r="task-"+(0,common_1.objectIdHexString)();this._taskQueue.push({type:"task",taskId:r,method:e,params:t,messageId:0,userContext:{user:"Internal System"}}),this.dispatchQueue()},WorkerDispatcherManager.prototype.dispatchQueue=function(){var e=this;if(this._taskQueue.length)for(;0<this._taskQueue.length;){var t=this.findAvailableWorker();if(!t)return void setTimeout(function(){e.dispatchQueue()},25);var r=this._taskQueue.shift();this.assignTaskToWorker(t,r)}},WorkerDispatcherManager.prototype.findAvailableWorker=function(){var t=this,e=this._workers.filter(function(e){return e.activeTasks.length<t.MAX_CONCURRENCY});return e.length?(e.sort(function(e,t){return e.activeTasks.map(function(e){return e.weight}).reduce(function(e,t){return e+t},0)-t.activeTasks.map(function(e){return e.weight}).reduce(function(e,t){return e+t},0)}),e[0]):null},WorkerDispatcherManager.prototype.assignTaskToWorker=function(r,s){var a=this,e=this._methodManager.getMethod(s.method);if(e){r.activeTasks.push({taskId:s.taskId,weight:e&&e.workerTaskWeight?e.workerTaskWeight:1});var e={type:"task",taskId:s.taskId,messageId:s.messageId,method:s.method,params:s.params,userContext:s.userContext||{}},t=setTimeout(function(){var e,t;a._pendingTasks.has(s.taskId)&&a._pendingTasks.delete(s.taskId),console.log(new Date,"TIMEOUT HIT","task",s.taskId,s.messageId,s.method,JSON.stringify(a._workers.map(function(e){return e.activeTasks}))),r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s.taskId}),s.userContext&&s.userContext.id_ws&&(e={messageId:s.messageId,hasError:!0,data:"Task timed out after 2m in WorkerDispatcherManager for method: "+s.method},t=a._websocketManager.getWebSocket(s.userContext.id_ws))&&a._websocketManager.send(t,e)},12e4);this._pendingTasks.set(s.taskId,{timeout:t});try{this.sendWorkerPayload(r.ws,e)}catch(e){console.error("Failed to send task to worker:",e),clearTimeout(t),r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s.taskId}),this._taskQueue.unshift(s),this.dispatchQueue()}}else console.error("Failed to send task to worker - Could not find method:",s.method)},WorkerDispatcherManager.prototype.handleWorkerMessage=function(t,r){var s,e,a,i;try{e=JSON.parse(r,common_1.dateReviver)}catch(e){return void console.error("Failed to parse worker message:",r)}"taskComplete"===e.type&&((r=this._workers.find(function(e){return e.id===t}))?(s=e.taskId,a=e.messageId,i=e.error,e=e.result,r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s}),(r=this._pendingTasks.get(s))&&(clearTimeout(r.timeout),this._pendingTasks.delete(s)),(r=this._clientRequests[s])&&(a={messageId:a,hasError:!1,data:e},i&&(a.hasError=!0,a.data=e),(i=this._websocketManager.getWebSocket(r))&&this._websocketManager.send(i,a),this._clientRequests[s])&&delete this._clientRequests[s],this._taskQueue.length&&this.dispatchQueue()):console.error("Unknown worker for taskComplete:",t))},WorkerDispatcherManager.prototype.sendWorkerPayload=function(e,t){if("string"!=typeof t&&(t=JSON.stringify(t)),e&&e.readyState===e.OPEN)try{e.send(t)}catch(e){console.error("Failed to send worker response:",e)}else e&&e.close()},WorkerDispatcherManager}();exports.WorkerDispatcherManager=WorkerDispatcherManager;
|
|
2
2
|
//# sourceMappingURL=worker-dispatcher.manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/managers/worker-dispatcher.manager.ts"],"names":["common_1","require","WorkerDispatcherManager","this","_workers","_taskQueue","_clientRequests","_pendingTasks","Map","MAX_CONCURRENCY","create","websocketManager","methodManager","workerDispatcherManager","initialize","prototype","_this","_websocketManager","_methodManager","setInterval","console","log","Date","JSON","stringify","map","a","activeTasks","isSafeShutdown","length","size","addWorker","ws","push","id","dispatchQueue","disconnectWorker","workerId","filter","w","sendClientTask","messageId","method","params","userContext","taskId","objectIdHexString","type","id_ws","sendInternalTask","Array","isArray","user","worker","findAvailableWorker","setTimeout","task","shift","assignTaskToWorker","candidates","x","sort","y","weight","reduce","b","getMethod","workerTaskWeight","payload","timeoutHandle","timeoutRes","clientWS","has","delete","hasError","data","getWebSocket","send","set","timeout","sendWorkerPayload","err","error","clearTimeout","unshift","handleWorkerMessage","messageStr","taskId_1","result","res","clientReqWS","parse","dateReviver","_a","find","pendingTask","get","clientReqId","readyState","OPEN","close","exports"],"mappings":"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","file":"worker-dispatcher.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { ServerResponseModel, TaskPayload, TaskResponse } from '../models/server-message.model';\nimport { dateReviver, objectIdHexString } from '../util/common';\nimport { MethodManager } from './method.manager';\nimport { WebSocketManager } from './websocket.manager';\n\nexport interface WorkerConnection {\n id: string;\n ws: WebSocket.WebSocket;\n activeTasks: { taskId: string, weight: number }[];\n}\n\nexport class WorkerDispatcherManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _methodManager: MethodManager;\n private _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskPayload[] = [];\n private _clientRequests: { [taskId: string]: string } = {};\n\tprivate _pendingTasks: Map<string, {\n\t\ttimeout: NodeJS.Timeout;\n\t}> = new Map();\n\n private MAX_CONCURRENCY = 10;\n\n constructor() {}\n \n static create(websocketManager: WebSocketManager, methodManager: MethodManager) {\n const workerDispatcherManager = new WorkerDispatcherManager();\n workerDispatcherManager.initialize(websocketManager, methodManager);\n return workerDispatcherManager;\n }\n\n public initialize(websocketManager: WebSocketManager, methodManager: MethodManager) {\n\t\tthis._websocketManager = websocketManager;\n\t\tthis._methodManager = methodManager;\n\n\t\tsetInterval(() => {\n\t\t\tconsole.log(new Date(), JSON.stringify(this._workers.map(a => a.activeTasks), null, 2));\n\t\t}, 5000);\n }\n\n\tpublic isSafeShutdown() {\n\t\treturn !this._taskQueue.length && !this._pendingTasks.size;\n\t}\n\n public addWorker(ws: WebSocket.WebSocket) {\n this._workers.push({\n\t\t\tid: ws['id_worker'],\n\t\t\tws: ws,\n\t\t\tactiveTasks: []\n\t\t});\n\n\t\tif (this._taskQueue.length) {\n\t\t\tthis.dispatchQueue();\n\t\t}\n }\n\n\tpublic disconnectWorker(workerId: string) {\n\t\tthis._workers = this._workers.filter(w => w.id !== workerId);\n\t}\n\n /**\n\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tpublic sendClientTask(messageId: number, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmessageId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext\n\t\t});\n\n\t\tif (userContext && userContext.id_ws) {\n\t\t\t// console.log(new Date(), 'Send Client Task', userContext, taskId);\n\t\t\tthis._clientRequests[taskId] = userContext.id_ws;\n\t\t}\n\n\t\tthis.dispatchQueue();\n\t}\n\n\tpublic sendInternalTask(method: string, params = []) {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tmessageId: 0,\n\t\t\tuserContext: {\n\t\t\t\tuser: 'Internal System'\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this._taskQueue.length > 0) {\n\t\t\tlet worker = this.findAvailableWorker();\n\n\t\t\tif (!worker) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.dispatchQueue();\n\t\t\t\t}, 25);\n\t\t\t\t\n\t\t\t\treturn; // no worker can take more tasks\n\t\t\t}\n\n\t\t\t// Remove from queue\n\t\t\tlet task = this._taskQueue.shift();\n\t\t\tthis.assignTaskToWorker(worker, task);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency. Or null if none.\n\t */\n\tprivate findAvailableWorker(): WorkerConnection | null {\n\t\tlet candidates = this._workers.filter(x => x.activeTasks.length < this.MAX_CONCURRENCY);\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Sort by how busy they are\n\t\tcandidates.sort((x, y) => x.activeTasks.map(a => a.weight).reduce((a, b) => a + b, 0) - y.activeTasks.map(a => a.weight).reduce((a, b) => a + b, 0));\n\t\t// console.log('Best Candidate', JSON.stringify(candidates[0], null, 2));\n\t\treturn candidates[0];\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskPayload) {\n\t\tlet method = this._methodManager.getMethod(task.method);\n\n\t\tif (!method) {\n\t\t\tconsole.error('Failed to send task to worker - Could not find method:', task.method);\n\t\t\treturn;\n\t\t}\n\n\t\tworker.activeTasks.push({\n\t\t\ttaskId: task.taskId,\n\t\t\tweight: method && method.workerTaskWeight ? method.workerTaskWeight : 1\n\t\t});\n\n\t\tlet payload: TaskPayload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmessageId: task.messageId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext || {}\n\t\t};\n\n\t\tlet timeoutHandle = setTimeout(() => {\n\t\t\tif (this._pendingTasks.has(task.taskId)) {\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'TIMEOUT HIT', 'task', task.taskId, task.messageId, task.method, JSON.stringify(this._workers));\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\tif (task.userContext && task.userContext.id_ws) {\n\t\t\t\tlet timeoutRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: task.messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Task timed out after 2m in WorkerDispatcherManager for method: ' + task.method\n\t\t\t\t};\n\n\t\t\t\tlet clientWS = this._websocketManager.getWebSocket(task.userContext.id_ws);\n\n\t\t\t\tif (clientWS) {\n\t\t\t\t\tthis._websocketManager.send(clientWS, timeoutRes);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 120000);\n\n\t\tthis._pendingTasks.set(task.taskId, {\n\t\t\ttimeout: timeoutHandle\n\t\t});\n\n\t\t// console.log(new Date(), 'Sending Worker Msg', 'task', process.env.NODE_APP_INSTANCE, task.taskId, task.messageId, task.method, JSON.stringify(this._workers.map(a => a.activeTasks)));\n\n\t\ttry {\n\t\t\tthis.sendWorkerPayload(worker.ws, payload);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\n\t\t\tclearTimeout(timeoutHandle);\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\t// Put task back at front\n\t\t\tthis._taskQueue.unshift(task);\n\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tpublic handleWorkerMessage(workerId: string, messageStr: string) {\n\t\tlet data: TaskResponse;\n\t\t\n\t\ttry {\n\t\t\tdata = JSON.parse(messageStr, dateReviver);\n\t\t}\n\t\tcatch {\n\t\t\tconsole.error('Failed to parse worker message:', messageStr);\n\t\t\treturn;\n\t\t}\n\n\t\t// console.log('Recv Worker Msg', data.type, data.taskId, data.messageId, data.error);\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet worker = this._workers.find(x => x.id === workerId);\n\t\t\t\n\t\t\tif (!worker) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet { taskId, messageId, error, result } = data;\n\n\t\t\t// console.log(new Date(), 'Handle Worker Msg', 'taskComplete', process.env.NODE_APP_INSTANCE, taskId, JSON.stringify(this._workers.map(a => a.activeTasks)));\n\t\t\t\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== taskId);\n\n\t\t\tlet pendingTask = this._pendingTasks.get(taskId);\n\t\t\t\n\t\t\tif (pendingTask) {\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(taskId);\n\t\t\t}\n\n\t\t\t// Look up original request\n\t\t\tlet clientReqId = this._clientRequests[taskId];\n\t\t\t\n\t\t\tif (clientReqId) {\n\t\t\t\t// Send the final response to the client\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = result;\n\t\t\t\t}\n\n\t\t\t\tlet clientReqWS = this._websocketManager.getWebSocket(clientReqId);\n\n\t\t\t\tif (clientReqWS) {\n\t\t\t\t\tthis._websocketManager.send(clientReqWS, res);\n\t\t\t\t}\n\n\t\t\t\tif (this._clientRequests[taskId]) {\n\t\t\t\t\tdelete this._clientRequests[taskId];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tif (this._taskQueue.length) {\n\t\t\t\tthis.dispatchQueue();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic sendWorkerPayload(ws: WebSocket.WebSocket, payload: TaskPayload | string) {\n if (typeof payload !== 'string') {\n payload = JSON.stringify(payload);\n }\n\n\t\t// console.log('Sending', payload);\n\n if (ws && ws.readyState === ws.OPEN) {\n try {\n ws.send(payload);\n }\n catch (err) {\n console.error('Failed to send worker response:', err);\n }\n }\n else if (ws) {\n ws.close();\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/managers/worker-dispatcher.manager.ts"],"names":["common_1","require","WorkerDispatcherManager","this","_workers","_taskQueue","_clientRequests","_pendingTasks","Map","MAX_CONCURRENCY","create","websocketManager","methodManager","workerDispatcherManager","initialize","prototype","_this","_websocketManager","_methodManager","setInterval","console","log","Date","JSON","stringify","map","a","activeTasks","isSafeShutdown","length","size","addWorker","ws","push","id","dispatchQueue","disconnectWorker","workerId","filter","w","sendClientTask","messageId","method","params","userContext","taskId","objectIdHexString","type","id_ws","sendInternalTask","Array","isArray","user","worker","findAvailableWorker","setTimeout","task","shift","assignTaskToWorker","candidates","x","sort","y","weight","reduce","b","getMethod","workerTaskWeight","payload","timeoutHandle","timeoutRes","clientWS","has","delete","hasError","data","getWebSocket","send","set","timeout","sendWorkerPayload","err","error","clearTimeout","unshift","handleWorkerMessage","messageStr","taskId_1","result","res","clientReqWS","parse","dateReviver","_a","find","pendingTask","get","clientReqId","readyState","OPEN","close","exports"],"mappings":"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","file":"worker-dispatcher.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { ServerResponseModel, TaskPayload, TaskResponse } from '../models/server-message.model';\nimport { dateReviver, objectIdHexString } from '../util/common';\nimport { MethodManager } from './method.manager';\nimport { WebSocketManager } from './websocket.manager';\n\nexport interface WorkerConnection {\n id: string;\n ws: WebSocket.WebSocket;\n activeTasks: { taskId: string, weight: number }[];\n}\n\nexport class WorkerDispatcherManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _methodManager: MethodManager;\n private _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskPayload[] = [];\n private _clientRequests: { [taskId: string]: string } = {};\n\tprivate _pendingTasks: Map<string, {\n\t\ttimeout: NodeJS.Timeout;\n\t}> = new Map();\n\n private MAX_CONCURRENCY = 10;\n\n constructor() {}\n \n static create(websocketManager: WebSocketManager, methodManager: MethodManager) {\n const workerDispatcherManager = new WorkerDispatcherManager();\n workerDispatcherManager.initialize(websocketManager, methodManager);\n return workerDispatcherManager;\n }\n\n public initialize(websocketManager: WebSocketManager, methodManager: MethodManager) {\n\t\tthis._websocketManager = websocketManager;\n\t\tthis._methodManager = methodManager;\n\n\t\tsetInterval(() => {\n\t\t\tconsole.log(new Date(), JSON.stringify(this._workers.map(a => a.activeTasks), null, 2));\n\t\t}, 5000);\n }\n\n\tpublic isSafeShutdown() {\n\t\treturn !this._taskQueue.length && !this._pendingTasks.size;\n\t}\n\n public addWorker(ws: WebSocket.WebSocket) {\n this._workers.push({\n\t\t\tid: ws['id_worker'],\n\t\t\tws: ws,\n\t\t\tactiveTasks: []\n\t\t});\n\n\t\tif (this._taskQueue.length) {\n\t\t\tthis.dispatchQueue();\n\t\t}\n }\n\n\tpublic disconnectWorker(workerId: string) {\n\t\tthis._workers = this._workers.filter(w => w.id !== workerId);\n\t}\n\n /**\n\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tpublic sendClientTask(messageId: number, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmessageId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext\n\t\t});\n\n\t\tif (userContext && userContext.id_ws) {\n\t\t\t// console.log(new Date(), 'Send Client Task', userContext, taskId);\n\t\t\tthis._clientRequests[taskId] = userContext.id_ws;\n\t\t}\n\n\t\tthis.dispatchQueue();\n\t}\n\n\tpublic sendInternalTask(method: string, params = []) {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tmessageId: 0,\n\t\t\tuserContext: {\n\t\t\t\tuser: 'Internal System'\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this._taskQueue.length > 0) {\n\t\t\tlet worker = this.findAvailableWorker();\n\n\t\t\tif (!worker) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.dispatchQueue();\n\t\t\t\t}, 25);\n\t\t\t\t\n\t\t\t\treturn; // no worker can take more tasks\n\t\t\t}\n\n\t\t\t// Remove from queue\n\t\t\tlet task = this._taskQueue.shift();\n\t\t\tthis.assignTaskToWorker(worker, task);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency. Or null if none.\n\t */\n\tprivate findAvailableWorker(): WorkerConnection | null {\n\t\tlet candidates = this._workers.filter(x => x.activeTasks.length < this.MAX_CONCURRENCY);\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Sort by how busy they are\n\t\tcandidates.sort((x, y) => x.activeTasks.map(a => a.weight).reduce((a, b) => a + b, 0) - y.activeTasks.map(a => a.weight).reduce((a, b) => a + b, 0));\n\t\t// console.log('Best Candidate', JSON.stringify(candidates[0], null, 2));\n\t\treturn candidates[0];\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskPayload) {\n\t\tlet method = this._methodManager.getMethod(task.method);\n\n\t\tif (!method) {\n\t\t\tconsole.error('Failed to send task to worker - Could not find method:', task.method);\n\t\t\treturn;\n\t\t}\n\n\t\tworker.activeTasks.push({\n\t\t\ttaskId: task.taskId,\n\t\t\tweight: method && method.workerTaskWeight ? method.workerTaskWeight : 1\n\t\t});\n\n\t\tlet payload: TaskPayload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmessageId: task.messageId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext || {}\n\t\t};\n\n\t\tlet timeoutHandle = setTimeout(() => {\n\t\t\tif (this._pendingTasks.has(task.taskId)) {\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'TIMEOUT HIT', 'task', task.taskId, task.messageId, task.method, JSON.stringify(this._workers.map(a => a.activeTasks)));\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\tif (task.userContext && task.userContext.id_ws) {\n\t\t\t\tlet timeoutRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: task.messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Task timed out after 2m in WorkerDispatcherManager for method: ' + task.method\n\t\t\t\t};\n\n\t\t\t\tlet clientWS = this._websocketManager.getWebSocket(task.userContext.id_ws);\n\n\t\t\t\tif (clientWS) {\n\t\t\t\t\tthis._websocketManager.send(clientWS, timeoutRes);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 120000);\n\n\t\tthis._pendingTasks.set(task.taskId, {\n\t\t\ttimeout: timeoutHandle\n\t\t});\n\n\t\t// console.log(new Date(), 'Sending Worker Msg', 'task', process.env.NODE_APP_INSTANCE, task.taskId, task.messageId, task.method, JSON.stringify(this._workers.map(a => a.activeTasks)));\n\n\t\ttry {\n\t\t\tthis.sendWorkerPayload(worker.ws, payload);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\n\t\t\tclearTimeout(timeoutHandle);\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\t// Put task back at front\n\t\t\tthis._taskQueue.unshift(task);\n\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tpublic handleWorkerMessage(workerId: string, messageStr: string) {\n\t\tlet data: TaskResponse;\n\t\t\n\t\ttry {\n\t\t\tdata = JSON.parse(messageStr, dateReviver);\n\t\t}\n\t\tcatch {\n\t\t\tconsole.error('Failed to parse worker message:', messageStr);\n\t\t\treturn;\n\t\t}\n\n\t\t// console.log('Recv Worker Msg', data.type, data.taskId, data.messageId, data.error);\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet worker = this._workers.find(x => x.id === workerId);\n\t\t\t\n\t\t\tif (!worker) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet { taskId, messageId, error, result } = data;\n\n\t\t\t// console.log(new Date(), 'Handle Worker Msg', 'taskComplete', process.env.NODE_APP_INSTANCE, taskId, JSON.stringify(this._workers.map(a => a.activeTasks)));\n\t\t\t\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== taskId);\n\n\t\t\tlet pendingTask = this._pendingTasks.get(taskId);\n\t\t\t\n\t\t\tif (pendingTask) {\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(taskId);\n\t\t\t}\n\n\t\t\t// Look up original request\n\t\t\tlet clientReqId = this._clientRequests[taskId];\n\t\t\t\n\t\t\tif (clientReqId) {\n\t\t\t\t// Send the final response to the client\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = result;\n\t\t\t\t}\n\n\t\t\t\tlet clientReqWS = this._websocketManager.getWebSocket(clientReqId);\n\n\t\t\t\tif (clientReqWS) {\n\t\t\t\t\tthis._websocketManager.send(clientReqWS, res);\n\t\t\t\t}\n\n\t\t\t\tif (this._clientRequests[taskId]) {\n\t\t\t\t\tdelete this._clientRequests[taskId];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tif (this._taskQueue.length) {\n\t\t\t\tthis.dispatchQueue();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic sendWorkerPayload(ws: WebSocket.WebSocket, payload: TaskPayload | string) {\n if (typeof payload !== 'string') {\n payload = JSON.stringify(payload);\n }\n\n\t\t// console.log('Sending', payload);\n\n if (ws && ws.readyState === ws.OPEN) {\n try {\n ws.send(payload);\n }\n catch (err) {\n console.error('Failed to send worker response:', err);\n }\n }\n else if (ws) {\n ws.close();\n }\n }\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:[]},l={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function verb(t){return function(e){var r=[t,e];if(o)throw new TypeError("Generator is already executing.");for(;c=l&&r[l=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))},bodyParser=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResolveIOMainServer=void 0,require("body-parser")),express=require("express"),xmlParser=require("express-xml-bodyparser"),http_1=require("http"),jwt=require("jsonwebtoken"),moment=require("moment-timezone"),WebSocket=require("ws"),log_collection_1=require("./collections/log.collection"),user_collection_1=require("./collections/user.collection"),cron_manager_1=require("./managers/cron.manager"),method_manager_1=require("./managers/method.manager"),monitor_manager_1=require("./managers/monitor.manager"),subscription_manager_1=require("./managers/subscription.manager"),common_1=require("./util/common"),mongodb_1=require("mongodb"),auth_1=require("./http/auth"),health_1=require("./http/health"),home_1=require("./http/home"),websocket_manager_1=require("./managers/websocket.manager"),worker_dispatcher_manager_1=require("./managers/worker-dispatcher.manager"),worker_server_manager_1=require("./managers/worker-server.manager"),resolveio_server_app_1=require("./resolveio-server-app"),ResolveIOMainServer=function(){function ResolveIOMainServer(){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._safeShutdown=!1}return ResolveIOMainServer.create=function(){return __awaiter(this,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return[4,(r=new ResolveIOMainServer).initialize()];case 1:return e.sent(),[2,r]}})})},ResolveIOMainServer.prototype.initialize=function(){return __awaiter(this,void 0,void 0,function(){var r,o,i=this;return __generator(this,function(e){switch(e.label){case 0:return this._serverStartTime=new Date,this._lastErrorMsg=null,r=this,[4,monitor_manager_1.MonitorManager.create()];case 1:return r._monitorManager=e.sent(),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(){i._subscriptionManager&&i._subscriptionManager.getEnableDebug()&&(console.log(new Date,"Server App","Msg Recv Hits",i._debugMsgRecv),console.log(new Date,"Server App","Msg Queue Hits",i._debugMsgQueue)),i._debugMsgQueue=0,i._debugMsgRecv=0},6e4),o=!1,setTimeout(function(){o=!0},5e3),process.removeAllListeners("unhandledRejection"),process.on("unhandledRejection",function(n,s){return __awaiter(i,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&&26!==n.code&&11e3!==n.code?!n||"MongoServerError"!==n.name||o&&26!==n.code&&11e3!==n.code&&86!==n.code?(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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify({name:n.name,message:n.message,stack:n.stack},null,2))]):[3,2]:[3,3]):[2]:[2];case 1:e.sent(),process.exit(1),e.label=2;case 2:return[3,11];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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().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,11];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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().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,11];case 9:return n?"StatusError"!==n.name&&""!==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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,11]:[3,11];case 10:e.sent(),e.label=11;case 11:return[2]}})})}),process.on("uncaughtException",function(t){return __awaiter(i,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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().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(){return __awaiter(i,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),process.on("SIGTERM",function(){return __awaiter(i,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),process.on("SIGQUIT",function(){return __awaiter(i,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),"DEBUG"===this.LOGGER&&console.log("Starting ResolveIO Server"),this._isWorkersEnabled?this._isWorkerInstance?(console.log("Running as a Worker instance",process.env.NODE_APP_INSTANCE),this._methodManager=method_manager_1.MethodManager.create(null,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._workerServerManager=worker_server_manager_1.WorkerServerManager.create(this._methodManager,this.getServerConfig()),"0"===process.env.WORKER_INDEX&&(this._cronManager=cron_manager_1.CronManager.create())):(console.log("Running as a Server instance",process.env.NODE_APP_INSTANCE),this._websocketManager=websocket_manager_1.WebSocketManager.create(this),this._methodManager=method_manager_1.MethodManager.create(this._websocketManager,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._workerDispatcherManager=worker_dispatcher_manager_1.WorkerDispatcherManager.create(this._websocketManager,this._methodManager),this._subscriptionManager=subscription_manager_1.SubscriptionManager.create(this._serverWSS,resolveio_server_app_1.ResolveIOServer.getServerConfig(),this._monitorManagerFunction),this.startServerInstance(),this.listen()):(console.log("Running with Workers Disabled",process.env.NODE_APP_INSTANCE),this._websocketManager=websocket_manager_1.WebSocketManager.create(this),this._methodManager=method_manager_1.MethodManager.create(this._websocketManager,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=subscription_manager_1.SubscriptionManager.create(this._serverWSS,resolveio_server_app_1.ResolveIOServer.getServerConfig(),this._monitorManagerFunction),this._cronManager=cron_manager_1.CronManager.create(),this.startServerInstance(),this.listen()),[2]}})})},ResolveIOMainServer.prototype.startServerInstance=function(){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.NODE_APP_INSTANCE?parseInt("808"+process.env.NODE_APP_INSTANCE):8080,"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,resolveio_server_app_1.ResolveIOServer.getServerConfig()),(0,health_1.setupHealthRoutes)(this._app),"ResolveIO"!==resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME&&!this.standardProgram||(0,home_1.setupHomeRoutes)(this,this._app,resolveio_server_app_1.ResolveIOServer.getServerConfig()),"DEBUG"===this.LOGGER&&console.log("Setup express routes")},ResolveIOMainServer.prototype.safeShutdown=function(){return __awaiter(this,void 0,void 0,function(){var r=this;return __generator(this,function(e){switch(e.label){case 0:if(this._safeShutdown||console.log(new Date,"Safe Shutdown Command Received"),this._monitorManagerFunction.getActiveMonitorFunctions().length||this._offlineUpdates.length||this._workerDispatcherManager&&!this._workerDispatcherManager.isSafeShutdown())return[3,7];if(!resolveio_server_app_1.ResolveIOServer.getMongoConnection())return[3,5];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,resolveio_server_app_1.ResolveIOServer.getMongoConnection().close(!1)];case 2:return e.sent(),console.log(new Date,"Safe Exit Complete, Process Exit"),process.exit(0),[3,4];case 3:return e.sent(),process.exit(1),[3,4];case 4:return[3,6];case 5:process.exit(0),e.label=6;case 6:return[3,8];case 7:this._safeShutdown||(this._safeShutdown=!0,setTimeout(function(){r._safeShutdown=!1},1e3),console.log(new Date,"Safe Exit In Progress",this._monitorManagerFunction.getActiveMonitorFunctions().length,this._offlineUpdates.length)),setImmediate(function(){return __awaiter(r,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),e.label=8;case 8:return[2]}})})},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 r=this;this._serverHTTP=(0,http_1.createServer)(this._app),this._serverHTTP.keepAliveTimeout=65e3,this._serverHTTP.headersTimeout=66e3,this._serverWSS=new WebSocket.Server({server:this._serverHTTP,verifyClient:this.publicProgram?null:function(s,o){var e;r._rebootFlag?o(!1,409,"Unable To Process"):("DEBUG"===r.LOGGER&&console.log("Verify Client",s,o),s.req.url&&s.req.url.includes("workerToken=")?(s.req.url.split("workerToken=")[1]||"")===resolveio_server_app_1.ResolveIOServer.getServerConfig().WORKER_TOKEN?o(!0):o(!1,401,"Unauthorized"):(e=s.req.headers["sec-websocket-protocol"].split(/,/),(s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().SEC_ROOT_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().RESOLVEIO_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().RESOLVEIO_SECONDARY_URL)&&(e=e[0])?jwt.verify(e,resolveio_server_app_1.ResolveIOServer.getServerConfig().JWT_SECRET,function(t,n){return __awaiter(r,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return t?(o(!1,401,"Unauthorized"),[3,5]):[3,1];case 1:s.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())?(s.req.user=r.fullname,s.req.user_readonly=r.readonly||!1,s.req.doc_user=r,o(!0)):o(!1),[3,5];case 4:return e.sent(),o(!1),[3,5];case 5:return[2]}})})}):o(!1,401,"Unauthorized")))}})},ResolveIOMainServer.prototype.listen=function(){var e=this;this._serverHTTP.listen(this._portHTTP,function(){console.log("Running HTTP/WS server on port %s",e._portHTTP)}),this._serverWSS.on("connection",function(o,i){return __awaiter(e,void 0,void 0,function(){var r,t,n,s=this;return __generator(this,function(e){switch(e.label){case 0:return i.url&&i.url.includes("workerToken=")?(r=(0,common_1.objectIdHexString)(),o.id_worker=r,console.log(new Date,process.env.NODE_APP_INSTANCE,"Worker Connected",process.env.NODE_APP_INSTANCE),this._workerDispatcherManager.addWorker(o),n=null,this._workerDispatcherManager.sendWorkerPayload(o,"ping"),t=setInterval(function(){n?(n=null,s._workerDispatcherManager.sendWorkerPayload(o,"ping")):o.close()},3e4),o.on("message",function(e){"ping"===(e="string"!=typeof e?e.toString():e)?s._workerDispatcherManager.sendWorkerPayload(o,"pong"):"pong"===e?n=new Date:s._workerDispatcherManager.handleWorkerMessage(o.id_worker,e)}),o.on("close",function(){console.log(new Date,"Worker disconnected:",r),t&&clearInterval(t)}),o.on("error",function(e){console.error("Error on WS Worker",e),o.close()}),[3,3]):[3,1];case 1:return o.id_socket=(0,common_1.objectIdHexString)(),o.id_user=i.id_user,o.user=i.user,o.user_readonly=i.user_readonly,o.doc_user=i.doc_user,this._websocketManager.addWebSocket(o),[4,this._subscriptionManager.createLoggedInUser(o.id_socket)];case 2:e.sent(),setTimeout(function(){o.pingTime=new Date,o.send("ping",function(r){return __awaiter(s,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(o)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})})},5e3),"DEBUG"===this.LOGGER&&console.log("Connection from user: "+i.user),o.isAlive=!0,o.retryCnt=0,o.on("message",function(n){return __awaiter(s,void 0,void 0,function(){var r,t;return __generator(this,function(e){switch(e.label){case 0:this._debugMsgRecv+=1,r=[],e.label=1;case 1:return e.trys.push([1,2,,4]),r=JSON.parse(n,common_1.dateReviver),[3,4];case 2:return t=e.sent(),console.log("Error - JSON.parse",n),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - JSON Parse Error - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n,t]))];case 3:return e.sent(),[2];case 4:return[4,this.processSocketMessage(o,r)];case 5:return e.sent(),[2]}})})}).on("end",function(){o.close()}).on("error",function(){o.close()}).on("close",function(){return __awaiter(s,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return[4,this.unsubscribeWS(o)];case 1:return e.sent(),[2]}})})}),e.label=3;case 3:return[2]}})})}),setInterval(function(){return __awaiter(e,void 0,void 0,function(){var r,n,t,s,o,i,a,c=this;return __generator(this,function(e){switch(e.label){case 0:r=function(t){return __generator(this,function(e){switch(e.label){case 0:return t.pingTime&&2e4<=Date.now()-t.pingTime.getTime()?!1!==t.isAlive?[3,4]:(t.retryCnt++,3<=t.retryCnt?[4,n.unsubscribeWS(t)]:[3,2]):[3,5];case 1:return e.sent(),[3,3];case 2:t.pingTime=new Date,t.send("ping",function(r){return __awaiter(c,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(t)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),e.label=3;case 3:return[3,5];case 4:t.retryCnt=0,t.isAlive=!1,t.pingTime=new Date,t.send("ping",function(r){return __awaiter(c,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(t)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),e.label=5;case 5:return[2]}})},n=this,e.label=1;case 1:e.trys.push([1,6,7,8]),t=__values(this._serverWSS.clients),s=t.next(),e.label=2;case 2:return s.done?[3,5]:(o=s.value,[5,r(o)]);case 3:e.sent(),e.label=4;case 4:return s=t.next(),[3,2];case 5:return[3,8];case 6:return o=e.sent(),i={error:o},[3,8];case 7:try{s&&!s.done&&(a=t.return)&&a.call(t)}finally{if(i)throw i.error}return[7];case 8:return[2]}})})},2e4)},ResolveIOMainServer.prototype.processSocketMessage=function(i,a){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o;return __generator(this,function(e){switch(e.label){case 0:if("string"==typeof a&&"ping"===a)return i&&i.readyState===i.OPEN&&i.send("pong"),[2];if("string"==typeof a&&"pong"===a)return i.isAlive=!0,i.pongTime=new Date,i.latency=moment.duration(moment(i.pongTime).diff(i.pingTime)).asMilliseconds(),this._subscriptionManager.loggedInLatency(i),[2];if(!Array.isArray(a[0]))return console.log("Invalid message format (expected array of arrays)",a),[2];e.label=1;case 1:e.trys.push([1,6,7,8]),r=__values(a),t=r.next(),e.label=2;case 2:return t.done?[3,5]:(n=t.value,[4,this.handleClientMessage(i,n)]);case 3:e.sent(),e.label=4;case 4:return t=r.next(),[3,2];case 5:return[3,8];case 6:return n=e.sent(),s={error:n},[3,8];case 7:try{t&&!t.done&&(o=r.return)&&o.call(r)}finally{if(s)throw s.error}return[7];case 8:return[2]}})})},ResolveIOMainServer.prototype.handleClientMessage=function(p,f){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c,l,u,_,g,h,v,d;return __generator(this,function(e){switch(e.label){case 0:return(r=f[0],t=f[1],n=f[2],s=f[3],this.publicProgram||!this._clientRoutes.some(function(e){return r.includes(e)})||p.doc_user.roles.groups.some(function(e){return e.views.some(function(e){return r.includes(e)||e.includes(r)})})||p.doc_user.roles.super_admin)?"subscription"!==s?[3,4]:(i=f[4],o=f[5],"sub"!==i?[3,2]:[4,this._subscriptionManager.subscribe(r,t,p,n,o,f.slice(6))]):[2];case 1:return e.sent(),[3,3];case 2:this._subscriptionManager.unsubscribe(r,t,p,n,o,f.slice(6)),e.label=3;case 3:return[3,22];case 4:if(this.publicProgram||"offline"!==s)return[3,16];i={messageId:n,hasError:!1,data:"ACK"},p&&p.readyState===p.OPEN&&this._websocketManager.send(p,i),this._offlineUpdates.push(p),a=f[4],c=0,e.label=5;case 5:if(!(c<a.length))return[3,15];if(l=a[c],l=l.data,l.shift(),l.shift(),d=l.shift(),l.shift(),v=l.shift(),d={messageId:d,hasError:!1,data:"ACK"},p&&p.readyState===p.OPEN&&this._websocketManager.send(p,d),"insertDocument"===v&&"driver-gps"===l[0])return[3,14];if("reportBuilderGetResults"!==v&&"reportBuilderGetDistinctValue"!==v&&"reportBuilderBuildTree"!==v&&"generatePDF"!==v&&"getWOOfflineData"!==v&&"countQuery"!==v&&"countWithQuery"!==v&&"countCollectionWithQuery"!==v&&"find"!==v&&"findOne"!==v&&"findWithOptions"!==v&&"getDrivers"!==v&&"processAirdropDistribution"!==v&&"qbHandleResponse"!==v){if("https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL)return[3,6];resolveio_server_app_1.ResolveIOServer.getLocalLogManager().writeLog({type:"log",data:{_id:(0,common_1.objectIdHexString)(),createdAt:new Date,type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([l]))<2e5?JSON.stringify([l],null,2):"Too Big",method:v,id_user:p.id_user||"",user:p.user||"",messageId:n,route:r}})}return[3,8];case 6:return[4,log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([l]))<2e5?JSON.stringify([l],null,2):"Too Big",method:v,id_user:p.id_user||"",user:p.user||"",messageId:n,route:r,client:"ResolveIO",instance:"backend.resolveio.com",instance_index:process.env.NODE_APP_INSTANCE||""})];case 7:e.sent(),e.label=8;case 8:if(!this._methodManager._methods[v])return[3,13];e.label=9;case 9:return e.trys.push([9,11,,12]),[4,(d=this._methodManager.callMethod).call.apply(d,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:p.id_user,user:p.user,id_ws:p.id_socket}),v],__read(l),!1))];case 10:return e.sent(),[3,12];case 11:return h=e.sent(),console.log(new Date,"Offline Error",JSON.stringify(h,null,2)),[3,12];case 12:return"updateDocumentOffline"!==v&&"updateDocumentPropsOffline"!==v||resolveio_server_app_1.ResolveIOServer.getMongoManager().invalidateQueryCache(l[0]),[3,14];case 13:console.log("Offline - Could not find method: "+v),e.label=14;case 14:return c++,[3,5];case 15:return this._offlineUpdates.splice(this._offlineUpdates.map(function(e){return e.id_socket}).indexOf(p.id_socket),1),[3,22];case 16:if(u=__spreadArray([],__read(f),!1),u.shift(),u.shift(),_=u.shift(),"method"!==u.shift())return[3,22];if(g=u.shift(),p.user_readonly)return[2];if("reportBuilderGetResults"!==g&&"reportBuilderGetDistinctValue"!==g&&"reportBuilderBuildTree"!==g&&"generatePDF"!==g&&"getWOOfflineData"!==g&&"countQuery"!==g&&"countWithQuery"!==g&&"countCollectionWithQuery"!==g&&"find"!==g&&"findOne"!==g&&"findWithOptions"!==g&&"getDrivers"!==g&&"processAirdropDistribution"!==g){if("https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL)return[3,17];resolveio_server_app_1.ResolveIOServer.getLocalLogManager().writeLog({type:"log",data:{_id:(0,common_1.objectIdHexString)(),createdAt:new Date,type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([u]))<2e5?JSON.stringify([u],null,2):"Too Big",method:g,id_user:p.id_user||"",user:p.user||"",messageId:n,route:r}})}return[3,19];case 17:return[4,log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([u]))<2e5?JSON.stringify([u],null,2):"Too Big",method:g,id_user:p.id_user||"",user:p.user||"",messageId:n,route:r,client:"ResolveIO",instance:"backend.resolveio.com",instance_index:process.env.NODE_APP_INSTANCE||""})];case 18:e.sent(),e.label=19;case 19:return(h={messageId:_,hasError:!1,data:"ACK"},p&&p.readyState===p.OPEN&&this._websocketManager.send(p,h),(v=this._methodManager.getMethod(g))&&!v.skipWorker&&this._isWorkersEnabled&&"find"!==g&&"insertDocument"!==g&&"countWithQuery"!==g&&"findOne"!==g&&"updateDocumentProps"!==g&&"findWithOptions"!==g&&"updateDocument"!==g&&"insertErrorLog"!==g&&"removeDocument"!==g&&"supportCreateBillingUser"!==g&&"getSignedUrl"!==g&&"getSignedUrls"!==g&&"getSignedUrlWithId"!==g&&"incorrectUser"!==g&&"reloadWS"!==g&&"reconnectWS"!==g&&"disconnectWS"!==g)?(this._workerDispatcherManager.sendClientTask(_,g,u,{id_user:p.id_user,user:p.user,id_ws:p.id_socket}),[3,22]):[3,20];case 20:return[4,this.callMethodLocally(p,_,g,u)];case 21:e.sent(),e.label=22;case 22:return[2]}})})},ResolveIOMainServer.prototype.callMethodLocally=function(s,o,i,a){return __awaiter(this,void 0,void 0,function(){var r,t,n;return __generator(this,function(e){switch(e.label){case 0:r={messageId:o,hasError:!1,data:null},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(n=this._methodManager.callMethod).call.apply(n,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:s.id_user,user:s.user,id_ws:s.id_socket}),i],__read(a),!1))];case 2:return n=e.sent(),r.data=n,[3,4];case 3:return t=e.sent(),r.hasError=!0,r.data=t||"Unknown error",[3,4];case 4:return s&&s.readyState===s.OPEN&&this._websocketManager.send(s,r),[2]}})})},ResolveIOMainServer.prototype.unsubscribeWS=function(r){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._subscriptionManager&&this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Unsub WS",r.user,r.id_socket),[4,this._subscriptionManager.unsubscribeAll(r)];case 1:return e.sent(),r.removeAllListeners(),r=null,[2]}})})},ResolveIOMainServer.prototype.getApp=function(){return this._app},ResolveIOMainServer.prototype.getServerConfig=function(){return resolveio_server_app_1.ResolveIOServer.getServerConfig()},ResolveIOMainServer.prototype.getWorkerDispatcherManager=function(){return this._workerDispatcherManager},ResolveIOMainServer.prototype.getWorkerServerManager=function(){return this._workerServerManager},ResolveIOMainServer}();exports.ResolveIOMainServer=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:[]},l={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function verb(t){return function(e){var r=[t,e];if(o)throw new TypeError("Generator is already executing.");for(;c=l&&r[l=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))},bodyParser=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResolveIOMainServer=void 0,require("body-parser")),express=require("express"),xmlParser=require("express-xml-bodyparser"),http_1=require("http"),jwt=require("jsonwebtoken"),moment=require("moment-timezone"),WebSocket=require("ws"),log_collection_1=require("./collections/log.collection"),user_collection_1=require("./collections/user.collection"),cron_manager_1=require("./managers/cron.manager"),method_manager_1=require("./managers/method.manager"),monitor_manager_1=require("./managers/monitor.manager"),subscription_manager_1=require("./managers/subscription.manager"),common_1=require("./util/common"),mongodb_1=require("mongodb"),auth_1=require("./http/auth"),health_1=require("./http/health"),home_1=require("./http/home"),websocket_manager_1=require("./managers/websocket.manager"),worker_dispatcher_manager_1=require("./managers/worker-dispatcher.manager"),worker_server_manager_1=require("./managers/worker-server.manager"),resolveio_server_app_1=require("./resolveio-server-app"),ResolveIOMainServer=function(){function ResolveIOMainServer(){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._safeShutdown=!1}return ResolveIOMainServer.create=function(){return __awaiter(this,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return[4,(r=new ResolveIOMainServer).initialize()];case 1:return e.sent(),[2,r]}})})},ResolveIOMainServer.prototype.initialize=function(){return __awaiter(this,void 0,void 0,function(){var r,o,i=this;return __generator(this,function(e){switch(e.label){case 0:return this._serverStartTime=new Date,this._lastErrorMsg=null,r=this,[4,monitor_manager_1.MonitorManager.create()];case 1:return r._monitorManager=e.sent(),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(){i._subscriptionManager&&i._subscriptionManager.getEnableDebug()&&(console.log(new Date,"Server App","Msg Recv Hits",i._debugMsgRecv),console.log(new Date,"Server App","Msg Queue Hits",i._debugMsgQueue)),i._debugMsgQueue=0,i._debugMsgRecv=0},6e4),o=!1,setTimeout(function(){o=!0},5e3),process.removeAllListeners("unhandledRejection"),process.on("unhandledRejection",function(n,s){return __awaiter(i,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&&26!==n.code&&11e3!==n.code?!n||"MongoServerError"!==n.name||o&&26!==n.code&&11e3!==n.code&&86!==n.code?(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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify({name:n.name,message:n.message,stack:n.stack},null,2))]):[3,2]:[3,3]):[2]:[2];case 1:e.sent(),process.exit(1),e.label=2;case 2:return[3,11];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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().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,11];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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().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,11];case 9:return n?"StatusError"!==n.name&&""!==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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,11]:[3,11];case 10:e.sent(),e.label=11;case 11:return[2]}})})}),process.on("uncaughtException",function(t){return __awaiter(i,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 - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().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(){return __awaiter(i,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),process.on("SIGTERM",function(){return __awaiter(i,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),process.on("SIGQUIT",function(){return __awaiter(i,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),"DEBUG"===this.LOGGER&&console.log("Starting ResolveIO Server"),this._isWorkersEnabled?this._isWorkerInstance?(console.log("Running as a Worker instance",process.env.NODE_APP_INSTANCE),this._methodManager=method_manager_1.MethodManager.create(null,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._workerServerManager=worker_server_manager_1.WorkerServerManager.create(this._methodManager,this.getServerConfig()),"0"===process.env.WORKER_INDEX&&(this._cronManager=cron_manager_1.CronManager.create())):(console.log("Running as a Server instance",process.env.NODE_APP_INSTANCE),this._websocketManager=websocket_manager_1.WebSocketManager.create(this),this._methodManager=method_manager_1.MethodManager.create(this._websocketManager,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._workerDispatcherManager=worker_dispatcher_manager_1.WorkerDispatcherManager.create(this._websocketManager,this._methodManager),this._subscriptionManager=subscription_manager_1.SubscriptionManager.create(this._serverWSS,resolveio_server_app_1.ResolveIOServer.getServerConfig(),this._monitorManagerFunction),this.startServerInstance(),this.listen()):(console.log("Running with Workers Disabled",process.env.NODE_APP_INSTANCE),this._websocketManager=websocket_manager_1.WebSocketManager.create(this),this._methodManager=method_manager_1.MethodManager.create(this._websocketManager,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=subscription_manager_1.SubscriptionManager.create(this._serverWSS,resolveio_server_app_1.ResolveIOServer.getServerConfig(),this._monitorManagerFunction),this._cronManager=cron_manager_1.CronManager.create(),this.startServerInstance(),this.listen()),[2]}})})},ResolveIOMainServer.prototype.startServerInstance=function(){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.NODE_APP_INSTANCE?parseInt("808"+process.env.NODE_APP_INSTANCE):8080,"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,resolveio_server_app_1.ResolveIOServer.getServerConfig()),(0,health_1.setupHealthRoutes)(this._app),"ResolveIO"!==resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME&&!this.standardProgram||(0,home_1.setupHomeRoutes)(this,this._app,resolveio_server_app_1.ResolveIOServer.getServerConfig()),"DEBUG"===this.LOGGER&&console.log("Setup express routes")},ResolveIOMainServer.prototype.safeShutdown=function(){return __awaiter(this,void 0,void 0,function(){var r=this;return __generator(this,function(e){switch(e.label){case 0:if(this._safeShutdown||console.log(new Date,"Safe Shutdown Command Received"),this._monitorManagerFunction.getActiveMonitorFunctions().length||this._offlineUpdates.length||this._workerDispatcherManager&&!this._workerDispatcherManager.isSafeShutdown())return[3,7];if(!resolveio_server_app_1.ResolveIOServer.getMongoConnection())return[3,5];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,resolveio_server_app_1.ResolveIOServer.getMongoConnection().close(!1)];case 2:return e.sent(),console.log(new Date,"Safe Exit Complete, Process Exit"),process.exit(0),[3,4];case 3:return e.sent(),process.exit(1),[3,4];case 4:return[3,6];case 5:process.exit(0),e.label=6;case 6:return[3,8];case 7:this._safeShutdown||(this._safeShutdown=!0,setTimeout(function(){r._safeShutdown=!1},1e3),console.log(new Date,"Safe Exit In Progress",this._monitorManagerFunction.getActiveMonitorFunctions().length,this._offlineUpdates.length)),setImmediate(function(){return __awaiter(r,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),e.label=8;case 8:return[2]}})})},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 r=this;this._serverHTTP=(0,http_1.createServer)(this._app),this._serverHTTP.keepAliveTimeout=65e3,this._serverHTTP.headersTimeout=66e3,this._serverWSS=new WebSocket.Server({server:this._serverHTTP,verifyClient:this.publicProgram?null:function(s,o){var e;r._rebootFlag?o(!1,409,"Unable To Process"):("DEBUG"===r.LOGGER&&console.log("Verify Client",s,o),s.req.url&&s.req.url.includes("workerToken=")?(s.req.url.split("workerToken=")[1]||"")===resolveio_server_app_1.ResolveIOServer.getServerConfig().WORKER_TOKEN?o(!0):o(!1,401,"Unauthorized"):(e=s.req.headers["sec-websocket-protocol"].split(/,/),(s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().SEC_ROOT_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().RESOLVEIO_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().RESOLVEIO_SECONDARY_URL)&&(e=e[0])?jwt.verify(e,resolveio_server_app_1.ResolveIOServer.getServerConfig().JWT_SECRET,function(t,n){return __awaiter(r,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return t?(o(!1,401,"Unauthorized"),[3,5]):[3,1];case 1:s.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())?(s.req.user=r.fullname,s.req.user_readonly=r.readonly||!1,s.req.doc_user=r,o(!0)):o(!1),[3,5];case 4:return e.sent(),o(!1),[3,5];case 5:return[2]}})})}):o(!1,401,"Unauthorized")))}})},ResolveIOMainServer.prototype.listen=function(){var e=this;this._serverHTTP.listen(this._portHTTP,function(){console.log("Running HTTP/WS server on port %s",e._portHTTP)}),this._serverWSS.on("connection",function(o,i){return __awaiter(e,void 0,void 0,function(){var r,t,n,s=this;return __generator(this,function(e){switch(e.label){case 0:return i.url&&i.url.includes("workerToken=")?(r=(0,common_1.objectIdHexString)(),o.id_worker=r,console.log(new Date,process.env.NODE_APP_INSTANCE,"Worker Connected",process.env.NODE_APP_INSTANCE),this._workerDispatcherManager.addWorker(o),n=null,this._workerDispatcherManager.sendWorkerPayload(o,"ping"),t=setInterval(function(){n?(n=null,s._workerDispatcherManager.sendWorkerPayload(o,"ping")):(s._workerDispatcherManager.disconnectWorker(o.id_worker),o.close())},3e4),o.on("message",function(e){"ping"===(e="string"!=typeof e?e.toString():e)?s._workerDispatcherManager.sendWorkerPayload(o,"pong"):"pong"===e?n=new Date:s._workerDispatcherManager.handleWorkerMessage(o.id_worker,e)}),o.on("close",function(){s._workerDispatcherManager.disconnectWorker(o.id_worker),console.log(new Date,"Worker disconnected:",r),t&&clearInterval(t)}),o.on("error",function(e){s._workerDispatcherManager.disconnectWorker(o.id_worker),console.error("Error on WS Worker",e),o.close()}),[3,3]):[3,1];case 1:return o.id_socket=(0,common_1.objectIdHexString)(),o.id_user=i.id_user,o.user=i.user,o.user_readonly=i.user_readonly,o.doc_user=i.doc_user,this._websocketManager.addWebSocket(o),[4,this._subscriptionManager.createLoggedInUser(o.id_socket)];case 2:e.sent(),setTimeout(function(){o.pingTime=new Date,o.send("ping",function(r){return __awaiter(s,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(o)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})})},5e3),"DEBUG"===this.LOGGER&&console.log("Connection from user: "+i.user),o.isAlive=!0,o.retryCnt=0,o.on("message",function(n){return __awaiter(s,void 0,void 0,function(){var r,t;return __generator(this,function(e){switch(e.label){case 0:this._debugMsgRecv+=1,r=[],e.label=1;case 1:return e.trys.push([1,2,,4]),r=JSON.parse(n,common_1.dateReviver),[3,4];case 2:return t=e.sent(),console.log("Error - JSON.parse",n),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - JSON Parse Error - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n,t]))];case 3:return e.sent(),[2];case 4:return[4,this.processSocketMessage(o,r)];case 5:return e.sent(),[2]}})})}).on("end",function(){o.close()}).on("error",function(){o.close()}).on("close",function(){return __awaiter(s,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return[4,this.unsubscribeWS(o)];case 1:return e.sent(),[2]}})})}),e.label=3;case 3:return[2]}})})}),setInterval(function(){return __awaiter(e,void 0,void 0,function(){var r,n,t,s,o,i,a,c=this;return __generator(this,function(e){switch(e.label){case 0:r=function(t){return __generator(this,function(e){switch(e.label){case 0:return t.pingTime&&2e4<=Date.now()-t.pingTime.getTime()?!1!==t.isAlive?[3,4]:(t.retryCnt++,3<=t.retryCnt?[4,n.unsubscribeWS(t)]:[3,2]):[3,5];case 1:return e.sent(),[3,3];case 2:t.pingTime=new Date,t.send("ping",function(r){return __awaiter(c,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(t)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),e.label=3;case 3:return[3,5];case 4:t.retryCnt=0,t.isAlive=!1,t.pingTime=new Date,t.send("ping",function(r){return __awaiter(c,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(t)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),e.label=5;case 5:return[2]}})},n=this,e.label=1;case 1:e.trys.push([1,6,7,8]),t=__values(this._serverWSS.clients),s=t.next(),e.label=2;case 2:return s.done?[3,5]:(o=s.value,[5,r(o)]);case 3:e.sent(),e.label=4;case 4:return s=t.next(),[3,2];case 5:return[3,8];case 6:return o=e.sent(),i={error:o},[3,8];case 7:try{s&&!s.done&&(a=t.return)&&a.call(t)}finally{if(i)throw i.error}return[7];case 8:return[2]}})})},2e4)},ResolveIOMainServer.prototype.processSocketMessage=function(i,a){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o;return __generator(this,function(e){switch(e.label){case 0:if("string"==typeof a&&"ping"===a)return i&&i.readyState===i.OPEN&&i.send("pong"),[2];if("string"==typeof a&&"pong"===a)return i.isAlive=!0,i.pongTime=new Date,i.latency=moment.duration(moment(i.pongTime).diff(i.pingTime)).asMilliseconds(),this._subscriptionManager.loggedInLatency(i),[2];if(!Array.isArray(a[0]))return console.log("Invalid message format (expected array of arrays)",a),[2];e.label=1;case 1:e.trys.push([1,6,7,8]),r=__values(a),t=r.next(),e.label=2;case 2:return t.done?[3,5]:(n=t.value,[4,this.handleClientMessage(i,n)]);case 3:e.sent(),e.label=4;case 4:return t=r.next(),[3,2];case 5:return[3,8];case 6:return n=e.sent(),s={error:n},[3,8];case 7:try{t&&!t.done&&(o=r.return)&&o.call(r)}finally{if(s)throw s.error}return[7];case 8:return[2]}})})},ResolveIOMainServer.prototype.handleClientMessage=function(p,f){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c,l,u,_,g,h,d,v;return __generator(this,function(e){switch(e.label){case 0:return(r=f[0],t=f[1],n=f[2],s=f[3],this.publicProgram||!this._clientRoutes.some(function(e){return r.includes(e)})||p.doc_user.roles.groups.some(function(e){return e.views.some(function(e){return r.includes(e)||e.includes(r)})})||p.doc_user.roles.super_admin)?"subscription"!==s?[3,4]:(i=f[4],o=f[5],"sub"!==i?[3,2]:[4,this._subscriptionManager.subscribe(r,t,p,n,o,f.slice(6))]):[2];case 1:return e.sent(),[3,3];case 2:this._subscriptionManager.unsubscribe(r,t,p,n,o,f.slice(6)),e.label=3;case 3:return[3,22];case 4:if(this.publicProgram||"offline"!==s)return[3,16];i={messageId:n,hasError:!1,data:"ACK"},p&&p.readyState===p.OPEN&&this._websocketManager.send(p,i),this._offlineUpdates.push(p),a=f[4],c=0,e.label=5;case 5:if(!(c<a.length))return[3,15];if(l=a[c],l=l.data,l.shift(),l.shift(),v=l.shift(),l.shift(),d=l.shift(),v={messageId:v,hasError:!1,data:"ACK"},p&&p.readyState===p.OPEN&&this._websocketManager.send(p,v),"insertDocument"===d&&"driver-gps"===l[0])return[3,14];if("reportBuilderGetResults"!==d&&"reportBuilderGetDistinctValue"!==d&&"reportBuilderBuildTree"!==d&&"generatePDF"!==d&&"getWOOfflineData"!==d&&"countQuery"!==d&&"countWithQuery"!==d&&"countCollectionWithQuery"!==d&&"find"!==d&&"findOne"!==d&&"findWithOptions"!==d&&"getDrivers"!==d&&"processAirdropDistribution"!==d&&"qbHandleResponse"!==d){if("https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL)return[3,6];resolveio_server_app_1.ResolveIOServer.getLocalLogManager().writeLog({type:"log",data:{_id:(0,common_1.objectIdHexString)(),createdAt:new Date,type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([l]))<2e5?JSON.stringify([l],null,2):"Too Big",method:d,id_user:p.id_user||"",user:p.user||"",messageId:n,route:r}})}return[3,8];case 6:return[4,log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([l]))<2e5?JSON.stringify([l],null,2):"Too Big",method:d,id_user:p.id_user||"",user:p.user||"",messageId:n,route:r,client:"ResolveIO",instance:"backend.resolveio.com",instance_index:process.env.NODE_APP_INSTANCE||""})];case 7:e.sent(),e.label=8;case 8:if(!this._methodManager._methods[d])return[3,13];e.label=9;case 9:return e.trys.push([9,11,,12]),[4,(v=this._methodManager.callMethod).call.apply(v,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:p.id_user,user:p.user,id_ws:p.id_socket}),d],__read(l),!1))];case 10:return e.sent(),[3,12];case 11:return h=e.sent(),console.log(new Date,"Offline Error",JSON.stringify(h,null,2)),[3,12];case 12:return"updateDocumentOffline"!==d&&"updateDocumentPropsOffline"!==d||resolveio_server_app_1.ResolveIOServer.getMongoManager().invalidateQueryCache(l[0]),[3,14];case 13:console.log("Offline - Could not find method: "+d),e.label=14;case 14:return c++,[3,5];case 15:return this._offlineUpdates.splice(this._offlineUpdates.map(function(e){return e.id_socket}).indexOf(p.id_socket),1),[3,22];case 16:if(u=__spreadArray([],__read(f),!1),u.shift(),u.shift(),_=u.shift(),"method"!==u.shift())return[3,22];if(g=u.shift(),p.user_readonly)return[2];if("reportBuilderGetResults"!==g&&"reportBuilderGetDistinctValue"!==g&&"reportBuilderBuildTree"!==g&&"generatePDF"!==g&&"getWOOfflineData"!==g&&"countQuery"!==g&&"countWithQuery"!==g&&"countCollectionWithQuery"!==g&&"find"!==g&&"findOne"!==g&&"findWithOptions"!==g&&"getDrivers"!==g&&"processAirdropDistribution"!==g){if("https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL)return[3,17];resolveio_server_app_1.ResolveIOServer.getLocalLogManager().writeLog({type:"log",data:{_id:(0,common_1.objectIdHexString)(),createdAt:new Date,type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([u]))<2e5?JSON.stringify([u],null,2):"Too Big",method:g,id_user:p.id_user||"",user:p.user||"",messageId:n,route:r}})}return[3,19];case 17:return[4,log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([u]))<2e5?JSON.stringify([u],null,2):"Too Big",method:g,id_user:p.id_user||"",user:p.user||"",messageId:n,route:r,client:"ResolveIO",instance:"backend.resolveio.com",instance_index:process.env.NODE_APP_INSTANCE||""})];case 18:e.sent(),e.label=19;case 19:return(h={messageId:_,hasError:!1,data:"ACK"},p&&p.readyState===p.OPEN&&this._websocketManager.send(p,h),(d=this._methodManager.getMethod(g))&&!d.skipWorker&&this._isWorkersEnabled&&"find"!==g&&"insertDocument"!==g&&"countWithQuery"!==g&&"findOne"!==g&&"updateDocumentProps"!==g&&"findWithOptions"!==g&&"updateDocument"!==g&&"insertErrorLog"!==g&&"removeDocument"!==g&&"supportCreateBillingUser"!==g&&"getSignedUrl"!==g&&"getSignedUrls"!==g&&"getSignedUrlWithId"!==g&&"incorrectUser"!==g&&"reloadWS"!==g&&"reconnectWS"!==g&&"disconnectWS"!==g)?(this._workerDispatcherManager.sendClientTask(_,g,u,{id_user:p.id_user,user:p.user,id_ws:p.id_socket}),[3,22]):[3,20];case 20:return[4,this.callMethodLocally(p,_,g,u)];case 21:e.sent(),e.label=22;case 22:return[2]}})})},ResolveIOMainServer.prototype.callMethodLocally=function(s,o,i,a){return __awaiter(this,void 0,void 0,function(){var r,t,n;return __generator(this,function(e){switch(e.label){case 0:r={messageId:o,hasError:!1,data:null},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(n=this._methodManager.callMethod).call.apply(n,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:s.id_user,user:s.user,id_ws:s.id_socket}),i],__read(a),!1))];case 2:return n=e.sent(),r.data=n,[3,4];case 3:return t=e.sent(),r.hasError=!0,r.data=t||"Unknown error",[3,4];case 4:return s&&s.readyState===s.OPEN&&this._websocketManager.send(s,r),[2]}})})},ResolveIOMainServer.prototype.unsubscribeWS=function(r){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._subscriptionManager&&this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Unsub WS",r.user,r.id_socket),[4,this._subscriptionManager.unsubscribeAll(r)];case 1:return e.sent(),r.removeAllListeners(),r=null,[2]}})})},ResolveIOMainServer.prototype.getApp=function(){return this._app},ResolveIOMainServer.prototype.getServerConfig=function(){return resolveio_server_app_1.ResolveIOServer.getServerConfig()},ResolveIOMainServer.prototype.getWorkerDispatcherManager=function(){return this._workerDispatcherManager},ResolveIOMainServer.prototype.getWorkerServerManager=function(){return this._workerServerManager},ResolveIOMainServer}();exports.ResolveIOMainServer=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":["bodyParser","require","express","xmlParser","http_1","jwt","moment","WebSocket","log_collection_1","user_collection_1","cron_manager_1","method_manager_1","monitor_manager_1","subscription_manager_1","common_1","mongodb_1","auth_1","health_1","home_1","websocket_manager_1","worker_dispatcher_manager_1","worker_server_manager_1","resolveio_server_app_1","ResolveIOMainServer","this","_offlineUpdates","sesMail","standardProgram","publicProgram","_rebootFlag","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_safeShutdown","create","resolveioMainServer","initialize","_a","sent","prototype","_serverStartTime","Date","MonitorManager","_monitorManager","_b","_monitorManagerFunction","MonitorManagerFunction","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setInterval","_this","_subscriptionManager","getEnableDebug","console","log","initServerFlag","setTimeout","removeAllListeners","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","_methodManager","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","exit","_serverHTTP","close","safeShutdown","NODE_APP_INSTANCE","MethodManager","_workerServerManager","WorkerServerManager","WORKER_INDEX","_cronManager","CronManager","_websocketManager","WebSocketManager","_workerDispatcherManager","WorkerDispatcherManager","SubscriptionManager","_serverWSS","startServerInstance","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","parseInt","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","getActiveMonitorFunctions","length","isSafeShutdown","getMongoConnection","setImmediate","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","ws","push","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","server","verifyClient","info","cb","token","url","includes","split","infoData","headers","origin","verify","err","decoded","Users","findById","user","fullname","readonly","workerId_1","objectIdHexString","addWorker","lastComm_1","sendWorkerPayload","interval_1","toString","handleWorkerMessage","clearInterval","addWebSocket","createLoggedInUser","send","unsubscribeWS","socketData","parse","e_1","processSocketMessage","now","getTime","this_1","_e","__values","value","readyState","OPEN","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","handleClientMessage","msg","messageRoute","messageDate","messageId","type","some","a","roles","groups","views","b","super_admin","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","data","offlineUpdates","i","update","shift","updateMessageId","method","serverResMethod","getLocalLogManager","writeLog","_id","createdAt","collection","id_document","payload","getBinarySize","id_user","route","Logs","insertOne","client","instance","instance_index","_methods","callMethod","call","apply","__spreadArray","Object","assign","id_ws","__read","err_1","getMongoManager","invalidateQueryCache","splice","map","indexOf","dataCopy","msgId","methodName","ack","getMethod","skipWorker","sendClientTask","callMethodLocally","params","result","err_2","unsubscribeAll","getApp","getWorkerDispatcherManager","getWorkerServerManager","exports"],"mappings":"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","file":"server-app.js","sourcesContent":["import * as bodyParser from 'body-parser';\nimport * as express from 'express';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport { createServer, Server } from 'http';\nimport * as jwt from 'jsonwebtoken';\nimport * as moment from 'moment-timezone';\nimport * as WebSocket from 'ws';\n\nimport { Logs } from './collections/log.collection';\nimport { Users } from './collections/user.collection';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { ServerResponseModel } from './models/server-message.model';\nimport { dateReviver, getBinarySize, objectIdHexString } from './util/common';\n\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { setupHomeRoutes } from './http/home';\n\nimport { WebSocketManager } from './managers/websocket.manager';\nimport { WorkerDispatcherManager } from './managers/worker-dispatcher.manager';\nimport { WorkerServerManager } from './managers/worker-server.manager';\nimport { ResolveIOServer } from './resolveio-server-app';\n\nexport class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\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\tprivate _workerDispatcherManager: WorkerDispatcherManager;\n\tprivate _workerServerManager: WorkerServerManager;\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\n\tprivate _safeShutdown = false;\n\n\tconstructor() {}\n\n\tstatic async create() {\n\t\tconst resolveioMainServer = new ResolveIOMainServer();\n\t\tawait resolveioMainServer.initialize();\n\t\treturn resolveioMainServer;\n\t}\n\n\tprivate async initialize() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = await MonitorManager.create();\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\tlet initServerFlag = false;\n\n\t\tsetTimeout(() => {\n\t\t\tinitServerFlag = true;\n\t\t}, 5000);\n\n\t\tprocess.removeAllListeners('unhandledRejection');\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 || error['code'] === 26 || error['code'] === 11000)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tif (error && error['name'] === 'MongoServerError' && (!initServerFlag || error['code'] === 26 || error['code'] === 11000 || error['code'] === 86)) {\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 - ' + ResolveIOServer.getServerConfig()['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 - ' + ResolveIOServer.getServerConfig()['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 - ' + ResolveIOServer.getServerConfig()['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\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + ResolveIOServer.getServerConfig()['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 - ' + ResolveIOServer.getServerConfig()['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', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tconsole.log('Running as a Worker instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._methodManager = MethodManager.create(null, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerServerManager = WorkerServerManager.create(this._methodManager, this.getServerConfig());\n\n\t\t\t\tif (process.env.WORKER_INDEX === '0') {\n\t\t\t\t\tthis._cronManager = CronManager.create();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('Running as a Server instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerDispatcherManager = WorkerDispatcherManager.create(this._websocketManager, this._methodManager);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.startServerInstance();\n\t\t\t\tthis.listen();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.log('Running with Workers Disabled', process.env.NODE_APP_INSTANCE);\n\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\tthis._cronManager = CronManager.create();\n\t\t\tthis.startServerInstance();\n\t\t\tthis.listen();\n\t\t}\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\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.NODE_APP_INSTANCE ? parseInt('808' + process.env.NODE_APP_INSTANCE) : 8080;\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\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\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, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app);\n\n\t\tif (ResolveIOServer.getServerConfig()['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, ResolveIOServer.getServerConfig());\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 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._offlineUpdates.length && (!this._workerDispatcherManager || this._workerDispatcherManager.isSafeShutdown())\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait ResolveIOServer.getMongoConnection().close(false);\n\t\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tcatch { \n\t\t\t\t\tprocess.exit(1); \n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\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(), 'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length,\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(async () => {\n\t\t\t\tawait this.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\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\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\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000;\n\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tserver: this._serverHTTP,\n\t\t\tverifyClient: this.publicProgram ? null : (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\t// If it's a worker, we might skip token checks or do a simple check:\n\t\t\t\t\tif (info.req.url && info.req.url.includes('workerToken=')) {\n\t\t\t\t\t\tlet urlParts = info.req.url.split('workerToken='); \n\t\t\t\t\t\tlet workerToken = urlParts[1] || '';\n\n\t\t\t\t\t\tif (workerToken === ResolveIOServer.getServerConfig()['WORKER_TOKEN']) {\n\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\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 (\n\t\t\t\t\t\tinfo.origin !== ResolveIOServer.getServerConfig()['ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['SEC_ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_SECONDARY_URL']\n\t\t\t\t\t) {\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, ResolveIOServer.getServerConfig()['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 {\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/**\n\t * Listen for connections from clients or workers.\n\t */\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running HTTP/WS server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('connection', async (ws, req) => {\n\t\t\tif (req.url && req.url.includes('workerToken=')) {\n\t\t\t\t// It's a WORKER\n\t\t\t\tlet workerId = objectIdHexString();\n\t\t\t\tws['id_worker'] = workerId;\n\n\t\t\t\tconsole.log(new Date(), process.env.NODE_APP_INSTANCE, 'Worker Connected', process.env.NODE_APP_INSTANCE);\n\n\t\t\t\tthis._workerDispatcherManager.addWorker(ws);\n\n\t\t\t\tlet interval = null;\n\t\t\t\tlet lastComm = null;\n\n\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\n\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\tws.close();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\t\t\t\t}\n\t\t\t\t}, 30000);\n\n\t\t\t\tws.on('message', (message: any) => {\n\t\t\t\t\t// console.log(new Date(), 'Message Recv', message);\n\n\t\t\t\t\tif (typeof message !== 'string') {\n\t\t\t\t\t\tmessage = message.toString();\n\t\t\t\t\t}\n\n\t\t\t\t\t// console.log(new Date(), 'String Message Recv', message);\n\n\t\t\t\t\tif (message === 'ping') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'pong');\n\t\t\t\t\t}\n\t\t\t\t\telse if (message === 'pong') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._workerDispatcherManager.handleWorkerMessage(ws['id_worker'], message);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('close', () => {\n\t\t\t\t\tconsole.log(new Date(), 'Worker disconnected:', workerId);\n\t\t\t\t\t\n\t\t\t\t\tif (interval) {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('error', (error) => {\n\t\t\t\t\tconsole.error('Error on WS Worker', error);\n\t\t\t\t\tws.close();\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Normal client\n\t\t\t\tws['id_socket'] = objectIdHexString();\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\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\t\tawait this._subscriptionManager.createLoggedInUser(ws['id_socket']);\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', async (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\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, 5000);\n\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Connection from user: ' + req['user']);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tws['isAlive'] = true;\n\t\t\t\tws['retryCnt'] = 0;\n\n\t\t\t\tws.on('message', async (message: string) => {\n\t\t\t\t\tthis._debugMsgRecv += 1;\n\t\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t\t'dev@resolveio.com', \n\t\t\t\t\t\t\t'SERVER - JSON Parse Error - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], \n\t\t\t\t\t\t\tJSON.stringify([message, e])\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\t// call our existing processSocketMessage\n\t\t\t\t\tawait this.processSocketMessage(ws, socketData);\n\t\t\t\t})\n\t\t\t\t.on('end', () => {\n\t\t\t\t\tws.close();\n\t\t\t\t})\n\t\t\t\t.on('error', () => {\n\t\t\t\t\tws.close()\n\t\t\t\t})\n\t\t\t\t.on('close', async () => {\n\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Keep alive timer\n\t\tsetInterval(async () => {\n\t\t\tfor (let ws of this._serverWSS.clients) {\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\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tawait this.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', async (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\tawait this.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', async (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\tawait this.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\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tws.send('pong');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\tws['isAlive'] = true;\n\t\t\tws['pongTime'] = new Date();\n\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\treturn;\n\t\t}\n\n\t\t// If the top level is not an array, let's skip\n\t\tif (!Array.isArray(socketData[0])) {\n\t\t\tconsole.log('Invalid message format (expected array of arrays)', socketData);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle each sub-message\n\t\tfor (let message of socketData) {\n\t\t\tawait this.handleClientMessage(ws, message);\n\t\t}\n\t}\n\n\tprivate async handleClientMessage(ws: WebSocket, msg: any[]): Promise<void> {\n\t\t// This is basically your old logic from processSocketMessage,\n\t\t// but we'll insert our worker-queue logic for \"method\" calls.\n\n\t\tlet messageRoute = msg[0];\n\t\tlet messageDate = msg[1];\n\t\tlet messageId = msg[2];\n\t\tlet type = msg[3];\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\tif (type === 'subscription') {\n\t\t\tlet subType = msg[4];\n\t\t\tlet pub = msg[5];\n\n\t\t\tif (subType === 'sub') {\n\t\t\t\tawait this._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, msg.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, serverRes);\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = msg[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\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tlet serverResMethod: ServerResponseModel = {\n\t\t\t\t\tmessageId: updateMessageId,\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, serverResMethod);\n\t\t\t\t}\n\n\t\t\t\tif (method === 'insertDocument' && data[0] === 'driver-gps') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\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' && method !== 'qbHandleResponse') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([data])) < 200000 ? JSON.stringify([data], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\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\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([data])) < 200000 ? JSON.stringify([data], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethod.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 {\n\t\t\t// It's presumably a 'method' or something else\n\t\t\tlet dataCopy = [...msg];\n\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet route = dataCopy.shift();\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet date = dataCopy.shift();\n\t\t\tlet msgId = dataCopy.shift();\n\t\t\tlet msgType = dataCopy.shift();\n\t\t\t\n\t\t\tif (msgType === 'method') {\n\t\t\t\tlet methodName = dataCopy.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\tif (methodName !== 'reportBuilderGetResults' && methodName !== 'reportBuilderGetDistinctValue' && methodName !== 'reportBuilderBuildTree' && methodName !== 'generatePDF' && methodName !== 'getWOOfflineData' && methodName !== 'countQuery' && methodName !== 'countWithQuery' && methodName !== 'countCollectionWithQuery' && methodName !== 'find' && methodName !== 'findOne' && methodName !== 'findWithOptions' && methodName !== 'getDrivers' && methodName !== 'processAirdropDistribution') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([dataCopy])) < 200000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\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\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([dataCopy])) < 200000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Immediately ACK\n\t\t\t\tlet ack: ServerResponseModel = {\n\t\t\t\t\tmessageId: msgId,\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, ack);\n\t\t\t\t}\n\n\t\t\t\tlet method = this._methodManager.getMethod(methodName);\n\n\t\t\t\tif (method && \n\t\t\t\t\t!method.skipWorker &&\n\t\t\t\t\tthis._isWorkersEnabled && \n\t\t\t\t\tmethodName !== 'find' &&\n\t\t\t\t\tmethodName !== 'insertDocument' &&\n\t\t\t\t\tmethodName !== 'countWithQuery' &&\n\t\t\t\t\tmethodName !== 'findOne' &&\n\t\t\t\t\tmethodName !== 'updateDocumentProps' &&\n\t\t\t\t\tmethodName !== 'findWithOptions' &&\n\t\t\t\t\tmethodName !== 'updateDocument' &&\n\t\t\t\t\tmethodName !== 'insertErrorLog' &&\n\t\t\t\t\tmethodName !== 'removeDocument' &&\n\t\t\t\t\tmethodName !== 'supportCreateBillingUser' &&\n\t\t\t\t\tmethodName !== 'getSignedUrl' &&\n\t\t\t\t\tmethodName !== 'getSignedUrls' &&\n\t\t\t\t\tmethodName !== 'getSignedUrlWithId' &&\n\t\t\t\t\tmethodName !== 'incorrectUser' &&\n\t\t\t\t\tmethodName !== 'reloadWS' &&\n\t\t\t\t\tmethodName !== 'reconnectWS' &&\n\t\t\t\t\tmethodName !== 'disconnectWS'\n\t\t\t\t) {\t\t\t\t\t\n\t\t\t\t\tthis._workerDispatcherManager.sendClientTask(msgId, methodName, dataCopy, {\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\tid_ws: ws['id_socket']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// No worker available: do method locally\n\t\t\t\t\tawait this.callMethodLocally(ws, msgId, methodName, dataCopy);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * callMethodLocally is your old approach for invoking the method in-process.\n\t */\n\tprivate async callMethodLocally(ws: WebSocket, messageId: number, method: string, params: any[]) {\n\t\tlet serverRes: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: false,\n\t\t\tdata: null\n\t\t};\n\n\t\ttry {\n\t\t\t// You can keep your logging code (LogMethodLatencies, Logs.insertOne, etc.)\n\t\t\tlet result = await this._methodManager.callMethod.call(\n\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\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\tmethod,\n\t\t\t\t...params\n\t\t\t);\n\n\t\t\tserverRes.data = result;\n\t\t}\n\t\tcatch (err) {\n\t\t\tserverRes.hasError = true;\n\t\t\tserverRes.data = err || 'Unknown error';\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t}\n\t}\n\n\t\n\n\t/**\n\t * Cleanly remove a client from the subscription manager, etc.\n\t */\n\tpublic async unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tawait this._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 ResolveIOServer.getServerConfig();\n\t}\n\n\tpublic getWorkerDispatcherManager() {\n\t\treturn this._workerDispatcherManager;\n\t}\n\n\tpublic getWorkerServerManager() {\n\t\treturn this._workerServerManager;\n\t}\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server-app.ts"],"names":["bodyParser","require","express","xmlParser","http_1","jwt","moment","WebSocket","log_collection_1","user_collection_1","cron_manager_1","method_manager_1","monitor_manager_1","subscription_manager_1","common_1","mongodb_1","auth_1","health_1","home_1","websocket_manager_1","worker_dispatcher_manager_1","worker_server_manager_1","resolveio_server_app_1","ResolveIOMainServer","this","_offlineUpdates","sesMail","standardProgram","publicProgram","_rebootFlag","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_safeShutdown","create","resolveioMainServer","initialize","_a","sent","prototype","_serverStartTime","Date","MonitorManager","_monitorManager","_b","_monitorManagerFunction","MonitorManagerFunction","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setInterval","_this","_subscriptionManager","getEnableDebug","console","log","initServerFlag","setTimeout","removeAllListeners","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","_methodManager","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","exit","_serverHTTP","close","safeShutdown","NODE_APP_INSTANCE","MethodManager","_workerServerManager","WorkerServerManager","WORKER_INDEX","_cronManager","CronManager","_websocketManager","WebSocketManager","_workerDispatcherManager","WorkerDispatcherManager","SubscriptionManager","_serverWSS","startServerInstance","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","parseInt","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","getActiveMonitorFunctions","length","isSafeShutdown","getMongoConnection","setImmediate","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","ws","push","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","server","verifyClient","info","cb","token","url","includes","split","infoData","headers","origin","verify","err","decoded","Users","findById","user","fullname","readonly","workerId_1","objectIdHexString","addWorker","lastComm_1","sendWorkerPayload","interval_1","disconnectWorker","toString","handleWorkerMessage","clearInterval","addWebSocket","createLoggedInUser","send","unsubscribeWS","socketData","parse","e_1","processSocketMessage","now","getTime","this_1","_e","__values","value","readyState","OPEN","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","handleClientMessage","msg","messageRoute","messageDate","messageId","type","some","a","roles","groups","views","b","super_admin","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","data","offlineUpdates","i","update","shift","updateMessageId","method","serverResMethod","getLocalLogManager","writeLog","_id","createdAt","collection","id_document","payload","getBinarySize","id_user","route","Logs","insertOne","client","instance","instance_index","_methods","callMethod","call","apply","__spreadArray","Object","assign","id_ws","__read","err_1","getMongoManager","invalidateQueryCache","splice","map","indexOf","dataCopy","msgId","methodName","ack","getMethod","skipWorker","sendClientTask","callMethodLocally","params","result","err_2","unsubscribeAll","getApp","getWorkerDispatcherManager","getWorkerServerManager","exports"],"mappings":"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","file":"server-app.js","sourcesContent":["import * as bodyParser from 'body-parser';\nimport * as express from 'express';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport { createServer, Server } from 'http';\nimport * as jwt from 'jsonwebtoken';\nimport * as moment from 'moment-timezone';\nimport * as WebSocket from 'ws';\n\nimport { Logs } from './collections/log.collection';\nimport { Users } from './collections/user.collection';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { ServerResponseModel } from './models/server-message.model';\nimport { dateReviver, getBinarySize, objectIdHexString } from './util/common';\n\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { setupHomeRoutes } from './http/home';\n\nimport { WebSocketManager } from './managers/websocket.manager';\nimport { WorkerDispatcherManager } from './managers/worker-dispatcher.manager';\nimport { WorkerServerManager } from './managers/worker-server.manager';\nimport { ResolveIOServer } from './resolveio-server-app';\n\nexport class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\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\tprivate _workerDispatcherManager: WorkerDispatcherManager;\n\tprivate _workerServerManager: WorkerServerManager;\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\n\tprivate _safeShutdown = false;\n\n\tconstructor() {}\n\n\tstatic async create() {\n\t\tconst resolveioMainServer = new ResolveIOMainServer();\n\t\tawait resolveioMainServer.initialize();\n\t\treturn resolveioMainServer;\n\t}\n\n\tprivate async initialize() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = await MonitorManager.create();\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\tlet initServerFlag = false;\n\n\t\tsetTimeout(() => {\n\t\t\tinitServerFlag = true;\n\t\t}, 5000);\n\n\t\tprocess.removeAllListeners('unhandledRejection');\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 || error['code'] === 26 || error['code'] === 11000)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tif (error && error['name'] === 'MongoServerError' && (!initServerFlag || error['code'] === 26 || error['code'] === 11000 || error['code'] === 86)) {\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 - ' + ResolveIOServer.getServerConfig()['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 - ' + ResolveIOServer.getServerConfig()['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 - ' + ResolveIOServer.getServerConfig()['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\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + ResolveIOServer.getServerConfig()['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 - ' + ResolveIOServer.getServerConfig()['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', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tconsole.log('Running as a Worker instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._methodManager = MethodManager.create(null, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerServerManager = WorkerServerManager.create(this._methodManager, this.getServerConfig());\n\n\t\t\t\tif (process.env.WORKER_INDEX === '0') {\n\t\t\t\t\tthis._cronManager = CronManager.create();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('Running as a Server instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerDispatcherManager = WorkerDispatcherManager.create(this._websocketManager, this._methodManager);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.startServerInstance();\n\t\t\t\tthis.listen();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.log('Running with Workers Disabled', process.env.NODE_APP_INSTANCE);\n\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\tthis._cronManager = CronManager.create();\n\t\t\tthis.startServerInstance();\n\t\t\tthis.listen();\n\t\t}\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\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.NODE_APP_INSTANCE ? parseInt('808' + process.env.NODE_APP_INSTANCE) : 8080;\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\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\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, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app);\n\n\t\tif (ResolveIOServer.getServerConfig()['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, ResolveIOServer.getServerConfig());\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 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._offlineUpdates.length && (!this._workerDispatcherManager || this._workerDispatcherManager.isSafeShutdown())\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait ResolveIOServer.getMongoConnection().close(false);\n\t\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tcatch { \n\t\t\t\t\tprocess.exit(1); \n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\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(), 'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length,\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(async () => {\n\t\t\t\tawait this.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\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\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\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000;\n\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tserver: this._serverHTTP,\n\t\t\tverifyClient: this.publicProgram ? null : (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\t// If it's a worker, we might skip token checks or do a simple check:\n\t\t\t\t\tif (info.req.url && info.req.url.includes('workerToken=')) {\n\t\t\t\t\t\tlet urlParts = info.req.url.split('workerToken='); \n\t\t\t\t\t\tlet workerToken = urlParts[1] || '';\n\n\t\t\t\t\t\tif (workerToken === ResolveIOServer.getServerConfig()['WORKER_TOKEN']) {\n\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\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 (\n\t\t\t\t\t\tinfo.origin !== ResolveIOServer.getServerConfig()['ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['SEC_ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_SECONDARY_URL']\n\t\t\t\t\t) {\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, ResolveIOServer.getServerConfig()['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 {\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/**\n\t * Listen for connections from clients or workers.\n\t */\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running HTTP/WS server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('connection', async (ws, req) => {\n\t\t\tif (req.url && req.url.includes('workerToken=')) {\n\t\t\t\t// It's a WORKER\n\t\t\t\tlet workerId = objectIdHexString();\n\t\t\t\tws['id_worker'] = workerId;\n\n\t\t\t\tconsole.log(new Date(), process.env.NODE_APP_INSTANCE, 'Worker Connected', process.env.NODE_APP_INSTANCE);\n\n\t\t\t\tthis._workerDispatcherManager.addWorker(ws);\n\n\t\t\t\tlet interval = null;\n\t\t\t\tlet lastComm = null;\n\n\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\n\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\t\t\t\t\t\tws.close();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\t\t\t\t}\n\t\t\t\t}, 30000);\n\n\t\t\t\tws.on('message', (message: any) => {\n\t\t\t\t\t// console.log(new Date(), 'Message Recv', message);\n\n\t\t\t\t\tif (typeof message !== 'string') {\n\t\t\t\t\t\tmessage = message.toString();\n\t\t\t\t\t}\n\n\t\t\t\t\t// console.log(new Date(), 'String Message Recv', message);\n\n\t\t\t\t\tif (message === 'ping') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'pong');\n\t\t\t\t\t}\n\t\t\t\t\telse if (message === 'pong') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._workerDispatcherManager.handleWorkerMessage(ws['id_worker'], message);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('close', () => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.log(new Date(), 'Worker disconnected:', workerId);\n\t\t\t\t\t\n\t\t\t\t\tif (interval) {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('error', (error) => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.error('Error on WS Worker', error);\n\t\t\t\t\tws.close();\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Normal client\n\t\t\t\tws['id_socket'] = objectIdHexString();\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\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\t\tawait this._subscriptionManager.createLoggedInUser(ws['id_socket']);\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', async (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\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, 5000);\n\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Connection from user: ' + req['user']);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tws['isAlive'] = true;\n\t\t\t\tws['retryCnt'] = 0;\n\n\t\t\t\tws.on('message', async (message: string) => {\n\t\t\t\t\tthis._debugMsgRecv += 1;\n\t\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t\t'dev@resolveio.com', \n\t\t\t\t\t\t\t'SERVER - JSON Parse Error - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], \n\t\t\t\t\t\t\tJSON.stringify([message, e])\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\t// call our existing processSocketMessage\n\t\t\t\t\tawait this.processSocketMessage(ws, socketData);\n\t\t\t\t})\n\t\t\t\t.on('end', () => {\n\t\t\t\t\tws.close();\n\t\t\t\t})\n\t\t\t\t.on('error', () => {\n\t\t\t\t\tws.close()\n\t\t\t\t})\n\t\t\t\t.on('close', async () => {\n\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Keep alive timer\n\t\tsetInterval(async () => {\n\t\t\tfor (let ws of this._serverWSS.clients) {\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\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tawait this.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', async (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\tawait this.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', async (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\tawait this.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\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tws.send('pong');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\tws['isAlive'] = true;\n\t\t\tws['pongTime'] = new Date();\n\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\treturn;\n\t\t}\n\n\t\t// If the top level is not an array, let's skip\n\t\tif (!Array.isArray(socketData[0])) {\n\t\t\tconsole.log('Invalid message format (expected array of arrays)', socketData);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle each sub-message\n\t\tfor (let message of socketData) {\n\t\t\tawait this.handleClientMessage(ws, message);\n\t\t}\n\t}\n\n\tprivate async handleClientMessage(ws: WebSocket, msg: any[]): Promise<void> {\n\t\t// This is basically your old logic from processSocketMessage,\n\t\t// but we'll insert our worker-queue logic for \"method\" calls.\n\n\t\tlet messageRoute = msg[0];\n\t\tlet messageDate = msg[1];\n\t\tlet messageId = msg[2];\n\t\tlet type = msg[3];\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\tif (type === 'subscription') {\n\t\t\tlet subType = msg[4];\n\t\t\tlet pub = msg[5];\n\n\t\t\tif (subType === 'sub') {\n\t\t\t\tawait this._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, msg.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, serverRes);\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = msg[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\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tlet serverResMethod: ServerResponseModel = {\n\t\t\t\t\tmessageId: updateMessageId,\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, serverResMethod);\n\t\t\t\t}\n\n\t\t\t\tif (method === 'insertDocument' && data[0] === 'driver-gps') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\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' && method !== 'qbHandleResponse') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([data])) < 200000 ? JSON.stringify([data], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\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\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([data])) < 200000 ? JSON.stringify([data], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethod.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 {\n\t\t\t// It's presumably a 'method' or something else\n\t\t\tlet dataCopy = [...msg];\n\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet route = dataCopy.shift();\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet date = dataCopy.shift();\n\t\t\tlet msgId = dataCopy.shift();\n\t\t\tlet msgType = dataCopy.shift();\n\t\t\t\n\t\t\tif (msgType === 'method') {\n\t\t\t\tlet methodName = dataCopy.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\tif (methodName !== 'reportBuilderGetResults' && methodName !== 'reportBuilderGetDistinctValue' && methodName !== 'reportBuilderBuildTree' && methodName !== 'generatePDF' && methodName !== 'getWOOfflineData' && methodName !== 'countQuery' && methodName !== 'countWithQuery' && methodName !== 'countCollectionWithQuery' && methodName !== 'find' && methodName !== 'findOne' && methodName !== 'findWithOptions' && methodName !== 'getDrivers' && methodName !== 'processAirdropDistribution') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([dataCopy])) < 200000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\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\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([dataCopy])) < 200000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Immediately ACK\n\t\t\t\tlet ack: ServerResponseModel = {\n\t\t\t\t\tmessageId: msgId,\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, ack);\n\t\t\t\t}\n\n\t\t\t\tlet method = this._methodManager.getMethod(methodName);\n\n\t\t\t\tif (method && \n\t\t\t\t\t!method.skipWorker &&\n\t\t\t\t\tthis._isWorkersEnabled && \n\t\t\t\t\tmethodName !== 'find' &&\n\t\t\t\t\tmethodName !== 'insertDocument' &&\n\t\t\t\t\tmethodName !== 'countWithQuery' &&\n\t\t\t\t\tmethodName !== 'findOne' &&\n\t\t\t\t\tmethodName !== 'updateDocumentProps' &&\n\t\t\t\t\tmethodName !== 'findWithOptions' &&\n\t\t\t\t\tmethodName !== 'updateDocument' &&\n\t\t\t\t\tmethodName !== 'insertErrorLog' &&\n\t\t\t\t\tmethodName !== 'removeDocument' &&\n\t\t\t\t\tmethodName !== 'supportCreateBillingUser' &&\n\t\t\t\t\tmethodName !== 'getSignedUrl' &&\n\t\t\t\t\tmethodName !== 'getSignedUrls' &&\n\t\t\t\t\tmethodName !== 'getSignedUrlWithId' &&\n\t\t\t\t\tmethodName !== 'incorrectUser' &&\n\t\t\t\t\tmethodName !== 'reloadWS' &&\n\t\t\t\t\tmethodName !== 'reconnectWS' &&\n\t\t\t\t\tmethodName !== 'disconnectWS'\n\t\t\t\t) {\t\t\t\t\t\n\t\t\t\t\tthis._workerDispatcherManager.sendClientTask(msgId, methodName, dataCopy, {\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\tid_ws: ws['id_socket']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// No worker available: do method locally\n\t\t\t\t\tawait this.callMethodLocally(ws, msgId, methodName, dataCopy);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * callMethodLocally is your old approach for invoking the method in-process.\n\t */\n\tprivate async callMethodLocally(ws: WebSocket, messageId: number, method: string, params: any[]) {\n\t\tlet serverRes: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: false,\n\t\t\tdata: null\n\t\t};\n\n\t\ttry {\n\t\t\t// You can keep your logging code (LogMethodLatencies, Logs.insertOne, etc.)\n\t\t\tlet result = await this._methodManager.callMethod.call(\n\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\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\tmethod,\n\t\t\t\t...params\n\t\t\t);\n\n\t\t\tserverRes.data = result;\n\t\t}\n\t\tcatch (err) {\n\t\t\tserverRes.hasError = true;\n\t\t\tserverRes.data = err || 'Unknown error';\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t}\n\t}\n\n\t\n\n\t/**\n\t * Cleanly remove a client from the subscription manager, etc.\n\t */\n\tpublic async unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tawait this._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 ResolveIOServer.getServerConfig();\n\t}\n\n\tpublic getWorkerDispatcherManager() {\n\t\treturn this._workerDispatcherManager;\n\t}\n\n\tpublic getWorkerServerManager() {\n\t\treturn this._workerServerManager;\n\t}\n}"]}
|