@resolveio/server-lib 20.10.1 → 20.10.2
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/email-history.collection.js +18 -0
- package/collections/email-history.collection.js.map +1 -1
- package/collections/log.collection.js +4 -0
- package/collections/log.collection.js.map +1 -1
- package/managers/method.manager.d.ts +9 -1
- package/managers/method.manager.js +444 -178
- package/managers/method.manager.js.map +1 -1
- package/managers/subscription.manager.js +73 -29
- package/managers/subscription.manager.js.map +1 -1
- package/methods/logs.js +23 -4
- package/methods/logs.js.map +1 -1
- package/models/email-history.model.d.ts +11 -0
- package/models/email-history.model.js.map +1 -1
- package/models/log.model.d.ts +1 -0
- package/models/log.model.js.map +1 -1
- package/package.json +1 -1
- package/server-app.js +79 -36
- package/server-app.js.map +1 -1
- package/util/error-tracking.d.ts +13 -0
- package/util/error-tracking.js +121 -0
- package/util/error-tracking.js.map +1 -0
package/server-app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server-app.ts"],"names":[],"mappings":"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","file":"server-app.js","sourcesContent":["import * as bodyParser from 'body-parser';\nimport * as express from 'express';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport { createServer, Server } from 'http';\nimport * as jwt from 'jsonwebtoken';\nimport * as moment from 'moment-timezone';\nimport { unpack } from 'msgpackr';\nimport { URL } from 'url';\nimport * as WebSocket from 'ws';\n\nimport { Logs } from './collections/log.collection';\nimport { Users } from './collections/user.collection';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { ServerResponseModel } from './models/server-message.model';\nimport { dateReviver, getBinarySize, isAllowedOrigin, objectIdHexString } from './util/common';\n\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { setupHomeRoutes } from './http/home';\n\nimport { WebSocketManager } from './managers/websocket.manager';\nimport { WorkerDispatcherManager } from './managers/worker-dispatcher.manager';\nimport { WorkerServerManager } from './managers/worker-server.manager';\nimport { ResolveIOServer } from './resolveio-server-app';\n\nexport class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\tprivate _workerDispatcherManager: WorkerDispatcherManager;\n\tprivate _workerServerManager: WorkerServerManager;\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate _safeShutdown = false;\n\n\tprivate readonly _clientHeartbeatIntervalMs = 20000;\n\tprivate readonly _clientHeartbeatInitialDelayMs = 5000;\n\tprivate readonly _clientHeartbeatBackpressureBytes = 5 * 1024 * 1024;\n\n\tconstructor() {}\n\n\tstatic async create() {\n\t\tconst resolveioMainServer = new ResolveIOMainServer();\n\t\tawait resolveioMainServer.initialize();\n\t\treturn resolveioMainServer;\n\t}\n\n\tprivate async initialize() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = await MonitorManager.create();\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._methodManager && this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tlet initServerFlag = false;\n\n\t\tsetTimeout(() => {\n\t\t\tinitServerFlag = true;\n\t\t}, 5000);\n\n\t\tprocess.removeAllListeners('unhandledRejection');\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.error(new Date(), 'ERROR DETECTED w/ Debug Flag Active: unhandledRejection', [error, rej]);\n\t\t\t}\n\n\t\t\t// Condition to filter out the MongoError with code 48 (NamespaceExists)\n\t\t\tif (error && error['name'] === 'MongoError' && (error['code'] === 48 || error['code'] === 26 || error['code'] === 11000 || error['code'] === 251)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tif (error && error['name'] === 'MongoServerError' && (!initServerFlag || error['code'] === 26 || error['code'] === 11000 || error['code'] === 86 || error['code'] === 251)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tconsole.error(new Date(), 'Unhandled Rejection at Promise', [error, rej]);\n\t\t\t\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\t// If this is a MongoNetworkTimeoutError, handle it specifically\n\t\t\tif (error && (error['name'] === 'MongoNetworkTimeoutError' || error instanceof MongoNetworkTimeoutError)) {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t// Sending email notification (using your existing method)\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - MongoNetworkTimeoutError - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify({\n\t\t\t\t\t\tname: error['name'],\n\t\t\t\t\t\tmessage: error['message'],\n\t\t\t\t\t\tstack: error['stack']\n\t\t\t\t\t}, null, 2));\n\n\t\t\t\t\t// Exiting the process\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error) {\n\t\t\t\tif (error['name'] !== 'StatusError' && error['message'] !== '') {\n\t\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconsole.error(error, 'Uncaught Exception thrown');\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t}\n\t\t});\n\n\t\t//PM2 wants to reboot/restart\n\t\tprocess.on('SIGINT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tconsole.log('Running as a Worker instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._methodManager = MethodManager.create(null, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerServerManager = WorkerServerManager.create(this._methodManager, this.getServerConfig());\n\n\t\t\t\tif (process.env.WORKER_INDEX === '0') {\n\t\t\t\t\tthis._cronManager = CronManager.create();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('Running as a Server instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerDispatcherManager = WorkerDispatcherManager.create(this._websocketManager, this._methodManager);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.startServerInstance();\n\t\t\t\tthis.listen();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.log('Running with Workers Disabled', process.env.NODE_APP_INSTANCE);\n\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\tthis._cronManager = CronManager.create();\n\t\t\tthis.startServerInstance();\n\t\t\tthis.listen();\n\t\t}\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.NODE_APP_INSTANCE ? parseInt('808' + process.env.NODE_APP_INSTANCE) : 8080;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app);\n\n\t\tif (ResolveIOServer.getServerConfig()['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tprivate async safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length\n\t\t\t&& !this._offlineUpdates.length && (!this._workerDispatcherManager || this._workerDispatcherManager.isSafeShutdown())\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait ResolveIOServer.getMongoConnection().close(false);\n\t\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tcatch { \n\t\t\t\t\tprocess.exit(1); \n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (!this._safeShutdown) {\n\t\t\t\tthis._safeShutdown = true;\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._safeShutdown = false;\n\t\t\t\t}, 1000);\n\n\t\t\t\tconsole.log(new Date(), 'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length,\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(async () => {\n\t\t\t\tawait this.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000;\n\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tserver: this._serverHTTP,\n\t\t\tverifyClient: this.publicProgram ? null : (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If it's a worker, we might skip token checks or do a simple check:\n\t\t\t\t\tif (info.req.url && info.req.url.includes('workerToken=')) {\n\t\t\t\t\t\tlet requestUrl: URL;\n\t\t\t\t\t\tlet rootUrl = ResolveIOServer.getServerConfig()['ROOT_URL'] || 'http://localhost';\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\trequestUrl = new URL(info.req.url, rootUrl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\tcb(false, 400, 'Bad Request');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet workerToken = requestUrl.searchParams.get('workerToken') || '';\n\t\t\t\t\t\tlet workerIndex = requestUrl.searchParams.get('workerIndex');\n\n\t\t\t\t\t\tif (workerToken === ResolveIOServer.getServerConfig()['WORKER_TOKEN']) {\n\t\t\t\t\t\t\tif (workerIndex) {\n\t\t\t\t\t\t\t\tinfo.req['workerIndex'] = workerIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (!isAllowedOrigin(info.origin, ResolveIOServer.getServerConfig())) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, ResolveIOServer.getServerConfig()['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Listen for connections from clients or workers.\n\t */\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running HTTP/WS server on port %s', this._portHTTP);\n\t\t});\n\n\t\t\tthis._serverWSS.on('connection', async (ws, req) => {\n\t\t\t\tif (req.url && req.url.includes('workerToken=')) {\n\t\t\t\t\t// It's a WORKER\n\t\t\t\t\tlet workerId = objectIdHexString();\n\t\t\t\t\tws['id_worker'] = workerId;\n\t\t\t\t\tlet workerIndex = null;\n\n\t\t\t\t\tif (req.url) {\n\t\t\t\t\t\tlet rootUrl = ResolveIOServer.getServerConfig()['ROOT_URL'] || 'http://localhost';\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet requestUrl = new URL(req.url, rootUrl);\n\t\t\t\t\t\t\tworkerIndex = requestUrl.searchParams.get('workerIndex');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\tworkerIndex = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!workerIndex && req['workerIndex']) {\n\t\t\t\t\t\tworkerIndex = req['workerIndex'];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (workerIndex !== null && workerIndex !== undefined) {\n\t\t\t\t\t\tws['workerIndex'] = workerIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet workerIndexForLog = ws['workerIndex'] || 'UNKNOWN';\n\t\t\t\t\tconsole.log(new Date(), 'Worker Connected', workerIndexForLog, process.env.NODE_APP_INSTANCE);\n\n\t\t\t\t\tthis._workerDispatcherManager.addWorker(ws);\n\n\t\t\t\tlet interval = null;\n\t\t\t\tlet lastComm = null;\n\n\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\n\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\t\t\t\t\t\tws.close();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\t\t\t\t}\n\t\t\t\t}, 30000);\n\n\t\t\t\t\tws.on('message', (message: WebSocket.RawData) => {\n\t\t\t\t\t\tif (typeof message === 'string') {\n\t\t\t\t\t\t\tif (message === 'ping') {\n\t\t\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'pong');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (message === 'pong') {\n\t\t\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tthis._workerDispatcherManager.handleWorkerMessage(ws['id_worker'], message);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet buffer: Buffer;\n\n\t\t\t\t\t\tif (Buffer.isBuffer(message)) {\n\t\t\t\t\t\t\tbuffer = message;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (Array.isArray(message)) {\n\t\t\t\t\t\t\tconst chunks = message as unknown as ReadonlyArray<Uint8Array>;\n\t\t\t\t\t\t\tbuffer = Buffer.concat(chunks);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (message instanceof ArrayBuffer) {\n\t\t\t\t\t\t\tbuffer = Buffer.from(message);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (ArrayBuffer.isView(message)) {\n\t\t\t\t\t\t\tconst view = message as NodeJS.ArrayBufferView;\n\t\t\t\t\t\t\tbuffer = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tbuffer = Buffer.from(message as any);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (buffer.length === 4) {\n\t\t\t\t\t\t\tlet heartbeat = buffer.toString('utf8');\n\n\t\t\t\t\t\t\tif (heartbeat === 'ping') {\n\t\t\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'pong');\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (heartbeat === 'pong') {\n\t\t\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._workerDispatcherManager.handleWorkerMessage(ws['id_worker'], buffer);\n\t\t\t\t\t});\n\n\t\t\t\tws.on('close', () => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.log(new Date(), 'Worker disconnected:', workerId);\n\t\t\t\t\t\n\t\t\t\t\tif (interval) {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('error', (error) => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.error('Error on WS Worker', error);\n\t\t\t\t\tws.close();\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Normal client\n\t\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\t\tawait this._subscriptionManager.createLoggedInUser(ws['id_socket']);\n\t\t\t\t\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tawait this.triggerClientHeartbeat(ws);\n\t\t\t\t}, this._clientHeartbeatInitialDelayMs);\n\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Connection from user: ' + req['user']);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tws['isAlive'] = true;\n\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\tws.on('pong', () => {\n\t\t\t\t\tws['isAlive'] = true;\n\t\t\t\t\tws['pongTime'] = new Date();\n\t\t\t\t\tif (ws['pingTime']) {\n\t\t\t\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\t\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('message', async (message: WebSocket.RawData) => {\n\t\t\t\t\tthis._debugMsgRecv += 1;\n\t\t\t\t\tlet socketData = [];\n\t\t\t\t\tlet usedBinary = false;\n\t\t\t\t\tlet bufferPayload: Buffer;\n\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (typeof message === 'string') {\n\t\t\t\t\t\t\tif (message === 'ping' || message === 'pong') {\n\t\t\t\t\t\t\t\tsocketData = message;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (Buffer.isBuffer(message)) {\n\t\t\t\t\t\t\tbufferPayload = message;\n\t\t\t\t\t\t\tlet decodeResult = this.decodeBufferPayload(bufferPayload);\n\t\t\t\t\t\t\tsocketData = decodeResult.data;\n\t\t\t\t\t\t\tusedBinary = decodeResult.usedBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (Array.isArray(message)) {\n\t\t\t\t\t\t\tbufferPayload = Buffer.concat(message as unknown as ReadonlyArray<Uint8Array>);\n\t\t\t\t\t\t\tlet decodeResult = this.decodeBufferPayload(bufferPayload);\n\t\t\t\t\t\t\tsocketData = decodeResult.data;\n\t\t\t\t\t\t\tusedBinary = decodeResult.usedBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (message instanceof ArrayBuffer) {\n\t\t\t\t\t\t\tbufferPayload = Buffer.from(message);\n\t\t\t\t\t\t\tlet decodeResult = this.decodeBufferPayload(bufferPayload);\n\t\t\t\t\t\t\tsocketData = decodeResult.data;\n\t\t\t\t\t\t\tusedBinary = decodeResult.usedBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (ArrayBuffer.isView(message)) {\n\t\t\t\t\t\t\tconst view = message as NodeJS.ArrayBufferView;\n\t\t\t\t\t\t\tbufferPayload = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n\t\t\t\t\t\t\tlet decodeResult = this.decodeBufferPayload(bufferPayload);\n\t\t\t\t\t\t\tsocketData = decodeResult.data;\n\t\t\t\t\t\t\tusedBinary = decodeResult.usedBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthrow new Error('Unsupported WebSocket message type: ' + typeof message);\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\t\tconsole.log('Error - WS message parse', e);\n\t\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t\t'dev@resolveio.com', \n\t\t\t\t\t\t\t'SERVER - JSON Parse Error - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], \n\t\t\t\t\t\t\tJSON.stringify([bufferPayload ? bufferPayload.toString('base64') : message, e])\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (usedBinary) {\n\t\t\t\t\t\tws['supportsBinary'] = true;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// call our existing processSocketMessage\n\t\t\t\t\tawait this.processSocketMessage(ws, socketData);\n\t\t\t\t})\n\t\t\t\t.on('end', () => {\n\t\t\t\t\tws.close();\n\t\t\t\t})\n\t\t\t\t.on('error', () => {\n\t\t\t\t\tws.close()\n\t\t\t\t})\n\t\t\t\t.on('close', async () => {\n\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Keep alive timer\n\t\tsetInterval(async () => {\n\t\t\tfor (let ws of this._serverWSS.clients) {\n\t\t\t\tif (ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= this._clientHeartbeatIntervalMs) {\n\t\t\t\t\tif (this.shouldDeferHeartbeat(ws)) {\n\t\t\t\t\t\tws['isAlive'] = true;\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\t\tws['retryCnt']++;\n\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tawait this.triggerClientHeartbeat(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\t\tawait this.triggerClientHeartbeat(ws);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, this._clientHeartbeatIntervalMs);\n\t}\n\n\tprivate async processSocketMessage(ws: WebSocket, socketData: any) {\n\t\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tws.send('pong');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\tws['isAlive'] = true;\n\t\t\tws['pongTime'] = new Date();\n\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\treturn;\n\t\t}\n\n\t\t// If the top level is not an array, let's skip\n\t\tif (!Array.isArray(socketData[0])) {\n\t\t\tconsole.log('Invalid message format (expected array of arrays)', socketData);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle each sub-message\n\t\tfor (let message of socketData) {\n\t\t\tawait this.handleClientMessage(ws, message);\n\t\t}\n\t}\n\n\tprivate decodeBufferPayload(buffer: Buffer): { data: any; usedBinary: boolean } {\n\t\tconst textPayload = buffer.toString('utf8');\n\n\t\tif (this.looksLikeTextPayload(textPayload)) {\n\t\t\ttry {\n\t\t\t\treturn { data: this.parseTextFallback(textPayload), usedBinary: false };\n\t\t\t}\n\t\t\tcatch {\n\t\t\t\t// fall through to attempt MessagePack decode\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\treturn { data: unpack(buffer), usedBinary: true };\n\t\t}\n\t\tcatch (binaryErr) {\n\t\t\ttry {\n\t\t\t\treturn { data: this.parseTextFallback(textPayload), usedBinary: false };\n\t\t\t}\n\t\t\tcatch {\n\t\t\t\tthrow binaryErr;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate parseTextFallback(rawMessage: string): any {\n\t\tif (rawMessage === 'ping' || rawMessage === 'pong') {\n\t\t\treturn rawMessage;\n\t\t}\n\n\t\ttry {\n\t\t\treturn JSON.parse(rawMessage, dateReviver);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate looksLikeTextPayload(text: string): boolean {\n\t\tif (!text) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst trimmed = text.trim();\n\t\tif (!trimmed) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst first = trimmed[0];\n\t\treturn first === '[' || first === '{' || first === '\"' || first === 'p' || first === 'P';\n\t}\n\n\tprivate async triggerClientHeartbeat(ws: WebSocket): Promise<void> {\n\t\tif (!ws || ws.readyState !== ws.OPEN) {\n\t\t\treturn;\n\t\t}\n\n\t\tws['pingTime'] = new Date();\n\n\t\ttry {\n\t\t\tif (typeof ws.ping === 'function') {\n\t\t\t\tws.ping();\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (this._methodManager?.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping Frame', err);\n\t\t\t}\n\t\t\tawait this.unsubscribeWS(ws);\n\t\t\treturn;\n\t\t}\n\n\t\tws.send('ping', async (error) => {\n\t\t\tif (error) {\n\t\t\t\tif (this._methodManager?.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t}\n\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate shouldDeferHeartbeat(ws: WebSocket): boolean {\n\t\tif (!ws || ws.readyState !== ws.OPEN) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst bufferedAmount = typeof ws.bufferedAmount === 'number' ? ws.bufferedAmount : 0;\n\t\treturn bufferedAmount >= this._clientHeartbeatBackpressureBytes;\n\t}\n\n\tprivate async handleClientMessage(ws: WebSocket, msg: any[]): Promise<void> {\n\t\t// This is basically your old logic from processSocketMessage,\n\t\t// but we'll insert our worker-queue logic for \"method\" calls.\n\n\t\tlet messageRoute = msg[0];\n\t\tlet messageDate = msg[1];\n\t\tlet messageId = msg[2];\n\t\tlet type = msg[3];\n\n\t\tif (!this.publicProgram && this._clientRoutes.some(a => messageRoute.includes(a)) && !ws['doc_user'].roles.groups.some(a => a.views.some(b => messageRoute.includes(b) || b.includes(messageRoute))) && !ws['doc_user'].roles.super_admin) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (type === 'subscription') {\n\t\t\tlet subType = msg[4];\n\t\t\tlet pub = msg[5];\n\n\t\t\tif (subType === 'sub') {\n\t\t\t\tawait this._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t}\n\t\telse if (!this.publicProgram && type === 'offline') {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: 'ACK'\n\t\t\t};\n\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = msg[4];\n\n\t\t\tfor (let i = 0; i < offlineUpdates.length; i++) {\n\t\t\t\tlet update = offlineUpdates[i];\n\n\t\t\t\tlet data = update.data;\n\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tlet serverResMethod: ServerResponseModel = {\n\t\t\t\t\tmessageId: updateMessageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, serverResMethod);\n\t\t\t\t}\n\n\t\t\t\tif (method === 'insertDocument' && data[0] === 'driver-gps') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution' && method !== 'qbHandleResponse') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([data])) < 1000000 ? JSON.stringify([data], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([data])) < 1000000 ? JSON.stringify([data], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethod.call(Object.assign({}, this._methodManager, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), method, ...data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Offline Error', JSON.stringify(err, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(data[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Offline - Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.splice(this._offlineUpdates.map(a => a['id_socket']).indexOf(ws['id_socket']), 1);\n\t\t}\n\t\telse {\n\t\t\t// It's presumably a 'method' or something else\n\t\t\tlet dataCopy = [...msg];\n\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet route = dataCopy.shift();\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet date = dataCopy.shift();\n\t\t\tlet msgId = dataCopy.shift();\n\t\t\tlet msgType = dataCopy.shift();\n\t\t\t\n\t\t\tif (msgType === 'method') {\n\t\t\t\tlet methodName = dataCopy.shift();\n\n\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (methodName !== 'reportBuilderGetResults' && methodName !== 'reportBuilderGetDistinctValue' && methodName !== 'reportBuilderBuildTree' && methodName !== 'generatePDF' && methodName !== 'getWOOfflineData' && methodName !== 'countQuery' && methodName !== 'countWithQuery' && methodName !== 'countCollectionWithQuery' && methodName !== 'find' && methodName !== 'findOne' && methodName !== 'findWithOptions' && methodName !== 'getDrivers' && methodName !== 'processAirdropDistribution') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([dataCopy])) < 1000000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([dataCopy])) < 1000000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Immediately ACK\n\t\t\t\tlet ack: ServerResponseModel = {\n\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, ack);\n\t\t\t\t}\n\n\t\t\t\tlet method = this._methodManager.getMethod(methodName);\n\n\t\t\t\tif (method &&\n\t\t\t\t\t!method.skipWorker &&\n\t\t\t\t\tthis._isWorkersEnabled &&\n\t\t\t\t\tthis._workerDispatcherManager &&\n\t\t\t\t\tthis._workerDispatcherManager.hasWorkers() &&\n\t\t\t\t\tmethodName !== 'find' &&\n\t\t\t\t\tmethodName !== 'insertDocument' &&\n\t\t\t\t\tmethodName !== 'countWithQuery' &&\n\t\t\t\t\tmethodName !== 'findOne' &&\n\t\t\t\t\tmethodName !== 'updateDocumentProps' &&\n\t\t\t\t\tmethodName !== 'findWithOptions' &&\n\t\t\t\t\tmethodName !== 'updateDocument' &&\n\t\t\t\t\tmethodName !== 'insertErrorLog' &&\n\t\t\t\t\tmethodName !== 'removeDocument' &&\n\t\t\t\t\tmethodName !== 'supportCreateBillingUser' &&\n\t\t\t\t\tmethodName !== 'getSignedUrl' &&\n\t\t\t\t\tmethodName !== 'getSignedUrls' &&\n\t\t\t\t\tmethodName !== 'getSignedUrlWithId' &&\n\t\t\t\t\tmethodName !== 'incorrectUser' &&\n\t\t\t\t\tmethodName !== 'reloadWS' &&\n\t\t\t\t\tmethodName !== 'reconnectWS' &&\n\t\t\t\t\tmethodName !== 'disconnectWS'\n\t\t\t\t) {\n\t\t\t\t\tthis._workerDispatcherManager.sendClientTask(msgId, methodName, dataCopy, {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// No worker available: do method locally\n\t\t\t\t\tawait this.callMethodLocally(ws, msgId, methodName, dataCopy);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * callMethodLocally is your old approach for invoking the method in-process.\n\t */\n\tprivate async callMethodLocally(ws: WebSocket, messageId: number, method: string, params: any[]) {\n\t\tlet serverRes: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: false,\n\t\t\tdata: null\n\t\t};\n\n\t\ttry {\n\t\t\t// You can keep your logging code (LogMethodLatencies, Logs.insertOne, etc.)\n\t\t\tlet result = await this._methodManager.callMethod.call(\n\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t}),\n\t\t\t\tmethod,\n\t\t\t\t...params\n\t\t\t);\n\n\t\t\tserverRes.data = result;\n\t\t}\n\t\tcatch (err) {\n\t\t\tserverRes.hasError = true;\n\t\t\tserverRes.data = err || 'Unknown error';\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t}\n\t}\n\n\t\n\n\t/**\n\t * Cleanly remove a client from the subscription manager, etc.\n\t */\n\tpublic async unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager && this._methodManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tawait this._subscriptionManager.unsubscribeAll(ws);\n\t\tws.removeAllListeners();\n\t\tws = null;\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n\n\tpublic getServerConfig() {\n\t\treturn ResolveIOServer.getServerConfig();\n\t}\n\n\tpublic getWorkerDispatcherManager() {\n\t\treturn this._workerDispatcherManager;\n\t}\n\n\tpublic getWorkerServerManager() {\n\t\treturn this._workerServerManager;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server-app.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wCAA0C;AAC1C,iCAAmC;AACnC,kDAAoD;AACpD,6BAA4C;AAC5C,kCAAoC;AACpC,wCAA0C;AAC1C,qCAAkC;AAClC,2BAA0B;AAC1B,8BAAgC;AAEhC,+DAAoD;AACpD,iEAAsD;AACtD,wDAAsD;AACtD,4DAA0D;AAC1D,8DAAoF;AACpF,wEAAsE;AAEtE,wCAA+F;AAC/F,wDAAmE;AAEnE,mCAAmD;AACnD,oCAA8C;AAC9C,wCAAkD;AAClD,oCAA8C;AAE9C,kEAAgE;AAChE,kFAA+E;AAC/E,0EAAuE;AACvE,+DAAyD;AAEzD;IAsCC;QAjCQ,oBAAe,GAAG,EAAE,CAAC;QACtB,YAAO,GAAG,KAAK,CAAC;QACf,oBAAe,GAAG,KAAK,CAAC;QACxB,kBAAa,GAAG,KAAK,CAAC;QACtB,gBAAW,GAAG,KAAK,CAAC;QAEpB,WAAM,GAAG,OAAO,CAAC,CAAC,eAAe;QAQjC,kBAAa,GAAa,EAAE,CAAC;QAK7B,kBAAa,GAAS,IAAI,CAAC;QAE3B,kBAAa,GAAG,CAAC,CAAC;QAClB,mBAAc,GAAG,CAAC,CAAC;QAEnB,sBAAiB,GAAG,KAAK,CAAC;QAC1B,sBAAiB,GAAG,KAAK,CAAC;QAE1B,kBAAa,GAAG,KAAK,CAAC;QAEb,+BAA0B,GAAG,KAAK,CAAC;QACnC,mCAA8B,GAAG,IAAI,CAAC;QACtC,sCAAiC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAEtD,CAAC;IAEH,0BAAM,GAAnB;;;;;;wBACO,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAC;wBACtD,qBAAM,mBAAmB,CAAC,UAAU,EAAE,EAAA;;wBAAtC,SAAsC,CAAC;wBACvC,sBAAO,mBAAmB,EAAC;;;;KAC3B;IAEa,wCAAU,GAAxB;;;;;;;wBACC,IAAI,CAAC,gBAAgB,GAAG,IAAI,IAAI,EAAE,CAAC;wBACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;wBAC1B,KAAA,IAAI,CAAA;wBAAmB,qBAAM,gCAAc,CAAC,MAAM,EAAE,EAAA;;wBAApD,GAAK,eAAe,GAAG,SAA6B,CAAC;wBACrD,IAAI,CAAC,uBAAuB,GAAG,IAAI,wCAAsB,EAAE,CAAC;wBAE5D,6CAA6C;wBAC7C,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,CAAC;wBACnE,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,CAAC;wBAEnE,WAAW,CAAC;4BACX,IAAI,KAAI,CAAC,cAAc,IAAI,KAAI,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE;gCAChE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,KAAI,CAAC,aAAa,CAAC,CAAC;gCAC3E,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,KAAI,CAAC,cAAc,CAAC,CAAC;6BAC7E;4BAED,KAAI,CAAC,cAAc,GAAG,CAAC,CAAC;4BACxB,KAAI,CAAC,aAAa,GAAG,CAAC,CAAC;wBACxB,CAAC,EAAE,KAAK,CAAC,CAAC;wBAEN,cAAc,GAAG,KAAK,CAAC;wBAE3B,UAAU,CAAC;4BACV,cAAc,GAAG,IAAI,CAAC;wBACvB,CAAC,EAAE,IAAI,CAAC,CAAC;wBAET,OAAO,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;wBAEjD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,UAAO,KAAK,EAAE,GAAG;;;;;;wCAC3C,KAA4C,IAAA,2CAA0B,EAAC,KAAK,CAAC,EAApE,eAAe,WAAA,EAAE,aAAa,mBAAA,CAAuC;wCAEpF,IAAI,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE;4CACzC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,yDAAyD,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE,EAAE,aAAa,eAAA,EAAE,CAAC,CAAC,CAAC;yCAChI;wCAED,6DAA6D;wCAC7D,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,YAAY,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE;4CAC9M,sBAAO,CAAC,+CAA+C;yCACvD;wCAED,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,kBAAkB,IAAI,CAAC,CAAC,cAAc,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE;4CACvO,sBAAO,CAAC,+CAA+C;yCACvD;wCAEK,YAAY,GAAG;4CACpB,EAAE,EAAE,aAAa;4CACjB,IAAI,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI;4CAC3B,OAAO,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,OAAO;4CACjC,KAAK,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK;4CAC7B,IAAI,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI;4CAC3B,QAAQ,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,QAAQ;yCACnC,CAAC;wCAEF,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,gCAAgC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;wCAExE,WAAW,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;6CAG9D,CAAA,eAAe,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,0BAA0B,IAAI,eAAe,YAAY,kCAAwB,CAAC,CAAA,EAAlI,wBAAkI;6CACjI,CAAA,WAAW,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAA,EAAvC,wBAAuC;wCAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;wCAChC,UAAU,CAAC;4CACV,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC;wCAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;wCAEV,0DAA0D;wCAC1D,qBAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAClC,mBAAmB,EACnB,wDAAwD,GAAG,sCAAe,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,EAC3G,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EACrC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,KAAK,EACL;gDACC,aAAa,eAAA;gDACb,IAAI,EAAE;oDACL,OAAO,EAAE,oBAAoB;oDAC7B,QAAQ,EAAE,0BAA0B;iDACpC;6CACD,CACD,EAAA;;wCAlBD,0DAA0D;wCAC1D,SAiBC,CAAC;wCAEF,sBAAsB;wCACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;;6CAGT,CAAA,eAAe,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,YAAY,IAAI,eAAe,CAAC,SAAS,CAAC,KAAK,YAAY,CAAA,EAA1G,wBAA0G;6CAC9G,CAAA,WAAW,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAA,EAAvC,wBAAuC;wCAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;wCAEhC,UAAU,CAAC;4CACV,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC;wCAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;wCAEV,qBAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAClC,mBAAmB,EACnB,mDAAmD,GAAG,sCAAe,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,EACtG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EACrC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,KAAK,EACL;gDACC,aAAa,eAAA;gDACb,IAAI,EAAE;oDACL,OAAO,EAAE,oBAAoB;oDAC7B,QAAQ,EAAE,gBAAgB;iDAC1B;6CACD,CACD,EAAA;;wCAjBD,SAiBC,CAAC;;;wCAGH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;6CAER,CAAA,eAAe,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,YAAY,IAAI,eAAe,CAAC,SAAS,CAAC,KAAK,8BAA8B,CAAA,EAA5H,wBAA4H;6CAChI,CAAA,WAAW,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAA,EAAvC,wBAAuC;wCAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;wCAEhC,UAAU,CAAC;4CACV,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC;wCAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;wCAEV,qBAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAClC,mBAAmB,EACnB,mDAAmD,GAAG,sCAAe,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,EACtG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EACrC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,KAAK,EACL;gDACC,aAAa,eAAA;gDACb,IAAI,EAAE;oDACL,OAAO,EAAE,oBAAoB;oDAC7B,QAAQ,EAAE,uBAAuB;iDACjC;6CACD,CACD,EAAA;;wCAjBD,SAiBC,CAAC;;;wCAGH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;6CAER,CAAA,eAAe,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,aAAa,IAAI,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA,EAAjG,yBAAiG;6CACrG,CAAA,WAAW,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAA,EAAvC,yBAAuC;wCAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;wCAEhC,UAAU,CAAC;4CACV,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC;wCAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;wCAEV,qBAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAClC,mBAAmB,EACnB,iCAAiC,GAAG,sCAAe,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,EACpF,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EACrC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,KAAK,EACL;gDACC,aAAa,eAAA;gDACb,IAAI,EAAE;oDACL,OAAO,EAAE,oBAAoB;oDAC7B,QAAQ,EAAE,SAAS;iDACnB;6CACD,CACD,EAAA;;wCAjBD,SAiBC,CAAC;;;;;6BAGJ,CAAC,CAAC;wBAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,UAAM,KAAK;;;;;;wCACpC,KAA4C,IAAA,2CAA0B,EAAC,KAAK,CAAC,EAApE,eAAe,WAAA,EAAE,aAAa,mBAAA,CAAuC;wCACpF,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,2BAA2B,EAAE,EAAE,aAAa,eAAA,EAAE,CAAC,CAAC;wCAE3E,WAAW,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;6CAE9D,CAAA,WAAW,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAA,EAAvC,wBAAuC;wCAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;wCAEhC,UAAU,CAAC;4CACV,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC;wCAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;wCAEJ,YAAY,GAAG;4CACpB,EAAE,EAAE,aAAa;4CACjB,IAAI,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI;4CAC3B,OAAO,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,OAAO;4CACjC,KAAK,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK;4CAC7B,IAAI,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI;4CAC3B,QAAQ,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,QAAQ;yCACnC,CAAC;wCAEF,qBAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAClC,mBAAmB,EACnB,iCAAiC,GAAG,sCAAe,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,EACpF,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EACrC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,KAAK,EACL;gDACC,aAAa,eAAA;gDACb,IAAI,EAAE;oDACL,OAAO,EAAE,mBAAmB;iDAC5B;6CACD,CACD,EAAA;;wCAhBD,SAgBC,CAAC;;;;;6BAEH,CAAC,CAAC;wBAEH,6BAA6B;wBAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE;;;;wCACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;wCACxB,IAAI,IAAI,CAAC,WAAW,EAAE;4CACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;yCACzB;wCACD,qBAAM,IAAI,CAAC,YAAY,EAAE,EAAA;;wCAAzB,SAAyB,CAAC;;;;6BAC1B,CAAC,CAAC;wBAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE;;;;wCACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;wCACxB,IAAI,IAAI,CAAC,WAAW,EAAE;4CACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;yCACzB;wCACD,qBAAM,IAAI,CAAC,YAAY,EAAE,EAAA;;wCAAzB,SAAyB,CAAC;;;;6BAC1B,CAAC,CAAC;wBAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE;;;;wCACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;wCACxB,IAAI,IAAI,CAAC,WAAW,EAAE;4CACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;yCACzB;wCACD,qBAAM,IAAI,CAAC,YAAY,EAAE,EAAA;;wCAAzB,SAAyB,CAAC;;;;6BAC1B,CAAC,CAAC;wBAEH,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;4BAC5B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;yBACzC;wBAED,IAAI,IAAI,CAAC,iBAAiB,EAAE;4BAC3B,IAAI,IAAI,CAAC,iBAAiB,EAAE;gCAC3B,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gCAC3E,IAAI,CAAC,cAAc,GAAG,8BAAa,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;gCAC/H,IAAI,CAAC,oBAAoB,GAAG,2CAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;gCAEpG,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,EAAE;oCACrC,IAAI,CAAC,YAAY,GAAG,0BAAW,CAAC,MAAM,EAAE,CAAC;iCACzC;6BACD;iCACI;gCACJ,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gCAC3E,IAAI,CAAC,iBAAiB,GAAG,oCAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gCACvD,IAAI,CAAC,cAAc,GAAG,8BAAa,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;gCACjJ,IAAI,CAAC,wBAAwB,GAAG,mDAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gCAC5G,IAAI,CAAC,oBAAoB,GAAG,0CAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,sCAAe,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;gCACzI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gCAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;6BACd;yBACD;6BACI;4BACJ,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;4BAC5E,IAAI,CAAC,iBAAiB,GAAG,oCAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;4BACvD,IAAI,CAAC,cAAc,GAAG,8BAAa,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;4BACjJ,IAAI,CAAC,oBAAoB,GAAG,0CAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,sCAAe,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;4BACzI,IAAI,CAAC,YAAY,GAAG,0BAAW,CAAC,MAAM,EAAE,CAAC;4BACzC,IAAI,CAAC,mBAAmB,EAAE,CAAC;4BAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;yBACd;;;;;KACD;IAEO,iDAAmB,GAA3B;QACC,oBAAoB;QACpB,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAW,EAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAE3B,WAAW;QACX,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAExG,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;SAC3B;QAED,wCAAwC;QACxC,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;SAC7B;QAED,WAAW;QACX,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,GAAG,EAAE,IAAI;YACrC,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,WAAW,CAAC,CAAC;YAC3D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,+BAA+B,CAAC,CAAC;YAC/E,GAAG,CAAC,SAAS,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC;YAC3D,IAAI,EAAE,CAAC;QACR,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SAC1B;QAED,0BAA0B;QAC1B,IAAA,sBAAe,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,sCAAe,CAAC,eAAe,EAAE,CAAC,CAAC;QACpE,IAAA,0BAAiB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,sCAAe,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,eAAe,EAAE;YAC7F,IAAA,sBAAe,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,sCAAe,CAAC,eAAe,EAAE,CAAC,CAAC;SACpE;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;SACpC;IACF,CAAC;IAEa,0CAAY,GAA1B;;;;;;;wBACC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;4BACxB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,gCAAgC,CAAC,CAAC;yBAC1D;6BAGA,CAAA,CAAC,IAAI,CAAC,uBAAuB,CAAC,yBAAyB,EAAE,CAAC,MAAM;+BAC7D,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,CAAC,CAAA,EADrH,wBACqH;6BAEjH,sCAAe,CAAC,kBAAkB,EAAE,EAApC,wBAAoC;;;;wBAEtC,qBAAM,sCAAe,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAA;;wBAAvD,SAAuD,CAAC;wBACxD,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,kCAAkC,CAAC,CAAC;wBAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;;wBAGhB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;wBAChB,CAAC;;;wBAGF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;;wBAIjB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;4BACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;4BAE1B,UAAU,CAAC;gCACV,KAAI,CAAC,aAAa,GAAG,KAAK,CAAC;4BAC5B,CAAC,EAAE,IAAI,CAAC,CAAC;4BAET,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,uBAAuB,EAC9C,IAAI,CAAC,uBAAuB,CAAC,yBAAyB,EAAE,CAAC,MAAM,EAC/D,IAAI,CAAC,eAAe,CAAC,MAAM,CAC3B,CAAC;yBACF;wBAED,YAAY,CAAC;;;4CACZ,qBAAM,IAAI,CAAC,YAAY,EAAE,EAAA;;wCAAzB,SAAyB,CAAC;;;;6BAC1B,CAAC,CAAC;;;;;;KAEJ;IAED,iDAAmB,GAAnB;QACC,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAC/B,CAAC;IAED,iDAAmB,GAAnB;QACC,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAC/B,CAAC;IAEM,uCAAS,GAAhB;QACC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,UAAC,EAAa;YAC7C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACZ,CAAC;IAEM,2CAAa,GAApB;QACC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,UAAC,EAAa;YAC7C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACZ,CAAC;IAEM,2CAAa,GAApB;QACC,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAEM,4CAAc,GAArB;QACC,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAEM,8CAAgB,GAAvB;QACC,OAAO,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAEM,oDAAsB,GAA7B;QACC,OAAO,IAAI,CAAC,oBAAoB,CAAC;IAClC,CAAC;IAEM,+CAAiB,GAAxB;QACC,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAEM,2CAAa,GAApB;QACC,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAEM,iDAAmB,GAA1B;QACC,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAC/B,CAAC;IAEO,0CAAY,GAApB;QAAA,iBAoFC;QAnFA,IAAI,CAAC,WAAW,GAAG,IAAA,mBAAY,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,KAAK,CAAC;QAExC,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC;YACtC,MAAM,EAAE,IAAI,CAAC,WAAW;YACxB,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAC,IAAI,EAAE,EAAE;gBAClD,IAAI,KAAI,CAAC,WAAW,EAAE;oBACrB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;iBACpC;qBACI;oBACJ,IAAI,KAAI,CAAC,MAAM,KAAK,OAAO,EAAE;wBAC5B,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;qBACvC;oBAED,qEAAqE;oBACrE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;wBAC1D,IAAI,UAAU,SAAK,CAAC;wBACpB,IAAI,OAAO,GAAG,sCAAe,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC;wBAClF,IAAI;4BACH,UAAU,GAAG,IAAI,SAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;yBAC5C;wBACD,WAAM;4BACL,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;4BAC9B,OAAO;yBACP;wBAED,IAAI,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;wBACnE,IAAI,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;wBAE7D,IAAI,WAAW,KAAK,sCAAe,CAAC,eAAe,EAAE,CAAC,cAAc,CAAC,EAAE;4BACtE,IAAI,WAAW,EAAE;gCAChB,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC;6BACtC;4BAED,EAAE,CAAC,IAAI,CAAC,CAAC;yBACT;6BACI;4BACJ,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;yBAC/B;wBAED,OAAO;qBACP;oBAED,IAAI,QAAQ,GAAY,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAE/E,IAAI,CAAC,IAAA,wBAAe,EAAC,IAAI,CAAC,MAAM,EAAE,sCAAe,CAAC,eAAe,EAAE,CAAC,EAAE;wBACrE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;qBAC/B;yBACI;wBACJ,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;wBACxB,IAAI,CAAC,KAAK,EAAE;4BACX,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;yBAC/B;6BACI;4BACJ,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,sCAAe,CAAC,eAAe,EAAE,CAAC,YAAY,CAAC,EAAE,UAAO,GAAG,EAAE,OAAO;;;;;iDACjF,GAAG,EAAH,wBAAG;4CACN,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;;;4CAG/B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;;;;4CAE7B,qBAAM,uBAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAA;;4CAA/C,IAAI,GAAG,SAAwC;4CACnD,IAAI,IAAI,EAAE;gDACT,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;gDACjC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;gDACnD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;gDAC5B,EAAE,CAAC,IAAI,CAAC,CAAC;6CACT;iDACI;gDACJ,EAAE,CAAC,KAAK,CAAC,CAAC;6CACV;;;;4CAGD,EAAE,CAAC,KAAK,CAAC,CAAC;;;;;iCAGZ,CAAC,CAAC;yBACH;qBACD;iBACD;YACF,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,oCAAM,GAAd;QAAA,iBA4PC;QA3PA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE;YACvC,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,KAAI,CAAC,SAAS,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,UAAO,EAAE,EAAE,GAAG;;;;;;6BAC1C,CAAA,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA,EAA3C,wBAA2C;wBAE1C,aAAW,IAAA,0BAAiB,GAAE,CAAC;wBACnC,EAAE,CAAC,WAAW,CAAC,GAAG,UAAQ,CAAC;wBACvB,WAAW,GAAG,IAAI,CAAC;wBAEvB,IAAI,GAAG,CAAC,GAAG,EAAE;4BACR,OAAO,GAAG,sCAAe,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC;4BAClF,IAAI;gCACC,UAAU,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gCAC3C,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;6BACzD;4BACD,WAAM;gCACL,WAAW,GAAG,IAAI,CAAC;6BACnB;yBACD;wBAED,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,aAAa,CAAC,EAAE;4BACvC,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;yBACjC;wBAED,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE;4BACtD,EAAE,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC;yBAChC;wBAEG,iBAAiB,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC;wBACvD,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;wBAE9F,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;wBAEzC,aAAW,IAAI,CAAC;wBAChB,aAAW,IAAI,CAAC;wBAEpB,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;wBAE5D,UAAQ,GAAG,WAAW,CAAC;4BACtB,IAAI,CAAC,UAAQ,EAAE;gCACd,KAAI,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;gCAChE,EAAE,CAAC,KAAK,EAAE,CAAC;6BACX;iCACI;gCACJ,UAAQ,GAAG,IAAI,CAAC;gCAChB,KAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;6BAC5D;wBACF,CAAC,EAAE,KAAK,CAAC,CAAC;wBAET,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,UAAC,OAA0B;4BAC3C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;gCAChC,IAAI,OAAO,KAAK,MAAM,EAAE;oCACvB,KAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;iCAC5D;qCACI,IAAI,OAAO,KAAK,MAAM,EAAE;oCAC5B,UAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;iCACtB;qCACI;oCACJ,KAAI,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;iCAC5E;gCAED,OAAO;6BACP;4BAED,IAAI,MAAc,CAAC;4BAEnB,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gCAC7B,MAAM,GAAG,OAAO,CAAC;6BACjB;iCACI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gCAChC,IAAM,MAAM,GAAG,OAA+C,CAAC;gCAC/D,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;6BAC/B;iCACI,IAAI,OAAO,YAAY,WAAW,EAAE;gCACxC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;6BAC9B;iCACI,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;gCACrC,IAAM,IAAI,GAAG,OAAiC,CAAC;gCAC/C,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;6BACpE;iCACI;gCACJ,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAc,CAAC,CAAC;6BACrC;4BAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gCACxB,IAAI,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gCAExC,IAAI,SAAS,KAAK,MAAM,EAAE;oCACzB,KAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oCAC5D,OAAO;iCACP;qCACI,IAAI,SAAS,KAAK,MAAM,EAAE;oCAC9B,UAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;oCACtB,OAAO;iCACP;6BACD;4BAED,KAAI,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;wBAC5E,CAAC,CAAC,CAAC;wBAEJ,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE;4BACd,KAAI,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;4BAEhE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,sBAAsB,EAAE,UAAQ,CAAC,CAAC;4BAE1D,IAAI,UAAQ,EAAE;gCACb,aAAa,CAAC,UAAQ,CAAC,CAAC;6BACxB;wBACF,CAAC,CAAC,CAAC;wBAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,KAAK;4BACpB,KAAI,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;4BAEhE,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;4BAC3C,EAAE,CAAC,KAAK,EAAE,CAAC;wBACZ,CAAC,CAAC,CAAC;;;wBAGH,gBAAgB;wBAChB,EAAE,CAAC,WAAW,CAAC,GAAG,IAAA,0BAAiB,GAAE,CAAC;wBACtC,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;wBAC/B,EAAE,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;wBACzB,EAAE,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;wBAC3C,EAAE,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;wBAEjC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;wBAExC,qBAAM,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAA;;wBAAnE,SAAmE,CAAC;wBAEpE,UAAU,CAAC;;;4CACV,qBAAM,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,EAAA;;wCAArC,SAAqC,CAAC;;;;6BACtC,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;wBAExC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;4BAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;yBACpD;wBAED,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;wBACrB,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;wBACnB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE;4BACb,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;4BACrB,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;4BAC5B,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE;gCACnB,EAAE,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;gCAC9F,KAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;6BAC9C;wBACF,CAAC,CAAC,CAAC;wBAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,UAAO,OAA0B;;;;;wCACjD,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;wCACpB,UAAU,GAAG,EAAE,CAAC;wCAChB,UAAU,GAAG,KAAK,CAAC;;;;wCAItB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;4CAChC,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE;gDAC7C,UAAU,GAAG,OAAO,CAAC;6CACrB;iDACI;gDACJ,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,oBAAW,CAAC,CAAC;6CAC9C;yCACD;6CACI,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;4CAClC,aAAa,GAAG,OAAO,CAAC;4CACpB,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;4CAC3D,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC;4CAC/B,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;yCACrC;6CACI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;4CAChC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,OAA+C,CAAC,CAAC;4CAC3E,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;4CAC3D,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC;4CAC/B,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;yCACrC;6CACI,IAAI,OAAO,YAAY,WAAW,EAAE;4CACxC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;4CACjC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;4CAC3D,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC;4CAC/B,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;yCACrC;6CACI,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;4CAC/B,IAAI,GAAG,OAAiC,CAAC;4CAC/C,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;4CACvE,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;4CAC3D,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC;4CAC/B,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;yCACrC;6CACI;4CACJ,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,OAAO,OAAO,CAAC,CAAC;yCACzE;;;;wCAGD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,GAAC,CAAC,CAAC;wCAC3C,qBAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAClC,mBAAmB,EACnB,8BAA8B,GAAG,sCAAe,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,EACjF,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAC,CAAC,CAAC,CAC/E,EAAA;;wCAJD,SAIC,CAAC;wCACF,sBAAO;;wCAGR,IAAI,UAAU,EAAE;4CACf,EAAE,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;yCAC5B;wCAED,yCAAyC;wCACzC,qBAAM,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,UAAU,CAAC,EAAA;;wCAD/C,yCAAyC;wCACzC,SAA+C,CAAC;;;;6BAChD,CAAC;6BACD,EAAE,CAAC,KAAK,EAAE;4BACV,EAAE,CAAC,KAAK,EAAE,CAAC;wBACZ,CAAC,CAAC;6BACD,EAAE,CAAC,OAAO,EAAE;4BACZ,EAAE,CAAC,KAAK,EAAE,CAAA;wBACX,CAAC,CAAC;6BACD,EAAE,CAAC,OAAO,EAAE;;;4CACZ,qBAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAA;;wCAA5B,SAA4B,CAAC;;;;6BAC7B,CAAC,CAAC;;;;;aAEJ,CAAC,CAAC;QAEH,mBAAmB;QACnB,WAAW,CAAC;;;;;;;wBACI,KAAA,SAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAA;;;;wBAA7B,EAAE;6BACN,CAAA,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAA,EAA1F,wBAA0F;wBAC7F,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE;4BAClC,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;4BACrB,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;4BACnB,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;4BAC5B,wBAAS;yBACT;6BAEG,CAAA,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,CAAA,EAAvB,wBAAuB;wBAC1B,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;6BACb,CAAA,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA,EAAnB,wBAAmB;wBACtB,qBAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAA;;wBAA5B,SAA4B,CAAC;;4BAG7B,qBAAM,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,EAAA;;wBAArC,SAAqC,CAAC;;;;wBAIvC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;wBACnB,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;wBACtB,qBAAM,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,EAAA;;wBAArC,SAAqC,CAAC;;;;;;;;;;;;;;;;;;;aAIzC,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACrC,CAAC;IAEa,kDAAoB,GAAlC,UAAmC,EAAa,EAAE,UAAe;;;;;;;wBAChE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM,EAAE;4BAC5D,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,EAAE;gCACpC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;6BAChB;4BACD,sBAAO;yBACP;6BACI,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM,EAAE;4BACjE,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;4BACrB,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;4BAC5B,EAAE,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;4BAC9F,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;4BAC9C,sBAAO;yBACP;wBAED,+CAA+C;wBAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;4BAClC,OAAO,CAAC,GAAG,CAAC,mDAAmD,EAAE,UAAU,CAAC,CAAC;4BAC7E,sBAAO;yBACP;;;;wBAGmB,eAAA,SAAA,UAAU,CAAA;;;;wBAArB,OAAO;wBACf,qBAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAA;;wBAA3C,SAA2C,CAAC;;;;;;;;;;;;;;;;;;;;KAE7C;IAEO,iDAAmB,GAA3B,UAA4B,MAAc;QACzC,IAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE;YAC3C,IAAI;gBACH,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;aACxE;YACD,WAAM;gBACL,6CAA6C;aAC7C;SACD;QAED,IAAI;YACH,OAAO,EAAE,IAAI,EAAE,IAAA,iBAAM,EAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SAClD;QACD,OAAO,SAAS,EAAE;YACjB,IAAI;gBACH,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;aACxE;YACD,WAAM;gBACL,MAAM,SAAS,CAAC;aAChB;SACD;IACF,CAAC;IAEO,+CAAiB,GAAzB,UAA0B,UAAkB;QAC3C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,MAAM,EAAE;YACnD,OAAO,UAAU,CAAC;SAClB;QAED,IAAI;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,oBAAW,CAAC,CAAC;SAC3C;QACD,OAAO,GAAG,EAAE;YACX,MAAM,GAAG,CAAC;SACV;IACF,CAAC;IAEO,kDAAoB,GAA5B,UAA6B,IAAY;QACxC,IAAI,CAAC,IAAI,EAAE;YACV,OAAO,KAAK,CAAC;SACb;QAED,IAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE;YACb,OAAO,KAAK,CAAC;SACb;QAED,IAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;IAC1F,CAAC;IAEa,oDAAsB,GAApC,UAAqC,EAAa;;;;;;;;wBACjD,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,EAAE;4BACrC,sBAAO;yBACP;wBAED,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;;;;wBAG3B,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,UAAU,EAAE;4BAClC,EAAE,CAAC,IAAI,EAAE,CAAC;yBACV;;;;wBAGD,IAAI,MAAA,IAAI,CAAC,cAAc,0CAAE,cAAc,EAAE,EAAE;4BAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,YAAY,EAAE,qBAAqB,EAAE,KAAG,CAAC,CAAC;yBAClE;wBACD,qBAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAA;;wBAA5B,SAA4B,CAAC;wBAC7B,sBAAO;;wBAGR,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,UAAO,KAAK;;;;;6CACvB,KAAK,EAAL,wBAAK;wCACR,IAAI,MAAA,IAAI,CAAC,cAAc,0CAAE,cAAc,EAAE,EAAE;4CAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;yCACvD;wCACD,qBAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAA;;wCAA5B,SAA4B,CAAC;;;;;6BAE9B,CAAC,CAAC;;;;;KACH;IAEO,kDAAoB,GAA5B,UAA6B,EAAa;QACzC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,EAAE;YACrC,OAAO,KAAK,CAAC;SACb;QAED,IAAM,cAAc,GAAG,OAAO,EAAE,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,cAAc,IAAI,IAAI,CAAC,iCAAiC,CAAC;IACjE,CAAC;IAEa,iDAAmB,GAAjC,UAAkC,EAAa,EAAE,GAAU;;;;;;;wBAItD,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBACtB,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBACrB,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBACnB,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBAElB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAxB,CAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAApD,CAAoD,CAAC,EAAvE,CAAuE,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE;4BAC1O,sBAAO;yBACP;6BAEG,CAAA,IAAI,KAAK,cAAc,CAAA,EAAvB,wBAAuB;wBACtB,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBACjB,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;6BAEb,CAAA,OAAO,KAAK,KAAK,CAAA,EAAjB,wBAAiB;wBACpB,qBAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAA;;wBAAtG,SAAsG,CAAC;;;wBAGvG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;;;;6BAG5F,CAAA,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,KAAK,SAAS,CAAA,EAAzC,yBAAyC;wBAC7C,SAAS,GAAwB;4BACpC,SAAS,EAAE,SAAS;4BACpB,QAAQ,EAAE,KAAK;4BACf,IAAI,EAAE,KAAK;yBACX,CAAC;wBAEF,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,EAAE;4BACpC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;yBAC3C;wBAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC1B,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBAEnB,CAAC,GAAG,CAAC;;;6BAAE,CAAA,CAAC,GAAG,cAAc,CAAC,MAAM,CAAA;wBACpC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;wBAE3B,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;wBAGnB,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;wBAE3B,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;wBAC1B,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;wBAE/B,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;wBAC1B,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;wBAEtB,eAAe,GAAwB;4BAC1C,SAAS,EAAE,eAAe;4BAC1B,QAAQ,EAAE,KAAK;4BACf,IAAI,EAAE,KAAK;yBACX,CAAC;wBAEF,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,EAAE;4BACpC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;yBACjD;wBAED,IAAI,MAAM,KAAK,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE;4BAC5D,yBAAS;yBACT;6BAEG,CAAA,MAAM,KAAK,yBAAyB,IAAI,MAAM,KAAK,+BAA+B,IAAI,MAAM,KAAK,wBAAwB,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,gBAAgB,IAAI,MAAM,KAAK,0BAA0B,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,iBAAiB,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,4BAA4B,IAAI,MAAM,KAAK,kBAAkB,CAAA,EAA7c,wBAA6c;6BAE/c,CAAA,sCAAe,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC,KAAK,uBAAuB;+BACvE,sCAAe,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC,KAAK,uBAAuB,CAAA,EAD3E,wBAC2E;wBAE3E,sCAAe,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;4BAC7C,IAAI,EAAE,KAAK;4BACX,IAAI,EAAE;gCACL,GAAG,EAAE,IAAA,0BAAiB,GAAE;gCACxB,SAAS,EAAE,IAAI,IAAI,EAAE;gCACrB,IAAI,EAAE,gBAAgB;gCACtB,UAAU,EAAE,EAAE;gCACd,WAAW,EAAE,EAAE;gCACf,OAAO,EAAE,IAAA,sBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;gCACtG,MAAM,EAAE,MAAM;gCACd,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE;gCAC5B,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;gCACtB,SAAS,EAAE,SAAS;gCACpB,KAAK,EAAE,YAAY;6BACnB;yBACD,CAAC,CAAC;;4BAGH,qBAAM,qBAAI,CAAC,SAAS,CAAC;4BACpB,GAAG,EAAE,IAAA,0BAAiB,GAAE;4BACxB,IAAI,EAAE,gBAAgB;4BACtB,UAAU,EAAE,EAAE;4BACd,WAAW,EAAE,EAAE;4BACf,OAAO,EAAE,IAAA,sBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;4BACtG,MAAM,EAAE,MAAM;4BACd,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE;4BAC5B,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;4BACtB,SAAS,EAAE,SAAS;4BACpB,KAAK,EAAE,YAAY;4BACnB,MAAM,EAAE,WAAW;4BACnB,QAAQ,EAAE,uBAAuB;4BACjC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;yBACnD,CAAC,EAAA;;wBAdF,SAcE,CAAC;;;6BAID,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAApC,yBAAoC;;;;wBAEtC,qBAAM,CAAA,KAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAA,CAAC,IAAI,0BAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,8BAAa,CAAC,SAAS,EAAE,EAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,MAAM,UAAK,IAAI,YAAC;;wBAA/L,SAA+L,CAAC;;;;wBAGhM,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;;wBAGxE,IAAI,MAAM,KAAK,uBAAuB,IAAI,MAAM,KAAK,4BAA4B,EAAE;4BAClF,sCAAe,CAAC,eAAe,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;yBAChE;;;wBAGD,OAAO,CAAC,GAAG,CAAC,mCAAmC,GAAG,MAAM,CAAC,CAAC;;;wBAlFjB,CAAC,EAAE,CAAA;;;wBAsF9C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,WAAW,CAAC,EAAd,CAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;;wBAInG,QAAQ,4BAAO,GAAG,SAAC,CAAC;wBAGpB,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;wBAEzB,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;wBACxB,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;wBACzB,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;6BAE3B,CAAA,OAAO,KAAK,QAAQ,CAAA,EAApB,yBAAoB;wBACnB,UAAU,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;wBAElC,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE;4BACxB,sBAAO;yBACP;6BAEG,CAAA,UAAU,KAAK,yBAAyB,IAAI,UAAU,KAAK,+BAA+B,IAAI,UAAU,KAAK,wBAAwB,IAAI,UAAU,KAAK,aAAa,IAAI,UAAU,KAAK,kBAAkB,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,gBAAgB,IAAI,UAAU,KAAK,0BAA0B,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,iBAAiB,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,4BAA4B,CAAA,EAAhe,yBAAge;6BAEle,CAAA,sCAAe,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC,KAAK,uBAAuB;+BACvE,sCAAe,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC,KAAK,uBAAuB,CAAA,EAD3E,yBAC2E;wBAE3E,sCAAe,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;4BAC7C,IAAI,EAAE,KAAK;4BACX,IAAI,EAAE;gCACL,GAAG,EAAE,IAAA,0BAAiB,GAAE;gCACxB,SAAS,EAAE,IAAI,IAAI,EAAE;gCACrB,IAAI,EAAE,gBAAgB;gCACtB,UAAU,EAAE,EAAE;gCACd,WAAW,EAAE,EAAE;gCACf,OAAO,EAAE,IAAA,sBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;gCAC9G,MAAM,EAAE,UAAU;gCAClB,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE;gCAC5B,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;gCACtB,SAAS,EAAE,SAAS;gCACpB,KAAK,EAAE,YAAY;6BACnB;yBACD,CAAC,CAAC;;6BAGH,qBAAM,qBAAI,CAAC,SAAS,CAAC;4BACpB,GAAG,EAAE,IAAA,0BAAiB,GAAE;4BACxB,IAAI,EAAE,gBAAgB;4BACtB,UAAU,EAAE,EAAE;4BACd,WAAW,EAAE,EAAE;4BACf,OAAO,EAAE,IAAA,sBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;4BAC9G,MAAM,EAAE,UAAU;4BAClB,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE;4BAC5B,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;4BACtB,SAAS,EAAE,SAAS;4BACpB,KAAK,EAAE,YAAY;4BACnB,MAAM,EAAE,WAAW;4BACnB,QAAQ,EAAE,uBAAuB;4BACjC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;yBACnD,CAAC,EAAA;;wBAdF,SAcE,CAAC;;;wBAKD,GAAG,GAAwB;4BAC9B,SAAS,EAAE,KAAK;4BAChB,QAAQ,EAAE,KAAK;4BACf,IAAI,EAAE,KAAK;yBACX,CAAC;wBAEF,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,EAAE;4BACpC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;yBACrC;wBAEG,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;6BAEnD,CAAA,MAAM;4BACT,CAAC,MAAM,CAAC,UAAU;4BAClB,IAAI,CAAC,iBAAiB;4BACtB,IAAI,CAAC,wBAAwB;4BAC7B,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE;4BAC1C,UAAU,KAAK,MAAM;4BACrB,UAAU,KAAK,gBAAgB;4BAC/B,UAAU,KAAK,gBAAgB;4BAC/B,UAAU,KAAK,SAAS;4BACxB,UAAU,KAAK,qBAAqB;4BACpC,UAAU,KAAK,iBAAiB;4BAChC,UAAU,KAAK,gBAAgB;4BAC/B,UAAU,KAAK,gBAAgB;4BAC/B,UAAU,KAAK,gBAAgB;4BAC/B,UAAU,KAAK,0BAA0B;4BACzC,UAAU,KAAK,cAAc;4BAC7B,UAAU,KAAK,eAAe;4BAC9B,UAAU,KAAK,oBAAoB;4BACnC,UAAU,KAAK,eAAe;4BAC9B,UAAU,KAAK,UAAU;4BACzB,UAAU,KAAK,aAAa;4BAC5B,UAAU,KAAK,cAAc,CAAA,EArB1B,yBAqB0B;wBAE7B,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE;4BACzE,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC;4BACtB,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC;4BAChB,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC;yBACtB,CAAC,CAAC;;;oBAGH,yCAAyC;oBACzC,qBAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAA;;wBAD7D,yCAAyC;wBACzC,SAA6D,CAAC;;;;;;KAIjE;IAED;;OAEG;IACW,+CAAiB,GAA/B,UAAgC,EAAa,EAAE,SAAiB,EAAE,MAAc,EAAE,MAAa;;;;;;;wBAC1F,SAAS,GAAwB;4BACpC,SAAS,EAAE,SAAS;4BACpB,QAAQ,EAAE,KAAK;4BACf,IAAI,EAAE,IAAI;yBACV,CAAC;;;;wBAIY,qBAAM,CAAA,KAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAA,CAAC,IAAI,0BACrD,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,8BAAa,CAAC,SAAS,EAAE;oCAC/D,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC;oCACtB,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC;oCAChB,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC;iCACtB,CAAC;gCACF,MAAM,UACH,MAAM,YACT;;wBARG,MAAM,GAAG,SAQZ;wBAED,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC;;;;wBAGxB,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;wBAC1B,SAAS,CAAC,IAAI,GAAG,KAAG,IAAI,eAAe,CAAC;;;wBAGzC,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,EAAE;4BACpC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;yBAC3C;;;;;KACD;IAID;;OAEG;IACU,2CAAa,GAA1B,UAA2B,EAAa;;;;;wBACvC,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE;4BACtE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;yBAC/E;wBACD,qBAAM,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,CAAC,EAAA;;wBAAlD,SAAkD,CAAC;wBACnD,EAAE,CAAC,kBAAkB,EAAE,CAAC;wBACxB,EAAE,GAAG,IAAI,CAAC;;;;;KACV;IAEM,oCAAM,GAAb;QACC,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAEM,6CAAe,GAAtB;QACC,OAAO,sCAAe,CAAC,eAAe,EAAE,CAAC;IAC1C,CAAC;IAEM,wDAA0B,GAAjC;QACC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACtC,CAAC;IAEM,oDAAsB,GAA7B;QACC,OAAO,IAAI,CAAC,oBAAoB,CAAC;IAClC,CAAC;IACF,0BAAC;AAAD,CA7sCA,AA6sCC,IAAA;AA7sCY,kDAAmB","file":"server-app.js","sourcesContent":["import * as bodyParser from 'body-parser';\nimport * as express from 'express';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport { createServer, Server } from 'http';\nimport * as jwt from 'jsonwebtoken';\nimport * as moment from 'moment-timezone';\nimport { unpack } from 'msgpackr';\nimport { URL } from 'url';\nimport * as WebSocket from 'ws';\n\nimport { Logs } from './collections/log.collection';\nimport { Users } from './collections/user.collection';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { ServerResponseModel } from './models/server-message.model';\nimport { dateReviver, getBinarySize, isAllowedOrigin, objectIdHexString } from './util/common';\nimport { ensureErrorWithCorrelation } from './util/error-tracking';\n\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { setupHomeRoutes } from './http/home';\n\nimport { WebSocketManager } from './managers/websocket.manager';\nimport { WorkerDispatcherManager } from './managers/worker-dispatcher.manager';\nimport { WorkerServerManager } from './managers/worker-server.manager';\nimport { ResolveIOServer } from './resolveio-server-app';\n\nexport class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\tprivate _workerDispatcherManager: WorkerDispatcherManager;\n\tprivate _workerServerManager: WorkerServerManager;\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate _safeShutdown = false;\n\n\tprivate readonly _clientHeartbeatIntervalMs = 20000;\n\tprivate readonly _clientHeartbeatInitialDelayMs = 5000;\n\tprivate readonly _clientHeartbeatBackpressureBytes = 5 * 1024 * 1024;\n\n\tconstructor() {}\n\n\tstatic async create() {\n\t\tconst resolveioMainServer = new ResolveIOMainServer();\n\t\tawait resolveioMainServer.initialize();\n\t\treturn resolveioMainServer;\n\t}\n\n\tprivate async initialize() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = await MonitorManager.create();\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._methodManager && this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tlet initServerFlag = false;\n\n\t\tsetTimeout(() => {\n\t\t\tinitServerFlag = true;\n\t\t}, 5000);\n\n\t\tprocess.removeAllListeners('unhandledRejection');\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\tconst { error: normalizedError, correlationId } = ensureErrorWithCorrelation(error);\n\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.error(new Date(), 'ERROR DETECTED w/ Debug Flag Active: unhandledRejection', [normalizedError, rej, { correlationId }]);\n\t\t\t}\n\n\t\t\t// Condition to filter out the MongoError with specific codes\n\t\t\tif (normalizedError && normalizedError['name'] === 'MongoError' && (normalizedError['code'] === 48 || normalizedError['code'] === 26 || normalizedError['code'] === 11000 || normalizedError['code'] === 251)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tif (normalizedError && normalizedError['name'] === 'MongoServerError' && (!initServerFlag || normalizedError['code'] === 26 || normalizedError['code'] === 11000 || normalizedError['code'] === 86 || normalizedError['code'] === 251)) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tconst errorDetails = {\n\t\t\t\tid: correlationId,\n\t\t\t\tname: normalizedError?.name,\n\t\t\t\tmessage: normalizedError?.message,\n\t\t\t\tstack: normalizedError?.stack,\n\t\t\t\tcode: normalizedError?.code,\n\t\t\t\tcodeName: normalizedError?.codeName\n\t\t\t};\n\n\t\t\tconsole.error(new Date(), 'Unhandled Rejection at Promise', [errorDetails]);\n\t\t\t\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\t// If this is a MongoNetworkTimeoutError, handle it specifically\n\t\t\tif (normalizedError && (normalizedError['name'] === 'MongoNetworkTimeoutError' || normalizedError instanceof MongoNetworkTimeoutError)) {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t// Sending email notification (using your existing method)\n\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t'dev@resolveio.com',\n\t\t\t\t\t\t'SERVER - MongoNetworkTimeoutError - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'],\n\t\t\t\t\t\tJSON.stringify(errorDetails, null, 2),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcorrelationId,\n\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\tcontext: 'unhandledRejection',\n\t\t\t\t\t\t\t\tscenario: 'MongoNetworkTimeoutError'\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\t// Exiting the process\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (normalizedError && normalizedError['name'] === 'MongoError' && normalizedError['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t'dev@resolveio.com',\n\t\t\t\t\t\t'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'],\n\t\t\t\t\t\tJSON.stringify(errorDetails, null, 2),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcorrelationId,\n\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\tcontext: 'unhandledRejection',\n\t\t\t\t\t\t\t\tscenario: 'MongoNotMaster'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (normalizedError && normalizedError['name'] === 'MongoError' && normalizedError['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t'dev@resolveio.com',\n\t\t\t\t\t\t'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'],\n\t\t\t\t\t\tJSON.stringify(errorDetails, null, 2),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcorrelationId,\n\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\tcontext: 'unhandledRejection',\n\t\t\t\t\t\t\t\tscenario: 'MongoNotMasterSlaveOk'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (normalizedError && normalizedError['name'] !== 'StatusError' && normalizedError['message'] !== '') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t'dev@resolveio.com',\n\t\t\t\t\t\t'SERVER - Unhandled Rejection - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'],\n\t\t\t\t\t\tJSON.stringify(errorDetails, null, 2),\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcorrelationId,\n\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\tcontext: 'unhandledRejection',\n\t\t\t\t\t\t\t\tscenario: 'General'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconst { error: normalizedError, correlationId } = ensureErrorWithCorrelation(error);\n\t\t\tconsole.error(normalizedError, 'Uncaught Exception thrown', { correlationId });\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tconst errorDetails = {\n\t\t\t\t\tid: correlationId,\n\t\t\t\t\tname: normalizedError?.name,\n\t\t\t\t\tmessage: normalizedError?.message,\n\t\t\t\t\tstack: normalizedError?.stack,\n\t\t\t\t\tcode: normalizedError?.code,\n\t\t\t\t\tcodeName: normalizedError?.codeName\n\t\t\t\t};\n\n\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t'dev@resolveio.com',\n\t\t\t\t\t'SERVER - Unhandled Exception - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'],\n\t\t\t\t\tJSON.stringify(errorDetails, null, 2),\n\t\t\t\t\tnull,\n\t\t\t\t\tnull,\n\t\t\t\t\tnull,\n\t\t\t\t\tnull,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\t{\n\t\t\t\t\t\tcorrelationId,\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\tcontext: 'uncaughtException'\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\t//PM2 wants to reboot/restart\n\t\tprocess.on('SIGINT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tconsole.log('Running as a Worker instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._methodManager = MethodManager.create(null, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerServerManager = WorkerServerManager.create(this._methodManager, this.getServerConfig());\n\n\t\t\t\tif (process.env.WORKER_INDEX === '0') {\n\t\t\t\t\tthis._cronManager = CronManager.create();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('Running as a Server instance', process.env.NODE_APP_INSTANCE);\n\t\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._workerDispatcherManager = WorkerDispatcherManager.create(this._websocketManager, this._methodManager);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.startServerInstance();\n\t\t\t\tthis.listen();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.log('Running with Workers Disabled', process.env.NODE_APP_INSTANCE);\n\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\tthis._cronManager = CronManager.create();\n\t\t\tthis.startServerInstance();\n\t\t\tthis.listen();\n\t\t}\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.NODE_APP_INSTANCE ? parseInt('808' + process.env.NODE_APP_INSTANCE) : 8080;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app);\n\n\t\tif (ResolveIOServer.getServerConfig()['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tprivate async safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length\n\t\t\t&& !this._offlineUpdates.length && (!this._workerDispatcherManager || this._workerDispatcherManager.isSafeShutdown())\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait ResolveIOServer.getMongoConnection().close(false);\n\t\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tcatch { \n\t\t\t\t\tprocess.exit(1); \n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (!this._safeShutdown) {\n\t\t\t\tthis._safeShutdown = true;\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._safeShutdown = false;\n\t\t\t\t}, 1000);\n\n\t\t\t\tconsole.log(new Date(), 'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length,\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(async () => {\n\t\t\t\tawait this.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000;\n\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tserver: this._serverHTTP,\n\t\t\tverifyClient: this.publicProgram ? null : (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If it's a worker, we might skip token checks or do a simple check:\n\t\t\t\t\tif (info.req.url && info.req.url.includes('workerToken=')) {\n\t\t\t\t\t\tlet requestUrl: URL;\n\t\t\t\t\t\tlet rootUrl = ResolveIOServer.getServerConfig()['ROOT_URL'] || 'http://localhost';\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\trequestUrl = new URL(info.req.url, rootUrl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\tcb(false, 400, 'Bad Request');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet workerToken = requestUrl.searchParams.get('workerToken') || '';\n\t\t\t\t\t\tlet workerIndex = requestUrl.searchParams.get('workerIndex');\n\n\t\t\t\t\t\tif (workerToken === ResolveIOServer.getServerConfig()['WORKER_TOKEN']) {\n\t\t\t\t\t\t\tif (workerIndex) {\n\t\t\t\t\t\t\t\tinfo.req['workerIndex'] = workerIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (!isAllowedOrigin(info.origin, ResolveIOServer.getServerConfig())) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, ResolveIOServer.getServerConfig()['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Listen for connections from clients or workers.\n\t */\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running HTTP/WS server on port %s', this._portHTTP);\n\t\t});\n\n\t\t\tthis._serverWSS.on('connection', async (ws, req) => {\n\t\t\t\tif (req.url && req.url.includes('workerToken=')) {\n\t\t\t\t\t// It's a WORKER\n\t\t\t\t\tlet workerId = objectIdHexString();\n\t\t\t\t\tws['id_worker'] = workerId;\n\t\t\t\t\tlet workerIndex = null;\n\n\t\t\t\t\tif (req.url) {\n\t\t\t\t\t\tlet rootUrl = ResolveIOServer.getServerConfig()['ROOT_URL'] || 'http://localhost';\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet requestUrl = new URL(req.url, rootUrl);\n\t\t\t\t\t\t\tworkerIndex = requestUrl.searchParams.get('workerIndex');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\tworkerIndex = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!workerIndex && req['workerIndex']) {\n\t\t\t\t\t\tworkerIndex = req['workerIndex'];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (workerIndex !== null && workerIndex !== undefined) {\n\t\t\t\t\t\tws['workerIndex'] = workerIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet workerIndexForLog = ws['workerIndex'] || 'UNKNOWN';\n\t\t\t\t\tconsole.log(new Date(), 'Worker Connected', workerIndexForLog, process.env.NODE_APP_INSTANCE);\n\n\t\t\t\t\tthis._workerDispatcherManager.addWorker(ws);\n\n\t\t\t\tlet interval = null;\n\t\t\t\tlet lastComm = null;\n\n\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\n\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\t\t\t\t\t\tws.close();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'ping');\n\t\t\t\t\t}\n\t\t\t\t}, 30000);\n\n\t\t\t\t\tws.on('message', (message: WebSocket.RawData) => {\n\t\t\t\t\t\tif (typeof message === 'string') {\n\t\t\t\t\t\t\tif (message === 'ping') {\n\t\t\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'pong');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (message === 'pong') {\n\t\t\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tthis._workerDispatcherManager.handleWorkerMessage(ws['id_worker'], message);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet buffer: Buffer;\n\n\t\t\t\t\t\tif (Buffer.isBuffer(message)) {\n\t\t\t\t\t\t\tbuffer = message;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (Array.isArray(message)) {\n\t\t\t\t\t\t\tconst chunks = message as unknown as ReadonlyArray<Uint8Array>;\n\t\t\t\t\t\t\tbuffer = Buffer.concat(chunks);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (message instanceof ArrayBuffer) {\n\t\t\t\t\t\t\tbuffer = Buffer.from(message);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (ArrayBuffer.isView(message)) {\n\t\t\t\t\t\t\tconst view = message as NodeJS.ArrayBufferView;\n\t\t\t\t\t\t\tbuffer = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tbuffer = Buffer.from(message as any);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (buffer.length === 4) {\n\t\t\t\t\t\t\tlet heartbeat = buffer.toString('utf8');\n\n\t\t\t\t\t\t\tif (heartbeat === 'ping') {\n\t\t\t\t\t\t\t\tthis._workerDispatcherManager.sendWorkerPayload(ws, 'pong');\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (heartbeat === 'pong') {\n\t\t\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._workerDispatcherManager.handleWorkerMessage(ws['id_worker'], buffer);\n\t\t\t\t\t});\n\n\t\t\t\tws.on('close', () => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.log(new Date(), 'Worker disconnected:', workerId);\n\t\t\t\t\t\n\t\t\t\t\tif (interval) {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('error', (error) => {\n\t\t\t\t\tthis._workerDispatcherManager.disconnectWorker(ws['id_worker']);\n\n\t\t\t\t\tconsole.error('Error on WS Worker', error);\n\t\t\t\t\tws.close();\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Normal client\n\t\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\t\tawait this._subscriptionManager.createLoggedInUser(ws['id_socket']);\n\t\t\t\t\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tawait this.triggerClientHeartbeat(ws);\n\t\t\t\t}, this._clientHeartbeatInitialDelayMs);\n\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Connection from user: ' + req['user']);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tws['isAlive'] = true;\n\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\tws.on('pong', () => {\n\t\t\t\t\tws['isAlive'] = true;\n\t\t\t\t\tws['pongTime'] = new Date();\n\t\t\t\t\tif (ws['pingTime']) {\n\t\t\t\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\t\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('message', async (message: WebSocket.RawData) => {\n\t\t\t\t\tthis._debugMsgRecv += 1;\n\t\t\t\t\tlet socketData = [];\n\t\t\t\t\tlet usedBinary = false;\n\t\t\t\t\tlet bufferPayload: Buffer;\n\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (typeof message === 'string') {\n\t\t\t\t\t\t\tif (message === 'ping' || message === 'pong') {\n\t\t\t\t\t\t\t\tsocketData = message;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (Buffer.isBuffer(message)) {\n\t\t\t\t\t\t\tbufferPayload = message;\n\t\t\t\t\t\t\tlet decodeResult = this.decodeBufferPayload(bufferPayload);\n\t\t\t\t\t\t\tsocketData = decodeResult.data;\n\t\t\t\t\t\t\tusedBinary = decodeResult.usedBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (Array.isArray(message)) {\n\t\t\t\t\t\t\tbufferPayload = Buffer.concat(message as unknown as ReadonlyArray<Uint8Array>);\n\t\t\t\t\t\t\tlet decodeResult = this.decodeBufferPayload(bufferPayload);\n\t\t\t\t\t\t\tsocketData = decodeResult.data;\n\t\t\t\t\t\t\tusedBinary = decodeResult.usedBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (message instanceof ArrayBuffer) {\n\t\t\t\t\t\t\tbufferPayload = Buffer.from(message);\n\t\t\t\t\t\t\tlet decodeResult = this.decodeBufferPayload(bufferPayload);\n\t\t\t\t\t\t\tsocketData = decodeResult.data;\n\t\t\t\t\t\t\tusedBinary = decodeResult.usedBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (ArrayBuffer.isView(message)) {\n\t\t\t\t\t\t\tconst view = message as NodeJS.ArrayBufferView;\n\t\t\t\t\t\t\tbufferPayload = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n\t\t\t\t\t\t\tlet decodeResult = this.decodeBufferPayload(bufferPayload);\n\t\t\t\t\t\t\tsocketData = decodeResult.data;\n\t\t\t\t\t\t\tusedBinary = decodeResult.usedBinary;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthrow new Error('Unsupported WebSocket message type: ' + typeof message);\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\t\tconsole.log('Error - WS message parse', e);\n\t\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t\t'dev@resolveio.com', \n\t\t\t\t\t\t\t'SERVER - JSON Parse Error - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], \n\t\t\t\t\t\t\tJSON.stringify([bufferPayload ? bufferPayload.toString('base64') : message, e])\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (usedBinary) {\n\t\t\t\t\t\tws['supportsBinary'] = true;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// call our existing processSocketMessage\n\t\t\t\t\tawait this.processSocketMessage(ws, socketData);\n\t\t\t\t})\n\t\t\t\t.on('end', () => {\n\t\t\t\t\tws.close();\n\t\t\t\t})\n\t\t\t\t.on('error', () => {\n\t\t\t\t\tws.close()\n\t\t\t\t})\n\t\t\t\t.on('close', async () => {\n\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Keep alive timer\n\t\tsetInterval(async () => {\n\t\t\tfor (let ws of this._serverWSS.clients) {\n\t\t\t\tif (ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= this._clientHeartbeatIntervalMs) {\n\t\t\t\t\tif (this.shouldDeferHeartbeat(ws)) {\n\t\t\t\t\t\tws['isAlive'] = true;\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\t\tws['retryCnt']++;\n\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tawait this.triggerClientHeartbeat(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\t\tawait this.triggerClientHeartbeat(ws);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, this._clientHeartbeatIntervalMs);\n\t}\n\n\tprivate async processSocketMessage(ws: WebSocket, socketData: any) {\n\t\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tws.send('pong');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\tws['isAlive'] = true;\n\t\t\tws['pongTime'] = new Date();\n\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\treturn;\n\t\t}\n\n\t\t// If the top level is not an array, let's skip\n\t\tif (!Array.isArray(socketData[0])) {\n\t\t\tconsole.log('Invalid message format (expected array of arrays)', socketData);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle each sub-message\n\t\tfor (let message of socketData) {\n\t\t\tawait this.handleClientMessage(ws, message);\n\t\t}\n\t}\n\n\tprivate decodeBufferPayload(buffer: Buffer): { data: any; usedBinary: boolean } {\n\t\tconst textPayload = buffer.toString('utf8');\n\n\t\tif (this.looksLikeTextPayload(textPayload)) {\n\t\t\ttry {\n\t\t\t\treturn { data: this.parseTextFallback(textPayload), usedBinary: false };\n\t\t\t}\n\t\t\tcatch {\n\t\t\t\t// fall through to attempt MessagePack decode\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\treturn { data: unpack(buffer), usedBinary: true };\n\t\t}\n\t\tcatch (binaryErr) {\n\t\t\ttry {\n\t\t\t\treturn { data: this.parseTextFallback(textPayload), usedBinary: false };\n\t\t\t}\n\t\t\tcatch {\n\t\t\t\tthrow binaryErr;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate parseTextFallback(rawMessage: string): any {\n\t\tif (rawMessage === 'ping' || rawMessage === 'pong') {\n\t\t\treturn rawMessage;\n\t\t}\n\n\t\ttry {\n\t\t\treturn JSON.parse(rawMessage, dateReviver);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate looksLikeTextPayload(text: string): boolean {\n\t\tif (!text) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst trimmed = text.trim();\n\t\tif (!trimmed) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst first = trimmed[0];\n\t\treturn first === '[' || first === '{' || first === '\"' || first === 'p' || first === 'P';\n\t}\n\n\tprivate async triggerClientHeartbeat(ws: WebSocket): Promise<void> {\n\t\tif (!ws || ws.readyState !== ws.OPEN) {\n\t\t\treturn;\n\t\t}\n\n\t\tws['pingTime'] = new Date();\n\n\t\ttry {\n\t\t\tif (typeof ws.ping === 'function') {\n\t\t\t\tws.ping();\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (this._methodManager?.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping Frame', err);\n\t\t\t}\n\t\t\tawait this.unsubscribeWS(ws);\n\t\t\treturn;\n\t\t}\n\n\t\tws.send('ping', async (error) => {\n\t\t\tif (error) {\n\t\t\t\tif (this._methodManager?.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t}\n\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate shouldDeferHeartbeat(ws: WebSocket): boolean {\n\t\tif (!ws || ws.readyState !== ws.OPEN) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst bufferedAmount = typeof ws.bufferedAmount === 'number' ? ws.bufferedAmount : 0;\n\t\treturn bufferedAmount >= this._clientHeartbeatBackpressureBytes;\n\t}\n\n\tprivate async handleClientMessage(ws: WebSocket, msg: any[]): Promise<void> {\n\t\t// This is basically your old logic from processSocketMessage,\n\t\t// but we'll insert our worker-queue logic for \"method\" calls.\n\n\t\tlet messageRoute = msg[0];\n\t\tlet messageDate = msg[1];\n\t\tlet messageId = msg[2];\n\t\tlet type = msg[3];\n\n\t\tif (!this.publicProgram && this._clientRoutes.some(a => messageRoute.includes(a)) && !ws['doc_user'].roles.groups.some(a => a.views.some(b => messageRoute.includes(b) || b.includes(messageRoute))) && !ws['doc_user'].roles.super_admin) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (type === 'subscription') {\n\t\t\tlet subType = msg[4];\n\t\t\tlet pub = msg[5];\n\n\t\t\tif (subType === 'sub') {\n\t\t\t\tawait this._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t}\n\t\telse if (!this.publicProgram && type === 'offline') {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: 'ACK'\n\t\t\t};\n\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = msg[4];\n\n\t\t\tfor (let i = 0; i < offlineUpdates.length; i++) {\n\t\t\t\tlet update = offlineUpdates[i];\n\n\t\t\t\tlet data = update.data;\n\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tlet serverResMethod: ServerResponseModel = {\n\t\t\t\t\tmessageId: updateMessageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, serverResMethod);\n\t\t\t\t}\n\n\t\t\t\tif (method === 'insertDocument' && data[0] === 'driver-gps') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution' && method !== 'qbHandleResponse') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([data])) < 1000000 ? JSON.stringify([data], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([data])) < 1000000 ? JSON.stringify([data], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethod.call(Object.assign({}, this._methodManager, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), method, ...data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Offline Error', JSON.stringify(err, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(data[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Offline - Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.splice(this._offlineUpdates.map(a => a['id_socket']).indexOf(ws['id_socket']), 1);\n\t\t}\n\t\telse {\n\t\t\t// It's presumably a 'method' or something else\n\t\t\tlet dataCopy = [...msg];\n\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet route = dataCopy.shift();\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet date = dataCopy.shift();\n\t\t\tlet msgId = dataCopy.shift();\n\t\t\tlet msgType = dataCopy.shift();\n\t\t\t\n\t\t\tif (msgType === 'method') {\n\t\t\t\tlet methodName = dataCopy.shift();\n\n\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (methodName !== 'reportBuilderGetResults' && methodName !== 'reportBuilderGetDistinctValue' && methodName !== 'reportBuilderBuildTree' && methodName !== 'generatePDF' && methodName !== 'getWOOfflineData' && methodName !== 'countQuery' && methodName !== 'countWithQuery' && methodName !== 'countCollectionWithQuery' && methodName !== 'find' && methodName !== 'findOne' && methodName !== 'findWithOptions' && methodName !== 'getDrivers' && methodName !== 'processAirdropDistribution') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([dataCopy])) < 1000000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([dataCopy])) < 1000000 ? JSON.stringify([dataCopy], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Immediately ACK\n\t\t\t\tlet ack: ServerResponseModel = {\n\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, ack);\n\t\t\t\t}\n\n\t\t\t\tlet method = this._methodManager.getMethod(methodName);\n\n\t\t\t\tif (method &&\n\t\t\t\t\t!method.skipWorker &&\n\t\t\t\t\tthis._isWorkersEnabled &&\n\t\t\t\t\tthis._workerDispatcherManager &&\n\t\t\t\t\tthis._workerDispatcherManager.hasWorkers() &&\n\t\t\t\t\tmethodName !== 'find' &&\n\t\t\t\t\tmethodName !== 'insertDocument' &&\n\t\t\t\t\tmethodName !== 'countWithQuery' &&\n\t\t\t\t\tmethodName !== 'findOne' &&\n\t\t\t\t\tmethodName !== 'updateDocumentProps' &&\n\t\t\t\t\tmethodName !== 'findWithOptions' &&\n\t\t\t\t\tmethodName !== 'updateDocument' &&\n\t\t\t\t\tmethodName !== 'insertErrorLog' &&\n\t\t\t\t\tmethodName !== 'removeDocument' &&\n\t\t\t\t\tmethodName !== 'supportCreateBillingUser' &&\n\t\t\t\t\tmethodName !== 'getSignedUrl' &&\n\t\t\t\t\tmethodName !== 'getSignedUrls' &&\n\t\t\t\t\tmethodName !== 'getSignedUrlWithId' &&\n\t\t\t\t\tmethodName !== 'incorrectUser' &&\n\t\t\t\t\tmethodName !== 'reloadWS' &&\n\t\t\t\t\tmethodName !== 'reconnectWS' &&\n\t\t\t\t\tmethodName !== 'disconnectWS'\n\t\t\t\t) {\n\t\t\t\t\tthis._workerDispatcherManager.sendClientTask(msgId, methodName, dataCopy, {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// No worker available: do method locally\n\t\t\t\t\tawait this.callMethodLocally(ws, msgId, methodName, dataCopy);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * callMethodLocally is your old approach for invoking the method in-process.\n\t */\n\tprivate async callMethodLocally(ws: WebSocket, messageId: number, method: string, params: any[]) {\n\t\tlet serverRes: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: false,\n\t\t\tdata: null\n\t\t};\n\n\t\ttry {\n\t\t\t// You can keep your logging code (LogMethodLatencies, Logs.insertOne, etc.)\n\t\t\tlet result = await this._methodManager.callMethod.call(\n\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t}),\n\t\t\t\tmethod,\n\t\t\t\t...params\n\t\t\t);\n\n\t\t\tserverRes.data = result;\n\t\t}\n\t\tcatch (err) {\n\t\t\tserverRes.hasError = true;\n\t\t\tserverRes.data = err || 'Unknown error';\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t}\n\t}\n\n\t\n\n\t/**\n\t * Cleanly remove a client from the subscription manager, etc.\n\t */\n\tpublic async unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager && this._methodManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tawait this._subscriptionManager.unsubscribeAll(ws);\n\t\tws.removeAllListeners();\n\t\tws = null;\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n\n\tpublic getServerConfig() {\n\t\treturn ResolveIOServer.getServerConfig();\n\t}\n\n\tpublic getWorkerDispatcherManager() {\n\t\treturn this._workerDispatcherManager;\n\t}\n\n\tpublic getWorkerServerManager() {\n\t\treturn this._workerServerManager;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ErrorContextData {
|
|
2
|
+
correlationId?: string;
|
|
3
|
+
}
|
|
4
|
+
export declare function getCorrelationId(): string | undefined;
|
|
5
|
+
export declare function setCorrelationId(correlationId: string): void;
|
|
6
|
+
export declare function ensureCorrelationId(fallbackId?: string): string;
|
|
7
|
+
export declare function runWithCorrelationContext<T>(correlationId: string, fn: () => Promise<T> | T): Promise<T>;
|
|
8
|
+
type NormalizedError = Error & Record<string, any>;
|
|
9
|
+
export declare function ensureErrorWithCorrelation(error: unknown, fallbackId?: string): {
|
|
10
|
+
error: NormalizedError;
|
|
11
|
+
correlationId: string;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ensureErrorWithCorrelation = exports.runWithCorrelationContext = exports.ensureCorrelationId = exports.setCorrelationId = exports.getCorrelationId = void 0;
|
|
40
|
+
var async_hooks_1 = require("async_hooks");
|
|
41
|
+
var common_1 = require("./common");
|
|
42
|
+
var errorContext = new async_hooks_1.AsyncLocalStorage();
|
|
43
|
+
function getCorrelationId() {
|
|
44
|
+
var _a;
|
|
45
|
+
return (_a = errorContext.getStore()) === null || _a === void 0 ? void 0 : _a.correlationId;
|
|
46
|
+
}
|
|
47
|
+
exports.getCorrelationId = getCorrelationId;
|
|
48
|
+
function setCorrelationId(correlationId) {
|
|
49
|
+
var store = errorContext.getStore();
|
|
50
|
+
if (store) {
|
|
51
|
+
store.correlationId = correlationId;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.setCorrelationId = setCorrelationId;
|
|
55
|
+
function ensureCorrelationId(fallbackId) {
|
|
56
|
+
var correlationId = getCorrelationId();
|
|
57
|
+
if (!correlationId) {
|
|
58
|
+
correlationId = fallbackId || (0, common_1.objectIdHexString)();
|
|
59
|
+
errorContext.enterWith({ correlationId: correlationId });
|
|
60
|
+
}
|
|
61
|
+
return correlationId;
|
|
62
|
+
}
|
|
63
|
+
exports.ensureCorrelationId = ensureCorrelationId;
|
|
64
|
+
function runWithCorrelationContext(correlationId, fn) {
|
|
65
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
66
|
+
var store;
|
|
67
|
+
var _this = this;
|
|
68
|
+
return __generator(this, function (_a) {
|
|
69
|
+
switch (_a.label) {
|
|
70
|
+
case 0:
|
|
71
|
+
store = errorContext.getStore();
|
|
72
|
+
if (!(store && store.correlationId === correlationId)) return [3 /*break*/, 2];
|
|
73
|
+
return [4 /*yield*/, fn()];
|
|
74
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
75
|
+
case 2: return [4 /*yield*/, errorContext.run({ correlationId: correlationId }, function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
76
|
+
switch (_a.label) {
|
|
77
|
+
case 0: return [4 /*yield*/, fn()];
|
|
78
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
79
|
+
}
|
|
80
|
+
}); }); })];
|
|
81
|
+
case 3: return [2 /*return*/, _a.sent()];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
exports.runWithCorrelationContext = runWithCorrelationContext;
|
|
87
|
+
function coerceError(error) {
|
|
88
|
+
if (error instanceof Error) {
|
|
89
|
+
return error;
|
|
90
|
+
}
|
|
91
|
+
if (typeof error === 'object' && error !== null) {
|
|
92
|
+
var errObject = error;
|
|
93
|
+
if (typeof errObject.message !== 'string') {
|
|
94
|
+
errObject.message = JSON.stringify(errObject);
|
|
95
|
+
}
|
|
96
|
+
if (typeof errObject.name !== 'string') {
|
|
97
|
+
errObject.name = errObject.constructor && errObject.constructor.name !== 'Object' ? errObject.constructor.name : 'Error';
|
|
98
|
+
}
|
|
99
|
+
if (typeof errObject.stack !== 'string') {
|
|
100
|
+
errObject.stack = new Error(errObject.message).stack;
|
|
101
|
+
}
|
|
102
|
+
return errObject;
|
|
103
|
+
}
|
|
104
|
+
var wrappedError = new Error(String(error));
|
|
105
|
+
wrappedError.originalValue = error;
|
|
106
|
+
return wrappedError;
|
|
107
|
+
}
|
|
108
|
+
function ensureErrorWithCorrelation(error, fallbackId) {
|
|
109
|
+
var normalizedError = coerceError(error);
|
|
110
|
+
var correlationId = normalizedError.errorId || normalizedError.correlationId;
|
|
111
|
+
if (typeof correlationId !== 'string' || !correlationId) {
|
|
112
|
+
correlationId = getCorrelationId() || fallbackId || (0, common_1.objectIdHexString)();
|
|
113
|
+
}
|
|
114
|
+
normalizedError.errorId = correlationId;
|
|
115
|
+
normalizedError.correlationId = correlationId;
|
|
116
|
+
setCorrelationId(correlationId);
|
|
117
|
+
return { error: normalizedError, correlationId: correlationId };
|
|
118
|
+
}
|
|
119
|
+
exports.ensureErrorWithCorrelation = ensureErrorWithCorrelation;
|
|
120
|
+
|
|
121
|
+
//# sourceMappingURL=error-tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/util/error-tracking.ts"],"names":[],"mappings":"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","file":"error-tracking.js","sourcesContent":["import { AsyncLocalStorage } from 'async_hooks';\nimport { objectIdHexString } from './common';\n\nexport interface ErrorContextData {\n\tcorrelationId?: string;\n}\n\nconst errorContext = new AsyncLocalStorage<ErrorContextData>();\n\nexport function getCorrelationId(): string | undefined {\n\treturn errorContext.getStore()?.correlationId;\n}\n\nexport function setCorrelationId(correlationId: string) {\n\tconst store = errorContext.getStore();\n\tif (store) {\n\t\tstore.correlationId = correlationId;\n\t}\n}\n\nexport function ensureCorrelationId(fallbackId?: string): string {\n\tlet correlationId = getCorrelationId();\n\tif (!correlationId) {\n\t\tcorrelationId = fallbackId || objectIdHexString();\n\t\terrorContext.enterWith({ correlationId });\n\t}\n\treturn correlationId;\n}\n\nexport async function runWithCorrelationContext<T>(correlationId: string, fn: () => Promise<T> | T): Promise<T> {\n\tconst store = errorContext.getStore();\n\tif (store && store.correlationId === correlationId) {\n\t\treturn await fn();\n\t}\n\n\treturn await errorContext.run({ correlationId }, async () => await fn());\n}\n\ntype NormalizedError = Error & Record<string, any>;\n\nfunction coerceError(error: unknown): NormalizedError {\n\tif (error instanceof Error) {\n\t\treturn error as NormalizedError;\n\t}\n\n\tif (typeof error === 'object' && error !== null) {\n\t\tconst errObject = error as Record<string, any>;\n\t\tif (typeof errObject.message !== 'string') {\n\t\t\terrObject.message = JSON.stringify(errObject);\n\t\t}\n\t\tif (typeof errObject.name !== 'string') {\n\t\t\terrObject.name = errObject.constructor && errObject.constructor.name !== 'Object' ? errObject.constructor.name : 'Error';\n\t\t}\n\t\tif (typeof errObject.stack !== 'string') {\n\t\t\terrObject.stack = new Error(errObject.message).stack;\n\t\t}\n\t\treturn errObject as NormalizedError;\n\t}\n\n\tconst wrappedError = new Error(String(error));\n\t(wrappedError as Record<string, any>).originalValue = error;\n\treturn wrappedError as NormalizedError;\n}\n\nexport function ensureErrorWithCorrelation(error: unknown, fallbackId?: string): { error: NormalizedError, correlationId: string } {\n\tconst normalizedError = coerceError(error);\n\tlet correlationId: string = normalizedError.errorId || normalizedError.correlationId;\n\n\tif (typeof correlationId !== 'string' || !correlationId) {\n\t\tcorrelationId = getCorrelationId() || fallbackId || objectIdHexString();\n\t}\n\n\tnormalizedError.errorId = correlationId;\n\tnormalizedError.correlationId = correlationId;\n\n\tsetCorrelationId(correlationId);\n\n\treturn { error: normalizedError, correlationId };\n}\n"]}
|