@resolveio/server-lib 20.7.8 → 20.7.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/collections/cron-job.collection.js.map +1 -1
- package/collections/email-history.collection.js.map +1 -1
- package/collections/email-verified.collection.js.map +1 -1
- package/collections/file.collection.js.map +1 -1
- package/collections/flag-update.collection.js.map +1 -1
- package/collections/flag.collection.js.map +1 -1
- package/collections/log-method-latency.collection.js.map +1 -1
- package/collections/log-subscription.collection.js.map +1 -1
- package/collections/log.collection.js.map +1 -1
- package/collections/logged-in-users.collection.js.map +1 -1
- package/collections/method-response.collection.js.map +1 -1
- package/collections/monitor-cpu.collection.js.map +1 -1
- package/collections/monitor-function.collection.js.map +1 -1
- package/collections/monitor-memory.collection.js.map +1 -1
- package/collections/monitor-mongo.collection.js.map +1 -1
- package/collections/notification.collection.js.map +1 -1
- package/collections/report-builder-dashboard-builder.collection.js.map +1 -1
- package/collections/report-builder-library.collection.js.map +1 -1
- package/collections/report-builder-report.collection.js.map +1 -1
- package/collections/user-group.collection.js.map +1 -1
- package/collections/user.collection.js.map +1 -1
- package/cron/cron.d.ts +1 -1
- package/cron/cron.js +1 -1
- package/cron/cron.js.map +1 -1
- package/http/auth.js.map +1 -1
- package/http/health.d.ts +1 -1
- package/http/health.js +1 -1
- package/http/health.js.map +1 -1
- package/managers/method.manager.js +1 -1
- package/managers/method.manager.js.map +1 -1
- package/managers/mongo.manager.d.ts +1 -1
- package/managers/mongo.manager.js +1 -1
- package/managers/mongo.manager.js.map +1 -1
- package/managers/monitor.manager.js.map +1 -1
- package/managers/subscription.manager.js.map +1 -1
- package/methods/aws.js.map +1 -1
- package/methods/cron-jobs.js +1 -1
- package/methods/cron-jobs.js.map +1 -1
- package/methods/monitor.js.map +1 -1
- package/methods/support.js.map +1 -1
- package/package.json +1 -1
- package/publications/cron-jobs.js.map +1 -1
- package/publications/files.js.map +1 -1
- package/publications/report-builder-reports.js.map +1 -1
- package/server-app.js +1 -1
- package/server-app.js.map +1 -1
- package/util/schema-report-builder.js.map +1 -1
|
@@ -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","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(e) {}\n\t\t\t\t}, 10000);\n\t\t\t}\n\t\t\tcatch(errHealth) {}\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\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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/managers/subscription.manager.ts"],"names":["logged_in_users_collection_1","require","app_status_1","cron_jobs_1","files_1","flags_1","logs_1","method_responses_1","notifications_1","report_builder_reports_1","super_admin_1","resolveio_server_app_1","NodeCache","os_1","flag_collection_1","flags_update_1","report_builder_dashboard_builders_1","report_builder_libraries_1","user_groups_1","user_guides_1","common_1","numCPUs","cpus","length","v8","SubscriptionManager","this","_publications","_subscriptions","_loggedInUsers","_mongoQueue","_mongoQueueId","_cacheId","_heapSize","getHeapStatistics","_enableDebug","_debugOplogCollections","_debugOplogHits","_debugSubCollections","_debugSubHits","_debugUnSubHits","_debugUnSubAllHits","_debugMongoQueueHits","_debugMongoQueueCollections","_debugSendQueueHits","_debugRemoveCacheHits","_oplogRetryCount","latencyBuffer","Map","LATENCY_UPDATE_INTERVAL","LATENCY_UPDATE_THRESHOLD_MS","_invalidationDebounceTimers","_invalidationPendingTimestamps","DEBOUNCE_DELAY","MAX_WAIT_TIME","create","wss","serverConfig","monitorManagerFunction","_this","subscriptionManager","setImmediate","__awaiter","initialize","_a","sent","prototype","_websocketManager","ResolveIOServer","getMainServer","getWebSocketManager","_monitorManagerFunction","_nodeCache","stdTTL","checkperiod","setInterval","flushThrottledLatencyUpdates","_wss","loadSuperAdminPublications","loadAppStatusPublications","loadLogPublications","loadFilePublications","loadCronJobPublications","loadFlagsUpdatePublications","loadFlagsPublications","loadMethodResponsePublications","loadNotificationPublications","loadReportBuilderReportPublications","loadReportBuilderLibraryPublications","loadUserGroupPublications","loadUserGuidePublications","loadReportBuilderDashboardBuilderPublications","tailOpLog","getEnableDebug","console","log","Date","JSON","stringify","sort","a","b","collection","localeCompare","publication","type","LoggedInUsers","find","_b","userCopy","deepCopy","i","loggedInUser","date","now","getTime","this_1","getWebSocket","id_ws","unsubscribeAll","_c","forEach","sub","j","clients","id_socket","splice","deleteOne","_id","findIndex","client","this_2","some","Flags","findOne","flag","value","setCacheLimit","process","env","IS_WORKERS_ENABLED","_heapLimit","invalidatePubsCache","debounceKey","firstInvalidationTime","get","set","has","clearTimeout","delete","_executeInvalidation","setTimeout","getMongoManager","invalidateQueryCache","collSubs","filter","collections","includes","collSubs_1","__values","collSubs_1_1","next","running","runAgain","user_specific","e_1","ws","readyState","OPEN","sendDataToOneWithRetry","messageId","_e","sendDataToAllWithRetry","delay","ms","Promise","resolve","sendDataToAll","sendDataToOne","publications","method","Object","assign","loggedInLatency","existingEntry","newLatency","lastUpdate","Math","abs","latency","size","updates","Array","from","entries","map","__read","updateOne","update","$set","bulkWrite","clear","error","error_1","subscribe","messageRoute","messageDate","subscriptionData","hits","push","pub","check","_schema","valObj","valKeys","keys","rootKeys","validate","errors","urlData","split","urlModule_1","urlNext","otherRouteSubs","startsWith","otherSub","unsubscribe","id_user","getPublicationCollections","cacheId","processSubscription","createLoggedInUser","user","objectIdHexString","__v","insertOne","Error","indexOf","userSubs","removeWebSocket","getActiveSubscriptions","resumeToken","_oplog$","closed","removeAllListeners","close","exit","pipeline","$match","$and","ns.coll","$nin","$not","lastResumeToken_1","getMainDB","watch","resumeAfter","on","doc","ns","coll","operationType","getMethodManager","callMethod","call","documentKey","NODE_APP_INSTANCE","IS_WORKER_INSTANCE","WORKER_INDEX","cacheData","parse","dateReviver","serverRes","hasError","data","sendWS","del","monitor","startMonitorFunction","function","apply","__spreadArray","res","err_3","sendEmail","finishMonitorFunction","subIndex","_g","res_1","_l","done","getBinarySize","endsWith","err","_d","nodeCacheSize","getStats","vsize","deleteCount","subArr","zz","_f","err_4","send","exports"],"mappings":"+xEACAA,8B,0FAAAC,QAAA,2CAAA,GAIAC,aAAAD,QAAA,4BAAA,EACAE,YAAAF,QAAA,2BAAA,EACAG,QAAAH,QAAA,uBAAA,EACAI,QAAAJ,QAAA,uBAAA,EACAK,OAAAL,QAAA,sBAAA,EACAM,mBAAAN,QAAA,kCAAA,EACAO,gBAAAP,QAAA,+BAAA,EACAQ,yBAAAR,QAAA,wCAAA,EACAS,cAAAT,QAAA,6BAAA,EACAU,uBAAAV,QAAA,yBAAA,EAGAW,UAAAX,QAAA,YAAA,EACAY,KAAAZ,QAAA,IAAA,EACAa,kBAAAb,QAAA,gCAAA,EACAc,eAAAd,QAAA,8BAAA,EACAe,oCAAAf,QAAA,mDAAA,EACAgB,2BAAAhB,QAAA,0CAAA,EACAiB,cAAAjB,QAAA,6BAAA,EACAkB,cAAAlB,QAAA,6BAAA,EACAmB,SAAAnB,QAAA,gBAAA,EAGMoB,SAAU,EAAAR,KAAAS,MAAI,EAAGC,OACjBC,GAAKvB,QAAQ,IAAI,EA0BvBwB,oBAAA,WAuDC,SAAAA,sBArDQC,KAAAC,cAAmC,GACnCD,KAAAE,eAA4C,GAE5CF,KAAAG,eAAsC,GAEtCH,KAAAI,YAAiC,GACjCJ,KAAAK,cAAgB,EAKhBL,KAAAM,SAAW,EAEXN,KAAAO,UAAYT,GAAGU,kBAAiB,EAAKb,QAOrCK,KAAAS,aAAe,CAAA,EACfT,KAAAU,uBAAyB,GACzBV,KAAAW,gBAAkB,EAClBX,KAAAY,qBAAuB,GACvBZ,KAAAa,cAAgB,EAChBb,KAAAc,gBAAkB,EAClBd,KAAAe,mBAAqB,EACrBf,KAAAgB,qBAAuB,EACvBhB,KAAAiB,4BAA8B,GAC9BjB,KAAAkB,oBAAsB,EACtBlB,KAAAmB,sBAAwB,EAExBnB,KAAAoB,iBAAmB,EAGnBpB,KAAAqB,cAAgB,IAAIC,IAGXtB,KAAAuB,wBAA0B,IAG1BvB,KAAAwB,4BAA8B,IAMvCxB,KAAAyB,4BAA8B,IAAIH,IAClCtB,KAAA0B,+BAAiC,IAAIJ,IAC5BtB,KAAA2B,eAAiB,IACjB3B,KAAA4B,cAAgB,GAGlB,CA07BhB,OAx7BQ7B,oBAAA8B,OAAP,SAAcC,EAAuBC,EAAcC,GAAnD,IAAAC,EAAAjC,KACOkC,EAAsB,IAAInC,oBAIhC,OAHAoC,aAAa,WAAA,OAAAC,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACZ,MAAA,CAAA,EAAMC,EAAoBG,WAAWP,EAAKC,EAAcC,CAAsB,G,cAA9EM,EAAAC,KAAA,E,SACA,EACML,CACR,EAEcnC,oBAAAyC,UAAAH,WAAd,SAAyBP,EAAuBC,EAAcC,G,uHA+C7D,OA9CAhC,KAAKyC,kBAAoBxD,uBAAAyD,gBAAgBC,cAAa,EAAGC,oBAAmB,EAC5E5C,KAAK6C,wBAA0Bb,EAE/BhC,KAAK8C,WAAa,IAAI5D,UAAW,CAAE6D,OAAQ,EAAGC,YAAa,CAAC,CAAE,EAE9DC,YAAY,WAAM,OAAAhB,EAAKiB,6BAA4B,CAAjC,EAAqClD,KAAKuB,uBAAuB,EAsBnFvB,KAAK+B,aAAeA,EACpB/B,KAAKmD,KAAOrB,GAGZ,EAAA9C,cAAAoE,4BAA2BpD,IAAI,GAC/B,EAAAxB,aAAA6E,2BAA0BrD,IAAI,GAC9B,EAAApB,OAAA0E,qBAAoBtD,IAAI,GACxB,EAAAtB,QAAA6E,sBAAqBvD,IAAI,GACzB,EAAAvB,YAAA+E,yBAAwBxD,IAAI,GAC5B,EAAAX,eAAAoE,6BAA4BzD,IAAI,GAChC,EAAArB,QAAA+E,uBAAsB1D,IAAI,GAC1B,EAAAnB,mBAAA8E,gCAA+B3D,IAAI,GACnC,EAAAlB,gBAAA8E,8BAA6B5D,IAAI,GACjC,EAAAjB,yBAAA8E,qCAAoC7D,IAAI,GACxC,EAAAT,2BAAAuE,sCAAqC9D,IAAI,GACzC,EAAAR,cAAAuE,2BAA0B/D,IAAI,GAC9B,EAAAP,cAAAuE,2BAA0BhE,IAAI,GAC9B,EAAAV,oCAAA2E,+CAA8CjE,IAAI,EAElD,CAAA,EAAMA,KAAKkE,UAAS,G,OAkFT,OAlFX5B,EAAAC,KAAA,EAEAU,YAAY,WACXhB,EAAKb,iBAAmB,CACzB,EAAG,IAAK,EAER6B,YAAY,WACPhB,EAAKkC,eAAc,IACtBC,QAAQC,IAAI,IAAIC,KAAQ,cAAe,OAAQrC,EAAK/B,eAAeL,MAAM,EACzEuE,QAAQC,IAAI,IAAIC,KAAQ,cAAe,kBAAmBrC,EAAK9B,eAAeN,MAAM,EACpFuE,QAAQC,IAAI,IAAIC,KAAQ,cAAe,cAAerC,EAAK7B,YAAYP,MAAM,EAC7EuE,QAAQC,IAAI,IAAIC,KAAQ,cAAe,mBAAoBrC,EAAKjB,oBAAoB,EACpFoD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,0BAA2BC,KAAKC,UAAUvC,EAAKhB,4BAA4BwD,KAAK,SAACC,EAAGC,GAAM,OAAAD,EAAEE,WAAWC,cAAcF,EAAEC,UAAU,GAAKF,EAAEI,YAAYD,cAAcF,EAAEG,WAAW,CAArF,CAAsF,EAAG,KAAM,CAAC,CAAC,EAClOV,QAAQC,IAAI,IAAIC,KAAQ,cAAe,aAAcrC,EAAKtB,eAAe,EACzEyD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,oBAAqBC,KAAKC,UAAUvC,EAAKvB,uBAAuB+D,KAAK,SAACC,EAAGC,GAAM,OAAAD,EAAEE,WAAWC,cAAcF,EAAEC,UAAU,GAAKF,EAAEK,KAAKF,cAAcF,EAAEI,IAAI,CAAvE,CAAwE,EAAG,KAAM,CAAC,CAAC,EACzMX,QAAQC,IAAI,IAAIC,KAAQ,cAAe,kBAAmBrC,EAAKf,mBAAmB,EAClFkD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,WAAYrC,EAAKpB,aAAa,EACrEuD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,kBAAmBC,KAAKC,UAAUvC,EAAKrB,qBAAqB6D,KAAK,SAACC,EAAGC,GAAM,OAAAD,EAAEI,YAAYD,cAAcF,EAAEG,WAAW,CAAzC,CAA0C,EAAG,KAAM,CAAC,CAAC,EACvKV,QAAQC,IAAI,IAAIC,KAAQ,cAAe,aAAcrC,EAAKnB,eAAe,EACzEsD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,iBAAkBrC,EAAKlB,kBAAkB,EAChFqD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,qBAAsBrC,EAAKd,qBAAqB,GAGxFc,EAAKtB,gBAAkB,EACvBsB,EAAKvB,uBAAyB,GAC9BuB,EAAKrB,qBAAuB,GAC5BqB,EAAKjB,qBAAuB,EAC5BiB,EAAKhB,4BAA8B,GACnCgB,EAAKf,oBAAsB,EAC3Be,EAAKpB,cAAgB,EACrBoB,EAAKnB,gBAAkB,EACvBmB,EAAKlB,mBAAqB,EAC1BkB,EAAKd,sBAAwB,CAC9B,EAAG,GAAK,EAER8B,YAAY,WAAA,OAAAb,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,iFACW,OAAtBK,EAAAtC,KAAsB,CAAA,EAAM1B,6BAAA0G,cAAcC,KAAI,G,OAA9C3C,EAAKnC,eAAiB+E,EAAA3C,KAAA,EAElB4C,GAAW,EAAAzF,SAAA0F,UAASpF,KAAKG,cAAc,E,WAClCkF,G,uEAGHC,EAFDA,EAAeH,EAASE,IAEVE,MAAmD,KAA3CjB,KAAKkB,IAAG,EAAKF,EAAaC,KAAKE,QAAO,EAC3DC,EAAKjD,kBAAkBkD,aAAaL,EAAaM,KAAK,GACrDF,EAAKvB,eAAc,GACtBC,QAAQC,IAAI,IAAIC,KAAQ,cAAe,WAAYoB,EAAKjD,kBAAkBkD,aAAaL,EAAaM,KAAK,EAAQ,KAAGF,EAAKjD,kBAAkBkD,aAAaL,EAAaM,KAAK,EAAa,UAAG,CAAC,EAE5L,CAAA,EAAMF,EAAKG,eAAeH,EAAKjD,kBAAkBkD,aAAaL,EAAaM,KAAK,CAAC,IAJ9E,CAAA,EAAA,GADD,CAAA,EAAA,G,cAKFE,EAAAvD,KAAA,E,aAaA,OAVAmD,EAAKxF,eAAe6F,QAAQ,SAAAC,GAC3B,IAAK,IAAIC,EAAID,EAAIE,QAAQrG,OAAS,EAAQ,GAALoG,EAAQA,CAAC,GAChCD,EAAIE,QAAQD,GAEdE,YAAcb,EAAaM,OACrCI,EAAIE,QAAQE,OAAOH,EAAG,CAAC,CAG1B,CAAC,EAED,CAAA,EAAM3H,6BAAA0G,cAAcqB,UAAU,CAACC,IAAKhB,EAAagB,GAAG,CAAC,G,OAArDR,EAAAvD,KAAA,EAEsE,GAAlEmD,EAAKvF,eAAeoG,UAAU,SAAA7B,GAAK,OAAAA,EAAE4B,MAAQhB,EAAagB,GAAvB,CAA0B,GAChEZ,EAAKvF,eAAeiG,OAAOV,EAAKvF,eAAeoG,UAAU,SAAA7B,GAAK,OAAAA,EAAE4B,MAAQhB,EAAagB,GAAvB,CAA0B,EAAG,CAAC,E,+BAxBvFjB,G,QAASlF,eAAeN,OAAS,E,wBAAQ,GAALwF,E,KAApCA,CAAC,GAAyC,CAAA,EAAA,G,wCAAEA,CAAC,G,aA8BtD,IAASA,EAAI,EAAGA,EAAIrF,KAAKE,eAAeL,OAAQwF,CAAC,GAGhD,IAFIW,EAAMhG,KAAKE,eAAemF,G,WAErBY,GACR,IAAIO,EAASR,EAAIE,QAAQD,GAEpBQ,EAAKtG,eAAeuG,KAAK,SAAAhC,GAAK,OAAAA,EAAEkB,QAAUY,EAAOL,SAAnB,CAA4B,GAC9DH,EAAIE,QAAQE,OAAOH,EAAG,CAAC,C,SAJhBA,EAAID,EAAIE,QAAQrG,OAAS,EAAQ,GAALoG,EAAQA,CAAC,G,EAArCA,CAAC,E,gBAQT,GAAK,EAEG,CAAA,EAAM7G,kBAAAuH,MAAMC,QAAQ,CAAC7B,KAAM,cAAc,CAAC,G,cAAjD8B,EAAOvE,EAAAC,KAAA,IAECsE,EAAKC,MAChB9G,KAAKS,aAAe,CAAA,EAGpBT,KAAKS,aAAe,CAAA,EAGrBT,KAAK+G,cAAa,E,UAGXhH,oBAAAyC,UAAAuE,cAAR,WACwC,SAAnCC,QAAQC,IAAIC,mBACflH,KAAKmH,WAA8B,GAAjBnH,KAAKO,UAGvBP,KAAKmH,WAA8B,GAAjBnH,KAAKO,SAEzB,EAEaR,oBAAAyC,UAAA4E,oBAAb,SAAiCxC,EAAoBG,G,kIAC9CsC,EAAczC,EACdY,EAAMlB,KAAKkB,IAAG,EAGd8B,EAAwBtH,KAAK0B,+BAA+B6F,IAAIF,CAAW,GAAK7B,EACtFxF,KAAK0B,+BAA+B8F,IAAIH,EAAaC,CAAqB,EAGtEtH,KAAKyB,4BAA4BgG,IAAIJ,CAAW,GACnDK,aAAa1H,KAAKyB,4BAA4B8F,IAAIF,CAAW,CAAC,EAIxC7B,EAAM8B,GAA0BtH,KAAK4B,gBAI3D5B,KAAK0B,+BAA+BiG,OAAON,CAAW,EACtD,CAAA,EAAMrH,KAAK4H,qBAAqBhD,EAAYG,CAAI,IAH7C,CAAA,EAAA,G,cAGHzC,EAAAC,KAAA,E,aAGAvC,KAAKyB,4BAA4B+F,IAChCH,EACAQ,WAAW,WAAA,OAAAzF,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DAEV,OADAjC,KAAK0B,+BAA+BiG,OAAON,CAAW,EACtD,CAAA,EAAMrH,KAAK4H,qBAAqBhD,EAAYG,CAAI,G,cAAhDzC,EAAAC,KAAA,E,UACEvC,KAAK2B,cAAc,CAAC,E,iCAKZ5B,oBAAAyC,UAAAoF,qBAAd,SAAmChD,EAAoBG,G,wIAElD/E,KAAKyB,4BAA4BgG,IAAI7C,CAAU,IAClD8C,aAAa1H,KAAKyB,4BAA4B8F,IAAI3C,CAAU,CAAC,EAC7D5E,KAAKyB,4BAA4BkG,OAAO/C,CAAU,GAInD3F,uBAAAyD,gBAAgBoF,gBAAe,EAAGC,qBAAqBnD,CAAU,EAE3DoD,EAAWhI,KAAKE,eAAe+H,OAAO,SAAAvD,GAAK,OAAAA,EAAEwD,YAAYC,SAASvD,CAAU,CAAjC,CAAkC,E,2CAEjEwD,EAAAC,SAAAL,CAAQ,EAAAM,EAAAF,EAAAG,KAAA,E,wCAKzB,GALUvC,EAAGsC,EAAAxB,MACT9G,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB0B,EAAIlB,YAAakB,EAAIwC,QAASxC,EAAIyC,QAAQ,EAGjFzC,EAAIwC,QAEP,OADAxC,EAAIyC,SAAW,CAAA,EACf,CAAA,EAAA,I,IAGGzI,KAAKC,cAAc+F,EAAIlB,aAAa4D,cAApC,MAAA,CAAA,EAAA,I,2CACgBC,EAAA,KAAA,EAAArG,EAAA+F,SAAArC,EAAIE,OAAO,EAAAhB,EAAA5C,EAAAiG,KAAA,E,0CAArB/B,EAAMtB,EAAA4B,OAEV8B,OADEA,EAAK5I,KAAKyC,kBAAkBkD,aAAaa,EAAOL,SAAS,GACzD,KAAA,EAAFyC,EAAIC,cAAeD,EAAGE,KAAtB,MAAA,CAAA,EAAA,G,iBAEF,O,sBAAA,CAAA,EAAM9I,KAAK+I,uBAAuBH,EAAIpC,EAAOwC,UAAWhD,EAAKpB,EAAYG,CAAI,G,cAA7EkE,EAAA1G,KAAA,E,qPASH,MAAA,CAAA,EAAMvC,KAAKkJ,uBAAuBlD,EAAKpB,EAAYG,CAAI,G,QAAvDkE,EAAA1G,KAAA,E,0NAKWxC,oBAAAyC,UAAA2G,MAAd,SAAoBC,G,mFAEnB,MAAA,CAAA,EAAO,IAAIC,QAAQ,SAAAC,GAAW,OAAAzB,WAAWyB,EAASF,CAAE,CAAtB,CAAuB,E,MAGxCrJ,oBAAAyC,UAAA0G,uBAAd,SAAqClD,EAA8BpB,EAAoBG,G,0GACtFiB,EAAIwC,QAAU,CAAA,E,iBAQb,OALIxI,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B0B,EAAIlB,WAAW,EAGrEkB,EAAIyC,SAAW,CAAA,EACf,CAAA,EAAMzI,KAAKuJ,cAAcvD,EAAKpB,EAAYG,CAAI,G,cAA9CzC,EAAAC,KAAA,EAEIvC,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,yBAA0B0B,EAAIlB,YAAakB,EAAIyC,QAAQ,EAG5EzC,EAAIyC,UACP,CAAA,EAAMzI,KAAKmJ,MAAM,GAAG,GADjB,CAAA,EAAA,G,OACH7G,EAAAC,KAAA,E,oBAEOyD,EAAIyC,SAAQ,MAAA,CAAA,EAAA,G,wBAErBzC,EAAIwC,QAAU,CAAA,E,UAGDzI,oBAAAyC,UAAAuG,uBAAd,SAAqCH,EAAeI,EAAmBhD,EAA8BpB,EAAoBG,G,0GACxHiB,EAAIwC,QAAU,CAAA,E,iBAQb,OALIxI,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B0B,EAAIlB,WAAW,EAGrEkB,EAAIyC,SAAW,CAAA,EACf,CAAA,EAAMzI,KAAKwJ,cAAcZ,EAAII,EAAWhD,EAAKpB,EAAYG,CAAI,G,cAA7DzC,EAAAC,KAAA,EAEIvC,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,yBAA0B0B,EAAIlB,YAAakB,EAAIyC,QAAQ,EAG5EzC,EAAIyC,UACP,CAAA,EAAMzI,KAAKmJ,MAAM,GAAG,GADjB,CAAA,EAAA,G,OACH7G,EAAAC,KAAA,E,oBAEOyD,EAAIyC,SAAQ,MAAA,CAAA,EAAA,G,wBACrBzC,EAAIwC,QAAU,CAAA,E,UAIRzI,oBAAAyC,UAAAiH,aAAP,SAAoBC,GACnB1J,KAAKC,cAAgB0J,OAAOC,OAAO5J,KAAKC,cAAeyJ,CAAM,CAC9D,EAGO3J,oBAAAyC,UAAAqH,gBAAP,SAAuBjB,GACtB,IAGMpD,EACAsE,EACAC,EALFzE,EAAetF,KAAKG,eAAe8E,KAAK,SAAAP,GAAK,OAAAA,EAAEkB,QAAUgD,EAAc,SAA1B,CAA2B,EACvEtD,IAECE,EAAM,IAAIlB,KACVwF,EAAgB9J,KAAKqB,cAAckG,IAAIqB,EAAc,SAAC,EACtDmB,EAAanB,EAAY,QAI9B,CAACkB,GACAtE,EAAIC,QAAO,EAAKqE,EAAcE,WAAWvE,QAAO,GAAMzF,KAAKwB,6BACZ,IAA/CyI,KAAKC,IAAIH,EAAaD,EAAcK,OAAO,KAG5C7E,EAAaC,KAAOC,EACpBxF,KAAKqB,cAAcmG,IAAIoB,EAAc,UAAG,CAAEuB,QAASJ,EAAYC,WAAYxE,CAAG,CAAE,EAElF,EAGczF,oBAAAyC,UAAAU,6BAAd,W,kHACC,GAAgC,IAA5BlD,KAAKqB,cAAc+I,KAAY,MAAA,CAAA,GAE7BC,EAAUC,MAAMC,KAAKvK,KAAKqB,cAAcmJ,QAAO,CAAE,EAAEC,IAAI,SAACnI,G,IAAA4C,EAAAwF,OAAApI,EAAA,CAAA,EAACsD,EAAKV,EAAA,GAAEY,EAAAZ,EAAA,GAA6B,MAAA,CAClGyF,UAAW,CACV1C,OAAQ,CAAErC,MAAKA,CAAA,EACfgF,OAAQ,CAAEC,KAAM,CAAEV,QAH2DrE,EAAAqE,QAGlD5E,KAH8DO,EAAAkE,UAG9C,CAAE,C,CAE9C,CALkG,CAKjG,E,iBAGD,O,sBAAA,CAAA,EAAM1L,6BAAA0G,cAAc8F,UAAUT,CAAO,G,cAArC/H,EAAAC,KAAA,EACAvC,KAAKqB,cAAc0J,MAAK,EAEpB/K,KAAKmE,eAAc,GACtBC,QAAQC,IAAI,IAAIC,KAAQ,cAAe,4CAA6C+F,EAAQxK,MAAM,E,+BAInGuE,QAAQ4G,MAAM,IAAI1G,KAAQ,cAAe,wCAAyC2G,CAAK,E,6BAM5ElL,oBAAAyC,UAAA0I,UAAb,SAAuBC,EAAsBC,EAAmBxC,EAAeI,EAAmBlE,EAAqBuG,G,0IACtHrL,KAAKa,eAAiB,EAEjBb,KAAKY,qBAAqB8F,KAAK,SAAAhC,GAAK,OAAAA,EAAEI,cAAgBA,CAAlB,CAA6B,EAOrE9E,KAAKY,qBAAqBqE,KAAK,SAAAP,GAAK,OAAAA,EAAEI,cAAgBA,CAAlB,CAA6B,EAAEwG,MAAQ,EAN3EtL,KAAKY,qBAAqB2K,KAAK,CAC9BzG,YAAaA,EACbwG,KAAM,C,CACN,EAMEE,EAAMxL,KAAKC,cAAc6E,IAEzB,CAAA,EAAA,IACHV,QAAQ4G,MAAM,IAAI1G,KAAQ,mBAAqBQ,CAAW,EAC1D,CAAA,I,OAGA,GAA8B,EAA1BuG,EAAiBxL,QAAcwL,EAAiB,GAAI,CACvD,GAAKG,CAAAA,EAAIC,MAER,OADArH,QAAQ4G,MAAM,IAAI1G,KAAQ,6BAA+BQ,CAAW,EACpE,CAAA,GAEI,GAAK0G,CAAAA,EAAIC,MAAMC,QAEnB,OADAtH,QAAQ4G,MAAM,IAAI1G,KAAQ,2BAA6BQ,CAAW,EAClE,CAAA,GAQA,IALI6G,EAAS,GACTC,EAAUjC,OAAOkC,KAAKL,EAAIC,MAAMC,OAAO,EAEvCI,EAAWF,EAAQ3D,OAAO,SAAAvD,GAAK,MAAA,CAACA,EAAEyD,SAAS,GAAG,CAAf,CAAgB,EAE1C9C,EAAI,EAAGA,EAAIgG,EAAiBxL,OAAQwF,CAAC,GAC7CsG,EAAOG,EAASzG,IAAMgG,EAAiBhG,GAGxC,IACCmG,EAAIC,MAAMM,SAASJ,CAAM,C,CAE1B,MAAOK,GACN,GAAIA,EAEH,OADA5H,QAAQ4G,MAAM,IAAI1G,KAAQ,uBAAyBQ,EAAc,IAAKkH,CAAM,EAC5E,CAAA,E,EA2EJ,MArEqB,WAAjBb,IACCc,EAAUd,EAAae,MAAM,GAAG,EAChCC,EAAY,GACZC,EAAUH,EAAQ,GAEH,KAAfA,EAAQ,KACXE,EAAY,IACZC,EAAUH,EAAQ,IAGnBE,GAAaC,EAEQ,EAAjBH,EAAQpM,SACXsM,GAAa,MAGVE,EAAiBrM,KAAKE,eAAe+H,OAAO,SAAAvD,GAAK,OAAAA,EAAEwB,QAAQQ,KAAK,SAAA/B,GAAK,OAAAA,EAAEwB,YAAcyC,EAAc,WAAwB,WAAnBjE,EAAEwG,cAAgD,MAAnBxG,EAAEwG,cAAwBxG,EAAEwG,eAAiBA,GAAgB,CAACxG,EAAEwG,aAAamB,WAAWH,CAAS,CAAnK,CAAoK,CAAxL,CAAyL,GAE3NtM,SAGlBwM,EAAetG,QAAQ,SAAAwG,GACtBA,EAASrG,QAAQ+B,OAAO,SAAAvD,GAAK,OAAAA,EAAEyB,YAAcyC,EAAc,SAA9B,CAA+B,EAAE7C,QAAQ,SAAAS,GACrEvE,EAAKuK,YAAYhG,EAAO2E,aAAc,IAAI7G,KAAQsE,EAAIpC,EAAOwC,UAAWuD,EAASzH,YAAayH,EAASlB,gBAAgB,CACxH,CAAC,CACF,CAAC,GAICrF,EAAMhG,KAAKE,eAAe+E,KAAK,SAAAP,GAAK,OAAAA,EAAEI,cAAgBA,GAAeP,KAAKC,UAAUE,EAAE2G,gBAAgB,IAAM9G,KAAKC,UAAU6G,CAAgB,CAAvG,CAAwG,GAI1IrF,EAAIE,QAAQQ,KAAK,SAAAhC,GAAK,OAAAA,EAAEyB,YAAcyC,EAAc,WAAKlE,EAAEsE,YAAcA,CAAnD,CAA4D,GACtFhD,EAAIE,QAAQqF,KAAK,CAChBkB,QAAS7D,EAAY,QACrBI,UAAWA,EACX7C,UAAWyC,EAAc,UACzBuC,aAAcA,C,CACd,EAKFnL,KAAKE,eAAeqL,KAAK,CACxBzG,YAAaA,EACbuG,iBAAkBA,EAClBnD,YAAalI,KAAK0M,0BAA0B5H,CAAW,EACvDoB,QAAS,CAAC,CACTuG,QAAS7D,EAAY,QACrBI,UAAWA,EACX7C,UAAWyC,EAAc,UACzBuC,aAAcA,C,GAEfwB,QAAS,EACTnE,QAAS,CAAA,EACTC,SAAU,CAAA,C,CACV,EAGGzC,EAAAA,GACEhG,KAAKE,eAAe+E,KAAK,SAAAP,GAAK,OAAAA,EAAEI,cAAgBA,GAAeP,KAAKC,UAAUE,EAAE2G,gBAAgB,IAAM9G,KAAKC,UAAU6G,CAAgB,CAAvG,CAAwG,EAGzIrL,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,UAAW0B,EAAIlB,YAAakB,EAAIwC,QAASxC,EAAIyC,SAAUzC,EAAIE,QAAQrG,MAAM,EAIlG,CAAA,EAAMG,KAAK4M,oBAAoB5G,EAAK4C,EAAII,CAAS,G,OAAjD1G,EAAAC,KAAA,E,iCAIWxC,oBAAAyC,UAAAqK,mBAAb,SAAgCjH,G,yHAC3BgD,EAAK5I,KAAKyC,kBAAkBkD,aAAaC,CAAK,IAG7CkH,EAAO,CACVxG,KAAK,EAAA5G,SAAAqN,mBAAiB,EACtBC,IAAK,EACLzH,KAAM,IAAIjB,KACVmI,QAAS7D,EAAY,QACrBkE,KAAMlE,EAAS,KACfhD,MAAOgD,EAAc,S,EAGtB5I,KAAKG,eAAeoL,KAAKuB,CAAI,EAC7B,CAAA,EAAMxO,6BAAA0G,cAAciI,UAAUH,CAAI,IAX/B,CAAA,EAAA,G,OAaH,OAFAxK,EAAAC,KAAA,EAEA,CAAA,EAAOuK,G,OAGP,MAAM,IAAII,MAAM,uCAAuC,C,OAKlDnN,oBAAAyC,UAAAgK,YAAP,SAAmBrB,EAAsBC,EAAmBxC,EAAeI,EAAmBlE,EAAqBuG,GAGlH,GAFArL,KAAKc,iBAAmB,EAEnBd,KAAKC,cAAc6E,GAInB,CACJ,IAAIkB,EAAMhG,KAAKE,eAAe+E,KAAK,SAAAP,GAAK,OAAAA,EAAEI,cAAgBA,GAAeP,KAAKC,UAAUE,EAAE2G,gBAAgB,IAAM9G,KAAKC,UAAU6G,CAAgB,CAAvG,CAAwG,EAEhJ,GAAIrF,EAAK,CACR,IAAK,IAAIX,EAAIW,EAAIE,QAAQrG,OAAS,EAAQ,GAALwF,EAAQA,CAAC,GACzCW,EAAIE,QAAQb,GAAGoH,UAAY7D,EAAY,SAAK5C,EAAIE,QAAQb,GAAG2D,YAAcA,GAAahD,EAAIE,QAAQb,GAAGc,YAAcyC,EAAc,WACpI5C,EAAIE,QAAQE,OAAOf,EAAG,CAAC,EAIrBrF,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,QAAS0B,EAAIlB,YAAakB,EAAIwC,QAASxC,EAAIyC,SAAUzC,EAAIE,QAAQrG,MAAM,C,OAdjGuE,QAAQC,IAAI,mBAAqBS,CAAW,CAkB9C,EAIa/E,oBAAAyC,UAAAqD,eAAb,SAA4B+C,G,6HAC3B5I,KAAKe,oBAAsB,EAEvB6H,GAECA,EAAmB,eACtB,CAAA,IAIDA,EAAmB,eAAI,CAAA,EAE+C,GAAlE5I,KAAKG,eAAesK,IAAI,SAAA/F,GAAK,OAAAA,EAAEkB,KAAF,CAAO,EAAEuH,QAAQvE,EAAc,SAAC,GAChE5I,KAAKG,eAAeiG,OAAOpG,KAAKG,eAAesK,IAAI,SAAA/F,GAAK,OAAAA,EAAEkB,KAAF,CAAO,EAAEuH,QAAQvE,EAAc,SAAC,EAAG,CAAC,EAG7F,CAAA,EAAMtK,6BAAA0G,cAAcqB,UAAU,CAAET,MAAOgD,EAAc,SAAC,CAAE,IAbrD,CAAA,EAAA,G,OAiBH,IAJAtG,EAAAC,KAAA,EAEI6K,EAAWpN,KAAKE,eAAe+H,OAAO,SAAAvD,GAAK,OAAAA,EAAEwB,QAAQQ,KAAK,SAAA/B,GAAK,OAAAA,EAAE8H,UAAY7D,EAAY,SAAKjE,EAAEwB,YAAcyC,EAAc,SAA7D,CAA8D,CAAlF,CAAmF,EAEzHvD,EAAI+H,EAASvN,OAAS,EAAQ,GAALwF,EAAQA,CAAC,GAG1C,IAFIW,EAAMoH,EAAS/H,GAEVY,EAAID,EAAIE,QAAQrG,OAAS,EAAQ,GAALoG,EAAQA,CAAC,GACzCD,EAAIE,QAAQD,GAAGE,YAAcyC,EAAc,WAC9C5C,EAAIE,QAAQE,OAAOH,EAAG,CAAC,EAK1BjG,KAAKyC,kBAAkB4K,gBAAgBzE,CAAE,E,iCAIpC7I,oBAAAyC,UAAA8K,uBAAP,WACC,OAAOtN,KAAKE,cACb,EAGQH,oBAAAyC,UAAAkK,0BAAR,SAAkC5H,GACjC,OAAO9E,KAAKC,cAAc6E,GAAaoD,WACxC,EAGcnI,oBAAAyC,UAAA0B,UAAd,SAAwBqJ,G,+HACnBvN,CAAAA,KAAKwN,SAAYxN,KAAKwN,QAAQC,OAA9B,CAAA,EAAA,IACHzN,KAAKwN,QAAQE,mBAAkB,EAC/B,CAAA,EAAM1N,KAAKwN,QAAQG,MAAK,I,OAAxBrL,EAAAC,KAAA,EACAvC,KAAKwN,QAAU,K,iBAIhB,MAAA,CAAA,EAAM,IAAInE,QAAQ,SAAAC,GAAW,OAAAzB,WAAWyB,EAAS,GAAI,CAAxB,CAAyB,G,UAAtDhH,EAAAC,KAAA,EAEKvC,KAAKwN,SAAWxN,CAAAA,KAAKwN,QAAQC,OAA9B,MAAA,CAAA,EAAA,I,GACHzN,KAAKoB,kBAAoB,EAEG,EAAxBpB,KAAKoB,mBACRgD,QAAQ4G,MAAM,4GAA4G,EAC1HhE,QAAQ4G,KAAK,CAAC,GAGTC,EAAW,CAChB,CACCC,OAAQ,CACPC,KAAM,CACL,CAACC,UAAW,CAAEC,KAAM,CACnB,uBACA,oBACA,OACA,WACA,qBACA,kBACA,4BACA,4BACA,mBACA,kBACA,CAAE,EACH,CAACD,UAAW,CAAEE,KAAM,eAAe,CAAE,EACrC,CAACF,UAAW,CAAEE,KAAM,WAAW,CAAE,E,KAQjCX,EAAA,MAAA,CAAA,EAAA,IACHY,EAAkBZ,E,8CAEjBvN,KAAKwN,QAAUvO,uBAAAyD,gBAAgB0L,UAAS,EAAGC,MAAMR,EAAU,CAAES,YAAaf,CAAW,CAAE,E,6BAGnFvN,KAAKwN,UACRxN,KAAKwN,QAAQE,mBAAkB,EAC/B,CAAA,EAAM1N,KAAKwN,QAAQG,MAAK,IAFrB,CAAA,EAAA,G,OAEHrL,EAAAC,KAAA,EACAvC,KAAKwN,QAAU,K,iBAGhB,MAAA,CAAA,EAAMxN,KAAKkE,UAAUqJ,CAAW,G,OAChC,OADAjL,EAAAC,KAAA,EACA,CAAA,G,4BAIDvC,KAAKwN,QAAUvO,uBAAAyD,gBAAgB0L,UAAS,EAAGC,MAAMR,CAAQ,E,mBAG1DzJ,QAAQC,IAAI,IAAIC,KAAQ,eAAe,EAEvCtE,KAAKwN,QAAQe,GAAG,SAAU,SAAOC,GAAuH,OAAApM,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,0EACnJuM,EAAIC,IACHzO,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,YAAakK,EAAIC,EAAE,EAGxC7J,EAAa4J,EAAIC,GAAGC,KAEnB1O,KAAKU,uBAAuBgG,KAAK,SAAAhC,GAAK,OAAAA,EAAEE,aAAe4J,EAAIC,GAAGC,MAAQhK,EAAEK,OAASyJ,EAAIG,aAA/C,CAA4D,EAQtG3O,KAAKU,uBAAuBuE,KAAK,SAAAP,GAAK,OAAAA,EAAEE,aAAe4J,EAAIC,GAAGC,MAAQhK,EAAEK,OAASyJ,EAAIG,aAA/C,CAA4D,EAAErD,MAAQ,EAP5GtL,KAAKU,uBAAuB6K,KAAK,CAChC3G,WAAY4J,EAAIC,GAAGC,KACnB3J,KAAMyJ,EAAIG,cACVrD,KAAM,C,CACN,EAME1G,GACH5E,KAAKW,iBAAmB,EAEE,WAAtB6N,EAAIG,cAAJ,CAAA,EAAA,GACgB,oBAAf/J,GACmC,0BAAlC5E,KAAK+B,aAAuB,SAA5B,CAAA,EAAA,IACH9C,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGC,WAAWC,KAAK7P,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAI,yBAA0BJ,EAAIO,YAAiB,GAAC,EACvK,CAAA,EAAM/O,KAAKoH,oBAAoBxC,EAAY,QAAQ,KAPnD,CAAA,EAAA,KAlBD,CAAA,EAAA,I,OAyBCtC,EAAAC,KAAA,E,uBAIiB,qBAAfqC,EAAA,CAAA,EAAA,GACH,CAAA,EAAM5E,KAAKoH,oBAAoBxC,EAAY,QAAQ,G,OAAnDtC,EAAAC,KAAA,E,2CAG6B,WAAtBiM,EAAIG,eAAoD,YAAtBH,EAAIG,cAAtC,CAAA,EAAA,GACW,qBAAf/J,EAAA,CAAA,EAAA,GACH,CAAA,EAAM5E,KAAKoH,oBAAoBxC,EAAY,QAAQ,G,OAAnDtC,EAAAC,KAAA,E,2CAG6B,WAAtBiM,EAAIG,cAAJ,CAAA,EAAA,IACW,qBAAf/J,EAAA,CAAA,EAAA,IACH,CAAA,EAAM5E,KAAKoH,oBAAoBxC,EAAY,QAAQ,G,OAAnDtC,EAAAC,KAAA,E,yBAKgB,UAAfqC,EAAA,CAAA,EAAA,IACQ,CAAA,EAAMxF,kBAAAuH,MAAMC,QAAQ,CAAE7B,KAAM,cAAc,CAAE,G,SAAnD8B,EAAOvE,EAAAC,KAAA,IAECsE,EAAKC,MAChB9G,KAAKS,aAAe,CAAA,EAGpBT,KAAKS,aAAe,CAAA,E,mBAItB0N,EAAkBK,EAAIlI,IAEhBU,QAAQC,IAAI+H,mBAAuD,MAAlChI,QAAQC,IAAI+H,mBAAkE,UAAnChI,QAAQC,IAAIC,oBAAsE,SAAnCF,QAAQC,IAAIgI,oBAAiCjI,QAAQC,IAAIiI,a,kCAI3L,EAEDlP,KAAKwN,QAAQe,GAAG,QAAS,SAAMvD,GAAK,OAAA5I,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DAEnC,OADAmC,QAAQC,IAAI,IAAIC,KAAQ,cAAe0G,CAAK,EAC5C,CAAA,EAAMhL,KAAKwN,QAAQG,MAAK,G,cAAxBrL,EAAAC,KAAA,E,SACA,EAEDvC,KAAKwN,QAAQe,GAAG,MAAO,WAAA,OAAAnM,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DAEtB,OADAmC,QAAQC,IAAI,IAAIC,KAAQ,WAAW,EACnC,CAAA,EAAMtE,KAAKwN,QAAQG,MAAK,G,cAAxBrL,EAAAC,KAAA,E,SACA,EAEDvC,KAAKwN,QAAQe,GAAG,QAAS,WAAA,OAAAnM,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DAIxB,OAHAmC,QAAQC,IAAI,IAAIC,KAAQ,aAAa,EACrCtE,KAAKwN,QAAQE,mBAAkB,EAC/B1N,KAAKwN,QAAU,KACf,CAAA,EAAMxN,KAAKkE,UAAUiK,CAAe,G,cAApC7L,EAAAC,KAAA,E,SACA,E,mCAIWxC,oBAAAyC,UAAAoK,oBAAd,SAAkC5G,EAA8B4C,EAAeI,G,mHACzEhJ,KAAKC,cAAc+F,EAAIlB,aAAa4D,cAArC,MAAA,CAAA,EAAA,G,IACC1C,EAAI2G,QAAJ,MAAA,CAAA,EAAA,G,8CAEEwC,EAAY5K,KAAK6K,MAAMpP,KAAK8C,WAAWyE,IAAIvB,EAAI2G,OAAO,EAAGjN,SAAA2P,WAAW,EAEpEC,EAAiC,CACpCtG,UAAWA,EACXuG,SAAU,CAAA,EACVC,KAAML,C,EAGHnP,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,qBAAsB0B,EAAIlB,WAAW,EAG9D9E,KAAKyP,OAAO7G,EAAI0G,CAAS,E,aAMzB,O,SAHAtP,KAAK8C,WAAW4M,IAAI1J,EAAI2G,OAAO,EAC/B3G,EAAI2G,QAAU,EAEd,CAAA,EAAM3M,KAAKkJ,uBAAuBlD,EAAK,GAAI,QAAQ,G,cAAnD1D,EAAAC,KAAA,E,gCAQD,OAJIvC,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,2BAA4B0B,EAAIlB,YAAakB,EAAIwC,OAAO,EAG7ExC,EAAIwC,QACP,CAAA,GAGD,CAAA,EAAMxI,KAAKkJ,uBAAuBlD,EAAK,GAAI,QAAQ,G,OAAnD1D,EAAAC,KAAA,E,qCAQD,OAJIvC,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,oCAAqC0B,EAAIlB,YAAakB,EAAIwC,OAAO,EAGtFxC,EAAIwC,QACP,CAAA,GAGD,CAAA,EAAMxI,KAAK+I,uBAAuBH,EAAII,EAAWhD,EAAK,GAAI,QAAQ,G,OAAlE1D,EAAAC,KAAA,E,mCAIYxC,oBAAAyC,UAAAgH,cAAd,SAA4BZ,EAAeI,EAAmBhD,EAA8BpB,EAAoBG,G,sHAC3G4K,EAAU3P,KAAK6C,wBAAwB+M,qBAAqB,4BAA6B5J,EAAIlB,YAAa,GAAI,GAAIkB,EAAIqF,gBAAgB,E,iBAI/H,O,uBAFVpM,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGC,WAAWC,KAAK7P,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAI,wBAAyB7J,EAAMiB,EAAIlB,YAAaF,EAAYL,KAAKC,UAAUwB,EAAIqF,gBAAgB,CAAC,EAE7M,CAAA,GAAM/I,EAAAtC,KAAKC,cAAc+F,EAAIlB,aAAa+K,UAASf,KAAIgB,MAAAxN,EAAAyN,cAAA,CAACpG,OAAOC,OAAO,GAAI5J,KAAMD,oBAAoByC,SAAS,EAAGoG,EAAY,SAAC8B,OAAK1E,EAAIqF,gBAAgB,EAAA,CAAA,CAAA,CAAA,G,cAA5J2E,EAAM9K,EAAA3C,KAAA,EAEN+M,EAAiC,CACpCtG,UAAWA,EACXuG,SAAU,CAAA,EACVC,KAAMQ,C,EAGPhQ,KAAKyP,OAAO7G,EAAI0G,CAAS,E,aAWzB,O,WARIA,EAAiC,CACpCtG,UAAWA,EACXuG,SAAU,CAAA,EACVC,KAAMS,C,EAGPjQ,KAAKyP,OAAO7G,EAAI0G,CAAS,EAEzB,CAAA,EAAMrQ,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGsB,UAAU,oBAAqB,6BAA+BlQ,KAAK+B,aAA0B,YAAG,sCAAwCiE,EAAIlB,YAAc,qCAAuCP,KAAKC,UAAUwB,EAAIqF,iBAAkB,KAAM,CAAC,EAAI,eAAiB9G,KAAKC,UAAUyL,EAAK,KAAM,CAAC,CAAC,G,cAAvV/K,EAAA3C,KAAA,E,aAGA,MAAA,CAAA,EAAMvC,KAAK6C,wBAAwBsN,sBAAsBR,CAAO,G,cAAhEzK,EAAA3C,KAAA,E,2BAKYxC,oBAAAyC,UAAA+G,cAAd,SAA4BvD,EAA8BpB,EAAoBG,G,4KACxEiB,EAAIE,QAAQrG,OAAb,CAAA,EAAA,IACCmG,EAAI2G,UACP3M,KAAK8C,WAAW4M,IAAI1J,EAAI2G,OAAO,EAC/B3G,EAAI2G,QAAU,GAIC,IADZyD,EAAWpQ,KAAKE,eAAeqG,UAAU,SAAA7B,GAAK,OAAAA,EAAEI,cAAgBkB,EAAIlB,aAAeP,KAAKC,UAAUE,EAAE2G,gBAAgB,IAAM9G,KAAKC,UAAUwB,EAAIqF,gBAAgB,CAA/G,CAAgH,IAEjKrL,KAAKE,eAAekG,OAAOgK,EAAU,CAAC,EAGvC,CAAA,I,OAGIT,EAAU3P,KAAK6C,wBAAwB+M,qBAAqB,cAAe5J,EAAIlB,YAAa,GAAI,GAAIkB,EAAIqF,gBAAgB,E,iBAOjH,O,uBAJc,kBAApBrF,EAAIlB,aAAuD,kBAApBkB,EAAIlB,aAC9C7F,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGC,WAAWC,KAAK7P,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAI,wBAAyB7J,EAAMiB,EAAIlB,YAAaF,EAAYL,KAAKC,UAAUwB,EAAIqF,gBAAgB,CAAC,EAG9M,CAAA,GAAMgF,EAAArQ,KAAKC,cAAc+F,EAAIlB,aAAa+K,UAASf,KAAIgB,MAAAO,EAAAN,cAAA,CAACpG,OAAOC,OAAO,GAAI5J,KAAMD,oBAAoByC,SAAS,GAACkI,OAAK1E,EAAIqF,gBAAgB,EAAA,CAAA,CAAA,CAAA,G,OAEjJ,GAFIiF,EAAMC,EAAAhO,KAAA,EAENyD,EAAI2G,QACP,IAGC,GAFIwC,EAAY5K,KAAK6K,MAAMpP,KAAK8C,WAAWyE,IAAIvB,EAAI2G,OAAO,EAAGjN,SAAA2P,WAAW,EAEpE9K,KAAKC,UAAU2K,CAAS,IAAM5K,KAAKC,UAAU8L,CAAG,EAAG,C,IACtD,IAAmBhO,EAAA+F,SAAArC,EAAIE,OAAO,EAAAhB,EAAA5C,EAAAiG,KAAA,EAAA,CAAArD,EAAAsL,KAAAtL,EAAA5C,EAAAiG,KAAA,EAArB/B,EAAMtB,EAAA4B,OACV8B,EAAK5I,KAAKyC,kBAAkBkD,aAAaa,EAAOL,SAAS,IACnDyC,EAAGC,aAAeD,EAAGE,OAC1BwG,EAAiC,CACpCtG,UAAWxC,EAAOwC,UAClBuG,SAAU,CAAA,EACVC,KAAMc,C,EAGPtQ,KAAKyP,OAAO7G,EAAI0G,CAAS,E,kGAI3BtP,KAAK8C,WAAW4M,IAAI1J,EAAI2G,OAAO,GAE3B,EAAAjN,SAAA+Q,eAAclM,KAAKC,UAAU8L,CAAG,CAAC,EAAI,KACxC,CAACtK,EAAIkC,YAAYC,SAAS,MAAM,GAChC,CAACnC,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAEgM,SAAS,WAAW,CAAtB,CAAuB,GAClD,CAAC1K,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAE4H,WAAW,UAAU,CAAvB,CAAwB,EAEnDtM,KAAK8C,WAAW0E,IAAIxB,EAAI2G,QAASpI,KAAKC,UAAU8L,CAAG,CAAC,EAGpDtK,EAAI2G,QAAU,C,EAIjB,MAAOgE,GACN3K,EAAIE,QAAQuE,IAAI,SAAAjE,GACf,IAAIoC,EAAK3G,EAAKQ,kBAAkBkD,aAAaa,EAAOL,SAAS,EACzDyC,GAAMA,EAAGC,aAAeD,EAAGE,OAC1BwG,EAAiC,CACpCtG,UAAWxC,EAAOwC,UAClBuG,SAAU,CAAA,EACVC,KAAMc,C,EAGPrO,EAAKwN,OAAO7G,EAAI0G,CAAS,EAE3B,CAAC,EAEDtP,KAAK8C,WAAW4M,IAAI1J,EAAI2G,OAAO,GAE3B,EAAAjN,SAAA+Q,eAAclM,KAAKC,UAAU8L,CAAG,CAAC,EAAI,KACxC,CAACtK,EAAIkC,YAAYC,SAAS,MAAM,GAChC,CAACnC,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAEgM,SAAS,WAAW,CAAtB,CAAuB,GAClD,CAAC1K,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAE4H,WAAW,UAAU,CAAvB,CAAwB,EAEnDtM,KAAK8C,WAAW0E,IAAIxB,EAAI2G,QAASpI,KAAKC,UAAU8L,CAAG,CAAC,EAGpDtK,EAAI2G,QAAU,C,KAIZ,C,IACJ,IAAmB7G,EAAAuC,SAAArC,EAAIE,OAAO,EAAA0K,EAAA9K,EAAAyC,KAAA,EAAA,CAAAqI,EAAAJ,KAAAI,EAAA9K,EAAAyC,KAAA,EAArB/B,EAAMoK,EAAA9J,OACV8B,EAAK5I,KAAKyC,kBAAkBkD,aAAaa,EAAOL,SAAS,IACnDyC,EAAGC,aAAeD,EAAGE,OAC1BwG,EAAiC,CACpCtG,UAAWxC,EAAOwC,UAClBuG,SAAU,CAAA,EACVC,KAAMc,C,EAGPtQ,KAAKyP,OAAO7G,EAAI0G,CAAS,E,kGAI3B,IAAI,EAAA5P,SAAA+Q,eAAclM,KAAKC,UAAU8L,CAAG,CAAC,EAAI,KACxC,CAACtK,EAAIkC,YAAYC,SAAS,MAAM,GAChC,CAACnC,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAEgM,SAAS,WAAW,CAAtB,CAAuB,GAClD,CAAC1K,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAE4H,WAAW,UAAU,CAAvB,CAAwB,GAOnD,GALAtG,EAAI2G,QAAU3M,KAAKM,QAAQ,GAC3BN,KAAK8C,WAAW0E,IAAIxB,EAAI2G,QAASpI,KAAKC,UAAU8L,CAAG,CAAC,GAE9CO,EAAgB7Q,KAAK8C,WAAWgO,SAAQ,EAAGC,OAE7B/Q,KAAKmH,WAAY,CAKpC,IAHI6J,EAAc,EACZC,EAASjR,KAAKE,eAAe+H,OAAO,SAAAvD,GAAK,OAAAA,EAAEiI,SAAW,CAACjI,EAAEwB,QAAQrG,MAAxB,CAA8B,EAEpEqR,EAAK,EAAGA,EAAKD,EAAOpR,SAC5BG,KAAKmB,uBAAyB,EAC9BnB,KAAK8C,WAAW4M,IAAIuB,EAAOC,GAAIvE,OAAO,EACtCsE,EAAOC,GAAIvE,QAAU,EACrBqE,GAAe,EACXhR,EAAAA,KAAK8C,WAAWgO,SAAQ,EAAGC,MAA0B,IAAlB/Q,KAAKmH,aALR+J,CAAE,IAUnClR,KAAKS,cACR2D,QAAQC,IACP,wBAEA2B,EAAIlB,YACJ,eACAkM,EACA,MACAH,CAAa,C,OAMhB7K,EAAI2G,QAAU,C,mCAKhB,IAAmB1D,EAAAZ,SAAArC,EAAIE,OAAO,EAAAiL,EAAAlI,EAAAV,KAAA,EAAA,CAAA4I,EAAAX,KAAAW,EAAAlI,EAAAV,KAAA,EAArB/B,EAAM2K,EAAArK,OACV8B,EAAK5I,KAAKyC,kBAAkBkD,aAAaa,EAAOL,SAAS,IACnDyC,EAAGC,aAAeD,EAAGE,OAC1BwG,EAAiC,CACpCtG,UAAWxC,EAAOwC,UAClBuG,SAAU,CAAA,EACVC,KAAM4B,C,EAGPpR,KAAKyP,OAAO7G,EAAI0G,CAAS,E,kGAI3B,MAAA,CAAA,EAAMrQ,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGsB,UAAU,oBAAqB,6BAA+BlQ,KAAK+B,aAA0B,YAAG,sCAAwCiE,EAAIlB,YAAc,8BAAgCP,KAAKC,UAAUwB,EAAIqF,iBAAkB,KAAM,CAAC,EAAI,eAAiB9G,KAAKC,UAAU4M,EAAK,KAAM,CAAC,CAAC,G,cAAhVb,EAAAhO,KAAA,E,aAGA,MAAA,CAAA,EAAMvC,KAAK6C,wBAAwBsN,sBAAsBR,CAAO,G,cAAhEY,EAAAhO,KAAA,E,2BAKKxC,oBAAAyC,UAAAiN,OAAR,SAAe7G,EAAe4G,GAC7BxP,KAAKyC,kBAAkB4O,KAAKzI,EAAI4G,CAAI,CACrC,EAEOzP,oBAAAyC,UAAA2B,eAAP,WACC,OAAOnE,KAAKS,YACb,EACDV,mBAAA,EAAC,EAj/BYuR,QAAAvR,oBAAAA","file":"subscription.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { LoggedInUsers } from '../collections/logged-in-users.collection';\nimport { LoggedInUserModel } from '../models/logged-in-users.model';\nimport { ServerResponseModel } from '../models/server-response.model';\nimport { ActiveSubscriptionModel, SubscriptionModel } from '../models/subscription.model';\nimport { loadAppStatusPublications } from '../publications/app-status';\nimport { loadCronJobPublications } from '../publications/cron-jobs';\nimport { loadFilePublications } from '../publications/files';\nimport { loadFlagsPublications } from '../publications/flags';\nimport { loadLogPublications } from '../publications/logs';\nimport { loadMethodResponsePublications } from '../publications/method-responses';\nimport { loadNotificationPublications } from '../publications/notifications';\nimport { loadReportBuilderReportPublications } from '../publications/report-builder-reports';\nimport { loadSuperAdminPublications } from '../publications/super-admin';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nimport { ChangeStream, ChangeStreamDeleteDocument, ChangeStreamInsertDocument, ChangeStreamReplaceDocument, ChangeStreamUpdateDocument, ResumeToken } from 'mongodb';\nimport * as NodeCache from 'node-cache';\nimport { cpus } from 'os';\nimport { Flags } from '../collections/flag.collection';\nimport { loadFlagsUpdatePublications } from '../publications/flags-update';\nimport { loadReportBuilderDashboardBuilderPublications } from '../publications/report-builder-dashboard-builders';\nimport { loadReportBuilderLibraryPublications } from '../publications/report-builder-libraries';\nimport { loadUserGroupPublications } from '../publications/user-groups';\nimport { loadUserGuidePublications } from '../publications/user-guides';\nimport { dateReviver, deepCopy, getBinarySize, objectIdHexString } from '../util/common';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { WebSocketManager } from './websocket.manager';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\n\n// Performance Dependencies\n// import * as path from 'path';\n// import { Worker } from 'worker_threads';\n\ninterface MongoQueueModel {\n\t_id: number,\n\ttype: string;\n\tcollection: string;\n\tsubscription: ActiveSubscriptionModel;\n\trunning: boolean;\n\trun_again: boolean;\n}\n\n// interface CurrentPerformanceMonitor {\n// \t_id: number;\n// \tfunction: string;\n// \tpublication: string;\n// \tsubscriptionData: any[];\n// \tdate_start: Date;\n// \tdate_end: Date;\n// \tduration: number;\n// \tresult: string;\n// }\n\nexport class SubscriptionManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _publications: SubscriptionModel = {};\n\tprivate _subscriptions: ActiveSubscriptionModel[] = [];\n\tprivate _wss: WebSocket.Server;\n\tprivate _loggedInUsers: LoggedInUserModel[] = [];\n\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\t\n\tprivate _oplog$: ChangeStream;\n\n\tprivate _nodeCache;\n\tprivate _cacheId = 1;\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate serverConfig;\n\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\n\tprivate _enableDebug = false;\n\tprivate _debugOplogCollections = [];\n\tprivate _debugOplogHits = 0;\n\tprivate _debugSubCollections = [];\n\tprivate _debugSubHits = 0;\n\tprivate _debugUnSubHits = 0;\n\tprivate _debugUnSubAllHits = 0;\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _debugSendQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\n\tprivate _oplogRetryCount = 0;\n\n\t// Buffer to store throttled latency updates with timestamps\n\tprivate latencyBuffer = new Map<string, { latency: number, lastUpdate: Date }>();\n\n\t// Interval to flush latency updates in MongoDB\n\tprivate readonly LATENCY_UPDATE_INTERVAL = 60000;\n\n\t// Minimum time difference between two latency updates for the same user\n\tprivate readonly LATENCY_UPDATE_THRESHOLD_MS = 30000;\n\n\t// private currentPerfomanceMonitor: CurrentPerformanceMonitor[] = [];\n\t// private idPerformance: number = 0;\n\t// private performanceThread;\n\n\tprivate _invalidationDebounceTimers = new Map<string, NodeJS.Timeout>();\n\tprivate _invalidationPendingTimestamps = new Map<string, number>();\n\tprivate readonly DEBOUNCE_DELAY = 100; // 100ms debounce window\n\tprivate readonly MAX_WAIT_TIME = 500; // 500ms maximum delay\n\n\n\tconstructor() {}\n\t\n\tstatic create(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tconst subscriptionManager = new SubscriptionManager();\n\t\tsetImmediate(async () => {\n\t\t\tawait subscriptionManager.initialize(wss, serverConfig, monitorManagerFunction);\n\t\t});\n\t\treturn subscriptionManager;\n\t}\n\t\n\tprivate async initialize(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tthis._websocketManager = ResolveIOServer.getMainServer().getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\tsetInterval(() => this.flushThrottledLatencyUpdates(), this.LATENCY_UPDATE_INTERVAL);\n\n\t\t// setTimeout(() => {\n\t\t// \tconsole.log('Setting up performance thread');\n\n\t\t// \tthis.performanceThread = new Worker(path.join(__dirname, './subscription.performance.js'));\n\n\t\t// \tthis.performanceThread.on('exit', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD EXITED!!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\n\t\t// \tthis.performanceThread.on('error', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD RECV ERROR !!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\t\t// }, 5000);\n\n\t\t// setInterval(() => {\n\t\t// \tconsole.log('Post thread msg');\n\t\t// \tthis.performanceThread.postMessage(this.currentPerfomanceMonitor);\n\t\t// \tthis.currentPerfomanceMonitor = [];\n\t\t// }, 10000);\n\n\t\tthis.serverConfig = serverConfig;\n\t\tthis._wss = wss;\n\n\t\t// Publications\n\t\tloadSuperAdminPublications(this);\n\t\tloadAppStatusPublications(this);\n\t\tloadLogPublications(this);\n\t\tloadFilePublications(this);\n\t\tloadCronJobPublications(this);\n\t\tloadFlagsUpdatePublications(this);\n\t\tloadFlagsPublications(this);\n\t\tloadMethodResponsePublications(this);\n\t\tloadNotificationPublications(this);\n\t\tloadReportBuilderReportPublications(this);\n\t\tloadReportBuilderLibraryPublications(this);\n\t\tloadUserGroupPublications(this);\n\t\tloadUserGuidePublications(this);\n\t\tloadReportBuilderDashboardBuilderPublications(this);\n\n\t\tawait this.tailOpLog();\n\n\t\tsetInterval(() => {\n\t\t\tthis._oplogRetryCount = 0;\n\t\t}, 15000);\n\n\t\tsetInterval(() => {\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Subs', this._subscriptions.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Logged In Users', this._loggedInUsers.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue', this._mongoQueue.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Collections', JSON.stringify(this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Hits', this._debugOplogHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Collections', JSON.stringify(this._debugOplogCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.type.localeCompare(b.type)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Hits', this._debugSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Collections', JSON.stringify(this._debugSubCollections.sort((a, b) => a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub Hits', this._debugUnSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub All Hits', this._debugUnSubAllHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Cache Cleanup Hits', this._debugRemoveCacheHits);\n\t\t\t}\n\t\t\t\n\t\t\tthis._debugOplogHits = 0;\n\t\t\tthis._debugOplogCollections = [];\n\t\t\tthis._debugSubCollections = [];\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t\tthis._debugSubHits = 0;\n\t\t\tthis._debugUnSubHits = 0;\n\t\t\tthis._debugUnSubAllHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t}, 60000);\n\n\t\tsetInterval(async () => {\n\t\t\tthis._loggedInUsers = await LoggedInUsers.find();\n\t\n\t\t\tlet userCopy = deepCopy(this._loggedInUsers);\n\t\t\tfor (let i = this._loggedInUsers.length - 1; i >= 0; i--) {\n\t\t\t\tlet loggedInUser = userCopy[i];\n\n\t\t\t\tif (!loggedInUser.date || Date.now() - loggedInUser.date.getTime() > 120000) {\n\t\t\t\t\tif (this._websocketManager.getWebSocket(loggedInUser.id_ws)) {\n\t\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', this._websocketManager.getWebSocket(loggedInUser.id_ws)['user'], this._websocketManager.getWebSocket(loggedInUser.id_ws)['id_socket'], 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.unsubscribeAll(this._websocketManager.getWebSocket(loggedInUser.id_ws));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._subscriptions.forEach(sub => {\n\t\t\t\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\t\t\t\tif (client.id_socket === loggedInUser.id_ws) {\n\t\t\t\t\t\t\t\t\tsub.clients.splice(j, 1);\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\n\t\t\t\t\t\tawait LoggedInUsers.deleteOne({_id: loggedInUser._id});\n\n\t\t\t\t\t\tif (this._loggedInUsers.findIndex(a => a._id === loggedInUser._id) >= 0) {\n\t\t\t\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.findIndex(a => a._id === loggedInUser._id), 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < this._subscriptions.length; i++) {\n\t\t\t\tlet sub = this._subscriptions[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\tif (!this._loggedInUsers.some(a => a.id_ws === client.id_socket)) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 30000);\n\n\t\tlet flag = await Flags.findOne({type: 'Enable Debug'});\n\n\t\tif (flag && flag.value) {\n\t\t\tthis._enableDebug = true;\n\t\t}\n\t\telse {\n\t\t\tthis._enableDebug = false;\n\t\t}\n\n\t\tthis.setCacheLimit();\n\t}\n\n\tprivate setCacheLimit() {\t\n\t\tif (process.env.IS_WORKERS_ENABLED === 'true') {\n\t\t\tthis._heapLimit = this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3; // Use 50% of total heap size\n\t\t}\n\t}\n\n\tpublic async invalidatePubsCache(collection: string, type: string) {\n\t\tconst debounceKey = collection;\n\t\tconst now = Date.now();\n\t\n\t\t// Initialize or get existing timestamp\n\t\tconst firstInvalidationTime = this._invalidationPendingTimestamps.get(debounceKey) || now;\n\t\tthis._invalidationPendingTimestamps.set(debounceKey, firstInvalidationTime);\n\t\n\t\t// Clear any existing timer\n\t\tif (this._invalidationDebounceTimers.has(debounceKey)) {\n\t\t\tclearTimeout(this._invalidationDebounceTimers.get(debounceKey));\n\t\t}\n\t\n\t\t// Check if we've waited too long\n\t\tconst waitedTooLong = (now - firstInvalidationTime) >= this.MAX_WAIT_TIME;\n\t\t\n\t\tif (waitedTooLong) {\n\t\t\t// Immediate execution path\n\t\t\tthis._invalidationPendingTimestamps.delete(debounceKey);\n\t\t\tawait this._executeInvalidation(collection, type);\n\t\t} else {\n\t\t\t// Normal debounce path\n\t\t\tthis._invalidationDebounceTimers.set(\n\t\t\t\tdebounceKey,\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tthis._invalidationPendingTimestamps.delete(debounceKey);\n\t\t\t\t\tawait this._executeInvalidation(collection, type);\n\t\t\t\t}, this.DEBOUNCE_DELAY)\n\t\t\t);\n\t\t}\n\t}\n\t\n\tprivate async _executeInvalidation(collection: string, type: string) {\n\t\t// Clean up any existing timer (defensive)\n\t\tif (this._invalidationDebounceTimers.has(collection)) {\n\t\t\tclearTimeout(this._invalidationDebounceTimers.get(collection));\n\t\t\tthis._invalidationDebounceTimers.delete(collection);\n\t\t}\n\t\n\t\t// Original invalidation logic\n\t\tResolveIOServer.getMongoManager().invalidateQueryCache(collection);\n\t\n\t\tconst collSubs = this._subscriptions.filter(a => a.collections.includes(collection));\n\t\n\t\tfor (const sub of collSubs) {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Invalidate Sub', sub.publication, sub.running, sub.runAgain);\n\t\t\t}\n\t\n\t\t\tif (sub.running) {\n\t\t\t\tsub.runAgain = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tif (this._publications[sub.publication].user_specific) {\n\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\tconst ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\tif (ws?.readyState === ws.OPEN) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.sendDataToOneWithRetry(ws, client.messageId, sub, collection, type);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t// Error handling\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\telse {\n\t\t\t\tawait this.sendDataToAllWithRetry(sub, collection, type);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async delay(ms: number) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tprivate async sendDataToAllWithRetry(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToAll Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToAll(sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToAll Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\n\t\tsub.running = false;\n\t}\n\n\tprivate async sendDataToOneWithRetry(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToOne Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToOne(ws, messageId, sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToOne Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\t\tsub.running = false;\n\t}\n\n\t// Add all files to publications private object\n\tpublic publications(method: SubscriptionModel) {\n\t\tthis._publications = Object.assign(this._publications, method);\n\t}\n\n\t// Throttled `loggedInLatency` method\n\tpublic loggedInLatency(ws: WebSocket) {\n\t\tlet loggedInUser = this._loggedInUsers.find(a => a.id_ws === ws['id_socket']);\n\t\tif (!loggedInUser) return;\n\n\t\tconst now = new Date();\n\t\tconst existingEntry = this.latencyBuffer.get(ws['id_socket']);\n\t\tconst newLatency = ws['latency'];\n\n\t\t// Throttle updates: only update if time threshold has passed or latency has significantly changed\n\t\tif (\n\t\t\t!existingEntry || \n\t\t\t(now.getTime() - existingEntry.lastUpdate.getTime() >= this.LATENCY_UPDATE_THRESHOLD_MS) || \n\t\t\t(Math.abs(newLatency - existingEntry.latency) > 100) // Optional: log only significant changes\n\t\t) {\n\t\t\t// Update in-memory and buffer\n\t\t\tloggedInUser.date = now;\n\t\t\tthis.latencyBuffer.set(ws['id_socket'], { latency: newLatency, lastUpdate: now });\n\t\t}\n\t}\n\n\t// Method to flush buffered latency updates in bulk\n\tprivate async flushThrottledLatencyUpdates() {\n\t\tif (this.latencyBuffer.size === 0) return; // No updates to flush\n\n\t\tconst updates = Array.from(this.latencyBuffer.entries()).map(([id_ws, { latency, lastUpdate }]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { id_ws },\n\t\t\t\tupdate: { $set: { latency, date: lastUpdate } }\n\t\t\t}\n\t\t}));\n\n\t\ttry {\n\t\t\tawait LoggedInUsers.bulkWrite(updates);\n\t\t\tthis.latencyBuffer.clear(); // Clear buffer after successful update\n\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Throttled latency batch update successful', updates.length);\n\t\t\t}\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'Sub Manager', 'Throttled latency batch update failed', error);\n\t\t\t// Optional: implement retry logic or logging for failed updates\n\t\t}\n\t}\n\n\t// Subscribe to publication\n\tpublic async subscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugSubHits += 1;\n\n\t\tif (!this._debugSubCollections.some(a => a.publication === publication)) {\n\t\t\tthis._debugSubCollections.push({\n\t\t\t\tpublication: publication,\n\t\t\t\thits: 1\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis._debugSubCollections.find(a => a.publication === publication).hits += 1;\n\t\t}\n\n\t\tlet pub = this._publications[publication];\n\n\t\tif (!pub) {\n\t\t\tconsole.error(new Date(), 'No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tif (subscriptionData.length > 1 || subscriptionData[0]) {\n\t\t\t\tif (!pub.check) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Function For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (!pub.check._schema) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Schema For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet valObj = {};\n\t\t\t\t\tlet valKeys = Object.keys(pub.check._schema);\n\n\t\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\n\t\t\t\t\tfor (let i = 0; i < subscriptionData.length; i++) {\n\t\t\t\t\t\tvalObj[rootKeys[i]] = subscriptionData[i];\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpub.check.validate(valObj);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (errors) {\n\t\t\t\t\t\tif (errors) {\n\t\t\t\t\t\t\tconsole.error(new Date(), 'Error in Pub Check (' + publication + ')', errors);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (messageRoute !== 'Bypass') {\n\t\t\t\tlet urlData = messageRoute.split('/');\n\t\t\t\tlet urlModule = '';\n\t\t\t\tlet urlNext = urlData[0];\n\n\t\t\t\tif (urlData[0] === '') {\n\t\t\t\t\turlModule = '/';\n\t\t\t\t\turlNext = urlData[1];\n\t\t\t\t}\n\n\t\t\t\turlModule += urlNext;\n\n\t\t\t\tif (urlData.length > 1) {\n\t\t\t\t\turlModule += '/';\n\t\t\t\t}\n\n\t\t\t\tlet otherRouteSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_socket === ws['id_socket'] && b.messageRoute !== 'Bypass' && b.messageRoute !== '/' && b.messageRoute !== messageRoute && !b.messageRoute.startsWith(urlModule)));\n\n\t\t\t\tif (otherRouteSubs.length) {\n\t\t\t\t\t// ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Detected Undestroyed Subscription - ' + this.serverConfig['CLIENT_NAME'], 'USER: ' + ws['user'] + ' (Socket: ' + ws['id_socket'] + ') ' + ' is on route: ' + messageRoute + ' but has the following subscriptions on other routes:' + JSON.stringify(otherRouteSubs, null, 2));\n\n\t\t\t\t\totherRouteSubs.forEach(otherSub => {\n\t\t\t\t\t\totherSub.clients.filter(a => a.id_socket === ws['id_socket']).forEach(client => {\n\t\t\t\t\t\t\tthis.unsubscribe(client.messageRoute, new Date(), ws, client.messageId, otherSub.publication, otherSub.subscriptionData);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\t// If sub found (another user watching same data), add client to same sub\n\t\t\tif (sub) {\n\t\t\t\tif (!sub.clients.some(a => a.id_socket === ws['id_socket'] && a.messageId === messageId)) {\n\t\t\t\t\tsub.clients.push({\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If sub not found, create new sub\n\t\t\telse {\n\t\t\t\tthis._subscriptions.push({\n\t\t\t\t\tpublication: publication,\n\t\t\t\t\tsubscriptionData: subscriptionData,\n\t\t\t\t\tcollections: this.getPublicationCollections(publication),\n\t\t\t\t\tclients: [{\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute,\n\t\t\t\t\t}],\n\t\t\t\t\tcacheId: 0,\n\t\t\t\t\trunning: false,\n\t\t\t\t\trunAgain: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!sub) {\n\t\t\t\tsub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\t\t\t}\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'New Sub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t}\n\n\t\t\t// Immediately send data to the new client\n\t\t\tawait this.processSubscription(sub, ws, messageId);\n\t\t}\n\t}\n\n\tpublic async createLoggedInUser(id_ws: string): Promise<LoggedInUserModel> {\n\t\tlet ws = this._websocketManager.getWebSocket(id_ws);\n\n\t\tif (ws) {\n\t\t\tlet user = {\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t__v: 0,\n\t\t\t\tdate: new Date(),\n\t\t\t\tid_user: ws['id_user'],\n\t\t\t\tuser: ws['user'],\n\t\t\t\tid_ws: ws['id_socket']\n\t\t\t};\n\t\t\t\n\t\t\tthis._loggedInUsers.push(user);\n\t\t\tawait LoggedInUsers.insertOne(user);\n\t\t\t\n\t\t\treturn user;\n\t\t}\n\t\telse {\n\t\t\tthrow new Error('Error in Create Logged In User: No WS');\n\t\t}\n\t}\n\n\t// Unsubscribe from publication \n\tpublic unsubscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\t\t\n\t\tthis._debugUnSubHits += 1;\n\n\t\tif (!this._publications[publication]) {\n\t\t\tconsole.log('No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\tif (sub) {\n\t\t\t\tfor (let i = sub.clients.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (sub.clients[i].id_user === ws['id_user'] && sub.clients[i].messageId === messageId && sub.clients[i].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Unsub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Unsubscribe from publication\n\tpublic async unsubscribeAll(ws: WebSocket) {\n\t\tthis._debugUnSubAllHits += 1;\n\n\t\tif (ws) {\n\t\t\t// Check if WebSocket has already been unsubscribed\n\t\t\tif (ws['isUnsubscribed']) {\n\t\t\t\treturn; // Skip if already unsubscribed\n\t\t\t}\n\t\t\t\n\t\t\t// Mark the WebSocket as unsubscribed to prevent further calls\n\t\t\tws['isUnsubscribed'] = true;\n\t\t\t\n\t\t\tif (this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']) >= 0) {\n\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']), 1);\n\t\t\t}\n\t\t\t\n\t\t\tawait LoggedInUsers.deleteOne({ id_ws: ws['id_socket'] });\n\n\t\t\tlet userSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_user === ws['id_user'] && b.id_socket === ws['id_socket']));\n\n\t\t\tfor (let i = userSubs.length - 1; i >= 0; i--) {\n\t\t\t\tlet sub = userSubs[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tif (sub.clients[j].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._websocketManager.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic getActiveSubscriptions() {\n\t\treturn this._subscriptions;\n\t}\n\n\t// Get publication collection\n\tprivate getPublicationCollections(publication: string) {\n\t\treturn this._publications[publication].collections;\n\t}\n\n\t// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)\n\tprivate async tailOpLog(resumeToken?: ResumeToken) {\n\t\tif (this._oplog$ && !this._oplog$.closed) {\n\t\t\tthis._oplog$.removeAllListeners();\n\t\t\tawait this._oplog$.close();\n\t\t\tthis._oplog$ = null;\n\t\t}\n\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\n\t\tif (!this._oplog$ || this._oplog$.closed) {\n\t\t\tthis._oplogRetryCount += 1;\n\n\t\t\tif (this._oplogRetryCount > 5) {\n\t\t\t\tconsole.error('****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst pipeline = [\n\t\t\t\t{\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t{'ns.coll': { $nin: [\n\t\t\t\t\t\t\t\t'log-method-latencies', \n\t\t\t\t\t\t\t\t'log-subscriptions', \n\t\t\t\t\t\t\t\t'logs', \n\t\t\t\t\t\t\t\t'counters', \n\t\t\t\t\t\t\t\t'cron-job-histories', \n\t\t\t\t\t\t\t\t'email-histories',\n\t\t\t\t\t\t\t\t'qb-soap-request-histories', \n\t\t\t\t\t\t\t\t'qb-soap-request-responses', \n\t\t\t\t\t\t\t\t'qb-soap-requests',\n\t\t\t\t\t\t\t\t'qb-soap-retries'\n\t\t\t\t\t\t\t] }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tlet lastResumeToken: ResumeToken;\n\n\t\t\tif (resumeToken) {\n\t\t\t\tlastResumeToken = resumeToken;\n\t\t\t\ttry {\n\t\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch(pipeline, { resumeAfter: resumeToken });\n\t\t\t\t}\n\t\t\t\tcatch (errOp) {\n\t\t\t\t\tif (this._oplog$) {\n\t\t\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\t\t\tawait this._oplog$.close();\n\t\t\t\t\t\tthis._oplog$ = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait this.tailOpLog(resumeToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch(pipeline);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'oplog started');\n\n\t\t\tthis._oplog$.on('change', async (doc: ChangeStreamInsertDocument | ChangeStreamUpdateDocument | ChangeStreamReplaceDocument | ChangeStreamDeleteDocument) => {\n\t\t\t\tif (doc.ns) {\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Oplog Hit', doc.ns);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet collection = doc.ns.coll;\n\n\t\t\t\t\tif (!this._debugOplogCollections.some(a => a.collection === doc.ns.coll && a.type === doc.operationType)) {\n\t\t\t\t\t\tthis._debugOplogCollections.push({\n\t\t\t\t\t\t\tcollection: doc.ns.coll,\n\t\t\t\t\t\t\ttype: doc.operationType,\n\t\t\t\t\t\t\thits: 1\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\tthis._debugOplogCollections.find(a => a.collection === doc.ns.coll && a.type === doc.operationType).hits += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection) {\n\t\t\t\t\t\tthis._debugOplogHits += 1;\n\n\t\t\t\t\t\tif (doc.operationType === 'insert') {\n\t\t\t\t\t\t\tif (collection === 'support-tickets') {\n\t\t\t\t\t\t\t\tif (this.serverConfig['ROOT_URL'] === 'https://resolveio.com') {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'sendSupportTicketEmail', doc.documentKey['_id']);\n\t\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'update' || doc.operationType === 'replace') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'update');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'delete') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'delete');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection === 'flags') {\n\t\t\t\t\t\tlet flag = await Flags.findOne({ type: 'Enable Debug' });\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (flag && flag.value) {\n\t\t\t\t\t\t\tthis._enableDebug = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis._enableDebug = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlastResumeToken = doc._id;\n\n\t\t\t\t\tif ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && (process.env.IS_WORKERS_ENABLED === 'false' || (process.env.IS_WORKER_INSTANCE === 'true' && process.env.WORKER_INDEX === '0'))) {\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._oplog$.on('error', async error => {\n\t\t\t\tconsole.log(new Date(), 'oplog error', error);\n\t\t\t\tawait this._oplog$.close();\n\t\t\t});\n\n\t\t\tthis._oplog$.on('end', async () => {\n\t\t\t\tconsole.log(new Date(), 'oplog end');\n\t\t\t\tawait this._oplog$.close();\n\t\t\t});\n\n\t\t\tthis._oplog$.on('close', async () => {\n\t\t\t\tconsole.log(new Date(), 'oplog close');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tawait this.tailOpLog(lastResumeToken);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async processSubscription(sub: ActiveSubscriptionModel, ws: WebSocket, messageId: number) {\n\t\tif (!this._publications[sub.publication].user_specific) {\t\t\t\n\t\t\tif (sub.cacheId) {\n\t\t\t\ttry {\n\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\tdata: cacheData\n\t\t\t\t\t};\n\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Cache', sub.publication);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\tsub.cacheId = 0;\n\n\t\t\t\t\tawait this.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Non - Cache', sub.publication, sub.running);\n\t\t\t\t}\n\n\t\t\t\tif (sub.running) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait this.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Process Sub Specific, Non - Cache', sub.publication, sub.running);\n\t\t\t}\n\n\t\t\tif (sub.running) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tawait this.sendDataToOneWithRetry(ws, messageId, sub, '', 'newSub');\n\t\t}\n\t}\n\n\tprivate async sendDataToOne(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('User Specific Publication', sub.publication, '', '', sub.subscriptionData);\n\t\ttry {\n\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\n\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ws['id_user'], ...sub.subscriptionData);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: res\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t}\n\t\tcatch (err) {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: err\n\t\t\t};\n\t\t\t\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\n\t\t\tawait ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendDataToOne - WS)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t}\n\t\tfinally {\n\t\t\tawait this._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToAll(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tif (!sub.clients.length) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\tsub.cacheId = 0;\n\t\t\t}\n\n\t\t\tlet subIndex = this._subscriptions.findIndex(a => a.publication === sub.publication && JSON.stringify(a.subscriptionData) === JSON.stringify(sub.subscriptionData));\n\t\t\tif (subIndex >= 0) {\n\t\t\t\tthis._subscriptions.splice(subIndex, 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Publication', sub.publication, '', '', sub.subscriptionData);\n\n\t\t\ttry {\n\t\t\t\tif (sub.publication !== 'superadminAPM' && sub.publication !== 'loggedInUsers') {\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\t\t\t\t}\n\n\t\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ...sub.subscriptionData);\n\n\t\t\t\tif (sub.cacheId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\t\n\t\t\t\t\t\tif (JSON.stringify(cacheData) !== JSON.stringify(res)) {\n\t\t\t\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsub.cacheId = 0;\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\tcatch (err) {\n\t\t\t\t\t\tsub.clients.map(client => {\n\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\n\t\t\t\t\t\tconst nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\t\t\t\t// Evict cache entries as needed\n\t\t\t\t\t\t\tlet deleteCount = 0;\n\t\t\t\t\t\t\tconst subArr = this._subscriptions.filter(a => a.cacheId && !a.clients.length);\n\t\t\t\t\t\n\t\t\t\t\t\t\tfor (let zz = 0; zz < subArr.length; zz++) {\n\t\t\t\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\t\t\t\tthis._nodeCache.del(subArr[zz].cacheId);\n\t\t\t\t\t\t\t\tsubArr[zz].cacheId = 0;\n\t\t\t\t\t\t\t\tdeleteCount += 1;\n\t\t\t\t\t\t\t\tif (this._nodeCache.getStats().vsize < this._heapLimit * 0.75) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t'Sub Cache: ' +\n\t\t\t\t\t\t\t\t\t'Too Big - ' +\n\t\t\t\t\t\t\t\t\tsub.publication +\n\t\t\t\t\t\t\t\t\t' - Deleted: ' +\n\t\t\t\t\t\t\t\t\tdeleteCount +\n\t\t\t\t\t\t\t\t\t' - ' +\n\t\t\t\t\t\t\t\t\tnodeCacheSize\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\tsub.cacheId = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\thasError: true,\n\t\t\t\t\t\t\tdata: err\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tawait ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendPubData)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\tawait this._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate sendWS(ws: WebSocket, data: ServerResponseModel) {\n\t\tthis._websocketManager.send(ws, data);\n\t}\n\n\tpublic getEnableDebug() {\n\t\treturn this._enableDebug;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/managers/subscription.manager.ts"],"names":["logged_in_users_collection_1","require","app_status_1","cron_jobs_1","files_1","flags_1","logs_1","method_responses_1","notifications_1","report_builder_reports_1","super_admin_1","resolveio_server_app_1","NodeCache","os_1","flag_collection_1","flags_update_1","report_builder_dashboard_builders_1","report_builder_libraries_1","user_groups_1","user_guides_1","common_1","numCPUs","cpus","length","v8","SubscriptionManager","this","_publications","_subscriptions","_loggedInUsers","_mongoQueue","_mongoQueueId","_cacheId","_heapSize","getHeapStatistics","_enableDebug","_debugOplogCollections","_debugOplogHits","_debugSubCollections","_debugSubHits","_debugUnSubHits","_debugUnSubAllHits","_debugMongoQueueHits","_debugMongoQueueCollections","_debugSendQueueHits","_debugRemoveCacheHits","_oplogRetryCount","latencyBuffer","Map","LATENCY_UPDATE_INTERVAL","LATENCY_UPDATE_THRESHOLD_MS","_invalidationDebounceTimers","_invalidationPendingTimestamps","DEBOUNCE_DELAY","MAX_WAIT_TIME","create","wss","serverConfig","monitorManagerFunction","_this","subscriptionManager","setImmediate","__awaiter","initialize","_a","sent","prototype","_websocketManager","ResolveIOServer","getMainServer","getWebSocketManager","_monitorManagerFunction","_nodeCache","stdTTL","checkperiod","setInterval","flushThrottledLatencyUpdates","_wss","loadSuperAdminPublications","loadAppStatusPublications","loadLogPublications","loadFilePublications","loadCronJobPublications","loadFlagsUpdatePublications","loadFlagsPublications","loadMethodResponsePublications","loadNotificationPublications","loadReportBuilderReportPublications","loadReportBuilderLibraryPublications","loadUserGroupPublications","loadUserGuidePublications","loadReportBuilderDashboardBuilderPublications","tailOpLog","getEnableDebug","console","log","Date","JSON","stringify","sort","a","b","collection","localeCompare","publication","type","LoggedInUsers","find","_b","userCopy","deepCopy","i","loggedInUser","date","now","getTime","this_1","getWebSocket","id_ws","unsubscribeAll","_c","forEach","sub","j","clients","id_socket","splice","deleteOne","_id","findIndex","client","this_2","some","Flags","findOne","flag","value","setCacheLimit","process","env","IS_WORKERS_ENABLED","_heapLimit","invalidatePubsCache","debounceKey","firstInvalidationTime","get","set","has","clearTimeout","delete","_executeInvalidation","setTimeout","getMongoManager","invalidateQueryCache","collSubs","filter","collections","includes","collSubs_1","__values","collSubs_1_1","next","running","runAgain","user_specific","e_1","ws","readyState","OPEN","sendDataToOneWithRetry","messageId","_f","sendDataToAllWithRetry","delay","ms","Promise","resolve","sendDataToAll","sendDataToOne","publications","method","Object","assign","loggedInLatency","existingEntry","newLatency","lastUpdate","Math","abs","latency","size","updates","Array","from","entries","map","__read","updateOne","update","$set","bulkWrite","clear","error","error_1","subscribe","messageRoute","messageDate","subscriptionData","hits","push","pub","check","_schema","valObj","valKeys","keys","rootKeys","validate","errors","urlData","split","urlModule_1","urlNext","otherRouteSubs","startsWith","otherSub","unsubscribe","id_user","getPublicationCollections","cacheId","processSubscription","createLoggedInUser","user","objectIdHexString","__v","insertOne","Error","indexOf","userSubs","removeWebSocket","getActiveSubscriptions","resumeToken","_oplog$","closed","removeAllListeners","close","exit","pipeline","$match","$and","ns.coll","$nin","$not","lastResumeToken_1","getMainDB","watch","resumeAfter","on","doc","ns","coll","operationType","getMethodManager","callMethod","call","documentKey","NODE_APP_INSTANCE","IS_WORKER_INSTANCE","WORKER_INDEX","cacheData","parse","dateReviver","serverRes","hasError","data","sendWS","del","monitor","startMonitorFunction","function","apply","__spreadArray","res","err_1","sendEmail","finishMonitorFunction","subIndex","_g","res_1","_l","done","getBinarySize","endsWith","_m","_d","nodeCacheSize","getStats","vsize","deleteCount","subArr","zz","_e","err_2","send","exports"],"mappings":"+xEACAA,8B,0FAAAC,QAAA,2CAAA,GAIAC,aAAAD,QAAA,4BAAA,EACAE,YAAAF,QAAA,2BAAA,EACAG,QAAAH,QAAA,uBAAA,EACAI,QAAAJ,QAAA,uBAAA,EACAK,OAAAL,QAAA,sBAAA,EACAM,mBAAAN,QAAA,kCAAA,EACAO,gBAAAP,QAAA,+BAAA,EACAQ,yBAAAR,QAAA,wCAAA,EACAS,cAAAT,QAAA,6BAAA,EACAU,uBAAAV,QAAA,yBAAA,EAGAW,UAAAX,QAAA,YAAA,EACAY,KAAAZ,QAAA,IAAA,EACAa,kBAAAb,QAAA,gCAAA,EACAc,eAAAd,QAAA,8BAAA,EACAe,oCAAAf,QAAA,mDAAA,EACAgB,2BAAAhB,QAAA,0CAAA,EACAiB,cAAAjB,QAAA,6BAAA,EACAkB,cAAAlB,QAAA,6BAAA,EACAmB,SAAAnB,QAAA,gBAAA,EAGMoB,SAAU,EAAAR,KAAAS,MAAI,EAAGC,OACjBC,GAAKvB,QAAQ,IAAI,EA0BvBwB,oBAAA,WAuDC,SAAAA,sBArDQC,KAAAC,cAAmC,GACnCD,KAAAE,eAA4C,GAE5CF,KAAAG,eAAsC,GAEtCH,KAAAI,YAAiC,GACjCJ,KAAAK,cAAgB,EAKhBL,KAAAM,SAAW,EAEXN,KAAAO,UAAYT,GAAGU,kBAAiB,EAAKb,QAOrCK,KAAAS,aAAe,CAAA,EACfT,KAAAU,uBAAyB,GACzBV,KAAAW,gBAAkB,EAClBX,KAAAY,qBAAuB,GACvBZ,KAAAa,cAAgB,EAChBb,KAAAc,gBAAkB,EAClBd,KAAAe,mBAAqB,EACrBf,KAAAgB,qBAAuB,EACvBhB,KAAAiB,4BAA8B,GAC9BjB,KAAAkB,oBAAsB,EACtBlB,KAAAmB,sBAAwB,EAExBnB,KAAAoB,iBAAmB,EAGnBpB,KAAAqB,cAAgB,IAAIC,IAGXtB,KAAAuB,wBAA0B,IAG1BvB,KAAAwB,4BAA8B,IAMvCxB,KAAAyB,4BAA8B,IAAIH,IAClCtB,KAAA0B,+BAAiC,IAAIJ,IAC5BtB,KAAA2B,eAAiB,IACjB3B,KAAA4B,cAAgB,GAGlB,CA07BhB,OAx7BQ7B,oBAAA8B,OAAP,SAAcC,EAAuBC,EAAcC,GAAnD,IAAAC,EAAAjC,KACOkC,EAAsB,IAAInC,oBAIhC,OAHAoC,aAAa,WAAA,OAAAC,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACZ,MAAA,CAAA,EAAMC,EAAoBG,WAAWP,EAAKC,EAAcC,CAAsB,G,cAA9EM,EAAAC,KAAA,E,SACA,EACML,CACR,EAEcnC,oBAAAyC,UAAAH,WAAd,SAAyBP,EAAuBC,EAAcC,G,uHA+C7D,OA9CAhC,KAAKyC,kBAAoBxD,uBAAAyD,gBAAgBC,cAAa,EAAGC,oBAAmB,EAC5E5C,KAAK6C,wBAA0Bb,EAE/BhC,KAAK8C,WAAa,IAAI5D,UAAW,CAAE6D,OAAQ,EAAGC,YAAa,CAAC,CAAE,EAE9DC,YAAY,WAAM,OAAAhB,EAAKiB,6BAA4B,CAAjC,EAAqClD,KAAKuB,uBAAuB,EAsBnFvB,KAAK+B,aAAeA,EACpB/B,KAAKmD,KAAOrB,GAGZ,EAAA9C,cAAAoE,4BAA2BpD,IAAI,GAC/B,EAAAxB,aAAA6E,2BAA0BrD,IAAI,GAC9B,EAAApB,OAAA0E,qBAAoBtD,IAAI,GACxB,EAAAtB,QAAA6E,sBAAqBvD,IAAI,GACzB,EAAAvB,YAAA+E,yBAAwBxD,IAAI,GAC5B,EAAAX,eAAAoE,6BAA4BzD,IAAI,GAChC,EAAArB,QAAA+E,uBAAsB1D,IAAI,GAC1B,EAAAnB,mBAAA8E,gCAA+B3D,IAAI,GACnC,EAAAlB,gBAAA8E,8BAA6B5D,IAAI,GACjC,EAAAjB,yBAAA8E,qCAAoC7D,IAAI,GACxC,EAAAT,2BAAAuE,sCAAqC9D,IAAI,GACzC,EAAAR,cAAAuE,2BAA0B/D,IAAI,GAC9B,EAAAP,cAAAuE,2BAA0BhE,IAAI,GAC9B,EAAAV,oCAAA2E,+CAA8CjE,IAAI,EAElD,CAAA,EAAMA,KAAKkE,UAAS,G,OAkFT,OAlFX5B,EAAAC,KAAA,EAEAU,YAAY,WACXhB,EAAKb,iBAAmB,CACzB,EAAG,IAAK,EAER6B,YAAY,WACPhB,EAAKkC,eAAc,IACtBC,QAAQC,IAAI,IAAIC,KAAQ,cAAe,OAAQrC,EAAK/B,eAAeL,MAAM,EACzEuE,QAAQC,IAAI,IAAIC,KAAQ,cAAe,kBAAmBrC,EAAK9B,eAAeN,MAAM,EACpFuE,QAAQC,IAAI,IAAIC,KAAQ,cAAe,cAAerC,EAAK7B,YAAYP,MAAM,EAC7EuE,QAAQC,IAAI,IAAIC,KAAQ,cAAe,mBAAoBrC,EAAKjB,oBAAoB,EACpFoD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,0BAA2BC,KAAKC,UAAUvC,EAAKhB,4BAA4BwD,KAAK,SAACC,EAAGC,GAAM,OAAAD,EAAEE,WAAWC,cAAcF,EAAEC,UAAU,GAAKF,EAAEI,YAAYD,cAAcF,EAAEG,WAAW,CAArF,CAAsF,EAAG,KAAM,CAAC,CAAC,EAClOV,QAAQC,IAAI,IAAIC,KAAQ,cAAe,aAAcrC,EAAKtB,eAAe,EACzEyD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,oBAAqBC,KAAKC,UAAUvC,EAAKvB,uBAAuB+D,KAAK,SAACC,EAAGC,GAAM,OAAAD,EAAEE,WAAWC,cAAcF,EAAEC,UAAU,GAAKF,EAAEK,KAAKF,cAAcF,EAAEI,IAAI,CAAvE,CAAwE,EAAG,KAAM,CAAC,CAAC,EACzMX,QAAQC,IAAI,IAAIC,KAAQ,cAAe,kBAAmBrC,EAAKf,mBAAmB,EAClFkD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,WAAYrC,EAAKpB,aAAa,EACrEuD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,kBAAmBC,KAAKC,UAAUvC,EAAKrB,qBAAqB6D,KAAK,SAACC,EAAGC,GAAM,OAAAD,EAAEI,YAAYD,cAAcF,EAAEG,WAAW,CAAzC,CAA0C,EAAG,KAAM,CAAC,CAAC,EACvKV,QAAQC,IAAI,IAAIC,KAAQ,cAAe,aAAcrC,EAAKnB,eAAe,EACzEsD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,iBAAkBrC,EAAKlB,kBAAkB,EAChFqD,QAAQC,IAAI,IAAIC,KAAQ,cAAe,qBAAsBrC,EAAKd,qBAAqB,GAGxFc,EAAKtB,gBAAkB,EACvBsB,EAAKvB,uBAAyB,GAC9BuB,EAAKrB,qBAAuB,GAC5BqB,EAAKjB,qBAAuB,EAC5BiB,EAAKhB,4BAA8B,GACnCgB,EAAKf,oBAAsB,EAC3Be,EAAKpB,cAAgB,EACrBoB,EAAKnB,gBAAkB,EACvBmB,EAAKlB,mBAAqB,EAC1BkB,EAAKd,sBAAwB,CAC9B,EAAG,GAAK,EAER8B,YAAY,WAAA,OAAAb,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,iFACW,OAAtBK,EAAAtC,KAAsB,CAAA,EAAM1B,6BAAA0G,cAAcC,KAAI,G,OAA9C3C,EAAKnC,eAAiB+E,EAAA3C,KAAA,EAElB4C,GAAW,EAAAzF,SAAA0F,UAASpF,KAAKG,cAAc,E,WAClCkF,G,uEAGHC,EAFDA,EAAeH,EAASE,IAEVE,MAAmD,KAA3CjB,KAAKkB,IAAG,EAAKF,EAAaC,KAAKE,QAAO,EAC3DC,EAAKjD,kBAAkBkD,aAAaL,EAAaM,KAAK,GACrDF,EAAKvB,eAAc,GACtBC,QAAQC,IAAI,IAAIC,KAAQ,cAAe,WAAYoB,EAAKjD,kBAAkBkD,aAAaL,EAAaM,KAAK,EAAQ,KAAGF,EAAKjD,kBAAkBkD,aAAaL,EAAaM,KAAK,EAAa,UAAG,CAAC,EAE5L,CAAA,EAAMF,EAAKG,eAAeH,EAAKjD,kBAAkBkD,aAAaL,EAAaM,KAAK,CAAC,IAJ9E,CAAA,EAAA,GADD,CAAA,EAAA,G,cAKFE,EAAAvD,KAAA,E,aAaA,OAVAmD,EAAKxF,eAAe6F,QAAQ,SAAAC,GAC3B,IAAK,IAAIC,EAAID,EAAIE,QAAQrG,OAAS,EAAQ,GAALoG,EAAQA,CAAC,GAChCD,EAAIE,QAAQD,GAEdE,YAAcb,EAAaM,OACrCI,EAAIE,QAAQE,OAAOH,EAAG,CAAC,CAG1B,CAAC,EAED,CAAA,EAAM3H,6BAAA0G,cAAcqB,UAAU,CAACC,IAAKhB,EAAagB,GAAG,CAAC,G,OAArDR,EAAAvD,KAAA,EAEsE,GAAlEmD,EAAKvF,eAAeoG,UAAU,SAAA7B,GAAK,OAAAA,EAAE4B,MAAQhB,EAAagB,GAAvB,CAA0B,GAChEZ,EAAKvF,eAAeiG,OAAOV,EAAKvF,eAAeoG,UAAU,SAAA7B,GAAK,OAAAA,EAAE4B,MAAQhB,EAAagB,GAAvB,CAA0B,EAAG,CAAC,E,+BAxBvFjB,G,QAASlF,eAAeN,OAAS,E,wBAAQ,GAALwF,E,KAApCA,CAAC,GAAyC,CAAA,EAAA,G,wCAAEA,CAAC,G,aA8BtD,IAASA,EAAI,EAAGA,EAAIrF,KAAKE,eAAeL,OAAQwF,CAAC,GAGhD,IAFIW,EAAMhG,KAAKE,eAAemF,G,WAErBY,GACR,IAAIO,EAASR,EAAIE,QAAQD,GAEpBQ,EAAKtG,eAAeuG,KAAK,SAAAhC,GAAK,OAAAA,EAAEkB,QAAUY,EAAOL,SAAnB,CAA4B,GAC9DH,EAAIE,QAAQE,OAAOH,EAAG,CAAC,C,SAJhBA,EAAID,EAAIE,QAAQrG,OAAS,EAAQ,GAALoG,EAAQA,CAAC,G,EAArCA,CAAC,E,gBAQT,GAAK,EAEG,CAAA,EAAM7G,kBAAAuH,MAAMC,QAAQ,CAAC7B,KAAM,cAAc,CAAC,G,cAAjD8B,EAAOvE,EAAAC,KAAA,IAECsE,EAAKC,MAChB9G,KAAKS,aAAe,CAAA,EAGpBT,KAAKS,aAAe,CAAA,EAGrBT,KAAK+G,cAAa,E,UAGXhH,oBAAAyC,UAAAuE,cAAR,WACwC,SAAnCC,QAAQC,IAAIC,mBACflH,KAAKmH,WAA8B,GAAjBnH,KAAKO,UAGvBP,KAAKmH,WAA8B,GAAjBnH,KAAKO,SAEzB,EAEaR,oBAAAyC,UAAA4E,oBAAb,SAAiCxC,EAAoBG,G,kIAC9CsC,EAAczC,EACdY,EAAMlB,KAAKkB,IAAG,EAGd8B,EAAwBtH,KAAK0B,+BAA+B6F,IAAIF,CAAW,GAAK7B,EACtFxF,KAAK0B,+BAA+B8F,IAAIH,EAAaC,CAAqB,EAGtEtH,KAAKyB,4BAA4BgG,IAAIJ,CAAW,GACnDK,aAAa1H,KAAKyB,4BAA4B8F,IAAIF,CAAW,CAAC,EAIxC7B,EAAM8B,GAA0BtH,KAAK4B,gBAI3D5B,KAAK0B,+BAA+BiG,OAAON,CAAW,EACtD,CAAA,EAAMrH,KAAK4H,qBAAqBhD,EAAYG,CAAI,IAH7C,CAAA,EAAA,G,cAGHzC,EAAAC,KAAA,E,aAGAvC,KAAKyB,4BAA4B+F,IAChCH,EACAQ,WAAW,WAAA,OAAAzF,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DAEV,OADAjC,KAAK0B,+BAA+BiG,OAAON,CAAW,EACtD,CAAA,EAAMrH,KAAK4H,qBAAqBhD,EAAYG,CAAI,G,cAAhDzC,EAAAC,KAAA,E,UACEvC,KAAK2B,cAAc,CAAC,E,iCAKZ5B,oBAAAyC,UAAAoF,qBAAd,SAAmChD,EAAoBG,G,wIAElD/E,KAAKyB,4BAA4BgG,IAAI7C,CAAU,IAClD8C,aAAa1H,KAAKyB,4BAA4B8F,IAAI3C,CAAU,CAAC,EAC7D5E,KAAKyB,4BAA4BkG,OAAO/C,CAAU,GAInD3F,uBAAAyD,gBAAgBoF,gBAAe,EAAGC,qBAAqBnD,CAAU,EAE3DoD,EAAWhI,KAAKE,eAAe+H,OAAO,SAAAvD,GAAK,OAAAA,EAAEwD,YAAYC,SAASvD,CAAU,CAAjC,CAAkC,E,2CAEjEwD,EAAAC,SAAAL,CAAQ,EAAAM,EAAAF,EAAAG,KAAA,E,wCAKzB,GALUvC,EAAGsC,EAAAxB,MACT9G,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB0B,EAAIlB,YAAakB,EAAIwC,QAASxC,EAAIyC,QAAQ,EAGjFzC,EAAIwC,QAEP,OADAxC,EAAIyC,SAAW,CAAA,EACf,CAAA,EAAA,I,IAGGzI,KAAKC,cAAc+F,EAAIlB,aAAa4D,cAApC,MAAA,CAAA,EAAA,I,2CACgBC,EAAA,KAAA,EAAArG,EAAA+F,SAAArC,EAAIE,OAAO,EAAAhB,EAAA5C,EAAAiG,KAAA,E,0CAArB/B,EAAMtB,EAAA4B,OAEV8B,OADEA,EAAK5I,KAAKyC,kBAAkBkD,aAAaa,EAAOL,SAAS,GACzD,KAAA,EAAFyC,EAAIC,cAAeD,EAAGE,KAAtB,MAAA,CAAA,EAAA,G,iBAEF,O,sBAAA,CAAA,EAAM9I,KAAK+I,uBAAuBH,EAAIpC,EAAOwC,UAAWhD,EAAKpB,EAAYG,CAAI,G,cAA7EkE,EAAA1G,KAAA,E,qPASH,MAAA,CAAA,EAAMvC,KAAKkJ,uBAAuBlD,EAAKpB,EAAYG,CAAI,G,QAAvDkE,EAAA1G,KAAA,E,0NAKWxC,oBAAAyC,UAAA2G,MAAd,SAAoBC,G,mFAEnB,MAAA,CAAA,EAAO,IAAIC,QAAQ,SAAAC,GAAW,OAAAzB,WAAWyB,EAASF,CAAE,CAAtB,CAAuB,E,MAGxCrJ,oBAAAyC,UAAA0G,uBAAd,SAAqClD,EAA8BpB,EAAoBG,G,0GACtFiB,EAAIwC,QAAU,CAAA,E,iBAQb,OALIxI,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B0B,EAAIlB,WAAW,EAGrEkB,EAAIyC,SAAW,CAAA,EACf,CAAA,EAAMzI,KAAKuJ,cAAcvD,EAAKpB,EAAYG,CAAI,G,cAA9CzC,EAAAC,KAAA,EAEIvC,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,yBAA0B0B,EAAIlB,YAAakB,EAAIyC,QAAQ,EAG5EzC,EAAIyC,UACP,CAAA,EAAMzI,KAAKmJ,MAAM,GAAG,GADjB,CAAA,EAAA,G,OACH7G,EAAAC,KAAA,E,oBAEOyD,EAAIyC,SAAQ,MAAA,CAAA,EAAA,G,wBAErBzC,EAAIwC,QAAU,CAAA,E,UAGDzI,oBAAAyC,UAAAuG,uBAAd,SAAqCH,EAAeI,EAAmBhD,EAA8BpB,EAAoBG,G,0GACxHiB,EAAIwC,QAAU,CAAA,E,iBAQb,OALIxI,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B0B,EAAIlB,WAAW,EAGrEkB,EAAIyC,SAAW,CAAA,EACf,CAAA,EAAMzI,KAAKwJ,cAAcZ,EAAII,EAAWhD,EAAKpB,EAAYG,CAAI,G,cAA7DzC,EAAAC,KAAA,EAEIvC,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,yBAA0B0B,EAAIlB,YAAakB,EAAIyC,QAAQ,EAG5EzC,EAAIyC,UACP,CAAA,EAAMzI,KAAKmJ,MAAM,GAAG,GADjB,CAAA,EAAA,G,OACH7G,EAAAC,KAAA,E,oBAEOyD,EAAIyC,SAAQ,MAAA,CAAA,EAAA,G,wBACrBzC,EAAIwC,QAAU,CAAA,E,UAIRzI,oBAAAyC,UAAAiH,aAAP,SAAoBC,GACnB1J,KAAKC,cAAgB0J,OAAOC,OAAO5J,KAAKC,cAAeyJ,CAAM,CAC9D,EAGO3J,oBAAAyC,UAAAqH,gBAAP,SAAuBjB,GACtB,IAGMpD,EACAsE,EACAC,EALFzE,EAAetF,KAAKG,eAAe8E,KAAK,SAAAP,GAAK,OAAAA,EAAEkB,QAAUgD,EAAc,SAA1B,CAA2B,EACvEtD,IAECE,EAAM,IAAIlB,KACVwF,EAAgB9J,KAAKqB,cAAckG,IAAIqB,EAAc,SAAC,EACtDmB,EAAanB,EAAY,QAI9B,CAACkB,GACAtE,EAAIC,QAAO,EAAKqE,EAAcE,WAAWvE,QAAO,GAAMzF,KAAKwB,6BACZ,IAA/CyI,KAAKC,IAAIH,EAAaD,EAAcK,OAAO,KAG5C7E,EAAaC,KAAOC,EACpBxF,KAAKqB,cAAcmG,IAAIoB,EAAc,UAAG,CAAEuB,QAASJ,EAAYC,WAAYxE,CAAG,CAAE,EAElF,EAGczF,oBAAAyC,UAAAU,6BAAd,W,kHACC,GAAgC,IAA5BlD,KAAKqB,cAAc+I,KAAY,MAAA,CAAA,GAE7BC,EAAUC,MAAMC,KAAKvK,KAAKqB,cAAcmJ,QAAO,CAAE,EAAEC,IAAI,SAACnI,G,IAAA4C,EAAAwF,OAAApI,EAAA,CAAA,EAACsD,EAAKV,EAAA,GAAEY,EAAAZ,EAAA,GAA6B,MAAA,CAClGyF,UAAW,CACV1C,OAAQ,CAAErC,MAAKA,CAAA,EACfgF,OAAQ,CAAEC,KAAM,CAAEV,QAH2DrE,EAAAqE,QAGlD5E,KAH8DO,EAAAkE,UAG9C,CAAE,C,CAE9C,CALkG,CAKjG,E,iBAGD,O,sBAAA,CAAA,EAAM1L,6BAAA0G,cAAc8F,UAAUT,CAAO,G,cAArC/H,EAAAC,KAAA,EACAvC,KAAKqB,cAAc0J,MAAK,EAEpB/K,KAAKmE,eAAc,GACtBC,QAAQC,IAAI,IAAIC,KAAQ,cAAe,4CAA6C+F,EAAQxK,MAAM,E,+BAInGuE,QAAQ4G,MAAM,IAAI1G,KAAQ,cAAe,wCAAyC2G,CAAK,E,6BAM5ElL,oBAAAyC,UAAA0I,UAAb,SAAuBC,EAAsBC,EAAmBxC,EAAeI,EAAmBlE,EAAqBuG,G,0IACtHrL,KAAKa,eAAiB,EAEjBb,KAAKY,qBAAqB8F,KAAK,SAAAhC,GAAK,OAAAA,EAAEI,cAAgBA,CAAlB,CAA6B,EAOrE9E,KAAKY,qBAAqBqE,KAAK,SAAAP,GAAK,OAAAA,EAAEI,cAAgBA,CAAlB,CAA6B,EAAEwG,MAAQ,EAN3EtL,KAAKY,qBAAqB2K,KAAK,CAC9BzG,YAAaA,EACbwG,KAAM,C,CACN,EAMEE,EAAMxL,KAAKC,cAAc6E,IAEzB,CAAA,EAAA,IACHV,QAAQ4G,MAAM,IAAI1G,KAAQ,mBAAqBQ,CAAW,EAC1D,CAAA,I,OAGA,GAA8B,EAA1BuG,EAAiBxL,QAAcwL,EAAiB,GAAI,CACvD,GAAKG,CAAAA,EAAIC,MAER,OADArH,QAAQ4G,MAAM,IAAI1G,KAAQ,6BAA+BQ,CAAW,EACpE,CAAA,GAEI,GAAK0G,CAAAA,EAAIC,MAAMC,QAEnB,OADAtH,QAAQ4G,MAAM,IAAI1G,KAAQ,2BAA6BQ,CAAW,EAClE,CAAA,GAQA,IALI6G,EAAS,GACTC,EAAUjC,OAAOkC,KAAKL,EAAIC,MAAMC,OAAO,EAEvCI,EAAWF,EAAQ3D,OAAO,SAAAvD,GAAK,MAAA,CAACA,EAAEyD,SAAS,GAAG,CAAf,CAAgB,EAE1C9C,EAAI,EAAGA,EAAIgG,EAAiBxL,OAAQwF,CAAC,GAC7CsG,EAAOG,EAASzG,IAAMgG,EAAiBhG,GAGxC,IACCmG,EAAIC,MAAMM,SAASJ,CAAM,C,CAE1B,MAAOK,GACN,GAAIA,EAEH,OADA5H,QAAQ4G,MAAM,IAAI1G,KAAQ,uBAAyBQ,EAAc,IAAKkH,CAAM,EAC5E,CAAA,E,EA2EJ,MArEqB,WAAjBb,IACCc,EAAUd,EAAae,MAAM,GAAG,EAChCC,EAAY,GACZC,EAAUH,EAAQ,GAEH,KAAfA,EAAQ,KACXE,EAAY,IACZC,EAAUH,EAAQ,IAGnBE,GAAaC,EAEQ,EAAjBH,EAAQpM,SACXsM,GAAa,MAGVE,EAAiBrM,KAAKE,eAAe+H,OAAO,SAAAvD,GAAK,OAAAA,EAAEwB,QAAQQ,KAAK,SAAA/B,GAAK,OAAAA,EAAEwB,YAAcyC,EAAc,WAAwB,WAAnBjE,EAAEwG,cAAgD,MAAnBxG,EAAEwG,cAAwBxG,EAAEwG,eAAiBA,GAAgB,CAACxG,EAAEwG,aAAamB,WAAWH,CAAS,CAAnK,CAAoK,CAAxL,CAAyL,GAE3NtM,SAGlBwM,EAAetG,QAAQ,SAAAwG,GACtBA,EAASrG,QAAQ+B,OAAO,SAAAvD,GAAK,OAAAA,EAAEyB,YAAcyC,EAAc,SAA9B,CAA+B,EAAE7C,QAAQ,SAAAS,GACrEvE,EAAKuK,YAAYhG,EAAO2E,aAAc,IAAI7G,KAAQsE,EAAIpC,EAAOwC,UAAWuD,EAASzH,YAAayH,EAASlB,gBAAgB,CACxH,CAAC,CACF,CAAC,GAICrF,EAAMhG,KAAKE,eAAe+E,KAAK,SAAAP,GAAK,OAAAA,EAAEI,cAAgBA,GAAeP,KAAKC,UAAUE,EAAE2G,gBAAgB,IAAM9G,KAAKC,UAAU6G,CAAgB,CAAvG,CAAwG,GAI1IrF,EAAIE,QAAQQ,KAAK,SAAAhC,GAAK,OAAAA,EAAEyB,YAAcyC,EAAc,WAAKlE,EAAEsE,YAAcA,CAAnD,CAA4D,GACtFhD,EAAIE,QAAQqF,KAAK,CAChBkB,QAAS7D,EAAY,QACrBI,UAAWA,EACX7C,UAAWyC,EAAc,UACzBuC,aAAcA,C,CACd,EAKFnL,KAAKE,eAAeqL,KAAK,CACxBzG,YAAaA,EACbuG,iBAAkBA,EAClBnD,YAAalI,KAAK0M,0BAA0B5H,CAAW,EACvDoB,QAAS,CAAC,CACTuG,QAAS7D,EAAY,QACrBI,UAAWA,EACX7C,UAAWyC,EAAc,UACzBuC,aAAcA,C,GAEfwB,QAAS,EACTnE,QAAS,CAAA,EACTC,SAAU,CAAA,C,CACV,EAGGzC,EAAAA,GACEhG,KAAKE,eAAe+E,KAAK,SAAAP,GAAK,OAAAA,EAAEI,cAAgBA,GAAeP,KAAKC,UAAUE,EAAE2G,gBAAgB,IAAM9G,KAAKC,UAAU6G,CAAgB,CAAvG,CAAwG,EAGzIrL,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,UAAW0B,EAAIlB,YAAakB,EAAIwC,QAASxC,EAAIyC,SAAUzC,EAAIE,QAAQrG,MAAM,EAIlG,CAAA,EAAMG,KAAK4M,oBAAoB5G,EAAK4C,EAAII,CAAS,G,OAAjD1G,EAAAC,KAAA,E,iCAIWxC,oBAAAyC,UAAAqK,mBAAb,SAAgCjH,G,yHAC3BgD,EAAK5I,KAAKyC,kBAAkBkD,aAAaC,CAAK,IAG7CkH,EAAO,CACVxG,KAAK,EAAA5G,SAAAqN,mBAAiB,EACtBC,IAAK,EACLzH,KAAM,IAAIjB,KACVmI,QAAS7D,EAAY,QACrBkE,KAAMlE,EAAS,KACfhD,MAAOgD,EAAc,S,EAGtB5I,KAAKG,eAAeoL,KAAKuB,CAAI,EAC7B,CAAA,EAAMxO,6BAAA0G,cAAciI,UAAUH,CAAI,IAX/B,CAAA,EAAA,G,OAaH,OAFAxK,EAAAC,KAAA,EAEA,CAAA,EAAOuK,G,OAGP,MAAM,IAAII,MAAM,uCAAuC,C,OAKlDnN,oBAAAyC,UAAAgK,YAAP,SAAmBrB,EAAsBC,EAAmBxC,EAAeI,EAAmBlE,EAAqBuG,GAGlH,GAFArL,KAAKc,iBAAmB,EAEnBd,KAAKC,cAAc6E,GAInB,CACJ,IAAIkB,EAAMhG,KAAKE,eAAe+E,KAAK,SAAAP,GAAK,OAAAA,EAAEI,cAAgBA,GAAeP,KAAKC,UAAUE,EAAE2G,gBAAgB,IAAM9G,KAAKC,UAAU6G,CAAgB,CAAvG,CAAwG,EAEhJ,GAAIrF,EAAK,CACR,IAAK,IAAIX,EAAIW,EAAIE,QAAQrG,OAAS,EAAQ,GAALwF,EAAQA,CAAC,GACzCW,EAAIE,QAAQb,GAAGoH,UAAY7D,EAAY,SAAK5C,EAAIE,QAAQb,GAAG2D,YAAcA,GAAahD,EAAIE,QAAQb,GAAGc,YAAcyC,EAAc,WACpI5C,EAAIE,QAAQE,OAAOf,EAAG,CAAC,EAIrBrF,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,QAAS0B,EAAIlB,YAAakB,EAAIwC,QAASxC,EAAIyC,SAAUzC,EAAIE,QAAQrG,MAAM,C,OAdjGuE,QAAQC,IAAI,mBAAqBS,CAAW,CAkB9C,EAIa/E,oBAAAyC,UAAAqD,eAAb,SAA4B+C,G,6HAC3B5I,KAAKe,oBAAsB,EAEvB6H,GAECA,EAAmB,eACtB,CAAA,IAIDA,EAAmB,eAAI,CAAA,EAE+C,GAAlE5I,KAAKG,eAAesK,IAAI,SAAA/F,GAAK,OAAAA,EAAEkB,KAAF,CAAO,EAAEuH,QAAQvE,EAAc,SAAC,GAChE5I,KAAKG,eAAeiG,OAAOpG,KAAKG,eAAesK,IAAI,SAAA/F,GAAK,OAAAA,EAAEkB,KAAF,CAAO,EAAEuH,QAAQvE,EAAc,SAAC,EAAG,CAAC,EAG7F,CAAA,EAAMtK,6BAAA0G,cAAcqB,UAAU,CAAET,MAAOgD,EAAc,SAAC,CAAE,IAbrD,CAAA,EAAA,G,OAiBH,IAJAtG,EAAAC,KAAA,EAEI6K,EAAWpN,KAAKE,eAAe+H,OAAO,SAAAvD,GAAK,OAAAA,EAAEwB,QAAQQ,KAAK,SAAA/B,GAAK,OAAAA,EAAE8H,UAAY7D,EAAY,SAAKjE,EAAEwB,YAAcyC,EAAc,SAA7D,CAA8D,CAAlF,CAAmF,EAEzHvD,EAAI+H,EAASvN,OAAS,EAAQ,GAALwF,EAAQA,CAAC,GAG1C,IAFIW,EAAMoH,EAAS/H,GAEVY,EAAID,EAAIE,QAAQrG,OAAS,EAAQ,GAALoG,EAAQA,CAAC,GACzCD,EAAIE,QAAQD,GAAGE,YAAcyC,EAAc,WAC9C5C,EAAIE,QAAQE,OAAOH,EAAG,CAAC,EAK1BjG,KAAKyC,kBAAkB4K,gBAAgBzE,CAAE,E,iCAIpC7I,oBAAAyC,UAAA8K,uBAAP,WACC,OAAOtN,KAAKE,cACb,EAGQH,oBAAAyC,UAAAkK,0BAAR,SAAkC5H,GACjC,OAAO9E,KAAKC,cAAc6E,GAAaoD,WACxC,EAGcnI,oBAAAyC,UAAA0B,UAAd,SAAwBqJ,G,+HACnBvN,CAAAA,KAAKwN,SAAYxN,KAAKwN,QAAQC,OAA9B,CAAA,EAAA,IACHzN,KAAKwN,QAAQE,mBAAkB,EAC/B,CAAA,EAAM1N,KAAKwN,QAAQG,MAAK,I,OAAxBzI,EAAA3C,KAAA,EACAvC,KAAKwN,QAAU,K,iBAIhB,MAAA,CAAA,EAAM,IAAInE,QAAQ,SAAAC,GAAW,OAAAzB,WAAWyB,EAAS,GAAI,CAAxB,CAAyB,G,UAAtDpE,EAAA3C,KAAA,EAEKvC,KAAKwN,SAAWxN,CAAAA,KAAKwN,QAAQC,OAA9B,MAAA,CAAA,EAAA,I,GACHzN,KAAKoB,kBAAoB,EAEG,EAAxBpB,KAAKoB,mBACRgD,QAAQ4G,MAAM,4GAA4G,EAC1HhE,QAAQ4G,KAAK,CAAC,GAGTC,EAAW,CAChB,CACCC,OAAQ,CACPC,KAAM,CACL,CAACC,UAAW,CAAEC,KAAM,CACnB,uBACA,oBACA,OACA,WACA,qBACA,kBACA,4BACA,4BACA,mBACA,kBACA,CAAE,EACH,CAACD,UAAW,CAAEE,KAAM,eAAe,CAAE,EACrC,CAACF,UAAW,CAAEE,KAAM,WAAW,CAAE,E,KAQjCX,EAAA,MAAA,CAAA,EAAA,IACHY,EAAkBZ,E,8CAEjBvN,KAAKwN,QAAUvO,uBAAAyD,gBAAgB0L,UAAS,EAAGC,MAAMR,EAAU,CAAES,YAAaf,CAAW,CAAE,E,6BAGnFvN,KAAKwN,UACRxN,KAAKwN,QAAQE,mBAAkB,EAC/B,CAAA,EAAM1N,KAAKwN,QAAQG,MAAK,IAFrB,CAAA,EAAA,G,OAEHzI,EAAA3C,KAAA,EACAvC,KAAKwN,QAAU,K,iBAGhB,MAAA,CAAA,EAAMxN,KAAKkE,UAAUqJ,CAAW,G,OAChC,OADArI,EAAA3C,KAAA,EACA,CAAA,G,4BAIDvC,KAAKwN,QAAUvO,uBAAAyD,gBAAgB0L,UAAS,EAAGC,MAAMR,CAAQ,E,mBAG1DzJ,QAAQC,IAAI,IAAIC,KAAQ,eAAe,EAEvCtE,KAAKwN,QAAQe,GAAG,SAAU,SAAOC,GAAuH,OAAApM,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,0EACnJuM,EAAIC,IACHzO,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,YAAakK,EAAIC,EAAE,EAGxC7J,EAAa4J,EAAIC,GAAGC,KAEnB1O,KAAKU,uBAAuBgG,KAAK,SAAAhC,GAAK,OAAAA,EAAEE,aAAe4J,EAAIC,GAAGC,MAAQhK,EAAEK,OAASyJ,EAAIG,aAA/C,CAA4D,EAQtG3O,KAAKU,uBAAuBuE,KAAK,SAAAP,GAAK,OAAAA,EAAEE,aAAe4J,EAAIC,GAAGC,MAAQhK,EAAEK,OAASyJ,EAAIG,aAA/C,CAA4D,EAAErD,MAAQ,EAP5GtL,KAAKU,uBAAuB6K,KAAK,CAChC3G,WAAY4J,EAAIC,GAAGC,KACnB3J,KAAMyJ,EAAIG,cACVrD,KAAM,C,CACN,EAME1G,GACH5E,KAAKW,iBAAmB,EAEE,WAAtB6N,EAAIG,cAAJ,CAAA,EAAA,GACgB,oBAAf/J,GACmC,0BAAlC5E,KAAK+B,aAAuB,SAA5B,CAAA,EAAA,IACH9C,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGC,WAAWC,KAAK7P,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAI,yBAA0BJ,EAAIO,YAAiB,GAAC,EACvK,CAAA,EAAM/O,KAAKoH,oBAAoBxC,EAAY,QAAQ,KAPnD,CAAA,EAAA,KAlBD,CAAA,EAAA,I,OAyBCtC,EAAAC,KAAA,E,uBAIiB,qBAAfqC,EAAA,CAAA,EAAA,GACH,CAAA,EAAM5E,KAAKoH,oBAAoBxC,EAAY,QAAQ,G,OAAnDtC,EAAAC,KAAA,E,2CAG6B,WAAtBiM,EAAIG,eAAoD,YAAtBH,EAAIG,cAAtC,CAAA,EAAA,GACW,qBAAf/J,EAAA,CAAA,EAAA,GACH,CAAA,EAAM5E,KAAKoH,oBAAoBxC,EAAY,QAAQ,G,OAAnDtC,EAAAC,KAAA,E,2CAG6B,WAAtBiM,EAAIG,cAAJ,CAAA,EAAA,IACW,qBAAf/J,EAAA,CAAA,EAAA,IACH,CAAA,EAAM5E,KAAKoH,oBAAoBxC,EAAY,QAAQ,G,OAAnDtC,EAAAC,KAAA,E,yBAKgB,UAAfqC,EAAA,CAAA,EAAA,IACQ,CAAA,EAAMxF,kBAAAuH,MAAMC,QAAQ,CAAE7B,KAAM,cAAc,CAAE,G,SAAnD8B,EAAOvE,EAAAC,KAAA,IAECsE,EAAKC,MAChB9G,KAAKS,aAAe,CAAA,EAGpBT,KAAKS,aAAe,CAAA,E,mBAItB0N,EAAkBK,EAAIlI,IAEhBU,QAAQC,IAAI+H,mBAAuD,MAAlChI,QAAQC,IAAI+H,mBAAkE,UAAnChI,QAAQC,IAAIC,oBAAsE,SAAnCF,QAAQC,IAAIgI,oBAAiCjI,QAAQC,IAAIiI,a,kCAI3L,EAEDlP,KAAKwN,QAAQe,GAAG,QAAS,SAAMvD,GAAK,OAAA5I,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DAEnC,OADAmC,QAAQC,IAAI,IAAIC,KAAQ,cAAe0G,CAAK,EAC5C,CAAA,EAAMhL,KAAKwN,QAAQG,MAAK,G,cAAxBrL,EAAAC,KAAA,E,SACA,EAEDvC,KAAKwN,QAAQe,GAAG,MAAO,WAAA,OAAAnM,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DAEtB,OADAmC,QAAQC,IAAI,IAAIC,KAAQ,WAAW,EACnC,CAAA,EAAMtE,KAAKwN,QAAQG,MAAK,G,cAAxBrL,EAAAC,KAAA,E,SACA,EAEDvC,KAAKwN,QAAQe,GAAG,QAAS,WAAA,OAAAnM,UAAAH,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DAIxB,OAHAmC,QAAQC,IAAI,IAAIC,KAAQ,aAAa,EACrCtE,KAAKwN,QAAQE,mBAAkB,EAC/B1N,KAAKwN,QAAU,KACf,CAAA,EAAMxN,KAAKkE,UAAUiK,CAAe,G,cAApC7L,EAAAC,KAAA,E,SACA,E,mCAIWxC,oBAAAyC,UAAAoK,oBAAd,SAAkC5G,EAA8B4C,EAAeI,G,mHACzEhJ,KAAKC,cAAc+F,EAAIlB,aAAa4D,cAArC,MAAA,CAAA,EAAA,G,IACC1C,EAAI2G,QAAJ,MAAA,CAAA,EAAA,G,8CAEEwC,EAAY5K,KAAK6K,MAAMpP,KAAK8C,WAAWyE,IAAIvB,EAAI2G,OAAO,EAAGjN,SAAA2P,WAAW,EAEpEC,EAAiC,CACpCtG,UAAWA,EACXuG,SAAU,CAAA,EACVC,KAAML,C,EAGHnP,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,qBAAsB0B,EAAIlB,WAAW,EAG9D9E,KAAKyP,OAAO7G,EAAI0G,CAAS,E,aAMzB,O,SAHAtP,KAAK8C,WAAW4M,IAAI1J,EAAI2G,OAAO,EAC/B3G,EAAI2G,QAAU,EAEd,CAAA,EAAM3M,KAAKkJ,uBAAuBlD,EAAK,GAAI,QAAQ,G,cAAnDd,EAAA3C,KAAA,E,gCAQD,OAJIvC,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,2BAA4B0B,EAAIlB,YAAakB,EAAIwC,OAAO,EAG7ExC,EAAIwC,QACP,CAAA,GAGD,CAAA,EAAMxI,KAAKkJ,uBAAuBlD,EAAK,GAAI,QAAQ,G,OAAnDd,EAAA3C,KAAA,E,qCAQD,OAJIvC,KAAKS,cACR2D,QAAQC,IAAI,IAAIC,KAAQ,oCAAqC0B,EAAIlB,YAAakB,EAAIwC,OAAO,EAGtFxC,EAAIwC,QACP,CAAA,GAGD,CAAA,EAAMxI,KAAK+I,uBAAuBH,EAAII,EAAWhD,EAAK,GAAI,QAAQ,G,OAAlEd,EAAA3C,KAAA,E,mCAIYxC,oBAAAyC,UAAAgH,cAAd,SAA4BZ,EAAeI,EAAmBhD,EAA8BpB,EAAoBG,G,sHAC3G4K,EAAU3P,KAAK6C,wBAAwB+M,qBAAqB,4BAA6B5J,EAAIlB,YAAa,GAAI,GAAIkB,EAAIqF,gBAAgB,E,iBAI/H,O,uBAFVpM,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGC,WAAWC,KAAK7P,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAI,wBAAyB7J,EAAMiB,EAAIlB,YAAaF,EAAYL,KAAKC,UAAUwB,EAAIqF,gBAAgB,CAAC,EAE7M,CAAA,GAAM/I,EAAAtC,KAAKC,cAAc+F,EAAIlB,aAAa+K,UAASf,KAAIgB,MAAAxN,EAAAyN,cAAA,CAACpG,OAAOC,OAAO,GAAI5J,KAAMD,oBAAoByC,SAAS,EAAGoG,EAAY,SAAC8B,OAAK1E,EAAIqF,gBAAgB,EAAA,CAAA,CAAA,CAAA,G,cAA5J2E,EAAM9K,EAAA3C,KAAA,EAEN+M,EAAiC,CACpCtG,UAAWA,EACXuG,SAAU,CAAA,EACVC,KAAMQ,C,EAGPhQ,KAAKyP,OAAO7G,EAAI0G,CAAS,E,aAWzB,O,WARIA,EAAiC,CACpCtG,UAAWA,EACXuG,SAAU,CAAA,EACVC,KAAMS,C,EAGPjQ,KAAKyP,OAAO7G,EAAI0G,CAAS,EAEzB,CAAA,EAAMrQ,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGsB,UAAU,oBAAqB,6BAA+BlQ,KAAK+B,aAA0B,YAAG,sCAAwCiE,EAAIlB,YAAc,qCAAuCP,KAAKC,UAAUwB,EAAIqF,iBAAkB,KAAM,CAAC,EAAI,eAAiB9G,KAAKC,UAAUyL,EAAK,KAAM,CAAC,CAAC,G,cAAvV/K,EAAA3C,KAAA,E,aAGA,MAAA,CAAA,EAAMvC,KAAK6C,wBAAwBsN,sBAAsBR,CAAO,G,cAAhEzK,EAAA3C,KAAA,E,2BAKYxC,oBAAAyC,UAAA+G,cAAd,SAA4BvD,EAA8BpB,EAAoBG,G,4KACxEiB,EAAIE,QAAQrG,OAAb,CAAA,EAAA,IACCmG,EAAI2G,UACP3M,KAAK8C,WAAW4M,IAAI1J,EAAI2G,OAAO,EAC/B3G,EAAI2G,QAAU,GAIC,IADZyD,EAAWpQ,KAAKE,eAAeqG,UAAU,SAAA7B,GAAK,OAAAA,EAAEI,cAAgBkB,EAAIlB,aAAeP,KAAKC,UAAUE,EAAE2G,gBAAgB,IAAM9G,KAAKC,UAAUwB,EAAIqF,gBAAgB,CAA/G,CAAgH,IAEjKrL,KAAKE,eAAekG,OAAOgK,EAAU,CAAC,EAGvC,CAAA,I,OAGIT,EAAU3P,KAAK6C,wBAAwB+M,qBAAqB,cAAe5J,EAAIlB,YAAa,GAAI,GAAIkB,EAAIqF,gBAAgB,E,iBAOjH,O,uBAJc,kBAApBrF,EAAIlB,aAAuD,kBAApBkB,EAAIlB,aAC9C7F,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGC,WAAWC,KAAK7P,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAI,wBAAyB7J,EAAMiB,EAAIlB,YAAaF,EAAYL,KAAKC,UAAUwB,EAAIqF,gBAAgB,CAAC,EAG9M,CAAA,GAAMgF,EAAArQ,KAAKC,cAAc+F,EAAIlB,aAAa+K,UAASf,KAAIgB,MAAAO,EAAAN,cAAA,CAACpG,OAAOC,OAAO,GAAI5J,KAAMD,oBAAoByC,SAAS,GAACkI,OAAK1E,EAAIqF,gBAAgB,EAAA,CAAA,CAAA,CAAA,G,OAEjJ,GAFIiF,EAAMC,EAAAhO,KAAA,EAENyD,EAAI2G,QACP,IAGC,GAFIwC,EAAY5K,KAAK6K,MAAMpP,KAAK8C,WAAWyE,IAAIvB,EAAI2G,OAAO,EAAGjN,SAAA2P,WAAW,EAEpE9K,KAAKC,UAAU2K,CAAS,IAAM5K,KAAKC,UAAU8L,CAAG,EAAG,C,IACtD,IAAmBhO,EAAA+F,SAAArC,EAAIE,OAAO,EAAAhB,EAAA5C,EAAAiG,KAAA,EAAA,CAAArD,EAAAsL,KAAAtL,EAAA5C,EAAAiG,KAAA,EAArB/B,EAAMtB,EAAA4B,OACV8B,EAAK5I,KAAKyC,kBAAkBkD,aAAaa,EAAOL,SAAS,IACnDyC,EAAGC,aAAeD,EAAGE,OAC1BwG,EAAiC,CACpCtG,UAAWxC,EAAOwC,UAClBuG,SAAU,CAAA,EACVC,KAAMc,C,EAGPtQ,KAAKyP,OAAO7G,EAAI0G,CAAS,E,kGAI3BtP,KAAK8C,WAAW4M,IAAI1J,EAAI2G,OAAO,GAE3B,EAAAjN,SAAA+Q,eAAclM,KAAKC,UAAU8L,CAAG,CAAC,EAAI,KACxC,CAACtK,EAAIkC,YAAYC,SAAS,MAAM,GAChC,CAACnC,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAEgM,SAAS,WAAW,CAAtB,CAAuB,GAClD,CAAC1K,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAE4H,WAAW,UAAU,CAAvB,CAAwB,EAEnDtM,KAAK8C,WAAW0E,IAAIxB,EAAI2G,QAASpI,KAAKC,UAAU8L,CAAG,CAAC,EAGpDtK,EAAI2G,QAAU,C,EAIjB,MAAAgE,GACC3K,EAAIE,QAAQuE,IAAI,SAAAjE,GACf,IAAIoC,EAAK3G,EAAKQ,kBAAkBkD,aAAaa,EAAOL,SAAS,EACzDyC,GAAMA,EAAGC,aAAeD,EAAGE,OAC1BwG,EAAiC,CACpCtG,UAAWxC,EAAOwC,UAClBuG,SAAU,CAAA,EACVC,KAAMc,C,EAGPrO,EAAKwN,OAAO7G,EAAI0G,CAAS,EAE3B,CAAC,EAEDtP,KAAK8C,WAAW4M,IAAI1J,EAAI2G,OAAO,GAE3B,EAAAjN,SAAA+Q,eAAclM,KAAKC,UAAU8L,CAAG,CAAC,EAAI,KACxC,CAACtK,EAAIkC,YAAYC,SAAS,MAAM,GAChC,CAACnC,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAEgM,SAAS,WAAW,CAAtB,CAAuB,GAClD,CAAC1K,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAE4H,WAAW,UAAU,CAAvB,CAAwB,EAEnDtM,KAAK8C,WAAW0E,IAAIxB,EAAI2G,QAASpI,KAAKC,UAAU8L,CAAG,CAAC,EAGpDtK,EAAI2G,QAAU,C,KAIZ,C,IACJ,IAAmB7G,EAAAuC,SAAArC,EAAIE,OAAO,EAAA0K,EAAA9K,EAAAyC,KAAA,EAAA,CAAAqI,EAAAJ,KAAAI,EAAA9K,EAAAyC,KAAA,EAArB/B,EAAMoK,EAAA9J,OACV8B,EAAK5I,KAAKyC,kBAAkBkD,aAAaa,EAAOL,SAAS,IACnDyC,EAAGC,aAAeD,EAAGE,OAC1BwG,EAAiC,CACpCtG,UAAWxC,EAAOwC,UAClBuG,SAAU,CAAA,EACVC,KAAMc,C,EAGPtQ,KAAKyP,OAAO7G,EAAI0G,CAAS,E,kGAI3B,IAAI,EAAA5P,SAAA+Q,eAAclM,KAAKC,UAAU8L,CAAG,CAAC,EAAI,KACxC,CAACtK,EAAIkC,YAAYC,SAAS,MAAM,GAChC,CAACnC,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAEgM,SAAS,WAAW,CAAtB,CAAuB,GAClD,CAAC1K,EAAIkC,YAAYjD,KAAK,SAAAP,GAAK,OAAAA,EAAE4H,WAAW,UAAU,CAAvB,CAAwB,GAOnD,GALAtG,EAAI2G,QAAU3M,KAAKM,QAAQ,GAC3BN,KAAK8C,WAAW0E,IAAIxB,EAAI2G,QAASpI,KAAKC,UAAU8L,CAAG,CAAC,GAE9CO,EAAgB7Q,KAAK8C,WAAWgO,SAAQ,EAAGC,OAE7B/Q,KAAKmH,WAAY,CAKpC,IAHI6J,EAAc,EACZC,EAASjR,KAAKE,eAAe+H,OAAO,SAAAvD,GAAK,OAAAA,EAAEiI,SAAW,CAACjI,EAAEwB,QAAQrG,MAAxB,CAA8B,EAEpEqR,EAAK,EAAGA,EAAKD,EAAOpR,SAC5BG,KAAKmB,uBAAyB,EAC9BnB,KAAK8C,WAAW4M,IAAIuB,EAAOC,GAAIvE,OAAO,EACtCsE,EAAOC,GAAIvE,QAAU,EACrBqE,GAAe,EACXhR,EAAAA,KAAK8C,WAAWgO,SAAQ,EAAGC,MAA0B,IAAlB/Q,KAAKmH,aALR+J,CAAE,IAUnClR,KAAKS,cACR2D,QAAQC,IACP,wBAEA2B,EAAIlB,YACJ,eACAkM,EACA,MACAH,CAAa,C,OAMhB7K,EAAI2G,QAAU,C,mCAKhB,IAAmBwE,EAAA9I,SAAArC,EAAIE,OAAO,EAAA+C,EAAAkI,EAAA5I,KAAA,EAAA,CAAAU,EAAAuH,KAAAvH,EAAAkI,EAAA5I,KAAA,EAArB/B,EAAMyC,EAAAnC,OACV8B,EAAK5I,KAAKyC,kBAAkBkD,aAAaa,EAAOL,SAAS,IACnDyC,EAAGC,aAAeD,EAAGE,OAC1BwG,EAAiC,CACpCtG,UAAWxC,EAAOwC,UAClBuG,SAAU,CAAA,EACVC,KAAM4B,C,EAGPpR,KAAKyP,OAAO7G,EAAI0G,CAAS,E,kGAI3B,MAAA,CAAA,EAAMrQ,uBAAAyD,gBAAgBC,cAAa,EAAGiM,iBAAgB,EAAGsB,UAAU,oBAAqB,6BAA+BlQ,KAAK+B,aAA0B,YAAG,sCAAwCiE,EAAIlB,YAAc,8BAAgCP,KAAKC,UAAUwB,EAAIqF,iBAAkB,KAAM,CAAC,EAAI,eAAiB9G,KAAKC,UAAU4M,EAAK,KAAM,CAAC,CAAC,G,cAAhVb,EAAAhO,KAAA,E,aAGA,MAAA,CAAA,EAAMvC,KAAK6C,wBAAwBsN,sBAAsBR,CAAO,G,cAAhEY,EAAAhO,KAAA,E,2BAKKxC,oBAAAyC,UAAAiN,OAAR,SAAe7G,EAAe4G,GAC7BxP,KAAKyC,kBAAkB4O,KAAKzI,EAAI4G,CAAI,CACrC,EAEOzP,oBAAAyC,UAAA2B,eAAP,WACC,OAAOnE,KAAKS,YACb,EACDV,mBAAA,EAAC,EAj/BYuR,QAAAvR,oBAAAA","file":"subscription.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { LoggedInUsers } from '../collections/logged-in-users.collection';\nimport { LoggedInUserModel } from '../models/logged-in-users.model';\nimport { ServerResponseModel } from '../models/server-response.model';\nimport { ActiveSubscriptionModel, SubscriptionModel } from '../models/subscription.model';\nimport { loadAppStatusPublications } from '../publications/app-status';\nimport { loadCronJobPublications } from '../publications/cron-jobs';\nimport { loadFilePublications } from '../publications/files';\nimport { loadFlagsPublications } from '../publications/flags';\nimport { loadLogPublications } from '../publications/logs';\nimport { loadMethodResponsePublications } from '../publications/method-responses';\nimport { loadNotificationPublications } from '../publications/notifications';\nimport { loadReportBuilderReportPublications } from '../publications/report-builder-reports';\nimport { loadSuperAdminPublications } from '../publications/super-admin';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nimport { ChangeStream, ChangeStreamDeleteDocument, ChangeStreamInsertDocument, ChangeStreamReplaceDocument, ChangeStreamUpdateDocument, ResumeToken } from 'mongodb';\nimport * as NodeCache from 'node-cache';\nimport { cpus } from 'os';\nimport { Flags } from '../collections/flag.collection';\nimport { loadFlagsUpdatePublications } from '../publications/flags-update';\nimport { loadReportBuilderDashboardBuilderPublications } from '../publications/report-builder-dashboard-builders';\nimport { loadReportBuilderLibraryPublications } from '../publications/report-builder-libraries';\nimport { loadUserGroupPublications } from '../publications/user-groups';\nimport { loadUserGuidePublications } from '../publications/user-guides';\nimport { dateReviver, deepCopy, getBinarySize, objectIdHexString } from '../util/common';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { WebSocketManager } from './websocket.manager';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\n\n// Performance Dependencies\n// import * as path from 'path';\n// import { Worker } from 'worker_threads';\n\ninterface MongoQueueModel {\n\t_id: number,\n\ttype: string;\n\tcollection: string;\n\tsubscription: ActiveSubscriptionModel;\n\trunning: boolean;\n\trun_again: boolean;\n}\n\n// interface CurrentPerformanceMonitor {\n// \t_id: number;\n// \tfunction: string;\n// \tpublication: string;\n// \tsubscriptionData: any[];\n// \tdate_start: Date;\n// \tdate_end: Date;\n// \tduration: number;\n// \tresult: string;\n// }\n\nexport class SubscriptionManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _publications: SubscriptionModel = {};\n\tprivate _subscriptions: ActiveSubscriptionModel[] = [];\n\tprivate _wss: WebSocket.Server;\n\tprivate _loggedInUsers: LoggedInUserModel[] = [];\n\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\t\n\tprivate _oplog$: ChangeStream;\n\n\tprivate _nodeCache;\n\tprivate _cacheId = 1;\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate serverConfig;\n\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\n\tprivate _enableDebug = false;\n\tprivate _debugOplogCollections = [];\n\tprivate _debugOplogHits = 0;\n\tprivate _debugSubCollections = [];\n\tprivate _debugSubHits = 0;\n\tprivate _debugUnSubHits = 0;\n\tprivate _debugUnSubAllHits = 0;\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _debugSendQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\n\tprivate _oplogRetryCount = 0;\n\n\t// Buffer to store throttled latency updates with timestamps\n\tprivate latencyBuffer = new Map<string, { latency: number, lastUpdate: Date }>();\n\n\t// Interval to flush latency updates in MongoDB\n\tprivate readonly LATENCY_UPDATE_INTERVAL = 60000;\n\n\t// Minimum time difference between two latency updates for the same user\n\tprivate readonly LATENCY_UPDATE_THRESHOLD_MS = 30000;\n\n\t// private currentPerfomanceMonitor: CurrentPerformanceMonitor[] = [];\n\t// private idPerformance: number = 0;\n\t// private performanceThread;\n\n\tprivate _invalidationDebounceTimers = new Map<string, NodeJS.Timeout>();\n\tprivate _invalidationPendingTimestamps = new Map<string, number>();\n\tprivate readonly DEBOUNCE_DELAY = 100; // 100ms debounce window\n\tprivate readonly MAX_WAIT_TIME = 500; // 500ms maximum delay\n\n\n\tconstructor() {}\n\t\n\tstatic create(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tconst subscriptionManager = new SubscriptionManager();\n\t\tsetImmediate(async () => {\n\t\t\tawait subscriptionManager.initialize(wss, serverConfig, monitorManagerFunction);\n\t\t});\n\t\treturn subscriptionManager;\n\t}\n\t\n\tprivate async initialize(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tthis._websocketManager = ResolveIOServer.getMainServer().getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\tsetInterval(() => this.flushThrottledLatencyUpdates(), this.LATENCY_UPDATE_INTERVAL);\n\n\t\t// setTimeout(() => {\n\t\t// \tconsole.log('Setting up performance thread');\n\n\t\t// \tthis.performanceThread = new Worker(path.join(__dirname, './subscription.performance.js'));\n\n\t\t// \tthis.performanceThread.on('exit', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD EXITED!!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\n\t\t// \tthis.performanceThread.on('error', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD RECV ERROR !!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\t\t// }, 5000);\n\n\t\t// setInterval(() => {\n\t\t// \tconsole.log('Post thread msg');\n\t\t// \tthis.performanceThread.postMessage(this.currentPerfomanceMonitor);\n\t\t// \tthis.currentPerfomanceMonitor = [];\n\t\t// }, 10000);\n\n\t\tthis.serverConfig = serverConfig;\n\t\tthis._wss = wss;\n\n\t\t// Publications\n\t\tloadSuperAdminPublications(this);\n\t\tloadAppStatusPublications(this);\n\t\tloadLogPublications(this);\n\t\tloadFilePublications(this);\n\t\tloadCronJobPublications(this);\n\t\tloadFlagsUpdatePublications(this);\n\t\tloadFlagsPublications(this);\n\t\tloadMethodResponsePublications(this);\n\t\tloadNotificationPublications(this);\n\t\tloadReportBuilderReportPublications(this);\n\t\tloadReportBuilderLibraryPublications(this);\n\t\tloadUserGroupPublications(this);\n\t\tloadUserGuidePublications(this);\n\t\tloadReportBuilderDashboardBuilderPublications(this);\n\n\t\tawait this.tailOpLog();\n\n\t\tsetInterval(() => {\n\t\t\tthis._oplogRetryCount = 0;\n\t\t}, 15000);\n\n\t\tsetInterval(() => {\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Subs', this._subscriptions.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Logged In Users', this._loggedInUsers.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue', this._mongoQueue.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Collections', JSON.stringify(this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Hits', this._debugOplogHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Collections', JSON.stringify(this._debugOplogCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.type.localeCompare(b.type)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Hits', this._debugSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Collections', JSON.stringify(this._debugSubCollections.sort((a, b) => a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub Hits', this._debugUnSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub All Hits', this._debugUnSubAllHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Cache Cleanup Hits', this._debugRemoveCacheHits);\n\t\t\t}\n\t\t\t\n\t\t\tthis._debugOplogHits = 0;\n\t\t\tthis._debugOplogCollections = [];\n\t\t\tthis._debugSubCollections = [];\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t\tthis._debugSubHits = 0;\n\t\t\tthis._debugUnSubHits = 0;\n\t\t\tthis._debugUnSubAllHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t}, 60000);\n\n\t\tsetInterval(async () => {\n\t\t\tthis._loggedInUsers = await LoggedInUsers.find();\n\t\n\t\t\tlet userCopy = deepCopy(this._loggedInUsers);\n\t\t\tfor (let i = this._loggedInUsers.length - 1; i >= 0; i--) {\n\t\t\t\tlet loggedInUser = userCopy[i];\n\n\t\t\t\tif (!loggedInUser.date || Date.now() - loggedInUser.date.getTime() > 120000) {\n\t\t\t\t\tif (this._websocketManager.getWebSocket(loggedInUser.id_ws)) {\n\t\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', this._websocketManager.getWebSocket(loggedInUser.id_ws)['user'], this._websocketManager.getWebSocket(loggedInUser.id_ws)['id_socket'], 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.unsubscribeAll(this._websocketManager.getWebSocket(loggedInUser.id_ws));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._subscriptions.forEach(sub => {\n\t\t\t\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\t\t\t\tif (client.id_socket === loggedInUser.id_ws) {\n\t\t\t\t\t\t\t\t\tsub.clients.splice(j, 1);\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\n\t\t\t\t\t\tawait LoggedInUsers.deleteOne({_id: loggedInUser._id});\n\n\t\t\t\t\t\tif (this._loggedInUsers.findIndex(a => a._id === loggedInUser._id) >= 0) {\n\t\t\t\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.findIndex(a => a._id === loggedInUser._id), 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < this._subscriptions.length; i++) {\n\t\t\t\tlet sub = this._subscriptions[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\tif (!this._loggedInUsers.some(a => a.id_ws === client.id_socket)) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 30000);\n\n\t\tlet flag = await Flags.findOne({type: 'Enable Debug'});\n\n\t\tif (flag && flag.value) {\n\t\t\tthis._enableDebug = true;\n\t\t}\n\t\telse {\n\t\t\tthis._enableDebug = false;\n\t\t}\n\n\t\tthis.setCacheLimit();\n\t}\n\n\tprivate setCacheLimit() {\t\n\t\tif (process.env.IS_WORKERS_ENABLED === 'true') {\n\t\t\tthis._heapLimit = this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3; // Use 50% of total heap size\n\t\t}\n\t}\n\n\tpublic async invalidatePubsCache(collection: string, type: string) {\n\t\tconst debounceKey = collection;\n\t\tconst now = Date.now();\n\t\n\t\t// Initialize or get existing timestamp\n\t\tconst firstInvalidationTime = this._invalidationPendingTimestamps.get(debounceKey) || now;\n\t\tthis._invalidationPendingTimestamps.set(debounceKey, firstInvalidationTime);\n\t\n\t\t// Clear any existing timer\n\t\tif (this._invalidationDebounceTimers.has(debounceKey)) {\n\t\t\tclearTimeout(this._invalidationDebounceTimers.get(debounceKey));\n\t\t}\n\t\n\t\t// Check if we've waited too long\n\t\tconst waitedTooLong = (now - firstInvalidationTime) >= this.MAX_WAIT_TIME;\n\t\t\n\t\tif (waitedTooLong) {\n\t\t\t// Immediate execution path\n\t\t\tthis._invalidationPendingTimestamps.delete(debounceKey);\n\t\t\tawait this._executeInvalidation(collection, type);\n\t\t} else {\n\t\t\t// Normal debounce path\n\t\t\tthis._invalidationDebounceTimers.set(\n\t\t\t\tdebounceKey,\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tthis._invalidationPendingTimestamps.delete(debounceKey);\n\t\t\t\t\tawait this._executeInvalidation(collection, type);\n\t\t\t\t}, this.DEBOUNCE_DELAY)\n\t\t\t);\n\t\t}\n\t}\n\t\n\tprivate async _executeInvalidation(collection: string, type: string) {\n\t\t// Clean up any existing timer (defensive)\n\t\tif (this._invalidationDebounceTimers.has(collection)) {\n\t\t\tclearTimeout(this._invalidationDebounceTimers.get(collection));\n\t\t\tthis._invalidationDebounceTimers.delete(collection);\n\t\t}\n\t\n\t\t// Original invalidation logic\n\t\tResolveIOServer.getMongoManager().invalidateQueryCache(collection);\n\t\n\t\tconst collSubs = this._subscriptions.filter(a => a.collections.includes(collection));\n\t\n\t\tfor (const sub of collSubs) {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Invalidate Sub', sub.publication, sub.running, sub.runAgain);\n\t\t\t}\n\t\n\t\t\tif (sub.running) {\n\t\t\t\tsub.runAgain = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tif (this._publications[sub.publication].user_specific) {\n\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\tconst ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\tif (ws?.readyState === ws.OPEN) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.sendDataToOneWithRetry(ws, client.messageId, sub, collection, type);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t// Error handling\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\telse {\n\t\t\t\tawait this.sendDataToAllWithRetry(sub, collection, type);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async delay(ms: number) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tprivate async sendDataToAllWithRetry(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToAll Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToAll(sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToAll Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\n\t\tsub.running = false;\n\t}\n\n\tprivate async sendDataToOneWithRetry(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToOne Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToOne(ws, messageId, sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToOne Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\t\tsub.running = false;\n\t}\n\n\t// Add all files to publications private object\n\tpublic publications(method: SubscriptionModel) {\n\t\tthis._publications = Object.assign(this._publications, method);\n\t}\n\n\t// Throttled `loggedInLatency` method\n\tpublic loggedInLatency(ws: WebSocket) {\n\t\tlet loggedInUser = this._loggedInUsers.find(a => a.id_ws === ws['id_socket']);\n\t\tif (!loggedInUser) return;\n\n\t\tconst now = new Date();\n\t\tconst existingEntry = this.latencyBuffer.get(ws['id_socket']);\n\t\tconst newLatency = ws['latency'];\n\n\t\t// Throttle updates: only update if time threshold has passed or latency has significantly changed\n\t\tif (\n\t\t\t!existingEntry || \n\t\t\t(now.getTime() - existingEntry.lastUpdate.getTime() >= this.LATENCY_UPDATE_THRESHOLD_MS) || \n\t\t\t(Math.abs(newLatency - existingEntry.latency) > 100) // Optional: log only significant changes\n\t\t) {\n\t\t\t// Update in-memory and buffer\n\t\t\tloggedInUser.date = now;\n\t\t\tthis.latencyBuffer.set(ws['id_socket'], { latency: newLatency, lastUpdate: now });\n\t\t}\n\t}\n\n\t// Method to flush buffered latency updates in bulk\n\tprivate async flushThrottledLatencyUpdates() {\n\t\tif (this.latencyBuffer.size === 0) return; // No updates to flush\n\n\t\tconst updates = Array.from(this.latencyBuffer.entries()).map(([id_ws, { latency, lastUpdate }]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { id_ws },\n\t\t\t\tupdate: { $set: { latency, date: lastUpdate } }\n\t\t\t}\n\t\t}));\n\n\t\ttry {\n\t\t\tawait LoggedInUsers.bulkWrite(updates);\n\t\t\tthis.latencyBuffer.clear(); // Clear buffer after successful update\n\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Throttled latency batch update successful', updates.length);\n\t\t\t}\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'Sub Manager', 'Throttled latency batch update failed', error);\n\t\t\t// Optional: implement retry logic or logging for failed updates\n\t\t}\n\t}\n\n\t// Subscribe to publication\n\tpublic async subscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugSubHits += 1;\n\n\t\tif (!this._debugSubCollections.some(a => a.publication === publication)) {\n\t\t\tthis._debugSubCollections.push({\n\t\t\t\tpublication: publication,\n\t\t\t\thits: 1\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis._debugSubCollections.find(a => a.publication === publication).hits += 1;\n\t\t}\n\n\t\tlet pub = this._publications[publication];\n\n\t\tif (!pub) {\n\t\t\tconsole.error(new Date(), 'No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tif (subscriptionData.length > 1 || subscriptionData[0]) {\n\t\t\t\tif (!pub.check) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Function For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (!pub.check._schema) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Schema For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet valObj = {};\n\t\t\t\t\tlet valKeys = Object.keys(pub.check._schema);\n\n\t\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\n\t\t\t\t\tfor (let i = 0; i < subscriptionData.length; i++) {\n\t\t\t\t\t\tvalObj[rootKeys[i]] = subscriptionData[i];\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpub.check.validate(valObj);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (errors) {\n\t\t\t\t\t\tif (errors) {\n\t\t\t\t\t\t\tconsole.error(new Date(), 'Error in Pub Check (' + publication + ')', errors);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (messageRoute !== 'Bypass') {\n\t\t\t\tlet urlData = messageRoute.split('/');\n\t\t\t\tlet urlModule = '';\n\t\t\t\tlet urlNext = urlData[0];\n\n\t\t\t\tif (urlData[0] === '') {\n\t\t\t\t\turlModule = '/';\n\t\t\t\t\turlNext = urlData[1];\n\t\t\t\t}\n\n\t\t\t\turlModule += urlNext;\n\n\t\t\t\tif (urlData.length > 1) {\n\t\t\t\t\turlModule += '/';\n\t\t\t\t}\n\n\t\t\t\tlet otherRouteSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_socket === ws['id_socket'] && b.messageRoute !== 'Bypass' && b.messageRoute !== '/' && b.messageRoute !== messageRoute && !b.messageRoute.startsWith(urlModule)));\n\n\t\t\t\tif (otherRouteSubs.length) {\n\t\t\t\t\t// ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Detected Undestroyed Subscription - ' + this.serverConfig['CLIENT_NAME'], 'USER: ' + ws['user'] + ' (Socket: ' + ws['id_socket'] + ') ' + ' is on route: ' + messageRoute + ' but has the following subscriptions on other routes:' + JSON.stringify(otherRouteSubs, null, 2));\n\n\t\t\t\t\totherRouteSubs.forEach(otherSub => {\n\t\t\t\t\t\totherSub.clients.filter(a => a.id_socket === ws['id_socket']).forEach(client => {\n\t\t\t\t\t\t\tthis.unsubscribe(client.messageRoute, new Date(), ws, client.messageId, otherSub.publication, otherSub.subscriptionData);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\t// If sub found (another user watching same data), add client to same sub\n\t\t\tif (sub) {\n\t\t\t\tif (!sub.clients.some(a => a.id_socket === ws['id_socket'] && a.messageId === messageId)) {\n\t\t\t\t\tsub.clients.push({\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If sub not found, create new sub\n\t\t\telse {\n\t\t\t\tthis._subscriptions.push({\n\t\t\t\t\tpublication: publication,\n\t\t\t\t\tsubscriptionData: subscriptionData,\n\t\t\t\t\tcollections: this.getPublicationCollections(publication),\n\t\t\t\t\tclients: [{\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute,\n\t\t\t\t\t}],\n\t\t\t\t\tcacheId: 0,\n\t\t\t\t\trunning: false,\n\t\t\t\t\trunAgain: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!sub) {\n\t\t\t\tsub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\t\t\t}\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'New Sub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t}\n\n\t\t\t// Immediately send data to the new client\n\t\t\tawait this.processSubscription(sub, ws, messageId);\n\t\t}\n\t}\n\n\tpublic async createLoggedInUser(id_ws: string): Promise<LoggedInUserModel> {\n\t\tlet ws = this._websocketManager.getWebSocket(id_ws);\n\n\t\tif (ws) {\n\t\t\tlet user = {\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t__v: 0,\n\t\t\t\tdate: new Date(),\n\t\t\t\tid_user: ws['id_user'],\n\t\t\t\tuser: ws['user'],\n\t\t\t\tid_ws: ws['id_socket']\n\t\t\t};\n\t\t\t\n\t\t\tthis._loggedInUsers.push(user);\n\t\t\tawait LoggedInUsers.insertOne(user);\n\t\t\t\n\t\t\treturn user;\n\t\t}\n\t\telse {\n\t\t\tthrow new Error('Error in Create Logged In User: No WS');\n\t\t}\n\t}\n\n\t// Unsubscribe from publication \n\tpublic unsubscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\t\t\n\t\tthis._debugUnSubHits += 1;\n\n\t\tif (!this._publications[publication]) {\n\t\t\tconsole.log('No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\tif (sub) {\n\t\t\t\tfor (let i = sub.clients.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (sub.clients[i].id_user === ws['id_user'] && sub.clients[i].messageId === messageId && sub.clients[i].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Unsub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Unsubscribe from publication\n\tpublic async unsubscribeAll(ws: WebSocket) {\n\t\tthis._debugUnSubAllHits += 1;\n\n\t\tif (ws) {\n\t\t\t// Check if WebSocket has already been unsubscribed\n\t\t\tif (ws['isUnsubscribed']) {\n\t\t\t\treturn; // Skip if already unsubscribed\n\t\t\t}\n\t\t\t\n\t\t\t// Mark the WebSocket as unsubscribed to prevent further calls\n\t\t\tws['isUnsubscribed'] = true;\n\t\t\t\n\t\t\tif (this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']) >= 0) {\n\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']), 1);\n\t\t\t}\n\t\t\t\n\t\t\tawait LoggedInUsers.deleteOne({ id_ws: ws['id_socket'] });\n\n\t\t\tlet userSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_user === ws['id_user'] && b.id_socket === ws['id_socket']));\n\n\t\t\tfor (let i = userSubs.length - 1; i >= 0; i--) {\n\t\t\t\tlet sub = userSubs[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tif (sub.clients[j].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._websocketManager.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic getActiveSubscriptions() {\n\t\treturn this._subscriptions;\n\t}\n\n\t// Get publication collection\n\tprivate getPublicationCollections(publication: string) {\n\t\treturn this._publications[publication].collections;\n\t}\n\n\t// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)\n\tprivate async tailOpLog(resumeToken?: ResumeToken) {\n\t\tif (this._oplog$ && !this._oplog$.closed) {\n\t\t\tthis._oplog$.removeAllListeners();\n\t\t\tawait this._oplog$.close();\n\t\t\tthis._oplog$ = null;\n\t\t}\n\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\n\t\tif (!this._oplog$ || this._oplog$.closed) {\n\t\t\tthis._oplogRetryCount += 1;\n\n\t\t\tif (this._oplogRetryCount > 5) {\n\t\t\t\tconsole.error('****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst pipeline = [\n\t\t\t\t{\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t{'ns.coll': { $nin: [\n\t\t\t\t\t\t\t\t'log-method-latencies', \n\t\t\t\t\t\t\t\t'log-subscriptions', \n\t\t\t\t\t\t\t\t'logs', \n\t\t\t\t\t\t\t\t'counters', \n\t\t\t\t\t\t\t\t'cron-job-histories', \n\t\t\t\t\t\t\t\t'email-histories',\n\t\t\t\t\t\t\t\t'qb-soap-request-histories', \n\t\t\t\t\t\t\t\t'qb-soap-request-responses', \n\t\t\t\t\t\t\t\t'qb-soap-requests',\n\t\t\t\t\t\t\t\t'qb-soap-retries'\n\t\t\t\t\t\t\t] }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tlet lastResumeToken: ResumeToken;\n\n\t\t\tif (resumeToken) {\n\t\t\t\tlastResumeToken = resumeToken;\n\t\t\t\ttry {\n\t\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch(pipeline, { resumeAfter: resumeToken });\n\t\t\t\t}\n\t\t\t\tcatch {\n\t\t\t\t\tif (this._oplog$) {\n\t\t\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\t\t\tawait this._oplog$.close();\n\t\t\t\t\t\tthis._oplog$ = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait this.tailOpLog(resumeToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch(pipeline);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'oplog started');\n\n\t\t\tthis._oplog$.on('change', async (doc: ChangeStreamInsertDocument | ChangeStreamUpdateDocument | ChangeStreamReplaceDocument | ChangeStreamDeleteDocument) => {\n\t\t\t\tif (doc.ns) {\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Oplog Hit', doc.ns);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet collection = doc.ns.coll;\n\n\t\t\t\t\tif (!this._debugOplogCollections.some(a => a.collection === doc.ns.coll && a.type === doc.operationType)) {\n\t\t\t\t\t\tthis._debugOplogCollections.push({\n\t\t\t\t\t\t\tcollection: doc.ns.coll,\n\t\t\t\t\t\t\ttype: doc.operationType,\n\t\t\t\t\t\t\thits: 1\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\tthis._debugOplogCollections.find(a => a.collection === doc.ns.coll && a.type === doc.operationType).hits += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection) {\n\t\t\t\t\t\tthis._debugOplogHits += 1;\n\n\t\t\t\t\t\tif (doc.operationType === 'insert') {\n\t\t\t\t\t\t\tif (collection === 'support-tickets') {\n\t\t\t\t\t\t\t\tif (this.serverConfig['ROOT_URL'] === 'https://resolveio.com') {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'sendSupportTicketEmail', doc.documentKey['_id']);\n\t\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'update' || doc.operationType === 'replace') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'update');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'delete') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'delete');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection === 'flags') {\n\t\t\t\t\t\tlet flag = await Flags.findOne({ type: 'Enable Debug' });\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (flag && flag.value) {\n\t\t\t\t\t\t\tthis._enableDebug = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis._enableDebug = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlastResumeToken = doc._id;\n\n\t\t\t\t\tif ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && (process.env.IS_WORKERS_ENABLED === 'false' || (process.env.IS_WORKER_INSTANCE === 'true' && process.env.WORKER_INDEX === '0'))) {\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._oplog$.on('error', async error => {\n\t\t\t\tconsole.log(new Date(), 'oplog error', error);\n\t\t\t\tawait this._oplog$.close();\n\t\t\t});\n\n\t\t\tthis._oplog$.on('end', async () => {\n\t\t\t\tconsole.log(new Date(), 'oplog end');\n\t\t\t\tawait this._oplog$.close();\n\t\t\t});\n\n\t\t\tthis._oplog$.on('close', async () => {\n\t\t\t\tconsole.log(new Date(), 'oplog close');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tawait this.tailOpLog(lastResumeToken);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async processSubscription(sub: ActiveSubscriptionModel, ws: WebSocket, messageId: number) {\n\t\tif (!this._publications[sub.publication].user_specific) {\t\t\t\n\t\t\tif (sub.cacheId) {\n\t\t\t\ttry {\n\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\tdata: cacheData\n\t\t\t\t\t};\n\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Cache', sub.publication);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t}\n\t\t\t\tcatch {\n\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\tsub.cacheId = 0;\n\n\t\t\t\t\tawait this.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Non - Cache', sub.publication, sub.running);\n\t\t\t\t}\n\n\t\t\t\tif (sub.running) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait this.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Process Sub Specific, Non - Cache', sub.publication, sub.running);\n\t\t\t}\n\n\t\t\tif (sub.running) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tawait this.sendDataToOneWithRetry(ws, messageId, sub, '', 'newSub');\n\t\t}\n\t}\n\n\tprivate async sendDataToOne(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('User Specific Publication', sub.publication, '', '', sub.subscriptionData);\n\t\ttry {\n\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\n\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ws['id_user'], ...sub.subscriptionData);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: res\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t}\n\t\tcatch (err) {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: err\n\t\t\t};\n\t\t\t\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\n\t\t\tawait ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendDataToOne - WS)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t}\n\t\tfinally {\n\t\t\tawait this._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToAll(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tif (!sub.clients.length) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\tsub.cacheId = 0;\n\t\t\t}\n\n\t\t\tlet subIndex = this._subscriptions.findIndex(a => a.publication === sub.publication && JSON.stringify(a.subscriptionData) === JSON.stringify(sub.subscriptionData));\n\t\t\tif (subIndex >= 0) {\n\t\t\t\tthis._subscriptions.splice(subIndex, 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Publication', sub.publication, '', '', sub.subscriptionData);\n\n\t\t\ttry {\n\t\t\t\tif (sub.publication !== 'superadminAPM' && sub.publication !== 'loggedInUsers') {\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\t\t\t\t}\n\n\t\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ...sub.subscriptionData);\n\n\t\t\t\tif (sub.cacheId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\t\n\t\t\t\t\t\tif (JSON.stringify(cacheData) !== JSON.stringify(res)) {\n\t\t\t\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsub.cacheId = 0;\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\tcatch {\n\t\t\t\t\t\tsub.clients.map(client => {\n\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\n\t\t\t\t\t\tconst nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\t\t\t\t// Evict cache entries as needed\n\t\t\t\t\t\t\tlet deleteCount = 0;\n\t\t\t\t\t\t\tconst subArr = this._subscriptions.filter(a => a.cacheId && !a.clients.length);\n\t\t\t\t\t\n\t\t\t\t\t\t\tfor (let zz = 0; zz < subArr.length; zz++) {\n\t\t\t\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\t\t\t\tthis._nodeCache.del(subArr[zz].cacheId);\n\t\t\t\t\t\t\t\tsubArr[zz].cacheId = 0;\n\t\t\t\t\t\t\t\tdeleteCount += 1;\n\t\t\t\t\t\t\t\tif (this._nodeCache.getStats().vsize < this._heapLimit * 0.75) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t'Sub Cache: ' +\n\t\t\t\t\t\t\t\t\t'Too Big - ' +\n\t\t\t\t\t\t\t\t\tsub.publication +\n\t\t\t\t\t\t\t\t\t' - Deleted: ' +\n\t\t\t\t\t\t\t\t\tdeleteCount +\n\t\t\t\t\t\t\t\t\t' - ' +\n\t\t\t\t\t\t\t\t\tnodeCacheSize\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\tsub.cacheId = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\thasError: true,\n\t\t\t\t\t\t\tdata: err\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tawait ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendPubData)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\tawait this._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate sendWS(ws: WebSocket, data: ServerResponseModel) {\n\t\tthis._websocketManager.send(ws, data);\n\t}\n\n\tpublic getEnableDebug() {\n\t\treturn this._enableDebug;\n\t}\n}\n"]}
|