@resolveio/server-lib 20.5.12 → 20.5.13
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.
- package/collections/log-method-latency.collection.js +1 -1
- package/collections/log-method-latency.collection.js.map +1 -1
- package/collections/log-subscription.collection.js +1 -1
- package/collections/log-subscription.collection.js.map +1 -1
- package/collections/log.collection.js +1 -1
- package/collections/log.collection.js.map +1 -1
- package/managers/local-log.manager.d.ts +0 -1
- package/managers/local-log.manager.js.map +1 -1
- package/managers/method.manager.js +1 -1
- package/managers/method.manager.js.map +1 -1
- package/managers/mongo.manager.js +1 -1
- package/managers/mongo.manager.js.map +1 -1
- package/managers/monitor.manager.js +1 -1
- package/managers/monitor.manager.js.map +1 -1
- package/methods/logs.js +1 -1
- package/methods/logs.js.map +1 -1
- package/models/log-method-latency.model.d.ts +2 -0
- package/models/log-subscription.model.d.ts +2 -0
- package/models/log.model.d.ts +2 -0
- package/package.json +1 -1
- package/server-app.js +1 -1
- package/server-app.js.map +1 -1
package/server-app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server-app.ts"],"names":["http_1","require","express","bodyParser","xmlParser","WebSocket","jwt","moment","common_1","cron_manager_1","method_manager_1","subscription_manager_1","monitor_manager_1","log_collection_1","log_method_latency_collection_1","user_collection_1","home_1","auth_1","health_1","mongodb_1","worker_task_request_collection_1","worker_task_response_collection_1","websocket_manager_1","resolveio_server_app_1","ResolveIOMainServer","this","_offlineUpdates","sesMail","standardProgram","publicProgram","_rebootFlag","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_workerTasks","_safeShutdown","_serverStartTime","Date","_monitorManager","MonitorManager","_monitorManagerFunction","MonitorManagerFunction","prototype","initServerApp","_this","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setInterval","_subscriptionManager","getEnableDebug","console","log","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","setTimeout","_methodManager","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","_a","sent","exit","_serverHTTP","close","safeShutdown","MethodManager","_cronManager","CronManager","startWorkerInstance","_websocketManager","WebSocketManager","startServerInstance","SubscriptionManager","_serverWSS","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","changeStream","WorkerTaskRequests","watchCollection","change","operationType","task_1","fullDocument","processTask","length","find","status","sort","createdAt","pendingTasks","_b","pendingTasks_1","__values","pendingTasks_1_1","done","task","value","includes","_id","updateOne","$set","then","resReq","push","timedOut_1","timeoutHandle","WorkerTaskResponses","create","id_request","has_error","data","id_user","user","id_ws","splice","indexOf","callMethodInternal","call","apply","__spreadArray","Object","assign","method","__read","params","result","clearTimeout","err_1","getActiveMonitorFunctions","setImmediate","getMongoConnection","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","ws","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","port","verifyClient","info","cb","infoData","headers","split","origin","token","verify","err","decoded","Users","findById","fullname","readonly","date","client","getClientName","objectIdHexString","addWebSocket","createLoggedInUser","send","unsubscribeWS","parseErrorFound","socketData","parse","e","readyState","OPEN","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","message_1","processSocketMessage","now","getTime","messageRoute","some","a","roles","groups","views","b","super_admin","messageDate","messageId","type","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","offlineUpdates","i","update","shift","updateMessageId","methodLatencyId","serverResMethod","getLocalLogManager","writeLog","__v","date_start","date_end","latency_ms","LogMethodLatencies","Logs","insertOne","collection","id_document","payload","getBinarySize","route","_methods","_c","err_3","getMongoManager","invalidateQueryCache","map","messageRoute_1","messageDate_1","messageId_1","callMethod","unsubscribeAll","removeAllListeners","getApp","exports"],"mappings":"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","file":"server-app.js","sourcesContent":["import { createServer, Server } from 'http';\nimport * as express from 'express';\nimport * as bodyParser from 'body-parser';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport * as WebSocket from 'ws';\nimport * as jwt from 'jsonwebtoken';\n// import * as SegfaultHandler from 'segfault-handler';\nimport * as moment from 'moment-timezone';\nimport { dateReviver, getBinarySize, objectIdHexString } from './util/common';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\n\nimport { ServerResponseModel } from './models/server-response.model';\nimport { Logs } from './collections/log.collection';\nimport { LogMethodLatencies } from './collections/log-method-latency.collection';\nimport { Users } from './collections/user.collection';\n\nimport { setupHomeRoutes } from './http/home';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { WorkerTaskRequests } from './collections/worker-task-request.collection';\nimport { WorkerTaskResponses } from './collections/worker-task-response.collection';\nimport { WorkerTaskRequestModel } from './models/worker-task-request.model';\nimport { WebSocketManager } from './managers/websocket.manager';\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 _portWSS: number;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\tprivate _workerTasks: string[] = [];\n\n\tprivate _safeShutdown = false;\n\n\tconstructor() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = new MonitorManager();\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\t}\n\n\tinitServerApp() {\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\t// Condition to filter out the MongoError with code 48 (NamespaceExists)\n\t\t\tif (error && error['name'] === 'MongoError' && error['code'] === 48) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\t// if (error && error['name'] === 'MongoServerError') {\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\tthis._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', () => {\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\tthis.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', () => {\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\tthis.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', () => {\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\tthis.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n if (this._isWorkersEnabled) {\n if (this._isWorkerInstance) {\n console.log('Running as a Worker instance');\n\t\t\t\tthis._methodManager = new MethodManager(this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n this._cronManager = new CronManager();\n\t\t\t\tthis.startWorkerInstance();\n }\n\t\t\telse {\n console.log('Running as a Server instance');\n\t\t\t\tthis._websocketManager = new WebSocketManager(this);\n this.startServerInstance();\n\t\t\t\tthis._methodManager = new MethodManager(this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._subscriptionManager = new SubscriptionManager(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.listen();\n }\n }\n\t\telse {\n console.log('Running with Workers Disabled');\n\t\t\tthis._websocketManager = new WebSocketManager(this);\n this.startServerInstance();\n\t\t\tthis._methodManager = new MethodManager(this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = new SubscriptionManager(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n this._cronManager = new CronManager();\n\t\t\tthis.listen();\n }\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\t// Use body parser for http call (login)\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.PORT_HTTP || ResolveIOServer.getServerConfig()['PORT_HTTP'] || 8080;\n\t\tthis._portWSS = process.env.PORT_WSS || ResolveIOServer.getServerConfig()['PORT_WSS'] || 8081;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\n\t\t\t// Website you wish to allow to connect\n\t\t\t// res.setHeader('Access-Control-Allow-Origin', ResolveIOServer.getServerConfig()['ROOT_URL']);\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\n\t\t\t// Request methods you wish to allow\n\t\t\t// res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\n\t\t\t// Request headers you wish to allow\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\n\t\t\t// Set to true if you need the website to include cookies in the requests sent\n\t\t\t// to the API (e.g. in case you use sessions)\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\n\t\t\t// Pass to next layer of middleware\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app, ResolveIOServer.getServerConfig());\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 startWorkerInstance() {\n\t\tconsole.log('Worker instance started, watching worker-task-reqs...');\n\t\t\n\t\tlet changeStream = WorkerTaskRequests.watchCollection([]);\n\t\n\t\tchangeStream.on('change', async (change) => {\n\t\t\tif (change.operationType === 'insert') {\n\t\t\t\tconst task = change.fullDocument;\n\t\t\t\tif (task) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.processTask(task);\n\t\t\t\t\t}, this._workerTasks.length * 25);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\n\t\tchangeStream.on('error', (error) => {\n\t\t\tconsole.error('Error in change stream worker task requests:', error);\n\t\t\tif (changeStream) {\n\t\t\t\tchangeStream.close();\n\t\t\t}\n\t\t});\n\t\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log('Change stream worker task requests closed. Restarting...');\n\t\t\tsetTimeout(() => this.startWorkerInstance(), 5000);\n\t\t});\n\t\n\t\t// Process existing pending tasks\n\t\tconst pendingTasks = await WorkerTaskRequests.find({ status: 'pending' }, { sort: { createdAt: 1 } });\n\t\tfor (const task of pendingTasks) {\n\t\t\tthis.processTask(task);\n\t\t}\n\t}\n\t\n\tprivate async processTask(task: WorkerTaskRequestModel) {\n\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tWorkerTaskRequests.updateOne(\n\t\t\t{ _id: task._id, status: 'pending' },\n\t\t\t{ $set: { status: 'processing' } }\n\t\t).then(async resReq => {\n\t\t\tif (resReq) {\n\t\t\t\tthis._workerTasks.push(task._id);\n\t\n\t\t\t\tlet timedOut = false;\n\t\t\t\tlet timeoutHandle = setTimeout(() => {\n\t\t\t\t\ttimedOut = true;\n\t\t\t\t\tconsole.error('Worker timed out processing task:', task._id);\n\t\n\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\thas_error: true,\n\t\t\t\t\t\tdata: 'Task timed out.',\n\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t});\n\t\n\t\t\t\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\t\t\t\tthis._workerTasks.splice(this._workerTasks.indexOf(task._id), 1);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tWorkerTaskRequests.updateOne(\n\t\t\t\t\t\t{ _id: task._id },\n\t\t\t\t\t\t{ $set: { status: 'timeout' } }\n\t\t\t\t\t);\n\t\t\t\t}, 120000);\n\t\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await this._methodManager.callMethodInternal.call(\n\t\t\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttask.method,\n\t\t\t\t\t\t...task.params\n\t\t\t\t\t);\n\t\n\t\t\t\t\tif (!timedOut) {\n\t\t\t\t\t\tclearTimeout(timeoutHandle);\n\t\n\t\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\t\thas_error: false,\n\t\t\t\t\t\t\tdata: result,\n\t\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\t\t\t\t\tthis._workerTasks.splice(this._workerTasks.indexOf(task._id), 1);\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tWorkerTaskRequests.updateOne(\n\t\t\t\t\t\t\t{ _id: task._id },\n\t\t\t\t\t\t\t{ $set: { status: 'complete' } }\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tif (!timedOut) {\n\t\t\t\t\t\tclearTimeout(timeoutHandle);\n\t\n\t\t\t\t\t\tconsole.error('Worker failed to process task:', task._id, err);\n\t\n\t\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\t\thas_error: true,\n\t\t\t\t\t\t\tdata: err.message,\n\t\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\t\t\t\t\tthis._workerTasks.splice(this._workerTasks.indexOf(task._id), 1);\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tWorkerTaskRequests.updateOne(\n\t\t\t\t\t\t\t{ _id: task._id },\n\t\t\t\t\t\t\t{ $set: { status: 'complete' } }\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\tprivate safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length && \n\t\t\t// (!this._monitorManagerFunction.getLastCompletedMonitorFunction() ||\n\t\t\t// Date.now() >= this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime.getTime() + 1500) &&\n\t\t\t!this._offlineUpdates.length\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\tResolveIOServer.getMongoConnection().close(false).then(() => {\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}, () => {process.exit(1)});\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(), \n\t\t\t\t\t'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length, \n\t\t\t\t\t// this._monitorManagerFunction.getLastCompletedMonitorFunction() ? this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime : '',\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(() => {\n\t\t\t\tthis.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\t// Start express server\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000; // This should be bigger than `keepAliveTimeout + your server's expected response time`\n\n\t\t// Start websocket server\n\t\t// Verify client with token before opening socket\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tport: this._portWSS,\n\t\t\tverifyClient: this.publicProgram ? null : async (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (info.origin !== ResolveIOServer.getServerConfig()['ROOT_URL'] && info.origin !== ResolveIOServer.getServerConfig()['SEC_ROOT_URL'] && info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_URL'] && info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_SECONDARY_URL']) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, 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 (err) {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// Listen to port for websocket\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('listening', () => {\n\t\t\tconsole.log('Running server on port %s', this._portWSS);\n\t\t});\n\n\t\t// On websocket connection (already verified)\n\t\tthis._serverWSS.on('connection', (ws, req) => {\n\t\t\tif (!this.publicProgram) {\n\t\t\t\t// Get user from token\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tif (ws['user'] !== 'Admin' && ResolveIOServer.getServerConfig()['CLIENT_NAME'] !== 'ResolveIO') {\n\t\t\t\t\tthis.getMethodManager().callMethodInternal.call(this.getMethodManager(), 'supportCreateBillingUser', {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tdate: new Date(),\n\t\t\t\t\t\tclient: ResolveIOServer.getClientName()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\tws['retryCnt'] = 0;\n\n\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\tthis._subscriptionManager.createLoggedInUser(ws['id_socket']).then(() => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, 5000);\n\t\t\t});\n\n\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\tconsole.log('Connection from: ' + req['user']);\n\t\t\t}\n\t\t\t\n\t\t\t// Use for keeping connection alive (ping/pong)\n\t\t\tws['isAlive'] = true;\n\t\t\tws.on('message', async (message: string) => {\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Message from: ' + ws['user'], message);\n\t\t\t\t}\n\n\t\t\t\tthis._debugMsgRecv += 1;\n\n\t\t\t\tlet parseErrorFound = false;\n\n\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\n\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - JSON Parse Error - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([message, e]));\n\n\t\t\t\t\tparseErrorFound = true;\n\t\t\t\t}\n\n\t\t\t\tif (!parseErrorFound) {\n\t\t\t\t\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tws.send('pong', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Pong');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\t\t\t\tws['isAlive'] = true;\n\t\t\t\t\t\tws['pongTime'] = new Date();\n\t\t\t\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\t\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!Array.isArray(socketData[0])) {\n\t\t\t\t\t\t// Not an array, invalid message\n\t\t\t\t\t\tconsole.log('Invalid message format, expected array:', socketData);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (let message of socketData) {\n\t\t\t\t\t\t\tawait this.processSocketMessage(ws, message);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('end', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'WS End');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('close', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'WS Close');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('error', error => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), ws['user'], ws['id_socket'], 'WS Error');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t});\n\n\t\t// Keep alive timer to ping/pong\n\t\tsetInterval(() => {\n\t\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\t\tif (ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= 20000) {\n\t\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\t\tws['retryCnt']++;\n\n\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 20000);\n\t}\n\n\tprivate async processSocketMessage(ws: WebSocket, socketData: any[]) {\n\t\tlet messageRoute = socketData[0];\n\n\t\tif (!this.publicProgram && this._clientRoutes.some(a => messageRoute.includes(a)) && !ws['doc_user'].roles.groups.some(a => a.views.some(b => messageRoute.includes(b) || b.includes(messageRoute))) && !ws['doc_user'].roles.super_admin) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet messageDate = socketData[1];\n\t\tlet messageId = socketData[2];\n\t\tlet type = socketData[3];\n\n\t\tif (type === 'subscription') {\n\t\t\tlet subType = socketData[4];\n\t\t\tlet pub = socketData[5];\n\n\t\t\t// Subscribe\n\t\t\tif (subType === 'sub') {\n\t\t\t\tthis._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));\n\t\t\t}\n\t\t\t// Unsubscribe\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));\n\t\t\t}\n\t\t}\n\t\telse if (!this.publicProgram && type === 'offline') {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: 'ACK'\n\t\t\t};\n\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = socketData[4];\n\n\t\t\tfor (let i = 0; i < offlineUpdates.length; i++) {\n\t\t\t\tlet update = offlineUpdates[i];\n\n\t\t\t\tlet data = update.data;\n\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\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\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t) {\n\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\ttype: 'log-method-latency',\n\t\t\t\t\t\tdate: new Date(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\t\tmethod: method\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\tmethod: method\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethodInternal.call(Object.assign({}, this._methodManager, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), method, ...data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Offline Error', JSON.stringify(err, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(data[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Offline - Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.splice(this._offlineUpdates.map(a => a['id_socket']).indexOf(ws['id_socket']), 1);\n\t\t}\n\t\telse { //methods\n\t\t\tlet data = [...socketData];\n\t\t\t\n\t\t\tlet messageRoute: string = data.shift();\n\t\t\tlet messageDate: Date = data.shift();\n\t\t\tlet messageId: number = data.shift();\n\t\t\tlet type: string = data.shift();\n\n\t\t\tif (type === 'method') {\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t) {\n\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\ttype: 'log-method-latency',\n\t\t\t\t\t\tdate: new Date(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\t\tmethod: method\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\tmethod: method\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\tthis._methodManager.callMethod(methodLatencyId, ws, messageDate, messageId, method, ...data);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// else if (type === 'methodResponse') {\n\t\t\t// \tlet method = data.shift();\n\n\t\t\t// \tMethodResponses.findOne({ $and: [{ id_user: ws['id_user'] }, { message_id: messageId }, { method: method }, { date: messageDate }] }).then(\n\t\t\t// \t\tres => {\n\t\t\t// \t\t\tif (res) {\n\t\t\t// \t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t// \t\t\t\t\tthis._websocketManager.send(ws, res.response);\n\t\t\t// \t\t\t\t}\n\t\t\t// \t\t\t}\n\t\t\t// \t\t},\n\t\t\t// \t\terr => {}\n\t\t\t// \t);\n\t\t\t// }\n\t\t}\n\t}\n\n\tpublic unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tthis._subscriptionManager.unsubscribeAll(ws);\n\t\tws.removeAllListeners();\n\t\tws = null;\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n\n\tpublic getServerConfig() {\n\t\treturn ResolveIOServer.getServerConfig();\n\t}\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server-app.ts"],"names":["http_1","require","express","bodyParser","xmlParser","WebSocket","jwt","moment","common_1","cron_manager_1","method_manager_1","subscription_manager_1","monitor_manager_1","log_collection_1","log_method_latency_collection_1","user_collection_1","home_1","auth_1","health_1","mongodb_1","worker_task_request_collection_1","worker_task_response_collection_1","websocket_manager_1","resolveio_server_app_1","ResolveIOMainServer","this","_offlineUpdates","sesMail","standardProgram","publicProgram","_rebootFlag","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_workerTasks","_safeShutdown","_serverStartTime","Date","_monitorManager","MonitorManager","_monitorManagerFunction","MonitorManagerFunction","prototype","initServerApp","_this","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setInterval","_subscriptionManager","getEnableDebug","console","log","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","setTimeout","_methodManager","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","_a","sent","exit","_serverHTTP","close","safeShutdown","MethodManager","_cronManager","CronManager","startWorkerInstance","_websocketManager","WebSocketManager","startServerInstance","SubscriptionManager","_serverWSS","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","changeStream","WorkerTaskRequests","watchCollection","change","operationType","task_1","fullDocument","processTask","length","find","status","sort","createdAt","pendingTasks","_b","pendingTasks_1","__values","pendingTasks_1_1","done","task","value","includes","_id","updateOne","$set","then","resReq","push","timedOut_1","timeoutHandle","WorkerTaskResponses","create","id_request","has_error","data","id_user","user","id_ws","splice","indexOf","callMethodInternal","call","apply","__spreadArray","Object","assign","method","__read","params","result","clearTimeout","err_1","getActiveMonitorFunctions","setImmediate","getMongoConnection","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","ws","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","port","verifyClient","info","cb","infoData","headers","split","origin","token","verify","err","decoded","Users","findById","fullname","readonly","date","client","getClientName","objectIdHexString","addWebSocket","createLoggedInUser","send","unsubscribeWS","parseErrorFound","socketData","parse","e","readyState","OPEN","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","message_1","processSocketMessage","now","getTime","messageRoute","some","a","roles","groups","views","b","super_admin","messageDate","messageId","type","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","offlineUpdates","i","update","shift","updateMessageId","methodLatencyId","serverResMethod","getLocalLogManager","writeLog","__v","date_start","date_end","latency_ms","LogMethodLatencies","instance","collection","id_document","payload","getBinarySize","route","Logs","insertOne","_methods","_c","err_3","getMongoManager","invalidateQueryCache","map","messageRoute_1","messageDate_1","messageId_1","callMethod","unsubscribeAll","removeAllListeners","getApp","exports"],"mappings":"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","file":"server-app.js","sourcesContent":["import { createServer, Server } from 'http';\nimport * as express from 'express';\nimport * as bodyParser from 'body-parser';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport * as WebSocket from 'ws';\nimport * as jwt from 'jsonwebtoken';\n// import * as SegfaultHandler from 'segfault-handler';\nimport * as moment from 'moment-timezone';\nimport { dateReviver, getBinarySize, objectIdHexString } from './util/common';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\n\nimport { ServerResponseModel } from './models/server-response.model';\nimport { Logs } from './collections/log.collection';\nimport { LogMethodLatencies } from './collections/log-method-latency.collection';\nimport { Users } from './collections/user.collection';\n\nimport { setupHomeRoutes } from './http/home';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { WorkerTaskRequests } from './collections/worker-task-request.collection';\nimport { WorkerTaskResponses } from './collections/worker-task-response.collection';\nimport { WorkerTaskRequestModel } from './models/worker-task-request.model';\nimport { WebSocketManager } from './managers/websocket.manager';\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 _portWSS: number;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\tprivate _workerTasks: string[] = [];\n\n\tprivate _safeShutdown = false;\n\n\tconstructor() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = new MonitorManager();\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\t}\n\n\tinitServerApp() {\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\t// Condition to filter out the MongoError with code 48 (NamespaceExists)\n\t\t\tif (error && error['name'] === 'MongoError' && error['code'] === 48) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\t// if (error && error['name'] === 'MongoServerError') {\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\tthis._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', () => {\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\tthis.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', () => {\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\tthis.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', () => {\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\tthis.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n if (this._isWorkersEnabled) {\n if (this._isWorkerInstance) {\n console.log('Running as a Worker instance');\n\t\t\t\tthis._methodManager = new MethodManager(this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n this._cronManager = new CronManager();\n\t\t\t\tthis.startWorkerInstance();\n }\n\t\t\telse {\n console.log('Running as a Server instance');\n\t\t\t\tthis._websocketManager = new WebSocketManager(this);\n this.startServerInstance();\n\t\t\t\tthis._methodManager = new MethodManager(this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._subscriptionManager = new SubscriptionManager(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.listen();\n }\n }\n\t\telse {\n console.log('Running with Workers Disabled');\n\t\t\tthis._websocketManager = new WebSocketManager(this);\n this.startServerInstance();\n\t\t\tthis._methodManager = new MethodManager(this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = new SubscriptionManager(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n this._cronManager = new CronManager();\n\t\t\tthis.listen();\n }\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\t// Use body parser for http call (login)\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.PORT_HTTP || ResolveIOServer.getServerConfig()['PORT_HTTP'] || 8080;\n\t\tthis._portWSS = process.env.PORT_WSS || ResolveIOServer.getServerConfig()['PORT_WSS'] || 8081;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\n\t\t\t// Website you wish to allow to connect\n\t\t\t// res.setHeader('Access-Control-Allow-Origin', ResolveIOServer.getServerConfig()['ROOT_URL']);\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\n\t\t\t// Request methods you wish to allow\n\t\t\t// res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\n\t\t\t// Request headers you wish to allow\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\n\t\t\t// Set to true if you need the website to include cookies in the requests sent\n\t\t\t// to the API (e.g. in case you use sessions)\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\n\t\t\t// Pass to next layer of middleware\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app, ResolveIOServer.getServerConfig());\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 startWorkerInstance() {\n\t\tconsole.log('Worker instance started, watching worker-task-reqs...');\n\t\t\n\t\tlet changeStream = WorkerTaskRequests.watchCollection([]);\n\t\n\t\tchangeStream.on('change', async (change) => {\n\t\t\tif (change.operationType === 'insert') {\n\t\t\t\tconst task = change.fullDocument;\n\t\t\t\tif (task) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.processTask(task);\n\t\t\t\t\t}, this._workerTasks.length * 25);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\n\t\tchangeStream.on('error', (error) => {\n\t\t\tconsole.error('Error in change stream worker task requests:', error);\n\t\t\tif (changeStream) {\n\t\t\t\tchangeStream.close();\n\t\t\t}\n\t\t});\n\t\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log('Change stream worker task requests closed. Restarting...');\n\t\t\tsetTimeout(() => this.startWorkerInstance(), 5000);\n\t\t});\n\t\n\t\t// Process existing pending tasks\n\t\tconst pendingTasks = await WorkerTaskRequests.find({ status: 'pending' }, { sort: { createdAt: 1 } });\n\t\tfor (const task of pendingTasks) {\n\t\t\tthis.processTask(task);\n\t\t}\n\t}\n\t\n\tprivate async processTask(task: WorkerTaskRequestModel) {\n\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tWorkerTaskRequests.updateOne(\n\t\t\t{ _id: task._id, status: 'pending' },\n\t\t\t{ $set: { status: 'processing' } }\n\t\t).then(async resReq => {\n\t\t\tif (resReq) {\n\t\t\t\tthis._workerTasks.push(task._id);\n\t\n\t\t\t\tlet timedOut = false;\n\t\t\t\tlet timeoutHandle = setTimeout(() => {\n\t\t\t\t\ttimedOut = true;\n\t\t\t\t\tconsole.error('Worker timed out processing task:', task._id);\n\t\n\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\thas_error: true,\n\t\t\t\t\t\tdata: 'Task timed out.',\n\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t});\n\t\n\t\t\t\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\t\t\t\tthis._workerTasks.splice(this._workerTasks.indexOf(task._id), 1);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tWorkerTaskRequests.updateOne(\n\t\t\t\t\t\t{ _id: task._id },\n\t\t\t\t\t\t{ $set: { status: 'timeout' } }\n\t\t\t\t\t);\n\t\t\t\t}, 120000);\n\t\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await this._methodManager.callMethodInternal.call(\n\t\t\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttask.method,\n\t\t\t\t\t\t...task.params\n\t\t\t\t\t);\n\t\n\t\t\t\t\tif (!timedOut) {\n\t\t\t\t\t\tclearTimeout(timeoutHandle);\n\t\n\t\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\t\thas_error: false,\n\t\t\t\t\t\t\tdata: result,\n\t\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\t\t\t\t\tthis._workerTasks.splice(this._workerTasks.indexOf(task._id), 1);\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tWorkerTaskRequests.updateOne(\n\t\t\t\t\t\t\t{ _id: task._id },\n\t\t\t\t\t\t\t{ $set: { status: 'complete' } }\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tif (!timedOut) {\n\t\t\t\t\t\tclearTimeout(timeoutHandle);\n\t\n\t\t\t\t\t\tconsole.error('Worker failed to process task:', task._id, err);\n\t\n\t\t\t\t\t\tWorkerTaskResponses.create({\n\t\t\t\t\t\t\tid_request: task._id,\n\t\t\t\t\t\t\thas_error: true,\n\t\t\t\t\t\t\tdata: err.message,\n\t\t\t\t\t\t\tid_user: task.id_user,\n\t\t\t\t\t\t\tuser: task.user,\n\t\t\t\t\t\t\tid_ws: task.id_ws\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\tif (this._workerTasks.includes(task._id)) {\n\t\t\t\t\t\t\tthis._workerTasks.splice(this._workerTasks.indexOf(task._id), 1);\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tWorkerTaskRequests.updateOne(\n\t\t\t\t\t\t\t{ _id: task._id },\n\t\t\t\t\t\t\t{ $set: { status: 'complete' } }\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\tprivate safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length && \n\t\t\t// (!this._monitorManagerFunction.getLastCompletedMonitorFunction() ||\n\t\t\t// Date.now() >= this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime.getTime() + 1500) &&\n\t\t\t!this._offlineUpdates.length\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\tResolveIOServer.getMongoConnection().close(false).then(() => {\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}, () => {process.exit(1)});\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(), \n\t\t\t\t\t'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length, \n\t\t\t\t\t// this._monitorManagerFunction.getLastCompletedMonitorFunction() ? this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime : '',\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(() => {\n\t\t\t\tthis.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\t// Start express server\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000; // This should be bigger than `keepAliveTimeout + your server's expected response time`\n\n\t\t// Start websocket server\n\t\t// Verify client with token before opening socket\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tport: this._portWSS,\n\t\t\tverifyClient: this.publicProgram ? null : async (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (info.origin !== ResolveIOServer.getServerConfig()['ROOT_URL'] && info.origin !== ResolveIOServer.getServerConfig()['SEC_ROOT_URL'] && info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_URL'] && info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_SECONDARY_URL']) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, 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 (err) {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// Listen to port for websocket\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('listening', () => {\n\t\t\tconsole.log('Running server on port %s', this._portWSS);\n\t\t});\n\n\t\t// On websocket connection (already verified)\n\t\tthis._serverWSS.on('connection', (ws, req) => {\n\t\t\tif (!this.publicProgram) {\n\t\t\t\t// Get user from token\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tif (ws['user'] !== 'Admin' && ResolveIOServer.getServerConfig()['CLIENT_NAME'] !== 'ResolveIO') {\n\t\t\t\t\tthis.getMethodManager().callMethodInternal.call(this.getMethodManager(), 'supportCreateBillingUser', {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tdate: new Date(),\n\t\t\t\t\t\tclient: ResolveIOServer.getClientName()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\tws['retryCnt'] = 0;\n\n\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\tthis._subscriptionManager.createLoggedInUser(ws['id_socket']).then(() => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, 5000);\n\t\t\t});\n\n\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\tconsole.log('Connection from: ' + req['user']);\n\t\t\t}\n\t\t\t\n\t\t\t// Use for keeping connection alive (ping/pong)\n\t\t\tws['isAlive'] = true;\n\t\t\tws.on('message', async (message: string) => {\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Message from: ' + ws['user'], message);\n\t\t\t\t}\n\n\t\t\t\tthis._debugMsgRecv += 1;\n\n\t\t\t\tlet parseErrorFound = false;\n\n\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\n\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - JSON Parse Error - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([message, e]));\n\n\t\t\t\t\tparseErrorFound = true;\n\t\t\t\t}\n\n\t\t\t\tif (!parseErrorFound) {\n\t\t\t\t\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tws.send('pong', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Pong');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\t\t\t\tws['isAlive'] = true;\n\t\t\t\t\t\tws['pongTime'] = new Date();\n\t\t\t\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\t\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!Array.isArray(socketData[0])) {\n\t\t\t\t\t\t// Not an array, invalid message\n\t\t\t\t\t\tconsole.log('Invalid message format, expected array:', socketData);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (let message of socketData) {\n\t\t\t\t\t\t\tawait this.processSocketMessage(ws, message);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('end', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'WS End');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('close', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'WS Close');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('error', error => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), ws['user'], ws['id_socket'], 'WS Error');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t});\n\n\t\t// Keep alive timer to ping/pong\n\t\tsetInterval(() => {\n\t\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\t\tif (ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= 20000) {\n\t\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\t\tws['retryCnt']++;\n\n\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tws.send('ping', (error) => {\n\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 20000);\n\t}\n\n\tprivate async processSocketMessage(ws: WebSocket, socketData: any[]) {\n\t\tlet messageRoute = socketData[0];\n\n\t\tif (!this.publicProgram && this._clientRoutes.some(a => messageRoute.includes(a)) && !ws['doc_user'].roles.groups.some(a => a.views.some(b => messageRoute.includes(b) || b.includes(messageRoute))) && !ws['doc_user'].roles.super_admin) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet messageDate = socketData[1];\n\t\tlet messageId = socketData[2];\n\t\tlet type = socketData[3];\n\n\t\tif (type === 'subscription') {\n\t\t\tlet subType = socketData[4];\n\t\t\tlet pub = socketData[5];\n\n\t\t\t// Subscribe\n\t\t\tif (subType === 'sub') {\n\t\t\t\tthis._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));\n\t\t\t}\n\t\t\t// Unsubscribe\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));\n\t\t\t}\n\t\t}\n\t\telse if (!this.publicProgram && type === 'offline') {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: 'ACK'\n\t\t\t};\n\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = socketData[4];\n\n\t\t\tfor (let i = 0; i < offlineUpdates.length; i++) {\n\t\t\t\tlet update = offlineUpdates[i];\n\n\t\t\t\tlet data = update.data;\n\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\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\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t) {\n\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\ttype: 'log-method-latency',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\tinstance: 'backend.resolveio.com'\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\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\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\tLogs.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});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethodInternal.call(Object.assign({}, this._methodManager, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), method, ...data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Offline Error', JSON.stringify(err, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(data[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Offline - Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.splice(this._offlineUpdates.map(a => a['id_socket']).indexOf(ws['id_socket']), 1);\n\t\t}\n\t\telse { //methods\n\t\t\tlet data = [...socketData];\n\t\t\t\n\t\t\tlet messageRoute: string = data.shift();\n\t\t\tlet messageDate: Date = data.shift();\n\t\t\tlet messageId: number = data.shift();\n\t\t\tlet type: string = data.shift();\n\n\t\t\tif (type === 'method') {\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t) {\n\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\ttype: 'log-method-latency',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\t\tmethod: method\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\tinstance: 'backend.resolveio.com'\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\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\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\tLogs.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});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\tthis._methodManager.callMethod(methodLatencyId, ws, messageDate, messageId, method, ...data);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// else if (type === 'methodResponse') {\n\t\t\t// \tlet method = data.shift();\n\n\t\t\t// \tMethodResponses.findOne({ $and: [{ id_user: ws['id_user'] }, { message_id: messageId }, { method: method }, { date: messageDate }] }).then(\n\t\t\t// \t\tres => {\n\t\t\t// \t\t\tif (res) {\n\t\t\t// \t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t// \t\t\t\t\tthis._websocketManager.send(ws, res.response);\n\t\t\t// \t\t\t\t}\n\t\t\t// \t\t\t}\n\t\t\t// \t\t},\n\t\t\t// \t\terr => {}\n\t\t\t// \t);\n\t\t\t// }\n\t\t}\n\t}\n\n\tpublic unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tthis._subscriptionManager.unsubscribeAll(ws);\n\t\tws.removeAllListeners();\n\t\tws = null;\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n\n\tpublic getServerConfig() {\n\t\treturn ResolveIOServer.getServerConfig();\n\t}\n}"]}
|