@resolveio/server-lib 20.7.119 → 20.7.121

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.
Files changed (216) hide show
  1. package/client-server-app.js +51 -1
  2. package/client-server-app.js.map +1 -1
  3. package/collections/app-status.collection.js +51 -1
  4. package/collections/app-status.collection.js.map +1 -1
  5. package/collections/counter.collection.js +55 -1
  6. package/collections/counter.collection.js.map +1 -1
  7. package/collections/cron-job-history.collection.js +136 -1
  8. package/collections/cron-job-history.collection.js.map +1 -1
  9. package/collections/cron-job.collection.js +87 -1
  10. package/collections/cron-job.collection.js.map +1 -1
  11. package/collections/email-history.collection.js +98 -1
  12. package/collections/email-history.collection.js.map +1 -1
  13. package/collections/email-verified.collection.js +60 -1
  14. package/collections/email-verified.collection.js.map +1 -1
  15. package/collections/file.collection.js +73 -1
  16. package/collections/file.collection.js.map +1 -1
  17. package/collections/flag-update.collection.js +56 -1
  18. package/collections/flag-update.collection.js.map +1 -1
  19. package/collections/flag.collection.js +56 -1
  20. package/collections/flag.collection.js.map +1 -1
  21. package/collections/log-method-latency.collection.js +72 -1
  22. package/collections/log-method-latency.collection.js.map +1 -1
  23. package/collections/log-subscription.collection.js +75 -1
  24. package/collections/log-subscription.collection.js.map +1 -1
  25. package/collections/log.collection.js +87 -1
  26. package/collections/log.collection.js.map +1 -1
  27. package/collections/logged-in-users.collection.js +66 -1
  28. package/collections/logged-in-users.collection.js.map +1 -1
  29. package/collections/monitor-cpu.collection.js +64 -1
  30. package/collections/monitor-cpu.collection.js.map +1 -1
  31. package/collections/monitor-function.collection.js +73 -1
  32. package/collections/monitor-function.collection.js.map +1 -1
  33. package/collections/monitor-memory.collection.js +76 -1
  34. package/collections/monitor-memory.collection.js.map +1 -1
  35. package/collections/monitor-mongo.collection.js +70 -1
  36. package/collections/monitor-mongo.collection.js.map +1 -1
  37. package/collections/notification.collection.js +56 -1
  38. package/collections/notification.collection.js.map +1 -1
  39. package/collections/report-builder-dashboard-builder.collection.js +108 -1
  40. package/collections/report-builder-dashboard-builder.collection.js.map +1 -1
  41. package/collections/report-builder-library.collection.js +86 -1
  42. package/collections/report-builder-library.collection.js.map +1 -1
  43. package/collections/report-builder-report.collection.js +148 -1
  44. package/collections/report-builder-report.collection.js.map +1 -1
  45. package/collections/user-group.collection.js +88 -1
  46. package/collections/user-group.collection.js.map +1 -1
  47. package/collections/user-guide.collection.js +56 -1
  48. package/collections/user-guide.collection.js.map +1 -1
  49. package/collections/user.collection.js +265 -1
  50. package/collections/user.collection.js.map +1 -1
  51. package/cron/cron.js +97 -1
  52. package/cron/cron.js.map +1 -1
  53. package/fixtures/cron-jobs.js +95 -1
  54. package/fixtures/cron-jobs.js.map +1 -1
  55. package/fixtures/init.js +78 -1
  56. package/fixtures/init.js.map +1 -1
  57. package/http/auth.js +869 -1
  58. package/http/auth.js.map +1 -1
  59. package/http/health.js +11 -1
  60. package/http/health.js.map +1 -1
  61. package/http/home.js +114 -1
  62. package/http/home.js.map +1 -1
  63. package/index.js +18 -1
  64. package/index.js.map +1 -1
  65. package/managers/cron.manager.js +461 -1
  66. package/managers/cron.manager.js.map +1 -1
  67. package/managers/local-log.manager.js +79 -1
  68. package/managers/local-log.manager.js.map +1 -1
  69. package/managers/method.manager.js +1023 -1
  70. package/managers/method.manager.js.map +1 -1
  71. package/managers/mongo.manager.js +4223 -1
  72. package/managers/mongo.manager.js.map +1 -1
  73. package/managers/monitor.manager.js +534 -1
  74. package/managers/monitor.manager.js.map +1 -1
  75. package/managers/subscription.manager.js +1292 -1
  76. package/managers/subscription.manager.js.map +1 -1
  77. package/managers/websocket.manager.js +165 -1
  78. package/managers/websocket.manager.js.map +1 -1
  79. package/managers/worker-dispatcher.manager.js +335 -1
  80. package/managers/worker-dispatcher.manager.js.map +1 -1
  81. package/managers/worker-server.manager.js +292 -1
  82. package/managers/worker-server.manager.js.map +1 -1
  83. package/methods/accounts.js +302 -1
  84. package/methods/accounts.js.map +1 -1
  85. package/methods/aws.js +748 -1
  86. package/methods/aws.js.map +1 -1
  87. package/methods/collections.js +542 -1
  88. package/methods/collections.js.map +1 -1
  89. package/methods/counters.js +111 -1
  90. package/methods/counters.js.map +1 -1
  91. package/methods/cron-jobs.js +1476 -1
  92. package/methods/cron-jobs.js.map +1 -1
  93. package/methods/flag-updates.js +8 -1
  94. package/methods/flag-updates.js.map +1 -1
  95. package/methods/flags.js +8 -1
  96. package/methods/flags.js.map +1 -1
  97. package/methods/logs.js +417 -1
  98. package/methods/logs.js.map +1 -1
  99. package/methods/monitor.js +543 -1
  100. package/methods/monitor.js.map +1 -1
  101. package/methods/pdf.js +742 -1
  102. package/methods/pdf.js.map +1 -1
  103. package/methods/report-builder.js +840 -1
  104. package/methods/report-builder.js.map +1 -1
  105. package/methods/support.js +232 -1
  106. package/methods/support.js.map +1 -1
  107. package/models/app-status.model.js +3 -1
  108. package/models/app-status.model.js.map +1 -1
  109. package/models/billing-logged-in-users.model.js +3 -1
  110. package/models/billing-logged-in-users.model.js.map +1 -1
  111. package/models/collection-document.model.js +3 -1
  112. package/models/collection-document.model.js.map +1 -1
  113. package/models/counter.model.js +3 -1
  114. package/models/counter.model.js.map +1 -1
  115. package/models/cron-job-history.model.js +3 -1
  116. package/models/cron-job-history.model.js.map +1 -1
  117. package/models/cron-job.model.js +3 -1
  118. package/models/cron-job.model.js.map +1 -1
  119. package/models/dialog.model.js +3 -1
  120. package/models/dialog.model.js.map +1 -1
  121. package/models/email-history.model.js +15 -1
  122. package/models/email-history.model.js.map +1 -1
  123. package/models/email-verified.model.js +3 -1
  124. package/models/email-verified.model.js.map +1 -1
  125. package/models/file.model.js +3 -1
  126. package/models/file.model.js.map +1 -1
  127. package/models/flag-update.model.js +3 -1
  128. package/models/flag-update.model.js.map +1 -1
  129. package/models/flag.model.js +3 -1
  130. package/models/flag.model.js.map +1 -1
  131. package/models/log-method-latency.model.js +3 -1
  132. package/models/log-method-latency.model.js.map +1 -1
  133. package/models/log-subscription.model.js +3 -1
  134. package/models/log-subscription.model.js.map +1 -1
  135. package/models/log.model.js +3 -1
  136. package/models/log.model.js.map +1 -1
  137. package/models/logged-in-users.model.js +3 -1
  138. package/models/logged-in-users.model.js.map +1 -1
  139. package/models/method-response.model.js +3 -1
  140. package/models/method-response.model.js.map +1 -1
  141. package/models/method.model.d.ts +0 -1
  142. package/models/method.model.js +3 -1
  143. package/models/method.model.js.map +1 -1
  144. package/models/monitor-cpu.model.js +3 -1
  145. package/models/monitor-cpu.model.js.map +1 -1
  146. package/models/monitor-function.model.js +3 -1
  147. package/models/monitor-function.model.js.map +1 -1
  148. package/models/monitor-memory.model.js +3 -1
  149. package/models/monitor-memory.model.js.map +1 -1
  150. package/models/monitor-mongo.model.js +3 -1
  151. package/models/monitor-mongo.model.js.map +1 -1
  152. package/models/notification.model.js +3 -1
  153. package/models/notification.model.js.map +1 -1
  154. package/models/pagination.model.js +23 -1
  155. package/models/pagination.model.js.map +1 -1
  156. package/models/permission.model.js +3 -1
  157. package/models/permission.model.js.map +1 -1
  158. package/models/report-builder-dashboard-builder.model.js +3 -1
  159. package/models/report-builder-dashboard-builder.model.js.map +1 -1
  160. package/models/report-builder-library.model.js +3 -1
  161. package/models/report-builder-library.model.js.map +1 -1
  162. package/models/report-builder-report.model.js +3 -1
  163. package/models/report-builder-report.model.js.map +1 -1
  164. package/models/report-builder.model.js +3 -1
  165. package/models/report-builder.model.js.map +1 -1
  166. package/models/select-data-label.model.js +3 -1
  167. package/models/select-data-label.model.js.map +1 -1
  168. package/models/server-message.model.js +3 -1
  169. package/models/server-message.model.js.map +1 -1
  170. package/models/subscription.model.js +3 -1
  171. package/models/subscription.model.js.map +1 -1
  172. package/models/support-ticket.model.js +3 -1
  173. package/models/support-ticket.model.js.map +1 -1
  174. package/models/user-group.model.js +3 -1
  175. package/models/user-group.model.js.map +1 -1
  176. package/models/user-guide.model.js +3 -1
  177. package/models/user-guide.model.js.map +1 -1
  178. package/models/user.model.js +3 -1
  179. package/models/user.model.js.map +1 -1
  180. package/package.json +1 -1
  181. package/public_api.js +77 -1
  182. package/public_api.js.map +1 -1
  183. package/publications/app-status.js +16 -1
  184. package/publications/app-status.js.map +1 -1
  185. package/publications/cron-jobs.js +32 -1
  186. package/publications/cron-jobs.js.map +1 -1
  187. package/publications/files.js +36 -1
  188. package/publications/files.js.map +1 -1
  189. package/publications/flags-update.js +22 -1
  190. package/publications/flags-update.js.map +1 -1
  191. package/publications/flags.js +22 -1
  192. package/publications/flags.js.map +1 -1
  193. package/publications/logs.js +164 -1
  194. package/publications/logs.js.map +1 -1
  195. package/publications/notifications.js +16 -1
  196. package/publications/notifications.js.map +1 -1
  197. package/publications/report-builder-dashboard-builders.js +42 -1
  198. package/publications/report-builder-dashboard-builders.js.map +1 -1
  199. package/publications/report-builder-libraries.js +90 -1
  200. package/publications/report-builder-libraries.js.map +1 -1
  201. package/publications/report-builder-reports.js +50 -1
  202. package/publications/report-builder-reports.js.map +1 -1
  203. package/publications/super-admin.js +16 -1
  204. package/publications/super-admin.js.map +1 -1
  205. package/publications/user-groups.js +16 -1
  206. package/publications/user-groups.js.map +1 -1
  207. package/publications/user-guides.js +16 -1
  208. package/publications/user-guides.js.map +1 -1
  209. package/resolveio-server-app.js +176 -1
  210. package/resolveio-server-app.js.map +1 -1
  211. package/server-app.js +1159 -1
  212. package/server-app.js.map +1 -1
  213. package/util/common.js +632 -1
  214. package/util/common.js.map +1 -1
  215. package/util/schema-report-builder.js +454 -1
  216. package/util/schema-report-builder.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","_methodManager","getEnableDebug","console","log","initServerFlag","setTimeout","removeAllListeners","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","exit","_serverHTTP","close","safeShutdown","NODE_APP_INSTANCE","MethodManager","_workerServerManager","WorkerServerManager","WORKER_INDEX","_cronManager","CronManager","_websocketManager","WebSocketManager","_workerDispatcherManager","WorkerDispatcherManager","_subscriptionManager","SubscriptionManager","_serverWSS","startServerInstance","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","parseInt","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","getActiveMonitorFunctions","length","isSafeShutdown","getMongoConnection","setImmediate","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","ws","push","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","server","verifyClient","info","cb","token","url","includes","split","infoData","headers","origin","verify","err","decoded","Users","findById","user","fullname","readonly","workerId_1","objectIdHexString","addWorker","lastComm_1","sendWorkerPayload","interval_1","disconnectWorker","toString","handleWorkerMessage","clearInterval","addWebSocket","createLoggedInUser","send","unsubscribeWS","socketData","parse","e_1","processSocketMessage","now","getTime","this_1","_e","__values","value","readyState","OPEN","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","handleClientMessage","msg","messageRoute","messageDate","messageId","type","some","a","roles","groups","views","b","super_admin","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","data","offlineUpdates","i","update","shift","updateMessageId","method","serverResMethod","getLocalLogManager","writeLog","_id","createdAt","collection","id_document","payload","getBinarySize","id_user","route","Logs","insertOne","client","instance","instance_index","_methods","callMethod","call","apply","__spreadArray","Object","assign","id_ws","__read","err_1","getMongoManager","invalidateQueryCache","splice","map","indexOf","dataCopy","msgId","methodName","ack","getMethod","skipWorker","sendClientTask","callMethodLocally","params","result","err_2","unsubscribeAll","getApp","getWorkerDispatcherManager","getWorkerServerManager","exports"],"mappings":"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","file":"server-app.js","sourcesContent":["import * as bodyParser from 'body-parser';\nimport * as express from 'express';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport { createServer, Server } from 'http';\nimport * as jwt from 'jsonwebtoken';\nimport * as moment from 'moment-timezone';\nimport * as WebSocket from 'ws';\n\nimport { Logs } from './collections/log.collection';\nimport { Users } from './collections/user.collection';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { ServerResponseModel } from './models/server-message.model';\nimport { dateReviver, getBinarySize, objectIdHexString } from './util/common';\n\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { setupHomeRoutes } from './http/home';\n\nimport { WebSocketManager } from './managers/websocket.manager';\nimport { WorkerDispatcherManager } from './managers/worker-dispatcher.manager';\nimport { WorkerServerManager } from './managers/worker-server.manager';\nimport { ResolveIOServer } from './resolveio-server-app';\n\nexport class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\tprivate _workerDispatcherManager: WorkerDispatcherManager;\n\tprivate _workerServerManager: WorkerServerManager;\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate _safeShutdown = false;\n\n\tconstructor() {}\n\n\tstatic async create() {\n\t\tconst resolveioMainServer = new ResolveIOMainServer();\n\t\tawait resolveioMainServer.initialize();\n\t\treturn resolveioMainServer;\n\t}\n\n\tprivate async initialize() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = await MonitorManager.create();\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._methodManager && this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tlet initServerFlag = false;\n\n\t\tsetTimeout(() => {\n\t\t\tinitServerFlag = true;\n\t\t}, 5000);\n\n\t\tprocess.removeAllListeners('unhandledRejection');\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.error(new Date(), 'ERROR DETECTED w/ Debug Flag Active: unhandledRejection', [error, rej]);\n\t\t\t}\n\n\t\t\t// Condition to filter out the MongoError with code 48 (NamespaceExists)\n\t\t\tif (error && error['name'] === 'MongoError' && (error['code'] === 48 || error['code'] === 26 || error['code'] === 11000 || error['code'] === 251)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tif (error && error['name'] === 'MongoServerError' && (!initServerFlag || error['code'] === 26 || error['code'] === 11000 || error['code'] === 86 || error['code'] === 251)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tconsole.error(new Date(), 'Unhandled Rejection at Promise', [error, rej]);\n\t\t\t\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\t// If this is a MongoNetworkTimeoutError, handle it specifically\n\t\t\tif (error && (error['name'] === 'MongoNetworkTimeoutError' || error instanceof MongoNetworkTimeoutError)) {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t// Sending email notification (using your existing method)\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - MongoNetworkTimeoutError - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify({\n\t\t\t\t\t\tname: error['name'],\n\t\t\t\t\t\tmessage: error['message'],\n\t\t\t\t\t\tstack: error['stack']\n\t\t\t\t\t}, null, 2));\n\n\t\t\t\t\t// Exiting the process\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error) {\n\t\t\t\tif (error['name'] !== 'StatusError' && error['message'] !== '') {\n\t\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconsole.error(error, 'Uncaught Exception thrown');\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t}\n\t\t});\n\n\t\t//PM2 wants to reboot/restart\n\t\tprocess.on('SIGINT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tconsole.log('Running as a Worker instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._methodManager = MethodManager.create(null, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerServerManager = WorkerServerManager.create(this._methodManager, this.getServerConfig());\n\n\t\t\t\tif (process.env.WORKER_INDEX === '0') {\n\t\t\t\t\tthis._cronManager = CronManager.create();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('Running as a Server instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerDispatcherManager = WorkerDispatcherManager.create(this._websocketManager, this._methodManager);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.startServerInstance();\n\t\t\t\tthis.listen();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.log('Running with Workers Disabled', process.env.NODE_APP_INSTANCE);\n\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\tthis._cronManager = CronManager.create();\n\t\t\tthis.startServerInstance();\n\t\t\tthis.listen();\n\t\t}\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.NODE_APP_INSTANCE ? parseInt('808' + process.env.NODE_APP_INSTANCE) : 8080;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app);\n\n\t\tif (ResolveIOServer.getServerConfig()['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tprivate async safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length\n\t\t\t&& !this._offlineUpdates.length && (!this._workerDispatcherManager || this._workerDispatcherManager.isSafeShutdown())\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait ResolveIOServer.getMongoConnection().close(false);\n\t\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tcatch { \n\t\t\t\t\tprocess.exit(1); \n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (!this._safeShutdown) {\n\t\t\t\tthis._safeShutdown = true;\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._safeShutdown = false;\n\t\t\t\t}, 1000);\n\n\t\t\t\tconsole.log(new Date(), 'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length,\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(async () => {\n\t\t\t\tawait this.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000;\n\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tserver: this._serverHTTP,\n\t\t\tverifyClient: this.publicProgram ? null : (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If it's a worker, we might skip token checks or do a simple check:\n\t\t\t\t\tif (info.req.url && info.req.url.includes('workerToken=')) {\n\t\t\t\t\t\tlet urlParts = info.req.url.split('workerToken='); \n\t\t\t\t\t\tlet workerToken = urlParts[1] || '';\n\n\t\t\t\t\t\tif (workerToken === ResolveIOServer.getServerConfig()['WORKER_TOKEN']) {\n\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tinfo.origin !== ResolveIOServer.getServerConfig()['ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['SEC_ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_SECONDARY_URL']\n\t\t\t\t\t) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, ResolveIOServer.getServerConfig()['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Listen for connections from clients or workers.\n\t */\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running HTTP/WS server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('connection', async (ws, req) => {\n\t\t\tif (req.url && req.url.includes('workerToken=')) {\n\t\t\t\t// It's a WORKER\n\t\t\t\tlet workerId = objectIdHexString();\n\t\t\t\tws['id_worker'] = workerId;\n\n\t\t\t\tconsole.log(new Date(), process.env.NODE_APP_INSTANCE, 'Worker Connected', process.env.NODE_APP_INSTANCE);\n\n\t\t\t\tthis._workerDispatcherManager.addWorker(ws);\n\n\t\t\t\tlet interval = null;\n\t\t\t\tlet lastComm = null;\n\n\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\n\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\t\t\t\t\t\tws.close();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\t\t\t\t}\n\t\t\t\t}, 30000);\n\n\t\t\t\tws.on('message', (message: any) => {\n\t\t\t\t\t// console.log(new Date(), 'Message Recv', message);\n\n\t\t\t\t\tif (typeof message !== 'string') {\n\t\t\t\t\t\tmessage = message.toString();\n\t\t\t\t\t}\n\n\t\t\t\t\t// console.log(new Date(), 'String Message Recv', message);\n\n\t\t\t\t\tif (message === 'ping') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'pong');\n\t\t\t\t\t}\n\t\t\t\t\telse if (message === 'pong') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._workerDispatcherManager.handleWorkerMessage(ws['id_worker'], message);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('close', () => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.log(new Date(), 'Worker disconnected:', workerId);\n\t\t\t\t\t\n\t\t\t\t\tif (interval) {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('error', (error) => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.error('Error on WS Worker', error);\n\t\t\t\t\tws.close();\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Normal client\n\t\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\t\tawait this._subscriptionManager.createLoggedInUser(ws['id_socket']);\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', async (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tif (this._methodManager.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._methodManager.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._methodManager.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])) < 1000000 ? 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])) < 1000000 ? 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])) < 1000000 ? 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])) < 1000000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Immediately ACK\n\t\t\t\tlet ack: ServerResponseModel = {\n\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, ack);\n\t\t\t\t}\n\n\t\t\t\tlet method = this._methodManager.getMethod(methodName);\n\n\t\t\t\tif (method && \n\t\t\t\t\t!method.skipWorker &&\n\t\t\t\t\tthis._isWorkersEnabled && \n\t\t\t\t\tmethodName !== 'find' &&\n\t\t\t\t\tmethodName !== 'insertDocument' &&\n\t\t\t\t\tmethodName !== 'countWithQuery' &&\n\t\t\t\t\tmethodName !== 'findOne' &&\n\t\t\t\t\tmethodName !== 'updateDocumentProps' &&\n\t\t\t\t\tmethodName !== 'findWithOptions' &&\n\t\t\t\t\tmethodName !== 'updateDocument' &&\n\t\t\t\t\tmethodName !== 'insertErrorLog' &&\n\t\t\t\t\tmethodName !== 'removeDocument' &&\n\t\t\t\t\tmethodName !== 'supportCreateBillingUser' &&\n\t\t\t\t\tmethodName !== 'getSignedUrl' &&\n\t\t\t\t\tmethodName !== 'getSignedUrls' &&\n\t\t\t\t\tmethodName !== 'getSignedUrlWithId' &&\n\t\t\t\t\tmethodName !== 'incorrectUser' &&\n\t\t\t\t\tmethodName !== 'reloadWS' &&\n\t\t\t\t\tmethodName !== 'reconnectWS' &&\n\t\t\t\t\tmethodName !== 'disconnectWS'\n\t\t\t\t) {\t\t\t\t\t\n\t\t\t\t\tthis._workerDispatcherManager.sendClientTask(msgId, methodName, dataCopy, {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// No worker available: do method locally\n\t\t\t\t\tawait this.callMethodLocally(ws, msgId, methodName, dataCopy);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * callMethodLocally is your old approach for invoking the method in-process.\n\t */\n\tprivate async callMethodLocally(ws: WebSocket, messageId: number, method: string, params: any[]) {\n\t\tlet serverRes: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: false,\n\t\t\tdata: null\n\t\t};\n\n\t\ttry {\n\t\t\t// You can keep your logging code (LogMethodLatencies, Logs.insertOne, etc.)\n\t\t\tlet result = await this._methodManager.callMethod.call(\n\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t}),\n\t\t\t\tmethod,\n\t\t\t\t...params\n\t\t\t);\n\n\t\t\tserverRes.data = result;\n\t\t}\n\t\tcatch (err) {\n\t\t\tserverRes.hasError = true;\n\t\t\tserverRes.data = err || 'Unknown error';\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t}\n\t}\n\n\t\n\n\t/**\n\t * Cleanly remove a client from the subscription manager, etc.\n\t */\n\tpublic async unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager && this._methodManager.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":[],"mappings":"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","file":"server-app.js","sourcesContent":["import * as bodyParser from 'body-parser';\nimport * as express from 'express';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport { createServer, Server } from 'http';\nimport * as jwt from 'jsonwebtoken';\nimport * as moment from 'moment-timezone';\nimport * as WebSocket from 'ws';\n\nimport { Logs } from './collections/log.collection';\nimport { Users } from './collections/user.collection';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { ServerResponseModel } from './models/server-message.model';\nimport { dateReviver, getBinarySize, objectIdHexString } from './util/common';\n\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { setupHomeRoutes } from './http/home';\n\nimport { WebSocketManager } from './managers/websocket.manager';\nimport { WorkerDispatcherManager } from './managers/worker-dispatcher.manager';\nimport { WorkerServerManager } from './managers/worker-server.manager';\nimport { ResolveIOServer } from './resolveio-server-app';\n\nexport class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\tprivate _workerDispatcherManager: WorkerDispatcherManager;\n\tprivate _workerServerManager: WorkerServerManager;\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate _safeShutdown = false;\n\n\tconstructor() {}\n\n\tstatic async create() {\n\t\tconst resolveioMainServer = new ResolveIOMainServer();\n\t\tawait resolveioMainServer.initialize();\n\t\treturn resolveioMainServer;\n\t}\n\n\tprivate async initialize() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = await MonitorManager.create();\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._methodManager && this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tlet initServerFlag = false;\n\n\t\tsetTimeout(() => {\n\t\t\tinitServerFlag = true;\n\t\t}, 5000);\n\n\t\tprocess.removeAllListeners('unhandledRejection');\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.error(new Date(), 'ERROR DETECTED w/ Debug Flag Active: unhandledRejection', [error, rej]);\n\t\t\t}\n\n\t\t\t// Condition to filter out the MongoError with code 48 (NamespaceExists)\n\t\t\tif (error && error['name'] === 'MongoError' && (error['code'] === 48 || error['code'] === 26 || error['code'] === 11000 || error['code'] === 251)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tif (error && error['name'] === 'MongoServerError' && (!initServerFlag || error['code'] === 26 || error['code'] === 11000 || error['code'] === 86 || error['code'] === 251)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tconsole.error(new Date(), 'Unhandled Rejection at Promise', [error, rej]);\n\t\t\t\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\t// If this is a MongoNetworkTimeoutError, handle it specifically\n\t\t\tif (error && (error['name'] === 'MongoNetworkTimeoutError' || error instanceof MongoNetworkTimeoutError)) {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t// Sending email notification (using your existing method)\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - MongoNetworkTimeoutError - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify({\n\t\t\t\t\t\tname: error['name'],\n\t\t\t\t\t\tmessage: error['message'],\n\t\t\t\t\t\tstack: error['stack']\n\t\t\t\t\t}, null, 2));\n\n\t\t\t\t\t// Exiting the process\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error) {\n\t\t\t\tif (error['name'] !== 'StatusError' && error['message'] !== '') {\n\t\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconsole.error(error, 'Uncaught Exception thrown');\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t}\n\t\t});\n\n\t\t//PM2 wants to reboot/restart\n\t\tprocess.on('SIGINT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tconsole.log('Running as a Worker instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._methodManager = MethodManager.create(null, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerServerManager = WorkerServerManager.create(this._methodManager, this.getServerConfig());\n\n\t\t\t\tif (process.env.WORKER_INDEX === '0') {\n\t\t\t\t\tthis._cronManager = CronManager.create();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('Running as a Server instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerDispatcherManager = WorkerDispatcherManager.create(this._websocketManager, this._methodManager);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.startServerInstance();\n\t\t\t\tthis.listen();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.log('Running with Workers Disabled', process.env.NODE_APP_INSTANCE);\n\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\tthis._cronManager = CronManager.create();\n\t\t\tthis.startServerInstance();\n\t\t\tthis.listen();\n\t\t}\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.NODE_APP_INSTANCE ? parseInt('808' + process.env.NODE_APP_INSTANCE) : 8080;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app);\n\n\t\tif (ResolveIOServer.getServerConfig()['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tprivate async safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length\n\t\t\t&& !this._offlineUpdates.length && (!this._workerDispatcherManager || this._workerDispatcherManager.isSafeShutdown())\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait ResolveIOServer.getMongoConnection().close(false);\n\t\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tcatch { \n\t\t\t\t\tprocess.exit(1); \n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (!this._safeShutdown) {\n\t\t\t\tthis._safeShutdown = true;\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._safeShutdown = false;\n\t\t\t\t}, 1000);\n\n\t\t\t\tconsole.log(new Date(), 'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length,\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(async () => {\n\t\t\t\tawait this.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000;\n\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tserver: this._serverHTTP,\n\t\t\tverifyClient: this.publicProgram ? null : (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If it's a worker, we might skip token checks or do a simple check:\n\t\t\t\t\tif (info.req.url && info.req.url.includes('workerToken=')) {\n\t\t\t\t\t\tlet urlParts = info.req.url.split('workerToken='); \n\t\t\t\t\t\tlet workerToken = urlParts[1] || '';\n\n\t\t\t\t\t\tif (workerToken === ResolveIOServer.getServerConfig()['WORKER_TOKEN']) {\n\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tinfo.origin !== ResolveIOServer.getServerConfig()['ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['SEC_ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_SECONDARY_URL']\n\t\t\t\t\t) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, ResolveIOServer.getServerConfig()['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Listen for connections from clients or workers.\n\t */\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running HTTP/WS server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('connection', async (ws, req) => {\n\t\t\tif (req.url && req.url.includes('workerToken=')) {\n\t\t\t\t// It's a WORKER\n\t\t\t\tlet workerId = objectIdHexString();\n\t\t\t\tws['id_worker'] = workerId;\n\n\t\t\t\tconsole.log(new Date(), process.env.NODE_APP_INSTANCE, 'Worker Connected', process.env.NODE_APP_INSTANCE);\n\n\t\t\t\tthis._workerDispatcherManager.addWorker(ws);\n\n\t\t\t\tlet interval = null;\n\t\t\t\tlet lastComm = null;\n\n\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\n\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\t\t\t\t\t\tws.close();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\t\t\t\t}\n\t\t\t\t}, 30000);\n\n\t\t\t\tws.on('message', (message: any) => {\n\t\t\t\t\t// console.log(new Date(), 'Message Recv', message);\n\n\t\t\t\t\tif (typeof message !== 'string') {\n\t\t\t\t\t\tmessage = message.toString();\n\t\t\t\t\t}\n\n\t\t\t\t\t// console.log(new Date(), 'String Message Recv', message);\n\n\t\t\t\t\tif (message === 'ping') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'pong');\n\t\t\t\t\t}\n\t\t\t\t\telse if (message === 'pong') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._workerDispatcherManager.handleWorkerMessage(ws['id_worker'], message);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('close', () => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.log(new Date(), 'Worker disconnected:', workerId);\n\t\t\t\t\t\n\t\t\t\t\tif (interval) {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('error', (error) => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.error('Error on WS Worker', error);\n\t\t\t\t\tws.close();\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Normal client\n\t\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\t\tawait this._subscriptionManager.createLoggedInUser(ws['id_socket']);\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', async (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tif (this._methodManager.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._methodManager.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._methodManager.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])) < 1000000 ? 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])) < 1000000 ? 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])) < 1000000 ? 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])) < 1000000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Immediately ACK\n\t\t\t\tlet ack: ServerResponseModel = {\n\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, ack);\n\t\t\t\t}\n\n\t\t\t\tlet method = this._methodManager.getMethod(methodName);\n\n\t\t\t\tif (method && \n\t\t\t\t\t!method.skipWorker &&\n\t\t\t\t\tthis._isWorkersEnabled && \n\t\t\t\t\tmethodName !== 'find' &&\n\t\t\t\t\tmethodName !== 'insertDocument' &&\n\t\t\t\t\tmethodName !== 'countWithQuery' &&\n\t\t\t\t\tmethodName !== 'findOne' &&\n\t\t\t\t\tmethodName !== 'updateDocumentProps' &&\n\t\t\t\t\tmethodName !== 'findWithOptions' &&\n\t\t\t\t\tmethodName !== 'updateDocument' &&\n\t\t\t\t\tmethodName !== 'insertErrorLog' &&\n\t\t\t\t\tmethodName !== 'removeDocument' &&\n\t\t\t\t\tmethodName !== 'supportCreateBillingUser' &&\n\t\t\t\t\tmethodName !== 'getSignedUrl' &&\n\t\t\t\t\tmethodName !== 'getSignedUrls' &&\n\t\t\t\t\tmethodName !== 'getSignedUrlWithId' &&\n\t\t\t\t\tmethodName !== 'incorrectUser' &&\n\t\t\t\t\tmethodName !== 'reloadWS' &&\n\t\t\t\t\tmethodName !== 'reconnectWS' &&\n\t\t\t\t\tmethodName !== 'disconnectWS'\n\t\t\t\t) {\t\t\t\t\t\n\t\t\t\t\tthis._workerDispatcherManager.sendClientTask(msgId, methodName, dataCopy, {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// No worker available: do method locally\n\t\t\t\t\tawait this.callMethodLocally(ws, msgId, methodName, dataCopy);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * callMethodLocally is your old approach for invoking the method in-process.\n\t */\n\tprivate async callMethodLocally(ws: WebSocket, messageId: number, method: string, params: any[]) {\n\t\tlet serverRes: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: false,\n\t\t\tdata: null\n\t\t};\n\n\t\ttry {\n\t\t\t// You can keep your logging code (LogMethodLatencies, Logs.insertOne, etc.)\n\t\t\tlet result = await this._methodManager.callMethod.call(\n\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t}),\n\t\t\t\tmethod,\n\t\t\t\t...params\n\t\t\t);\n\n\t\t\tserverRes.data = result;\n\t\t}\n\t\tcatch (err) {\n\t\t\tserverRes.hasError = true;\n\t\t\tserverRes.data = err || 'Unknown error';\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t}\n\t}\n\n\t\n\n\t/**\n\t * Cleanly remove a client from the subscription manager, etc.\n\t */\n\tpublic async unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager && this._methodManager.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}"]}