@resolveio/server-lib 20.7.21 → 20.7.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/monitor.manager.ts"],"names":["axios_1","require","monitor_cpu_collection_1","monitor_function_collection_1","monitor_memory_collection_1","monitor_mongo_collection_1","resolveio_server_app_1","common_1","os","MAX_BATCH_SIZE","MonitorManager","this","_instanceHostname","_monitorData","create","monitorManager","initialize","_a","sent","prototype","hostname","replace","setupIntervals","setupEventLoop","cpuAverage","totalIdle","totalTick","cpus","i","len","length","type","cpu","times","idle","total","ResolveIOServer","getServerConfig","default","get","instanceId_1","_b","setInterval","__awaiter","_this","post","id_aws_instance","data","version","process","env","APP_VERSION","toString","version_key","APP_VERSION_KEY","lastCPU","now","Date","endMeasure","idleDifference","totalDifference","percentageCPU","MonitorCPUs","_id","objectIdHexString","metadata","instance","client","date","app","system","loadavg","pushMonitorData","memUsage","memoryUsage","MonitorMemorys","physical_total","heapTotal","physical_used","heapUsed","physical_free","freemem","virtual","rss","private","external","physical","totalmem","addMongoTracker","collection","startsWith","MonitorMongos","method","doc_collection","duration","query","Buffer","byteLength","addFunctionTracker","JSON","stringify","MonitorFunctions","startTime","functionType","name","functionName","user","push","estimateBatchSize","flushMonitorData","reduce","item","batch","batchSize","shift","itemSize","unshift","getLocalLogManager","writeLogs","error","console","MonitorMongo","exports","_startTime","_method","_collection","_query","monitorMongo","finish","endTime","mongoMonitor","getMainServer","getMonitorManager","MonitorManagerFunction","_functionCnt","_functions","_functionLastCompletedWS","monitorManagerFunction","startMonitorFunction","id_socket","newMonitorFunction","MonitorFunction","id","finishMonitorFunction","monitor","find","a","_functionLastCompleted","splice","map","indexOf","getActiveMonitorFunctions","getLastCompletedMonitorFunction","getLastCompletedMonitorFunctionWS","_timer","lastTime","monitorFunction","diff","getTime","clearInterval"],"mappings":"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","file":"monitor.manager.js","sourcesContent":["import axios from 'axios';\nimport { MonitorCPUs } from '../collections/monitor-cpu.collection';\nimport { MonitorFunctions } from '../collections/monitor-function.collection';\nimport { MonitorMemorys } from '../collections/monitor-memory.collection';\nimport { MonitorMongos } from '../collections/monitor-mongo.collection';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { objectIdHexString } from '../util/common';\nimport { LocalLogModel } from './local-log.manager';\n\nconst os = require('os');\nconst MAX_BATCH_SIZE = 8 * 1024 * 1024; // 8MB max for safety\n\nexport class MonitorManager {\n\tprivate _instanceHostname = '';\n\tprivate _monitorData: LocalLogModel[] = [];\n\n\tconstructor() {}\n\n\tstatic async create() {\n\t\tconst monitorManager = new MonitorManager();\n\t\tawait monitorManager.initialize();\n\t\treturn monitorManager;\n\t}\n\n\tprivate async initialize() {\n\t\tthis._instanceHostname = os.hostname().replace(/\\./g, '-');\n\n\t\tawait this.setupIntervals();\n\t\tthis.setupEventLoop();\n\t}\n\n\tcpuAverage() {\n\t\tvar totalIdle = 0, totalTick = 0;\n\t\tvar cpus = os.cpus();\n\n\t\tfor (var i = 0, len = cpus.length; i < len; i++) {\n\t\t\tvar cpu = cpus[i];\n\n\t\t\tfor (let type in cpu.times) {\n\t\t\t\ttotalTick += cpu.times[type];\n\t\t\t}\n\t\t\ttotalIdle += cpu.times.idle;\n\t\t}\n\n\t\treturn {\n\t\t\tidle: totalIdle / cpus.length,\n\t\t\ttotal: totalTick / cpus.length\n\t\t};\n\t}\n\n\tasync setupIntervals() {\n\t\t// Example: If not on production or localhost, do a health check\n\t\tif (\n\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t) {\n\t\t\ttry {\n\t\t\t\tlet instanceId = await axios.get('http://169.254.169.254/latest/meta-data/instance-id');\n\n\t\t\t\tsetInterval(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait axios.post('https://backend.resolveio.com/api/health', {\n\t\t\t\t\t\t\ttype: 'application',\n\t\t\t\t\t\t\tid_aws_instance: instanceId.data,\n\t\t\t\t\t\t\tversion: typeof process.env.APP_VERSION === 'number'\n\t\t\t\t\t\t\t\t? (<any>process.env.APP_VERSION).toString()\n\t\t\t\t\t\t\t\t: process.env.APP_VERSION,\n\t\t\t\t\t\t\tversion_key: process.env.APP_VERSION_KEY\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tcatch {}\n\t\t\t\t}, 10000);\n\t\t\t}\n\t\t\tcatch {}\n\t\t}\n\n\t\tlet lastCPU = this.cpuAverage();\n\n\t\tsetInterval(async () => {\n\t\t\tlet now = new Date();\n\t\t\tvar endMeasure = this.cpuAverage();\n\t\t\tvar idleDifference = endMeasure.idle - lastCPU.idle;\n\t\t\tvar totalDifference = endMeasure.total - lastCPU.total;\n\t\t\tvar percentageCPU = 1 - idleDifference / totalDifference;\n\n\t\t\t// Original local code\n\t\t\tif (\n\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'https://resolveio.com'\n\t\t\t|| ResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200'\n\t\t\t) {\n\t\t\t\tawait MonitorCPUs.create({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t},\n\t\t\t\t\tdate: now,\n\t\t\t\t\tapp: percentageCPU,\n\t\t\t\t\tsystem: os.loadavg()[0]\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.pushMonitorData({\n\t\t\t\t\ttype: 'monitor-cpu',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdate: now,\n\t\t\t\t\t\tapp: percentageCPU,\n\t\t\t\t\t\tsystem: os.loadavg()[0]\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlastCPU = endMeasure;\n\n\t\t\tconst memUsage = process.memoryUsage();\n\n\t\t\tif (\n\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'https://resolveio.com'\n\t\t\t|| ResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200'\n\t\t\t) {\n\t\t\t\tawait MonitorMemorys.create({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t},\n\t\t\t\t\tdate: now,\n\t\t\t\t\tphysical_total: memUsage.heapTotal,\n\t\t\t\t\tphysical_used: memUsage.heapUsed,\n\t\t\t\t\tphysical_free: os.freemem(),\n\t\t\t\t\tvirtual: memUsage.rss,\n\t\t\t\t\tprivate: memUsage.external,\n\t\t\t\t\tphysical: os.totalmem()\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.pushMonitorData({\n\t\t\t\t\ttype: 'monitor-memory',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdate: now,\n\t\t\t\t\t\tphysical_total: memUsage.heapTotal,\n\t\t\t\t\t\tphysical_used: memUsage.heapUsed,\n\t\t\t\t\t\tphysical_free: os.freemem(),\n\t\t\t\t\t\tvirtual: memUsage.rss,\n\t\t\t\t\t\tprivate: memUsage.external,\n\t\t\t\t\t\tphysical: os.totalmem(),\n\t\t\t\t\t\ttype: 'memory'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}, 3000);\n\t}\n\n\tasync addMongoTracker(data: MongoMonitorModel) {\n\t\tif (\n\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'https://resolveio.com'\n\t\t\t|| ResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200'\n\t\t) {\n\t\t\tif (!data.collection.startsWith('monitor-')) {\n\t\t\t\tawait MonitorMongos.create({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t},\n\t\t\t\t\tdate: new Date(data.date),\n\t\t\t\t\tmethod: data.method,\n\t\t\t\t\tdoc_collection: data.collection,\n\t\t\t\t\tduration: data.duration,\n\t\t\t\t\tquery: Buffer.byteLength(data.query, 'utf8') < 15800000\n\t\t\t\t\t\t? data.query\n\t\t\t\t\t\t: 'Too Big'\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this._instanceHostname) {\n\t\t\t\tthis.pushMonitorData({\n\t\t\t\t\ttype: 'monitor-mongo',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdate: new Date(data.date),\n\t\t\t\t\t\tmethod: data.method,\n\t\t\t\t\t\tdoc_collection: data.collection,\n\t\t\t\t\t\tduration: data.duration,\n\t\t\t\t\t\tquery: Buffer.byteLength(data.query, 'utf8') < 15800000\n\t\t\t\t\t\t\t? data.query\n\t\t\t\t\t\t\t: 'Too Big'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tasync addFunctionTracker(data: MonitorFunction) {\n\t\tif (typeof(data.data) !== 'string') {\n\t\t\tdata.data = JSON.stringify(data.data);\n\t\t}\n\n\t\tif (\n\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'https://resolveio.com'\n\t\t\t|| ResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200'\n\t\t) {\n\t\t\tawait MonitorFunctions.create({\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t},\n\t\t\t\tdate: new Date(data.startTime),\n\t\t\t\ttype: data.functionType,\n\t\t\t\tname: data.functionName,\n\t\t\t\tuser: data.user,\n\t\t\t\tduration: data.duration,\n\t\t\t\tdata: Buffer.byteLength(data.data, 'utf8') < 15800000\n\t\t\t\t\t? data.data\n\t\t\t\t\t: 'Too Big'\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tif (this._instanceHostname) {\n\t\t\t\tthis.pushMonitorData({\n\t\t\t\t\ttype: 'monitor-function',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdate: new Date(data.startTime),\n\t\t\t\t\t\ttype: data.functionType,\n\t\t\t\t\t\tname: data.functionName,\n\t\t\t\t\t\tuser: data.user,\n\t\t\t\t\t\tduration: data.duration,\n\t\t\t\t\t\tdata: Buffer.byteLength(data.data, 'utf8') < 15800000\n\t\t\t\t\t\t\t? data.data\n\t\t\t\t\t\t\t: 'Too Big'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate pushMonitorData(data: LocalLogModel) {\n\t\tthis._monitorData.push(data);\n\n\t\t// If data is huge, flush immediately to file\n\t\tif (this.estimateBatchSize() >= MAX_BATCH_SIZE) {\n\t\t\tthis.flushMonitorData();\n\t\t}\n\t}\n\n\tprivate estimateBatchSize(): number {\n\t\treturn this._monitorData.reduce((total, item) => {\n\t\t\treturn total + Buffer.byteLength(JSON.stringify(item));\n\t\t}, 0);\n\t}\n\n\tsetupEventLoop() {\n\t\t// Flush every 2.5 seconds\n\t\tsetInterval(() => {\n\t\t\tif (this._monitorData.length > 0) {\n\t\t\t\tthis.flushMonitorData();\n\t\t\t}\n\t\t}, 2500);\n\t}\n\n\tprivate flushMonitorData() {\n\t\tconst batch = [];\n\t\tlet batchSize = 0;\n\n\t\twhile (this._monitorData.length > 0 && batchSize < MAX_BATCH_SIZE) {\n\t\t\tconst item = this._monitorData.shift();\n\t\t\tconst itemSize = Buffer.byteLength(JSON.stringify(item));\n\n\t\t\tif ((batchSize + itemSize) > MAX_BATCH_SIZE && batch.length > 0) {\n\t\t\t\t// put the item back for next round\n\t\t\t\tthis._monitorData.unshift(item);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbatch.push(item);\n\t\t\tbatchSize += itemSize;\n\t\t}\n\n\t\ttry {\n\t\t\t// Now, instead of calling an external HTTP endpoint, we write the batch to disk:\n\t\t\tResolveIOServer.getLocalLogManager().writeLogs(batch);\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'MonitorManager', 'Failed to flush monitor data to file:', error);\n\t\t}\n\t}\n}\n\nexport interface MongoMonitorModel {\n\tdate: Date;\n\tmethod: string;\n\tcollection: string;\n\tduration: number;\n\tquery: string;\n}\n\nexport class MonitorMongo {\n\tprivate _startTime = 0;\n\tprivate _method = '';\n\tprivate _collection = '';\n\tprivate _query = '';\n\n\tconstructor() {}\n\n\tstatic create(method: string, collection: string, query: string) {\n\t\tconst monitorMongo = new MonitorMongo();\n\t\tmonitorMongo.initialize(method, collection, query);\n\t\treturn monitorMongo;\n\t}\n\n\tprivate initialize(method: string, collection: string, query: string) {\n\t\tthis._startTime = Date.now();\n\t\tthis._method = method;\n\t\tthis._collection = collection;\n\t\tthis._query = query;\n\t}\n\n\tpublic async finish() {\n\t\tlet endTime = Date.now();\n\n\t\tlet mongoMonitor: MongoMonitorModel = {\n\t\t\tdate: new Date(endTime),\n\t\t\tmethod: this._method,\n\t\t\tcollection: this._collection,\n\t\t\tquery: this._query,\n\t\t\tduration: endTime - this._startTime\n\t\t};\n\n\t\tawait ResolveIOServer.getMainServer().getMonitorManager().addMongoTracker(mongoMonitor);\n\t}\n}\n\nexport class MonitorManagerFunction {\n\tprivate _functionCnt = 0;\n\tprivate _functions: MonitorFunction[] = [];\n\tprivate _functionLastCompletedWS: { [id_socket: string]: MonitorFunction; } = {};\n\tprivate _functionLastCompleted: MonitorFunction;\n\n\tconstructor() {}\n\n\tstatic create() {\n\t\tconst monitorManagerFunction = new MonitorManagerFunction();\n\t\tmonitorManagerFunction.initialize();\n\t\treturn monitorManagerFunction;\n\t}\n\n\tprivate initialize() {\n\n\t}\n\n\tstartMonitorFunction(\n\t\tfunctionType: MonitorFunctionType,\n\t\tfunctionName: string,\n\t\tuser: string,\n\t\tid_socket: string,\n\t\tdata: any\n\t) {\n\t\tlet newMonitorFunction = MonitorFunction.create(\n\t\t\tthis._functionCnt++,\n\t\t\tfunctionType,\n\t\t\tfunctionName,\n\t\t\tuser,\n\t\t\tid_socket,\n\t\t\tdata\n\t\t);\n\n\t\tthis._functions.push(newMonitorFunction);\n\t\treturn newMonitorFunction.id;\n\t}\n\n\tasync finishMonitorFunction(id: number) {\n\t\tlet monitor = this._functions.find(a => a.id === id);\n\n\t\tif (monitor) {\n\t\t\tawait monitor.finish();\n\t\t\tthis._functionLastCompleted = monitor;\n\t\t\tthis._functionLastCompletedWS[monitor.id_socket] = monitor;\n\t\t\tthis._functions.splice(\n\t\t\t\tthis._functions.map(a => a.id).indexOf(id),\n\t\t\t\t1\n\t\t\t);\n\t\t}\n\t}\n\n\tgetActiveMonitorFunctions() {\n\t\treturn this._functions;\n\t}\n\n\tgetLastCompletedMonitorFunction() {\n\t\treturn this._functionLastCompleted;\n\t}\n\n\tgetLastCompletedMonitorFunctionWS() {\n\t\treturn this._functionLastCompletedWS;\n\t}\n}\n\nexport type MonitorFunctionType =\n\t'Cron Method'\n\t| 'Method'\n\t| 'User Specific Publication'\n\t| 'Publication';\n\nexport class MonitorFunction {\n\tprivate _timer: NodeJS.Timeout = null;\n\tpublic duration = 0;\n\tpublic functionType: MonitorFunctionType;\n\tpublic functionName: string;\n\tpublic user: string;\n\tpublic data: any;\n\tpublic startTime: Date = null;\n\tpublic endTime: Date = null;\n\tpublic lastTime: Date = null;\n\tpublic id_socket = '';\n\tpublic id = 0;\n\n\tconstructor() {}\n\n\tstatic create(\n\t\tid: number,\n\t\tfunctionType: MonitorFunctionType,\n\t\tfunctionName: string,\n\t\tuser: string,\n\t\tid_socket: string,\n\t\tdata: any\n\t) {\n\t\tconst monitorFunction = new MonitorFunction();\n\t\tmonitorFunction.initialize(id, functionType, functionName, user, id_socket, data);\n\t\treturn monitorFunction;\n\t}\n\n\tprivate initialize(\n\t\tid: number,\n\t\tfunctionType: MonitorFunctionType,\n\t\tfunctionName: string,\n\t\tuser: string,\n\t\tid_socket: string,\n\t\tdata: any\n\t) {\n\t\tthis.id = id;\n\t\tthis.startTime = new Date();\n\t\tthis.functionType = functionType;\n\t\tthis.functionName = functionName;\n\t\tthis.user = user;\n\t\tthis.id_socket = id_socket;\n\t\tthis.data = data;\n\t\tthis.lastTime = new Date();\n\n\t\tthis._timer = setInterval(() => {\n\t\t\tlet diff = Date.now() - this.lastTime.getTime();\n\n\t\t\tif (diff > this.duration) {\n\t\t\t\tthis.duration = diff;\n\t\t\t}\n\n\t\t\tthis.lastTime = new Date();\n\t\t}, 1000);\n\t}\n\n\tpublic async finish() {\n\t\tif (this._timer) {\n\t\t\tclearInterval(this._timer);\n\t\t\tthis._timer = null;\n\t\t}\n\n\t\tthis.endTime = new Date();\n\n\t\tif (this.duration >= 5000) {\n\t\t\t// Optional slow function logging or email\n\t\t}\n\n\t\tawait ResolveIOServer.getMainServer().getMonitorManager().addFunctionTracker(this);\n\t}\n}"]}
1
+ {"version":3,"sources":["../../src/managers/monitor.manager.ts"],"names":["axios_1","require","monitor_cpu_collection_1","monitor_function_collection_1","monitor_memory_collection_1","monitor_mongo_collection_1","resolveio_server_app_1","common_1","os","MAX_BATCH_SIZE","MonitorManager","this","_instanceHostname","_monitorData","create","monitorManager","initialize","_a","sent","prototype","hostname","replace","setupIntervals","setupEventLoop","cpuAverage","totalIdle","totalTick","cpus","i","len","length","type","cpu","times","idle","total","ResolveIOServer","getServerConfig","default","get","instanceId_1","_b","setInterval","__awaiter","_this","post","id_aws_instance","data","version","process","env","APP_VERSION","toString","version_key","APP_VERSION_KEY","lastCPU","now","Date","endMeasure","idleDifference","totalDifference","percentageCPU","MonitorCPUs","_id","objectIdHexString","metadata","instance","client","date","app","system","loadavg","pushMonitorData","memUsage","memoryUsage","MonitorMemorys","physical_total","heapTotal","physical_used","heapUsed","physical_free","freemem","virtual","rss","private","external","physical","totalmem","addMongoTracker","collection","startsWith","MonitorMongos","method","doc_collection","duration","query","Buffer","byteLength","addFunctionTracker","JSON","stringify","MonitorFunctions","startTime","functionType","name","functionName","user","push","estimateBatchSize","flushMonitorData","reduce","item","batch","batchSize","shift","itemSize","unshift","getLocalLogManager","writeLogs","error","console","MonitorMongo","exports","_startTime","_method","_collection","_query","monitorMongo","finish","endTime","mongoMonitor","getMainServer","getMonitorManager","MonitorManagerFunction","_functionCnt","_functions","_functionLastCompletedWS","monitorManagerFunction","startMonitorFunction","id_socket","newMonitorFunction","MonitorFunction","id","finishMonitorFunction","monitor","find","a","_functionLastCompleted","splice","map","indexOf","getActiveMonitorFunctions","getLastCompletedMonitorFunction","getLastCompletedMonitorFunctionWS","_timer","lastTime","monitorFunction","diff","getTime","clearInterval"],"mappings":"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","file":"monitor.manager.js","sourcesContent":["import axios from 'axios';\nimport { MonitorCPUs } from '../collections/monitor-cpu.collection';\nimport { MonitorFunctions } from '../collections/monitor-function.collection';\nimport { MonitorMemorys } from '../collections/monitor-memory.collection';\nimport { MonitorMongos } from '../collections/monitor-mongo.collection';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { objectIdHexString } from '../util/common';\nimport { LocalLogModel } from './local-log.manager';\n\nconst os = require('os');\nconst MAX_BATCH_SIZE = 8 * 1024 * 1024; // 8MB max for safety\n\nexport class MonitorManager {\n\tprivate _instanceHostname = '';\n\tprivate _monitorData: LocalLogModel[] = [];\n\n\tconstructor() {}\n\n\tstatic async create() {\n\t\tconst monitorManager = new MonitorManager();\n\t\tawait monitorManager.initialize();\n\t\treturn monitorManager;\n\t}\n\n\tprivate async initialize() {\n\t\tthis._instanceHostname = os.hostname().replace(/\\./g, '-');\n\t\tawait this.setupIntervals();\n\t\tthis.setupEventLoop();\n\t}\n\n\tcpuAverage() {\n\t\tvar totalIdle = 0, totalTick = 0;\n\t\tvar cpus = os.cpus();\n\n\t\tfor (var i = 0, len = cpus.length; i < len; i++) {\n\t\t\tvar cpu = cpus[i];\n\n\t\t\tfor (let type in cpu.times) {\n\t\t\t\ttotalTick += cpu.times[type];\n\t\t\t}\n\t\t\ttotalIdle += cpu.times.idle;\n\t\t}\n\n\t\treturn {\n\t\t\tidle: totalIdle / cpus.length,\n\t\t\ttotal: totalTick / cpus.length\n\t\t};\n\t}\n\n\tasync setupIntervals() {\n\t\t// Example: If not on production or localhost, do a health check\n\t\tif (\n\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t) {\n\t\t\ttry {\n\t\t\t\tlet instanceId = await axios.get('http://169.254.169.254/latest/meta-data/instance-id');\n\n\t\t\t\tsetInterval(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait axios.post('https://backend.resolveio.com/api/health', {\n\t\t\t\t\t\t\ttype: 'application',\n\t\t\t\t\t\t\tid_aws_instance: instanceId.data,\n\t\t\t\t\t\t\tversion: typeof process.env.APP_VERSION === 'number'\n\t\t\t\t\t\t\t\t? (<any>process.env.APP_VERSION).toString()\n\t\t\t\t\t\t\t\t: process.env.APP_VERSION,\n\t\t\t\t\t\t\tversion_key: process.env.APP_VERSION_KEY\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tcatch {}\n\t\t\t\t}, 10000);\n\t\t\t}\n\t\t\tcatch {}\n\t\t}\n\n\t\tlet lastCPU = this.cpuAverage();\n\n\t\tsetInterval(async () => {\n\t\t\tlet now = new Date();\n\t\t\tvar endMeasure = this.cpuAverage();\n\t\t\tvar idleDifference = endMeasure.idle - lastCPU.idle;\n\t\t\tvar totalDifference = endMeasure.total - lastCPU.total;\n\t\t\tvar percentageCPU = 1 - idleDifference / totalDifference;\n\n\t\t\t// Original local code\n\t\t\tif (\n\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'https://resolveio.com'\n\t\t\t|| ResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200'\n\t\t\t) {\n\t\t\t\tawait MonitorCPUs.create({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t},\n\t\t\t\t\tdate: now,\n\t\t\t\t\tapp: percentageCPU,\n\t\t\t\t\tsystem: os.loadavg()[0]\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.pushMonitorData({\n\t\t\t\t\ttype: 'monitor-cpu',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdate: now,\n\t\t\t\t\t\tapp: percentageCPU,\n\t\t\t\t\t\tsystem: os.loadavg()[0]\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlastCPU = endMeasure;\n\n\t\t\tconst memUsage = process.memoryUsage();\n\n\t\t\tif (\n\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'https://resolveio.com'\n\t\t\t|| ResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200'\n\t\t\t) {\n\t\t\t\tawait MonitorMemorys.create({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t},\n\t\t\t\t\tdate: now,\n\t\t\t\t\tphysical_total: memUsage.heapTotal,\n\t\t\t\t\tphysical_used: memUsage.heapUsed,\n\t\t\t\t\tphysical_free: os.freemem(),\n\t\t\t\t\tvirtual: memUsage.rss,\n\t\t\t\t\tprivate: memUsage.external,\n\t\t\t\t\tphysical: os.totalmem()\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.pushMonitorData({\n\t\t\t\t\ttype: 'monitor-memory',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdate: now,\n\t\t\t\t\t\tphysical_total: memUsage.heapTotal,\n\t\t\t\t\t\tphysical_used: memUsage.heapUsed,\n\t\t\t\t\t\tphysical_free: os.freemem(),\n\t\t\t\t\t\tvirtual: memUsage.rss,\n\t\t\t\t\t\tprivate: memUsage.external,\n\t\t\t\t\t\tphysical: os.totalmem(),\n\t\t\t\t\t\ttype: 'memory'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}, 3000);\n\t}\n\n\tasync addMongoTracker(data: MongoMonitorModel) {\n\t\tif (\n\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'https://resolveio.com'\n\t\t\t|| ResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200'\n\t\t) {\n\t\t\tif (!data.collection.startsWith('monitor-')) {\n\t\t\t\tawait MonitorMongos.create({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t},\n\t\t\t\t\tdate: new Date(data.date),\n\t\t\t\t\tmethod: data.method,\n\t\t\t\t\tdoc_collection: data.collection,\n\t\t\t\t\tduration: data.duration,\n\t\t\t\t\tquery: Buffer.byteLength(data.query, 'utf8') < 15800000\n\t\t\t\t\t\t? data.query\n\t\t\t\t\t\t: 'Too Big'\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this._instanceHostname) {\n\t\t\t\tthis.pushMonitorData({\n\t\t\t\t\ttype: 'monitor-mongo',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdate: new Date(data.date),\n\t\t\t\t\t\tmethod: data.method,\n\t\t\t\t\t\tdoc_collection: data.collection,\n\t\t\t\t\t\tduration: data.duration,\n\t\t\t\t\t\tquery: Buffer.byteLength(data.query, 'utf8') < 15800000\n\t\t\t\t\t\t\t? data.query\n\t\t\t\t\t\t\t: 'Too Big'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tasync addFunctionTracker(data: MonitorFunction) {\n\t\tif (typeof(data.data) !== 'string') {\n\t\t\tdata.data = JSON.stringify(data.data);\n\t\t}\n\n\t\tif (\n\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'https://resolveio.com'\n\t\t\t|| ResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200'\n\t\t) {\n\t\t\tawait MonitorFunctions.create({\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\tmetadata: {\n\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t},\n\t\t\t\tdate: new Date(data.startTime),\n\t\t\t\ttype: data.functionType,\n\t\t\t\tname: data.functionName,\n\t\t\t\tuser: data.user,\n\t\t\t\tduration: data.duration,\n\t\t\t\tdata: Buffer.byteLength(data.data, 'utf8') < 15800000\n\t\t\t\t\t? data.data\n\t\t\t\t\t: 'Too Big'\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tif (this._instanceHostname) {\n\t\t\t\tthis.pushMonitorData({\n\t\t\t\t\ttype: 'monitor-function',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tinstance: this._instanceHostname,\n\t\t\t\t\t\t\tclient: ResolveIOServer.getServerConfig()['CLIENT_NAME']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdate: new Date(data.startTime),\n\t\t\t\t\t\ttype: data.functionType,\n\t\t\t\t\t\tname: data.functionName,\n\t\t\t\t\t\tuser: data.user,\n\t\t\t\t\t\tduration: data.duration,\n\t\t\t\t\t\tdata: Buffer.byteLength(data.data, 'utf8') < 15800000\n\t\t\t\t\t\t\t? data.data\n\t\t\t\t\t\t\t: 'Too Big'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate pushMonitorData(data: LocalLogModel) {\n\t\tthis._monitorData.push(data);\n\n\t\t// If data is huge, flush immediately to file\n\t\tif (this.estimateBatchSize() >= MAX_BATCH_SIZE) {\n\t\t\tthis.flushMonitorData();\n\t\t}\n\t}\n\n\tprivate estimateBatchSize(): number {\n\t\treturn this._monitorData.reduce((total, item) => {\n\t\t\treturn total + Buffer.byteLength(JSON.stringify(item));\n\t\t}, 0);\n\t}\n\n\tsetupEventLoop() {\n\t\t// Flush every 2.5 seconds\n\t\tsetInterval(() => {\n\t\t\tif (this._monitorData.length > 0) {\n\t\t\t\tthis.flushMonitorData();\n\t\t\t}\n\t\t}, 2500);\n\t}\n\n\tprivate flushMonitorData() {\n\t\tconst batch = [];\n\t\tlet batchSize = 0;\n\n\t\twhile (this._monitorData.length > 0 && batchSize < MAX_BATCH_SIZE) {\n\t\t\tconst item = this._monitorData.shift();\n\t\t\tconst itemSize = Buffer.byteLength(JSON.stringify(item));\n\n\t\t\tif ((batchSize + itemSize) > MAX_BATCH_SIZE && batch.length > 0) {\n\t\t\t\t// put the item back for next round\n\t\t\t\tthis._monitorData.unshift(item);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbatch.push(item);\n\t\t\tbatchSize += itemSize;\n\t\t}\n\n\t\ttry {\n\t\t\t// Now, instead of calling an external HTTP endpoint, we write the batch to disk:\n\t\t\tResolveIOServer.getLocalLogManager().writeLogs(batch);\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'MonitorManager', 'Failed to flush monitor data to file:', error);\n\t\t}\n\t}\n}\n\nexport interface MongoMonitorModel {\n\tdate: Date;\n\tmethod: string;\n\tcollection: string;\n\tduration: number;\n\tquery: string;\n}\n\nexport class MonitorMongo {\n\tprivate _startTime = 0;\n\tprivate _method = '';\n\tprivate _collection = '';\n\tprivate _query = '';\n\n\tconstructor() {}\n\n\tstatic create(method: string, collection: string, query: string) {\n\t\tconst monitorMongo = new MonitorMongo();\n\t\tmonitorMongo.initialize(method, collection, query);\n\t\treturn monitorMongo;\n\t}\n\n\tprivate initialize(method: string, collection: string, query: string) {\n\t\tthis._startTime = Date.now();\n\t\tthis._method = method;\n\t\tthis._collection = collection;\n\t\tthis._query = query;\n\t}\n\n\tpublic async finish() {\n\t\tlet endTime = Date.now();\n\n\t\tlet mongoMonitor: MongoMonitorModel = {\n\t\t\tdate: new Date(endTime),\n\t\t\tmethod: this._method,\n\t\t\tcollection: this._collection,\n\t\t\tquery: this._query,\n\t\t\tduration: endTime - this._startTime\n\t\t};\n\n\t\tawait ResolveIOServer.getMainServer().getMonitorManager().addMongoTracker(mongoMonitor);\n\t}\n}\n\nexport class MonitorManagerFunction {\n\tprivate _functionCnt = 0;\n\tprivate _functions: MonitorFunction[] = [];\n\tprivate _functionLastCompletedWS: { [id_socket: string]: MonitorFunction; } = {};\n\tprivate _functionLastCompleted: MonitorFunction;\n\n\tconstructor() {}\n\n\tstatic create() {\n\t\tconst monitorManagerFunction = new MonitorManagerFunction();\n\t\tmonitorManagerFunction.initialize();\n\t\treturn monitorManagerFunction;\n\t}\n\n\tprivate initialize() {\n\n\t}\n\n\tstartMonitorFunction(\n\t\tfunctionType: MonitorFunctionType,\n\t\tfunctionName: string,\n\t\tuser: string,\n\t\tid_socket: string,\n\t\tdata: any\n\t) {\n\t\tlet newMonitorFunction = MonitorFunction.create(\n\t\t\tthis._functionCnt++,\n\t\t\tfunctionType,\n\t\t\tfunctionName,\n\t\t\tuser,\n\t\t\tid_socket,\n\t\t\tdata\n\t\t);\n\n\t\tthis._functions.push(newMonitorFunction);\n\t\treturn newMonitorFunction.id;\n\t}\n\n\tasync finishMonitorFunction(id: number) {\n\t\tlet monitor = this._functions.find(a => a.id === id);\n\n\t\tif (monitor) {\n\t\t\tawait monitor.finish();\n\t\t\tthis._functionLastCompleted = monitor;\n\t\t\tthis._functionLastCompletedWS[monitor.id_socket] = monitor;\n\t\t\tthis._functions.splice(\n\t\t\t\tthis._functions.map(a => a.id).indexOf(id),\n\t\t\t\t1\n\t\t\t);\n\t\t}\n\t}\n\n\tgetActiveMonitorFunctions() {\n\t\treturn this._functions;\n\t}\n\n\tgetLastCompletedMonitorFunction() {\n\t\treturn this._functionLastCompleted;\n\t}\n\n\tgetLastCompletedMonitorFunctionWS() {\n\t\treturn this._functionLastCompletedWS;\n\t}\n}\n\nexport type MonitorFunctionType =\n\t'Cron Method'\n\t| 'Method'\n\t| 'User Specific Publication'\n\t| 'Publication';\n\nexport class MonitorFunction {\n\tprivate _timer: NodeJS.Timeout = null;\n\tpublic duration = 0;\n\tpublic functionType: MonitorFunctionType;\n\tpublic functionName: string;\n\tpublic user: string;\n\tpublic data: any;\n\tpublic startTime: Date = null;\n\tpublic endTime: Date = null;\n\tpublic lastTime: Date = null;\n\tpublic id_socket = '';\n\tpublic id = 0;\n\n\tconstructor() {}\n\n\tstatic create(\n\t\tid: number,\n\t\tfunctionType: MonitorFunctionType,\n\t\tfunctionName: string,\n\t\tuser: string,\n\t\tid_socket: string,\n\t\tdata: any\n\t) {\n\t\tconst monitorFunction = new MonitorFunction();\n\t\tmonitorFunction.initialize(id, functionType, functionName, user, id_socket, data);\n\t\treturn monitorFunction;\n\t}\n\n\tprivate initialize(\n\t\tid: number,\n\t\tfunctionType: MonitorFunctionType,\n\t\tfunctionName: string,\n\t\tuser: string,\n\t\tid_socket: string,\n\t\tdata: any\n\t) {\n\t\tthis.id = id;\n\t\tthis.startTime = new Date();\n\t\tthis.functionType = functionType;\n\t\tthis.functionName = functionName;\n\t\tthis.user = user;\n\t\tthis.id_socket = id_socket;\n\t\tthis.data = data;\n\t\tthis.lastTime = new Date();\n\n\t\tthis._timer = setInterval(() => {\n\t\t\tlet diff = Date.now() - this.lastTime.getTime();\n\n\t\t\tif (diff > this.duration) {\n\t\t\t\tthis.duration = diff;\n\t\t\t}\n\n\t\t\tthis.lastTime = new Date();\n\t\t}, 1000);\n\t}\n\n\tpublic async finish() {\n\t\tif (this._timer) {\n\t\t\tclearInterval(this._timer);\n\t\t\tthis._timer = null;\n\t\t}\n\n\t\tthis.endTime = new Date();\n\n\t\tif (this.duration >= 5000) {\n\t\t\t// Optional slow function logging or email\n\t\t}\n\n\t\tawait ResolveIOServer.getMainServer().getMonitorManager().addFunctionTracker(this);\n\t}\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "20.7.21",
3
+ "version": "20.7.22",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",
@@ -1,2 +1,2 @@
1
- "use strict";var __awaiter=this&&this.__awaiter||function(e,o,t,v){return new(t=t||Promise)(function(n,r){function fulfilled(e){try{step(v.next(e))}catch(e){r(e)}}function rejected(e){try{step(v.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?n(e.value):((r=e.value)instanceof t?r:new t(function(e){e(r)})).then(fulfilled,rejected)}step((v=v.apply(e,o||[])).next())})},__generator=this&&this.__generator||function(o,t){var v,s,l,i={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]},a={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function verb(n){return function(e){var r=[n,e];if(v)throw new TypeError("Generator is already executing.");for(;i=a&&r[a=0]?0:i;)try{if(v=1,s&&(l=2&r[0]?s.return:r[0]?s.throw||((l=s.return)&&l.call(s),0):s.next)&&!(l=l.call(s,r[1])).done)return l;switch(s=0,(r=l?[2&r[0],l.value]:r)[0]){case 0:case 1:l=r;break;case 4:return i.label++,{value:r[1],done:!1};case 5:i.label++,s=r[1],r=[0];continue;case 7:r=i.ops.pop(),i.trys.pop();continue;default:if(!(l=0<(l=i.trys).length&&l[l.length-1])&&(6===r[0]||2===r[0])){i=0;continue}if(3===r[0]&&(!l||r[1]>l[0]&&r[1]<l[3]))i.label=r[1];else if(6===r[0]&&i.label<l[1])i.label=l[1],l=r;else{if(!(l&&i.label<l[2])){l[2]&&i.ops.pop(),i.trys.pop();continue}i.label=l[2],i.ops.push(r)}}r=t.call(o,i)}catch(e){r=[6,e],s=0}finally{v=l=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},mongodb_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResolveIOServer=void 0,require("mongodb")),ResolveIOServer=function(){function ResolveIOServer(){}return ResolveIOServer.create=function(n,o,t,v,s,l){return void 0===s&&(s=!0),void 0===l&&(l=!1),__awaiter(this,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return[4,(r=new ResolveIOServer).initialize(n,o,t,v,s,l)];case 1:return e.sent(),[2,r]}})})},ResolveIOServer.prototype.initialize=function(t,v,s,l,i,a){return void 0===i&&(i=!0),void 0===a&&(a=!1),__awaiter(this,void 0,void 0,function(){var r,n,o;return __generator(this,function(e){switch(e.label){case 0:ResolveIOServer._serverConfig=t,ResolveIOServer._clientRoutes=v,ResolveIOServer._client=s,ResolveIOServer._clientDir=l,ResolveIOServer._sesMail=i,ResolveIOServer._standardProgram=a,e.label=1;case 1:return e.trys.push([1,7,,8]),[4,mongodb_1.MongoClient.connect(ResolveIOServer.getServerConfig().MONGO_URL)];case 2:return r=e.sent(),ResolveIOServer.setMongoConnection(r),ResolveIOServer.setMainDB(r.db(ResolveIOServer.getServerConfig().DATABASE)),[4,Promise.resolve().then(function(){return require("./managers/local-log.manager")})];case 3:return r=e.sent().LocalLogManager,n=r.create(),ResolveIOServer.setLocalLogManager(n),[4,Promise.resolve().then(function(){return require("./managers/mongo.manager")})];case 4:return[4,e.sent().MongoManager.create()];case 5:return n=e.sent(),ResolveIOServer.setMongoManager(n),[4,Promise.resolve().then(function(){return require("./server-app")})];case 6:return o=e.sent().ResolveIOMainServer,o=o.create(),ResolveIOServer.setMainServer(o),[2,!0];case 7:return(o=e.sent()).message="Error in ResolveIOServer (initialize): Mongo Client Connect And Run ResolveIO Server App Library - "+o.message,process.exit(1),[3,8];case 8:return[2]}})})},ResolveIOServer.getClientName=function(){return this._client},ResolveIOServer.getMainServer=function(){return ResolveIOServer._mainServer},ResolveIOServer.setMainServer=function(e){ResolveIOServer._mainServer=e},ResolveIOServer.setMongoConnection=function(e){ResolveIOServer._mongoConnection=e},ResolveIOServer.getMongoConnection=function(){return ResolveIOServer._mongoConnection},ResolveIOServer.getMainDB=function(){return ResolveIOServer._mainDB},ResolveIOServer.setMainDB=function(e){ResolveIOServer._mainDB=e},ResolveIOServer.getMongoManager=function(){return ResolveIOServer._mongoManager},ResolveIOServer.setMongoManager=function(e){ResolveIOServer._mongoManager=e},ResolveIOServer.getLocalLogManager=function(){return ResolveIOServer._localLogManager},ResolveIOServer.setLocalLogManager=function(e){ResolveIOServer._localLogManager=e},ResolveIOServer.getServerConfig=function(){return ResolveIOServer._serverConfig},ResolveIOServer.getClientRoutes=function(){return ResolveIOServer._clientRoutes},ResolveIOServer.getClientDir=function(){return ResolveIOServer._clientDir},ResolveIOServer.getSESMail=function(){return ResolveIOServer._sesMail},ResolveIOServer.getStandardProgram=function(){return ResolveIOServer._standardProgram},ResolveIOServer._serverConfig=null,ResolveIOServer._clientRoutes=[],ResolveIOServer._mongoConnection=null,ResolveIOServer._mainDB=null,ResolveIOServer._mainServer=null,ResolveIOServer._localLogManager=null,ResolveIOServer._mongoManager=null,ResolveIOServer._client="",ResolveIOServer._clientDir="",ResolveIOServer._sesMail=!0,ResolveIOServer._standardProgram=!1,ResolveIOServer}();exports.ResolveIOServer=ResolveIOServer;
1
+ "use strict";var __awaiter=this&&this.__awaiter||function(e,o,t,v){return new(t=t||Promise)(function(n,r){function fulfilled(e){try{step(v.next(e))}catch(e){r(e)}}function rejected(e){try{step(v.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?n(e.value):((r=e.value)instanceof t?r:new t(function(e){e(r)})).then(fulfilled,rejected)}step((v=v.apply(e,o||[])).next())})},__generator=this&&this.__generator||function(o,t){var v,s,l,i={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]},a={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function verb(n){return function(e){var r=[n,e];if(v)throw new TypeError("Generator is already executing.");for(;i=a&&r[a=0]?0:i;)try{if(v=1,s&&(l=2&r[0]?s.return:r[0]?s.throw||((l=s.return)&&l.call(s),0):s.next)&&!(l=l.call(s,r[1])).done)return l;switch(s=0,(r=l?[2&r[0],l.value]:r)[0]){case 0:case 1:l=r;break;case 4:return i.label++,{value:r[1],done:!1};case 5:i.label++,s=r[1],r=[0];continue;case 7:r=i.ops.pop(),i.trys.pop();continue;default:if(!(l=0<(l=i.trys).length&&l[l.length-1])&&(6===r[0]||2===r[0])){i=0;continue}if(3===r[0]&&(!l||r[1]>l[0]&&r[1]<l[3]))i.label=r[1];else if(6===r[0]&&i.label<l[1])i.label=l[1],l=r;else{if(!(l&&i.label<l[2])){l[2]&&i.ops.pop(),i.trys.pop();continue}i.label=l[2],i.ops.push(r)}}r=t.call(o,i)}catch(e){r=[6,e],s=0}finally{v=l=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},mongodb_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResolveIOServer=void 0,require("mongodb")),ResolveIOServer=function(){function ResolveIOServer(){}return ResolveIOServer.create=function(n,o,t,v,s,l){return void 0===s&&(s=!0),void 0===l&&(l=!1),__awaiter(this,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return[4,(r=new ResolveIOServer).initialize(n,o,t,v,s,l)];case 1:return e.sent(),[2,r]}})})},ResolveIOServer.prototype.initialize=function(t,v,s,l,i,a){return void 0===i&&(i=!0),void 0===a&&(a=!1),__awaiter(this,void 0,void 0,function(){var r,n,o;return __generator(this,function(e){switch(e.label){case 0:ResolveIOServer._serverConfig=t,ResolveIOServer._clientRoutes=v,ResolveIOServer._client=s,ResolveIOServer._clientDir=l,ResolveIOServer._sesMail=i,ResolveIOServer._standardProgram=a,e.label=1;case 1:return e.trys.push([1,8,,9]),[4,mongodb_1.MongoClient.connect(ResolveIOServer.getServerConfig().MONGO_URL)];case 2:return r=e.sent(),ResolveIOServer.setMongoConnection(r),ResolveIOServer.setMainDB(r.db(ResolveIOServer.getServerConfig().DATABASE)),[4,Promise.resolve().then(function(){return require("./managers/local-log.manager")})];case 3:return r=e.sent().LocalLogManager,n=r.create(),ResolveIOServer.setLocalLogManager(n),[4,Promise.resolve().then(function(){return require("./managers/mongo.manager")})];case 4:return[4,e.sent().MongoManager.create()];case 5:return n=e.sent(),ResolveIOServer.setMongoManager(n),[4,Promise.resolve().then(function(){return require("./server-app")})];case 6:return[4,e.sent().ResolveIOMainServer.create()];case 7:return o=e.sent(),ResolveIOServer.setMainServer(o),[2,!0];case 8:return(o=e.sent()).message="Error in ResolveIOServer (initialize): Mongo Client Connect And Run ResolveIO Server App Library - "+o.message,process.exit(1),[3,9];case 9:return[2]}})})},ResolveIOServer.getClientName=function(){return this._client},ResolveIOServer.getMainServer=function(){return ResolveIOServer._mainServer},ResolveIOServer.setMainServer=function(e){ResolveIOServer._mainServer=e},ResolveIOServer.setMongoConnection=function(e){ResolveIOServer._mongoConnection=e},ResolveIOServer.getMongoConnection=function(){return ResolveIOServer._mongoConnection},ResolveIOServer.getMainDB=function(){return ResolveIOServer._mainDB},ResolveIOServer.setMainDB=function(e){ResolveIOServer._mainDB=e},ResolveIOServer.getMongoManager=function(){return ResolveIOServer._mongoManager},ResolveIOServer.setMongoManager=function(e){ResolveIOServer._mongoManager=e},ResolveIOServer.getLocalLogManager=function(){return ResolveIOServer._localLogManager},ResolveIOServer.setLocalLogManager=function(e){ResolveIOServer._localLogManager=e},ResolveIOServer.getServerConfig=function(){return ResolveIOServer._serverConfig},ResolveIOServer.getClientRoutes=function(){return ResolveIOServer._clientRoutes},ResolveIOServer.getClientDir=function(){return ResolveIOServer._clientDir},ResolveIOServer.getSESMail=function(){return ResolveIOServer._sesMail},ResolveIOServer.getStandardProgram=function(){return ResolveIOServer._standardProgram},ResolveIOServer._serverConfig=null,ResolveIOServer._clientRoutes=[],ResolveIOServer._mongoConnection=null,ResolveIOServer._mainDB=null,ResolveIOServer._mainServer=null,ResolveIOServer._localLogManager=null,ResolveIOServer._mongoManager=null,ResolveIOServer._client="",ResolveIOServer._clientDir="",ResolveIOServer._sesMail=!0,ResolveIOServer._standardProgram=!1,ResolveIOServer}();exports.ResolveIOServer=ResolveIOServer;
2
2
  //# sourceMappingURL=resolveio-server-app.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/resolveio-server-app.ts"],"names":["mongodb_1","require","ResolveIOServer","create","serverConfig","clientRoutes","client","clientDir","sesMail","standardProgram","resolveioServer","initialize","_a","sent","prototype","_serverConfig","_clientRoutes","_client","_clientDir","_sesMail","_standardProgram","MongoClient","connect","getServerConfig","dbConnection","setMongoConnection","setMainDB","db","Promise","resolve","then","LocalLogManager_1","LocalLogManager","localLogManager","setLocalLogManager","MongoManager","mongoManager","setMongoManager","serverApp","ResolveIOMainServer","app","setMainServer","message","err_1","process","exit","getClientName","this","getMainServer","_mainServer","mainServer","mongoConnection","_mongoConnection","getMongoConnection","getMainDB","_mainDB","mainDB","getMongoManager","_mongoManager","getLocalLogManager","_localLogManager","getClientRoutes","getClientDir","getSESMail","getStandardProgram","exports"],"mappings":"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","file":"resolveio-server-app.js","sourcesContent":["import { Db, MongoClient } from 'mongodb';\nimport { LocalLogManager } from './managers/local-log.manager';\nimport { MongoManager } from './managers/mongo.manager';\nimport { ResolveIOMainServer } from './server-app';\n\nexport class ResolveIOServer {\n\tprivate static _serverConfig = null;\n\tprivate static _clientRoutes = [];\n\tprivate static _mongoConnection: MongoClient = null;\n\tprivate static _mainDB: Db = null;\n\tprivate static _mainServer = null;\n\tprivate static _localLogManager = null;\n\tprivate static _mongoManager = null;\n\tprivate static _client = '';\n\tprivate static _clientDir = '';\n\tprivate static _sesMail = true;\n\tprivate static _standardProgram = false;\n\n\tconstructor() {}\n\t\n\tpublic static async create(serverConfig, clientRoutes: string[], client: string, clientDir, sesMail = true, standardProgram = false) {\n\t\tconst resolveioServer = new ResolveIOServer();\n\t\tawait resolveioServer.initialize(serverConfig, clientRoutes, client, clientDir, sesMail, standardProgram);\n\t\treturn resolveioServer;\n\t}\n\n\tprivate async initialize(serverConfig, clientRoutes: string[], client: string, clientDir, sesMail = true, standardProgram = false) {\n\t\tResolveIOServer._serverConfig = serverConfig;\n\t\tResolveIOServer._clientRoutes = clientRoutes;\n\t\tResolveIOServer._client = client;\n\t\tResolveIOServer._clientDir = clientDir;\n\t\tResolveIOServer._sesMail = sesMail;\n\t\tResolveIOServer._standardProgram = standardProgram;\n\t\t\n\t\ttry {\n\t\t\tlet dbConnection = await MongoClient.connect(ResolveIOServer.getServerConfig()['MONGO_URL']);\n\t\t\tResolveIOServer.setMongoConnection(dbConnection);\n\t\t\tResolveIOServer.setMainDB(dbConnection.db(ResolveIOServer.getServerConfig()['DATABASE']));\n\t\n\t\t\tlet LocalLogManager = (await import('./managers/local-log.manager')).LocalLogManager;\n\t\t\tlet localLogManager = LocalLogManager.create();\n\t\t\tResolveIOServer.setLocalLogManager(localLogManager);\n\n\t\t\tlet MongoManager = (await import('./managers/mongo.manager')).MongoManager;\n\t\t\tlet mongoManager = await MongoManager.create();\n\t\t\tResolveIOServer.setMongoManager(mongoManager);\n\t\t\t\n\t\t\tlet serverApp = (await import('./server-app')).ResolveIOMainServer;\n\t\t\tlet app = serverApp.create();\n\t\t\tResolveIOServer.setMainServer(app);\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\tcatch (err) {\n\t\t\terr.message = 'Error in ResolveIOServer (initialize): Mongo Client Connect And Run ResolveIO Server App Library - ' + err.message;\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tpublic static getClientName() {\n\t\treturn this._client;\n\t}\n\n\tpublic static getMainServer(): ResolveIOMainServer {\n\t\treturn ResolveIOServer._mainServer;\n\t}\n\n\tpublic static setMainServer(mainServer: ResolveIOMainServer) {\n\t\tResolveIOServer._mainServer = mainServer;\n\t}\n\n\tpublic static setMongoConnection(mongoConnection: MongoClient) {\n\t\tResolveIOServer._mongoConnection = mongoConnection;\n\t}\n\n\tpublic static getMongoConnection(): MongoClient {\n\t\treturn ResolveIOServer._mongoConnection;\n\t}\n\n\tpublic static getMainDB(): Db {\n\t\treturn ResolveIOServer._mainDB;\n\t}\n\n\tpublic static setMainDB(mainDB: Db) {\n\t\tResolveIOServer._mainDB = mainDB\n\t}\n\n\tpublic static getMongoManager(): MongoManager {\n\t\treturn ResolveIOServer._mongoManager;\n\t}\n\n\tpublic static setMongoManager(mongoManager: MongoManager) {\n\t\tResolveIOServer._mongoManager = mongoManager;\n\t}\n\n\tpublic static getLocalLogManager(): LocalLogManager {\n\t\treturn ResolveIOServer._localLogManager;\n\t}\n\n\tpublic static setLocalLogManager(localLogManager: LocalLogManager) {\n\t\tResolveIOServer._localLogManager = localLogManager;\n\t}\n\n\tpublic static getServerConfig() {\n\t\treturn ResolveIOServer._serverConfig;\n\t}\n\n\tpublic static getClientRoutes() {\n\t\treturn ResolveIOServer._clientRoutes;\n\t}\n\n\tpublic static getClientDir(): string {\n\t\treturn ResolveIOServer._clientDir;\n\t}\n\n\tpublic static getSESMail(): boolean {\n\t\treturn ResolveIOServer._sesMail;\n\t}\n\n\tpublic static getStandardProgram(): boolean {\n\t\treturn ResolveIOServer._standardProgram;\n\t}\n}"]}
1
+ {"version":3,"sources":["../../src/resolveio-server-app.ts"],"names":["mongodb_1","require","ResolveIOServer","create","serverConfig","clientRoutes","client","clientDir","sesMail","standardProgram","resolveioServer","initialize","_a","sent","prototype","_serverConfig","_clientRoutes","_client","_clientDir","_sesMail","_standardProgram","MongoClient","connect","getServerConfig","dbConnection","setMongoConnection","setMainDB","db","Promise","resolve","then","LocalLogManager_1","LocalLogManager","localLogManager","setLocalLogManager","MongoManager","mongoManager","setMongoManager","ResolveIOMainServer","app","setMainServer","message","err_1","process","exit","getClientName","this","getMainServer","_mainServer","mainServer","mongoConnection","_mongoConnection","getMongoConnection","getMainDB","_mainDB","mainDB","getMongoManager","_mongoManager","getLocalLogManager","_localLogManager","getClientRoutes","getClientDir","getSESMail","getStandardProgram","exports"],"mappings":"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","file":"resolveio-server-app.js","sourcesContent":["import { Db, MongoClient } from 'mongodb';\nimport { LocalLogManager } from './managers/local-log.manager';\nimport { MongoManager } from './managers/mongo.manager';\nimport { ResolveIOMainServer } from './server-app';\n\nexport class ResolveIOServer {\n\tprivate static _serverConfig = null;\n\tprivate static _clientRoutes = [];\n\tprivate static _mongoConnection: MongoClient = null;\n\tprivate static _mainDB: Db = null;\n\tprivate static _mainServer = null;\n\tprivate static _localLogManager = null;\n\tprivate static _mongoManager = null;\n\tprivate static _client = '';\n\tprivate static _clientDir = '';\n\tprivate static _sesMail = true;\n\tprivate static _standardProgram = false;\n\n\tconstructor() {}\n\t\n\tpublic static async create(serverConfig, clientRoutes: string[], client: string, clientDir, sesMail = true, standardProgram = false) {\n\t\tconst resolveioServer = new ResolveIOServer();\n\t\tawait resolveioServer.initialize(serverConfig, clientRoutes, client, clientDir, sesMail, standardProgram);\n\t\treturn resolveioServer;\n\t}\n\n\tprivate async initialize(serverConfig, clientRoutes: string[], client: string, clientDir, sesMail = true, standardProgram = false) {\n\t\tResolveIOServer._serverConfig = serverConfig;\n\t\tResolveIOServer._clientRoutes = clientRoutes;\n\t\tResolveIOServer._client = client;\n\t\tResolveIOServer._clientDir = clientDir;\n\t\tResolveIOServer._sesMail = sesMail;\n\t\tResolveIOServer._standardProgram = standardProgram;\n\t\t\n\t\ttry {\n\t\t\tlet dbConnection = await MongoClient.connect(ResolveIOServer.getServerConfig()['MONGO_URL']);\n\t\t\tResolveIOServer.setMongoConnection(dbConnection);\n\t\t\tResolveIOServer.setMainDB(dbConnection.db(ResolveIOServer.getServerConfig()['DATABASE']));\n\t\n\t\t\tlet LocalLogManager = (await import('./managers/local-log.manager')).LocalLogManager;\n\t\t\tlet localLogManager = LocalLogManager.create();\n\t\t\tResolveIOServer.setLocalLogManager(localLogManager);\n\n\t\t\tlet MongoManager = (await import('./managers/mongo.manager')).MongoManager;\n\t\t\tlet mongoManager = await MongoManager.create();\n\t\t\tResolveIOServer.setMongoManager(mongoManager);\n\t\t\t\n\t\t\tlet serverApp = (await import('./server-app')).ResolveIOMainServer;\n\t\t\tlet app = await serverApp.create();\n\t\t\tResolveIOServer.setMainServer(app);\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\tcatch (err) {\n\t\t\terr.message = 'Error in ResolveIOServer (initialize): Mongo Client Connect And Run ResolveIO Server App Library - ' + err.message;\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tpublic static getClientName() {\n\t\treturn this._client;\n\t}\n\n\tpublic static getMainServer(): ResolveIOMainServer {\n\t\treturn ResolveIOServer._mainServer;\n\t}\n\n\tpublic static setMainServer(mainServer: ResolveIOMainServer) {\n\t\tResolveIOServer._mainServer = mainServer;\n\t}\n\n\tpublic static setMongoConnection(mongoConnection: MongoClient) {\n\t\tResolveIOServer._mongoConnection = mongoConnection;\n\t}\n\n\tpublic static getMongoConnection(): MongoClient {\n\t\treturn ResolveIOServer._mongoConnection;\n\t}\n\n\tpublic static getMainDB(): Db {\n\t\treturn ResolveIOServer._mainDB;\n\t}\n\n\tpublic static setMainDB(mainDB: Db) {\n\t\tResolveIOServer._mainDB = mainDB\n\t}\n\n\tpublic static getMongoManager(): MongoManager {\n\t\treturn ResolveIOServer._mongoManager;\n\t}\n\n\tpublic static setMongoManager(mongoManager: MongoManager) {\n\t\tResolveIOServer._mongoManager = mongoManager;\n\t}\n\n\tpublic static getLocalLogManager(): LocalLogManager {\n\t\treturn ResolveIOServer._localLogManager;\n\t}\n\n\tpublic static setLocalLogManager(localLogManager: LocalLogManager) {\n\t\tResolveIOServer._localLogManager = localLogManager;\n\t}\n\n\tpublic static getServerConfig() {\n\t\treturn ResolveIOServer._serverConfig;\n\t}\n\n\tpublic static getClientRoutes() {\n\t\treturn ResolveIOServer._clientRoutes;\n\t}\n\n\tpublic static getClientDir(): string {\n\t\treturn ResolveIOServer._clientDir;\n\t}\n\n\tpublic static getSESMail(): boolean {\n\t\treturn ResolveIOServer._sesMail;\n\t}\n\n\tpublic static getStandardProgram(): boolean {\n\t\treturn ResolveIOServer._standardProgram;\n\t}\n}"]}
package/server-app.d.ts CHANGED
@@ -38,10 +38,10 @@ export declare class ResolveIOMainServer {
38
38
  private _taskQueue;
39
39
  private _inFlightRequests;
40
40
  constructor();
41
- static create(): ResolveIOMainServer;
41
+ static create(): Promise<ResolveIOMainServer>;
42
42
  private initialize;
43
43
  private startServerInstance;
44
- private startWorkerInstance;
44
+ startWorkerInstance(): void;
45
45
  private handleIncomingTask;
46
46
  private sendWorkerResponse;
47
47
  private safeShutdown;
package/server-app.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var __awaiter=this&&this.__awaiter||function(e,n,s,o){return new(s=s||Promise)(function(t,r){function fulfilled(e){try{step(o.next(e))}catch(e){r(e)}}function rejected(e){try{step(o.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?t(e.value):((r=e.value)instanceof s?r:new s(function(e){e(r)})).then(fulfilled,rejected)}step((o=o.apply(e,n||[])).next())})},__generator=this&&this.__generator||function(n,s){var o,i,a,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},l={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function verb(t){return function(e){var r=[t,e];if(o)throw new TypeError("Generator is already executing.");for(;c=l&&r[l=0]?0:c;)try{if(o=1,i&&(a=2&r[0]?i.return:r[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,r[1])).done)return a;switch(i=0,(r=a?[2&r[0],a.value]:r)[0]){case 0:case 1:a=r;break;case 4:return c.label++,{value:r[1],done:!1};case 5:c.label++,i=r[1],r=[0];continue;case 7:r=c.ops.pop(),c.trys.pop();continue;default:if(!(a=0<(a=c.trys).length&&a[a.length-1])&&(6===r[0]||2===r[0])){c=0;continue}if(3===r[0]&&(!a||r[1]>a[0]&&r[1]<a[3]))c.label=r[1];else if(6===r[0]&&c.label<a[1])c.label=a[1],a=r;else{if(!(a&&c.label<a[2])){a[2]&&c.ops.pop(),c.trys.pop();continue}c.label=a[2],c.ops.push(r)}}r=s.call(n,c)}catch(e){r=[6,e],i=0}finally{o=a=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},__read=this&&this.__read||function(e,r){var t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var n,s,o=t.call(e),i=[];try{for(;(void 0===r||0<r--)&&!(n=o.next()).done;)i.push(n.value)}catch(e){s={error:e}}finally{try{n&&!n.done&&(t=o.return)&&t.call(o)}finally{if(s)throw s.error}}return i},__spreadArray=this&&this.__spreadArray||function(e,r,t){if(t||2===arguments.length)for(var n,s=0,o=r.length;s<o;s++)!n&&s in r||((n=n||Array.prototype.slice.call(r,0,s))[s]=r[s]);return e.concat(n||Array.prototype.slice.call(r))},__values=this&&this.__values||function(e){var r="function"==typeof Symbol&&Symbol.iterator,t=r&&e[r],n=0;if(t)return t.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&n>=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(r?"Object is not iterable.":"Symbol.iterator is not defined.")},bodyParser=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResolveIOMainServer=void 0,require("body-parser")),express=require("express"),xmlParser=require("express-xml-bodyparser"),http_1=require("http"),jwt=require("jsonwebtoken"),moment=require("moment-timezone"),WebSocket=require("ws"),log_collection_1=require("./collections/log.collection"),user_collection_1=require("./collections/user.collection"),cron_manager_1=require("./managers/cron.manager"),method_manager_1=require("./managers/method.manager"),monitor_manager_1=require("./managers/monitor.manager"),subscription_manager_1=require("./managers/subscription.manager"),common_1=require("./util/common"),mongodb_1=require("mongodb"),auth_1=require("./http/auth"),health_1=require("./http/health"),home_1=require("./http/home"),websocket_manager_1=require("./managers/websocket.manager"),resolveio_server_app_1=require("./resolveio-server-app"),ResolveIOMainServer=function(){function ResolveIOMainServer(){this._offlineUpdates=[],this.sesMail=!1,this.standardProgram=!1,this.publicProgram=!1,this._rebootFlag=!1,this._runningTasks=[],this.LOGGER="ERROR",this._clientRoutes=[],this._lastErrorMsg=null,this._debugMsgRecv=0,this._debugMsgQueue=0,this._isWorkersEnabled=!1,this._isWorkerInstance=!1,this._safeShutdown=!1,this._workers=[],this._taskQueue=[],this._inFlightRequests={}}return ResolveIOMainServer.create=function(){var e=new ResolveIOMainServer;return e.initialize(),e},ResolveIOMainServer.prototype.initialize=function(){var e=this,o=(this._serverStartTime=new Date,this._lastErrorMsg=null,this._monitorManager=new monitor_manager_1.MonitorManager,this._monitorManagerFunction=new monitor_manager_1.MonitorManagerFunction,this._isWorkersEnabled="true"===process.env.IS_WORKERS_ENABLED,this._isWorkerInstance="true"===process.env.IS_WORKER_INSTANCE,setInterval(function(){e._subscriptionManager&&e._subscriptionManager.getEnableDebug()&&(console.log(new Date,"Server App","Msg Recv Hits",e._debugMsgRecv),console.log(new Date,"Server App","Msg Queue Hits",e._debugMsgQueue)),e._debugMsgQueue=0,e._debugMsgRecv=0},6e4),!1);setTimeout(function(){o=!0},5e3),process.on("unhandledRejection",function(n,s){return __awaiter(e,void 0,void 0,function(){var r,t=this;return __generator(this,function(e){switch(e.label){case 0:return n&&"MongoError"===n.name&&48===n.code?[2]:n&&"MongoServerError"===n.name&&!o?[2]:(console.error(new Date,"Unhandled Rejection at Promise",[n,s]),r=moment().diff(this._serverStartTime,"seconds"),n&&("MongoNetworkTimeoutError"===n.name||n instanceof mongodb_1.MongoNetworkTimeoutError)?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - MongoNetworkTimeoutError - Quitting NodeJS - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify({name:n.name,message:n.message,stack:n.stack},null,2))]):[3,2]:[3,3]);case 1:e.sent(),process.exit(1),e.label=2;case 2:return[3,11];case 3:return n&&"MongoError"===n.name&&"not master"===n.message?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - Quitting NodeJS - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,5]:[3,6];case 4:e.sent(),e.label=5;case 5:return process.exit(1),[3,11];case 6:return n&&"MongoError"===n.name&&"not master and slaveOk=false"===n.message?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - Quitting NodeJS - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,8]:[3,9];case 7:e.sent(),e.label=8;case 8:return process.exit(1),[3,11];case 9:return n?"StatusError"!==n.name&&""!==n.message&&60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,11]:[3,11];case 10:e.sent(),e.label=11;case 11:return[2]}})})}),process.on("uncaughtException",function(t){return __awaiter(e,void 0,void 0,function(){var r=this;return __generator(this,function(e){switch(e.label){case 0:return(console.error(t,"Uncaught Exception thrown"),60<moment().diff(this._serverStartTime,"seconds")&&!this._lastErrorMsg)?(this._lastErrorMsg=new Date,setTimeout(function(){r._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Exception - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([t.name,t.message,t.stack],null,2))]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),process.on("SIGINT",function(){return __awaiter(e,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),process.on("SIGTERM",function(){return __awaiter(e,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),process.on("SIGQUIT",function(){return __awaiter(e,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),"DEBUG"===this.LOGGER&&console.log("Starting ResolveIO Server"),this._isWorkersEnabled?this._isWorkerInstance?(console.log("Running as a Worker instance"),this._methodManager=method_manager_1.MethodManager.create(null,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._cronManager=cron_manager_1.CronManager.create(),this.startWorkerInstance()):(console.log("Running as a Server instance"),this._websocketManager=websocket_manager_1.WebSocketManager.create(this),this.startServerInstance(),this._methodManager=method_manager_1.MethodManager.create(this._websocketManager,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=subscription_manager_1.SubscriptionManager.create(this._serverWSS,resolveio_server_app_1.ResolveIOServer.getServerConfig(),this._monitorManagerFunction),this.listen()):(console.log("Running with Workers Disabled"),this._websocketManager=websocket_manager_1.WebSocketManager.create(this),this.startServerInstance(),this._methodManager=method_manager_1.MethodManager.create(this._websocketManager,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=subscription_manager_1.SubscriptionManager.create(this._serverWSS,resolveio_server_app_1.ResolveIOServer.getServerConfig(),this._monitorManagerFunction),this._cronManager=cron_manager_1.CronManager.create(),this.listen())},ResolveIOMainServer.prototype.startServerInstance=function(){this._app=express(),this._app.use(bodyParser.json({limit:"50mb",reviver:common_1.dateReviver})),this._app.use(bodyParser.urlencoded({limit:"50mb",extended:!0,parameterLimit:1e6})),this._app.use(xmlParser()),this._portHTTP=process.env.PORT_HTTP||resolveio_server_app_1.ResolveIOServer.getServerConfig().PORT_HTTP||8080,this._portWSS=process.env.PORT_WSS||resolveio_server_app_1.ResolveIOServer.getServerConfig().PORT_WSS||8081,"DEBUG"===this.LOGGER&&console.log("Setup ports"),this.createServer(),"DEBUG"===this.LOGGER&&console.log("Create server"),this._app.use(function(e,r,t){r.setHeader("Access-Control-Allow-Origin","*"),r.setHeader("Access-Control-Allow-Methods","GET, POST"),r.setHeader("Access-Control-Allow-Headers","X-Requested-With,content-type"),r.setHeader("Access-Control-Allow-Credentials","false"),t()}),"DEBUG"===this.LOGGER&&console.log("Setup cors"),(0,auth_1.setupAuthRoutes)(this,this._app,resolveio_server_app_1.ResolveIOServer.getServerConfig()),(0,health_1.setupHealthRoutes)(this._app),"ResolveIO"!==resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME&&!this.standardProgram||(0,home_1.setupHomeRoutes)(this,this._app,resolveio_server_app_1.ResolveIOServer.getServerConfig()),"DEBUG"===this.LOGGER&&console.log("Setup express routes")},ResolveIOMainServer.prototype.startWorkerInstance=function(){var e=this,r=(console.log(new Date,"Worker instance started, connecting to main server via WebSocket..."),resolveio_server_app_1.ResolveIOServer.getServerConfig().SERVER_URL+"/websocket?workerToken="+resolveio_server_app_1.ResolveIOServer.getServerConfig().WORKER_TOKEN),n=new WebSocket(r),s=null,t=null;n.on("open",function(){console.log(new Date,"Connected to main server as worker",process.env.WORKER_INDEX,process.env.NODE_APP_INSTANCE),e.sendWorkerResponse(n,"ping"),t=setInterval(function(){s?(s=null,e.sendWorkerResponse(n,"ping")):n.close()},15e3)}),n.on("message",function(t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return"ping"!==(t="string"!=typeof t?t.toString():t)?[3,1]:(this.sendWorkerResponse(n,"pong"),[3,4]);case 1:return"pong"!==t?[3,2]:(s=new Date,[3,4]);case 2:r=void 0;try{r=JSON.parse(t,common_1.dateReviver)}catch(e){return console.error("Worker parse error",e),[2]}return"task"!==r.type?[3,4]:[4,this.handleIncomingTask(n,r)];case 3:e.sent(),e.label=4;case 4:return[2]}})})}),n.on("close",function(){console.log(new Date,"Disconnected from main server. Reconnecting in 5s..."),setTimeout(e.startWorkerInstance,5e3),t&&clearInterval(t)}),n.on("error",function(e){console.error(new Date,"Worker WS error:",e),n.close()})},ResolveIOMainServer.prototype.handleIncomingTask=function(u,_){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c,l=this;return __generator(this,function(e){switch(e.label){case 0:if(r=_.taskId,t=_.method,n=_.params,s=_.userContext,this._runningTasks.push(r),!r||!t)return console.log("Invalid task message received",_),[2];o=!1,i=setTimeout(function(){return __awaiter(l,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return o=!0,console.error(new Date,"Worker timed out on task:",r,"Method:",t),console.error(new Date,"Error in Method: ".concat(t," - ").concat(JSON.stringify(_,null,2))),this.sendWorkerResponse(u,{type:"taskComplete",taskId:r,error:!0,message:"Task timed out"}),[4,this._methodManager.callMethod("insertErrorLog","Timeout in Method: ".concat(t," - ").concat(JSON.stringify(_,null,2)))];case 1:return e.sent(),[2]}})})},12e4),e.label=1;case 1:return e.trys.push([1,3,,5]),a=Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:(null==s?void 0:s.id_user)||"",user:(null==s?void 0:s.user)||"",id_ws:(null==s?void 0:s.id_ws)||""}),[4,(c=this._methodManager.callMethod).call.apply(c,__spreadArray([a,t],__read(n),!1))];case 2:return c=e.sent(),o||(clearTimeout(i),this.sendWorkerResponse(u,{type:"taskComplete",taskId:r,error:!1,result:c})),this._runningTasks=this._runningTasks.filter(function(e){return e!==r}),[3,5];case 3:return a=e.sent(),o||(clearTimeout(i),console.error("Worker failed task:",r,"Method:",t,a),this.sendWorkerResponse(u,{type:"taskComplete",taskId:r,error:!0,message:a||"Unknown error"})),console.error(new Date,"Error in Method: ".concat(t," - ").concat(JSON.stringify(_,null,2))),[4,this._methodManager.callMethod("insertErrorLog","Error in Method: ".concat(t," - ").concat(JSON.stringify(_,null,2)))];case 4:return e.sent(),this._runningTasks=this._runningTasks.filter(function(e){return e!==r}),[3,5];case 5:return[2]}})})},ResolveIOMainServer.prototype.sendWorkerResponse=function(e,r){if("string"!=typeof r&&(r=JSON.stringify(r)),e&&e.readyState===e.OPEN)try{e.send(r)}catch(e){console.error("Failed to send worker response:",e)}else e&&e.close()},ResolveIOMainServer.prototype.safeShutdown=function(){return __awaiter(this,void 0,void 0,function(){var r=this;return __generator(this,function(e){switch(e.label){case 0:if(this._safeShutdown||console.log(new Date,"Safe Shutdown Command Received"),this._monitorManagerFunction.getActiveMonitorFunctions().length||this._offlineUpdates.length||this._taskQueue.length||this._runningTasks.length)return[3,7];if(!resolveio_server_app_1.ResolveIOServer.getMongoConnection())return[3,5];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,resolveio_server_app_1.ResolveIOServer.getMongoConnection().close(!1)];case 2:return e.sent(),console.log(new Date,"Safe Exit Complete, Process Exit"),process.exit(0),[3,4];case 3:return e.sent(),process.exit(1),[3,4];case 4:return[3,6];case 5:process.exit(0),e.label=6;case 6:return[3,8];case 7:this._safeShutdown||(this._safeShutdown=!0,setTimeout(function(){r._safeShutdown=!1},1e3),console.log(new Date,"Safe Exit In Progress",this._monitorManagerFunction.getActiveMonitorFunctions().length,this._offlineUpdates.length)),setImmediate(function(){return __awaiter(r,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),e.label=8;case 8:return[2]}})})},ResolveIOMainServer.prototype.getIsWorkersEnabled=function(){return this._isWorkersEnabled},ResolveIOMainServer.prototype.getIsWorkerInstance=function(){return this._isWorkerInstance},ResolveIOMainServer.prototype.getWSList=function(){var r=[];return this._serverWSS.clients.forEach(function(e){r.push(e.id_socket)}),r},ResolveIOMainServer.prototype.getWSUserList=function(){var r=[];return this._serverWSS.clients.forEach(function(e){r.push(e.id_user)}),r},ResolveIOMainServer.prototype.getHTTPServer=function(){return this._serverHTTP},ResolveIOMainServer.prototype.getCronManager=function(){return this._cronManager},ResolveIOMainServer.prototype.getMethodManager=function(){return this._methodManager},ResolveIOMainServer.prototype.getSubscriptionManager=function(){return this._subscriptionManager},ResolveIOMainServer.prototype.getMonitorManager=function(){return this._monitorManager},ResolveIOMainServer.prototype.getRebootFlag=function(){return this._rebootFlag},ResolveIOMainServer.prototype.getWebSocketManager=function(){return this._websocketManager},ResolveIOMainServer.prototype.createServer=function(){var r=this;this._serverHTTP=(0,http_1.createServer)(this._app),this._serverHTTP.keepAliveTimeout=65e3,this._serverHTTP.headersTimeout=66e3,this._serverWSS=new WebSocket.Server({port:this._portWSS,verifyClient:this.publicProgram?null:function(s,o){var e;r._rebootFlag?o(!1,409,"Unable To Process"):("DEBUG"===r.LOGGER&&console.log("Verify Client",s,o),s.req.url&&s.req.url.includes("workerToken=")?(s.req.url.split("workerToken=")[1]||"")===resolveio_server_app_1.ResolveIOServer.getServerConfig().WORKER_TOKEN?o(!0):o(!1,401,"Unauthorized"):(e=s.req.headers["sec-websocket-protocol"].split(/,/),(s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().SEC_ROOT_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().RESOLVEIO_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().RESOLVEIO_SECONDARY_URL)&&(e=e[0])?jwt.verify(e,resolveio_server_app_1.ResolveIOServer.getServerConfig().JWT_SECRET,function(t,n){return __awaiter(r,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return t?(o(!1,401,"Unauthorized"),[3,5]):[3,1];case 1:s.req.id_user=n.id_user,e.label=2;case 2:return e.trys.push([2,4,,5]),[4,user_collection_1.Users.findById(n.id_user)];case 3:return(r=e.sent())?(s.req.user=r.fullname,s.req.user_readonly=r.readonly||!1,s.req.doc_user=r,o(!0)):o(!1),[3,5];case 4:return e.sent(),o(!1),[3,5];case 5:return[2]}})})}):o(!1,401,"Unauthorized")))}})},ResolveIOMainServer.prototype.listen=function(){var e=this;this._serverHTTP.listen(this._portHTTP,function(){console.log("Running server on port %s",e._portHTTP)}),this._serverWSS.on("listening",function(){console.log("Running server on port %s",e._portWSS)}),this._serverWSS.on("connection",function(o,i){return __awaiter(e,void 0,void 0,function(){var r,t,n,s=this;return __generator(this,function(e){switch(e.label){case 0:return i.url&&i.url.includes("workerToken=")?(r=(0,common_1.objectIdHexString)(),o.id_worker=r,this._workers.push({id:r,ws:o,activeTasks:0,maxConcurrency:2}),n=t=null,o.on("open",function(){s.sendWorkerResponse(o,"ping"),t=setInterval(function(){n?(n=null,s.sendWorkerResponse(o,"ping")):o.close()},15e3)}),console.log(new Date,"Worker connected:",r),o.on("message",function(e){"ping"===(e="string"!=typeof e?e.toString():e)?s.sendWorkerResponse(o,"pong"):"pong"===e?n=new Date:s.handleWorkerMessage(r,e)}),o.on("close",function(){console.log(new Date,"Worker disconnected:",r),s._workers=s._workers.filter(function(e){return e.id!==r}),t&&clearInterval(t)}),o.on("error",function(e){console.error("Error on WS Worker",e),o.close()}),[3,3]):[3,1];case 1:return o.id_socket=(0,common_1.objectIdHexString)(),o.id_user=i.id_user,o.user=i.user,o.user_readonly=i.user_readonly,o.doc_user=i.doc_user,this._websocketManager.addWebSocket(o),[4,this._subscriptionManager.createLoggedInUser(o.id_socket)];case 2:e.sent(),setTimeout(function(){o.pingTime=new Date,o.send("ping",function(r){return __awaiter(s,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(o)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})})},5e3),"DEBUG"===this.LOGGER&&console.log("Connection from user: "+i.user),o.isAlive=!0,o.retryCnt=0,o.on("message",function(n){return __awaiter(s,void 0,void 0,function(){var r,t;return __generator(this,function(e){switch(e.label){case 0:this._debugMsgRecv+=1,r=[],e.label=1;case 1:return e.trys.push([1,2,,4]),r=JSON.parse(n,common_1.dateReviver),[3,4];case 2:return t=e.sent(),console.log("Error - JSON.parse",n),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - JSON Parse Error - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n,t]))];case 3:return e.sent(),[2];case 4:return[4,this.processSocketMessage(o,r)];case 5:return e.sent(),[2]}})})}).on("end",function(){o.close()}).on("error",function(){o.close()}).on("close",function(){return __awaiter(s,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return[4,this.unsubscribeWS(o)];case 1:return e.sent(),[2]}})})}),e.label=3;case 3:return[2]}})})}),setInterval(function(){return __awaiter(e,void 0,void 0,function(){var r,n,t,s,o,i,a,c=this;return __generator(this,function(e){switch(e.label){case 0:r=function(t){return __generator(this,function(e){switch(e.label){case 0:return t.pingTime&&2e4<=Date.now()-t.pingTime.getTime()?!1!==t.isAlive?[3,4]:(t.retryCnt++,3<=t.retryCnt?[4,n.unsubscribeWS(t)]:[3,2]):[3,5];case 1:return e.sent(),[3,3];case 2:t.pingTime=new Date,t.send("ping",function(r){return __awaiter(c,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(t)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),e.label=3;case 3:return[3,5];case 4:t.retryCnt=0,t.isAlive=!1,t.pingTime=new Date,t.send("ping",function(r){return __awaiter(c,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(t)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),e.label=5;case 5:return[2]}})},n=this,e.label=1;case 1:e.trys.push([1,6,7,8]),t=__values(this._serverWSS.clients),s=t.next(),e.label=2;case 2:return s.done?[3,5]:(o=s.value,[5,r(o)]);case 3:e.sent(),e.label=4;case 4:return s=t.next(),[3,2];case 5:return[3,8];case 6:return o=e.sent(),i={error:o},[3,8];case 7:try{s&&!s.done&&(a=t.return)&&a.call(t)}finally{if(i)throw i.error}return[7];case 8:return[2]}})})},2e4)},ResolveIOMainServer.prototype.processSocketMessage=function(i,a){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o;return __generator(this,function(e){switch(e.label){case 0:if("string"==typeof a&&"ping"===a)return i&&i.readyState===i.OPEN&&i.send("pong"),[2];if("string"==typeof a&&"pong"===a)return i.isAlive=!0,i.pongTime=new Date,i.latency=moment.duration(moment(i.pongTime).diff(i.pingTime)).asMilliseconds(),this._subscriptionManager.loggedInLatency(i),[2];if(!Array.isArray(a[0]))return console.log("Invalid message format (expected array of arrays)",a),[2];e.label=1;case 1:e.trys.push([1,6,7,8]),r=__values(a),t=r.next(),e.label=2;case 2:return t.done?[3,5]:(n=t.value,[4,this.handleClientMessage(i,n)]);case 3:e.sent(),e.label=4;case 4:return t=r.next(),[3,2];case 5:return[3,8];case 6:return n=e.sent(),s={error:n},[3,8];case 7:try{t&&!t.done&&(o=r.return)&&o.call(r)}finally{if(s)throw s.error}return[7];case 8:return[2]}})})},ResolveIOMainServer.prototype.handleClientMessage=function(f,m){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c,l,u,_,g,h,d,v,p;return __generator(this,function(e){switch(e.label){case 0:return(r=m[0],t=m[1],n=m[2],s=m[3],this.publicProgram||!this._clientRoutes.some(function(e){return r.includes(e)})||f.doc_user.roles.groups.some(function(e){return e.views.some(function(e){return r.includes(e)||e.includes(r)})})||f.doc_user.roles.super_admin)?"subscription"!==s?[3,4]:(i=m[4],o=m[5],"sub"!==i?[3,2]:[4,this._subscriptionManager.subscribe(r,t,f,n,o,m.slice(6))]):[2];case 1:return e.sent(),[3,3];case 2:this._subscriptionManager.unsubscribe(r,t,f,n,o,m.slice(6)),e.label=3;case 3:return[3,22];case 4:if(this.publicProgram||"offline"!==s)return[3,16];i={messageId:n,hasError:!1,data:"ACK"},f&&f.readyState===f.OPEN&&this._websocketManager.send(f,i),this._offlineUpdates.push(f),a=m[4],c=0,e.label=5;case 5:if(!(c<a.length))return[3,15];if(l=a[c],l=l.data,l.shift(),l.shift(),p=l.shift(),l.shift(),u=l.shift(),p={messageId:p,hasError:!1,data:"ACK"},f&&f.readyState===f.OPEN&&this._websocketManager.send(f,p),"insertDocument"===u&&"driver-gps"===l[0])return[3,14];if("reportBuilderGetResults"!==u&&"reportBuilderGetDistinctValue"!==u&&"reportBuilderBuildTree"!==u&&"generatePDF"!==u&&"getWOOfflineData"!==u&&"countQuery"!==u&&"countWithQuery"!==u&&"countCollectionWithQuery"!==u&&"find"!==u&&"findOne"!==u&&"findWithOptions"!==u&&"getDrivers"!==u&&"processAirdropDistribution"!==u){if("https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL)return[3,6];resolveio_server_app_1.ResolveIOServer.getLocalLogManager().writeLog({type:"log",data:{_id:(0,common_1.objectIdHexString)(),createdAt:new Date,type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(l))<2e5?JSON.stringify(l,null,2):"Too Big",method:u,id_user:f.id_user||"",user:f.user||"",messageId:n,route:r}})}return[3,8];case 6:return[4,log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(l))<2e5?JSON.stringify(l,null,2):"Too Big",method:u,id_user:f.id_user||"",user:f.user||"",messageId:n,route:r,client:"ResolveIO",instance:"backend.resolveio.com",instance_index:process.env.NODE_APP_INSTANCE||""})];case 7:e.sent(),e.label=8;case 8:if(!this._methodManager._methods[u])return[3,13];e.label=9;case 9:return e.trys.push([9,11,,12]),[4,(p=this._methodManager.callMethod).call.apply(p,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:f.id_user,user:f.user,id_ws:f.id_socket}),u],__read(l),!1))];case 10:return e.sent(),[3,12];case 11:return d=e.sent(),console.log(new Date,"Offline Error",JSON.stringify(d,null,2)),[3,12];case 12:return"updateDocumentOffline"!==u&&"updateDocumentPropsOffline"!==u||resolveio_server_app_1.ResolveIOServer.getMongoManager().invalidateQueryCache(l[0]),[3,14];case 13:console.log("Offline - Could not find method: "+u),e.label=14;case 14:return c++,[3,5];case 15:return this._offlineUpdates.splice(this._offlineUpdates.map(function(e){return e.id_socket}).indexOf(f.id_socket),1),[3,22];case 16:if(_=__spreadArray([],__read(m),!1),_.shift(),_.shift(),g=_.shift(),"method"!==_.shift())return[3,22];if(h=_.shift(),f.user_readonly)return[2];if("reportBuilderGetResults"!==h&&"reportBuilderGetDistinctValue"!==h&&"reportBuilderBuildTree"!==h&&"generatePDF"!==h&&"getWOOfflineData"!==h&&"countQuery"!==h&&"countWithQuery"!==h&&"countCollectionWithQuery"!==h&&"find"!==h&&"findOne"!==h&&"findWithOptions"!==h&&"getDrivers"!==h&&"processAirdropDistribution"!==h){if("https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL)return[3,17];resolveio_server_app_1.ResolveIOServer.getLocalLogManager().writeLog({type:"log",data:{_id:(0,common_1.objectIdHexString)(),createdAt:new Date,type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(_))<2e5?JSON.stringify(_,null,2):"Too Big",method:h,id_user:f.id_user||"",user:f.user||"",messageId:n,route:r}})}return[3,19];case 17:return[4,log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(_))<2e5?JSON.stringify(_,null,2):"Too Big",method:h,id_user:f.id_user||"",user:f.user||"",messageId:n,route:r,client:"ResolveIO",instance:"backend.resolveio.com",instance_index:process.env.NODE_APP_INSTANCE||""})];case 18:e.sent(),e.label=19;case 19:return(d={messageId:g,hasError:!1,data:"ACK"},f&&f.readyState===f.OPEN&&this._websocketManager.send(f,d),v=this.findAvailableWorker(),this._isWorkersEnabled&&v&&"find"!==h&&"insertDocument"!==h&&"countWithQuery"!==h&&"findOne"!==h&&"updateDocumentProps"!==h&&"findWithOptions"!==h&&"updateDocument"!==h&&"insertErrorLog"!==h&&"removeDocument"!==h&&"supportCreateBillingUser"!==h&&"getSignedUrl"!==h&&"getSignedUrls"!==h&&"getSignedUrlWithId"!==h&&"incorrectUser"!==h&&"reloadWS"!==h&&"reconnectWS"!==h&&"disconnectWS"!==h)?(v="task-"+(0,common_1.objectIdHexString)(),this._inFlightRequests[v]={ws:f,messageId:g,method:h},this.queueTask(v,h,_,{id_user:f.id_user,user:f.user,id_ws:f.id_socket}),[3,22]):[3,20];case 20:return[4,this.callMethodLocally(f,g,h,_)];case 21:e.sent(),e.label=22;case 22:return[2]}})})},ResolveIOMainServer.prototype.callMethodLocally=function(s,o,i,a){return __awaiter(this,void 0,void 0,function(){var r,t,n;return __generator(this,function(e){switch(e.label){case 0:r={messageId:o,hasError:!1,data:null},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(n=this._methodManager.callMethod).call.apply(n,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:s.id_user,user:s.user,id_ws:s.id_socket}),i],__read(a),!1))];case 2:return n=e.sent(),r.data=n,[3,4];case 3:return t=e.sent(),r.hasError=!0,r.data=t||"Unknown error",[3,4];case 4:return s&&s.readyState===s.OPEN&&this._websocketManager.send(s,r),[2]}})})},ResolveIOMainServer.prototype.queueTask=function(e,r,t,n){this._taskQueue.push({taskId:e,method:r,params:t,userContext:n}),this.dispatchQueue()},ResolveIOMainServer.prototype.dispatchQueue=function(){if(this._taskQueue.length)for(var e=0;e<9999;e++){var r=this._taskQueue[0];if(!r)break;var t=this.findAvailableWorker();if(!t)break;this._taskQueue.shift(),this.assignTaskToWorker(t,r)}},ResolveIOMainServer.prototype.findAvailableWorker=function(){var e=this._workers.filter(function(e){return e.activeTasks<e.maxConcurrency});return e.length?(e.sort(function(e,r){return e.activeTasks-r.activeTasks}),e[0]):null},ResolveIOMainServer.prototype.assignTaskToWorker=function(r,t){r.activeTasks++;var e={type:"task",taskId:t.taskId,method:t.method,params:t.params,userContext:t.userContext};try{r.ws.send(JSON.stringify(e))}catch(e){console.error("Failed to send task to worker:",e),r.activeTasks=Math.max(0,r.activeTasks-1),this._taskQueue.unshift(t)}},ResolveIOMainServer.prototype.handleWorkerMessage=function(r,t){var e,n,s,o;try{o=JSON.parse(t,common_1.dateReviver)}catch(e){return void console.error("Failed to parse worker message:",t)}"taskComplete"===o.type&&((t=this._workers.find(function(e){return e.id===r}))?(t.activeTasks=Math.max(0,t.activeTasks-1),t=o.taskId,e=o.error,n=o.message,o=o.result,(s=this._inFlightRequests[t])?(delete this._inFlightRequests[t],o={messageId:s.messageId,hasError:!1,data:o},e&&(o.hasError=!0,o.data=n),s.ws&&s.ws.readyState===s.ws.OPEN&&this._websocketManager.send(s.ws,o)):console.error("No in-flight request found for task:",t),this.dispatchQueue()):console.error("Unknown worker for taskComplete:",r))},ResolveIOMainServer.prototype.unsubscribeWS=function(r){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._subscriptionManager&&this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Unsub WS",r.user,r.id_socket),[4,this._subscriptionManager.unsubscribeAll(r)];case 1:return e.sent(),r.removeAllListeners(),r=null,[2]}})})},ResolveIOMainServer.prototype.getApp=function(){return this._app},ResolveIOMainServer.prototype.getServerConfig=function(){return resolveio_server_app_1.ResolveIOServer.getServerConfig()},ResolveIOMainServer}();exports.ResolveIOMainServer=ResolveIOMainServer;
1
+ "use strict";var __awaiter=this&&this.__awaiter||function(e,n,s,o){return new(s=s||Promise)(function(t,r){function fulfilled(e){try{step(o.next(e))}catch(e){r(e)}}function rejected(e){try{step(o.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?t(e.value):((r=e.value)instanceof s?r:new s(function(e){e(r)})).then(fulfilled,rejected)}step((o=o.apply(e,n||[])).next())})},__generator=this&&this.__generator||function(n,s){var o,i,a,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},l={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function verb(t){return function(e){var r=[t,e];if(o)throw new TypeError("Generator is already executing.");for(;c=l&&r[l=0]?0:c;)try{if(o=1,i&&(a=2&r[0]?i.return:r[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,r[1])).done)return a;switch(i=0,(r=a?[2&r[0],a.value]:r)[0]){case 0:case 1:a=r;break;case 4:return c.label++,{value:r[1],done:!1};case 5:c.label++,i=r[1],r=[0];continue;case 7:r=c.ops.pop(),c.trys.pop();continue;default:if(!(a=0<(a=c.trys).length&&a[a.length-1])&&(6===r[0]||2===r[0])){c=0;continue}if(3===r[0]&&(!a||r[1]>a[0]&&r[1]<a[3]))c.label=r[1];else if(6===r[0]&&c.label<a[1])c.label=a[1],a=r;else{if(!(a&&c.label<a[2])){a[2]&&c.ops.pop(),c.trys.pop();continue}c.label=a[2],c.ops.push(r)}}r=s.call(n,c)}catch(e){r=[6,e],i=0}finally{o=a=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},__read=this&&this.__read||function(e,r){var t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var n,s,o=t.call(e),i=[];try{for(;(void 0===r||0<r--)&&!(n=o.next()).done;)i.push(n.value)}catch(e){s={error:e}}finally{try{n&&!n.done&&(t=o.return)&&t.call(o)}finally{if(s)throw s.error}}return i},__spreadArray=this&&this.__spreadArray||function(e,r,t){if(t||2===arguments.length)for(var n,s=0,o=r.length;s<o;s++)!n&&s in r||((n=n||Array.prototype.slice.call(r,0,s))[s]=r[s]);return e.concat(n||Array.prototype.slice.call(r))},__values=this&&this.__values||function(e){var r="function"==typeof Symbol&&Symbol.iterator,t=r&&e[r],n=0;if(t)return t.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&n>=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(r?"Object is not iterable.":"Symbol.iterator is not defined.")},bodyParser=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResolveIOMainServer=void 0,require("body-parser")),express=require("express"),xmlParser=require("express-xml-bodyparser"),http_1=require("http"),jwt=require("jsonwebtoken"),moment=require("moment-timezone"),WebSocket=require("ws"),log_collection_1=require("./collections/log.collection"),user_collection_1=require("./collections/user.collection"),cron_manager_1=require("./managers/cron.manager"),method_manager_1=require("./managers/method.manager"),monitor_manager_1=require("./managers/monitor.manager"),subscription_manager_1=require("./managers/subscription.manager"),common_1=require("./util/common"),mongodb_1=require("mongodb"),auth_1=require("./http/auth"),health_1=require("./http/health"),home_1=require("./http/home"),websocket_manager_1=require("./managers/websocket.manager"),resolveio_server_app_1=require("./resolveio-server-app"),ResolveIOMainServer=function(){function ResolveIOMainServer(){this._offlineUpdates=[],this.sesMail=!1,this.standardProgram=!1,this.publicProgram=!1,this._rebootFlag=!1,this._runningTasks=[],this.LOGGER="ERROR",this._clientRoutes=[],this._lastErrorMsg=null,this._debugMsgRecv=0,this._debugMsgQueue=0,this._isWorkersEnabled=!1,this._isWorkerInstance=!1,this._safeShutdown=!1,this._workers=[],this._taskQueue=[],this._inFlightRequests={}}return ResolveIOMainServer.create=function(){return __awaiter(this,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return[4,(r=new ResolveIOMainServer).initialize()];case 1:return e.sent(),[2,r]}})})},ResolveIOMainServer.prototype.initialize=function(){return __awaiter(this,void 0,void 0,function(){var r,o,i=this;return __generator(this,function(e){switch(e.label){case 0:return this._serverStartTime=new Date,this._lastErrorMsg=null,r=this,[4,monitor_manager_1.MonitorManager.create()];case 1:return r._monitorManager=e.sent(),this._monitorManagerFunction=new monitor_manager_1.MonitorManagerFunction,this._isWorkersEnabled="true"===process.env.IS_WORKERS_ENABLED,this._isWorkerInstance="true"===process.env.IS_WORKER_INSTANCE,setInterval(function(){i._subscriptionManager&&i._subscriptionManager.getEnableDebug()&&(console.log(new Date,"Server App","Msg Recv Hits",i._debugMsgRecv),console.log(new Date,"Server App","Msg Queue Hits",i._debugMsgQueue)),i._debugMsgQueue=0,i._debugMsgRecv=0},6e4),o=!1,setTimeout(function(){o=!0},5e3),process.on("unhandledRejection",function(n,s){return __awaiter(i,void 0,void 0,function(){var r,t=this;return __generator(this,function(e){switch(e.label){case 0:return n&&"MongoError"===n.name&&48===n.code?[2]:n&&"MongoServerError"===n.name&&!o?[2]:(console.error(new Date,"Unhandled Rejection at Promise",[n,s]),r=moment().diff(this._serverStartTime,"seconds"),n&&("MongoNetworkTimeoutError"===n.name||n instanceof mongodb_1.MongoNetworkTimeoutError)?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - MongoNetworkTimeoutError - Quitting NodeJS - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify({name:n.name,message:n.message,stack:n.stack},null,2))]):[3,2]:[3,3]);case 1:e.sent(),process.exit(1),e.label=2;case 2:return[3,11];case 3:return n&&"MongoError"===n.name&&"not master"===n.message?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - Quitting NodeJS - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,5]:[3,6];case 4:e.sent(),e.label=5;case 5:return process.exit(1),[3,11];case 6:return n&&"MongoError"===n.name&&"not master and slaveOk=false"===n.message?60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - Quitting NodeJS - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,8]:[3,9];case 7:e.sent(),e.label=8;case 8:return process.exit(1),[3,11];case 9:return n?"StatusError"!==n.name&&""!==n.message&&60<r&&!this._lastErrorMsg?(this._lastErrorMsg=new Date,setTimeout(function(){t._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Rejection - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n.name,n.message,n.stack],null,2))]):[3,11]:[3,11];case 10:e.sent(),e.label=11;case 11:return[2]}})})}),process.on("uncaughtException",function(t){return __awaiter(i,void 0,void 0,function(){var r=this;return __generator(this,function(e){switch(e.label){case 0:return(console.error(t,"Uncaught Exception thrown"),60<moment().diff(this._serverStartTime,"seconds")&&!this._lastErrorMsg)?(this._lastErrorMsg=new Date,setTimeout(function(){r._lastErrorMsg=null},6e4),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - Unhandled Exception - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([t.name,t.message,t.stack],null,2))]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),process.on("SIGINT",function(){return __awaiter(i,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),process.on("SIGTERM",function(){return __awaiter(i,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),process.on("SIGQUIT",function(){return __awaiter(i,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._rebootFlag=!0,this._serverHTTP&&this._serverHTTP.close(),[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),"DEBUG"===this.LOGGER&&console.log("Starting ResolveIO Server"),this._isWorkersEnabled?this._isWorkerInstance?(console.log("Running as a Worker instance"),this._methodManager=method_manager_1.MethodManager.create(null,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._cronManager=cron_manager_1.CronManager.create(),this.startWorkerInstance()):(console.log("Running as a Server instance"),this._websocketManager=websocket_manager_1.WebSocketManager.create(this),this.startServerInstance(),this._methodManager=method_manager_1.MethodManager.create(this._websocketManager,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=subscription_manager_1.SubscriptionManager.create(this._serverWSS,resolveio_server_app_1.ResolveIOServer.getServerConfig(),this._monitorManagerFunction),this.listen()):(console.log("Running with Workers Disabled"),this._websocketManager=websocket_manager_1.WebSocketManager.create(this),this.startServerInstance(),this._methodManager=method_manager_1.MethodManager.create(this._websocketManager,this._monitorManagerFunction,this._isWorkersEnabled,this._isWorkerInstance),this._subscriptionManager=subscription_manager_1.SubscriptionManager.create(this._serverWSS,resolveio_server_app_1.ResolveIOServer.getServerConfig(),this._monitorManagerFunction),this._cronManager=cron_manager_1.CronManager.create(),this.listen()),[2]}})})},ResolveIOMainServer.prototype.startServerInstance=function(){this._app=express(),this._app.use(bodyParser.json({limit:"50mb",reviver:common_1.dateReviver})),this._app.use(bodyParser.urlencoded({limit:"50mb",extended:!0,parameterLimit:1e6})),this._app.use(xmlParser()),this._portHTTP=process.env.PORT_HTTP||resolveio_server_app_1.ResolveIOServer.getServerConfig().PORT_HTTP||8080,this._portWSS=process.env.PORT_WSS||resolveio_server_app_1.ResolveIOServer.getServerConfig().PORT_WSS||8081,"DEBUG"===this.LOGGER&&console.log("Setup ports"),this.createServer(),"DEBUG"===this.LOGGER&&console.log("Create server"),this._app.use(function(e,r,t){r.setHeader("Access-Control-Allow-Origin","*"),r.setHeader("Access-Control-Allow-Methods","GET, POST"),r.setHeader("Access-Control-Allow-Headers","X-Requested-With,content-type"),r.setHeader("Access-Control-Allow-Credentials","false"),t()}),"DEBUG"===this.LOGGER&&console.log("Setup cors"),(0,auth_1.setupAuthRoutes)(this,this._app,resolveio_server_app_1.ResolveIOServer.getServerConfig()),(0,health_1.setupHealthRoutes)(this._app),"ResolveIO"!==resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME&&!this.standardProgram||(0,home_1.setupHomeRoutes)(this,this._app,resolveio_server_app_1.ResolveIOServer.getServerConfig()),"DEBUG"===this.LOGGER&&console.log("Setup express routes")},ResolveIOMainServer.prototype.startWorkerInstance=function(){var e=this,r=(console.log(new Date,"Worker instance started, connecting to main server via WebSocket..."),resolveio_server_app_1.ResolveIOServer.getServerConfig().SERVER_URL+"/websocket?workerToken="+resolveio_server_app_1.ResolveIOServer.getServerConfig().WORKER_TOKEN),n=new WebSocket(r),s=null,t=null;n.on("open",function(){console.log(new Date,"Connected to main server as worker",process.env.WORKER_INDEX,process.env.NODE_APP_INSTANCE),e.sendWorkerResponse(n,"ping"),t=setInterval(function(){s?(s=null,e.sendWorkerResponse(n,"ping")):n.close()},15e3)}),n.on("message",function(t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return"ping"!==(t="string"!=typeof t?t.toString():t)?[3,1]:(this.sendWorkerResponse(n,"pong"),[3,4]);case 1:return"pong"!==t?[3,2]:(s=new Date,[3,4]);case 2:r=void 0;try{r=JSON.parse(t,common_1.dateReviver)}catch(e){return console.error("Worker parse error",e),[2]}return"task"!==r.type?[3,4]:[4,this.handleIncomingTask(n,r)];case 3:e.sent(),e.label=4;case 4:return[2]}})})}),n.on("close",function(){console.log(new Date,"Disconnected from main server. Reconnecting in 5s..."),setTimeout(function(){return e.startWorkerInstance},5e3),t&&clearInterval(t)}),n.on("error",function(e){console.error(new Date,"Worker WS error:",e),n.close()})},ResolveIOMainServer.prototype.handleIncomingTask=function(u,_){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c,l=this;return __generator(this,function(e){switch(e.label){case 0:if(r=_.taskId,t=_.method,n=_.params,s=_.userContext,this._runningTasks.push(r),!r||!t)return console.log("Invalid task message received",_),[2];o=!1,i=setTimeout(function(){return __awaiter(l,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return o=!0,console.error(new Date,"Worker timed out on task:",r,"Method:",t),console.error(new Date,"Error in Method: ".concat(t," - ").concat(JSON.stringify(_,null,2))),this.sendWorkerResponse(u,{type:"taskComplete",taskId:r,error:!0,message:"Task timed out"}),[4,this._methodManager.callMethod("insertErrorLog","Timeout in Method: ".concat(t," - ").concat(JSON.stringify(_,null,2)))];case 1:return e.sent(),[2]}})})},12e4),e.label=1;case 1:return e.trys.push([1,3,,5]),a=Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:(null==s?void 0:s.id_user)||"",user:(null==s?void 0:s.user)||"",id_ws:(null==s?void 0:s.id_ws)||""}),[4,(c=this._methodManager.callMethod).call.apply(c,__spreadArray([a,t],__read(n),!1))];case 2:return c=e.sent(),o||(clearTimeout(i),this.sendWorkerResponse(u,{type:"taskComplete",taskId:r,error:!1,result:c})),this._runningTasks=this._runningTasks.filter(function(e){return e!==r}),[3,5];case 3:return a=e.sent(),o||(clearTimeout(i),console.error("Worker failed task:",r,"Method:",t,a),this.sendWorkerResponse(u,{type:"taskComplete",taskId:r,error:!0,message:a||"Unknown error"})),console.error(new Date,"Error in Method: ".concat(t," - ").concat(JSON.stringify(_,null,2))),[4,this._methodManager.callMethod("insertErrorLog","Error in Method: ".concat(t," - ").concat(JSON.stringify(_,null,2)))];case 4:return e.sent(),this._runningTasks=this._runningTasks.filter(function(e){return e!==r}),[3,5];case 5:return[2]}})})},ResolveIOMainServer.prototype.sendWorkerResponse=function(e,r){if("string"!=typeof r&&(r=JSON.stringify(r)),e&&e.readyState===e.OPEN)try{e.send(r)}catch(e){console.error("Failed to send worker response:",e)}else e&&e.close()},ResolveIOMainServer.prototype.safeShutdown=function(){return __awaiter(this,void 0,void 0,function(){var r=this;return __generator(this,function(e){switch(e.label){case 0:if(this._safeShutdown||console.log(new Date,"Safe Shutdown Command Received"),this._monitorManagerFunction.getActiveMonitorFunctions().length||this._offlineUpdates.length||this._taskQueue.length||this._runningTasks.length)return[3,7];if(!resolveio_server_app_1.ResolveIOServer.getMongoConnection())return[3,5];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,resolveio_server_app_1.ResolveIOServer.getMongoConnection().close(!1)];case 2:return e.sent(),console.log(new Date,"Safe Exit Complete, Process Exit"),process.exit(0),[3,4];case 3:return e.sent(),process.exit(1),[3,4];case 4:return[3,6];case 5:process.exit(0),e.label=6;case 6:return[3,8];case 7:this._safeShutdown||(this._safeShutdown=!0,setTimeout(function(){r._safeShutdown=!1},1e3),console.log(new Date,"Safe Exit In Progress",this._monitorManagerFunction.getActiveMonitorFunctions().length,this._offlineUpdates.length)),setImmediate(function(){return __awaiter(r,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return[4,this.safeShutdown()];case 1:return e.sent(),[2]}})})}),e.label=8;case 8:return[2]}})})},ResolveIOMainServer.prototype.getIsWorkersEnabled=function(){return this._isWorkersEnabled},ResolveIOMainServer.prototype.getIsWorkerInstance=function(){return this._isWorkerInstance},ResolveIOMainServer.prototype.getWSList=function(){var r=[];return this._serverWSS.clients.forEach(function(e){r.push(e.id_socket)}),r},ResolveIOMainServer.prototype.getWSUserList=function(){var r=[];return this._serverWSS.clients.forEach(function(e){r.push(e.id_user)}),r},ResolveIOMainServer.prototype.getHTTPServer=function(){return this._serverHTTP},ResolveIOMainServer.prototype.getCronManager=function(){return this._cronManager},ResolveIOMainServer.prototype.getMethodManager=function(){return this._methodManager},ResolveIOMainServer.prototype.getSubscriptionManager=function(){return this._subscriptionManager},ResolveIOMainServer.prototype.getMonitorManager=function(){return this._monitorManager},ResolveIOMainServer.prototype.getRebootFlag=function(){return this._rebootFlag},ResolveIOMainServer.prototype.getWebSocketManager=function(){return this._websocketManager},ResolveIOMainServer.prototype.createServer=function(){var r=this;this._serverHTTP=(0,http_1.createServer)(this._app),this._serverHTTP.keepAliveTimeout=65e3,this._serverHTTP.headersTimeout=66e3,this._serverWSS=new WebSocket.Server({port:this._portWSS,verifyClient:this.publicProgram?null:function(s,o){var e;r._rebootFlag?o(!1,409,"Unable To Process"):("DEBUG"===r.LOGGER&&console.log("Verify Client",s,o),s.req.url&&s.req.url.includes("workerToken=")?(s.req.url.split("workerToken=")[1]||"")===resolveio_server_app_1.ResolveIOServer.getServerConfig().WORKER_TOKEN?o(!0):o(!1,401,"Unauthorized"):(e=s.req.headers["sec-websocket-protocol"].split(/,/),(s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().SEC_ROOT_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().RESOLVEIO_URL||s.origin===resolveio_server_app_1.ResolveIOServer.getServerConfig().RESOLVEIO_SECONDARY_URL)&&(e=e[0])?jwt.verify(e,resolveio_server_app_1.ResolveIOServer.getServerConfig().JWT_SECRET,function(t,n){return __awaiter(r,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return t?(o(!1,401,"Unauthorized"),[3,5]):[3,1];case 1:s.req.id_user=n.id_user,e.label=2;case 2:return e.trys.push([2,4,,5]),[4,user_collection_1.Users.findById(n.id_user)];case 3:return(r=e.sent())?(s.req.user=r.fullname,s.req.user_readonly=r.readonly||!1,s.req.doc_user=r,o(!0)):o(!1),[3,5];case 4:return e.sent(),o(!1),[3,5];case 5:return[2]}})})}):o(!1,401,"Unauthorized")))}})},ResolveIOMainServer.prototype.listen=function(){var e=this;this._serverHTTP.listen(this._portHTTP,function(){console.log("Running server on port %s",e._portHTTP)}),this._serverWSS.on("listening",function(){console.log("Running server on port %s",e._portWSS)}),this._serverWSS.on("connection",function(o,i){return __awaiter(e,void 0,void 0,function(){var r,t,n,s=this;return __generator(this,function(e){switch(e.label){case 0:return i.url&&i.url.includes("workerToken=")?(r=(0,common_1.objectIdHexString)(),o.id_worker=r,this._workers.push({id:r,ws:o,activeTasks:0,maxConcurrency:2}),n=t=null,o.on("open",function(){s.sendWorkerResponse(o,"ping"),t=setInterval(function(){n?(n=null,s.sendWorkerResponse(o,"ping")):o.close()},15e3)}),console.log(new Date,"Worker connected:",r),o.on("message",function(e){"ping"===(e="string"!=typeof e?e.toString():e)?s.sendWorkerResponse(o,"pong"):"pong"===e?n=new Date:s.handleWorkerMessage(r,e)}),o.on("close",function(){console.log(new Date,"Worker disconnected:",r),s._workers=s._workers.filter(function(e){return e.id!==r}),t&&clearInterval(t)}),o.on("error",function(e){console.error("Error on WS Worker",e),o.close()}),[3,3]):[3,1];case 1:return o.id_socket=(0,common_1.objectIdHexString)(),o.id_user=i.id_user,o.user=i.user,o.user_readonly=i.user_readonly,o.doc_user=i.doc_user,this._websocketManager.addWebSocket(o),[4,this._subscriptionManager.createLoggedInUser(o.id_socket)];case 2:e.sent(),setTimeout(function(){o.pingTime=new Date,o.send("ping",function(r){return __awaiter(s,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(o)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})})},5e3),"DEBUG"===this.LOGGER&&console.log("Connection from user: "+i.user),o.isAlive=!0,o.retryCnt=0,o.on("message",function(n){return __awaiter(s,void 0,void 0,function(){var r,t;return __generator(this,function(e){switch(e.label){case 0:this._debugMsgRecv+=1,r=[],e.label=1;case 1:return e.trys.push([1,2,,4]),r=JSON.parse(n,common_1.dateReviver),[3,4];case 2:return t=e.sent(),console.log("Error - JSON.parse",n),[4,this._methodManager.sendEmail("dev@resolveio.com","SERVER - JSON Parse Error - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,JSON.stringify([n,t]))];case 3:return e.sent(),[2];case 4:return[4,this.processSocketMessage(o,r)];case 5:return e.sent(),[2]}})})}).on("end",function(){o.close()}).on("error",function(){o.close()}).on("close",function(){return __awaiter(s,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return[4,this.unsubscribeWS(o)];case 1:return e.sent(),[2]}})})}),e.label=3;case 3:return[2]}})})}),setInterval(function(){return __awaiter(e,void 0,void 0,function(){var r,n,t,s,o,i,a,c=this;return __generator(this,function(e){switch(e.label){case 0:r=function(t){return __generator(this,function(e){switch(e.label){case 0:return t.pingTime&&2e4<=Date.now()-t.pingTime.getTime()?!1!==t.isAlive?[3,4]:(t.retryCnt++,3<=t.retryCnt?[4,n.unsubscribeWS(t)]:[3,2]):[3,5];case 1:return e.sent(),[3,3];case 2:t.pingTime=new Date,t.send("ping",function(r){return __awaiter(c,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(t)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),e.label=3;case 3:return[3,5];case 4:t.retryCnt=0,t.isAlive=!1,t.pingTime=new Date,t.send("ping",function(r){return __awaiter(c,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return r?(this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Error WS Ping"),[4,this.unsubscribeWS(t)]):[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})}),e.label=5;case 5:return[2]}})},n=this,e.label=1;case 1:e.trys.push([1,6,7,8]),t=__values(this._serverWSS.clients),s=t.next(),e.label=2;case 2:return s.done?[3,5]:(o=s.value,[5,r(o)]);case 3:e.sent(),e.label=4;case 4:return s=t.next(),[3,2];case 5:return[3,8];case 6:return o=e.sent(),i={error:o},[3,8];case 7:try{s&&!s.done&&(a=t.return)&&a.call(t)}finally{if(i)throw i.error}return[7];case 8:return[2]}})})},2e4)},ResolveIOMainServer.prototype.processSocketMessage=function(i,a){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o;return __generator(this,function(e){switch(e.label){case 0:if("string"==typeof a&&"ping"===a)return i&&i.readyState===i.OPEN&&i.send("pong"),[2];if("string"==typeof a&&"pong"===a)return i.isAlive=!0,i.pongTime=new Date,i.latency=moment.duration(moment(i.pongTime).diff(i.pingTime)).asMilliseconds(),this._subscriptionManager.loggedInLatency(i),[2];if(!Array.isArray(a[0]))return console.log("Invalid message format (expected array of arrays)",a),[2];e.label=1;case 1:e.trys.push([1,6,7,8]),r=__values(a),t=r.next(),e.label=2;case 2:return t.done?[3,5]:(n=t.value,[4,this.handleClientMessage(i,n)]);case 3:e.sent(),e.label=4;case 4:return t=r.next(),[3,2];case 5:return[3,8];case 6:return n=e.sent(),s={error:n},[3,8];case 7:try{t&&!t.done&&(o=r.return)&&o.call(r)}finally{if(s)throw s.error}return[7];case 8:return[2]}})})},ResolveIOMainServer.prototype.handleClientMessage=function(f,m){return __awaiter(this,void 0,void 0,function(){var r,t,n,s,o,i,a,c,l,u,_,g,h,d,v,p;return __generator(this,function(e){switch(e.label){case 0:return(r=m[0],t=m[1],n=m[2],s=m[3],this.publicProgram||!this._clientRoutes.some(function(e){return r.includes(e)})||f.doc_user.roles.groups.some(function(e){return e.views.some(function(e){return r.includes(e)||e.includes(r)})})||f.doc_user.roles.super_admin)?"subscription"!==s?[3,4]:(i=m[4],o=m[5],"sub"!==i?[3,2]:[4,this._subscriptionManager.subscribe(r,t,f,n,o,m.slice(6))]):[2];case 1:return e.sent(),[3,3];case 2:this._subscriptionManager.unsubscribe(r,t,f,n,o,m.slice(6)),e.label=3;case 3:return[3,22];case 4:if(this.publicProgram||"offline"!==s)return[3,16];i={messageId:n,hasError:!1,data:"ACK"},f&&f.readyState===f.OPEN&&this._websocketManager.send(f,i),this._offlineUpdates.push(f),a=m[4],c=0,e.label=5;case 5:if(!(c<a.length))return[3,15];if(l=a[c],l=l.data,l.shift(),l.shift(),p=l.shift(),l.shift(),u=l.shift(),p={messageId:p,hasError:!1,data:"ACK"},f&&f.readyState===f.OPEN&&this._websocketManager.send(f,p),"insertDocument"===u&&"driver-gps"===l[0])return[3,14];if("reportBuilderGetResults"!==u&&"reportBuilderGetDistinctValue"!==u&&"reportBuilderBuildTree"!==u&&"generatePDF"!==u&&"getWOOfflineData"!==u&&"countQuery"!==u&&"countWithQuery"!==u&&"countCollectionWithQuery"!==u&&"find"!==u&&"findOne"!==u&&"findWithOptions"!==u&&"getDrivers"!==u&&"processAirdropDistribution"!==u){if("https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL)return[3,6];resolveio_server_app_1.ResolveIOServer.getLocalLogManager().writeLog({type:"log",data:{_id:(0,common_1.objectIdHexString)(),createdAt:new Date,type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(l))<2e5?JSON.stringify(l,null,2):"Too Big",method:u,id_user:f.id_user||"",user:f.user||"",messageId:n,route:r}})}return[3,8];case 6:return[4,log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(l))<2e5?JSON.stringify(l,null,2):"Too Big",method:u,id_user:f.id_user||"",user:f.user||"",messageId:n,route:r,client:"ResolveIO",instance:"backend.resolveio.com",instance_index:process.env.NODE_APP_INSTANCE||""})];case 7:e.sent(),e.label=8;case 8:if(!this._methodManager._methods[u])return[3,13];e.label=9;case 9:return e.trys.push([9,11,,12]),[4,(p=this._methodManager.callMethod).call.apply(p,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:f.id_user,user:f.user,id_ws:f.id_socket}),u],__read(l),!1))];case 10:return e.sent(),[3,12];case 11:return d=e.sent(),console.log(new Date,"Offline Error",JSON.stringify(d,null,2)),[3,12];case 12:return"updateDocumentOffline"!==u&&"updateDocumentPropsOffline"!==u||resolveio_server_app_1.ResolveIOServer.getMongoManager().invalidateQueryCache(l[0]),[3,14];case 13:console.log("Offline - Could not find method: "+u),e.label=14;case 14:return c++,[3,5];case 15:return this._offlineUpdates.splice(this._offlineUpdates.map(function(e){return e.id_socket}).indexOf(f.id_socket),1),[3,22];case 16:if(_=__spreadArray([],__read(m),!1),_.shift(),_.shift(),g=_.shift(),"method"!==_.shift())return[3,22];if(h=_.shift(),f.user_readonly)return[2];if("reportBuilderGetResults"!==h&&"reportBuilderGetDistinctValue"!==h&&"reportBuilderBuildTree"!==h&&"generatePDF"!==h&&"getWOOfflineData"!==h&&"countQuery"!==h&&"countWithQuery"!==h&&"countCollectionWithQuery"!==h&&"find"!==h&&"findOne"!==h&&"findWithOptions"!==h&&"getDrivers"!==h&&"processAirdropDistribution"!==h){if("https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL)return[3,17];resolveio_server_app_1.ResolveIOServer.getLocalLogManager().writeLog({type:"log",data:{_id:(0,common_1.objectIdHexString)(),createdAt:new Date,type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(_))<2e5?JSON.stringify(_,null,2):"Too Big",method:h,id_user:f.id_user||"",user:f.user||"",messageId:n,route:r}})}return[3,19];case 17:return[4,log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-request",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify(_))<2e5?JSON.stringify(_,null,2):"Too Big",method:h,id_user:f.id_user||"",user:f.user||"",messageId:n,route:r,client:"ResolveIO",instance:"backend.resolveio.com",instance_index:process.env.NODE_APP_INSTANCE||""})];case 18:e.sent(),e.label=19;case 19:return(d={messageId:g,hasError:!1,data:"ACK"},f&&f.readyState===f.OPEN&&this._websocketManager.send(f,d),v=this.findAvailableWorker(),this._isWorkersEnabled&&v&&"find"!==h&&"insertDocument"!==h&&"countWithQuery"!==h&&"findOne"!==h&&"updateDocumentProps"!==h&&"findWithOptions"!==h&&"updateDocument"!==h&&"insertErrorLog"!==h&&"removeDocument"!==h&&"supportCreateBillingUser"!==h&&"getSignedUrl"!==h&&"getSignedUrls"!==h&&"getSignedUrlWithId"!==h&&"incorrectUser"!==h&&"reloadWS"!==h&&"reconnectWS"!==h&&"disconnectWS"!==h)?(v="task-"+(0,common_1.objectIdHexString)(),this._inFlightRequests[v]={ws:f,messageId:g,method:h},this.queueTask(v,h,_,{id_user:f.id_user,user:f.user,id_ws:f.id_socket}),[3,22]):[3,20];case 20:return[4,this.callMethodLocally(f,g,h,_)];case 21:e.sent(),e.label=22;case 22:return[2]}})})},ResolveIOMainServer.prototype.callMethodLocally=function(s,o,i,a){return __awaiter(this,void 0,void 0,function(){var r,t,n;return __generator(this,function(e){switch(e.label){case 0:r={messageId:o,hasError:!1,data:null},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(n=this._methodManager.callMethod).call.apply(n,__spreadArray([Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:s.id_user,user:s.user,id_ws:s.id_socket}),i],__read(a),!1))];case 2:return n=e.sent(),r.data=n,[3,4];case 3:return t=e.sent(),r.hasError=!0,r.data=t||"Unknown error",[3,4];case 4:return s&&s.readyState===s.OPEN&&this._websocketManager.send(s,r),[2]}})})},ResolveIOMainServer.prototype.queueTask=function(e,r,t,n){this._taskQueue.push({taskId:e,method:r,params:t,userContext:n}),this.dispatchQueue()},ResolveIOMainServer.prototype.dispatchQueue=function(){if(this._taskQueue.length)for(var e=0;e<9999;e++){var r=this._taskQueue[0];if(!r)break;var t=this.findAvailableWorker();if(!t)break;this._taskQueue.shift(),this.assignTaskToWorker(t,r)}},ResolveIOMainServer.prototype.findAvailableWorker=function(){var e=this._workers.filter(function(e){return e.activeTasks<e.maxConcurrency});return e.length?(e.sort(function(e,r){return e.activeTasks-r.activeTasks}),e[0]):null},ResolveIOMainServer.prototype.assignTaskToWorker=function(r,t){r.activeTasks++;var e={type:"task",taskId:t.taskId,method:t.method,params:t.params,userContext:t.userContext};try{r.ws.send(JSON.stringify(e))}catch(e){console.error("Failed to send task to worker:",e),r.activeTasks=Math.max(0,r.activeTasks-1),this._taskQueue.unshift(t)}},ResolveIOMainServer.prototype.handleWorkerMessage=function(r,t){var e,n,s,o;try{o=JSON.parse(t,common_1.dateReviver)}catch(e){return void console.error("Failed to parse worker message:",t)}"taskComplete"===o.type&&((t=this._workers.find(function(e){return e.id===r}))?(t.activeTasks=Math.max(0,t.activeTasks-1),t=o.taskId,e=o.error,n=o.message,o=o.result,(s=this._inFlightRequests[t])?(delete this._inFlightRequests[t],o={messageId:s.messageId,hasError:!1,data:o},e&&(o.hasError=!0,o.data=n),s.ws&&s.ws.readyState===s.ws.OPEN&&this._websocketManager.send(s.ws,o)):console.error("No in-flight request found for task:",t),this.dispatchQueue()):console.error("Unknown worker for taskComplete:",r))},ResolveIOMainServer.prototype.unsubscribeWS=function(r){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return this._subscriptionManager&&this._subscriptionManager.getEnableDebug()&&console.log(new Date,"Server App","Unsub WS",r.user,r.id_socket),[4,this._subscriptionManager.unsubscribeAll(r)];case 1:return e.sent(),r.removeAllListeners(),r=null,[2]}})})},ResolveIOMainServer.prototype.getApp=function(){return this._app},ResolveIOMainServer.prototype.getServerConfig=function(){return resolveio_server_app_1.ResolveIOServer.getServerConfig()},ResolveIOMainServer}();exports.ResolveIOMainServer=ResolveIOMainServer;
2
2
  //# sourceMappingURL=server-app.js.map
package/server-app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server-app.ts"],"names":["bodyParser","require","express","xmlParser","http_1","jwt","moment","WebSocket","log_collection_1","user_collection_1","cron_manager_1","method_manager_1","monitor_manager_1","subscription_manager_1","common_1","mongodb_1","auth_1","health_1","home_1","websocket_manager_1","resolveio_server_app_1","ResolveIOMainServer","this","_offlineUpdates","sesMail","standardProgram","publicProgram","_rebootFlag","_runningTasks","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_safeShutdown","_workers","_taskQueue","_inFlightRequests","create","resolveioMainServer","initialize","prototype","_this","initServerFlag","_serverStartTime","Date","_monitorManager","MonitorManager","_monitorManagerFunction","MonitorManagerFunction","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setInterval","_subscriptionManager","getEnableDebug","console","log","setTimeout","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","_methodManager","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","_a","sent","exit","_serverHTTP","close","safeShutdown","MethodManager","_cronManager","CronManager","startWorkerInstance","_websocketManager","WebSocketManager","startServerInstance","SubscriptionManager","_serverWSS","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","wsUrl","ws","lastComm","interval","WORKER_INDEX","NODE_APP_INSTANCE","sendWorkerResponse","rawData","toString","msg","parse","e","type","handleIncomingTask","clearInterval","err","data","taskId","method","params","userContext","push","timedOut","timeoutHandle","concat","callMethod","managerThis","Object","assign","id_user","user","id_ws","call","apply","__spreadArray","__read","result","_b","clearTimeout","filter","a","err_1","payload","readyState","OPEN","send","getActiveMonitorFunctions","length","getMongoConnection","setImmediate","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","port","verifyClient","info","cb","token","url","includes","split","infoData","headers","origin","verify","decoded","Users","findById","fullname","readonly","workerId_1","objectIdHexString","id","activeTasks","maxConcurrency","lastComm_1","interval_1","handleWorkerMessage","w","addWebSocket","createLoggedInUser","unsubscribeWS","socketData","e_1","processSocketMessage","now","getTime","this_1","_e","__values","value","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","handleClientMessage","messageRoute","messageDate","messageId","some","roles","groups","views","b","super_admin","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","offlineUpdates","i","update","shift","updateMessageId","serverResMethod","getLocalLogManager","writeLog","_id","createdAt","collection","id_document","getBinarySize","route","Logs","insertOne","client","instance","instance_index","_methods","err_2","getMongoManager","invalidateQueryCache","splice","map","indexOf","dataCopy","msgId","methodName","ack","worker","findAvailableWorker","queueTask","callMethodLocally","err_3","dispatchQueue","item","assignTaskToWorker","candidates","x","sort","task","Math","max","unshift","workerId","messageStr","inflight","find","unsubscribeAll","removeAllListeners","getApp","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-response.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 { ResolveIOServer } from './resolveio-server-app';\n\ninterface WorkerConnection {\n\tid: string;\n\tws: WebSocket;\n\tactiveTasks: number;\n\tmaxConcurrency: number;\n}\n\ninterface TaskQueueItem {\n\ttaskId: string;\n\tmethod: string;\n\tparams: any[];\n\tuserContext?: { id_user?: string; user?: string; id_ws?: string };\n}\n\ninterface InFlightRequest {\n\tws: WebSocket; // the client's WebSocket\n\tmessageId: number; // the ID so the client knows which call this corresponds to\n\tmethod: string;\n}\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\tprivate _runningTasks = [];\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate _safeShutdown = false;\n\n\tprivate _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskQueueItem[] = [];\n\tprivate _inFlightRequests: { [taskId: string]: InFlightRequest } = {};\n\n\tconstructor() {}\n\n\tpublic static create() {\n\t\tconst resolveioMainServer = new ResolveIOMainServer();\n\t\tresolveioMainServer.initialize();\n\t\treturn resolveioMainServer;\n\t}\n\n\tprivate initialize() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = new MonitorManager();\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._cronManager = CronManager.create();\n\t\t\t\tthis.startWorkerInstance();\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.startServerInstance();\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\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.startServerInstance();\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.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 startWorkerInstance() {\n\t\tconsole.log(new Date(), 'Worker instance started, connecting to main server via WebSocket...');\n\n\t\tlet wsUrl = ResolveIOServer.getServerConfig()['SERVER_URL'] + '/websocket?workerToken=' + ResolveIOServer.getServerConfig()['WORKER_TOKEN'];\n\n\t\tconst ws = new WebSocket(wsUrl);\n\n\t\tlet lastComm = null;\n\t\tlet interval = null;\n\n\t\tws.on('open', () => {\n\t\t\tconsole.log(new Date(), 'Connected to main server as worker', process.env.WORKER_INDEX, process.env.NODE_APP_INSTANCE);\n\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\n\t\t\tinterval = setInterval(() => {\n\t\t\t\tif (!lastComm) {\n\t\t\t\t\tws.close();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlastComm = null;\n\t\t\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\t\t\t\t}\n\t\t\t}, 15000);\n\t\t});\n\n\t\tws.on('message', async (rawData: any) => {\n\t\t\t// console.log(new Date(), 'Message Recv', rawData);\n\n\t\t\tif (typeof rawData !== 'string') {\n\t\t\t\trawData = rawData.toString();\n\t\t\t}\n\n\t\t\t// console.log(new Date(), 'String Message Recv', rawData);\n\n\t\t\tif (rawData === 'ping') {\n\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\tthis.sendWorkerResponse(ws, 'pong');\n\t\t\t}\n\t\t\telse if (rawData === 'pong') {\n\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\tlastComm = new Date();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet msg: any;\n\t\t\t\ttry {\n\t\t\t\t\tmsg = JSON.parse(rawData, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch (e) {\n\t\t\t\t\tconsole.error('Worker parse error', e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// We expect: { type: 'task', taskId, method, params, userContext? }\n\t\t\t\tif (msg.type === 'task') {\n\t\t\t\t\tawait this.handleIncomingTask(ws, msg);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tws.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Disconnected from main server. Reconnecting in 5s...');\n\t\t\tsetTimeout(this.startWorkerInstance, 5000);\n\n\t\t\tif (interval) {\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t});\n\n\t\tws.on('error', (err) => {\n\t\t\tconsole.error(new Date(), 'Worker WS error:', err);\n\t\t\tws.close();\n\t\t});\n\t}\n\n\tprivate async handleIncomingTask(ws: WebSocket, data: any) {\n\t\tlet { taskId, method, params, userContext } = data;\n\t\tthis._runningTasks.push(taskId);\n\t\tif (!taskId || !method) {\n\t\t\tconsole.log('Invalid task message received', data);\n\t\t\treturn;\n\t\t}\n\n\t\tlet timedOut = false;\n\t\tlet timeoutHandle = setTimeout(async () => {\n\t\t\ttimedOut = true;\n\t\t\tconsole.error(new Date(), 'Worker timed out on task:', taskId, 'Method:', method);\n\n\t\t\tconsole.error(new Date(), `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\n\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\ttype: 'taskComplete',\n\t\t\t\ttaskId,\n\t\t\t\terror: true,\n\t\t\t\tmessage: 'Task timed out'\n\t\t\t});\n\n\t\t\tawait this._methodManager.callMethod('insertErrorLog', `Timeout in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t}, 120000);\n\n\t\ttry {\n\t\t\tlet managerThis = Object.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\tid_user: userContext?.id_user || '',\n\t\t\t\tuser: userContext?.user || '',\n\t\t\t\tid_ws: userContext?.id_ws || ''\n\t\t\t});\n\n\t\t\tlet result = await this._methodManager.callMethod.call(managerThis, method, ...params);\n\n\t\t\tif (!timedOut) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\t\ttype: 'taskComplete',\n\t\t\t\t\ttaskId,\n\t\t\t\t\terror: false,\n\t\t\t\t\tresult\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._runningTasks = this._runningTasks.filter(a => a !== taskId);\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (!timedOut) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\tconsole.error('Worker failed task:', taskId, 'Method:', method, err);\n\t\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\t\ttype: 'taskComplete',\n\t\t\t\t\ttaskId,\n\t\t\t\t\terror: true,\n\t\t\t\t\tmessage: err || 'Unknown error'\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\tconsole.error(new Date(), `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t\t\n\t\t\tawait this._methodManager.callMethod('insertErrorLog', `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t\t\n\t\t\tthis._runningTasks = this._runningTasks.filter(a => a !== taskId);\n\t\t}\n\t}\n\n\tprivate sendWorkerResponse(ws: WebSocket, payload: any) {\n\t\tif (typeof payload !== 'string') {\n\t\t\tpayload = JSON.stringify(payload);\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\ttry {\n\t\t\t\tws.send(payload);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tconsole.error('Failed to send worker response:', err);\n\t\t\t}\n\t\t}\n\t\telse if (ws) {\n\t\t\tws.close();\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._taskQueue.length && !this._runningTasks.length\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\t// For demonstration, let each worker handle up to 2 tasks concurrently\n\t\t\t\tlet maxConcurrency = 2;\n\n\t\t\t\tthis._workers.push({\n\t\t\t\t\tid: workerId,\n\t\t\t\t\tws: ws,\n\t\t\t\t\tactiveTasks: 0,\n\t\t\t\t\tmaxConcurrency: maxConcurrency\n\t\t\t\t});\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.sendWorkerResponse(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.sendWorkerResponse(ws, 'ping');\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 15000);\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.sendWorkerResponse(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.handleWorkerMessage(workerId, 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\tthis._workers = this._workers.filter(w => w.id !== 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\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\t// Check if we can offload to a worker\n\t\t\t\tlet worker = this.findAvailableWorker();\n\t\t\t\tif (this._isWorkersEnabled && \n\t\t\t\t\tworker &&\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) {\n\t\t\t\t\t// Offload to a worker\n\t\t\t\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\t\t\t\t// Store correlation so when worker finishes, we can respond\n\t\t\t\t\tthis._inFlightRequests[taskId] = {\n\t\t\t\t\t\tws,\n\t\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\t\tmethod: methodName\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.queueTask(taskId, 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\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tprivate queueTask(taskId: string, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tthis._taskQueue.push({\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext\n\t\t});\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Try to assign tasks while we have them\n\t\tfor (let i = 0; i < 9999; i++) {\n\t\t\tlet item = this._taskQueue[0];\n\t\t\tif (!item) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlet w = this.findAvailableWorker();\n\t\t\tif (!w) {\n\t\t\t\tbreak; // no worker can take more tasks\n\t\t\t}\n\n\t\t\t// Remove from queue\n\t\t\tthis._taskQueue.shift();\n\t\t\tthis.assignTaskToWorker(w, item);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency. Or null if none.\n\t */\n\tprivate findAvailableWorker(): WorkerConnection | null {\n\t\tlet candidates = this._workers.filter(x => x.activeTasks < x.maxConcurrency);\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Sort by how busy they are\n\t\tcandidates.sort((a, b) => a.activeTasks - b.activeTasks);\n\t\treturn candidates[0];\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskQueueItem) {\n\t\tworker.activeTasks++;\n\n\t\tlet payload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext\n\t\t};\n\n\t\ttry {\n\t\t\tworker.ws.send(JSON.stringify(payload));\n\t\t\t// console.log('Assigned task', task.taskId, 'to worker', worker.id);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\t\t\tworker.activeTasks = Math.max(0, worker.activeTasks - 1);\n\t\t\t// Put task back at front\n\t\t\tthis._taskQueue.unshift(task);\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tprivate handleWorkerMessage(workerId: string, messageStr: string) {\n\t\tlet data: any;\n\t\ttry {\n\t\t\tdata = JSON.parse(messageStr, dateReviver);\n\t\t}\n\t\tcatch {\n\t\t\tconsole.error('Failed to parse worker message:', messageStr);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet w = this._workers.find(x => x.id === workerId);\n\t\t\tif (!w) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tw.activeTasks = Math.max(0, w.activeTasks - 1);\n\n\t\t\tlet { taskId, error, message, result } = data;\n\n\t\t\t// Look up original request\n\t\t\tlet inflight = this._inFlightRequests[taskId];\n\t\t\tif (!inflight) {\n\t\t\t\tconsole.error('No in-flight request found for task:', taskId);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdelete this._inFlightRequests[taskId];\n\n\t\t\t\t// Send the final response to the client\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: inflight.messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = message;\n\t\t\t\t}\n\n\t\t\t\tif (inflight.ws && inflight.ws.readyState === inflight.ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(inflight.ws, res);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tthis.dispatchQueue();\n\t\t}\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}"]}
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","resolveio_server_app_1","ResolveIOMainServer","this","_offlineUpdates","sesMail","standardProgram","publicProgram","_rebootFlag","_runningTasks","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_safeShutdown","_workers","_taskQueue","_inFlightRequests","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","_cronManager","CronManager","startWorkerInstance","_websocketManager","WebSocketManager","startServerInstance","SubscriptionManager","_serverWSS","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","wsUrl","ws","lastComm","interval","WORKER_INDEX","NODE_APP_INSTANCE","sendWorkerResponse","rawData","toString","msg","parse","e","type","handleIncomingTask","clearInterval","err","data","taskId","method","params","userContext","push","timedOut","timeoutHandle","concat","callMethod","managerThis","Object","assign","id_user","user","id_ws","call","apply","__spreadArray","__read","result","clearTimeout","filter","a","err_1","payload","readyState","OPEN","send","getActiveMonitorFunctions","length","getMongoConnection","setImmediate","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","port","verifyClient","info","cb","token","url","includes","split","infoData","headers","origin","verify","decoded","Users","findById","fullname","readonly","workerId_1","objectIdHexString","id","activeTasks","maxConcurrency","lastComm_1","interval_1","handleWorkerMessage","w","addWebSocket","createLoggedInUser","unsubscribeWS","socketData","e_1","processSocketMessage","now","getTime","this_1","_e","__values","value","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","handleClientMessage","messageRoute","messageDate","messageId","some","roles","groups","views","b","super_admin","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","offlineUpdates","i","update","shift","updateMessageId","serverResMethod","getLocalLogManager","writeLog","_id","createdAt","collection","id_document","getBinarySize","route","Logs","insertOne","client","instance","instance_index","_methods","err_2","getMongoManager","invalidateQueryCache","splice","map","indexOf","dataCopy","msgId","methodName","ack","worker","findAvailableWorker","queueTask","callMethodLocally","err_3","dispatchQueue","item","assignTaskToWorker","candidates","x","sort","task","Math","max","unshift","workerId","messageStr","inflight","find","unsubscribeAll","removeAllListeners","getApp","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-response.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 { ResolveIOServer } from './resolveio-server-app';\n\ninterface WorkerConnection {\n\tid: string;\n\tws: WebSocket;\n\tactiveTasks: number;\n\tmaxConcurrency: number;\n}\n\ninterface TaskQueueItem {\n\ttaskId: string;\n\tmethod: string;\n\tparams: any[];\n\tuserContext?: { id_user?: string; user?: string; id_ws?: string };\n}\n\ninterface InFlightRequest {\n\tws: WebSocket; // the client's WebSocket\n\tmessageId: number; // the ID so the client knows which call this corresponds to\n\tmethod: string;\n}\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\tprivate _runningTasks = [];\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate _safeShutdown = false;\n\n\tprivate _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskQueueItem[] = [];\n\tprivate _inFlightRequests: { [taskId: string]: InFlightRequest } = {};\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._cronManager = CronManager.create();\n\t\t\t\tthis.startWorkerInstance();\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.startServerInstance();\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\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.startServerInstance();\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.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\tstartWorkerInstance() {\n\t\tconsole.log(new Date(), 'Worker instance started, connecting to main server via WebSocket...');\n\n\t\tlet wsUrl = ResolveIOServer.getServerConfig()['SERVER_URL'] + '/websocket?workerToken=' + ResolveIOServer.getServerConfig()['WORKER_TOKEN'];\n\n\t\tconst ws = new WebSocket(wsUrl);\n\n\t\tlet lastComm = null;\n\t\tlet interval = null;\n\n\t\tws.on('open', () => {\n\t\t\tconsole.log(new Date(), 'Connected to main server as worker', process.env.WORKER_INDEX, process.env.NODE_APP_INSTANCE);\n\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\n\t\t\tinterval = setInterval(() => {\n\t\t\t\tif (!lastComm) {\n\t\t\t\t\tws.close();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlastComm = null;\n\t\t\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\t\t\t\t}\n\t\t\t}, 15000);\n\t\t});\n\n\t\tws.on('message', async (rawData: any) => {\n\t\t\t// console.log(new Date(), 'Message Recv', rawData);\n\n\t\t\tif (typeof rawData !== 'string') {\n\t\t\t\trawData = rawData.toString();\n\t\t\t}\n\n\t\t\t// console.log(new Date(), 'String Message Recv', rawData);\n\n\t\t\tif (rawData === 'ping') {\n\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\tthis.sendWorkerResponse(ws, 'pong');\n\t\t\t}\n\t\t\telse if (rawData === 'pong') {\n\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\tlastComm = new Date();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet msg: any;\n\t\t\t\ttry {\n\t\t\t\t\tmsg = JSON.parse(rawData, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch (e) {\n\t\t\t\t\tconsole.error('Worker parse error', e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// We expect: { type: 'task', taskId, method, params, userContext? }\n\t\t\t\tif (msg.type === 'task') {\n\t\t\t\t\tawait this.handleIncomingTask(ws, msg);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tws.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Disconnected from main server. Reconnecting in 5s...');\n\t\t\tsetTimeout(() => this.startWorkerInstance, 5000);\n\n\t\t\tif (interval) {\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t});\n\n\t\tws.on('error', (err) => {\n\t\t\tconsole.error(new Date(), 'Worker WS error:', err);\n\t\t\tws.close();\n\t\t});\n\t}\n\n\tprivate async handleIncomingTask(ws: WebSocket, data: any) {\n\t\tlet { taskId, method, params, userContext } = data;\n\t\tthis._runningTasks.push(taskId);\n\t\tif (!taskId || !method) {\n\t\t\tconsole.log('Invalid task message received', data);\n\t\t\treturn;\n\t\t}\n\n\t\tlet timedOut = false;\n\t\tlet timeoutHandle = setTimeout(async () => {\n\t\t\ttimedOut = true;\n\t\t\tconsole.error(new Date(), 'Worker timed out on task:', taskId, 'Method:', method);\n\n\t\t\tconsole.error(new Date(), `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\n\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\ttype: 'taskComplete',\n\t\t\t\ttaskId,\n\t\t\t\terror: true,\n\t\t\t\tmessage: 'Task timed out'\n\t\t\t});\n\n\t\t\tawait this._methodManager.callMethod('insertErrorLog', `Timeout in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t}, 120000);\n\n\t\ttry {\n\t\t\tlet managerThis = Object.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\tid_user: userContext?.id_user || '',\n\t\t\t\tuser: userContext?.user || '',\n\t\t\t\tid_ws: userContext?.id_ws || ''\n\t\t\t});\n\n\t\t\tlet result = await this._methodManager.callMethod.call(managerThis, method, ...params);\n\n\t\t\tif (!timedOut) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\t\ttype: 'taskComplete',\n\t\t\t\t\ttaskId,\n\t\t\t\t\terror: false,\n\t\t\t\t\tresult\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._runningTasks = this._runningTasks.filter(a => a !== taskId);\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (!timedOut) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\tconsole.error('Worker failed task:', taskId, 'Method:', method, err);\n\t\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\t\ttype: 'taskComplete',\n\t\t\t\t\ttaskId,\n\t\t\t\t\terror: true,\n\t\t\t\t\tmessage: err || 'Unknown error'\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\tconsole.error(new Date(), `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t\t\n\t\t\tawait this._methodManager.callMethod('insertErrorLog', `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t\t\n\t\t\tthis._runningTasks = this._runningTasks.filter(a => a !== taskId);\n\t\t}\n\t}\n\n\tprivate sendWorkerResponse(ws: WebSocket, payload: any) {\n\t\tif (typeof payload !== 'string') {\n\t\t\tpayload = JSON.stringify(payload);\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\ttry {\n\t\t\t\tws.send(payload);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tconsole.error('Failed to send worker response:', err);\n\t\t\t}\n\t\t}\n\t\telse if (ws) {\n\t\t\tws.close();\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._taskQueue.length && !this._runningTasks.length\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\t// For demonstration, let each worker handle up to 2 tasks concurrently\n\t\t\t\tlet maxConcurrency = 2;\n\n\t\t\t\tthis._workers.push({\n\t\t\t\t\tid: workerId,\n\t\t\t\t\tws: ws,\n\t\t\t\t\tactiveTasks: 0,\n\t\t\t\t\tmaxConcurrency: maxConcurrency\n\t\t\t\t});\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.sendWorkerResponse(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.sendWorkerResponse(ws, 'ping');\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 15000);\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.sendWorkerResponse(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.handleWorkerMessage(workerId, 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\tthis._workers = this._workers.filter(w => w.id !== 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\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\t// Check if we can offload to a worker\n\t\t\t\tlet worker = this.findAvailableWorker();\n\t\t\t\tif (this._isWorkersEnabled && \n\t\t\t\t\tworker &&\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) {\n\t\t\t\t\t// Offload to a worker\n\t\t\t\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\t\t\t\t// Store correlation so when worker finishes, we can respond\n\t\t\t\t\tthis._inFlightRequests[taskId] = {\n\t\t\t\t\t\tws,\n\t\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\t\tmethod: methodName\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.queueTask(taskId, 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\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tprivate queueTask(taskId: string, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tthis._taskQueue.push({\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext\n\t\t});\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Try to assign tasks while we have them\n\t\tfor (let i = 0; i < 9999; i++) {\n\t\t\tlet item = this._taskQueue[0];\n\t\t\tif (!item) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlet w = this.findAvailableWorker();\n\t\t\tif (!w) {\n\t\t\t\tbreak; // no worker can take more tasks\n\t\t\t}\n\n\t\t\t// Remove from queue\n\t\t\tthis._taskQueue.shift();\n\t\t\tthis.assignTaskToWorker(w, item);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency. Or null if none.\n\t */\n\tprivate findAvailableWorker(): WorkerConnection | null {\n\t\tlet candidates = this._workers.filter(x => x.activeTasks < x.maxConcurrency);\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Sort by how busy they are\n\t\tcandidates.sort((a, b) => a.activeTasks - b.activeTasks);\n\t\treturn candidates[0];\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskQueueItem) {\n\t\tworker.activeTasks++;\n\n\t\tlet payload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext\n\t\t};\n\n\t\ttry {\n\t\t\tworker.ws.send(JSON.stringify(payload));\n\t\t\t// console.log('Assigned task', task.taskId, 'to worker', worker.id);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\t\t\tworker.activeTasks = Math.max(0, worker.activeTasks - 1);\n\t\t\t// Put task back at front\n\t\t\tthis._taskQueue.unshift(task);\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tprivate handleWorkerMessage(workerId: string, messageStr: string) {\n\t\tlet data: any;\n\t\ttry {\n\t\t\tdata = JSON.parse(messageStr, dateReviver);\n\t\t}\n\t\tcatch {\n\t\t\tconsole.error('Failed to parse worker message:', messageStr);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet w = this._workers.find(x => x.id === workerId);\n\t\t\tif (!w) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tw.activeTasks = Math.max(0, w.activeTasks - 1);\n\n\t\t\tlet { taskId, error, message, result } = data;\n\n\t\t\t// Look up original request\n\t\t\tlet inflight = this._inFlightRequests[taskId];\n\t\t\tif (!inflight) {\n\t\t\t\tconsole.error('No in-flight request found for task:', taskId);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdelete this._inFlightRequests[taskId];\n\n\t\t\t\t// Send the final response to the client\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: inflight.messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = message;\n\t\t\t\t}\n\n\t\t\t\tif (inflight.ws && inflight.ws.readyState === inflight.ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(inflight.ws, res);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tthis.dispatchQueue();\n\t\t}\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}"]}