@resolveio/server-lib 20.7.8 → 20.7.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/collections/cron-job.collection.js.map +1 -1
- package/collections/email-history.collection.js.map +1 -1
- package/collections/email-verified.collection.js.map +1 -1
- package/collections/file.collection.js.map +1 -1
- package/collections/flag-update.collection.js.map +1 -1
- package/collections/flag.collection.js.map +1 -1
- package/collections/log-method-latency.collection.js.map +1 -1
- package/collections/log-subscription.collection.js.map +1 -1
- package/collections/log.collection.js.map +1 -1
- package/collections/logged-in-users.collection.js.map +1 -1
- package/collections/method-response.collection.js.map +1 -1
- package/collections/monitor-cpu.collection.js.map +1 -1
- package/collections/monitor-function.collection.js.map +1 -1
- package/collections/monitor-memory.collection.js.map +1 -1
- package/collections/monitor-mongo.collection.js.map +1 -1
- package/collections/notification.collection.js.map +1 -1
- package/collections/report-builder-dashboard-builder.collection.js.map +1 -1
- package/collections/report-builder-library.collection.js.map +1 -1
- package/collections/report-builder-report.collection.js.map +1 -1
- package/collections/user-group.collection.js.map +1 -1
- package/collections/user.collection.js.map +1 -1
- package/cron/cron.d.ts +1 -1
- package/cron/cron.js +1 -1
- package/cron/cron.js.map +1 -1
- package/http/auth.js.map +1 -1
- package/http/health.d.ts +1 -1
- package/http/health.js +1 -1
- package/http/health.js.map +1 -1
- package/managers/method.manager.js +1 -1
- package/managers/method.manager.js.map +1 -1
- package/managers/mongo.manager.d.ts +1 -1
- package/managers/mongo.manager.js +1 -1
- package/managers/mongo.manager.js.map +1 -1
- package/managers/monitor.manager.js.map +1 -1
- package/managers/subscription.manager.js.map +1 -1
- package/methods/aws.js.map +1 -1
- package/methods/cron-jobs.js +1 -1
- package/methods/cron-jobs.js.map +1 -1
- package/methods/monitor.js.map +1 -1
- package/methods/support.js.map +1 -1
- package/package.json +1 -1
- package/publications/cron-jobs.js.map +1 -1
- package/publications/files.js.map +1 -1
- package/publications/report-builder-reports.js.map +1 -1
- package/server-app.js +1 -1
- package/server-app.js.map +1 -1
- package/util/schema-report-builder.js.map +1 -1
package/server-app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server-app.ts"],"names":["bodyParser","require","express","xmlParser","http_1","jwt","moment","WebSocket","log_collection_1","user_collection_1","cron_manager_1","method_manager_1","monitor_manager_1","subscription_manager_1","common_1","mongodb_1","auth_1","health_1","home_1","websocket_manager_1","resolveio_server_app_1","ResolveIOMainServer","this","_offlineUpdates","sesMail","standardProgram","publicProgram","_rebootFlag","_runningTasks","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_safeShutdown","_workers","_taskQueue","_inFlightRequests","create","resolveioMainServer","initialize","prototype","_this","initServerFlag","_serverStartTime","Date","_monitorManager","MonitorManager","_monitorManagerFunction","MonitorManagerFunction","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setInterval","_subscriptionManager","getEnableDebug","console","log","setTimeout","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","_methodManager","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","_a","sent","exit","_serverHTTP","close","safeShutdown","MethodManager","_cronManager","CronManager","startWorkerInstance","_websocketManager","WebSocketManager","startServerInstance","SubscriptionManager","_serverWSS","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","wsUrl","ws","lastComm","interval","WORKER_INDEX","NODE_APP_INSTANCE","sendWorkerResponse","rawData","toString","msg","parse","e","type","handleIncomingTask","clearInterval","err","data","taskId","method","params","userContext","push","timedOut","timeoutHandle","callMethod","concat","managerThis","Object","assign","id_user","user","id_ws","call","apply","__spreadArray","__read","result","_b","clearTimeout","filter","a","err_1","payload","readyState","OPEN","send","getActiveMonitorFunctions","length","getMongoConnection","setImmediate","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","port","verifyClient","info","cb","token","url","includes","split","infoData","headers","origin","verify","decoded","Users","findById","fullname","readonly","workerId_1","objectIdHexString","id","activeTasks","maxConcurrency","lastComm_1","interval_1","handleWorkerMessage","w","addWebSocket","createLoggedInUser","unsubscribeWS","socketData","e_1","processSocketMessage","now","getTime","this_1","_e","__values","value","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","handleClientMessage","messageRoute","messageDate","messageId","some","roles","groups","views","b","super_admin","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","offlineUpdates","i","update","shift","updateMessageId","serverResMethod","getLocalLogManager","writeLog","_id","createdAt","collection","id_document","getBinarySize","route","Logs","insertOne","client","instance","instance_index","_methods","err_3","getMongoManager","invalidateQueryCache","splice","map","indexOf","dataCopy","msgId","methodName","ack","worker","findAvailableWorker","queueTask","callMethodLocally","err_4","dispatchQueue","item","assignTaskToWorker","candidates","x","sort","task","Math","max","unshift","workerId","messageStr","inflight","find","unsubscribeAll","removeAllListeners","getApp","exports"],"mappings":"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","file":"server-app.js","sourcesContent":["import * as bodyParser from 'body-parser';\nimport * as express from 'express';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport { createServer, Server } from 'http';\nimport * as jwt from 'jsonwebtoken';\nimport * as moment from 'moment-timezone';\nimport * as WebSocket from 'ws';\n\nimport { Logs } from './collections/log.collection';\nimport { Users } from './collections/user.collection';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { ServerResponseModel } from './models/server-response.model';\nimport { dateReviver, getBinarySize, objectIdHexString } from './util/common';\n\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { setupHomeRoutes } from './http/home';\n\nimport { WebSocketManager } from './managers/websocket.manager';\nimport { ResolveIOServer } from './resolveio-server-app';\n\ninterface WorkerConnection {\n\tid: string;\n\tws: WebSocket;\n\tactiveTasks: number;\n\tmaxConcurrency: number;\n}\n\ninterface TaskQueueItem {\n\ttaskId: string;\n\tmethod: string;\n\tparams: any[];\n\tuserContext?: { id_user?: string; user?: string; id_ws?: string };\n}\n\ninterface InFlightRequest {\n\tws: WebSocket; // the client's WebSocket\n\tmessageId: number; // the ID so the client knows which call this corresponds to\n\tmethod: string;\n}\n\nexport class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\n\tprivate _portWSS: number;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\tprivate _runningTasks = [];\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate _safeShutdown = false;\n\n\tprivate _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskQueueItem[] = [];\n\tprivate _inFlightRequests: { [taskId: string]: InFlightRequest } = {};\n\n\tconstructor() {}\n\n\tpublic static create() {\n\t\tconst resolveioMainServer = new ResolveIOMainServer();\n\t\tresolveioMainServer.initialize();\n\t\treturn resolveioMainServer;\n\t}\n\n\tprivate initialize() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = new MonitorManager();\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tlet initServerFlag = false;\n\n\t\tsetTimeout(() => {\n\t\t\tinitServerFlag = true;\n\t\t}, 5000);\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\t// Condition to filter out the MongoError with code 48 (NamespaceExists)\n\t\t\tif (error && error['name'] === 'MongoError' && error['code'] === 48) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tif (error && error['name'] === 'MongoServerError' && !initServerFlag) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tconsole.error(new Date(), 'Unhandled Rejection at Promise', [error, rej]);\n\t\t\t\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\t// If this is a MongoNetworkTimeoutError, handle it specifically\n\t\t\tif (error && (error['name'] === 'MongoNetworkTimeoutError' || error instanceof MongoNetworkTimeoutError)) {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t// Sending email notification (using your existing method)\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - MongoNetworkTimeoutError - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify({\n\t\t\t\t\t\tname: error['name'],\n\t\t\t\t\t\tmessage: error['message'],\n\t\t\t\t\t\tstack: error['stack']\n\t\t\t\t\t}, null, 2));\n\n\t\t\t\t\t// Exiting the process\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error) {\n\t\t\t\tif (error['name'] !== 'StatusError' && error['message'] !== '') {\n\t\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconsole.error(error, 'Uncaught Exception thrown');\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t}\n\t\t});\n\n\t\t//PM2 wants to reboot/restart\n\t\tprocess.on('SIGINT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tconsole.log('Running as a Worker instance');\n\t\t\t\tthis._methodManager = MethodManager.create(null, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._cronManager = CronManager.create();\n\t\t\t\tthis.startWorkerInstance();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('Running as a Server instance');\n\t\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\t\tthis.startServerInstance();\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.listen();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.log('Running with Workers Disabled');\n\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\tthis.startServerInstance();\n\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\tthis._cronManager = CronManager.create();\n\t\t\tthis.listen();\n\t\t}\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.PORT_HTTP || ResolveIOServer.getServerConfig()['PORT_HTTP'] || 8080;\n\t\tthis._portWSS = process.env.PORT_WSS || ResolveIOServer.getServerConfig()['PORT_WSS'] || 8081;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app, ResolveIOServer.getServerConfig());\n\n\t\tif (ResolveIOServer.getServerConfig()['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tprivate startWorkerInstance() {\n\t\tconsole.log(new Date(), 'Worker instance started, connecting to main server via WebSocket...');\n\n\t\tlet wsUrl = ResolveIOServer.getServerConfig()['SERVER_URL'] + '/websocket?workerToken=' + ResolveIOServer.getServerConfig()['WORKER_TOKEN'];\n\n\t\tconst ws = new WebSocket(wsUrl);\n\n\t\tlet lastComm = null;\n\t\tlet interval = null;\n\n\t\tws.on('open', () => {\n\t\t\tconsole.log(new Date(), 'Connected to main server as worker', process.env.WORKER_INDEX, process.env.NODE_APP_INSTANCE);\n\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\n\t\t\tinterval = setInterval(() => {\n\t\t\t\tif (!lastComm) {\n\t\t\t\t\tws.close();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlastComm = null;\n\t\t\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\t\t\t\t}\n\t\t\t}, 15000);\n\t\t});\n\n\t\tws.on('message', async (rawData: any) => {\n\t\t\t// console.log(new Date(), 'Message Recv', rawData);\n\n\t\t\tif (typeof rawData !== 'string') {\n\t\t\t\trawData = rawData.toString();\n\t\t\t}\n\n\t\t\t// console.log(new Date(), 'String Message Recv', rawData);\n\n\t\t\tif (rawData === 'ping') {\n\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\tthis.sendWorkerResponse(ws, 'pong');\n\t\t\t}\n\t\t\telse if (rawData === 'pong') {\n\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\tlastComm = new Date();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet msg: any;\n\t\t\t\ttry {\n\t\t\t\t\tmsg = JSON.parse(rawData, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch (e) {\n\t\t\t\t\tconsole.error('Worker parse error', e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// We expect: { type: 'task', taskId, method, params, userContext? }\n\t\t\t\tif (msg.type === 'task') {\n\t\t\t\t\tawait this.handleIncomingTask(ws, msg);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tws.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Disconnected from main server. Reconnecting in 5s...');\n\t\t\tsetTimeout(this.startWorkerInstance, 5000);\n\n\t\t\tif (interval) {\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t});\n\n\t\tws.on('error', (err) => {\n\t\t\tconsole.error(new Date(), 'Worker WS error:', err);\n\t\t\tws.close();\n\t\t});\n\t}\n\n\tprivate async handleIncomingTask(ws: WebSocket, data: any) {\n\t\tlet { taskId, method, params, userContext } = data;\n\t\tthis._runningTasks.push(taskId);\n\t\tif (!taskId || !method) {\n\t\t\tconsole.log('Invalid task message received', data);\n\t\t\treturn;\n\t\t}\n\n\t\tlet timedOut = false;\n\t\tlet timeoutHandle = setTimeout(async () => {\n\t\t\ttimedOut = true;\n\t\t\tconsole.error('Worker timed out on task:', taskId);\n\n\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\ttype: 'taskComplete',\n\t\t\t\ttaskId,\n\t\t\t\terror: true,\n\t\t\t\tmessage: 'Task timed out'\n\t\t\t});\n\n\t\t\tawait this._methodManager.callMethod('insertErrorLog', `Timeout in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t}, 120000);\n\n\t\ttry {\n\t\t\tlet managerThis = Object.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\tid_user: userContext?.id_user || '',\n\t\t\t\tuser: userContext?.user || '',\n\t\t\t\tid_ws: userContext?.id_ws || ''\n\t\t\t});\n\n\t\t\tlet result = await this._methodManager.callMethod.call(managerThis, method, ...params);\n\n\t\t\tif (!timedOut) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\t\ttype: 'taskComplete',\n\t\t\t\t\ttaskId,\n\t\t\t\t\terror: false,\n\t\t\t\t\tresult\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._runningTasks = this._runningTasks.filter(a => a !== taskId);\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (!timedOut) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\tconsole.error('Worker failed task:', taskId, err);\n\t\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\t\ttype: 'taskComplete',\n\t\t\t\t\ttaskId,\n\t\t\t\t\terror: true,\n\t\t\t\t\tmessage: err || 'Unknown error'\n\t\t\t\t});\n\n\t\t\t}\n\t\t\t\n\t\t\tawait this._methodManager.callMethod('insertErrorLog', `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t\t\n\t\t\tthis._runningTasks = this._runningTasks.filter(a => a !== taskId);\n\t\t}\n\t}\n\n\tprivate sendWorkerResponse(ws: WebSocket, payload: any) {\n\t\tif (typeof payload !== 'string') {\n\t\t\tpayload = JSON.stringify(payload);\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\ttry {\n\t\t\t\tws.send(payload);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tconsole.error('Failed to send worker response:', err);\n\t\t\t}\n\t\t}\n\t\telse if (ws) {\n\t\t\tws.close();\n\t\t}\n\t}\n\n\tprivate async safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length\n\t\t\t&& !this._offlineUpdates.length && !this._taskQueue.length && !this._runningTasks.length\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait ResolveIOServer.getMongoConnection().close(false);\n\t\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tcatch { \n\t\t\t\t\tprocess.exit(1); \n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (!this._safeShutdown) {\n\t\t\t\tthis._safeShutdown = true;\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._safeShutdown = false;\n\t\t\t\t}, 1000);\n\n\t\t\t\tconsole.log(new Date(), 'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length,\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(async () => {\n\t\t\t\tawait this.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000;\n\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tport: this._portWSS,\n\t\t\tverifyClient: this.publicProgram ? null : (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If it's a worker, we might skip token checks or do a simple check:\n\t\t\t\t\tif (info.req.url && info.req.url.includes('workerToken=')) {\n\t\t\t\t\t\tlet urlParts = info.req.url.split('workerToken='); \n\t\t\t\t\t\tlet workerToken = urlParts[1] || '';\n\n\t\t\t\t\t\tif (workerToken === ResolveIOServer.getServerConfig()['WORKER_TOKEN']) {\n\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tinfo.origin !== ResolveIOServer.getServerConfig()['ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['SEC_ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_SECONDARY_URL']\n\t\t\t\t\t) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, ResolveIOServer.getServerConfig()['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Listen for connections from clients or workers.\n\t */\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('listening', () => {\n\t\t\tconsole.log('Running server on port %s', this._portWSS);\n\t\t});\n\n\t\tthis._serverWSS.on('connection', async (ws, req) => {\n\t\t\tif (req.url && req.url.includes('workerToken=')) {\n\t\t\t\t// It's a WORKER\n\t\t\t\tlet workerId = objectIdHexString();\n\t\t\t\tws['id_worker'] = workerId;\n\n\t\t\t\t// For demonstration, let each worker handle up to 2 tasks concurrently\n\t\t\t\tlet maxConcurrency = 2;\n\n\t\t\t\tthis._workers.push({\n\t\t\t\t\tid: workerId,\n\t\t\t\t\tws: ws,\n\t\t\t\t\tactiveTasks: 0,\n\t\t\t\t\tmaxConcurrency: maxConcurrency\n\t\t\t\t});\n\n\t\t\t\tlet interval = null;\n\t\t\t\tlet lastComm = null;\n\n\t\t\t\tws.on('open', () => {\n\t\t\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\t\n\t\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\t\tws.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 15000);\n\t\t\t\t});\n\n\t\t\t\tconsole.log(new Date(), 'Worker connected:', workerId);\n\n\t\t\t\tws.on('message', (message: any) => {\n\t\t\t\t\t// console.log(new Date(), 'Message Recv', message);\n\n\t\t\t\t\tif (typeof message !== 'string') {\n\t\t\t\t\t\tmessage = message.toString();\n\t\t\t\t\t}\n\n\t\t\t\t\t// console.log(new Date(), 'String Message Recv', message);\n\n\t\t\t\t\tif (message === 'ping') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tthis.sendWorkerResponse(ws, 'pong');\n\t\t\t\t\t}\n\t\t\t\t\telse if (message === 'pong') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.handleWorkerMessage(workerId, message);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('close', () => {\n\t\t\t\t\tconsole.log(new Date(), 'Worker disconnected:', workerId);\n\t\t\t\t\tthis._workers = this._workers.filter(w => w.id !== workerId);\n\t\t\t\t\t\n\t\t\t\t\tif (interval) {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('error', (error) => {\n\t\t\t\t\tconsole.error('Error on WS Worker', error);\n\t\t\t\t\tws.close();\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Normal client\n\t\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\t\tawait this._subscriptionManager.createLoggedInUser(ws['id_socket']);\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', async (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, 5000);\n\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Connection from user: ' + req['user']);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tws['isAlive'] = true;\n\t\t\t\tws['retryCnt'] = 0;\n\n\t\t\t\tws.on('message', async (message: string) => {\n\t\t\t\t\tthis._debugMsgRecv += 1;\n\t\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t\t'dev@resolveio.com', \n\t\t\t\t\t\t\t'SERVER - JSON Parse Error - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], \n\t\t\t\t\t\t\tJSON.stringify([message, e])\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// call our existing processSocketMessage\n\t\t\t\t\tawait this.processSocketMessage(ws, socketData);\n\t\t\t\t})\n\t\t\t\t.on('end', () => {\n\t\t\t\t\tws.close();\n\t\t\t\t})\n\t\t\t\t.on('error', error => {\n\t\t\t\t\tws.close()\n\t\t\t\t})\n\t\t\t\t.on('close', async () => {\n\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Keep alive timer\n\t\tsetInterval(async () => {\n\t\t\tfor (let ws of this._serverWSS.clients) {\n\t\t\t\tif (ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= 20000) {\n\t\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\t\tws['retryCnt']++;\n\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\t\tws.send('ping', async (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tws.send('ping', async (error) => {\n\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 20000);\n\t}\n\n\tprivate async processSocketMessage(ws: WebSocket, socketData: any) {\n\t\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tws.send('pong');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\tws['isAlive'] = true;\n\t\t\tws['pongTime'] = new Date();\n\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\treturn;\n\t\t}\n\n\t\t// If the top level is not an array, let's skip\n\t\tif (!Array.isArray(socketData[0])) {\n\t\t\tconsole.log('Invalid message format (expected array of arrays)', socketData);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle each sub-message\n\t\tfor (let message of socketData) {\n\t\t\tawait this.handleClientMessage(ws, message);\n\t\t}\n\t}\n\n\tprivate async handleClientMessage(ws: WebSocket, msg: any[]): Promise<void> {\n\t\t// This is basically your old logic from processSocketMessage,\n\t\t// but we'll insert our worker-queue logic for \"method\" calls.\n\n\t\tlet messageRoute = msg[0];\n\t\tlet messageDate = msg[1];\n\t\tlet messageId = msg[2];\n\t\tlet type = msg[3];\n\n\t\tif (!this.publicProgram && this._clientRoutes.some(a => messageRoute.includes(a)) && !ws['doc_user'].roles.groups.some(a => a.views.some(b => messageRoute.includes(b) || b.includes(messageRoute))) && !ws['doc_user'].roles.super_admin) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (type === 'subscription') {\n\t\t\tlet subType = msg[4];\n\t\t\tlet pub = msg[5];\n\n\t\t\tif (subType === 'sub') {\n\t\t\t\tawait this._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t}\n\t\telse if (!this.publicProgram && type === 'offline') {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: 'ACK'\n\t\t\t};\n\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = msg[4];\n\n\t\t\tfor (let i = 0; i < offlineUpdates.length; i++) {\n\t\t\t\tlet update = offlineUpdates[i];\n\n\t\t\t\tlet data = update.data;\n\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tlet serverResMethod: ServerResponseModel = {\n\t\t\t\t\tmessageId: updateMessageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, serverResMethod);\n\t\t\t\t}\n\n\t\t\t\tif (method === 'insertDocument' && data[0] === 'driver-gps') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethod.call(Object.assign({}, this._methodManager, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), method, ...data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Offline Error', JSON.stringify(err, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(data[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Offline - Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.splice(this._offlineUpdates.map(a => a['id_socket']).indexOf(ws['id_socket']), 1);\n\t\t}\n\t\telse {\n\t\t\t// It's presumably a 'method' or something else\n\t\t\tlet dataCopy = [...msg];\n\n\t\t\tlet route = dataCopy.shift();\n\t\t\tlet date = dataCopy.shift();\n\t\t\tlet msgId = dataCopy.shift();\n\t\t\tlet msgType = dataCopy.shift();\n\t\t\t\n\t\t\tif (msgType === 'method') {\n\t\t\t\tlet methodName = dataCopy.shift();\n\n\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (methodName !== 'reportBuilderGetResults' && methodName !== 'reportBuilderGetDistinctValue' && methodName !== 'reportBuilderBuildTree' && methodName !== 'generatePDF' && methodName !== 'getWOOfflineData' && methodName !== 'countQuery' && methodName !== 'countWithQuery' && methodName !== 'countCollectionWithQuery' && methodName !== 'find' && methodName !== 'findOne' && methodName !== 'findWithOptions' && methodName !== 'getDrivers' && methodName !== 'processAirdropDistribution') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(dataCopy)) < 200000 ? JSON.stringify(dataCopy, null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(dataCopy)) < 200000 ? JSON.stringify(dataCopy, null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Immediately ACK\n\t\t\t\tlet ack: ServerResponseModel = {\n\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, ack);\n\t\t\t\t}\n\n\t\t\t\t// Check if we can offload to a worker\n\t\t\t\tlet worker = this.findAvailableWorker();\n\t\t\t\tif (this._isWorkersEnabled && \n\t\t\t\t\tworker &&\n\t\t\t\t\tmethodName !== 'find' &&\n\t\t\t\t\tmethodName !== 'insertDocument' &&\n\t\t\t\t\tmethodName !== 'countWithQuery' &&\n\t\t\t\t\tmethodName !== 'findOne' &&\n\t\t\t\t\tmethodName !== 'updateDocumentProps' &&\n\t\t\t\t\tmethodName !== 'findWithOptions' &&\n\t\t\t\t\tmethodName !== 'updateDocument' &&\n\t\t\t\t\tmethodName !== 'insertErrorLog' &&\n\t\t\t\t\tmethodName !== 'removeDocument' &&\n\t\t\t\t\tmethodName !== 'supportCreateBillingUser' &&\n\t\t\t\t\tmethodName !== 'getSignedUrl' &&\n\t\t\t\t\tmethodName !== 'getSignedUrls' &&\n\t\t\t\t\tmethodName !== 'getSignedUrlWithId' &&\n\t\t\t\t\tmethodName !== 'incorrectUser' &&\n\t\t\t\t\tmethodName !== 'reloadWS' &&\n\t\t\t\t\tmethodName !== 'reconnectWS' &&\n\t\t\t\t\tmethodName !== 'disconnectWS'\n\t\t\t\t) {\n\t\t\t\t\t// Offload to a worker\n\t\t\t\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\t\t\t\t// Store correlation so when worker finishes, we can respond\n\t\t\t\t\tthis._inFlightRequests[taskId] = {\n\t\t\t\t\t\tws,\n\t\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\t\tmethod: methodName\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.queueTask(taskId, methodName, dataCopy, {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// No worker available: do method locally\n\t\t\t\t\tawait this.callMethodLocally(ws, msgId, methodName, dataCopy);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * callMethodLocally is your old approach for invoking the method in-process.\n\t */\n\tprivate async callMethodLocally(ws: WebSocket, messageId: number, method: string, params: any[]) {\n\t\tlet serverRes: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: false,\n\t\t\tdata: null\n\t\t};\n\n\t\ttry {\n\t\t\t// You can keep your logging code (LogMethodLatencies, Logs.insertOne, etc.)\n\t\t\tlet result = await this._methodManager.callMethod.call(\n\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t}),\n\t\t\t\tmethod,\n\t\t\t\t...params\n\t\t\t);\n\n\t\t\tserverRes.data = result;\n\t\t}\n\t\tcatch (err) {\n\t\t\tserverRes.hasError = true;\n\t\t\tserverRes.data = err || 'Unknown error';\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t}\n\t}\n\n\t/**\n\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tprivate queueTask(taskId: string, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tthis._taskQueue.push({\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext\n\t\t});\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Try to assign tasks while we have them\n\t\tfor (let i = 0; i < 9999; i++) {\n\t\t\tlet item = this._taskQueue[0];\n\t\t\tif (!item) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlet w = this.findAvailableWorker();\n\t\t\tif (!w) {\n\t\t\t\tbreak; // no worker can take more tasks\n\t\t\t}\n\n\t\t\t// Remove from queue\n\t\t\tthis._taskQueue.shift();\n\t\t\tthis.assignTaskToWorker(w, item);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency. Or null if none.\n\t */\n\tprivate findAvailableWorker(): WorkerConnection | null {\n\t\tlet candidates = this._workers.filter(x => x.activeTasks < x.maxConcurrency);\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Sort by how busy they are\n\t\tcandidates.sort((a, b) => a.activeTasks - b.activeTasks);\n\t\treturn candidates[0];\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskQueueItem) {\n\t\tworker.activeTasks++;\n\n\t\tlet payload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext\n\t\t};\n\n\t\ttry {\n\t\t\tworker.ws.send(JSON.stringify(payload));\n\t\t\t// console.log('Assigned task', task.taskId, 'to worker', worker.id);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\t\t\tworker.activeTasks = Math.max(0, worker.activeTasks - 1);\n\t\t\t// Put task back at front\n\t\t\tthis._taskQueue.unshift(task);\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tprivate handleWorkerMessage(workerId: string, messageStr: string) {\n\t\tlet data: any;\n\t\ttry {\n\t\t\tdata = JSON.parse(messageStr, dateReviver);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to parse worker message:', messageStr);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet w = this._workers.find(x => x.id === workerId);\n\t\t\tif (!w) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tw.activeTasks = Math.max(0, w.activeTasks - 1);\n\n\t\t\tlet { taskId, error, message, result } = data;\n\n\t\t\t// Look up original request\n\t\t\tlet inflight = this._inFlightRequests[taskId];\n\t\t\tif (!inflight) {\n\t\t\t\tconsole.error('No in-flight request found for task:', taskId);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdelete this._inFlightRequests[taskId];\n\n\t\t\t\t// Send the final response to the client\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: inflight.messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = message;\n\t\t\t\t}\n\n\t\t\t\tif (inflight.ws && inflight.ws.readyState === inflight.ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(inflight.ws, res);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\t/**\n\t * Cleanly remove a client from the subscription manager, etc.\n\t */\n\tpublic async unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tawait this._subscriptionManager.unsubscribeAll(ws);\n\t\tws.removeAllListeners();\n\t\tws = null;\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n\n\tpublic getServerConfig() {\n\t\treturn ResolveIOServer.getServerConfig();\n\t}\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server-app.ts"],"names":["bodyParser","require","express","xmlParser","http_1","jwt","moment","WebSocket","log_collection_1","user_collection_1","cron_manager_1","method_manager_1","monitor_manager_1","subscription_manager_1","common_1","mongodb_1","auth_1","health_1","home_1","websocket_manager_1","resolveio_server_app_1","ResolveIOMainServer","this","_offlineUpdates","sesMail","standardProgram","publicProgram","_rebootFlag","_runningTasks","LOGGER","_clientRoutes","_lastErrorMsg","_debugMsgRecv","_debugMsgQueue","_isWorkersEnabled","_isWorkerInstance","_safeShutdown","_workers","_taskQueue","_inFlightRequests","create","resolveioMainServer","initialize","prototype","_this","initServerFlag","_serverStartTime","Date","_monitorManager","MonitorManager","_monitorManagerFunction","MonitorManagerFunction","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setInterval","_subscriptionManager","getEnableDebug","console","log","setTimeout","on","error","rej","__awaiter","diffTimeSec","diff","MongoNetworkTimeoutError","_methodManager","sendEmail","ResolveIOServer","getServerConfig","JSON","stringify","name","message","stack","_a","sent","exit","_serverHTTP","close","safeShutdown","MethodManager","_cronManager","CronManager","startWorkerInstance","_websocketManager","WebSocketManager","startServerInstance","SubscriptionManager","_serverWSS","listen","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_portHTTP","PORT_HTTP","_portWSS","PORT_WSS","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","wsUrl","ws","lastComm","interval","WORKER_INDEX","NODE_APP_INSTANCE","sendWorkerResponse","rawData","toString","msg","parse","e","type","handleIncomingTask","clearInterval","err","data","taskId","method","params","userContext","push","timedOut","timeoutHandle","callMethod","concat","managerThis","Object","assign","id_user","user","id_ws","call","apply","__spreadArray","__read","result","_b","clearTimeout","filter","a","err_1","payload","readyState","OPEN","send","getActiveMonitorFunctions","length","getMongoConnection","setImmediate","getIsWorkersEnabled","getIsWorkerInstance","getWSList","clients","forEach","getWSUserList","getHTTPServer","getCronManager","getMethodManager","getSubscriptionManager","getMonitorManager","getRebootFlag","getWebSocketManager","keepAliveTimeout","headersTimeout","Server","port","verifyClient","info","cb","token","url","includes","split","infoData","headers","origin","verify","decoded","Users","findById","fullname","readonly","workerId_1","objectIdHexString","id","activeTasks","maxConcurrency","lastComm_1","interval_1","handleWorkerMessage","w","addWebSocket","createLoggedInUser","unsubscribeWS","socketData","e_1","processSocketMessage","now","getTime","this_1","_e","__values","value","duration","asMilliseconds","loggedInLatency","Array","isArray","socketData_1","socketData_1_1","handleClientMessage","messageRoute","messageDate","messageId","some","roles","groups","views","b","super_admin","subType","pub","subscribe","slice","unsubscribe","serverRes","hasError","offlineUpdates","i","update","shift","updateMessageId","serverResMethod","getLocalLogManager","writeLog","_id","createdAt","collection","id_document","getBinarySize","route","Logs","insertOne","client","instance","instance_index","_methods","err_2","getMongoManager","invalidateQueryCache","splice","map","indexOf","dataCopy","msgId","methodName","ack","worker","findAvailableWorker","queueTask","callMethodLocally","err_3","dispatchQueue","item","assignTaskToWorker","candidates","x","sort","task","Math","max","unshift","workerId","messageStr","inflight","find","unsubscribeAll","removeAllListeners","getApp","exports"],"mappings":"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","file":"server-app.js","sourcesContent":["import * as bodyParser from 'body-parser';\nimport * as express from 'express';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport { createServer, Server } from 'http';\nimport * as jwt from 'jsonwebtoken';\nimport * as moment from 'moment-timezone';\nimport * as WebSocket from 'ws';\n\nimport { Logs } from './collections/log.collection';\nimport { Users } from './collections/user.collection';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { ServerResponseModel } from './models/server-response.model';\nimport { dateReviver, getBinarySize, objectIdHexString } from './util/common';\n\nimport { MongoNetworkTimeoutError } from 'mongodb';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\nimport { setupHomeRoutes } from './http/home';\n\nimport { WebSocketManager } from './managers/websocket.manager';\nimport { ResolveIOServer } from './resolveio-server-app';\n\ninterface WorkerConnection {\n\tid: string;\n\tws: WebSocket;\n\tactiveTasks: number;\n\tmaxConcurrency: number;\n}\n\ninterface TaskQueueItem {\n\ttaskId: string;\n\tmethod: string;\n\tparams: any[];\n\tuserContext?: { id_user?: string; user?: string; id_ws?: string };\n}\n\ninterface InFlightRequest {\n\tws: WebSocket; // the client's WebSocket\n\tmessageId: number; // the ID so the client knows which call this corresponds to\n\tmethod: string;\n}\n\nexport class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _serverHTTP: Server;\n\tprivate _portHTTP: string | number;\n\tprivate _serverWSS: WebSocket.Server;\n\tprivate _portWSS: number;\n\tprivate _offlineUpdates = [];\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\tprivate publicProgram = false;\n\tprivate _rebootFlag = false;\n\tprivate _runningTasks = [];\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _monitorManager: MonitorManager;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tprivate _debugMsgRecv = 0;\n\tprivate _debugMsgQueue = 0;\n\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate _safeShutdown = false;\n\n\tprivate _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskQueueItem[] = [];\n\tprivate _inFlightRequests: { [taskId: string]: InFlightRequest } = {};\n\n\tconstructor() {}\n\n\tpublic static create() {\n\t\tconst resolveioMainServer = new ResolveIOMainServer();\n\t\tresolveioMainServer.initialize();\n\t\treturn resolveioMainServer;\n\t}\n\n\tprivate initialize() {\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\tthis._monitorManager = new MonitorManager();\n\t\tthis._monitorManagerFunction = new MonitorManagerFunction();\n\n\t\t// Check for workers and decide what to start\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\tsetInterval(() => {\n\t\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);\n\t\t\t\tconsole.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);\n\t\t\t}\n\n\t\t\tthis._debugMsgQueue = 0;\n\t\t\tthis._debugMsgRecv = 0;\n\t\t}, 60000);\n\n\t\tlet initServerFlag = false;\n\n\t\tsetTimeout(() => {\n\t\t\tinitServerFlag = true;\n\t\t}, 5000);\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\t// Condition to filter out the MongoError with code 48 (NamespaceExists)\n\t\t\tif (error && error['name'] === 'MongoError' && error['code'] === 48) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tif (error && error['name'] === 'MongoServerError' && !initServerFlag) {\n\t\t\t\treturn; // Simply return without doing anything further\n\t\t\t}\n\n\t\t\tconsole.error(new Date(), 'Unhandled Rejection at Promise', [error, rej]);\n\t\t\t\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\t// If this is a MongoNetworkTimeoutError, handle it specifically\n\t\t\tif (error && (error['name'] === 'MongoNetworkTimeoutError' || error instanceof MongoNetworkTimeoutError)) {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t// Sending email notification (using your existing method)\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - MongoNetworkTimeoutError - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify({\n\t\t\t\t\t\tname: error['name'],\n\t\t\t\t\t\tmessage: error['message'],\n\t\t\t\t\t\tstack: error['stack']\n\t\t\t\t\t}, null, 2));\n\n\t\t\t\t\t// Exiting the process\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error) {\n\t\t\t\tif (error['name'] !== 'StatusError' && error['message'] !== '') {\n\t\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconsole.error(error, 'Uncaught Exception thrown');\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t}\n\t\t});\n\n\t\t//PM2 wants to reboot/restart\n\t\tprocess.on('SIGINT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGTERM', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tprocess.on('SIGQUIT', async () => {\n\t\t\tthis._rebootFlag = true;\n\t\t\tif (this._serverHTTP) {\n\t\t\t\tthis._serverHTTP.close();\n\t\t\t}\n\t\t\tawait this.safeShutdown();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tconsole.log('Running as a Worker instance');\n\t\t\t\tthis._methodManager = MethodManager.create(null, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._cronManager = CronManager.create();\n\t\t\t\tthis.startWorkerInstance();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('Running as a Server instance');\n\t\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\t\tthis.startServerInstance();\n\t\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\t\tthis.listen();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.log('Running with Workers Disabled');\n\t\t\tthis._websocketManager = WebSocketManager.create(this);\n\t\t\tthis.startServerInstance();\n\t\t\tthis._methodManager = MethodManager.create(this._websocketManager, this._monitorManagerFunction, this._isWorkersEnabled, this._isWorkerInstance);\n\t\t\tthis._subscriptionManager = SubscriptionManager.create(this._serverWSS, ResolveIOServer.getServerConfig(), this._monitorManagerFunction);\n\t\t\tthis._cronManager = CronManager.create();\n\t\t\tthis.listen();\n\t\t}\n\t}\n\n\tprivate startServerInstance() {\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._portHTTP = process.env.PORT_HTTP || ResolveIOServer.getServerConfig()['PORT_HTTP'] || 8080;\n\t\tthis._portWSS = process.env.PORT_WSS || ResolveIOServer.getServerConfig()['PORT_WSS'] || 8081;\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\tsetupHealthRoutes(this._app);\n\n\t\tif (ResolveIOServer.getServerConfig()['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, ResolveIOServer.getServerConfig());\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tprivate startWorkerInstance() {\n\t\tconsole.log(new Date(), 'Worker instance started, connecting to main server via WebSocket...');\n\n\t\tlet wsUrl = ResolveIOServer.getServerConfig()['SERVER_URL'] + '/websocket?workerToken=' + ResolveIOServer.getServerConfig()['WORKER_TOKEN'];\n\n\t\tconst ws = new WebSocket(wsUrl);\n\n\t\tlet lastComm = null;\n\t\tlet interval = null;\n\n\t\tws.on('open', () => {\n\t\t\tconsole.log(new Date(), 'Connected to main server as worker', process.env.WORKER_INDEX, process.env.NODE_APP_INSTANCE);\n\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\n\t\t\tinterval = setInterval(() => {\n\t\t\t\tif (!lastComm) {\n\t\t\t\t\tws.close();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlastComm = null;\n\t\t\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\t\t\t\t}\n\t\t\t}, 15000);\n\t\t});\n\n\t\tws.on('message', async (rawData: any) => {\n\t\t\t// console.log(new Date(), 'Message Recv', rawData);\n\n\t\t\tif (typeof rawData !== 'string') {\n\t\t\t\trawData = rawData.toString();\n\t\t\t}\n\n\t\t\t// console.log(new Date(), 'String Message Recv', rawData);\n\n\t\t\tif (rawData === 'ping') {\n\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\tthis.sendWorkerResponse(ws, 'pong');\n\t\t\t}\n\t\t\telse if (rawData === 'pong') {\n\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\tlastComm = new Date();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet msg: any;\n\t\t\t\ttry {\n\t\t\t\t\tmsg = JSON.parse(rawData, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch (e) {\n\t\t\t\t\tconsole.error('Worker parse error', e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// We expect: { type: 'task', taskId, method, params, userContext? }\n\t\t\t\tif (msg.type === 'task') {\n\t\t\t\t\tawait this.handleIncomingTask(ws, msg);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tws.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Disconnected from main server. Reconnecting in 5s...');\n\t\t\tsetTimeout(this.startWorkerInstance, 5000);\n\n\t\t\tif (interval) {\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t});\n\n\t\tws.on('error', (err) => {\n\t\t\tconsole.error(new Date(), 'Worker WS error:', err);\n\t\t\tws.close();\n\t\t});\n\t}\n\n\tprivate async handleIncomingTask(ws: WebSocket, data: any) {\n\t\tlet { taskId, method, params, userContext } = data;\n\t\tthis._runningTasks.push(taskId);\n\t\tif (!taskId || !method) {\n\t\t\tconsole.log('Invalid task message received', data);\n\t\t\treturn;\n\t\t}\n\n\t\tlet timedOut = false;\n\t\tlet timeoutHandle = setTimeout(async () => {\n\t\t\ttimedOut = true;\n\t\t\tconsole.error('Worker timed out on task:', taskId);\n\n\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\ttype: 'taskComplete',\n\t\t\t\ttaskId,\n\t\t\t\terror: true,\n\t\t\t\tmessage: 'Task timed out'\n\t\t\t});\n\n\t\t\tawait this._methodManager.callMethod('insertErrorLog', `Timeout in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t}, 120000);\n\n\t\ttry {\n\t\t\tlet managerThis = Object.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\tid_user: userContext?.id_user || '',\n\t\t\t\tuser: userContext?.user || '',\n\t\t\t\tid_ws: userContext?.id_ws || ''\n\t\t\t});\n\n\t\t\tlet result = await this._methodManager.callMethod.call(managerThis, method, ...params);\n\n\t\t\tif (!timedOut) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\t\ttype: 'taskComplete',\n\t\t\t\t\ttaskId,\n\t\t\t\t\terror: false,\n\t\t\t\t\tresult\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._runningTasks = this._runningTasks.filter(a => a !== taskId);\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (!timedOut) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\tconsole.error('Worker failed task:', taskId, err);\n\t\t\t\tthis.sendWorkerResponse(ws, {\n\t\t\t\t\ttype: 'taskComplete',\n\t\t\t\t\ttaskId,\n\t\t\t\t\terror: true,\n\t\t\t\t\tmessage: err || 'Unknown error'\n\t\t\t\t});\n\n\t\t\t}\n\t\t\t\n\t\t\tawait this._methodManager.callMethod('insertErrorLog', `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\t\t\t\n\t\t\tthis._runningTasks = this._runningTasks.filter(a => a !== taskId);\n\t\t}\n\t}\n\n\tprivate sendWorkerResponse(ws: WebSocket, payload: any) {\n\t\tif (typeof payload !== 'string') {\n\t\t\tpayload = JSON.stringify(payload);\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\ttry {\n\t\t\t\tws.send(payload);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tconsole.error('Failed to send worker response:', err);\n\t\t\t}\n\t\t}\n\t\telse if (ws) {\n\t\t\tws.close();\n\t\t}\n\t}\n\n\tprivate async safeShutdown() {\n\t\tif (!this._safeShutdown) {\n\t\t\tconsole.log(new Date(), 'Safe Shutdown Command Received');\n\t\t}\n\n\t\tif (\n\t\t\t!this._monitorManagerFunction.getActiveMonitorFunctions().length\n\t\t\t&& !this._offlineUpdates.length && !this._taskQueue.length && !this._runningTasks.length\n\t\t) {\n\t\t\tif (ResolveIOServer.getMongoConnection()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait ResolveIOServer.getMongoConnection().close(false);\n\t\t\t\t\tconsole.log(new Date(), 'Safe Exit Complete, Process Exit');\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tcatch { \n\t\t\t\t\tprocess.exit(1); \n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (!this._safeShutdown) {\n\t\t\t\tthis._safeShutdown = true;\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._safeShutdown = false;\n\t\t\t\t}, 1000);\n\n\t\t\t\tconsole.log(new Date(), 'Safe Exit In Progress', \n\t\t\t\t\tthis._monitorManagerFunction.getActiveMonitorFunctions().length,\n\t\t\t\t\tthis._offlineUpdates.length\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImmediate(async () => {\n\t\t\t\tawait this.safeShutdown();\n\t\t\t});\n\t\t}\n\t}\n\n\tgetIsWorkersEnabled() {\n\t\treturn this._isWorkersEnabled;\n\t}\n\n\tgetIsWorkerInstance() {\n\t\treturn this._isWorkerInstance;\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\t\tthis._serverWSS.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._serverHTTP;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tpublic getRebootFlag() {\n\t\treturn this._rebootFlag;\n\t}\n\n\tpublic getWebSocketManager(): WebSocketManager {\n\t\treturn this._websocketManager;\n\t}\n\n\tprivate createServer(): void {\n\t\tthis._serverHTTP = createServer(this._app);\n\t\tthis._serverHTTP.keepAliveTimeout = 65000;\n\t\tthis._serverHTTP.headersTimeout = 66000;\n\n\t\tthis._serverWSS = new WebSocket.Server({\n\t\t\tport: this._portWSS,\n\t\t\tverifyClient: this.publicProgram ? null : (info, cb) => {\n\t\t\t\tif (this._rebootFlag) {\n\t\t\t\t\tcb(false, 409, 'Unable To Process');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If it's a worker, we might skip token checks or do a simple check:\n\t\t\t\t\tif (info.req.url && info.req.url.includes('workerToken=')) {\n\t\t\t\t\t\tlet urlParts = info.req.url.split('workerToken='); \n\t\t\t\t\t\tlet workerToken = urlParts[1] || '';\n\n\t\t\t\t\t\tif (workerToken === ResolveIOServer.getServerConfig()['WORKER_TOKEN']) {\n\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tinfo.origin !== ResolveIOServer.getServerConfig()['ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['SEC_ROOT_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_URL']\n\t\t\t\t\t\t&& info.origin !== ResolveIOServer.getServerConfig()['RESOLVEIO_SECONDARY_URL']\n\t\t\t\t\t) {\n\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, ResolveIOServer.getServerConfig()['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Listen for connections from clients or workers.\n\t */\n\tprivate listen(): void {\n\t\tthis._serverHTTP.listen(this._portHTTP, () => {\n\t\t\tconsole.log('Running server on port %s', this._portHTTP);\n\t\t});\n\n\t\tthis._serverWSS.on('listening', () => {\n\t\t\tconsole.log('Running server on port %s', this._portWSS);\n\t\t});\n\n\t\tthis._serverWSS.on('connection', async (ws, req) => {\n\t\t\tif (req.url && req.url.includes('workerToken=')) {\n\t\t\t\t// It's a WORKER\n\t\t\t\tlet workerId = objectIdHexString();\n\t\t\t\tws['id_worker'] = workerId;\n\n\t\t\t\t// For demonstration, let each worker handle up to 2 tasks concurrently\n\t\t\t\tlet maxConcurrency = 2;\n\n\t\t\t\tthis._workers.push({\n\t\t\t\t\tid: workerId,\n\t\t\t\t\tws: ws,\n\t\t\t\t\tactiveTasks: 0,\n\t\t\t\t\tmaxConcurrency: maxConcurrency\n\t\t\t\t});\n\n\t\t\t\tlet interval = null;\n\t\t\t\tlet lastComm = null;\n\n\t\t\t\tws.on('open', () => {\n\t\t\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\t\n\t\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\t\tif (!lastComm) {\n\t\t\t\t\t\t\tws.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tlastComm = null;\n\t\t\t\t\t\t\tthis.sendWorkerResponse(ws, 'ping');\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 15000);\n\t\t\t\t});\n\n\t\t\t\tconsole.log(new Date(), 'Worker connected:', workerId);\n\n\t\t\t\tws.on('message', (message: any) => {\n\t\t\t\t\t// console.log(new Date(), 'Message Recv', message);\n\n\t\t\t\t\tif (typeof message !== 'string') {\n\t\t\t\t\t\tmessage = message.toString();\n\t\t\t\t\t}\n\n\t\t\t\t\t// console.log(new Date(), 'String Message Recv', message);\n\n\t\t\t\t\tif (message === 'ping') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tthis.sendWorkerResponse(ws, 'pong');\n\t\t\t\t\t}\n\t\t\t\t\telse if (message === 'pong') {\n\t\t\t\t\t\t// console.log(new Date(), 'Recv Ping, Sending Pong');\n\t\t\t\t\t\tlastComm = new Date();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.handleWorkerMessage(workerId, message);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('close', () => {\n\t\t\t\t\tconsole.log(new Date(), 'Worker disconnected:', workerId);\n\t\t\t\t\tthis._workers = this._workers.filter(w => w.id !== workerId);\n\t\t\t\t\t\n\t\t\t\t\tif (interval) {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tws.on('error', (error) => {\n\t\t\t\t\tconsole.error('Error on WS Worker', error);\n\t\t\t\t\tws.close();\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Normal client\n\t\t\t\tws['id_socket'] = objectIdHexString();\n\t\t\t\tws['id_user'] = req['id_user'];\n\t\t\t\tws['user'] = req['user'];\n\t\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\t\tws['doc_user'] = req['doc_user'];\n\n\t\t\t\tthis._websocketManager.addWebSocket(ws);\n\n\t\t\t\tawait this._subscriptionManager.createLoggedInUser(ws['id_socket']);\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.send('ping', async (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, 5000);\n\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Connection from user: ' + req['user']);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tws['isAlive'] = true;\n\t\t\t\tws['retryCnt'] = 0;\n\n\t\t\t\tws.on('message', async (message: string) => {\n\t\t\t\t\tthis._debugMsgRecv += 1;\n\t\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\tawait this._methodManager.sendEmail(\n\t\t\t\t\t\t\t'dev@resolveio.com', \n\t\t\t\t\t\t\t'SERVER - JSON Parse Error - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], \n\t\t\t\t\t\t\tJSON.stringify([message, e])\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// call our existing processSocketMessage\n\t\t\t\t\tawait this.processSocketMessage(ws, socketData);\n\t\t\t\t})\n\t\t\t\t.on('end', () => {\n\t\t\t\t\tws.close();\n\t\t\t\t})\n\t\t\t\t.on('error', () => {\n\t\t\t\t\tws.close()\n\t\t\t\t})\n\t\t\t\t.on('close', async () => {\n\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Keep alive timer\n\t\tsetInterval(async () => {\n\t\t\tfor (let ws of this._serverWSS.clients) {\n\t\t\t\tif (ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= 20000) {\n\t\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\t\tws['retryCnt']++;\n\t\t\t\t\t\tif (ws['retryCnt'] >= 3) {\n\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\t\tws.send('ping', async (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tws.send('ping', async (error) => {\n\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\tif (this._subscriptionManager.getEnableDebug()) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Server App', 'Error WS Ping');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tawait this.unsubscribeWS(ws);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 20000);\n\t}\n\n\tprivate async processSocketMessage(ws: WebSocket, socketData: any) {\n\t\tif (typeof socketData === 'string' && socketData === 'ping') {\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tws.send('pong');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\telse if (typeof socketData === 'string' && socketData === 'pong') {\n\t\t\tws['isAlive'] = true;\n\t\t\tws['pongTime'] = new Date();\n\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\treturn;\n\t\t}\n\n\t\t// If the top level is not an array, let's skip\n\t\tif (!Array.isArray(socketData[0])) {\n\t\t\tconsole.log('Invalid message format (expected array of arrays)', socketData);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle each sub-message\n\t\tfor (let message of socketData) {\n\t\t\tawait this.handleClientMessage(ws, message);\n\t\t}\n\t}\n\n\tprivate async handleClientMessage(ws: WebSocket, msg: any[]): Promise<void> {\n\t\t// This is basically your old logic from processSocketMessage,\n\t\t// but we'll insert our worker-queue logic for \"method\" calls.\n\n\t\tlet messageRoute = msg[0];\n\t\tlet messageDate = msg[1];\n\t\tlet messageId = msg[2];\n\t\tlet type = msg[3];\n\n\t\tif (!this.publicProgram && this._clientRoutes.some(a => messageRoute.includes(a)) && !ws['doc_user'].roles.groups.some(a => a.views.some(b => messageRoute.includes(b) || b.includes(messageRoute))) && !ws['doc_user'].roles.super_admin) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (type === 'subscription') {\n\t\t\tlet subType = msg[4];\n\t\t\tlet pub = msg[5];\n\n\t\t\tif (subType === 'sub') {\n\t\t\t\tawait this._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, msg.slice(6));\n\t\t\t}\n\t\t}\n\t\telse if (!this.publicProgram && type === 'offline') {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: 'ACK'\n\t\t\t};\n\n\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.push(ws);\n\t\t\tlet offlineUpdates = msg[4];\n\n\t\t\tfor (let i = 0; i < offlineUpdates.length; i++) {\n\t\t\t\tlet update = offlineUpdates[i];\n\n\t\t\t\tlet data = update.data;\n\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateRoute = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateDate = data.shift();\n\t\t\t\tlet updateMessageId = data.shift();\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\tlet updateType = data.shift();\n\t\t\t\tlet method = data.shift();\n\n\t\t\t\tlet serverResMethod: ServerResponseModel = {\n\t\t\t\t\tmessageId: updateMessageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, serverResMethod);\n\t\t\t\t}\n\n\t\t\t\tif (method === 'insertDocument' && data[0] === 'driver-gps') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._methodManager.callMethod.call(Object.assign({}, this._methodManager, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), method, ...data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Offline Error', JSON.stringify(err, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(data[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log('Offline - Could not find method: ' + method);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._offlineUpdates.splice(this._offlineUpdates.map(a => a['id_socket']).indexOf(ws['id_socket']), 1);\n\t\t}\n\t\telse {\n\t\t\t// It's presumably a 'method' or something else\n\t\t\tlet dataCopy = [...msg];\n\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet route = dataCopy.shift();\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tlet date = dataCopy.shift();\n\t\t\tlet msgId = dataCopy.shift();\n\t\t\tlet msgType = dataCopy.shift();\n\t\t\t\n\t\t\tif (msgType === 'method') {\n\t\t\t\tlet methodName = dataCopy.shift();\n\n\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (methodName !== 'reportBuilderGetResults' && methodName !== 'reportBuilderGetDistinctValue' && methodName !== 'reportBuilderBuildTree' && methodName !== 'generatePDF' && methodName !== 'getWOOfflineData' && methodName !== 'countQuery' && methodName !== 'countWithQuery' && methodName !== 'countCollectionWithQuery' && methodName !== 'find' && methodName !== 'findOne' && methodName !== 'findWithOptions' && methodName !== 'getDrivers' && methodName !== 'processAirdropDistribution') {\n\t\t\t\t\tif (\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t\t\t\t) {\n\t\t\t\t\t\tResolveIOServer.getLocalLogManager().writeLog({\n\t\t\t\t\t\t\ttype: 'log',\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(dataCopy)) < 200000 ? JSON.stringify(dataCopy, null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait Logs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(dataCopy)) < 200000 ? JSON.stringify(dataCopy, null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: methodName,\n\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\troute: messageRoute,\n\t\t\t\t\t\t\tclient: 'ResolveIO',\n\t\t\t\t\t\t\tinstance: 'backend.resolveio.com',\n\t\t\t\t\t\t\tinstance_index: process.env.NODE_APP_INSTANCE || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Immediately ACK\n\t\t\t\tlet ack: ServerResponseModel = {\n\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: 'ACK'\n\t\t\t\t};\n\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(ws, ack);\n\t\t\t\t}\n\n\t\t\t\t// Check if we can offload to a worker\n\t\t\t\tlet worker = this.findAvailableWorker();\n\t\t\t\tif (this._isWorkersEnabled && \n\t\t\t\t\tworker &&\n\t\t\t\t\tmethodName !== 'find' &&\n\t\t\t\t\tmethodName !== 'insertDocument' &&\n\t\t\t\t\tmethodName !== 'countWithQuery' &&\n\t\t\t\t\tmethodName !== 'findOne' &&\n\t\t\t\t\tmethodName !== 'updateDocumentProps' &&\n\t\t\t\t\tmethodName !== 'findWithOptions' &&\n\t\t\t\t\tmethodName !== 'updateDocument' &&\n\t\t\t\t\tmethodName !== 'insertErrorLog' &&\n\t\t\t\t\tmethodName !== 'removeDocument' &&\n\t\t\t\t\tmethodName !== 'supportCreateBillingUser' &&\n\t\t\t\t\tmethodName !== 'getSignedUrl' &&\n\t\t\t\t\tmethodName !== 'getSignedUrls' &&\n\t\t\t\t\tmethodName !== 'getSignedUrlWithId' &&\n\t\t\t\t\tmethodName !== 'incorrectUser' &&\n\t\t\t\t\tmethodName !== 'reloadWS' &&\n\t\t\t\t\tmethodName !== 'reconnectWS' &&\n\t\t\t\t\tmethodName !== 'disconnectWS'\n\t\t\t\t) {\n\t\t\t\t\t// Offload to a worker\n\t\t\t\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\t\t\t\t// Store correlation so when worker finishes, we can respond\n\t\t\t\t\tthis._inFlightRequests[taskId] = {\n\t\t\t\t\t\tws,\n\t\t\t\t\t\tmessageId: msgId,\n\t\t\t\t\t\tmethod: methodName\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.queueTask(taskId, methodName, dataCopy, {\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// No worker available: do method locally\n\t\t\t\t\tawait this.callMethodLocally(ws, msgId, methodName, dataCopy);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * callMethodLocally is your old approach for invoking the method in-process.\n\t */\n\tprivate async callMethodLocally(ws: WebSocket, messageId: number, method: string, params: any[]) {\n\t\tlet serverRes: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: false,\n\t\t\tdata: null\n\t\t};\n\n\t\ttry {\n\t\t\t// You can keep your logging code (LogMethodLatencies, Logs.insertOne, etc.)\n\t\t\tlet result = await this._methodManager.callMethod.call(\n\t\t\t\tObject.assign({}, this._methodManager, MethodManager.prototype, {\n\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\tuser: ws['user'],\n\t\t\t\t\tid_ws: ws['id_socket']\n\t\t\t\t}),\n\t\t\t\tmethod,\n\t\t\t\t...params\n\t\t\t);\n\n\t\t\tserverRes.data = result;\n\t\t}\n\t\tcatch (err) {\n\t\t\tserverRes.hasError = true;\n\t\t\tserverRes.data = err || 'Unknown error';\n\t\t}\n\n\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\tthis._websocketManager.send(ws, serverRes);\n\t\t}\n\t}\n\n\t/**\n\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tprivate queueTask(taskId: string, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tthis._taskQueue.push({\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext\n\t\t});\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Try to assign tasks while we have them\n\t\tfor (let i = 0; i < 9999; i++) {\n\t\t\tlet item = this._taskQueue[0];\n\t\t\tif (!item) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlet w = this.findAvailableWorker();\n\t\t\tif (!w) {\n\t\t\t\tbreak; // no worker can take more tasks\n\t\t\t}\n\n\t\t\t// Remove from queue\n\t\t\tthis._taskQueue.shift();\n\t\t\tthis.assignTaskToWorker(w, item);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency. Or null if none.\n\t */\n\tprivate findAvailableWorker(): WorkerConnection | null {\n\t\tlet candidates = this._workers.filter(x => x.activeTasks < x.maxConcurrency);\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Sort by how busy they are\n\t\tcandidates.sort((a, b) => a.activeTasks - b.activeTasks);\n\t\treturn candidates[0];\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskQueueItem) {\n\t\tworker.activeTasks++;\n\n\t\tlet payload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext\n\t\t};\n\n\t\ttry {\n\t\t\tworker.ws.send(JSON.stringify(payload));\n\t\t\t// console.log('Assigned task', task.taskId, 'to worker', worker.id);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\t\t\tworker.activeTasks = Math.max(0, worker.activeTasks - 1);\n\t\t\t// Put task back at front\n\t\t\tthis._taskQueue.unshift(task);\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tprivate handleWorkerMessage(workerId: string, messageStr: string) {\n\t\tlet data: any;\n\t\ttry {\n\t\t\tdata = JSON.parse(messageStr, dateReviver);\n\t\t}\n\t\tcatch {\n\t\t\tconsole.error('Failed to parse worker message:', messageStr);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet w = this._workers.find(x => x.id === workerId);\n\t\t\tif (!w) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tw.activeTasks = Math.max(0, w.activeTasks - 1);\n\n\t\t\tlet { taskId, error, message, result } = data;\n\n\t\t\t// Look up original request\n\t\t\tlet inflight = this._inFlightRequests[taskId];\n\t\t\tif (!inflight) {\n\t\t\t\tconsole.error('No in-flight request found for task:', taskId);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdelete this._inFlightRequests[taskId];\n\n\t\t\t\t// Send the final response to the client\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: inflight.messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = message;\n\t\t\t\t}\n\n\t\t\t\tif (inflight.ws && inflight.ws.readyState === inflight.ws.OPEN) {\n\t\t\t\t\tthis._websocketManager.send(inflight.ws, res);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\t/**\n\t * Cleanly remove a client from the subscription manager, etc.\n\t */\n\tpublic async unsubscribeWS(ws: WebSocket) {\n\t\tif (this._subscriptionManager && this._subscriptionManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);\n\t\t}\n\t\tawait this._subscriptionManager.unsubscribeAll(ws);\n\t\tws.removeAllListeners();\n\t\tws = null;\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n\n\tpublic getServerConfig() {\n\t\treturn ResolveIOServer.getServerConfig();\n\t}\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/schema-report-builder.ts"],"names":["resolveio_server_app_1","require","common_1","getReportLookupSchemas","collection_root","lookupTrees","schemaObj","push","collection_name","tree","ResolveIOServer","getMongoManager","collection","is_root","Object","keys","forEach","field","collectionName_1","lookup_collection","collectionModel","filter","a","length","buildTree","current_root","schemaTree","lookup","res","key","treeItemSplit","child_1","split","rbType","columnName","toTitleCase","replace","fieldName","fieldType","fieldTypeName","distinctFieldValues","fieldPath","lookup_as","fieldPathName","lookup_local_key","local_key","lookup_foreign_key","lookup_key","text","value","isLeaf","isActive","isSelected","depth","leafValueType","leafValueTypes","getLeafValueTypes","leafFormatType","leafFormatTypes","getLeafFormatTypes","children","sort","b","localeCompare","layer","index","find","leafTypes","mongoCommand","commandstr","obj","count","query","$ne","getMainDB","command","tmpObj","_a","sent","distinct","values","exports"],"mappings":"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","file":"schema-report-builder.js","sourcesContent":["import { ResolveIOServer } from '../resolveio-server-app';\nimport { CollectionTree } from '../models/report-builder.model';\nimport { toTitleCase } from './common';\n\nexport function getReportLookupSchemas(collection_root: string) {\n\tlet lookupTrees: CollectionTree[] = [];\n\tlookupTrees.push({ collection_name: collection_root, tree: ResolveIOServer.getMongoManager().collection(collection_root)['rbSchema'], is_root: true });\n\tlet schemaObj = ResolveIOServer.getMongoManager().collection(collection_root)['rbSchema'];\n\tlet modelKeys = Object.keys(schemaObj);\n\tmodelKeys.forEach(field => {\n\t\tif (schemaObj[field].lookup_collection) {\n\t\t\tlet collectionName = schemaObj[field].lookup_collection;\n\t\t\tlet collectionModel = ResolveIOServer.getMongoManager().collection(collectionName);\n\n\t\t\tif (!lookupTrees.filter(a => a.collection_name === collectionName).length) {\n\t\t\t\tlookupTrees.push({ collection_name: collectionName, tree: collectionModel['rbSchema'], is_root: false });\n\t\t\t}\n\t\t}\n\t});\n\n\treturn lookupTrees;\n}\n\nexport function buildTree(current_root, schemaTree, lookup?) {\n\tlet res = [];\n\n\tObject.keys(schemaTree).filter(a => a !== '_id' && a !== 'id' && a !== '__v').forEach(key => {\n\t// Object.keys(schemaTree).filter(a => a !== '__v').forEach(key => {\n\t\tif (!lookup || (lookup && !schemaTree[key].lookup_collection)) {\n\t\t\tlet treeItemSplit = key.split('.');\n\t\t\n\t\t\t// debugger;\n\n\t\t\tif (treeItemSplit.length === 1) {\n\t\t\t\tif (schemaTree[key].rbType === 'String' || schemaTree[key].rbType === 'Number' || schemaTree[key].rbType === 'Boolean' || schemaTree[key].rbType === 'Date') {\n\t\t\t\t\tres.push({\n\t\t\t\t\t\tcollection_name: current_root,\n\t\t\t\t\t\tcolumnName: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\tfieldName: key,\n\t\t\t\t\t\tfieldType: schemaTree[key].rbType,\n\t\t\t\t\t\tfieldTypeName: schemaTree[key].rbType === 'String' ? 'Text' : (schemaTree[key].rbType === 'Boolean' ? 'T/F' : schemaTree[key].rbType),\n\t\t\t\t\t\tdistinctFieldValues: [],\n\t\t\t\t\t\tfieldPath: lookup ? lookup.lookup_as + '.$.' + key : key,\n\t\t\t\t\t\tfieldPathName: lookup ? (toTitleCase(lookup.lookup_as.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) + ' (List) -> ' + (toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) : toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> ')),\n\t\t\t\t\t\tlookup_collection: lookup ? lookup.lookup_collection : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_collection : ''),\n\t\t\t\t\t\tlookup_local_key: lookup ? lookup.lookup_local_key : (schemaTree[key].lookup_collection ? schemaTree[key].local_key : ''),\n\t\t\t\t\t\tlookup_foreign_key: lookup ? lookup.lookup_foreign_key : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_key : ''),\n\t\t\t\t\t\tlookup_as: lookup ? lookup.lookup_as : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_as : ''),\n\t\t\t\t\t\ttext: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\tvalue: key,\n\t\t\t\t\t\tisLeaf: true,\n\t\t\t\t\t\tisActive: false,\n\t\t\t\t\t\tisSelected: false,\n\t\t\t\t\t\tdepth: 0,\n\t\t\t\t\t\tleafValueType: '',\n\t\t\t\t\t\tleafValueTypes: getLeafValueTypes(schemaTree[key], key),\n\t\t\t\t\t\tleafFormatType: '',\n\t\t\t\t\t\tleafFormatTypes: getLeafFormatTypes(schemaTree[key], key)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tres.push({\n\t\t\t\t\t\tcollection_name: current_root,\n\t\t\t\t\t\tcolumnName: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\tfieldName: key,\n\t\t\t\t\t\tfieldType: schemaTree[key].lookup_collection ? 'Lookup' : schemaTree[key].rbType,\n\t\t\t\t\t\tfieldTypeName: schemaTree[key].lookup_collection ? 'Lookup' : (schemaTree[key].rbType === 'Array' ? 'List' : 'Group'),\n\t\t\t\t\t\tdistinctFieldValues: [],\n\t\t\t\t\t\tfieldPath: lookup ? lookup.lookup_as + '.$.' + key : key,\n\t\t\t\t\t\tfieldPathName: lookup ? (toTitleCase(lookup.lookup_as.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) + ' (List) -> ' + (toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) : toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> ')),\n\t\t\t\t\t\tlookup_collection: lookup ? lookup.lookup_collection : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_collection : ''),\n\t\t\t\t\t\tlookup_local_key: lookup ? lookup.lookup_local_key : (schemaTree[key].lookup_collection ? schemaTree[key].local_key : ''),\n\t\t\t\t\t\tlookup_foreign_key: lookup ? lookup.lookup_foreign_key : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_key : ''),\n\t\t\t\t\t\tlookup_as: lookup ? lookup.lookup_as : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_as : ''),\n\t\t\t\t\t\ttext: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\tvalue: key,\n\t\t\t\t\t\tisLeaf: false,\n\t\t\t\t\t\tisActive: false,\n\t\t\t\t\t\tisSelected: false,\n\t\t\t\t\t\tdepth: 0,\n\t\t\t\t\t\tleafValueType: '',\n\t\t\t\t\t\tleafFormatType: '',\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tres = res.sort((a, b) => a.fieldName.localeCompare(b.fieldName));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet child = null;\n\n\t\t\t\ttreeItemSplit.forEach((layer, index) => {\n\t\t\t\t\tif (!child) {\n\t\t\t\t\t\tchild = res.find(a => a.fieldName === layer);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (child.children.find(a => a.fieldName === layer)) {\n\t\t\t\t\t\t\tchild = child.children.find(a => a.fieldName === layer);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (schemaTree[key].rbType === 'String' || schemaTree[key].rbType === 'Number' || schemaTree[key].rbType === 'Boolean' || schemaTree[key].rbType === 'Date') {\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tchild.children.push({\n\t\t\t\t\t\t\t\t\tcollection_name: current_root,\n\t\t\t\t\t\t\t\t\tcolumnName: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\t\t\t\tfieldName: layer,\n\t\t\t\t\t\t\t\t\tfieldType: schemaTree[key].rbType,\n\t\t\t\t\t\t\t\t\tfieldTypeName: schemaTree[key].rbType === 'String' ? 'Text' : (schemaTree[key].rbType === 'Boolean' ? 'T/F' : schemaTree[key].rbType),\n\t\t\t\t\t\t\t\t\tdistinctFieldValues: [],\n\t\t\t\t\t\t\t\t\tfieldPath: lookup ? lookup.lookup_as + '.$.' + key : key,\n\t\t\t\t\t\t\t\t\tfieldPathName: lookup ? (toTitleCase(lookup.lookup_as.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) + ' (List) -> ' + (toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) : toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> ')),\n\t\t\t\t\t\t\t\t\tlookup_collection: lookup ? lookup.lookup_collection : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_collection : ''),\n\t\t\t\t\t\t\t\t\tlookup_local_key: lookup ? lookup.lookup_local_key : (schemaTree[key].lookup_collection ? schemaTree[key].local_key : ''),\n\t\t\t\t\t\t\t\t\tlookup_foreign_key: lookup ? lookup.lookup_foreign_key : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_key : ''),\n\t\t\t\t\t\t\t\t\tlookup_as: lookup ? lookup.lookup_as : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_as : ''),\n\t\t\t\t\t\t\t\t\ttext: toTitleCase(layer.replace(/\\_/g, ' ')),\n\t\t\t\t\t\t\t\t\tvalue: layer,\n\t\t\t\t\t\t\t\t\tisLeaf: true,\n\t\t\t\t\t\t\t\t\tisActive: false,\n\t\t\t\t\t\t\t\t\tisSelected: false,\n\t\t\t\t\t\t\t\t\tdepth: index,\n\t\t\t\t\t\t\t\t\tleafValueType: '',\n\t\t\t\t\t\t\t\t\tleafValueTypes: getLeafValueTypes(schemaTree[key], key),\n\t\t\t\t\t\t\t\t\tleafFormatType: '',\n\t\t\t\t\t\t\t\t\tleafFormatTypes: getLeafFormatTypes(schemaTree[key], key)\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tchild.children.push({\n\t\t\t\t\t\t\t\t\tcollection_name: current_root,\n\t\t\t\t\t\t\t\t\tcolumnName: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\t\t\t\tfieldName: layer,\n\t\t\t\t\t\t\t\t\tfieldType: schemaTree[key].lookup_collection ? 'Lookup' : schemaTree[key].rbType,\n\t\t\t\t\t\t\t\t\tfieldTypeName: schemaTree[key].lookup_collection ? 'Lookup' : (schemaTree[key].rbType === 'Array' ? 'List' : 'Group'),\n\t\t\t\t\t\t\t\t\tdistinctFieldValues: [],\n\t\t\t\t\t\t\t\t\tfieldPath: lookup ? lookup.lookup_as + '.$.' + key : key,\n\t\t\t\t\t\t\t\t\tfieldPathName: lookup ? (toTitleCase(lookup.lookup_as.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) + ' (List) -> ' + (toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) : toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> ')),\n\t\t\t\t\t\t\t\t\tlookup_collection: lookup ? lookup.lookup_collection : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_collection : ''),\n\t\t\t\t\t\t\t\t\tlookup_local_key: lookup ? lookup.lookup_local_key : (schemaTree[key].lookup_collection ? schemaTree[key].local_key : ''),\n\t\t\t\t\t\t\t\t\tlookup_foreign_key: lookup ? lookup.lookup_foreign_key : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_key : ''),\n\t\t\t\t\t\t\t\t\tlookup_as: lookup ? lookup.lookup_as : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_as : ''),\n\t\t\t\t\t\t\t\t\ttext: toTitleCase(layer.replace(/\\_/g, ' ')),\n\t\t\t\t\t\t\t\t\tvalue: layer,\n\t\t\t\t\t\t\t\t\tisLeaf: false,\n\t\t\t\t\t\t\t\t\tisActive: false,\n\t\t\t\t\t\t\t\t\tisSelected: false,\n\t\t\t\t\t\t\t\t\tdepth: index,\n\t\t\t\t\t\t\t\t\tleafValueType: '',\n\t\t\t\t\t\t\t\t\tleafFormatType: '',\n\t\t\t\t\t\t\t\t\tchildren: []\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tchild.children = child.children.sort((a, b) => a.fieldName.localeCompare(b.fieldName));\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\treturn res;\n}\n\nexport function getLeafValueTypes(schemaTree, fieldPath) {\n\tlet leafTypes = [];\n\n\tif (schemaTree.rbType === 'String') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Value',\n\t\t\t\tvalue: 'Value'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Unique',\n\t\t\t\tvalue: 'Unique'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Count',\n\t\t\t\tvalue: 'Count'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'First',\n\t\t\t\tvalue: 'First'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Last',\n\t\t\t\tvalue: 'Last'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Number') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Value',\n\t\t\t\tvalue: 'Value'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Unique',\n\t\t\t\tvalue: 'Unique'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Average',\n\t\t\t\tvalue: 'Average'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Count',\n\t\t\t\tvalue: 'Count'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Sum',\n\t\t\t\tvalue: 'Sum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Minimum',\n\t\t\t\tvalue: 'Minimum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Maximum',\n\t\t\t\tvalue: 'Maximum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'First',\n\t\t\t\tvalue: 'First'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Last',\n\t\t\t\tvalue: 'Last'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Boolean') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Value',\n\t\t\t\tvalue: 'Value'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Unique',\n\t\t\t\tvalue: 'Unique'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Count',\n\t\t\t\tvalue: 'Count'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'First',\n\t\t\t\tvalue: 'First'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Last',\n\t\t\t\tvalue: 'Last'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Date') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Value',\n\t\t\t\tvalue: 'Value'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Unique',\n\t\t\t\tvalue: 'Unique'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Count',\n\t\t\t\tvalue: 'Count'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Minimum',\n\t\t\t\tvalue: 'Minimum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Maximum',\n\t\t\t\tvalue: 'Maximum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'First',\n\t\t\t\tvalue: 'First'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Last',\n\t\t\t\tvalue: 'Last'\n\t\t\t}\n\t\t];\n\t}\n\treturn leafTypes;\n}\n\nexport function getLeafFormatTypes(schemaTree, fieldPath) {\n\tlet leafTypes = [];\n\n\tif (schemaTree.rbType === 'String') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Text',\n\t\t\t\tvalue: 'String'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Number',\n\t\t\t\tvalue: 'Number'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Number') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Number',\n\t\t\t\tvalue: 'Number'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Currency',\n\t\t\t\tvalue: 'Currency'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Text',\n\t\t\t\tvalue: 'String'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Boolean') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Number',\n\t\t\t\tvalue: 'Number'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Boolean (True/False)',\n\t\t\t\tvalue: 'Boolean'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Text (Yes/No)',\n\t\t\t\tvalue: 'String'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Number (1/0)',\n\t\t\t\tvalue: 'Boolean_Number'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Date') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Number',\n\t\t\t\tvalue: 'Number'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Date (Short Format)',\n\t\t\t\tvalue: 'Date'\n\t\t\t}, \n\t\t\t{\n\t\t\t\ttext: 'As Time (Short Format)',\n\t\t\t\tvalue: 'Time'\n\t\t\t}, \n\t\t\t{\n\t\t\t\ttext: 'As Date/Time (Short Format)',\n\t\t\t\tvalue: 'DateTime'\n\t\t\t}, \n\t\t\t{\n\t\t\t\ttext: 'As Date (Long Format)',\n\t\t\t\tvalue: 'Date_long'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Date/Time (Long Format)',\n\t\t\t\tvalue: 'DateTime_long'\n\t\t\t}, \n\t\t\t{\n\t\t\t\ttext: 'As Timestamp (MS since 1970)',\n\t\t\t\tvalue: 'Timestamp'\n\t\t\t}\n\t\t];\n\t}\n\treturn leafTypes;\n}\n\n\n\n\n\nexport async function mongoCommand(commandstr: string, collection: string, field?: any) {\n\tlet tmpObj;\n\ttry {\n\t\t// Count the number of non-empty fields in a given collection:\n\t\tif (commandstr === 'count') {\n\t\t\tlet obj = {\n\t\t\t\tcount: collection,\n\t\t\t\tquery: {}\n\t\t\t};\n\t\t\tobj.query[field] = {$ne: null};\n\t\t\ttmpObj = await ResolveIOServer.getMainDB().command(obj);\n\t\t}\n\t\t// Get all distinct values in a given field.\n\t\telse if (commandstr === 'distinct') {\n\t\t\tlet obj = {\n\t\t\t\tdistinct: collection,\n\t\t\t\tquery: {},\n\t\t\t\tkey: field,\n\t\t\t};\n\t\t\ttmpObj = await ResolveIOServer.getMainDB().command(obj);\n\t\t}\n\t\telse if (commandstr === 'listIndexes') {\n\t\t\t// tmpObj = await this.mainDb.db[collection].getIndexes();\n\t\t\t// let obj = { 'listIndexes': collection };\n\t\t\t// tmpObj = await this.mainDb.db.getIndexes(obj);\n\t\t}\n\t} catch (err) {\n\t\t// console.log('----------- mongoCommand err: ', err);\n\t\treturn -1;\n\t}\n\tif (tmpObj) {\n\t\treturn tmpObj.values;\n\t}\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/util/schema-report-builder.ts"],"names":["resolveio_server_app_1","require","common_1","getReportLookupSchemas","collection_root","lookupTrees","schemaObj","push","collection_name","tree","ResolveIOServer","getMongoManager","collection","is_root","Object","keys","forEach","field","collectionName_1","lookup_collection","collectionModel","filter","a","length","buildTree","current_root","schemaTree","lookup","res","key","treeItemSplit","child_1","split","rbType","columnName","toTitleCase","replace","fieldName","fieldType","fieldTypeName","distinctFieldValues","fieldPath","lookup_as","fieldPathName","lookup_local_key","local_key","lookup_foreign_key","lookup_key","text","value","isLeaf","isActive","isSelected","depth","leafValueType","leafValueTypes","getLeafValueTypes","leafFormatType","leafFormatTypes","getLeafFormatTypes","children","sort","b","localeCompare","layer","index","find","leafTypes","mongoCommand","commandstr","obj","count","query","$ne","getMainDB","command","tmpObj","_b","sent","distinct","values","exports"],"mappings":"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","file":"schema-report-builder.js","sourcesContent":["import { CollectionTree } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { toTitleCase } from './common';\n\nexport function getReportLookupSchemas(collection_root: string) {\n\tlet lookupTrees: CollectionTree[] = [];\n\tlookupTrees.push({ collection_name: collection_root, tree: ResolveIOServer.getMongoManager().collection(collection_root)['rbSchema'], is_root: true });\n\tlet schemaObj = ResolveIOServer.getMongoManager().collection(collection_root)['rbSchema'];\n\tlet modelKeys = Object.keys(schemaObj);\n\tmodelKeys.forEach(field => {\n\t\tif (schemaObj[field].lookup_collection) {\n\t\t\tlet collectionName = schemaObj[field].lookup_collection;\n\t\t\tlet collectionModel = ResolveIOServer.getMongoManager().collection(collectionName);\n\n\t\t\tif (!lookupTrees.filter(a => a.collection_name === collectionName).length) {\n\t\t\t\tlookupTrees.push({ collection_name: collectionName, tree: collectionModel['rbSchema'], is_root: false });\n\t\t\t}\n\t\t}\n\t});\n\n\treturn lookupTrees;\n}\n\nexport function buildTree(current_root, schemaTree, lookup?) {\n\tlet res = [];\n\n\tObject.keys(schemaTree).filter(a => a !== '_id' && a !== 'id' && a !== '__v').forEach(key => {\n\t// Object.keys(schemaTree).filter(a => a !== '__v').forEach(key => {\n\t\tif (!lookup || (lookup && !schemaTree[key].lookup_collection)) {\n\t\t\tlet treeItemSplit = key.split('.');\n\t\t\n\t\t\t// debugger;\n\n\t\t\tif (treeItemSplit.length === 1) {\n\t\t\t\tif (schemaTree[key].rbType === 'String' || schemaTree[key].rbType === 'Number' || schemaTree[key].rbType === 'Boolean' || schemaTree[key].rbType === 'Date') {\n\t\t\t\t\tres.push({\n\t\t\t\t\t\tcollection_name: current_root,\n\t\t\t\t\t\tcolumnName: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\tfieldName: key,\n\t\t\t\t\t\tfieldType: schemaTree[key].rbType,\n\t\t\t\t\t\tfieldTypeName: schemaTree[key].rbType === 'String' ? 'Text' : (schemaTree[key].rbType === 'Boolean' ? 'T/F' : schemaTree[key].rbType),\n\t\t\t\t\t\tdistinctFieldValues: [],\n\t\t\t\t\t\tfieldPath: lookup ? lookup.lookup_as + '.$.' + key : key,\n\t\t\t\t\t\tfieldPathName: lookup ? (toTitleCase(lookup.lookup_as.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) + ' (List) -> ' + (toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) : toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> ')),\n\t\t\t\t\t\tlookup_collection: lookup ? lookup.lookup_collection : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_collection : ''),\n\t\t\t\t\t\tlookup_local_key: lookup ? lookup.lookup_local_key : (schemaTree[key].lookup_collection ? schemaTree[key].local_key : ''),\n\t\t\t\t\t\tlookup_foreign_key: lookup ? lookup.lookup_foreign_key : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_key : ''),\n\t\t\t\t\t\tlookup_as: lookup ? lookup.lookup_as : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_as : ''),\n\t\t\t\t\t\ttext: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\tvalue: key,\n\t\t\t\t\t\tisLeaf: true,\n\t\t\t\t\t\tisActive: false,\n\t\t\t\t\t\tisSelected: false,\n\t\t\t\t\t\tdepth: 0,\n\t\t\t\t\t\tleafValueType: '',\n\t\t\t\t\t\tleafValueTypes: getLeafValueTypes(schemaTree[key], key),\n\t\t\t\t\t\tleafFormatType: '',\n\t\t\t\t\t\tleafFormatTypes: getLeafFormatTypes(schemaTree[key], key)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tres.push({\n\t\t\t\t\t\tcollection_name: current_root,\n\t\t\t\t\t\tcolumnName: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\tfieldName: key,\n\t\t\t\t\t\tfieldType: schemaTree[key].lookup_collection ? 'Lookup' : schemaTree[key].rbType,\n\t\t\t\t\t\tfieldTypeName: schemaTree[key].lookup_collection ? 'Lookup' : (schemaTree[key].rbType === 'Array' ? 'List' : 'Group'),\n\t\t\t\t\t\tdistinctFieldValues: [],\n\t\t\t\t\t\tfieldPath: lookup ? lookup.lookup_as + '.$.' + key : key,\n\t\t\t\t\t\tfieldPathName: lookup ? (toTitleCase(lookup.lookup_as.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) + ' (List) -> ' + (toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) : toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> ')),\n\t\t\t\t\t\tlookup_collection: lookup ? lookup.lookup_collection : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_collection : ''),\n\t\t\t\t\t\tlookup_local_key: lookup ? lookup.lookup_local_key : (schemaTree[key].lookup_collection ? schemaTree[key].local_key : ''),\n\t\t\t\t\t\tlookup_foreign_key: lookup ? lookup.lookup_foreign_key : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_key : ''),\n\t\t\t\t\t\tlookup_as: lookup ? lookup.lookup_as : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_as : ''),\n\t\t\t\t\t\ttext: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\tvalue: key,\n\t\t\t\t\t\tisLeaf: false,\n\t\t\t\t\t\tisActive: false,\n\t\t\t\t\t\tisSelected: false,\n\t\t\t\t\t\tdepth: 0,\n\t\t\t\t\t\tleafValueType: '',\n\t\t\t\t\t\tleafFormatType: '',\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tres = res.sort((a, b) => a.fieldName.localeCompare(b.fieldName));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet child = null;\n\n\t\t\t\ttreeItemSplit.forEach((layer, index) => {\n\t\t\t\t\tif (!child) {\n\t\t\t\t\t\tchild = res.find(a => a.fieldName === layer);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (child.children.find(a => a.fieldName === layer)) {\n\t\t\t\t\t\t\tchild = child.children.find(a => a.fieldName === layer);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (schemaTree[key].rbType === 'String' || schemaTree[key].rbType === 'Number' || schemaTree[key].rbType === 'Boolean' || schemaTree[key].rbType === 'Date') {\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tchild.children.push({\n\t\t\t\t\t\t\t\t\tcollection_name: current_root,\n\t\t\t\t\t\t\t\t\tcolumnName: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\t\t\t\tfieldName: layer,\n\t\t\t\t\t\t\t\t\tfieldType: schemaTree[key].rbType,\n\t\t\t\t\t\t\t\t\tfieldTypeName: schemaTree[key].rbType === 'String' ? 'Text' : (schemaTree[key].rbType === 'Boolean' ? 'T/F' : schemaTree[key].rbType),\n\t\t\t\t\t\t\t\t\tdistinctFieldValues: [],\n\t\t\t\t\t\t\t\t\tfieldPath: lookup ? lookup.lookup_as + '.$.' + key : key,\n\t\t\t\t\t\t\t\t\tfieldPathName: lookup ? (toTitleCase(lookup.lookup_as.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) + ' (List) -> ' + (toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) : toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> ')),\n\t\t\t\t\t\t\t\t\tlookup_collection: lookup ? lookup.lookup_collection : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_collection : ''),\n\t\t\t\t\t\t\t\t\tlookup_local_key: lookup ? lookup.lookup_local_key : (schemaTree[key].lookup_collection ? schemaTree[key].local_key : ''),\n\t\t\t\t\t\t\t\t\tlookup_foreign_key: lookup ? lookup.lookup_foreign_key : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_key : ''),\n\t\t\t\t\t\t\t\t\tlookup_as: lookup ? lookup.lookup_as : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_as : ''),\n\t\t\t\t\t\t\t\t\ttext: toTitleCase(layer.replace(/\\_/g, ' ')),\n\t\t\t\t\t\t\t\t\tvalue: layer,\n\t\t\t\t\t\t\t\t\tisLeaf: true,\n\t\t\t\t\t\t\t\t\tisActive: false,\n\t\t\t\t\t\t\t\t\tisSelected: false,\n\t\t\t\t\t\t\t\t\tdepth: index,\n\t\t\t\t\t\t\t\t\tleafValueType: '',\n\t\t\t\t\t\t\t\t\tleafValueTypes: getLeafValueTypes(schemaTree[key], key),\n\t\t\t\t\t\t\t\t\tleafFormatType: '',\n\t\t\t\t\t\t\t\t\tleafFormatTypes: getLeafFormatTypes(schemaTree[key], key)\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tchild.children.push({\n\t\t\t\t\t\t\t\t\tcollection_name: current_root,\n\t\t\t\t\t\t\t\t\tcolumnName: toTitleCase(key.replace(/\\_/g, ' ')),\n\t\t\t\t\t\t\t\t\tfieldName: layer,\n\t\t\t\t\t\t\t\t\tfieldType: schemaTree[key].lookup_collection ? 'Lookup' : schemaTree[key].rbType,\n\t\t\t\t\t\t\t\t\tfieldTypeName: schemaTree[key].lookup_collection ? 'Lookup' : (schemaTree[key].rbType === 'Array' ? 'List' : 'Group'),\n\t\t\t\t\t\t\t\t\tdistinctFieldValues: [],\n\t\t\t\t\t\t\t\t\tfieldPath: lookup ? lookup.lookup_as + '.$.' + key : key,\n\t\t\t\t\t\t\t\t\tfieldPathName: lookup ? (toTitleCase(lookup.lookup_as.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) + ' (List) -> ' + (toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> '))) : toTitleCase(key.replace(/\\.\\$\\./g, ' (List) -> ').replace(/\\./g, ' (Group) -> ')),\n\t\t\t\t\t\t\t\t\tlookup_collection: lookup ? lookup.lookup_collection : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_collection : ''),\n\t\t\t\t\t\t\t\t\tlookup_local_key: lookup ? lookup.lookup_local_key : (schemaTree[key].lookup_collection ? schemaTree[key].local_key : ''),\n\t\t\t\t\t\t\t\t\tlookup_foreign_key: lookup ? lookup.lookup_foreign_key : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_key : ''),\n\t\t\t\t\t\t\t\t\tlookup_as: lookup ? lookup.lookup_as : (schemaTree[key].lookup_collection ? schemaTree[key].lookup_as : ''),\n\t\t\t\t\t\t\t\t\ttext: toTitleCase(layer.replace(/\\_/g, ' ')),\n\t\t\t\t\t\t\t\t\tvalue: layer,\n\t\t\t\t\t\t\t\t\tisLeaf: false,\n\t\t\t\t\t\t\t\t\tisActive: false,\n\t\t\t\t\t\t\t\t\tisSelected: false,\n\t\t\t\t\t\t\t\t\tdepth: index,\n\t\t\t\t\t\t\t\t\tleafValueType: '',\n\t\t\t\t\t\t\t\t\tleafFormatType: '',\n\t\t\t\t\t\t\t\t\tchildren: []\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tchild.children = child.children.sort((a, b) => a.fieldName.localeCompare(b.fieldName));\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\treturn res;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function getLeafValueTypes(schemaTree, fieldPath) {\n\tlet leafTypes = [];\n\n\tif (schemaTree.rbType === 'String') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Value',\n\t\t\t\tvalue: 'Value'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Unique',\n\t\t\t\tvalue: 'Unique'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Count',\n\t\t\t\tvalue: 'Count'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'First',\n\t\t\t\tvalue: 'First'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Last',\n\t\t\t\tvalue: 'Last'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Number') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Value',\n\t\t\t\tvalue: 'Value'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Unique',\n\t\t\t\tvalue: 'Unique'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Average',\n\t\t\t\tvalue: 'Average'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Count',\n\t\t\t\tvalue: 'Count'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Sum',\n\t\t\t\tvalue: 'Sum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Minimum',\n\t\t\t\tvalue: 'Minimum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Maximum',\n\t\t\t\tvalue: 'Maximum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'First',\n\t\t\t\tvalue: 'First'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Last',\n\t\t\t\tvalue: 'Last'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Boolean') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Value',\n\t\t\t\tvalue: 'Value'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Unique',\n\t\t\t\tvalue: 'Unique'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Count',\n\t\t\t\tvalue: 'Count'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'First',\n\t\t\t\tvalue: 'First'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Last',\n\t\t\t\tvalue: 'Last'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Date') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Value',\n\t\t\t\tvalue: 'Value'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Unique',\n\t\t\t\tvalue: 'Unique'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Count',\n\t\t\t\tvalue: 'Count'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Minimum',\n\t\t\t\tvalue: 'Minimum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Maximum',\n\t\t\t\tvalue: 'Maximum'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'First',\n\t\t\t\tvalue: 'First'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'Last',\n\t\t\t\tvalue: 'Last'\n\t\t\t}\n\t\t];\n\t}\n\treturn leafTypes;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function getLeafFormatTypes(schemaTree, fieldPath) {\n\tlet leafTypes = [];\n\n\tif (schemaTree.rbType === 'String') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Text',\n\t\t\t\tvalue: 'String'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Number',\n\t\t\t\tvalue: 'Number'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Number') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Number',\n\t\t\t\tvalue: 'Number'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Currency',\n\t\t\t\tvalue: 'Currency'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Text',\n\t\t\t\tvalue: 'String'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Boolean') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Number',\n\t\t\t\tvalue: 'Number'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Boolean (True/False)',\n\t\t\t\tvalue: 'Boolean'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Text (Yes/No)',\n\t\t\t\tvalue: 'String'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Number (1/0)',\n\t\t\t\tvalue: 'Boolean_Number'\n\t\t\t}\n\t\t];\n\t}\n\telse if (schemaTree.rbType === 'Date') {\n\t\tleafTypes = [\n\t\t\t{\n\t\t\t\ttext: 'As Number',\n\t\t\t\tvalue: 'Number'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Date (Short Format)',\n\t\t\t\tvalue: 'Date'\n\t\t\t}, \n\t\t\t{\n\t\t\t\ttext: 'As Time (Short Format)',\n\t\t\t\tvalue: 'Time'\n\t\t\t}, \n\t\t\t{\n\t\t\t\ttext: 'As Date/Time (Short Format)',\n\t\t\t\tvalue: 'DateTime'\n\t\t\t}, \n\t\t\t{\n\t\t\t\ttext: 'As Date (Long Format)',\n\t\t\t\tvalue: 'Date_long'\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: 'As Date/Time (Long Format)',\n\t\t\t\tvalue: 'DateTime_long'\n\t\t\t}, \n\t\t\t{\n\t\t\t\ttext: 'As Timestamp (MS since 1970)',\n\t\t\t\tvalue: 'Timestamp'\n\t\t\t}\n\t\t];\n\t}\n\treturn leafTypes;\n}\n\n\n\n\n\nexport async function mongoCommand(commandstr: string, collection: string, field?: any) {\n\tlet tmpObj;\n\ttry {\n\t\t// Count the number of non-empty fields in a given collection:\n\t\tif (commandstr === 'count') {\n\t\t\tlet obj = {\n\t\t\t\tcount: collection,\n\t\t\t\tquery: {}\n\t\t\t};\n\t\t\tobj.query[field] = {$ne: null};\n\t\t\ttmpObj = await ResolveIOServer.getMainDB().command(obj);\n\t\t}\n\t\t// Get all distinct values in a given field.\n\t\telse if (commandstr === 'distinct') {\n\t\t\tlet obj = {\n\t\t\t\tdistinct: collection,\n\t\t\t\tquery: {},\n\t\t\t\tkey: field,\n\t\t\t};\n\t\t\ttmpObj = await ResolveIOServer.getMainDB().command(obj);\n\t\t}\n\t\telse if (commandstr === 'listIndexes') {\n\t\t\t// tmpObj = await this.mainDb.db[collection].getIndexes();\n\t\t\t// let obj = { 'listIndexes': collection };\n\t\t\t// tmpObj = await this.mainDb.db.getIndexes(obj);\n\t\t}\n\t} catch {\n\t\t// console.log('----------- mongoCommand err: ', err);\n\t\treturn -1;\n\t}\n\tif (tmpObj) {\n\t\treturn tmpObj.values;\n\t}\n}"]}
|