@resolveio/server-lib 20.5.1 → 20.5.4
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/app-status.collection.js +1 -1
- package/collections/app-status.collection.js.map +1 -1
- package/collections/counter.collection.js +1 -1
- package/collections/counter.collection.js.map +1 -1
- package/collections/cron-job-history.collection.js +1 -1
- package/collections/cron-job-history.collection.js.map +1 -1
- package/collections/cron-job.collection.js +1 -1
- package/collections/cron-job.collection.js.map +1 -1
- package/collections/email-history.collection.js +1 -1
- package/collections/email-history.collection.js.map +1 -1
- package/collections/email-verified.collection.js +1 -1
- package/collections/email-verified.collection.js.map +1 -1
- package/collections/file.collection.js +1 -1
- package/collections/file.collection.js.map +1 -1
- package/collections/flag-update.collection.js +1 -1
- package/collections/flag-update.collection.js.map +1 -1
- package/collections/flag.collection.js +1 -1
- package/collections/flag.collection.js.map +1 -1
- package/collections/log-method-latency.collection.js +1 -1
- package/collections/log-method-latency.collection.js.map +1 -1
- package/collections/log-subscription.collection.js +1 -1
- package/collections/log-subscription.collection.js.map +1 -1
- package/collections/log.collection.js +1 -1
- package/collections/log.collection.js.map +1 -1
- package/collections/logged-in-users.collection.js +1 -1
- package/collections/logged-in-users.collection.js.map +1 -1
- package/collections/method-response.collection.js +1 -1
- package/collections/method-response.collection.js.map +1 -1
- package/collections/monitor-cpu.collection.js +1 -1
- package/collections/monitor-cpu.collection.js.map +1 -1
- package/collections/monitor-memory.collection.js +1 -1
- package/collections/monitor-memory.collection.js.map +1 -1
- package/collections/monitor-mongo.collection.js +1 -1
- package/collections/monitor-mongo.collection.js.map +1 -1
- package/collections/notification.collection.js +1 -1
- package/collections/notification.collection.js.map +1 -1
- package/collections/report-builder-dashboard-builder.collection.js +1 -1
- package/collections/report-builder-dashboard-builder.collection.js.map +1 -1
- package/collections/report-builder-library.collection.js +1 -1
- package/collections/report-builder-library.collection.js.map +1 -1
- package/collections/report-builder-report.collection.js +1 -1
- package/collections/report-builder-report.collection.js.map +1 -1
- package/collections/user-group.collection.js +1 -1
- package/collections/user-group.collection.js.map +1 -1
- package/collections/user-guide.collection.js +1 -1
- package/collections/user-guide.collection.js.map +1 -1
- package/collections/user.collection.js +1 -1
- package/collections/user.collection.js.map +1 -1
- package/collections/worker-task-request.collection.js +1 -1
- package/collections/worker-task-request.collection.js.map +1 -1
- package/collections/worker-task-response.collection.js +1 -1
- package/collections/worker-task-response.collection.js.map +1 -1
- package/fixtures/cron-jobs.js +1 -1
- package/fixtures/cron-jobs.js.map +1 -1
- package/fixtures/init.js +1 -1
- package/fixtures/init.js.map +1 -1
- package/http/auth.d.ts +1 -2
- package/http/auth.js +1 -1
- package/http/auth.js.map +1 -1
- package/http/home.d.ts +1 -2
- package/http/home.js +1 -1
- package/http/home.js.map +1 -1
- package/index.d.ts +0 -30
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/managers/cron.manager.js +1 -1
- package/managers/cron.manager.js.map +1 -1
- package/managers/local-log.manager.js +1 -1
- package/managers/local-log.manager.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 -2
- package/managers/mongo.manager.js +1 -1
- package/managers/mongo.manager.js.map +1 -1
- package/managers/monitor.manager.d.ts +0 -1
- package/managers/monitor.manager.js +1 -1
- package/managers/monitor.manager.js.map +1 -1
- package/managers/subscription.manager.js +1 -1
- package/managers/subscription.manager.js.map +1 -1
- package/managers/websocket.manager.d.ts +1 -2
- package/managers/websocket.manager.js.map +1 -1
- package/methods/accounts.js +1 -1
- package/methods/accounts.js.map +1 -1
- package/methods/aws.js +1 -1
- package/methods/aws.js.map +1 -1
- package/methods/collections.js +1 -1
- package/methods/collections.js.map +1 -1
- package/methods/counters.js +1 -1
- package/methods/counters.js.map +1 -1
- package/methods/logs.js +1 -1
- package/methods/logs.js.map +1 -1
- package/methods/monitor.js +1 -1
- package/methods/monitor.js.map +1 -1
- package/methods/report-builder.js +1 -1
- package/methods/report-builder.js.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/public_api.js +1 -1
- package/public_api.js.map +1 -1
- package/resolveio-server-app.d.ts +32 -0
- package/resolveio-server-app.js +2 -0
- package/resolveio-server-app.js.map +1 -0
- package/server-app.d.ts +2 -1
- package/server-app.js +1 -1
- package/server-app.js.map +1 -1
- package/util/common.d.ts +1 -0
- package/util/common.js +1 -1
- package/util/common.js.map +1 -1
- package/util/schema-report-builder.js +1 -1
- package/util/schema-report-builder.js.map +1 -1
- package/client-server-app.d.ts +0 -1
- package/client-server-app.js +0 -2
- package/client-server-app.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/managers/subscription.manager.ts"],"names":["logs_1","require","app_status_1","files_1","super_admin_1","logged_in_users_collection_1","cron_jobs_1","flags_1","method_responses_1","index_1","notifications_1","report_builder_reports_1","report_builder_libraries_1","user_groups_1","user_guides_1","report_builder_dashboard_builders_1","mongo_manager_1","common_1","NodeCache","flag_collection_1","os_1","flags_update_1","numCPUs","cpus","length","v8","SubscriptionManager","wss","serverConfig","monitorManagerFunction","_this","this","_publications","_subscriptions","_loggedInUsers","_mongoQueue","_mongoQueueId","_cacheId","_heapSize","getHeapStatistics","_enableDebug","_debugOplogCollections","_debugOplogHits","_debugSubCollections","_debugSubHits","_debugUnSubHits","_debugUnSubAllHits","_debugMongoQueueHits","_debugMongoQueueCollections","_debugSendQueueHits","_debugRemoveCacheHits","_oplogRetryCount","latencyBuffer","Map","LATENCY_UPDATE_INTERVAL","LATENCY_UPDATE_THRESHOLD_MS","_websocketManager","ResolveIOServer","getMainServer","getWebSocketManager","_monitorManagerFunction","_nodeCache","stdTTL","checkperiod","setInterval","flushThrottledLatencyUpdates","_wss","loadSuperAdminPublications","loadAppStatusPublications","loadLogPublications","loadFilePublications","loadCronJobPublications","loadFlagsUpdatePublications","loadFlagsPublications","loadMethodResponsePublications","loadNotificationPublications","loadReportBuilderReportPublications","loadReportBuilderLibraryPublications","loadUserGroupPublications","loadUserGuidePublications","loadReportBuilderDashboardBuilderPublications","tailOpLog","getEnableDebug","console","log","Date","JSON","stringify","sort","a","b","collection","localeCompare","publication","type","__awaiter","_a","LoggedInUsers","find","_b","sent","userCopy","deepCopy","i","loggedInUser","date","now","getTime","this_1","getWebSocket","id_ws","unsubscribeAll","forEach","sub","j","clients","id_socket","splice","deleteOne","_id","findIndex","client","this_2","some","Flags","findOne","then","flag","value","setCacheLimit","prototype","process","env","IS_WORKERS_ENABLED","_heapLimit","invalidatePubsCache","getMongoManager","invalidateQueryCache","collSubs","filter","collections","includes","this_3","running","runAgain","user_specific","Promise","all","map","ws","readyState","OPEN","sendDataToOneWithRetry","messageId","err","getMethodManager","sendEmail","id_user","sendDataToAllWithRetry","collSubs_1","__values","collSubs_1_1","next","done","delay","ms","resolve","setTimeout","sendDataToAll","sendDataToOne","publications","method","Object","assign","loggedInLatency","existingEntry","newLatency","get","lastUpdate","Math","abs","latency","set","size","updates","Array","from","entries","__read","_c","updateOne","update","$set","bulkWrite","clear","error","error_1","subscribe","messageRoute","messageDate","subscriptionData","pub","hits","push","check","_schema","valObj","rootKeys","keys","validate","errors","urlData","split","urlModule_1","urlNext","otherRouteSubs","startsWith","otherSub","unsubscribe","getPublicationCollections","cacheId","processSubscription","createLoggedInUser","reject","user","objectIdHexString","__v","insertOne","indexOf","userSubs","removeWebSocket","getActiveSubscriptions","resumeToken","_oplog$","closed","removeAllListeners","close","exit","pipeline","$match","$and","ns.coll","$nin","$not","lastResumeToken_1","getMainDB","watch","resumeAfter","errOp","on","doc","ns","coll","operationType","callMethodInternal","call","documentKey","NODE_APP_INSTANCE","IS_WORKER_INSTANCE","WORKER_INDEX","cacheData","parse","dateReviver","serverRes","hasError","data","sendWS","del","monitor","startMonitorFunction","function","apply","__spreadArray","res","finishMonitorFunction","err_1","subIndex","res_1","getBinarySize","endsWith","nodeCacheSize","getStats","vsize","deleteCount","subArr","zz","err_2","send","exports"],"mappings":"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","file":"subscription.manager.js","sourcesContent":["import { ServerResponseModel } from '../models/server-response.model';\nimport { ActiveSubscriptionModel, SubscriptionModel } from '../models/subscription.model';\nimport * as WebSocket from 'ws';\nimport { loadLogPublications } from '../publications/logs';\nimport { loadAppStatusPublications } from '../publications/app-status';\nimport { loadFilePublications } from '../publications/files';\nimport { loadSuperAdminPublications } from '../publications/super-admin';\nimport { LoggedInUsers } from '../collections/logged-in-users.collection';\nimport { loadCronJobPublications } from '../publications/cron-jobs';\nimport { loadFlagsPublications } from '../publications/flags';\nimport { loadMethodResponsePublications } from '../publications/method-responses';\nimport ResolveIOMainServer from '../server-app';\nimport { ResolveIOServer } from '../index';\nimport { loadNotificationPublications } from '../publications/notifications';\nimport { loadReportBuilderReportPublications } from '../publications/report-builder-reports';\nimport { LoggedInUserModel } from '../models/logged-in-users.model';\n\nimport { ChangeStream, ChangeStreamDeleteDocument, ChangeStreamInsertDocument, ChangeStreamReplaceDocument, ChangeStreamUpdateDocument, ResumeToken } from 'mongodb';\nimport { loadReportBuilderLibraryPublications } from '../publications/report-builder-libraries';\nimport { loadUserGroupPublications } from '../publications/user-groups';\nimport { loadUserGuidePublications } from '../publications/user-guides';\nimport { loadReportBuilderDashboardBuilderPublications } from '../publications/report-builder-dashboard-builders';\nimport { objectIdHexString } from './mongo.manager';\nimport { dateReviver, deepCopy, getBinarySize } from '../util/common';\nimport * as NodeCache from 'node-cache';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { Flags } from '../collections/flag.collection';\nimport { cpus } from 'os';\nimport { WebSocketManager } from './websocket.manager';\nimport { loadFlagsUpdatePublications } from '../publications/flags-update';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\n\n// Performance Dependencies\n// import * as path from 'path';\n// import { Worker } from 'worker_threads';\n\ninterface MongoQueueModel {\n\t_id: number,\n\ttype: string;\n\tcollection: string;\n\tsubscription: ActiveSubscriptionModel;\n\trunning: boolean;\n\trun_again: boolean;\n}\n\n// interface CurrentPerformanceMonitor {\n// \t_id: number;\n// \tfunction: string;\n// \tpublication: string;\n// \tsubscriptionData: any[];\n// \tdate_start: Date;\n// \tdate_end: Date;\n// \tduration: number;\n// \tresult: string;\n// }\n\nexport class SubscriptionManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _publications: SubscriptionModel = {};\n\tprivate _subscriptions: ActiveSubscriptionModel[] = [];\n\tprivate _wss: WebSocket.Server;\n\tprivate _loggedInUsers: LoggedInUserModel[] = [];\n\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\t\n\tprivate _oplog$: ChangeStream;\n\n\tprivate _nodeCache;\n\tprivate _cacheId = 1;\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate serverConfig;\n\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\n\tprivate _enableDebug = false;\n\tprivate _debugOplogCollections = [];\n\tprivate _debugOplogHits = 0;\n\tprivate _debugSubCollections = [];\n\tprivate _debugSubHits = 0;\n\tprivate _debugUnSubHits = 0;\n\tprivate _debugUnSubAllHits = 0;\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _debugSendQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\n\tprivate _oplogRetryCount = 0;\n\n\t// Buffer to store throttled latency updates with timestamps\n\tprivate latencyBuffer = new Map<string, { latency: number, lastUpdate: Date }>();\n\n\t// Interval to flush latency updates in MongoDB\n\tprivate readonly LATENCY_UPDATE_INTERVAL = 60000;\n\n\t// Minimum time difference between two latency updates for the same user\n\tprivate readonly LATENCY_UPDATE_THRESHOLD_MS = 30000;\n\n\t// private currentPerfomanceMonitor: CurrentPerformanceMonitor[] = [];\n\t// private idPerformance: number = 0;\n\t// private performanceThread;\n\n\tconstructor(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tthis._websocketManager = ResolveIOServer.getMainServer().getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\tsetInterval(() => this.flushThrottledLatencyUpdates(), this.LATENCY_UPDATE_INTERVAL);\n\n\t\t// setTimeout(() => {\n\t\t// \tconsole.log('Setting up performance thread');\n\n\t\t// \tthis.performanceThread = new Worker(path.join(__dirname, './subscription.performance.js'));\n\n\t\t// \tthis.performanceThread.on('exit', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD EXITED!!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\n\t\t// \tthis.performanceThread.on('error', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD RECV ERROR !!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\t\t// }, 5000);\n\n\t\t// setInterval(() => {\n\t\t// \tconsole.log('Post thread msg');\n\t\t// \tthis.performanceThread.postMessage(this.currentPerfomanceMonitor);\n\t\t// \tthis.currentPerfomanceMonitor = [];\n\t\t// }, 10000);\n\n\t\tthis.serverConfig = serverConfig;\n\t\tthis._wss = wss;\n\n\t\t// Publications\n\t\tloadSuperAdminPublications(this);\n\t\tloadAppStatusPublications(this);\n\t\tloadLogPublications(this);\n\t\tloadFilePublications(this);\n\t\tloadCronJobPublications(this);\n\t\tloadFlagsUpdatePublications(this);\n\t\tloadFlagsPublications(this);\n\t\tloadMethodResponsePublications(this);\n\t\tloadNotificationPublications(this);\n\t\tloadReportBuilderReportPublications(this);\n\t\tloadReportBuilderLibraryPublications(this);\n\t\tloadUserGroupPublications(this);\n\t\tloadUserGuidePublications(this);\n\t\tloadReportBuilderDashboardBuilderPublications(this);\n\n\t\tthis.tailOpLog();\n\n\t\tsetInterval(() => {\n\t\t\tthis._oplogRetryCount = 0;\n\t\t}, 15000);\n\n\t\tsetInterval(() => {\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Subs', this._subscriptions.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Logged In Users', this._loggedInUsers.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue', this._mongoQueue.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Collections', JSON.stringify(this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Hits', this._debugOplogHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Collections', JSON.stringify(this._debugOplogCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.type.localeCompare(b.type)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Hits', this._debugSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Collections', JSON.stringify(this._debugSubCollections.sort((a, b) => a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub Hits', this._debugUnSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub All Hits', this._debugUnSubAllHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Cache Cleanup Hits', this._debugRemoveCacheHits);\n\t\t\t}\n\t\t\t\n\t\t\tthis._debugOplogHits = 0;\n\t\t\tthis._debugOplogCollections = [];\n\t\t\tthis._debugSubCollections = [];\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t\tthis._debugSubHits = 0;\n\t\t\tthis._debugUnSubHits = 0;\n\t\t\tthis._debugUnSubAllHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t}, 60000);\n\n\t\tsetInterval(async () => {\n\t\t\tthis._loggedInUsers = await LoggedInUsers.find();\n\t\n\t\t\tlet userCopy = deepCopy(this._loggedInUsers);\n\t\t\tfor (let i = this._loggedInUsers.length - 1; i >= 0; i--) {\n\t\t\t\tlet loggedInUser = userCopy[i];\n\n\t\t\t\tif (!loggedInUser.date || Date.now() - loggedInUser.date.getTime() > 120000) {\n\t\t\t\t\tif (this._websocketManager.getWebSocket(loggedInUser.id_ws)) {\n\t\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', this._websocketManager.getWebSocket(loggedInUser.id_ws)['user'], this._websocketManager.getWebSocket(loggedInUser.id_ws)['id_socket'], 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.unsubscribeAll(this._websocketManager.getWebSocket(loggedInUser.id_ws));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._subscriptions.forEach(sub => {\n\t\t\t\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\t\t\t\tif (client.id_socket === loggedInUser.id_ws) {\n\t\t\t\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tLoggedInUsers.deleteOne({_id: loggedInUser._id});\n\n\t\t\t\t\t\tif (this._loggedInUsers.findIndex(a => a._id === loggedInUser._id) >= 0) {\n\t\t\t\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.findIndex(a => a._id === loggedInUser._id), 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < this._subscriptions.length; i++) {\n\t\t\t\tlet sub = this._subscriptions[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\tif (!this._loggedInUsers.some(a => a.id_ws === client.id_socket)) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 30000);\n\n\t\tFlags.findOne({type: 'Enable Debug'}).then(flag => {\n\t\t\tif (flag && flag.value) {\n\t\t\t\tthis._enableDebug = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._enableDebug = false;\n\t\t\t}\n\t\t});\n\n\t\tthis.setCacheLimit();\n\t}\n\n\tprivate setCacheLimit() {\t\n\t\tif (process.env.IS_WORKERS_ENABLED === 'true') {\n\t\t\tthis._heapLimit = this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3; // Use 50% of total heap size\n\t\t}\n\t}\n\n\tpublic async invalidatePubsCache(collection: string, type: string) {\n\t\tResolveIOServer.getMongoManager().invalidateQueryCache(collection);\n\n\t\tlet collSubs = this._subscriptions.filter(a => a.collections.includes(collection));\n\n\t\tfor (let sub of collSubs) {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Invalidate Sub', sub.publication, sub.running, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.running) {\n\t\t\t\tsub.runAgain = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (this._publications[sub.publication].user_specific) {\n\t\t\t\tPromise.all(\n\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.sendDataToOneWithRetry(ws, client.messageId, sub, collection, type);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// Handle error\n\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During sendDataToOne - User Specific - Socket: ' + client.id_socket + ', User: ' + client.id_user + ', MessageId: ' + client.messageId + ', Pub: ' + sub.publication + ', Err: ' + JSON.stringify(err, null, 2));\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\telse {\n\t\t\t\tthis.sendDataToAllWithRetry(sub, collection, type);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tprivate async sendDataToAllWithRetry(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToAll Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToAll(sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToAll Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\n\t\tsub.running = false;\n\t}\n\n\tprivate async sendDataToOneWithRetry(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToOne Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToOne(ws, messageId, sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToOne Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\t\tsub.running = false;\n\t}\n\n\t// Add all files to publications private object\n\tpublic publications(method: SubscriptionModel) {\n\t\tthis._publications = Object.assign(this._publications, method);\n\t}\n\n\t// Throttled `loggedInLatency` method\n\tpublic loggedInLatency(ws: WebSocket) {\n\t\tlet loggedInUser = this._loggedInUsers.find(a => a.id_ws === ws['id_socket']);\n\t\tif (!loggedInUser) return;\n\n\t\tconst now = new Date();\n\t\tconst existingEntry = this.latencyBuffer.get(ws['id_socket']);\n\t\tconst newLatency = ws['latency'];\n\n\t\t// Throttle updates: only update if time threshold has passed or latency has significantly changed\n\t\tif (\n\t\t\t!existingEntry || \n\t\t\t(now.getTime() - existingEntry.lastUpdate.getTime() >= this.LATENCY_UPDATE_THRESHOLD_MS) || \n\t\t\t(Math.abs(newLatency - existingEntry.latency) > 100) // Optional: log only significant changes\n\t\t) {\n\t\t\t// Update in-memory and buffer\n\t\t\tloggedInUser.date = now;\n\t\t\tthis.latencyBuffer.set(ws['id_socket'], { latency: newLatency, lastUpdate: now });\n\t\t}\n\t}\n\n\t// Method to flush buffered latency updates in bulk\n\tprivate async flushThrottledLatencyUpdates() {\n\t\tif (this.latencyBuffer.size === 0) return; // No updates to flush\n\n\t\tconst updates = Array.from(this.latencyBuffer.entries()).map(([id_ws, { latency, lastUpdate }]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { id_ws },\n\t\t\t\tupdate: { $set: { latency, date: lastUpdate } }\n\t\t\t}\n\t\t}));\n\n\t\ttry {\n\t\t\tawait LoggedInUsers.bulkWrite(updates);\n\t\t\tthis.latencyBuffer.clear(); // Clear buffer after successful update\n\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Throttled latency batch update successful', updates.length);\n\t\t\t}\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'Sub Manager', 'Throttled latency batch update failed', error);\n\t\t\t// Optional: implement retry logic or logging for failed updates\n\t\t}\n\t}\n\n\t// Subscribe to publication\n\tpublic subscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugSubHits += 1;\n\n\t\tif (!this._debugSubCollections.some(a => a.publication === publication)) {\n\t\t\tthis._debugSubCollections.push({\n\t\t\t\tpublication: publication,\n\t\t\t\thits: 1\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis._debugSubCollections.find(a => a.publication === publication).hits += 1;\n\t\t}\n\n\t\tlet pub = this._publications[publication];\n\n\t\tif (!pub) {\n\t\t\tconsole.error(new Date(), 'No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tif (subscriptionData.length > 1 || subscriptionData[0]) {\n\t\t\t\tif (!pub.check) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Function For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (!pub.check._schema) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Schema For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet valObj = {};\n\t\t\t\t\tlet valKeys = Object.keys(pub.check._schema);\n\n\t\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\n\t\t\t\t\tfor (let i = 0; i < subscriptionData.length; i++) {\n\t\t\t\t\t\tvalObj[rootKeys[i]] = subscriptionData[i];\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpub.check.validate(valObj);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (errors) {\n\t\t\t\t\t\tif (errors) {\n\t\t\t\t\t\t\tconsole.error(new Date(), 'Error in Pub Check (' + publication + ')', errors);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (messageRoute !== 'Bypass') {\n\t\t\t\tlet urlData = messageRoute.split('/');\n\t\t\t\tlet urlModule = '';\n\t\t\t\tlet urlNext = urlData[0];\n\n\t\t\t\tif (urlData[0] === '') {\n\t\t\t\t\turlModule = '/';\n\t\t\t\t\turlNext = urlData[1];\n\t\t\t\t}\n\n\t\t\t\turlModule += urlNext;\n\n\t\t\t\tif (urlData.length > 1) {\n\t\t\t\t\turlModule += '/';\n\t\t\t\t}\n\n\t\t\t\tlet otherRouteSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_socket === ws['id_socket'] && b.messageRoute !== 'Bypass' && b.messageRoute !== '/' && b.messageRoute !== messageRoute && !b.messageRoute.startsWith(urlModule)));\n\n\t\t\t\tif (otherRouteSubs.length) {\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Detected Undestroyed Subscription - ' + this.serverConfig['CLIENT_NAME'], 'USER: ' + ws['user'] + ' (Socket: ' + ws['id_socket'] + ') ' + ' is on route: ' + messageRoute + ' but has the following subscriptions on other routes:' + JSON.stringify(otherRouteSubs, null, 2));\n\n\t\t\t\t\totherRouteSubs.forEach(otherSub => {\n\t\t\t\t\t\totherSub.clients.filter(a => a.id_socket === ws['id_socket']).forEach(client => {\n\t\t\t\t\t\t\tthis.unsubscribe(client.messageRoute, new Date(), ws, client.messageId, otherSub.publication, otherSub.subscriptionData);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\t// If sub found (another user watching same data), add client to same sub\n\t\t\tif (sub) {\n\t\t\t\tif (!sub.clients.some(a => a.id_socket === ws['id_socket'] && a.messageId === messageId)) {\n\t\t\t\t\tsub.clients.push({\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If sub not found, create new sub\n\t\t\telse {\n\t\t\t\tthis._subscriptions.push({\n\t\t\t\t\tpublication: publication,\n\t\t\t\t\tsubscriptionData: subscriptionData,\n\t\t\t\t\tcollections: this.getPublicationCollections(publication),\n\t\t\t\t\tclients: [{\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute,\n\t\t\t\t\t}],\n\t\t\t\t\tcacheId: 0,\n\t\t\t\t\trunning: false,\n\t\t\t\t\trunAgain: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!sub) {\n\t\t\t\tsub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\t\t\t}\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'New Sub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t}\n\n\t\t\t// Immediately send data to the new client\n\t\t\tthis.processSubscription(sub, ws, messageId);\n\t\t}\n\t}\n\n\tpublic async createLoggedInUser(id_ws: string): Promise<LoggedInUserModel> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet ws = this._websocketManager.getWebSocket(id_ws);\n\n\t\t\tif (ws) {\n\t\t\t\tlet user = {\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t__v: 0,\n\t\t\t\t\tdate: new Date(),\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\t\n\t\t\t\tthis._loggedInUsers.push(user);\n\t\t\t\tLoggedInUsers.insertOne(user);\n\t\t\t\t\n\t\t\t\tresolve(user);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresolve(null);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Unsubscribe from publication \n\tpublic unsubscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugUnSubHits += 1;\n\n\t\tif (!this._publications[publication]) {\n\t\t\tconsole.log('No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\tif (sub) {\n\t\t\t\tfor (let i = sub.clients.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (sub.clients[i].id_user === ws['id_user'] && sub.clients[i].messageId === messageId && sub.clients[i].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Unsub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Unsubscribe from publication\n\tpublic async unsubscribeAll(ws: WebSocket) {\n\t\tthis._debugUnSubAllHits += 1;\n\n\t\tif (ws) {\n\t\t\t// Check if WebSocket has already been unsubscribed\n\t\t\tif (ws['isUnsubscribed']) {\n\t\t\t\treturn; // Skip if already unsubscribed\n\t\t\t}\n\t\t\t\n\t\t\t// Mark the WebSocket as unsubscribed to prevent further calls\n\t\t\tws['isUnsubscribed'] = true;\n\t\t\t\n\t\t\tif (this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']) >= 0) {\n\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']), 1);\n\t\t\t}\n\t\t\tLoggedInUsers.deleteOne({ id_ws: ws['id_socket'] });\n\n\t\t\tlet userSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_user === ws['id_user'] && b.id_socket === ws['id_socket']));\n\n\t\t\tfor (let i = userSubs.length - 1; i >= 0; i--) {\n\t\t\t\tlet sub = userSubs[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tif (sub.clients[j].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._websocketManager.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic getActiveSubscriptions() {\n\t\treturn this._subscriptions;\n\t}\n\n\t// Get publication collection\n\tprivate getPublicationCollections(publication: string) {\n\t\treturn this._publications[publication].collections;\n\t}\n\n\t// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)\n\tprivate async tailOpLog(resumeToken?: ResumeToken) {\n\t\tif (this._oplog$ && !this._oplog$.closed) {\n\t\t\tthis._oplog$.removeAllListeners();\n\t\t\tthis._oplog$.close();\n\t\t\tthis._oplog$ = null;\n\t\t}\n\n\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\n\t\tif (!this._oplog$ || this._oplog$.closed) {\n\t\t\tthis._oplogRetryCount += 1;\n\n\t\t\tif (this._oplogRetryCount > 5) {\n\t\t\t\tconsole.error('****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst pipeline = [\n\t\t\t\t{\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tlet lastResumeToken: ResumeToken;\n\n\t\t\tif (resumeToken) {\n\t\t\t\tlastResumeToken = resumeToken;\n\t\t\t\ttry {\n\t\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch(pipeline, { resumeAfter: resumeToken });\n\t\t\t\t}\n\t\t\t\tcatch (errOp) {\n\t\t\t\t\tif (this._oplog$) {\n\t\t\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\t\t\tthis._oplog$.close();\n\t\t\t\t\t\tthis._oplog$ = null;\n\t\t\t\t\t}\n\t\t\t\t\tthis.tailOpLog(resumeToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch(pipeline);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'oplog started');\n\n\t\t\tthis._oplog$.on('change', (doc: ChangeStreamInsertDocument | ChangeStreamUpdateDocument | ChangeStreamReplaceDocument | ChangeStreamDeleteDocument) => {\n\t\t\t\tif (doc.ns) {\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Oplog Hit', doc.ns);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet collection = doc.ns.coll;\n\n\t\t\t\t\tif (!this._debugOplogCollections.some(a => a.collection === doc.ns.coll && a.type === doc.operationType)) {\n\t\t\t\t\t\tthis._debugOplogCollections.push({\n\t\t\t\t\t\t\tcollection: doc.ns.coll,\n\t\t\t\t\t\t\ttype: doc.operationType,\n\t\t\t\t\t\t\thits: 1\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._debugOplogCollections.find(a => a.collection === doc.ns.coll && a.type === doc.operationType).hits += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection) {\n\t\t\t\t\t\tthis._debugOplogHits += 1;\n\n\t\t\t\t\t\tif (doc.operationType === 'insert') {\n\t\t\t\t\t\t\tif (collection === 'support-tickets') {\n\t\t\t\t\t\t\t\tif (this.serverConfig['ROOT_URL'] === 'https://resolveio.com') {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'sendSupportTicketEmail', doc.documentKey['_id']);\n\t\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'update' || doc.operationType === 'replace') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'update');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'delete') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'delete');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection === 'flags') {\n\t\t\t\t\t\tFlags.findOne({ type: 'Enable Debug' }).then(flag => {\n\t\t\t\t\t\t\tif (flag && flag.value) {\n\t\t\t\t\t\t\t\tthis._enableDebug = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tthis._enableDebug = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlastResumeToken = doc._id;\n\n\t\t\t\t\tif ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && (process.env.IS_WORKERS_ENABLED === 'false' || (process.env.IS_WORKER_INSTANCE === 'true' && process.env.WORKER_INDEX === '0'))) {\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._oplog$.on('error', error => {\n\t\t\t\tconsole.log(new Date(), 'oplog error', error);\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$.close();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\n\t\t\tthis._oplog$.on('end', () => {\n\t\t\t\tconsole.log(new Date(), 'oplog end');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$.close();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\n\t\t\tthis._oplog$.on('close', () => {\n\t\t\t\tconsole.log(new Date(), 'oplog close');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async processSubscription(sub: ActiveSubscriptionModel, ws: WebSocket, messageId: number) {\n\t\tif (!this._publications[sub.publication].user_specific) {\t\t\t\n\t\t\tif (sub.cacheId) {\n\t\t\t\ttry {\n\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\tdata: cacheData\n\t\t\t\t\t};\n\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Cache', sub.publication);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\tsub.cacheId = 0;\n\n\t\t\t\t\tthis.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Non - Cache', sub.publication, sub.running);\n\t\t\t\t}\n\n\t\t\t\tif (sub.running) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Process Sub Specific, Non - Cache', sub.publication, sub.running);\n\t\t\t}\n\n\t\t\tif (sub.running) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tthis.sendDataToOneWithRetry(ws, messageId, sub, '', 'newSub');\n\t\t}\n\t}\n\n\tprivate async sendDataToOne(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('User Specific Publication', sub.publication, '', '', sub.subscriptionData);\n\t\ttry {\n\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\n\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ws['id_user'], ...sub.subscriptionData);\n\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: res\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: err\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\n\t\t\tResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendDataToOne - WS)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToAll(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tif (!sub.clients.length) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\tsub.cacheId = 0;\n\t\t\t}\n\n\t\t\tlet subIndex = this._subscriptions.findIndex(a => a.publication === sub.publication && JSON.stringify(a.subscriptionData) === JSON.stringify(sub.subscriptionData));\n\t\t\tif (subIndex >= 0) {\n\t\t\t\tthis._subscriptions.splice(subIndex, 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Publication', sub.publication, '', '', sub.subscriptionData);\n\n\t\t\ttry {\n\t\t\t\tif (sub.publication !== 'superadminAPM' && sub.publication !== 'loggedInUsers') {\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\t\t\t\t}\n\n\t\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ...sub.subscriptionData);\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\tif (sub.cacheId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\t\n\t\t\t\t\t\tif (JSON.stringify(cacheData) !== JSON.stringify(res)) {\n\t\t\t\t\t\t\tPromise.all(\n\t\t\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\n\t\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\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\n\t\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t\t!sub.collections.includes('log-method-latencies') &&\n\t\t\t\t\t\t\t\t!sub.collections.includes('log-subscriptions') &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tPromise.all(\n\t\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t!sub.collections.includes('log-method-latencies') &&\n\t\t\t\t\t\t\t!sub.collections.includes('log-subscriptions') &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tPromise.all(\n\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t!sub.collections.includes('log-method-latencies') &&\n\t\t\t\t\t\t!sub.collections.includes('log-subscriptions') &&\n\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\n\t\t\t\t\t\tconst nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\t\t\t\t// Evict cache entries as needed\n\t\t\t\t\t\t\tlet deleteCount = 0;\n\t\t\t\t\t\t\tconst subArr = this._subscriptions.filter(a => a.cacheId && !a.clients.length);\n\t\t\t\t\t\n\t\t\t\t\t\t\tfor (let zz = 0; zz < subArr.length; zz++) {\n\t\t\t\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\t\t\t\tthis._nodeCache.del(subArr[zz].cacheId);\n\t\t\t\t\t\t\t\tsubArr[zz].cacheId = 0;\n\t\t\t\t\t\t\t\tdeleteCount += 1;\n\t\t\t\t\t\t\t\tif (this._nodeCache.getStats().vsize < this._heapLimit * 0.75) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t'Sub Cache: ' +\n\t\t\t\t\t\t\t\t\t'Too Big - ' +\n\t\t\t\t\t\t\t\t\tsub.publication +\n\t\t\t\t\t\t\t\t\t' - Deleted: ' +\n\t\t\t\t\t\t\t\t\tdeleteCount +\n\t\t\t\t\t\t\t\t\t' - ' +\n\t\t\t\t\t\t\t\t\tnodeCacheSize\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\tPromise.all(\n\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\thasError: true,\n\t\t\t\t\t\t\t\tdata: err\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\tResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendPubData)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate sendWS(ws: WebSocket, data: ServerResponseModel) {\n\t\tthis._websocketManager.send(ws, data);\n\t}\n\n\tpublic getEnableDebug() {\n\t\treturn this._enableDebug;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/managers/subscription.manager.ts"],"names":["logs_1","require","app_status_1","files_1","super_admin_1","logged_in_users_collection_1","cron_jobs_1","flags_1","method_responses_1","resolveio_server_app_1","notifications_1","report_builder_reports_1","report_builder_libraries_1","user_groups_1","user_guides_1","report_builder_dashboard_builders_1","common_1","NodeCache","flag_collection_1","os_1","flags_update_1","numCPUs","cpus","length","v8","SubscriptionManager","wss","serverConfig","monitorManagerFunction","_this","this","_publications","_subscriptions","_loggedInUsers","_mongoQueue","_mongoQueueId","_cacheId","_heapSize","getHeapStatistics","_enableDebug","_debugOplogCollections","_debugOplogHits","_debugSubCollections","_debugSubHits","_debugUnSubHits","_debugUnSubAllHits","_debugMongoQueueHits","_debugMongoQueueCollections","_debugSendQueueHits","_debugRemoveCacheHits","_oplogRetryCount","latencyBuffer","Map","LATENCY_UPDATE_INTERVAL","LATENCY_UPDATE_THRESHOLD_MS","_websocketManager","ResolveIOServer","getMainServer","getWebSocketManager","_monitorManagerFunction","_nodeCache","stdTTL","checkperiod","setInterval","flushThrottledLatencyUpdates","_wss","loadSuperAdminPublications","loadAppStatusPublications","loadLogPublications","loadFilePublications","loadCronJobPublications","loadFlagsUpdatePublications","loadFlagsPublications","loadMethodResponsePublications","loadNotificationPublications","loadReportBuilderReportPublications","loadReportBuilderLibraryPublications","loadUserGroupPublications","loadUserGuidePublications","loadReportBuilderDashboardBuilderPublications","tailOpLog","getEnableDebug","console","log","Date","JSON","stringify","sort","a","b","collection","localeCompare","publication","type","__awaiter","_a","LoggedInUsers","find","_b","sent","userCopy","deepCopy","i","loggedInUser","date","now","getTime","this_1","getWebSocket","id_ws","unsubscribeAll","forEach","sub","j","clients","id_socket","splice","deleteOne","_id","findIndex","client","this_2","some","Flags","findOne","then","flag","value","setCacheLimit","prototype","process","env","IS_WORKERS_ENABLED","_heapLimit","invalidatePubsCache","getMongoManager","invalidateQueryCache","collSubs","filter","collections","includes","this_3","running","runAgain","user_specific","Promise","all","map","ws","readyState","OPEN","sendDataToOneWithRetry","messageId","err","getMethodManager","sendEmail","id_user","sendDataToAllWithRetry","collSubs_1","__values","collSubs_1_1","next","done","delay","ms","resolve","setTimeout","sendDataToAll","sendDataToOne","publications","method","Object","assign","loggedInLatency","existingEntry","newLatency","get","lastUpdate","Math","abs","latency","set","size","updates","Array","from","entries","__read","_c","updateOne","update","$set","bulkWrite","clear","error","error_1","subscribe","messageRoute","messageDate","subscriptionData","pub","hits","push","check","_schema","valObj","rootKeys","keys","validate","errors","urlData","split","urlModule_1","urlNext","otherRouteSubs","startsWith","otherSub","unsubscribe","getPublicationCollections","cacheId","processSubscription","createLoggedInUser","reject","user","objectIdHexString","__v","insertOne","indexOf","userSubs","removeWebSocket","getActiveSubscriptions","resumeToken","_oplog$","closed","removeAllListeners","close","exit","pipeline","$match","$and","ns.coll","$nin","$not","lastResumeToken_1","getMainDB","watch","resumeAfter","errOp","on","doc","ns","coll","operationType","callMethodInternal","call","documentKey","NODE_APP_INSTANCE","IS_WORKER_INSTANCE","WORKER_INDEX","cacheData","parse","dateReviver","serverRes","hasError","data","sendWS","del","monitor","startMonitorFunction","function","apply","__spreadArray","res","finishMonitorFunction","err_1","subIndex","res_1","getBinarySize","endsWith","nodeCacheSize","getStats","vsize","deleteCount","subArr","zz","err_2","send","exports"],"mappings":"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","file":"subscription.manager.js","sourcesContent":["import { ServerResponseModel } from '../models/server-response.model';\nimport { ActiveSubscriptionModel, SubscriptionModel } from '../models/subscription.model';\nimport * as WebSocket from 'ws';\nimport { loadLogPublications } from '../publications/logs';\nimport { loadAppStatusPublications } from '../publications/app-status';\nimport { loadFilePublications } from '../publications/files';\nimport { loadSuperAdminPublications } from '../publications/super-admin';\nimport { LoggedInUsers } from '../collections/logged-in-users.collection';\nimport { loadCronJobPublications } from '../publications/cron-jobs';\nimport { loadFlagsPublications } from '../publications/flags';\nimport { loadMethodResponsePublications } from '../publications/method-responses';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { loadNotificationPublications } from '../publications/notifications';\nimport { loadReportBuilderReportPublications } from '../publications/report-builder-reports';\nimport { LoggedInUserModel } from '../models/logged-in-users.model';\n\nimport { ChangeStream, ChangeStreamDeleteDocument, ChangeStreamInsertDocument, ChangeStreamReplaceDocument, ChangeStreamUpdateDocument, ResumeToken } from 'mongodb';\nimport { loadReportBuilderLibraryPublications } from '../publications/report-builder-libraries';\nimport { loadUserGroupPublications } from '../publications/user-groups';\nimport { loadUserGuidePublications } from '../publications/user-guides';\nimport { loadReportBuilderDashboardBuilderPublications } from '../publications/report-builder-dashboard-builders';\nimport { dateReviver, deepCopy, getBinarySize, objectIdHexString } from '../util/common';\nimport * as NodeCache from 'node-cache';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { Flags } from '../collections/flag.collection';\nimport { cpus } from 'os';\nimport { WebSocketManager } from './websocket.manager';\nimport { loadFlagsUpdatePublications } from '../publications/flags-update';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\n\n// Performance Dependencies\n// import * as path from 'path';\n// import { Worker } from 'worker_threads';\n\ninterface MongoQueueModel {\n\t_id: number,\n\ttype: string;\n\tcollection: string;\n\tsubscription: ActiveSubscriptionModel;\n\trunning: boolean;\n\trun_again: boolean;\n}\n\n// interface CurrentPerformanceMonitor {\n// \t_id: number;\n// \tfunction: string;\n// \tpublication: string;\n// \tsubscriptionData: any[];\n// \tdate_start: Date;\n// \tdate_end: Date;\n// \tduration: number;\n// \tresult: string;\n// }\n\nexport class SubscriptionManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _publications: SubscriptionModel = {};\n\tprivate _subscriptions: ActiveSubscriptionModel[] = [];\n\tprivate _wss: WebSocket.Server;\n\tprivate _loggedInUsers: LoggedInUserModel[] = [];\n\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\t\n\tprivate _oplog$: ChangeStream;\n\n\tprivate _nodeCache;\n\tprivate _cacheId = 1;\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate serverConfig;\n\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\n\tprivate _enableDebug = false;\n\tprivate _debugOplogCollections = [];\n\tprivate _debugOplogHits = 0;\n\tprivate _debugSubCollections = [];\n\tprivate _debugSubHits = 0;\n\tprivate _debugUnSubHits = 0;\n\tprivate _debugUnSubAllHits = 0;\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _debugSendQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\n\tprivate _oplogRetryCount = 0;\n\n\t// Buffer to store throttled latency updates with timestamps\n\tprivate latencyBuffer = new Map<string, { latency: number, lastUpdate: Date }>();\n\n\t// Interval to flush latency updates in MongoDB\n\tprivate readonly LATENCY_UPDATE_INTERVAL = 60000;\n\n\t// Minimum time difference between two latency updates for the same user\n\tprivate readonly LATENCY_UPDATE_THRESHOLD_MS = 30000;\n\n\t// private currentPerfomanceMonitor: CurrentPerformanceMonitor[] = [];\n\t// private idPerformance: number = 0;\n\t// private performanceThread;\n\n\tconstructor(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tthis._websocketManager = ResolveIOServer.getMainServer().getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\tsetInterval(() => this.flushThrottledLatencyUpdates(), this.LATENCY_UPDATE_INTERVAL);\n\n\t\t// setTimeout(() => {\n\t\t// \tconsole.log('Setting up performance thread');\n\n\t\t// \tthis.performanceThread = new Worker(path.join(__dirname, './subscription.performance.js'));\n\n\t\t// \tthis.performanceThread.on('exit', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD EXITED!!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\n\t\t// \tthis.performanceThread.on('error', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD RECV ERROR !!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\t\t// }, 5000);\n\n\t\t// setInterval(() => {\n\t\t// \tconsole.log('Post thread msg');\n\t\t// \tthis.performanceThread.postMessage(this.currentPerfomanceMonitor);\n\t\t// \tthis.currentPerfomanceMonitor = [];\n\t\t// }, 10000);\n\n\t\tthis.serverConfig = serverConfig;\n\t\tthis._wss = wss;\n\n\t\t// Publications\n\t\tloadSuperAdminPublications(this);\n\t\tloadAppStatusPublications(this);\n\t\tloadLogPublications(this);\n\t\tloadFilePublications(this);\n\t\tloadCronJobPublications(this);\n\t\tloadFlagsUpdatePublications(this);\n\t\tloadFlagsPublications(this);\n\t\tloadMethodResponsePublications(this);\n\t\tloadNotificationPublications(this);\n\t\tloadReportBuilderReportPublications(this);\n\t\tloadReportBuilderLibraryPublications(this);\n\t\tloadUserGroupPublications(this);\n\t\tloadUserGuidePublications(this);\n\t\tloadReportBuilderDashboardBuilderPublications(this);\n\n\t\tthis.tailOpLog();\n\n\t\tsetInterval(() => {\n\t\t\tthis._oplogRetryCount = 0;\n\t\t}, 15000);\n\n\t\tsetInterval(() => {\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Subs', this._subscriptions.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Logged In Users', this._loggedInUsers.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue', this._mongoQueue.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Collections', JSON.stringify(this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Hits', this._debugOplogHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Collections', JSON.stringify(this._debugOplogCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.type.localeCompare(b.type)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Hits', this._debugSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Collections', JSON.stringify(this._debugSubCollections.sort((a, b) => a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub Hits', this._debugUnSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub All Hits', this._debugUnSubAllHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Cache Cleanup Hits', this._debugRemoveCacheHits);\n\t\t\t}\n\t\t\t\n\t\t\tthis._debugOplogHits = 0;\n\t\t\tthis._debugOplogCollections = [];\n\t\t\tthis._debugSubCollections = [];\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t\tthis._debugSubHits = 0;\n\t\t\tthis._debugUnSubHits = 0;\n\t\t\tthis._debugUnSubAllHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t}, 60000);\n\n\t\tsetInterval(async () => {\n\t\t\tthis._loggedInUsers = await LoggedInUsers.find();\n\t\n\t\t\tlet userCopy = deepCopy(this._loggedInUsers);\n\t\t\tfor (let i = this._loggedInUsers.length - 1; i >= 0; i--) {\n\t\t\t\tlet loggedInUser = userCopy[i];\n\n\t\t\t\tif (!loggedInUser.date || Date.now() - loggedInUser.date.getTime() > 120000) {\n\t\t\t\t\tif (this._websocketManager.getWebSocket(loggedInUser.id_ws)) {\n\t\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', this._websocketManager.getWebSocket(loggedInUser.id_ws)['user'], this._websocketManager.getWebSocket(loggedInUser.id_ws)['id_socket'], 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.unsubscribeAll(this._websocketManager.getWebSocket(loggedInUser.id_ws));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._subscriptions.forEach(sub => {\n\t\t\t\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\t\t\t\tif (client.id_socket === loggedInUser.id_ws) {\n\t\t\t\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tLoggedInUsers.deleteOne({_id: loggedInUser._id});\n\n\t\t\t\t\t\tif (this._loggedInUsers.findIndex(a => a._id === loggedInUser._id) >= 0) {\n\t\t\t\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.findIndex(a => a._id === loggedInUser._id), 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < this._subscriptions.length; i++) {\n\t\t\t\tlet sub = this._subscriptions[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\tif (!this._loggedInUsers.some(a => a.id_ws === client.id_socket)) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 30000);\n\n\t\tFlags.findOne({type: 'Enable Debug'}).then(flag => {\n\t\t\tif (flag && flag.value) {\n\t\t\t\tthis._enableDebug = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._enableDebug = false;\n\t\t\t}\n\t\t});\n\n\t\tthis.setCacheLimit();\n\t}\n\n\tprivate setCacheLimit() {\t\n\t\tif (process.env.IS_WORKERS_ENABLED === 'true') {\n\t\t\tthis._heapLimit = this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3; // Use 50% of total heap size\n\t\t}\n\t}\n\n\tpublic async invalidatePubsCache(collection: string, type: string) {\n\t\tResolveIOServer.getMongoManager().invalidateQueryCache(collection);\n\n\t\tlet collSubs = this._subscriptions.filter(a => a.collections.includes(collection));\n\n\t\tfor (let sub of collSubs) {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Invalidate Sub', sub.publication, sub.running, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.running) {\n\t\t\t\tsub.runAgain = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (this._publications[sub.publication].user_specific) {\n\t\t\t\tPromise.all(\n\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.sendDataToOneWithRetry(ws, client.messageId, sub, collection, type);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// Handle error\n\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During sendDataToOne - User Specific - Socket: ' + client.id_socket + ', User: ' + client.id_user + ', MessageId: ' + client.messageId + ', Pub: ' + sub.publication + ', Err: ' + JSON.stringify(err, null, 2));\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\telse {\n\t\t\t\tthis.sendDataToAllWithRetry(sub, collection, type);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tprivate async sendDataToAllWithRetry(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToAll Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToAll(sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToAll Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\n\t\tsub.running = false;\n\t}\n\n\tprivate async sendDataToOneWithRetry(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToOne Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToOne(ws, messageId, sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToOne Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\t\tsub.running = false;\n\t}\n\n\t// Add all files to publications private object\n\tpublic publications(method: SubscriptionModel) {\n\t\tthis._publications = Object.assign(this._publications, method);\n\t}\n\n\t// Throttled `loggedInLatency` method\n\tpublic loggedInLatency(ws: WebSocket) {\n\t\tlet loggedInUser = this._loggedInUsers.find(a => a.id_ws === ws['id_socket']);\n\t\tif (!loggedInUser) return;\n\n\t\tconst now = new Date();\n\t\tconst existingEntry = this.latencyBuffer.get(ws['id_socket']);\n\t\tconst newLatency = ws['latency'];\n\n\t\t// Throttle updates: only update if time threshold has passed or latency has significantly changed\n\t\tif (\n\t\t\t!existingEntry || \n\t\t\t(now.getTime() - existingEntry.lastUpdate.getTime() >= this.LATENCY_UPDATE_THRESHOLD_MS) || \n\t\t\t(Math.abs(newLatency - existingEntry.latency) > 100) // Optional: log only significant changes\n\t\t) {\n\t\t\t// Update in-memory and buffer\n\t\t\tloggedInUser.date = now;\n\t\t\tthis.latencyBuffer.set(ws['id_socket'], { latency: newLatency, lastUpdate: now });\n\t\t}\n\t}\n\n\t// Method to flush buffered latency updates in bulk\n\tprivate async flushThrottledLatencyUpdates() {\n\t\tif (this.latencyBuffer.size === 0) return; // No updates to flush\n\n\t\tconst updates = Array.from(this.latencyBuffer.entries()).map(([id_ws, { latency, lastUpdate }]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { id_ws },\n\t\t\t\tupdate: { $set: { latency, date: lastUpdate } }\n\t\t\t}\n\t\t}));\n\n\t\ttry {\n\t\t\tawait LoggedInUsers.bulkWrite(updates);\n\t\t\tthis.latencyBuffer.clear(); // Clear buffer after successful update\n\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Throttled latency batch update successful', updates.length);\n\t\t\t}\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'Sub Manager', 'Throttled latency batch update failed', error);\n\t\t\t// Optional: implement retry logic or logging for failed updates\n\t\t}\n\t}\n\n\t// Subscribe to publication\n\tpublic subscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugSubHits += 1;\n\n\t\tif (!this._debugSubCollections.some(a => a.publication === publication)) {\n\t\t\tthis._debugSubCollections.push({\n\t\t\t\tpublication: publication,\n\t\t\t\thits: 1\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis._debugSubCollections.find(a => a.publication === publication).hits += 1;\n\t\t}\n\n\t\tlet pub = this._publications[publication];\n\n\t\tif (!pub) {\n\t\t\tconsole.error(new Date(), 'No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tif (subscriptionData.length > 1 || subscriptionData[0]) {\n\t\t\t\tif (!pub.check) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Function For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (!pub.check._schema) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Schema For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet valObj = {};\n\t\t\t\t\tlet valKeys = Object.keys(pub.check._schema);\n\n\t\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\n\t\t\t\t\tfor (let i = 0; i < subscriptionData.length; i++) {\n\t\t\t\t\t\tvalObj[rootKeys[i]] = subscriptionData[i];\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpub.check.validate(valObj);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (errors) {\n\t\t\t\t\t\tif (errors) {\n\t\t\t\t\t\t\tconsole.error(new Date(), 'Error in Pub Check (' + publication + ')', errors);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (messageRoute !== 'Bypass') {\n\t\t\t\tlet urlData = messageRoute.split('/');\n\t\t\t\tlet urlModule = '';\n\t\t\t\tlet urlNext = urlData[0];\n\n\t\t\t\tif (urlData[0] === '') {\n\t\t\t\t\turlModule = '/';\n\t\t\t\t\turlNext = urlData[1];\n\t\t\t\t}\n\n\t\t\t\turlModule += urlNext;\n\n\t\t\t\tif (urlData.length > 1) {\n\t\t\t\t\turlModule += '/';\n\t\t\t\t}\n\n\t\t\t\tlet otherRouteSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_socket === ws['id_socket'] && b.messageRoute !== 'Bypass' && b.messageRoute !== '/' && b.messageRoute !== messageRoute && !b.messageRoute.startsWith(urlModule)));\n\n\t\t\t\tif (otherRouteSubs.length) {\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Detected Undestroyed Subscription - ' + this.serverConfig['CLIENT_NAME'], 'USER: ' + ws['user'] + ' (Socket: ' + ws['id_socket'] + ') ' + ' is on route: ' + messageRoute + ' but has the following subscriptions on other routes:' + JSON.stringify(otherRouteSubs, null, 2));\n\n\t\t\t\t\totherRouteSubs.forEach(otherSub => {\n\t\t\t\t\t\totherSub.clients.filter(a => a.id_socket === ws['id_socket']).forEach(client => {\n\t\t\t\t\t\t\tthis.unsubscribe(client.messageRoute, new Date(), ws, client.messageId, otherSub.publication, otherSub.subscriptionData);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\t// If sub found (another user watching same data), add client to same sub\n\t\t\tif (sub) {\n\t\t\t\tif (!sub.clients.some(a => a.id_socket === ws['id_socket'] && a.messageId === messageId)) {\n\t\t\t\t\tsub.clients.push({\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If sub not found, create new sub\n\t\t\telse {\n\t\t\t\tthis._subscriptions.push({\n\t\t\t\t\tpublication: publication,\n\t\t\t\t\tsubscriptionData: subscriptionData,\n\t\t\t\t\tcollections: this.getPublicationCollections(publication),\n\t\t\t\t\tclients: [{\n\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\tid_socket: ws['id_socket'],\n\t\t\t\t\t\tmessageRoute: messageRoute,\n\t\t\t\t\t}],\n\t\t\t\t\tcacheId: 0,\n\t\t\t\t\trunning: false,\n\t\t\t\t\trunAgain: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!sub) {\n\t\t\t\tsub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\t\t\t}\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'New Sub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t}\n\n\t\t\t// Immediately send data to the new client\n\t\t\tthis.processSubscription(sub, ws, messageId);\n\t\t}\n\t}\n\n\tpublic async createLoggedInUser(id_ws: string): Promise<LoggedInUserModel> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet ws = this._websocketManager.getWebSocket(id_ws);\n\n\t\t\tif (ws) {\n\t\t\t\tlet user = {\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t__v: 0,\n\t\t\t\t\tdate: new Date(),\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\t\n\t\t\t\tthis._loggedInUsers.push(user);\n\t\t\t\tLoggedInUsers.insertOne(user);\n\t\t\t\t\n\t\t\t\tresolve(user);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresolve(null);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Unsubscribe from publication \n\tpublic unsubscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugUnSubHits += 1;\n\n\t\tif (!this._publications[publication]) {\n\t\t\tconsole.log('No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData));\n\n\t\t\tif (sub) {\n\t\t\t\tfor (let i = sub.clients.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (sub.clients[i].id_user === ws['id_user'] && sub.clients[i].messageId === messageId && sub.clients[i].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Unsub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Unsubscribe from publication\n\tpublic async unsubscribeAll(ws: WebSocket) {\n\t\tthis._debugUnSubAllHits += 1;\n\n\t\tif (ws) {\n\t\t\t// Check if WebSocket has already been unsubscribed\n\t\t\tif (ws['isUnsubscribed']) {\n\t\t\t\treturn; // Skip if already unsubscribed\n\t\t\t}\n\t\t\t\n\t\t\t// Mark the WebSocket as unsubscribed to prevent further calls\n\t\t\tws['isUnsubscribed'] = true;\n\t\t\t\n\t\t\tif (this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']) >= 0) {\n\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']), 1);\n\t\t\t}\n\t\t\tLoggedInUsers.deleteOne({ id_ws: ws['id_socket'] });\n\n\t\t\tlet userSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_user === ws['id_user'] && b.id_socket === ws['id_socket']));\n\n\t\t\tfor (let i = userSubs.length - 1; i >= 0; i--) {\n\t\t\t\tlet sub = userSubs[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tif (sub.clients[j].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._websocketManager.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic getActiveSubscriptions() {\n\t\treturn this._subscriptions;\n\t}\n\n\t// Get publication collection\n\tprivate getPublicationCollections(publication: string) {\n\t\treturn this._publications[publication].collections;\n\t}\n\n\t// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)\n\tprivate async tailOpLog(resumeToken?: ResumeToken) {\n\t\tif (this._oplog$ && !this._oplog$.closed) {\n\t\t\tthis._oplog$.removeAllListeners();\n\t\t\tthis._oplog$.close();\n\t\t\tthis._oplog$ = null;\n\t\t}\n\n\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\n\t\tif (!this._oplog$ || this._oplog$.closed) {\n\t\t\tthis._oplogRetryCount += 1;\n\n\t\t\tif (this._oplogRetryCount > 5) {\n\t\t\t\tconsole.error('****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst pipeline = [\n\t\t\t\t{\n\t\t\t\t\t$match: {\n\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tlet lastResumeToken: ResumeToken;\n\n\t\t\tif (resumeToken) {\n\t\t\t\tlastResumeToken = resumeToken;\n\t\t\t\ttry {\n\t\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch(pipeline, { resumeAfter: resumeToken });\n\t\t\t\t}\n\t\t\t\tcatch (errOp) {\n\t\t\t\t\tif (this._oplog$) {\n\t\t\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\t\t\tthis._oplog$.close();\n\t\t\t\t\t\tthis._oplog$ = null;\n\t\t\t\t\t}\n\t\t\t\t\tthis.tailOpLog(resumeToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._oplog$ = ResolveIOServer.getMainDB().watch(pipeline);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'oplog started');\n\n\t\t\tthis._oplog$.on('change', (doc: ChangeStreamInsertDocument | ChangeStreamUpdateDocument | ChangeStreamReplaceDocument | ChangeStreamDeleteDocument) => {\n\t\t\t\tif (doc.ns) {\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Oplog Hit', doc.ns);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet collection = doc.ns.coll;\n\n\t\t\t\t\tif (!this._debugOplogCollections.some(a => a.collection === doc.ns.coll && a.type === doc.operationType)) {\n\t\t\t\t\t\tthis._debugOplogCollections.push({\n\t\t\t\t\t\t\tcollection: doc.ns.coll,\n\t\t\t\t\t\t\ttype: doc.operationType,\n\t\t\t\t\t\t\thits: 1\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._debugOplogCollections.find(a => a.collection === doc.ns.coll && a.type === doc.operationType).hits += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection) {\n\t\t\t\t\t\tthis._debugOplogHits += 1;\n\n\t\t\t\t\t\tif (doc.operationType === 'insert') {\n\t\t\t\t\t\t\tif (collection === 'support-tickets') {\n\t\t\t\t\t\t\t\tif (this.serverConfig['ROOT_URL'] === 'https://resolveio.com') {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'sendSupportTicketEmail', doc.documentKey['_id']);\n\t\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'insert');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'update' || doc.operationType === 'replace') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'update');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'delete') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tthis.invalidatePubsCache(collection, 'delete');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection === 'flags') {\n\t\t\t\t\t\tFlags.findOne({ type: 'Enable Debug' }).then(flag => {\n\t\t\t\t\t\t\tif (flag && flag.value) {\n\t\t\t\t\t\t\t\tthis._enableDebug = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tthis._enableDebug = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlastResumeToken = doc._id;\n\n\t\t\t\t\tif ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && (process.env.IS_WORKERS_ENABLED === 'false' || (process.env.IS_WORKER_INSTANCE === 'true' && process.env.WORKER_INDEX === '0'))) {\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._oplog$.on('error', error => {\n\t\t\t\tconsole.log(new Date(), 'oplog error', error);\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$.close();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\n\t\t\tthis._oplog$.on('end', () => {\n\t\t\t\tconsole.log(new Date(), 'oplog end');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$.close();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\n\t\t\tthis._oplog$.on('close', () => {\n\t\t\t\tconsole.log(new Date(), 'oplog close');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tthis.tailOpLog(lastResumeToken);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async processSubscription(sub: ActiveSubscriptionModel, ws: WebSocket, messageId: number) {\n\t\tif (!this._publications[sub.publication].user_specific) {\t\t\t\n\t\t\tif (sub.cacheId) {\n\t\t\t\ttry {\n\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\tdata: cacheData\n\t\t\t\t\t};\n\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Cache', sub.publication);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\tsub.cacheId = 0;\n\n\t\t\t\t\tthis.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Non - Cache', sub.publication, sub.running);\n\t\t\t\t}\n\n\t\t\t\tif (sub.running) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Process Sub Specific, Non - Cache', sub.publication, sub.running);\n\t\t\t}\n\n\t\t\tif (sub.running) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tthis.sendDataToOneWithRetry(ws, messageId, sub, '', 'newSub');\n\t\t}\n\t}\n\n\tprivate async sendDataToOne(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('User Specific Publication', sub.publication, '', '', sub.subscriptionData);\n\t\ttry {\n\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\n\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ws['id_user'], ...sub.subscriptionData);\n\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: res\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: err\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\n\t\t\tResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendDataToOne - WS)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToAll(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tif (!sub.clients.length) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\tsub.cacheId = 0;\n\t\t\t}\n\n\t\t\tlet subIndex = this._subscriptions.findIndex(a => a.publication === sub.publication && JSON.stringify(a.subscriptionData) === JSON.stringify(sub.subscriptionData));\n\t\t\tif (subIndex >= 0) {\n\t\t\t\tthis._subscriptions.splice(subIndex, 1);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Publication', sub.publication, '', '', sub.subscriptionData);\n\n\t\t\ttry {\n\t\t\t\tif (sub.publication !== 'superadminAPM' && sub.publication !== 'loggedInUsers') {\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\t\t\t\t}\n\n\t\t\t\tlet res = await this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ...sub.subscriptionData);\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\tif (sub.cacheId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\t\n\t\t\t\t\t\tif (JSON.stringify(cacheData) !== JSON.stringify(res)) {\n\t\t\t\t\t\t\tPromise.all(\n\t\t\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\n\t\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\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\n\t\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t\t!sub.collections.includes('log-method-latencies') &&\n\t\t\t\t\t\t\t\t!sub.collections.includes('log-subscriptions') &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tPromise.all(\n\t\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t!sub.collections.includes('log-method-latencies') &&\n\t\t\t\t\t\t\t!sub.collections.includes('log-subscriptions') &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tPromise.all(\n\t\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t!sub.collections.includes('log-method-latencies') &&\n\t\t\t\t\t\t!sub.collections.includes('log-subscriptions') &&\n\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\n\t\t\t\t\t\tconst nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\t\t\t\t// Evict cache entries as needed\n\t\t\t\t\t\t\tlet deleteCount = 0;\n\t\t\t\t\t\t\tconst subArr = this._subscriptions.filter(a => a.cacheId && !a.clients.length);\n\t\t\t\t\t\n\t\t\t\t\t\t\tfor (let zz = 0; zz < subArr.length; zz++) {\n\t\t\t\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\t\t\t\tthis._nodeCache.del(subArr[zz].cacheId);\n\t\t\t\t\t\t\t\tsubArr[zz].cacheId = 0;\n\t\t\t\t\t\t\t\tdeleteCount += 1;\n\t\t\t\t\t\t\t\tif (this._nodeCache.getStats().vsize < this._heapLimit * 0.75) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t'Sub Cache: ' +\n\t\t\t\t\t\t\t\t\t'Too Big - ' +\n\t\t\t\t\t\t\t\t\tsub.publication +\n\t\t\t\t\t\t\t\t\t' - Deleted: ' +\n\t\t\t\t\t\t\t\t\tdeleteCount +\n\t\t\t\t\t\t\t\t\t' - ' +\n\t\t\t\t\t\t\t\t\tnodeCacheSize\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\tPromise.all(\n\t\t\t\t\tsub.clients.map(async client => {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\thasError: true,\n\t\t\t\t\t\t\t\tdata: err\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\tResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendPubData)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate sendWS(ws: WebSocket, data: ServerResponseModel) {\n\t\tthis._websocketManager.send(ws, data);\n\t}\n\n\tpublic getEnableDebug() {\n\t\treturn this._enableDebug;\n\t}\n}\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { WebSocket } from 'ws';
|
|
2
|
-
import ResolveIOMainServer from '../server-app';
|
|
3
2
|
interface ServerResponseModel {
|
|
4
3
|
messageId: number;
|
|
5
4
|
hasError: boolean;
|
|
@@ -12,7 +11,7 @@ export declare class WebSocketManager {
|
|
|
12
11
|
private _maxMessageSize;
|
|
13
12
|
private _messageDelay;
|
|
14
13
|
private _webSockets;
|
|
15
|
-
constructor(mainServer:
|
|
14
|
+
constructor(mainServer: any, maxMessageSize?: number, messageDelay?: number);
|
|
16
15
|
addWebSocket(ws: WebSocket): void;
|
|
17
16
|
removeWebSocket(ws: WebSocket): void;
|
|
18
17
|
getWebSocket(id_socket: string): WebSocket | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/managers/websocket.manager.ts"],"names":["WebSocketManager","mainServer","maxMessageSize","messageDelay","this","_messageBuffers","Map","_batchingTimers","_webSockets","_mainServer","_maxMessageSize","_messageDelay","prototype","addWebSocket","ws","wsId","set","removeWebSocket","delete","closeConnection","getWebSocket","id_socket","get","send","data","_this","has","push","messageId","hasError","timer","setTimeout","flushMessages","combinedData","messages","length","JSON","stringify","Buffer","byteLength","sendMessagesInChunks","error","handleSendError","clearTimeout","chunk","chunkSize","messages_1","__values","messages_1_1","next","done","message","value","messageData","messageSize","getSubscriptionManager","getEnableDebug","console","log","Date","unsubscribeAll","close","process","nextTick","OPEN","CLOSING","includes","readyState","terminate","exports"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/managers/websocket.manager.ts"],"names":["WebSocketManager","mainServer","maxMessageSize","messageDelay","this","_messageBuffers","Map","_batchingTimers","_webSockets","_mainServer","_maxMessageSize","_messageDelay","prototype","addWebSocket","ws","wsId","set","removeWebSocket","delete","closeConnection","getWebSocket","id_socket","get","send","data","_this","has","push","messageId","hasError","timer","setTimeout","flushMessages","combinedData","messages","length","JSON","stringify","Buffer","byteLength","sendMessagesInChunks","error","handleSendError","clearTimeout","chunk","chunkSize","messages_1","__values","messages_1_1","next","done","message","value","messageData","messageSize","getSubscriptionManager","getEnableDebug","console","log","Date","unsubscribeAll","close","process","nextTick","OPEN","CLOSING","includes","readyState","terminate","exports"],"mappings":"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","file":"websocket.manager.js","sourcesContent":["import { WebSocket } from 'ws';\n\ninterface ServerResponseModel {\n\tmessageId: number;\n\thasError: boolean;\n\tdata: any;\n}\n\nexport class WebSocketManager {\n\tprivate _mainServer;\n\tprivate _messageBuffers: Map<string, ServerResponseModel[]> = new Map();\n\tprivate _batchingTimers: Map<string, NodeJS.Timeout> = new Map();\n\tprivate _maxMessageSize: number;\n\tprivate _messageDelay: number;\n\tprivate _webSockets: Map<string, WebSocket> = new Map();\n\n\tconstructor(mainServer, maxMessageSize: number = 20480, messageDelay: number = 25) {\n\t\tthis._mainServer = mainServer;\n\t\tthis._maxMessageSize = maxMessageSize;\n\t\tthis._messageDelay = messageDelay;\n\t}\n\n\tpublic addWebSocket(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tthis._webSockets.set(wsId, ws);\n\t}\n\n\tpublic removeWebSocket(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tthis._webSockets.delete(wsId);\n\t\tthis.closeConnection(ws);\n\t}\n\n\tpublic getWebSocket(id_socket: string): WebSocket | undefined {\n\t\treturn this._webSockets.get(id_socket);\n\t}\n\n\tpublic send(ws: WebSocket, data: ServerResponseModel | string): void {\n\t\tconst wsId = ws['id_socket'];\n\n\t\tif (!this._messageBuffers.has(wsId)) {\n\t\t\tthis._messageBuffers.set(wsId, []);\n\t\t}\n\n\t\tif (typeof data === 'string') {\n\t\t\t// Handle string messages like 'ping' or 'pong'\n\t\t\tthis._messageBuffers.get(wsId).push({ messageId: null, hasError: false, data: data });\n\t\t}\n\t\telse {\n\t\t\tthis._messageBuffers.get(wsId).push(data);\n\t\t}\n\n\t\tif (!this._batchingTimers.has(wsId)) {\n\t\t\t// Set a timer to send the batch after a short delay\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.flushMessages(ws);\n\t\t\t}, this._messageDelay);\n\t\t\tthis._batchingTimers.set(wsId, timer);\n\t\t}\n\t}\n\n\tprivate flushMessages(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tconst messages = this._messageBuffers.get(wsId);\n\n\t\tif (messages && messages.length > 0) {\n\t\t\t// Combine messages into one payload\n\t\t\tconst combinedData = JSON.stringify(messages);\n\t\t\tconst dataSize = Buffer.byteLength(combinedData, 'utf8');\n\n\t\t\tif (dataSize > this._maxMessageSize) {\n\t\t\t\t// Split messages to ensure each does not exceed max size\n\t\t\t\tthis.sendMessagesInChunks(ws, messages);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tws.send(combinedData, (error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.handleSendError(ws, error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Clear the buffer and timer\n\t\t\tthis._messageBuffers.delete(wsId);\n\t\t\tclearTimeout(this._batchingTimers.get(wsId));\n\t\t\tthis._batchingTimers.delete(wsId);\n\t\t}\n\t}\n\n\tprivate sendMessagesInChunks(ws: WebSocket, messages: ServerResponseModel[]): void {\n\t\tlet chunk: ServerResponseModel[] = [];\n\t\tlet chunkSize = 0;\n\n\t\tfor (const message of messages) {\n\t\t\tconst messageData = JSON.stringify([message]); // Wrap message in array for consistency\n\t\t\tconst messageSize = Buffer.byteLength(messageData, 'utf8');\n\n\t\t\tif (chunkSize + messageSize > this._maxMessageSize) {\n\t\t\t\t// Send current chunk\n\t\t\t\tws.send(JSON.stringify(chunk), (error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.handleSendError(ws, error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Start new chunk\n\t\t\t\tchunk = [message];\n\t\t\t\tchunkSize = messageSize;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tchunk.push(message);\n\t\t\t\tchunkSize += messageSize;\n\t\t\t}\n\t\t}\n\n\t\t// Send any remaining messages\n\t\tif (chunk.length > 0) {\n\t\t\tws.send(JSON.stringify(chunk), (error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tthis.handleSendError(ws, error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate handleSendError(ws: WebSocket, error: Error): void {\n\t\tif (this._mainServer.getSubscriptionManager()) {\n\t\t\t// Handle send error, e.g., unsubscribe, close connection\n\t\t\tif (this._mainServer.getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Unsub WS', ws['user'], ws['id_socket'], error);\n\t\t\t}\n\t\t\tthis._mainServer.getSubscriptionManager().unsubscribeAll(ws);\n\t\t\tthis.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic closeConnection(ws: WebSocket): void {\n\t\tws.close();\n\t\tconst wsId = ws['id_socket'];\n\t\t// Clean up buffers and timers\n\t\tthis._messageBuffers.delete(wsId);\n\t\tif (this._batchingTimers.has(wsId)) {\n\t\t\tclearTimeout(this._batchingTimers.get(wsId));\n\t\t\tthis._batchingTimers.delete(wsId);\n\t\t}\n \n process.nextTick(() => {\n if ([ws.OPEN, ws.CLOSING].includes(<any>ws.readyState)) {\n // Socket still hangs, hard close\n ws.terminate();\n }\n });\n\t}\n}"]}
|
package/methods/accounts.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,
|
|
1
|
+
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,s,o){return new(s=s||Promise)(function(n,r){function fulfilled(e){try{step(o.next(e))}catch(e){r(e)}}function rejected(e){try{step(o.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?n(e.value):((r=e.value)instanceof s?r:new s(function(e){e(r)})).then(fulfilled,rejected)}step((o=o.apply(e,t||[])).next())})},__generator=this&&this.__generator||function(t,s){var o,i,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},c={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function verb(n){return function(e){var r=[n,e];if(o)throw new TypeError("Generator is already executing.");for(;l=c&&r[c=0]?0:l;)try{if(o=1,i&&(a=2&r[0]?i.return:r[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,r[1])).done)return a;switch(i=0,(r=a?[2&r[0],a.value]:r)[0]){case 0:case 1:a=r;break;case 4:return l.label++,{value:r[1],done:!1};case 5:l.label++,i=r[1],r=[0];continue;case 7:r=l.ops.pop(),l.trys.pop();continue;default:if(!(a=0<(a=l.trys).length&&a[a.length-1])&&(6===r[0]||2===r[0])){l=0;continue}if(3===r[0]&&(!a||r[1]>a[0]&&r[1]<a[3]))l.label=r[1];else if(6===r[0]&&l.label<a[1])l.label=a[1],a=r;else{if(!(a&&l.label<a[2])){a[2]&&l.ops.pop(),l.trys.pop();continue}l.label=a[2],l.ops.push(r)}}r=s.call(t,l)}catch(e){r=[6,e],i=0}finally{o=a=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},simpl_schema_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadAccountMethods=void 0,require("simpl-schema")),user_collection_1=require("../collections/user.collection"),handlebars=require("handlebars"),jwt=require("jsonwebtoken"),resolveio_server_app_1=require("../resolveio-server-app"),common_1=require("../util/common");function loadAccountMethods(e){e.methods({incorrectUser:{check:new simpl_schema_1.default({old_user:{type:Object,blackbox:!0},new_user:{type:Object,blackbox:!0},client_subs:{type:Array},"client_subs.$":{type:Object,blackbox:!0}}),function:function(t,s,o){var r=this;return new Promise(function(n,e){return __awaiter(r,void 0,void 0,function(){var r;return __generator(this,function(e){return resolveio_server_app_1.ResolveIOServer.getMainServer()&&(r=resolveio_server_app_1.ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(this.id_ws),this.sendEmail("dev@resolveio.com","SERVER - WRONG USER Detected - "+this.serverConfig.CLIENT_NAME,"Wrong User Sent!\nWS: "+JSON.stringify(r,null,2)+"\nUserMethod: "+this.user+"\nIdUserMethod: "+this.id_user+"\nSubManagerActiveSubs: "+JSON.stringify(resolveio_server_app_1.ResolveIOServer.getMainServer().getSubscriptionManager().getActiveSubscriptions(),null,2)+"\nOldUser: "+JSON.stringify(t,null,2)+"\nNewUser: "+JSON.stringify(s,null,2)+"\nClientSubs: "+JSON.stringify(o,null,2))),n(!0),[2]})})})}},reloadWS:{check:new simpl_schema_1.default({id_ws:String}),function:function(s){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){return(r=resolveio_server_app_1.ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(s))?(resolveio_server_app_1.ResolveIOServer.getMainServer().unsubscribeWS(r),n(!0)):t("No WS"),[2]})})})}},reconnectWS:{check:new simpl_schema_1.default({id_ws:String}),function:function(s){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){return(r=resolveio_server_app_1.ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(s))?(resolveio_server_app_1.ResolveIOServer.getMainServer().unsubscribeWS(r),n(!0)):t("No WS"),[2]})})})}},disconnectWS:{check:new simpl_schema_1.default({id_ws:String}),function:function(s){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){return(r=resolveio_server_app_1.ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(s))?(resolveio_server_app_1.ResolveIOServer.getMainServer().unsubscribeWS(r),n(!0)):t("No WS"),[2]})})})}},createUserAndEmailEnrollment:{check:new simpl_schema_1.default({newUser:{type:user_collection_1.Users.simplschema},sendEnrollmentEmail:{type:Boolean,optional:!0}}),function:function(o,i){var e=this;return void 0===i&&(i=!0),new Promise(function(t,s){return __awaiter(e,void 0,void 0,function(){var r,n=this;return __generator(this,function(e){switch(e.label){case 0:return"admin"!==o.username.toLocaleLowerCase()?[3,1]:(s("Username can not be admin"),[2]);case 1:return[4,user_collection_1.Users.findOne({$or:[{username:o.username.toLocaleLowerCase()},{email:o.email.toLocaleLowerCase()}]})];case 2:if(e.sent())return s("Username/Email is already used"),[2];e.label=3;case 3:return o._id=(0,common_1.objectIdHexString)(),o.services={enrollment:jwt.sign({id_user:o._id},this.serverConfig.JWT_SECRET,{expiresIn:2592e5})},o.is_customer=!1,[4,user_collection_1.Users.insertOne(o)];case 4:return e.sent(),i&&(r={fullname:o.fullname,user:this.user,url:this.serverConfig.ROOT_URL+"/enroll-account?"+encodeURIComponent(this.serverConfig.SERVER_URL)+"&"+o.services.enrollment},this.readFile("email-templates/enrollment.html").then(function(e){e=handlebars.compile(e);handlebars.registerHelper("equals",function(e,r){return e===r}),n.sendEmail(o.email,"ResolveIO ("+resolveio_server_app_1.ResolveIOServer.getClientName()+") - Enrollment Email","",e(r),null,null,""),t(o)},function(e){return s(e)})),[2]}})})})}},resetUserPassword:{check:new simpl_schema_1.default({userId:{type:String}}),function:function(i){var e=this;return new Promise(function(s,o){return __awaiter(e,void 0,void 0,function(){var r,n,t=this;return __generator(this,function(e){switch(e.label){case 0:return[4,user_collection_1.Users.findOne({_id:i})];case 1:return(r=e.sent())&&(r.services||(r.services={}),r.services.forgot_password=jwt.sign({id_user:i},this.serverConfig.JWT_SECRET),n={userToChangePassword:r.fullname,userWhoResetPassword:this.user,url:this.serverConfig.ROOT_URL+"/forgot-password?"+encodeURIComponent(this.serverConfig.SERVER_URL)+"&"+r.services.forgot_password},user_collection_1.Users.updateOne({_id:r._id},{$set:{services:r.services,attempts:0}}).then(function(){t.readFile("email-templates/forgot-password.html").then(function(e){e=handlebars.compile(e);handlebars.registerHelper("equals",function(e,r){return e===r}),t.sendEmail(r.email,"ResolveIO ("+resolveio_server_app_1.ResolveIOServer.getClientName()+") - Forgot Password","",e(n),null,null,""),s(!0)},function(e){return o(e)})},function(){})),[2]}})})})}},setUserPassword:{check:new simpl_schema_1.default({userId:{type:String},password:{type:String}}),function:function(s,o){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return[4,user_collection_1.Users.findOne({_id:s})];case 1:return!(r=e.sent())||r.roles.super_admin?[3,3]:[4,user_collection_1.Users.setPassword(r,o)];case 2:return e.sent(),n(!0),[3,4];case 3:t("Invalid User"),e.label=4;case 4:return[2]}})})})}}})}exports.loadAccountMethods=loadAccountMethods;
|
|
2
2
|
//# sourceMappingURL=accounts.js.map
|
package/methods/accounts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/methods/accounts.ts"],"names":["simpl_schema_1","require","user_collection_1","handlebars","jwt","index_1","mongo_manager_1","loadAccountMethods","methodManager","methods","incorrectUser","check","default","old_user","type","Object","blackbox","new_user","client_subs","Array","client_subs.$","function","_this","this","Promise","resolve","reject","__awaiter","ResolveIOServer","getMainServer","ws","getWebSocketManager","getWebSocket","id_ws","sendEmail","serverConfig","JSON","stringify","user","id_user","getSubscriptionManager","getActiveSubscriptions","reloadWS","String","unsubscribeWS","reconnectWS","disconnectWS","createUserAndEmailEnrollment","newUser","Users","sendEnrollmentEmail","Boolean","optional","username","toLocaleLowerCase","findOne","$or","email","_a","sent","_id","objectIdHexString","services","enrollment","sign","expiresIn","is_customer","insertOne","emailData_1","fullname","url","encodeURIComponent","readFile","then","html","template","compile","registerHelper","a","b","getClientName","errEmail","resetUserPassword","userId","emailData_2","userToChangePassword","userWhoResetPassword","updateOne","$set","attempts","setUserPassword","password","roles","super_admin","setPassword","exports"],"mappings":"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","file":"accounts.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { Users } from '../collections/user.collection';\nimport * as handlebars from 'handlebars';\nimport * as jwt from 'jsonwebtoken';\nimport { MethodManager } from '../managers/method.manager';\nimport { ResolveIOServer } from '../index';\nimport { UserModel } from '../models/user.model';\nimport { objectIdHexString } from '../managers/mongo.manager';\n\nexport function loadAccountMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tincorrectUser: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\told_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tnew_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tclient_subs: {\n\t\t\t\t\ttype: Array\n\t\t\t\t},\n\t\t\t\t'client_subs.$': {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(old_user, new_user, client_subs) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tif (ResolveIOServer.getMainServer()) {\n\t\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(this.id_ws);\n\n\t\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - WRONG USER Detected - ' + this.serverConfig['CLIENT_NAME'], 'Wrong User Sent!\\nWS: ' + JSON.stringify(ws, null, 2) + '\\nUserMethod: ' + this.user + '\\nIdUserMethod: ' + this.id_user + '\\nSubManagerActiveSubs: ' + JSON.stringify(ResolveIOServer.getMainServer().getSubscriptionManager().getActiveSubscriptions(), null, 2) + '\\nOldUser: ' + JSON.stringify(old_user, null, 2) + '\\nNewUser: ' + JSON.stringify(new_user, null, 2) + '\\nClientSubs: ' + JSON.stringify(client_subs, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treloadWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdisconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcreateUserAndEmailEnrollment: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tnewUser: {\n\t\t\t\t\ttype: Users['simplschema']\n\t\t\t\t},\n\t\t\t\tsendEnrollmentEmail: {\n\t\t\t\t\ttype: Boolean,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(newUser: UserModel, sendEnrollmentEmail = true) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tif (newUser.username.toLocaleLowerCase() === 'admin') {\n\t\t\t\t\t\treject('Username can not be admin');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet otherUser = await Users.findOne({\n\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t{username: newUser.username.toLocaleLowerCase()},\n\t\t\t\t\t\t\t\t{email: newUser.email.toLocaleLowerCase()}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (otherUser) {\n\t\t\t\t\t\t\treject('Username/Email is already used');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tnewUser._id = objectIdHexString();\n\n\t\t\t\t\tnewUser.services = {\n\t\t\t\t\t\tenrollment: jwt.sign({id_user: newUser._id}, this.serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 3 * 24 * 60 * 60 * 1000 // 3 days\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\n\t\t\t\t\tnewUser.is_customer = false;\n\t\t\t\t\t\n\t\t\t\t\tawait Users.insertOne(newUser);\n\n\t\t\t\t\tif (sendEnrollmentEmail) {\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tfullname: newUser.fullname,\n\t\t\t\t\t\t\tuser: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/enroll-account?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + newUser.services['enrollment'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.readFile('email-templates/enrollment.html').then(html => {\n\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\tthis.sendEmail(newUser.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Enrollment Email', '', template(emailData), null, null, '');\n\t\t\n\t\t\t\t\t\t\tresolve(newUser);\n\t\t\t\t\t\t}, errEmail => reject(errEmail));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: userId}, this.serverConfig['JWT_SECRET']);\n\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\t\tuserWhoResetPassword: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {services: user.services, attempts: 0}}).then(() => {\n\t\t\t\t\t\t\tthis.readFile('email-templates/forgot-password.html').then(html => {\n\t\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t\t});\n\t\t\t\n\t\t\t\t\t\t\t\tthis.sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\n\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t}, errEmail => reject(errEmail));\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\tsetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string, password: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user && !user.roles.super_admin) {\n\t\t\t\t\t\tawait Users.setPassword(user, password);\n\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('Invalid User');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/methods/accounts.ts"],"names":["simpl_schema_1","require","user_collection_1","handlebars","jwt","resolveio_server_app_1","common_1","loadAccountMethods","methodManager","methods","incorrectUser","check","default","old_user","type","Object","blackbox","new_user","client_subs","Array","client_subs.$","function","_this","this","Promise","resolve","reject","__awaiter","ResolveIOServer","getMainServer","ws","getWebSocketManager","getWebSocket","id_ws","sendEmail","serverConfig","JSON","stringify","user","id_user","getSubscriptionManager","getActiveSubscriptions","reloadWS","String","unsubscribeWS","reconnectWS","disconnectWS","createUserAndEmailEnrollment","newUser","Users","sendEnrollmentEmail","Boolean","optional","username","toLocaleLowerCase","findOne","$or","email","_a","sent","_id","objectIdHexString","services","enrollment","sign","expiresIn","is_customer","insertOne","emailData_1","fullname","url","encodeURIComponent","readFile","then","html","template","compile","registerHelper","a","b","getClientName","errEmail","resetUserPassword","userId","emailData_2","userToChangePassword","userWhoResetPassword","updateOne","$set","attempts","setUserPassword","password","roles","super_admin","setPassword","exports"],"mappings":"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","file":"accounts.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { Users } from '../collections/user.collection';\nimport * as handlebars from 'handlebars';\nimport * as jwt from 'jsonwebtoken';\nimport { MethodManager } from '../managers/method.manager';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { UserModel } from '../models/user.model';\nimport { objectIdHexString } from '../util/common';\n\nexport function loadAccountMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tincorrectUser: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\told_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tnew_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tclient_subs: {\n\t\t\t\t\ttype: Array\n\t\t\t\t},\n\t\t\t\t'client_subs.$': {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(old_user, new_user, client_subs) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tif (ResolveIOServer.getMainServer()) {\n\t\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(this.id_ws);\n\n\t\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - WRONG USER Detected - ' + this.serverConfig['CLIENT_NAME'], 'Wrong User Sent!\\nWS: ' + JSON.stringify(ws, null, 2) + '\\nUserMethod: ' + this.user + '\\nIdUserMethod: ' + this.id_user + '\\nSubManagerActiveSubs: ' + JSON.stringify(ResolveIOServer.getMainServer().getSubscriptionManager().getActiveSubscriptions(), null, 2) + '\\nOldUser: ' + JSON.stringify(old_user, null, 2) + '\\nNewUser: ' + JSON.stringify(new_user, null, 2) + '\\nClientSubs: ' + JSON.stringify(client_subs, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treloadWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdisconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcreateUserAndEmailEnrollment: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tnewUser: {\n\t\t\t\t\ttype: Users['simplschema']\n\t\t\t\t},\n\t\t\t\tsendEnrollmentEmail: {\n\t\t\t\t\ttype: Boolean,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(newUser: UserModel, sendEnrollmentEmail = true) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tif (newUser.username.toLocaleLowerCase() === 'admin') {\n\t\t\t\t\t\treject('Username can not be admin');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet otherUser = await Users.findOne({\n\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t{username: newUser.username.toLocaleLowerCase()},\n\t\t\t\t\t\t\t\t{email: newUser.email.toLocaleLowerCase()}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (otherUser) {\n\t\t\t\t\t\t\treject('Username/Email is already used');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tnewUser._id = objectIdHexString();\n\n\t\t\t\t\tnewUser.services = {\n\t\t\t\t\t\tenrollment: jwt.sign({id_user: newUser._id}, this.serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 3 * 24 * 60 * 60 * 1000 // 3 days\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\n\t\t\t\t\tnewUser.is_customer = false;\n\t\t\t\t\t\n\t\t\t\t\tawait Users.insertOne(newUser);\n\n\t\t\t\t\tif (sendEnrollmentEmail) {\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tfullname: newUser.fullname,\n\t\t\t\t\t\t\tuser: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/enroll-account?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + newUser.services['enrollment'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.readFile('email-templates/enrollment.html').then(html => {\n\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\tthis.sendEmail(newUser.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Enrollment Email', '', template(emailData), null, null, '');\n\t\t\n\t\t\t\t\t\t\tresolve(newUser);\n\t\t\t\t\t\t}, errEmail => reject(errEmail));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: userId}, this.serverConfig['JWT_SECRET']);\n\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\t\tuserWhoResetPassword: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {services: user.services, attempts: 0}}).then(() => {\n\t\t\t\t\t\t\tthis.readFile('email-templates/forgot-password.html').then(html => {\n\t\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t\t});\n\t\t\t\n\t\t\t\t\t\t\t\tthis.sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\n\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t}, errEmail => reject(errEmail));\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\tsetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string, password: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user && !user.roles.super_admin) {\n\t\t\t\t\t\tawait Users.setPassword(user, password);\n\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('Invalid User');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n}"]}
|
package/methods/aws.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var __awaiter=this&&this.__awaiter||function(e,i,r,o){return new(r=r||Promise)(function(n,t){function fulfilled(e){try{step(o.next(e))}catch(e){t(e)}}function rejected(e){try{step(o.throw(e))}catch(e){t(e)}}function step(e){var t;e.done?n(e.value):((t=e.value)instanceof r?t:new r(function(e){e(t)})).then(fulfilled,rejected)}step((o=o.apply(e,i||[])).next())})},__generator=this&&this.__generator||function(i,r){var o,s,c,l={label:0,sent:function(){if(1&c[0])throw c[1];return c[1]},trys:[],ops:[]},a={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function verb(n){return function(e){var t=[n,e];if(o)throw new TypeError("Generator is already executing.");for(;l=a&&t[a=0]?0:l;)try{if(o=1,s&&(c=2&t[0]?s.return:t[0]?s.throw||((c=s.return)&&c.call(s),0):s.next)&&!(c=c.call(s,t[1])).done)return c;switch(s=0,(t=c?[2&t[0],c.value]:t)[0]){case 0:case 1:c=t;break;case 4:return l.label++,{value:t[1],done:!1};case 5:l.label++,s=t[1],t=[0];continue;case 7:t=l.ops.pop(),l.trys.pop();continue;default:if(!(c=0<(c=l.trys).length&&c[c.length-1])&&(6===t[0]||2===t[0])){l=0;continue}if(3===t[0]&&(!c||t[1]>c[0]&&t[1]<c[3]))l.label=t[1];else if(6===t[0]&&l.label<c[1])l.label=c[1],c=t;else{if(!(c&&l.label<c[2])){c[2]&&l.ops.pop(),l.trys.pop();continue}l.label=c[2],l.ops.push(t)}}t=r.call(i,l)}catch(e){t=[6,e],s=0}finally{o=c=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},file_collection_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadAWSMethods=void 0,require("../collections/file.collection")),simpl_schema_1=require("simpl-schema"),index_1=require("../index"),mongo_manager_1=require("../managers/mongo.manager"),client_s3_1=require("@aws-sdk/client-s3"),s3_request_presigner_1=require("@aws-sdk/s3-request-presigner"),request=require("request").defaults({encoding:null}),fs=require("fs"),pdfCnt=1e6;function loadAWSMethods(e){e.methods({uploadFileAndSave:{check:new simpl_schema_1.default({fileName:{type:String},fileData:{type:String},fileSize:{type:Number},fileOrder:{type:Number},fileType:{type:String},compress:{type:Boolean}}),function:function(l,a,u,f,_,e){var t=this;return new Promise(function(s,c){return __awaiter(t,void 0,void 0,function(){var t,n,i,r,o;return __generator(this,function(e){return l?(t="uploads/"+Date.now()+"-"+pdfCnt+++"-"+l,n=this.getAWS().s3(),i=3,r=0,(o=function(){n.putObject({Bucket:process.env.AWS_S3_BUCKET,Key:t,Body:Buffer.from(a.replace("data:"+a.split(",")[0].split(":")[1].split(";")[0]+";base64,",""),"base64"),ACL:"private",ContentType:a.split(",")[0].split(":")[1].split(";")[0],ContentDisposition:"inline"}).then(function(e){e?file_collection_1.Files.create({_id:(0,mongo_manager_1.objectIdHexString)(),__v:0,name:l,size:u,key:t,order:f,type:_}).then(function(e){s(e)}).catch(function(e){c(e)}):s(null)}).catch(function(e){var t;++r<=i?(t=1e3*Math.pow(2,r),console.warn("Attempt ".concat(r," failed. Retrying in ").concat(t/1e3," seconds...")),setTimeout(o,t)):c(new Error("Failed to upload after ".concat(i," attempts: ").concat(e.message)))})})()):c(new Error("Invalid fileName provided")),[2]})})})}},uploadNonPDFFileAndSave:{check:new simpl_schema_1.default({fileName:{type:String},fileData:{type:String},fileSize:{type:Number},fileOrder:{type:Number},fileType:{type:String}}),function:function(r,e,o,s,c){var l=this;return new Promise(function(t,n){var i;r&&(i="uploads/"+Date.now()+"-"+r,l.getAWS().s3().putObject({Bucket:process.env.AWS_S3_BUCKET,Key:i,Body:Buffer.from(e),ACL:"private",ContentType:"application/gzip",ContentDisposition:"inline"}).then(function(e){e?file_collection_1.Files.create({_id:(0,mongo_manager_1.objectIdHexString)(),__v:0,name:r,size:o,key:i,order:s,type:c}).then(function(e){t(e)},function(e){return n(e)}):t(null)},function(e){n(e)}))})}},uploadNonPDFBufferAndSave:{check:new simpl_schema_1.default({fileName:{type:String},fileDataBuffer:{type:Buffer},fileSize:{type:Number},fileOrder:{type:Number},fileType:{type:String}}),function:function(r,e,o,s,c){var l=this;return new Promise(function(t,n){var i;r&&(i="uploads/"+Date.now()+"-"+r,l.getAWS().s3().putObject({Bucket:process.env.AWS_S3_BUCKET,Key:i,Body:e,ACL:"private",ContentType:"application/gzip",ContentDisposition:"inline"}).then(function(e){e?file_collection_1.Files.create({_id:(0,mongo_manager_1.objectIdHexString)(),__v:0,name:r,size:o,key:i,order:s,type:c}).then(function(e){t(e)},function(e){return n(e)}):t(null)},function(e){n(e)}))})}},uploadNonPDFStreamAndSave:{check:new simpl_schema_1.default({fileName:{type:String},fileData:{type:String},fileOrder:{type:Number},fileType:{type:String}}),function:function(r,e,o,s){var c=this;return new Promise(function(t,n){var i;r&&(i="uploads/"+Date.now()+"-"+r,c.getAWS().s3().putObject({Bucket:process.env.AWS_S3_BUCKET,Key:i,Body:fs.createReadStream(e),ACL:"private",ContentType:"application/gzip",ContentDisposition:"inline"}).then(function(e){e?file_collection_1.Files.create({_id:(0,mongo_manager_1.objectIdHexString)(),__v:0,name:r,size:1,key:i,order:o,type:s}).then(function(e){t(e)},function(e){return n(e)}):t(null)},function(e){n(e)}))})}},deleteFiles:{check:new simpl_schema_1.default({keys:{type:Array},"keys.$":{type:String}}),function:function(o){var t=this;return new Promise(function(r,e){return __awaiter(t,void 0,void 0,function(){var t,n,i=this;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.find({key:{$in:o}})];case 1:return t=e.sent(),n=t.length,t.forEach(function(e){file_collection_1.Files.deleteOne({_id:e._id}),i.getAWS().s3().deleteObject({Bucket:process.env.AWS_S3_BUCKET,Key:e.key}).then(function(e){!e||--n||r(t.length)})}),[2]}})})})}},deleteFile:{check:new simpl_schema_1.default({key:{type:String}}),function:function(r){var e=this;return new Promise(function(n,i){return __awaiter(e,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.findOne({key:r})];case 1:return(t=e.sent())&&file_collection_1.Files.deleteOne({_id:t._id}),this.getAWS().s3().deleteObject({Bucket:process.env.AWS_S3_BUCKET,Key:r}).then(function(e){n(e)},function(e){i(e)}),[2]}})})})}},deleteFileWithId:{check:new simpl_schema_1.default({id_file:{type:String}}),function:function(r){var e=this;return new Promise(function(n,i){return __awaiter(e,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.findOne({_id:r})];case 1:return(t=e.sent())||i("Could not find file"),this.getAWS().s3().deleteObject({Bucket:process.env.AWS_S3_BUCKET,Key:t.key}).then(function(e){n(e)},function(e){i(e)}),file_collection_1.Files.deleteOne({_id:t._id}),[2]}})})})}},getSignedUrlsAndFilesWithId:{check:new simpl_schema_1.default({ids:{type:Array},"ids.$":{type:String},expires:{type:Number}}),function:function(a,u){var t=this;return new Promise(function(l,e){return __awaiter(t,void 0,void 0,function(){var t,n,i,r,o,s,c;return __generator(this,function(e){switch(e.label){case 0:return t=[],[4,file_collection_1.Files.find({_id:{$in:a}})];case 1:n=e.sent(),i=0,e.label=2;case 2:return i<n.length?(o=n[i],r=this.getAWS().s3(),o=new client_s3_1.GetObjectCommand({Bucket:process.env.AWS_S3_BUCKET,Key:o.key}),c=(s=t).push,[4,(0,s3_request_presigner_1.getSignedUrl)(r,o,{expiresIn:u})]):[3,5];case 3:c.apply(s,[e.sent()]),e.label=4;case 4:return i++,[3,2];case 5:return l({res:t,fileArray:n.map(function(e){return e.name})}),[2]}})})})}},getSignedUrlWithId:{check:new simpl_schema_1.default({id_file:{type:String},expires:{type:Number}}),function:function(o,s){var e=this;return new Promise(function(i,r){return __awaiter(e,void 0,void 0,function(){var t,n;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.findOne({_id:o})];case 1:return n=e.sent(),t=this.getAWS().s3(),n=new client_s3_1.GetObjectCommand({Bucket:process.env.AWS_S3_BUCKET,Key:n.key}),(0,s3_request_presigner_1.getSignedUrl)(t,n,{expiresIn:s}).then(function(e){i(e)},function(e){r(e)}),[2]}})})})}},getSignedUrlUSEast1BucketAndKey:{check:new simpl_schema_1.default({bucket:{type:String},key:{type:String},expires:{type:Number}}),function:function(r,o,s){var c=this;return new Promise(function(t,n){var e=c.getAWS().s3USEast1(),i=new client_s3_1.GetObjectCommand({Bucket:r,Key:o});(0,s3_request_presigner_1.getSignedUrl)(e,i,{expiresIn:s}).then(function(e){t(e)},function(e){n(e)})})}},getSignedUrl:{check:new simpl_schema_1.default({key:{type:String},expires:{type:Number}}),function:function(r,o){var s=this;return new Promise(function(t,n){var e=s.getAWS().s3(),i=new client_s3_1.GetObjectCommand({Bucket:process.env.AWS_S3_BUCKET,Key:r});(0,s3_request_presigner_1.getSignedUrl)(e,i,{expiresIn:o}).then(function(e){t(e)},function(e){n(e)})})}},getSignedUrls:{check:new simpl_schema_1.default({keys:{type:Array},"keys.$":{type:String},expires:{type:Number}}),function:function(l,a){var t=this;return new Promise(function(c,e){return __awaiter(t,void 0,void 0,function(){var t,n,i,r,o,s;return __generator(this,function(e){switch(e.label){case 0:t=[],n=0,e.label=1;case 1:return n<l.length?(r=l[n],i=this.getAWS().s3(),r=new client_s3_1.GetObjectCommand({Bucket:process.env.AWS_S3_BUCKET,Key:r}),s=(o=t).push,[4,(0,s3_request_presigner_1.getSignedUrl)(i,r,{expiresIn:a})]):[3,4];case 2:s.apply(o,[e.sent()]),e.label=3;case 3:return n++,[3,1];case 4:return c(t),[2]}})})})}},getDataURIfromURL:{check:new simpl_schema_1.default({url:{type:String}}),function:function(e){return new Promise(function(i,r){request.get(e,function(e,t,n){e||200!==t.statusCode?r(e):(e="data:"+t.headers["content-type"]+";base64,"+new Buffer(n).toString("base64"),i(e))})})}},emailFile:{check:new simpl_schema_1.default({id_file:{type:String},email:{type:String},additional_message:{type:String}}),function:function(t,c,l){var e=this;return new Promise(function(o,s){return __awaiter(e,void 0,void 0,function(){var i,r=this;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.findById(t)];case 1:return(i=e.sent())?this.callMethodInternal("getSignedUrl",i.key,259200,function(e,t){var n;t?(i.size<5e6?(n="Attached is the file requested for email.\n"+(""!==l?"\nAdditional Message:\n"+l+"\n":""),r.sendEmail(c,index_1.ResolveIOServer.getClientName()+" File - "+i.name,n,"",[{filename:i.name,path:t}],null,"")):(n="Please click the link to the requested file.\n"+(""!==l?"\nAdditional Message:\n"+l+"\n":""),r.sendEmail(c,index_1.ResolveIOServer.getClientName()+" File - "+i.name,n+t,"",null,null,"")),o(!0)):s("Could not get file URL")}):s("Could not find file"),[2]}})})})}}})}exports.loadAWSMethods=loadAWSMethods;
|
|
1
|
+
"use strict";var __awaiter=this&&this.__awaiter||function(e,i,r,o){return new(r=r||Promise)(function(n,t){function fulfilled(e){try{step(o.next(e))}catch(e){t(e)}}function rejected(e){try{step(o.throw(e))}catch(e){t(e)}}function step(e){var t;e.done?n(e.value):((t=e.value)instanceof r?t:new r(function(e){e(t)})).then(fulfilled,rejected)}step((o=o.apply(e,i||[])).next())})},__generator=this&&this.__generator||function(i,r){var o,s,c,l={label:0,sent:function(){if(1&c[0])throw c[1];return c[1]},trys:[],ops:[]},a={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function verb(n){return function(e){var t=[n,e];if(o)throw new TypeError("Generator is already executing.");for(;l=a&&t[a=0]?0:l;)try{if(o=1,s&&(c=2&t[0]?s.return:t[0]?s.throw||((c=s.return)&&c.call(s),0):s.next)&&!(c=c.call(s,t[1])).done)return c;switch(s=0,(t=c?[2&t[0],c.value]:t)[0]){case 0:case 1:c=t;break;case 4:return l.label++,{value:t[1],done:!1};case 5:l.label++,s=t[1],t=[0];continue;case 7:t=l.ops.pop(),l.trys.pop();continue;default:if(!(c=0<(c=l.trys).length&&c[c.length-1])&&(6===t[0]||2===t[0])){l=0;continue}if(3===t[0]&&(!c||t[1]>c[0]&&t[1]<c[3]))l.label=t[1];else if(6===t[0]&&l.label<c[1])l.label=c[1],c=t;else{if(!(c&&l.label<c[2])){c[2]&&l.ops.pop(),l.trys.pop();continue}l.label=c[2],l.ops.push(t)}}t=r.call(i,l)}catch(e){t=[6,e],s=0}finally{o=c=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},file_collection_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadAWSMethods=void 0,require("../collections/file.collection")),simpl_schema_1=require("simpl-schema"),resolveio_server_app_1=require("../resolveio-server-app"),client_s3_1=require("@aws-sdk/client-s3"),s3_request_presigner_1=require("@aws-sdk/s3-request-presigner"),common_1=require("../util/common"),request=require("request").defaults({encoding:null}),fs=require("fs"),pdfCnt=1e6;function loadAWSMethods(e){e.methods({uploadFileAndSave:{check:new simpl_schema_1.default({fileName:{type:String},fileData:{type:String},fileSize:{type:Number},fileOrder:{type:Number},fileType:{type:String},compress:{type:Boolean}}),function:function(l,a,u,f,_,e){var t=this;return new Promise(function(s,c){return __awaiter(t,void 0,void 0,function(){var t,n,i,r,o;return __generator(this,function(e){return l?(t="uploads/"+Date.now()+"-"+pdfCnt+++"-"+l,n=this.getAWS().s3(),i=3,r=0,(o=function(){n.putObject({Bucket:process.env.AWS_S3_BUCKET,Key:t,Body:Buffer.from(a.replace("data:"+a.split(",")[0].split(":")[1].split(";")[0]+";base64,",""),"base64"),ACL:"private",ContentType:a.split(",")[0].split(":")[1].split(";")[0],ContentDisposition:"inline"}).then(function(e){e?file_collection_1.Files.create({_id:(0,common_1.objectIdHexString)(),__v:0,name:l,size:u,key:t,order:f,type:_}).then(function(e){s(e)}).catch(function(e){c(e)}):s(null)}).catch(function(e){var t;++r<=i?(t=1e3*Math.pow(2,r),console.warn("Attempt ".concat(r," failed. Retrying in ").concat(t/1e3," seconds...")),setTimeout(o,t)):c(new Error("Failed to upload after ".concat(i," attempts: ").concat(e.message)))})})()):c(new Error("Invalid fileName provided")),[2]})})})}},uploadNonPDFFileAndSave:{check:new simpl_schema_1.default({fileName:{type:String},fileData:{type:String},fileSize:{type:Number},fileOrder:{type:Number},fileType:{type:String}}),function:function(r,e,o,s,c){var l=this;return new Promise(function(t,n){var i;r&&(i="uploads/"+Date.now()+"-"+r,l.getAWS().s3().putObject({Bucket:process.env.AWS_S3_BUCKET,Key:i,Body:Buffer.from(e),ACL:"private",ContentType:"application/gzip",ContentDisposition:"inline"}).then(function(e){e?file_collection_1.Files.create({_id:(0,common_1.objectIdHexString)(),__v:0,name:r,size:o,key:i,order:s,type:c}).then(function(e){t(e)},function(e){return n(e)}):t(null)},function(e){n(e)}))})}},uploadNonPDFBufferAndSave:{check:new simpl_schema_1.default({fileName:{type:String},fileDataBuffer:{type:Buffer},fileSize:{type:Number},fileOrder:{type:Number},fileType:{type:String}}),function:function(r,e,o,s,c){var l=this;return new Promise(function(t,n){var i;r&&(i="uploads/"+Date.now()+"-"+r,l.getAWS().s3().putObject({Bucket:process.env.AWS_S3_BUCKET,Key:i,Body:e,ACL:"private",ContentType:"application/gzip",ContentDisposition:"inline"}).then(function(e){e?file_collection_1.Files.create({_id:(0,common_1.objectIdHexString)(),__v:0,name:r,size:o,key:i,order:s,type:c}).then(function(e){t(e)},function(e){return n(e)}):t(null)},function(e){n(e)}))})}},uploadNonPDFStreamAndSave:{check:new simpl_schema_1.default({fileName:{type:String},fileData:{type:String},fileOrder:{type:Number},fileType:{type:String}}),function:function(r,e,o,s){var c=this;return new Promise(function(t,n){var i;r&&(i="uploads/"+Date.now()+"-"+r,c.getAWS().s3().putObject({Bucket:process.env.AWS_S3_BUCKET,Key:i,Body:fs.createReadStream(e),ACL:"private",ContentType:"application/gzip",ContentDisposition:"inline"}).then(function(e){e?file_collection_1.Files.create({_id:(0,common_1.objectIdHexString)(),__v:0,name:r,size:1,key:i,order:o,type:s}).then(function(e){t(e)},function(e){return n(e)}):t(null)},function(e){n(e)}))})}},deleteFiles:{check:new simpl_schema_1.default({keys:{type:Array},"keys.$":{type:String}}),function:function(o){var t=this;return new Promise(function(r,e){return __awaiter(t,void 0,void 0,function(){var t,n,i=this;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.find({key:{$in:o}})];case 1:return t=e.sent(),n=t.length,t.forEach(function(e){file_collection_1.Files.deleteOne({_id:e._id}),i.getAWS().s3().deleteObject({Bucket:process.env.AWS_S3_BUCKET,Key:e.key}).then(function(e){!e||--n||r(t.length)})}),[2]}})})})}},deleteFile:{check:new simpl_schema_1.default({key:{type:String}}),function:function(r){var e=this;return new Promise(function(n,i){return __awaiter(e,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.findOne({key:r})];case 1:return(t=e.sent())&&file_collection_1.Files.deleteOne({_id:t._id}),this.getAWS().s3().deleteObject({Bucket:process.env.AWS_S3_BUCKET,Key:r}).then(function(e){n(e)},function(e){i(e)}),[2]}})})})}},deleteFileWithId:{check:new simpl_schema_1.default({id_file:{type:String}}),function:function(r){var e=this;return new Promise(function(n,i){return __awaiter(e,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.findOne({_id:r})];case 1:return(t=e.sent())||i("Could not find file"),this.getAWS().s3().deleteObject({Bucket:process.env.AWS_S3_BUCKET,Key:t.key}).then(function(e){n(e)},function(e){i(e)}),file_collection_1.Files.deleteOne({_id:t._id}),[2]}})})})}},getSignedUrlsAndFilesWithId:{check:new simpl_schema_1.default({ids:{type:Array},"ids.$":{type:String},expires:{type:Number}}),function:function(a,u){var t=this;return new Promise(function(l,e){return __awaiter(t,void 0,void 0,function(){var t,n,i,r,o,s,c;return __generator(this,function(e){switch(e.label){case 0:return t=[],[4,file_collection_1.Files.find({_id:{$in:a}})];case 1:n=e.sent(),i=0,e.label=2;case 2:return i<n.length?(o=n[i],r=this.getAWS().s3(),o=new client_s3_1.GetObjectCommand({Bucket:process.env.AWS_S3_BUCKET,Key:o.key}),c=(s=t).push,[4,(0,s3_request_presigner_1.getSignedUrl)(r,o,{expiresIn:u})]):[3,5];case 3:c.apply(s,[e.sent()]),e.label=4;case 4:return i++,[3,2];case 5:return l({res:t,fileArray:n.map(function(e){return e.name})}),[2]}})})})}},getSignedUrlWithId:{check:new simpl_schema_1.default({id_file:{type:String},expires:{type:Number}}),function:function(o,s){var e=this;return new Promise(function(i,r){return __awaiter(e,void 0,void 0,function(){var t,n;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.findOne({_id:o})];case 1:return n=e.sent(),t=this.getAWS().s3(),n=new client_s3_1.GetObjectCommand({Bucket:process.env.AWS_S3_BUCKET,Key:n.key}),(0,s3_request_presigner_1.getSignedUrl)(t,n,{expiresIn:s}).then(function(e){i(e)},function(e){r(e)}),[2]}})})})}},getSignedUrlUSEast1BucketAndKey:{check:new simpl_schema_1.default({bucket:{type:String},key:{type:String},expires:{type:Number}}),function:function(r,o,s){var c=this;return new Promise(function(t,n){var e=c.getAWS().s3USEast1(),i=new client_s3_1.GetObjectCommand({Bucket:r,Key:o});(0,s3_request_presigner_1.getSignedUrl)(e,i,{expiresIn:s}).then(function(e){t(e)},function(e){n(e)})})}},getSignedUrl:{check:new simpl_schema_1.default({key:{type:String},expires:{type:Number}}),function:function(r,o){var s=this;return new Promise(function(t,n){var e=s.getAWS().s3(),i=new client_s3_1.GetObjectCommand({Bucket:process.env.AWS_S3_BUCKET,Key:r});(0,s3_request_presigner_1.getSignedUrl)(e,i,{expiresIn:o}).then(function(e){t(e)},function(e){n(e)})})}},getSignedUrls:{check:new simpl_schema_1.default({keys:{type:Array},"keys.$":{type:String},expires:{type:Number}}),function:function(l,a){var t=this;return new Promise(function(c,e){return __awaiter(t,void 0,void 0,function(){var t,n,i,r,o,s;return __generator(this,function(e){switch(e.label){case 0:t=[],n=0,e.label=1;case 1:return n<l.length?(r=l[n],i=this.getAWS().s3(),r=new client_s3_1.GetObjectCommand({Bucket:process.env.AWS_S3_BUCKET,Key:r}),s=(o=t).push,[4,(0,s3_request_presigner_1.getSignedUrl)(i,r,{expiresIn:a})]):[3,4];case 2:s.apply(o,[e.sent()]),e.label=3;case 3:return n++,[3,1];case 4:return c(t),[2]}})})})}},getDataURIfromURL:{check:new simpl_schema_1.default({url:{type:String}}),function:function(e){return new Promise(function(i,r){request.get(e,function(e,t,n){e||200!==t.statusCode?r(e):(e="data:"+t.headers["content-type"]+";base64,"+new Buffer(n).toString("base64"),i(e))})})}},emailFile:{check:new simpl_schema_1.default({id_file:{type:String},email:{type:String},additional_message:{type:String}}),function:function(t,c,l){var e=this;return new Promise(function(o,s){return __awaiter(e,void 0,void 0,function(){var i,r=this;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.findById(t)];case 1:return(i=e.sent())?this.callMethodInternal("getSignedUrl",i.key,259200,function(e,t){var n;t?(i.size<5e6?(n="Attached is the file requested for email.\n"+(""!==l?"\nAdditional Message:\n"+l+"\n":""),r.sendEmail(c,resolveio_server_app_1.ResolveIOServer.getClientName()+" File - "+i.name,n,"",[{filename:i.name,path:t}],null,"")):(n="Please click the link to the requested file.\n"+(""!==l?"\nAdditional Message:\n"+l+"\n":""),r.sendEmail(c,resolveio_server_app_1.ResolveIOServer.getClientName()+" File - "+i.name,n+t,"",null,null,"")),o(!0)):s("Could not get file URL")}):s("Could not find file"),[2]}})})})}}})}exports.loadAWSMethods=loadAWSMethods;
|
|
2
2
|
//# sourceMappingURL=aws.js.map
|