@resolveio/server-lib 20.7.30 → 20.7.31
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/methods/pdf.js +1 -1
- package/methods/pdf.js.map +1 -1
- package/methods/report-builder.js +1 -1
- package/methods/report-builder.js.map +1 -1
- 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":["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","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","_methodManager","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","exit","_serverHTTP","close","safeShutdown","MethodManager","_workerServerManager","WorkerServerManager","_cronManager","CronManager","_websocketManager","WebSocketManager","_workerDispatcherManager","WorkerDispatcherManager","SubscriptionManager","_serverWSS","startServerInstance","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","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","port","verifyClient","info","cb","token","url","includes","split","infoData","headers","origin","verify","err","decoded","Users","findById","user","fullname","readonly","workerId_1","objectIdHexString","NODE_APP_INSTANCE","addWorker","lastComm_1","interval_1","sendWorkerPayload","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","addClientTask","callMethodLocally","params","result","err_2","unsubscribeAll","removeAllListeners","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 _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\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.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\tif (error && error['name'] === 'MongoServerError' && !initServerFlag) {\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');\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');\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');\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.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\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.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\tport: this._portWSS,\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 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\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', ws.url);\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\tws.on('open', () => {\n\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\n\t\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\t\tws.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 30000);\n\t\t\t\t});\n\n\t\t\t\tconsole.log(new Date(), 'Worker connected:', workerId);\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') {\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.addClientTask(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","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","_methodManager","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","exit","_serverHTTP","close","safeShutdown","MethodManager","_workerServerManager","WorkerServerManager","_cronManager","CronManager","_websocketManager","WebSocketManager","_workerDispatcherManager","WorkerDispatcherManager","SubscriptionManager","_serverWSS","startServerInstance","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","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","port","verifyClient","info","cb","token","url","includes","split","infoData","headers","origin","verify","err","decoded","Users","findById","user","fullname","readonly","workerId_1","objectIdHexString","NODE_APP_INSTANCE","addWorker","lastComm_1","interval_1","sendWorkerPayload","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","addClientTask","callMethodLocally","params","result","err_2","unsubscribeAll","removeAllListeners","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 _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\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.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\tif (error && error['name'] === 'MongoServerError' && !initServerFlag) {\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');\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');\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');\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.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\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.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\tport: this._portWSS,\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 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\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', ws.url);\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\tws.on('open', () => {\n\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\n\t\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\t\tws.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 30000);\n\t\t\t\t});\n\n\t\t\t\tconsole.log(new Date(), 'Worker connected:', workerId);\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.addClientTask(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}"]}
|