@resolveio/server-lib 20.7.66 → 20.7.68

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=4}return WorkerDispatcherManager.create=function(e,t){var r=new WorkerDispatcherManager;return r.initialize(e,t),r},WorkerDispatcherManager.prototype.initialize=function(e,t){this._websocketManager=e,this._methodManager=t},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,o;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,o=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},o&&(a.hasError=!0,a.data=e),o=this._websocketManager.getWebSocket(r),this._websocketManager.send(o,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;
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){this._websocketManager=e,this._methodManager=t},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,o;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,o=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},o&&(a.hasError=!0,a.data=e),o=this._websocketManager.getWebSocket(r),this._websocketManager.send(o,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","_websocketManager","_methodManager","isSafeShutdown","length","size","addWorker","ws","push","id","activeTasks","dispatchQueue","disconnectWorker","workerId","filter","w","sendClientTask","messageId","method","params","userContext","taskId","objectIdHexString","type","id_ws","sendInternalTask","Array","isArray","user","_this","worker","findAvailableWorker","setTimeout","task","shift","assignTaskToWorker","candidates","x","sort","y","map","a","weight","reduce","b","getMethod","workerTaskWeight","payload","timeoutHandle","timeoutRes","clientWS","has","delete","console","log","Date","JSON","stringify","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 = 4;\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\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\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\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\tthis._websocketManager.send(clientReqWS, res);\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","_websocketManager","_methodManager","isSafeShutdown","length","size","addWorker","ws","push","id","activeTasks","dispatchQueue","disconnectWorker","workerId","filter","w","sendClientTask","messageId","method","params","userContext","taskId","objectIdHexString","type","id_ws","sendInternalTask","Array","isArray","user","_this","worker","findAvailableWorker","setTimeout","task","shift","assignTaskToWorker","candidates","x","sort","y","map","a","weight","reduce","b","getMethod","workerTaskWeight","payload","timeoutHandle","timeoutRes","clientWS","has","delete","console","log","Date","JSON","stringify","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\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\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\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\tthis._websocketManager.send(clientReqWS, res);\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}"]}
@@ -12,4 +12,5 @@ export interface MethodAllModel {
12
12
  }, ...parameters: any[]) => Promise<any | any[]>;
13
13
  skipValidation?: boolean;
14
14
  workerTaskWeight?: number;
15
+ skipWorker?: boolean;
15
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "20.7.66",
3
+ "version": "20.7.68",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",
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()),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(),u=l.shift(),d={messageId:d,hasError:!1,data:"ACK"},p&&p.readyState===p.OPEN&&this._websocketManager.send(p,d),"insertDocument"===u&&"driver-gps"===l[0])return[3,14];if("reportBuilderGetResults"!==u&&"reportBuilderGetDistinctValue"!==u&&"reportBuilderBuildTree"!==u&&"generatePDF"!==u&&"getWOOfflineData"!==u&&"countQuery"!==u&&"countWithQuery"!==u&&"countCollectionWithQuery"!==u&&"find"!==u&&"findOne"!==u&&"findWithOptions"!==u&&"getDrivers"!==u&&"processAirdropDistribution"!==u&&"qbHandleResponse"!==u){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:u,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:u,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[u])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}),u],__read(l),!1))];case 10:return e.sent(),[3,12];case 11:return v=e.sent(),console.log(new Date,"Offline Error",JSON.stringify(v,null,2)),[3,12];case 12:return"updateDocumentOffline"!==u&&"updateDocumentPropsOffline"!==u||resolveio_server_app_1.ResolveIOServer.getMongoManager().invalidateQueryCache(l[0]),[3,14];case 13:console.log("Offline - Could not find method: "+u),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(_=__spreadArray([],__read(f),!1),_.shift(),_.shift(),g=_.shift(),"method"!==_.shift())return[3,22];if(h=_.shift(),p.user_readonly)return[2];if("reportBuilderGetResults"!==h&&"reportBuilderGetDistinctValue"!==h&&"reportBuilderBuildTree"!==h&&"generatePDF"!==h&&"getWOOfflineData"!==h&&"countQuery"!==h&&"countWithQuery"!==h&&"countCollectionWithQuery"!==h&&"find"!==h&&"findOne"!==h&&"findWithOptions"!==h&&"getDrivers"!==h&&"processAirdropDistribution"!==h){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([_]))<2e5?JSON.stringify([_],null,2):"Too Big",method:h,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([_]))<2e5?JSON.stringify([_],null,2):"Too Big",method:h,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(v={messageId:g,hasError:!1,data:"ACK"},p&&p.readyState===p.OPEN&&this._websocketManager.send(p,v),this._isWorkersEnabled&&"find"!==h&&"insertDocument"!==h&&"countWithQuery"!==h&&"findOne"!==h&&"updateDocumentProps"!==h&&"findWithOptions"!==h&&"updateDocument"!==h&&"insertErrorLog"!==h&&"removeDocument"!==h&&"supportCreateBillingUser"!==h&&"getSignedUrl"!==h&&"getSignedUrls"!==h&&"getSignedUrlWithId"!==h&&"incorrectUser"!==h&&"reloadWS"!==h&&"reconnectWS"!==h&&"disconnectWS"!==h)?(this._workerDispatcherManager.sendClientTask(g,h,_,{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,h,_)];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()),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;
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","_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","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\t\t\t\tthis._cronManager = CronManager.create();\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\tif (this._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","_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\t\t\t\tthis._cronManager = CronManager.create();\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}"]}