@resolveio/server-lib 20.9.8 → 20.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -68,7 +68,7 @@ export declare class SubscriptionManager {
68
68
  private documentMatchesFilter;
69
69
  private shouldInvalidateSubscription;
70
70
  private shouldInvalidateSubscriptionForEvents;
71
- private shouldForceRequeryOnInsert;
71
+ private getPaginationMeta;
72
72
  private sendWS;
73
73
  getEnableDebug(): boolean;
74
74
  private dependencyDebug;
@@ -1512,12 +1512,13 @@ var SubscriptionManager = /** @class */ (function () {
1512
1512
  };
1513
1513
  SubscriptionManager.prototype.shouldInvalidateSubscriptionForEvents = function (sub, collection, events) {
1514
1514
  return __awaiter(this, void 0, void 0, function () {
1515
- var sawInsert, events_1, events_1_1, event_1, normalizedDocumentId, e_7_1, relevantMeta;
1515
+ var sawInsert, sawDelete, events_1, events_1_1, event_1, normalizedDocumentId, e_7_1, paginationMeta, paginationReasons;
1516
1516
  var e_7, _a;
1517
1517
  return __generator(this, function (_b) {
1518
1518
  switch (_b.label) {
1519
1519
  case 0:
1520
1520
  sawInsert = false;
1521
+ sawDelete = false;
1521
1522
  _b.label = 1;
1522
1523
  case 1:
1523
1524
  _b.trys.push([1, 6, 7, 8]);
@@ -1530,6 +1531,9 @@ var SubscriptionManager = /** @class */ (function () {
1530
1531
  if (event_1.type === 'insert') {
1531
1532
  sawInsert = true;
1532
1533
  }
1534
+ else if (event_1.type === 'delete') {
1535
+ sawDelete = true;
1536
+ }
1533
1537
  return [4 /*yield*/, this.shouldInvalidateSubscription(sub, collection, event_1.type, normalizedDocumentId)];
1534
1538
  case 3:
1535
1539
  if (_b.sent()) {
@@ -1551,24 +1555,30 @@ var SubscriptionManager = /** @class */ (function () {
1551
1555
  finally { if (e_7) throw e_7.error; }
1552
1556
  return [7 /*endfinally*/];
1553
1557
  case 8:
1558
+ paginationMeta = this.getPaginationMeta(sub, collection);
1559
+ paginationReasons = [];
1554
1560
  if (sawInsert) {
1555
- relevantMeta = this.shouldForceRequeryOnInsert(sub, collection);
1556
- if (relevantMeta === null || relevantMeta === void 0 ? void 0 : relevantMeta.length) {
1557
- this.dependencyDebug('Invalidate due to pagination metadata', {
1558
- publication: sub.publication,
1559
- collection: collection,
1560
- events: this.summarizeEvents(events),
1561
- queryMeta: relevantMeta.slice(0, 5)
1562
- });
1563
- return [2 /*return*/, true];
1564
- }
1561
+ paginationReasons.push('insert');
1562
+ }
1563
+ if (sawDelete) {
1564
+ paginationReasons.push('delete');
1565
+ }
1566
+ if ((paginationMeta === null || paginationMeta === void 0 ? void 0 : paginationMeta.length) && paginationReasons.length) {
1567
+ this.dependencyDebug('Invalidate due to pagination metadata', {
1568
+ publication: sub.publication,
1569
+ collection: collection,
1570
+ events: this.summarizeEvents(events),
1571
+ reasons: paginationReasons,
1572
+ queryMeta: paginationMeta.slice(0, 5)
1573
+ });
1574
+ return [2 /*return*/, true];
1565
1575
  }
1566
1576
  return [2 /*return*/, false];
1567
1577
  }
1568
1578
  });
1569
1579
  });
1570
1580
  };
1571
- SubscriptionManager.prototype.shouldForceRequeryOnInsert = function (sub, collection) {
1581
+ SubscriptionManager.prototype.getPaginationMeta = function (sub, collection) {
1572
1582
  var _a;
1573
1583
  this.ensureDependencyContainers(sub);
1574
1584
  var metaList = (_a = sub.collectionQueryMeta) === null || _a === void 0 ? void 0 : _a.get(collection);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/subscription.manager.ts"],"names":[],"mappings":"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","file":"subscription.manager.js","sourcesContent":["import { ChangeStream, ChangeStreamDeleteDocument, ChangeStreamInsertDocument, ChangeStreamReplaceDocument, ChangeStreamUpdateDocument, ObjectId, ResumeToken } from 'mongodb';\nimport * as NodeCache from 'node-cache';\nimport { cpus } from 'os';\nimport * as WebSocket from 'ws';\nimport { Flags } from '../collections/flag.collection';\nimport { LoggedInUsers } from '../collections/logged-in-users.collection';\nimport { LoggedInUserModel } from '../models/logged-in-users.model';\nimport { ServerResponseModel } from '../models/server-message.model';\nimport { ActiveSubscriptionModel, SubscriptionModel } from '../models/subscription.model';\nimport { loadAppStatusPublications } from '../publications/app-status';\nimport { loadCronJobPublications } from '../publications/cron-jobs';\nimport { loadFilePublications } from '../publications/files';\nimport { loadFlagsPublications } from '../publications/flags';\nimport { loadFlagsUpdatePublications } from '../publications/flags-update';\nimport { loadLogPublications } from '../publications/logs';\nimport { loadNotificationPublications } from '../publications/notifications';\nimport { loadReportBuilderDashboardBuilderPublications } from '../publications/report-builder-dashboard-builders';\nimport { loadReportBuilderLibraryPublications } from '../publications/report-builder-libraries';\nimport { loadReportBuilderReportPublications } from '../publications/report-builder-reports';\nimport { loadSuperAdminPublications } from '../publications/super-admin';\nimport { loadUserGroupPublications } from '../publications/user-groups';\nimport { loadUserGuidePublications } from '../publications/user-guides';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { dateReviver, deepCopy, getBinarySize, objectIdHexString } from '../util/common';\nimport { DependencyContextSnapshot, QueryMeta, withDependencyTracking } from '../util/subscription-dependency-context';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { WebSocketManager } from './websocket.manager';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\n\n// Performance Dependencies\n// import * as path from 'path';\n// import { Worker } from 'worker_threads';\n\ninterface MongoQueueModel {\n\t_id: number,\n\ttype: string;\n\tcollection: string;\n\tsubscription: ActiveSubscriptionModel;\n\trunning: boolean;\n\trun_again: boolean;\n}\n\n// interface CurrentPerformanceMonitor {\n// \t_id: number;\n// \tfunction: string;\n// \tpublication: string;\n// \tsubscriptionData: any[];\n// \tdate_start: Date;\n// \tdate_end: Date;\n// \tduration: number;\n// \tresult: string;\n// }\n\nexport class SubscriptionManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _publications: SubscriptionModel = {};\n\tprivate _subscriptions: ActiveSubscriptionModel[] = [];\n\tprivate _wss: WebSocket.Server;\n\tprivate _loggedInUsers: LoggedInUserModel[] = [];\n\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\t\n\tprivate _oplog$: ChangeStream;\n\n\tprivate _nodeCache;\n\tprivate _cacheId = 1;\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate serverConfig;\n\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\n\tprivate _enableDebug = false;\n\tprivate _enableDependencyDebug = false;\n\tprivate _debugOplogCollections = [];\n\tprivate _debugOplogHits = 0;\n\tprivate _debugSubCollections = [];\n\tprivate _debugSubHits = 0;\n\tprivate _debugUnSubHits = 0;\n\tprivate _debugUnSubAllHits = 0;\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _debugSendQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\n\tprivate _oplogRetryCount = 0;\n\n\t// Buffer to store throttled latency updates with timestamps\n\tprivate latencyBuffer = new Map<string, { latency: number, lastUpdate: Date }>();\n\n\t// Interval to flush latency updates in MongoDB\n\tprivate readonly LATENCY_UPDATE_INTERVAL = 60000;\n\n\t// Minimum time difference between two latency updates for the same user\n\tprivate readonly LATENCY_UPDATE_THRESHOLD_MS = 30000;\n\n\t// private currentPerfomanceMonitor: CurrentPerformanceMonitor[] = [];\n\t// private idPerformance: number = 0;\n\t// private performanceThread;\n\n\tprivate _invalidationDebounceTimers = new Map<string, NodeJS.Timeout>();\n\tprivate _invalidationPendingTimestamps = new Map<string, number>();\n\tprivate _pendingInvalidations = new Map<string, { events: { type: string, documentId?: any }[] }>();\n\tprivate readonly DEBOUNCE_DELAY = 100; // 100ms debounce window\n\tprivate readonly MAX_WAIT_TIME = 500; // 500ms maximum delay\n\n\n\tconstructor() {}\n\t\n\tstatic create(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tconst subscriptionManager = new SubscriptionManager();\n\t\tsetImmediate(async () => {\n\t\t\tawait subscriptionManager.initialize(wss, serverConfig, monitorManagerFunction);\n\t\t});\n\t\treturn subscriptionManager;\n\t}\n\t\n\tprivate async initialize(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tthis._websocketManager = ResolveIOServer.getMainServer().getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\tsetInterval(() => this.flushThrottledLatencyUpdates(), this.LATENCY_UPDATE_INTERVAL);\n\n\t\t// setTimeout(() => {\n\t\t// \tconsole.log('Setting up performance thread');\n\n\t\t// \tthis.performanceThread = new Worker(path.join(__dirname, './subscription.performance.js'));\n\n\t\t// \tthis.performanceThread.on('exit', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD EXITED!!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\n\t\t// \tthis.performanceThread.on('error', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD RECV ERROR !!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\t\t// }, 5000);\n\n\t\t// setInterval(() => {\n\t\t// \tconsole.log('Post thread msg');\n\t\t// \tthis.performanceThread.postMessage(this.currentPerfomanceMonitor);\n\t\t// \tthis.currentPerfomanceMonitor = [];\n\t\t// }, 10000);\n\n\t\tthis.serverConfig = serverConfig;\n\t\tthis._wss = wss;\n\n\t\t// Publications\n\t\tloadSuperAdminPublications(this);\n\t\tloadAppStatusPublications(this);\n\t\tloadLogPublications(this);\n\t\tloadFilePublications(this);\n\t\tloadCronJobPublications(this);\n\t\tloadFlagsUpdatePublications(this);\n\t\tloadFlagsPublications(this);\n\t\tloadNotificationPublications(this);\n\t\tloadReportBuilderReportPublications(this);\n\t\tloadReportBuilderLibraryPublications(this);\n\t\tloadUserGroupPublications(this);\n\t\tloadUserGuidePublications(this);\n\t\tloadReportBuilderDashboardBuilderPublications(this);\n\n\t\tawait this.tailOpLog();\n\n\t\tsetInterval(() => {\n\t\t\tthis._oplogRetryCount = 0;\n\t\t}, 15000);\n\n\t\tsetInterval(() => {\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Subs', this._subscriptions.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Logged In Users', this._loggedInUsers.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue', this._mongoQueue.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Collections', JSON.stringify(this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Hits', this._debugOplogHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Collections', JSON.stringify(this._debugOplogCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.type.localeCompare(b.type)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Hits', this._debugSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Collections', JSON.stringify(this._debugSubCollections.sort((a, b) => a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub Hits', this._debugUnSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub All Hits', this._debugUnSubAllHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Cache Cleanup Hits', this._debugRemoveCacheHits);\n\t\t\t}\n\t\t\t\n\t\t\tthis._debugOplogHits = 0;\n\t\t\tthis._debugOplogCollections = [];\n\t\t\tthis._debugSubCollections = [];\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t\tthis._debugSubHits = 0;\n\t\t\tthis._debugUnSubHits = 0;\n\t\t\tthis._debugUnSubAllHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t}, 60000);\n\n\t\tsetInterval(async () => {\n\t\t\tthis._loggedInUsers = await LoggedInUsers.find();\n\t\n\t\t\tlet userCopy = deepCopy(this._loggedInUsers);\n\t\t\tfor (let i = this._loggedInUsers.length - 1; i >= 0; i--) {\n\t\t\t\tlet loggedInUser = userCopy[i];\n\n\t\t\t\tif (!loggedInUser.date || Date.now() - loggedInUser.date.getTime() > 120000) {\n\t\t\t\t\tif (this._websocketManager.getWebSocket(loggedInUser.id_ws)) {\n\t\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', this._websocketManager.getWebSocket(loggedInUser.id_ws)['user'], this._websocketManager.getWebSocket(loggedInUser.id_ws)['id_socket'], 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.unsubscribeAll(this._websocketManager.getWebSocket(loggedInUser.id_ws));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._subscriptions.forEach(sub => {\n\t\t\t\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\t\t\t\tif (client.id_socket === loggedInUser.id_ws) {\n\t\t\t\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait LoggedInUsers.deleteOne({_id: loggedInUser._id});\n\n\t\t\t\t\t\tif (this._loggedInUsers.findIndex(a => a._id === loggedInUser._id) >= 0) {\n\t\t\t\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.findIndex(a => a._id === loggedInUser._id), 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < this._subscriptions.length; i++) {\n\t\t\t\tlet sub = this._subscriptions[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\tif (!this._loggedInUsers.some(a => a.id_ws === client.id_socket)) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 30000);\n\n\t\tlet flag = await Flags.findOne({type: 'Enable Debug'});\n\t\tlet dependencyFlag = await Flags.findOne({type: 'Enable Dependency Debug'});\n\n\t\tif (flag && flag.value) {\n\t\t\tthis._enableDebug = true;\n\t\t}\n\t\telse {\n\t\t\tthis._enableDebug = false;\n\t\t}\n\n\t\tif (dependencyFlag && dependencyFlag.value) {\n\t\t\tthis._enableDependencyDebug = true;\n\t\t}\n\t\telse {\n\t\t\tthis._enableDependencyDebug = process.env.ENABLE_DEPENDENCY_DEBUG === 'true';\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, documentId?: any) {\n\t\tlet queue = this._pendingInvalidations.get(collection);\n\t\tif (!queue) {\n\t\t\tqueue = { events: [] };\n\t\t\tthis._pendingInvalidations.set(collection, queue);\n\t\t}\n\t\tqueue.events.push({ type, documentId });\n\n\t\tconst debounceKey = collection;\n\t\tconst now = Date.now();\n\t\n\t\t// Initialize or get existing timestamp\n\t\tconst firstInvalidationTime = this._invalidationPendingTimestamps.get(debounceKey) || now;\n\t\tthis._invalidationPendingTimestamps.set(debounceKey, firstInvalidationTime);\n\t\n\t\t// Clear any existing timer\n\t\tif (this._invalidationDebounceTimers.has(debounceKey)) {\n\t\t\tclearTimeout(this._invalidationDebounceTimers.get(debounceKey));\n\t\t}\n\t\n\t\t// Check if we've waited too long\n\t\tconst waitedTooLong = (now - firstInvalidationTime) >= this.MAX_WAIT_TIME;\n\t\t\n\t\tif (waitedTooLong) {\n\t\t\t// Immediate execution path\n\t\t\tthis._invalidationPendingTimestamps.delete(debounceKey);\n\t\t\tawait this._executeInvalidation(collection);\n\t\t} else {\n\t\t\t// Normal debounce path\n\t\t\tthis._invalidationDebounceTimers.set(\n\t\t\t\tdebounceKey,\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tthis._invalidationPendingTimestamps.delete(debounceKey);\n\t\t\t\t\tawait this._executeInvalidation(collection);\n\t\t\t\t}, this.DEBOUNCE_DELAY)\n\t\t\t);\n\t\t}\n\t}\n\t\n\tprivate async _executeInvalidation(collection: string) {\n\t\t// Clean up any existing timer (defensive)\n\t\tif (this._invalidationDebounceTimers.has(collection)) {\n\t\t\tclearTimeout(this._invalidationDebounceTimers.get(collection));\n\t\t\tthis._invalidationDebounceTimers.delete(collection);\n\t\t}\n\n\t\tconst queued = this._pendingInvalidations.get(collection);\n\t\tthis._pendingInvalidations.delete(collection);\n\n\t\tif (!queued || !queued.events.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst events = queued.events;\n\t\n\t\t// Original invalidation logic\n\t\tResolveIOServer.getMongoManager().invalidateQueryCache(collection);\n\t\n\t\tconst collSubs = this._subscriptions.filter(a => a.collections.includes(collection));\n\t\n\t\tfor (const sub of collSubs) {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Invalidate Sub', sub.publication, sub.running, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (!(await this.shouldInvalidateSubscriptionForEvents(sub, collection, events))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tif (sub.running) {\n\t\t\t\tsub.runAgain = true;\n\t\t\t\tthis.dependencyDebug('Subscription busy, scheduling rerun', { publication: sub.publication, collection, events: this.summarizeEvents(events) });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tconst batchType = events.length === 1 ? events[0].type : events.map(event => event.type).join(',');\n\n\t\t\tif (this._publications[sub.publication].user_specific) {\n\t\t\t\tthis.dependencyDebug('Triggering user-specific invalidation', { publication: sub.publication, collection, events: this.summarizeEvents(events), clientCount: sub.clients.length });\n\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\tconst ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\tif (ws?.readyState === ws.OPEN) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.sendDataToOneWithRetry(ws, client.messageId, sub, collection, batchType);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t// Error handling\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.dependencyDebug('Triggering broadcast invalidation', { publication: sub.publication, collection, events: this.summarizeEvents(events), clientCount: sub.clients.length });\n\t\t\t\tawait this.sendDataToAllWithRetry(sub, collection, batchType);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async delay(ms: number) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tprivate async sendDataToAllWithRetry(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToAll Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToAll(sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToAll Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\n\t\tsub.running = false;\n\t}\n\n\tprivate async sendDataToOneWithRetry(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToOne Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToOne(ws, messageId, sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToOne Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\t\tsub.running = false;\n\t}\n\n\t// Add all files to publications private object\n\tpublic publications(method: SubscriptionModel) {\n\t\tthis._publications = Object.assign(this._publications, method);\n\t}\n\n\t// Throttled `loggedInLatency` method\n\tpublic loggedInLatency(ws: WebSocket) {\n\t\tlet loggedInUser = this._loggedInUsers.find(a => a.id_ws === ws['id_socket']);\n\t\tif (!loggedInUser) return;\n\n\t\tconst now = new Date();\n\t\tconst existingEntry = this.latencyBuffer.get(ws['id_socket']);\n\t\tconst newLatency = ws['latency'];\n\n\t\t// Throttle updates: only update if time threshold has passed or latency has significantly changed\n\t\tif (\n\t\t\t!existingEntry || \n\t\t\t(now.getTime() - existingEntry.lastUpdate.getTime() >= this.LATENCY_UPDATE_THRESHOLD_MS) || \n\t\t\t(Math.abs(newLatency - existingEntry.latency) > 100) // Optional: log only significant changes\n\t\t) {\n\t\t\t// Update in-memory and buffer\n\t\t\tloggedInUser.date = now;\n\t\t\tthis.latencyBuffer.set(ws['id_socket'], { latency: newLatency, lastUpdate: now });\n\t\t}\n\t}\n\n\t// Method to flush buffered latency updates in bulk\n\tprivate async flushThrottledLatencyUpdates() {\n\t\tif (this.latencyBuffer.size === 0) return; // No updates to flush\n\n\t\tconst updates = Array.from(this.latencyBuffer.entries()).map(([id_ws, { latency, lastUpdate }]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { id_ws },\n\t\t\t\tupdate: { $set: { latency, date: lastUpdate } }\n\t\t\t}\n\t\t}));\n\n\t\ttry {\n\t\t\tawait LoggedInUsers.bulkWrite(updates);\n\t\t\tthis.latencyBuffer.clear(); // Clear buffer after successful update\n\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Throttled latency batch update successful', updates.length);\n\t\t\t}\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'Sub Manager', 'Throttled latency batch update failed', error);\n\t\t\t// Optional: implement retry logic or logging for failed updates\n\t\t}\n\t}\n\n\t// Subscribe to publication\n\tpublic async subscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugSubHits += 1;\n\n\t\tif (!this._debugSubCollections.some(a => a.publication === publication)) {\n\t\t\tthis._debugSubCollections.push({\n\t\t\t\tpublication: publication,\n\t\t\t\thits: 1\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis._debugSubCollections.find(a => a.publication === publication).hits += 1;\n\t\t}\n\n\t\tlet pub = this._publications[publication];\n\n\t\tif (!pub) {\n\t\t\tconsole.error(new Date(), 'No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tif (subscriptionData.length > 1 || subscriptionData[0]) {\n\t\t\t\tif (!pub.check) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Function For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (!pub.check._schema) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Schema For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet valObj = {};\n\t\t\t\t\tlet valKeys = Object.keys(pub.check._schema);\n\n\t\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\n\t\t\t\t\tfor (let i = 0; i < subscriptionData.length; i++) {\n\t\t\t\t\t\tvalObj[rootKeys[i]] = subscriptionData[i];\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpub.check.validate(valObj);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (errors) {\n\t\t\t\t\t\tif (errors) {\n\t\t\t\t\t\t\tconsole.error(new Date(), 'Error in Pub Check (' + publication + ')', errors);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (messageRoute !== 'Bypass') {\n\t\t\t\tlet urlData = messageRoute.split('/');\n\t\t\t\tlet urlModule = '';\n\t\t\t\tlet urlNext = urlData[0];\n\n\t\t\t\tif (urlData[0] === '') {\n\t\t\t\t\turlModule = '/';\n\t\t\t\t\turlNext = urlData[1];\n\t\t\t\t}\n\n\t\t\t\turlModule += urlNext;\n\n\t\t\t\tif (urlData.length > 1) {\n\t\t\t\t\turlModule += '/';\n\t\t\t\t}\n\n\t\t\t\tlet otherRouteSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_socket === ws['id_socket'] && b.messageRoute !== 'Bypass' && b.messageRoute !== '/' && b.messageRoute !== messageRoute && !b.messageRoute.startsWith(urlModule)));\n\n\t\t\t\tif (otherRouteSubs.length) {\n\t\t\t\t\t// ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Detected Undestroyed Subscription - ' + this.serverConfig['CLIENT_NAME'], 'USER: ' + ws['user'] + ' (Socket: ' + ws['id_socket'] + ') ' + ' is on route: ' + messageRoute + ' but has the following subscriptions on other routes:' + JSON.stringify(otherRouteSubs, null, 2));\n\n\t\t\t\t\totherRouteSubs.forEach(otherSub => {\n\t\t\t\t\t\totherSub.clients.filter(a => a.id_socket === ws['id_socket']).forEach(client => {\n\t\t\t\t\t\t\tthis.unsubscribe(client.messageRoute, new Date(), ws, client.messageId, otherSub.publication, otherSub.subscriptionData);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst normalizedSubscriptionData = Array.isArray(subscriptionData) ? subscriptionData : [];\n\t\t\tconst subscriptionKey = JSON.stringify(normalizedSubscriptionData);\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && a.subscriptionKey === subscriptionKey);\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\tsubscriptionKey: subscriptionKey,\n\t\t\t\t\tsubscriptionData: normalizedSubscriptionData,\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\tcacheId: 0,\n\t\t\t\trunning: false,\n\t\t\t\trunAgain: false,\n\t\t\t\tcollectionDependencies: new Map(),\n\t\t\t\tcollectionFilters: new Map(),\n\t\t\t\twatchAllCollections: new Set(),\n\t\t\t\tcollectionQueryMeta: new Map()\n\t\t\t});\n\t\t}\n\n\t\t\tif (!sub) {\n\t\t\t\tsub = this._subscriptions.find(a => a.publication === publication && a.subscriptionKey === subscriptionKey);\n\t\t\t}\n\n\t\t\tthis.ensureDependencyContainers(sub);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'New Sub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t}\n\n\t\t\t// Immediately send data to the new client\n\t\t\tawait this.processSubscription(sub, ws, messageId);\n\t\t}\n\t}\n\n\tpublic async createLoggedInUser(id_ws: string): Promise<LoggedInUserModel> {\n\t\tlet ws = this._websocketManager.getWebSocket(id_ws);\n\n\t\tif (ws) {\n\t\t\tlet user = {\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t__v: 0,\n\t\t\t\tdate: new Date(),\n\t\t\t\tid_user: ws['id_user'],\n\t\t\t\tuser: ws['user'],\n\t\t\t\tid_ws: ws['id_socket']\n\t\t\t};\n\t\t\t\n\t\t\tthis._loggedInUsers.push(user);\n\t\t\tawait LoggedInUsers.insertOne(user);\n\t\t\t\n\t\t\treturn user;\n\t\t}\n\t\telse {\n\t\t\tthrow new Error('Error in Create Logged In User: No WS');\n\t\t}\n\t}\n\n\t// Unsubscribe from publication \n\tpublic unsubscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\t\t\n\t\tthis._debugUnSubHits += 1;\n\n\t\tif (!this._publications[publication]) {\n\t\t\tconsole.log('No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tconst normalizedSubscriptionData = Array.isArray(subscriptionData) ? subscriptionData : [];\n\t\t\tconst subscriptionKey = JSON.stringify(normalizedSubscriptionData);\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && a.subscriptionKey === subscriptionKey);\n\n\t\t\tif (sub) {\n\t\t\t\tfor (let i = sub.clients.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (sub.clients[i].id_user === ws['id_user'] && sub.clients[i].messageId === messageId && sub.clients[i].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Unsub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Unsubscribe from publication\n\tpublic async unsubscribeAll(ws: WebSocket) {\n\t\tthis._debugUnSubAllHits += 1;\n\n\t\tif (ws) {\n\t\t\t// Check if WebSocket has already been unsubscribed\n\t\t\tif (ws['isUnsubscribed']) {\n\t\t\t\treturn; // Skip if already unsubscribed\n\t\t\t}\n\t\t\t\n\t\t\t// Mark the WebSocket as unsubscribed to prevent further calls\n\t\t\tws['isUnsubscribed'] = true;\n\t\t\t\n\t\t\tif (this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']) >= 0) {\n\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']), 1);\n\t\t\t}\n\t\t\t\n\t\t\tawait LoggedInUsers.deleteOne({ id_ws: ws['id_socket'] });\n\n\t\t\tlet userSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_user === ws['id_user'] && b.id_socket === ws['id_socket']));\n\n\t\t\tfor (let i = userSubs.length - 1; i >= 0; i--) {\n\t\t\t\tlet sub = userSubs[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tif (sub.clients[j].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._websocketManager.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic getActiveSubscriptions() {\n\t\treturn this._subscriptions;\n\t}\n\n\t// Get publication collection\n\tprivate getPublicationCollections(publication: string) {\n\t\treturn this._publications[publication].collections;\n\t}\n\n\tprivate getWatchedDatabases(): string[] {\n\t\tconst mongoManager = ResolveIOServer.getMongoManager();\n\t\tconst managerDatabases = mongoManager?.getWatchedDatabases() || [];\n\n\t\tif (managerDatabases.length) {\n\t\t\treturn managerDatabases;\n\t\t}\n\n\t\tconst config = this.serverConfig || ResolveIOServer.getServerConfig();\n\t\tconst mainDb = config && typeof config['DATABASE'] === 'string' ? config['DATABASE'] : '';\n\n\t\treturn mainDb ? [mainDb] : [];\n\t}\n\n\t// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)\n\tprivate async tailOpLog(resumeToken?: ResumeToken) {\n\t\tif (this._oplog$ && !this._oplog$.closed) {\n\t\t\tthis._oplog$.removeAllListeners();\n\t\t\tawait this._oplog$.close();\n\t\t\tthis._oplog$ = null;\n\t\t}\n\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\n\t\tif (!this._oplog$ || this._oplog$.closed) {\n\t\t\tthis._oplogRetryCount += 1;\n\n\t\t\tif (this._oplogRetryCount > 5) {\n\t\t\t\tconsole.error('****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst watchDatabases = this.getWatchedDatabases();\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...(watchDatabases.length ? [{ 'ns.db': { $in: watchDatabases } }] : []),\n\t\t\t\t\t\t\t{'ns.coll': { $nin: [\n\t\t\t\t\t\t\t\t'log-method-latencies', \n\t\t\t\t\t\t\t\t'log-subscriptions', \n\t\t\t\t\t\t\t\t'logs', \n\t\t\t\t\t\t\t\t'counters', \n\t\t\t\t\t\t\t\t'cron-job-histories', \n\t\t\t\t\t\t\t\t'email-histories',\n\t\t\t\t\t\t\t\t'qb-soap-request-histories', \n\t\t\t\t\t\t\t\t'qb-soap-request-responses', \n\t\t\t\t\t\t\t\t'qb-soap-requests',\n\t\t\t\t\t\t\t\t'qb-soap-retries'\n\t\t\t\t\t\t\t] }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tlet lastResumeToken: ResumeToken;\n\n\t\t\tif (resumeToken) {\n\t\t\t\tlastResumeToken = resumeToken;\n\t\t\t\ttry {\n\t\t\t\t\tthis._oplog$ = ResolveIOServer.getMongoConnection().watch(pipeline, { resumeAfter: resumeToken });\n\t\t\t\t}\n\t\t\t\tcatch {\n\t\t\t\t\tif (this._oplog$) {\n\t\t\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\t\t\tawait this._oplog$.close();\n\t\t\t\t\t\tthis._oplog$ = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait this.tailOpLog(resumeToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._oplog$ = ResolveIOServer.getMongoConnection().watch(pipeline);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'oplog started');\n\n\t\t\tthis._oplog$.on('change', async (doc: ChangeStreamInsertDocument | ChangeStreamUpdateDocument | ChangeStreamReplaceDocument | ChangeStreamDeleteDocument) => {\n\t\t\t\tif (doc.ns) {\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Oplog Hit', doc.ns);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet collection = doc.ns.coll;\n\n\t\t\t\t\tif (!this._debugOplogCollections.some(a => a.collection === doc.ns.coll && a.type === doc.operationType)) {\n\t\t\t\t\t\tthis._debugOplogCollections.push({\n\t\t\t\t\t\t\tcollection: doc.ns.coll,\n\t\t\t\t\t\t\ttype: doc.operationType,\n\t\t\t\t\t\t\thits: 1\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._debugOplogCollections.find(a => a.collection === doc.ns.coll && a.type === doc.operationType).hits += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection) {\n\t\t\t\t\t\tthis._debugOplogHits += 1;\n\t\t\t\t\t\tconst docId = doc.documentKey && doc.documentKey['_id'] !== undefined ? doc.documentKey['_id'] : (doc['fullDocument'] && doc['fullDocument']['_id'] !== undefined ? doc['fullDocument']['_id'] : null);\n\n\t\t\t\t\t\tif (doc.operationType === 'insert') {\n\t\t\t\t\t\t\tif (collection === 'support-tickets') {\n\t\t\t\t\t\t\t\tif (this.serverConfig['ROOT_URL'] === 'https://resolveio.com') {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'sendSupportTicketEmail', doc.documentKey['_id']);\n\t\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'insert', docId);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'insert', docId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'update' || doc.operationType === 'replace') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'update', docId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'delete') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'delete', docId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection === 'flags') {\n\t\t\t\t\t\tlet flag = await Flags.findOne({ type: 'Enable Debug' });\n\t\t\t\t\t\tlet dependencyFlag = await Flags.findOne({ type: 'Enable Dependency Debug' });\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (flag && flag.value) {\n\t\t\t\t\t\t\tthis._enableDebug = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis._enableDebug = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (dependencyFlag && dependencyFlag.value) {\n\t\t\t\t\t\t\tthis._enableDependencyDebug = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis._enableDependencyDebug = process.env.ENABLE_DEPENDENCY_DEBUG === 'true';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlastResumeToken = doc._id;\n\n\t\t\t\t\tif ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && (process.env.IS_WORKERS_ENABLED === 'false' || (process.env.IS_WORKER_INSTANCE === 'true' && process.env.WORKER_INDEX === '0'))) {\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._oplog$.on('error', async error => {\n\t\t\t\tconsole.log(new Date(), 'oplog error', error);\n\t\t\t\tawait this._oplog$.close();\n\t\t\t});\n\n\t\t\tthis._oplog$.on('end', async () => {\n\t\t\t\tconsole.log(new Date(), 'oplog end');\n\t\t\t\tawait this._oplog$.close();\n\t\t\t});\n\n\t\t\tthis._oplog$.on('close', async () => {\n\t\t\t\tconsole.log(new Date(), 'oplog close');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tawait this.tailOpLog(lastResumeToken);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async processSubscription(sub: ActiveSubscriptionModel, ws: WebSocket, messageId: number) {\n\t\tif (!this._publications[sub.publication].user_specific) {\t\t\t\n\t\t\tif (sub.cacheId) {\n\t\t\t\ttry {\n\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\tdata: cacheData\n\t\t\t\t\t};\n\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Cache', sub.publication);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t}\n\t\t\t\tcatch {\n\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\tsub.cacheId = 0;\n\n\t\t\t\t\tawait this.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Non - Cache', sub.publication, sub.running);\n\t\t\t\t}\n\n\t\t\t\tif (sub.running) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait this.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Process Sub Specific, Non - Cache', sub.publication, sub.running);\n\t\t\t}\n\n\t\t\tif (sub.running) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tawait this.sendDataToOneWithRetry(ws, messageId, sub, '', 'newSub');\n\t\t}\n\t}\n\n\tprivate async sendDataToOne(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('User Specific Publication', sub.publication, '', '', sub.subscriptionData);\n\t\tlet dependencySnapshot: DependencyContextSnapshot;\n\t\tlet res;\n\t\ttry {\n\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\n\t\t\tconst execution = await withDependencyTracking(() => this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ws['id_user'], ...sub.subscriptionData));\n\t\t\tres = execution.result;\n\t\t\tdependencySnapshot = execution.snapshot;\n\t\t\tthis.updateSubscriptionDependencies(sub, dependencySnapshot);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: res\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t}\n\t\tcatch (err) {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: err\n\t\t\t};\n\t\t\t\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\n\t\t\tawait ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendDataToOne - WS)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t}\n\t\tfinally {\n\t\t\tawait this._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToAll(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tif (!sub.clients.length) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\tsub.cacheId = 0;\n\t\t\t}\n\n\t\t\tlet subIndex = this._subscriptions.findIndex(a => a.publication === sub.publication && a.subscriptionKey === sub.subscriptionKey);\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\t\t\tlet res;\n\t\t\tlet dependencySnapshot: DependencyContextSnapshot;\n\n\t\t\ttry {\n\t\t\t\tif (sub.publication !== 'superadminAPM' && sub.publication !== 'loggedInUsers') {\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\t\t\t\t}\n\n\t\t\t\tconst execution = await withDependencyTracking(() => this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ...sub.subscriptionData));\n\t\t\t\tres = execution.result;\n\t\t\t\tdependencySnapshot = execution.snapshot;\n\t\t\t\tthis.updateSubscriptionDependencies(sub, dependencySnapshot);\n\n\t\t\t\tif (sub.cacheId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\t\n\t\t\t\t\t\tif (JSON.stringify(cacheData) !== JSON.stringify(res)) {\n\t\t\t\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tsub.clients.map(client => {\n\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\n\t\t\t\t\t\tconst nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\t\t\t\t// Evict cache entries as needed\n\t\t\t\t\t\t\tlet deleteCount = 0;\n\t\t\t\t\t\t\tconst subArr = this._subscriptions.filter(a => a.cacheId && !a.clients.length);\n\t\t\t\t\t\n\t\t\t\t\t\t\tfor (let zz = 0; zz < subArr.length; zz++) {\n\t\t\t\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\t\t\t\tthis._nodeCache.del(subArr[zz].cacheId);\n\t\t\t\t\t\t\t\tsubArr[zz].cacheId = 0;\n\t\t\t\t\t\t\t\tdeleteCount += 1;\n\t\t\t\t\t\t\t\tif (this._nodeCache.getStats().vsize < this._heapLimit * 0.75) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t'Sub Cache: ' +\n\t\t\t\t\t\t\t\t\t'Too Big - ' +\n\t\t\t\t\t\t\t\t\tsub.publication +\n\t\t\t\t\t\t\t\t\t' - Deleted: ' +\n\t\t\t\t\t\t\t\t\tdeleteCount +\n\t\t\t\t\t\t\t\t\t' - ' +\n\t\t\t\t\t\t\t\t\tnodeCacheSize\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\thasError: true,\n\t\t\t\t\t\t\tdata: err\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tawait ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendPubData)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\tawait this._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate ensureDependencyContainers(sub: ActiveSubscriptionModel) {\n\t\tif (!sub.collectionDependencies) {\n\t\t\tsub.collectionDependencies = new Map();\n\t\t}\n\n\t\tif (!sub.collectionFilters) {\n\t\t\tsub.collectionFilters = new Map();\n\t\t}\n\n\t\tif (!sub.watchAllCollections) {\n\t\t\tsub.watchAllCollections = new Set();\n\t\t}\n\n\t\tif (!sub.collectionQueryMeta) {\n\t\t\tsub.collectionQueryMeta = new Map();\n\t\t}\n\t}\n\n\tprivate updateSubscriptionDependencies(sub: ActiveSubscriptionModel, snapshot?: DependencyContextSnapshot) {\n\t\tthis.ensureDependencyContainers(sub);\n\n\t\tif (!snapshot) {\n\t\t\tsub.collectionDependencies.clear();\n\t\t\tsub.collectionFilters.clear();\n\t\t\tsub.watchAllCollections.clear();\n\t\t\tsub.collectionQueryMeta.clear();\n\t\t\tthis.dependencyDebug('Cleared dependency snapshot', { publication: sub.publication });\n\t\t\treturn;\n\t\t}\n\n\t\tsub.collectionDependencies = snapshot.dependencies;\n\t\tsub.collectionFilters = snapshot.filters;\n\t\tsub.watchAllCollections = snapshot.watchAllCollections;\n\t\tsub.collectionQueryMeta = snapshot.queryMetadata;\n\t\tthis.logDependencySnapshot(sub, 'Snapshot updated');\n\t}\n\n\tprivate normalizeDocumentId(rawId: any): string {\n\t\tif (rawId === null || rawId === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (typeof rawId === 'string') {\n\t\t\treturn rawId;\n\t\t}\n\n\t\tif (typeof rawId === 'object' && typeof rawId.toHexString === 'function') {\n\t\t\treturn rawId.toHexString();\n\t\t}\n\n\t\tif (typeof rawId?.toString === 'function') {\n\t\t\tconst str = rawId.toString();\n\t\t\tif (str && str !== '[object Object]') {\n\t\t\t\treturn str;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate convertDocumentIdForQuery(documentId: string) {\n\t\tif (!documentId) {\n\t\t\treturn documentId;\n\t\t}\n\n\t\tif (/^[a-fA-F0-9]{24}$/.test(documentId)) {\n\t\t\ttry {\n\t\t\t\treturn new ObjectId(documentId);\n\t\t\t}\n\t\t\tcatch {}\n\t\t}\n\n\t\treturn documentId;\n\t}\n\n\tprivate async documentMatchesFilter(collection: string, documentId: string, filter: any): Promise<boolean> {\n\t\ttry {\n\t\t\tconst db = ResolveIOServer.getMainDB();\n\t\t\tconst filterCopy = deepCopy(filter) || {};\n\t\t\tconst idValue = this.convertDocumentIdForQuery(documentId);\n\t\t\tconst combinedFilter = {\n\t\t\t\t$and: [\n\t\t\t\t\t{ _id: idValue },\n\t\t\t\t\tfilterCopy\n\t\t\t\t]\n\t\t\t};\n\n\t\t\tconst doc = await db.collection(collection).findOne(combinedFilter);\n\t\t\treturn !!doc;\n\t\t}\n\t\tcatch {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate async shouldInvalidateSubscription(sub: ActiveSubscriptionModel, collection: string, type: string, documentId?: string): Promise<boolean> {\n\t\tthis.ensureDependencyContainers(sub);\n\n\t\tif (!documentId) {\n\t\t\tthis.dependencyDebug('Invalidate due to missing documentId', { publication: sub.publication, collection, type });\n\t\t\treturn true;\n\t\t}\n\n\t\tif (sub.watchAllCollections.has(collection)) {\n\t\t\tthis.dependencyDebug('Invalidate due to watch-all collection', { publication: sub.publication, collection, type });\n\t\t\treturn true;\n\t\t}\n\n\t\tconst trackedIds = sub.collectionDependencies.get(collection);\n\n\t\tif (trackedIds && trackedIds.has(documentId)) {\n\t\t\tthis.dependencyDebug('Invalidate due to tracked id', { publication: sub.publication, collection, type, documentId });\n\t\t\treturn true;\n\t\t}\n\n\t\tif (type === 'delete') {\n\t\t\tthis.dependencyDebug('Skip invalidation on delete for unknown id', { publication: sub.publication, collection, type, documentId });\n\t\t\treturn false;\n\t\t}\n\n\t\tconst filters = sub.collectionFilters.get(collection);\n\n\t\tif (filters && filters.length) {\n\t\t\tfor (const filter of filters) {\n\t\t\t\tif (await this.documentMatchesFilter(collection, documentId, filter)) {\n\t\t\t\t\tthis.dependencyDebug('Invalidate due to filter match', { publication: sub.publication, collection, type, documentId, filter });\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.dependencyDebug('Skip invalidation after dependency checks', { publication: sub.publication, collection, type, documentId });\n\t\treturn false;\n\t}\n\n\tprivate async shouldInvalidateSubscriptionForEvents(sub: ActiveSubscriptionModel, collection: string, events: { type: string, documentId?: any }[]): Promise<boolean> {\n\t\tlet sawInsert = false;\n\n\t\tfor (const event of events) {\n\t\t\tconst normalizedDocumentId = this.normalizeDocumentId(event.documentId);\n\t\t\tif (event.type === 'insert') {\n\t\t\t\tsawInsert = true;\n\t\t\t}\n\t\t\tif (await this.shouldInvalidateSubscription(sub, collection, event.type, normalizedDocumentId)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (sawInsert) {\n\t\t\tconst relevantMeta = this.shouldForceRequeryOnInsert(sub, collection);\n\t\t\tif (relevantMeta?.length) {\n\t\t\t\tthis.dependencyDebug('Invalidate due to pagination metadata', {\n\t\t\t\t\tpublication: sub.publication,\n\t\t\t\t\tcollection,\n\t\t\t\t\tevents: this.summarizeEvents(events),\n\t\t\t\t\tqueryMeta: relevantMeta.slice(0, 5)\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate shouldForceRequeryOnInsert(sub: ActiveSubscriptionModel, collection: string): QueryMeta[] {\n\t\tthis.ensureDependencyContainers(sub);\n\t\tconst metaList = sub.collectionQueryMeta?.get(collection);\n\t\tif (!metaList || !metaList.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst relevantMeta = metaList.filter(meta => {\n\t\t\tif (!meta) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst limitUsed = typeof meta.limit === 'number' && meta.limit > 0;\n\t\t\tconst skipUsed = typeof meta.skip === 'number' && meta.skip > 0;\n\t\t\treturn limitUsed || skipUsed;\n\t\t});\n\n\t\treturn relevantMeta.length ? relevantMeta : null;\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\tprivate dependencyDebug(message: string, details?: Record<string, unknown>) {\n\t\tif (!this._enableDependencyDebug) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (details) {\n\t\t\tconsole.log(new Date(), '[Dependency Debug]', message, JSON.stringify(details, null, 2));\n\t\t}\n\t\telse {\n\t\t\tconsole.log(new Date(), '[Dependency Debug]', message);\n\t\t}\n\t}\n\n\tprivate summarizeEvents(events: { type: string, documentId?: any }[]) {\n\t\treturn events.map(event => ({\n\t\t\ttype: event.type,\n\t\t\tdocumentId: this.normalizeDocumentId(event.documentId)\n\t\t}));\n\t}\n\n\tprivate logDependencySnapshot(sub: ActiveSubscriptionModel, context: string) {\n\t\tif (!this._enableDependencyDebug) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst dependencySummary = Array.from(sub.collectionDependencies.entries()).map(([collectionName, ids]) => {\n\t\t\tconst idList = Array.from(ids || []);\n\t\t\treturn {\n\t\t\t\tcollection: collectionName,\n\t\t\t\tcount: idList.length,\n\t\t\t\tsample: idList.slice(0, 10)\n\t\t\t};\n\t\t});\n\n\t\tconst filterSummary = Array.from(sub.collectionFilters.entries()).map(([collectionName, filters]) => ({\n\t\t\tcollection: collectionName,\n\t\t\tcount: filters.length\n\t\t}));\n\n\t\tconst queryMetaSummary = Array.from(sub.collectionQueryMeta.entries()).map(([collectionName, metaList]) => ({\n\t\t\tcollection: collectionName,\n\t\t\tcount: metaList.length,\n\t\t\tmeta: metaList.slice(0, 5)\n\t\t}));\n\n\t\tconst watchAll = Array.from(sub.watchAllCollections || []);\n\n\t\tthis.dependencyDebug('Dependency snapshot updated', {\n\t\t\tcontext,\n\t\t\tpublication: sub.publication,\n\t\t\tdependencies: dependencySummary,\n\t\t\tcollectionsWithFilters: filterSummary,\n\t\t\tcollectionsWithMeta: queryMetaSummary,\n\t\t\twatchAll\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../src/managers/subscription.manager.ts"],"names":[],"mappings":"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","file":"subscription.manager.js","sourcesContent":["import { ChangeStream, ChangeStreamDeleteDocument, ChangeStreamInsertDocument, ChangeStreamReplaceDocument, ChangeStreamUpdateDocument, ObjectId, ResumeToken } from 'mongodb';\nimport * as NodeCache from 'node-cache';\nimport { cpus } from 'os';\nimport * as WebSocket from 'ws';\nimport { Flags } from '../collections/flag.collection';\nimport { LoggedInUsers } from '../collections/logged-in-users.collection';\nimport { LoggedInUserModel } from '../models/logged-in-users.model';\nimport { ServerResponseModel } from '../models/server-message.model';\nimport { ActiveSubscriptionModel, SubscriptionModel } from '../models/subscription.model';\nimport { loadAppStatusPublications } from '../publications/app-status';\nimport { loadCronJobPublications } from '../publications/cron-jobs';\nimport { loadFilePublications } from '../publications/files';\nimport { loadFlagsPublications } from '../publications/flags';\nimport { loadFlagsUpdatePublications } from '../publications/flags-update';\nimport { loadLogPublications } from '../publications/logs';\nimport { loadNotificationPublications } from '../publications/notifications';\nimport { loadReportBuilderDashboardBuilderPublications } from '../publications/report-builder-dashboard-builders';\nimport { loadReportBuilderLibraryPublications } from '../publications/report-builder-libraries';\nimport { loadReportBuilderReportPublications } from '../publications/report-builder-reports';\nimport { loadSuperAdminPublications } from '../publications/super-admin';\nimport { loadUserGroupPublications } from '../publications/user-groups';\nimport { loadUserGuidePublications } from '../publications/user-guides';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { dateReviver, deepCopy, getBinarySize, objectIdHexString } from '../util/common';\nimport { DependencyContextSnapshot, QueryMeta, withDependencyTracking } from '../util/subscription-dependency-context';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { WebSocketManager } from './websocket.manager';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\n\n// Performance Dependencies\n// import * as path from 'path';\n// import { Worker } from 'worker_threads';\n\ninterface MongoQueueModel {\n\t_id: number,\n\ttype: string;\n\tcollection: string;\n\tsubscription: ActiveSubscriptionModel;\n\trunning: boolean;\n\trun_again: boolean;\n}\n\n// interface CurrentPerformanceMonitor {\n// \t_id: number;\n// \tfunction: string;\n// \tpublication: string;\n// \tsubscriptionData: any[];\n// \tdate_start: Date;\n// \tdate_end: Date;\n// \tduration: number;\n// \tresult: string;\n// }\n\nexport class SubscriptionManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _publications: SubscriptionModel = {};\n\tprivate _subscriptions: ActiveSubscriptionModel[] = [];\n\tprivate _wss: WebSocket.Server;\n\tprivate _loggedInUsers: LoggedInUserModel[] = [];\n\n\tprivate _mongoQueue: MongoQueueModel[] = [];\n\tprivate _mongoQueueId = 0;\n\t\n\tprivate _oplog$: ChangeStream;\n\n\tprivate _nodeCache;\n\tprivate _cacheId = 1;\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate serverConfig;\n\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\n\tprivate _enableDebug = false;\n\tprivate _enableDependencyDebug = false;\n\tprivate _debugOplogCollections = [];\n\tprivate _debugOplogHits = 0;\n\tprivate _debugSubCollections = [];\n\tprivate _debugSubHits = 0;\n\tprivate _debugUnSubHits = 0;\n\tprivate _debugUnSubAllHits = 0;\n\tprivate _debugMongoQueueHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _debugSendQueueHits = 0;\n\tprivate _debugRemoveCacheHits = 0;\n\n\tprivate _oplogRetryCount = 0;\n\n\t// Buffer to store throttled latency updates with timestamps\n\tprivate latencyBuffer = new Map<string, { latency: number, lastUpdate: Date }>();\n\n\t// Interval to flush latency updates in MongoDB\n\tprivate readonly LATENCY_UPDATE_INTERVAL = 60000;\n\n\t// Minimum time difference between two latency updates for the same user\n\tprivate readonly LATENCY_UPDATE_THRESHOLD_MS = 30000;\n\n\t// private currentPerfomanceMonitor: CurrentPerformanceMonitor[] = [];\n\t// private idPerformance: number = 0;\n\t// private performanceThread;\n\n\tprivate _invalidationDebounceTimers = new Map<string, NodeJS.Timeout>();\n\tprivate _invalidationPendingTimestamps = new Map<string, number>();\n\tprivate _pendingInvalidations = new Map<string, { events: { type: string, documentId?: any }[] }>();\n\tprivate readonly DEBOUNCE_DELAY = 100; // 100ms debounce window\n\tprivate readonly MAX_WAIT_TIME = 500; // 500ms maximum delay\n\n\n\tconstructor() {}\n\t\n\tstatic create(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tconst subscriptionManager = new SubscriptionManager();\n\t\tsetImmediate(async () => {\n\t\t\tawait subscriptionManager.initialize(wss, serverConfig, monitorManagerFunction);\n\t\t});\n\t\treturn subscriptionManager;\n\t}\n\t\n\tprivate async initialize(wss: WebSocket.Server, serverConfig, monitorManagerFunction: MonitorManagerFunction) {\n\t\tthis._websocketManager = ResolveIOServer.getMainServer().getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\n\t\tthis._nodeCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );\n\n\t\tsetInterval(() => this.flushThrottledLatencyUpdates(), this.LATENCY_UPDATE_INTERVAL);\n\n\t\t// setTimeout(() => {\n\t\t// \tconsole.log('Setting up performance thread');\n\n\t\t// \tthis.performanceThread = new Worker(path.join(__dirname, './subscription.performance.js'));\n\n\t\t// \tthis.performanceThread.on('exit', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD EXITED!!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\n\t\t// \tthis.performanceThread.on('error', code => {\n\t\t// \t\tconsole.error(new Date(), 'THREAD RECV ERROR !!!!!!!!!!!!!!!!!!', code);\n\t\t// \t});\n\t\t// }, 5000);\n\n\t\t// setInterval(() => {\n\t\t// \tconsole.log('Post thread msg');\n\t\t// \tthis.performanceThread.postMessage(this.currentPerfomanceMonitor);\n\t\t// \tthis.currentPerfomanceMonitor = [];\n\t\t// }, 10000);\n\n\t\tthis.serverConfig = serverConfig;\n\t\tthis._wss = wss;\n\n\t\t// Publications\n\t\tloadSuperAdminPublications(this);\n\t\tloadAppStatusPublications(this);\n\t\tloadLogPublications(this);\n\t\tloadFilePublications(this);\n\t\tloadCronJobPublications(this);\n\t\tloadFlagsUpdatePublications(this);\n\t\tloadFlagsPublications(this);\n\t\tloadNotificationPublications(this);\n\t\tloadReportBuilderReportPublications(this);\n\t\tloadReportBuilderLibraryPublications(this);\n\t\tloadUserGroupPublications(this);\n\t\tloadUserGuidePublications(this);\n\t\tloadReportBuilderDashboardBuilderPublications(this);\n\n\t\tawait this.tailOpLog();\n\n\t\tsetInterval(() => {\n\t\t\tthis._oplogRetryCount = 0;\n\t\t}, 15000);\n\n\t\tsetInterval(() => {\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Subs', this._subscriptions.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Logged In Users', this._loggedInUsers.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue', this._mongoQueue.length);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Hits', this._debugMongoQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Mongo Queue Collections', JSON.stringify(this._debugMongoQueueCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Hits', this._debugOplogHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Oplog Collections', JSON.stringify(this._debugOplogCollections.sort((a, b) => a.collection.localeCompare(b.collection) || a.type.localeCompare(b.type)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Hits', this._debugSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Sub Collections', JSON.stringify(this._debugSubCollections.sort((a, b) => a.publication.localeCompare(b.publication)), null, 2));\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub Hits', this._debugUnSubHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub All Hits', this._debugUnSubAllHits);\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Cache Cleanup Hits', this._debugRemoveCacheHits);\n\t\t\t}\n\t\t\t\n\t\t\tthis._debugOplogHits = 0;\n\t\t\tthis._debugOplogCollections = [];\n\t\t\tthis._debugSubCollections = [];\n\t\t\tthis._debugMongoQueueHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t\tthis._debugSubHits = 0;\n\t\t\tthis._debugUnSubHits = 0;\n\t\t\tthis._debugUnSubAllHits = 0;\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t}, 60000);\n\n\t\tsetInterval(async () => {\n\t\t\tthis._loggedInUsers = await LoggedInUsers.find();\n\t\n\t\t\tlet userCopy = deepCopy(this._loggedInUsers);\n\t\t\tfor (let i = this._loggedInUsers.length - 1; i >= 0; i--) {\n\t\t\t\tlet loggedInUser = userCopy[i];\n\n\t\t\t\tif (!loggedInUser.date || Date.now() - loggedInUser.date.getTime() > 120000) {\n\t\t\t\t\tif (this._websocketManager.getWebSocket(loggedInUser.id_ws)) {\n\t\t\t\t\t\tif (this.getEnableDebug()) {\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Unsub WS', this._websocketManager.getWebSocket(loggedInUser.id_ws)['user'], this._websocketManager.getWebSocket(loggedInUser.id_ws)['id_socket'], 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.unsubscribeAll(this._websocketManager.getWebSocket(loggedInUser.id_ws));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._subscriptions.forEach(sub => {\n\t\t\t\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\t\t\t\tif (client.id_socket === loggedInUser.id_ws) {\n\t\t\t\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait LoggedInUsers.deleteOne({_id: loggedInUser._id});\n\n\t\t\t\t\t\tif (this._loggedInUsers.findIndex(a => a._id === loggedInUser._id) >= 0) {\n\t\t\t\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.findIndex(a => a._id === loggedInUser._id), 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < this._subscriptions.length; i++) {\n\t\t\t\tlet sub = this._subscriptions[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tlet client = sub.clients[j];\n\n\t\t\t\t\tif (!this._loggedInUsers.some(a => a.id_ws === client.id_socket)) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 30000);\n\n\t\tlet flag = await Flags.findOne({type: 'Enable Debug'});\n\t\tlet dependencyFlag = await Flags.findOne({type: 'Enable Dependency Debug'});\n\n\t\tif (flag && flag.value) {\n\t\t\tthis._enableDebug = true;\n\t\t}\n\t\telse {\n\t\t\tthis._enableDebug = false;\n\t\t}\n\n\t\tif (dependencyFlag && dependencyFlag.value) {\n\t\t\tthis._enableDependencyDebug = true;\n\t\t}\n\t\telse {\n\t\t\tthis._enableDependencyDebug = process.env.ENABLE_DEPENDENCY_DEBUG === 'true';\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, documentId?: any) {\n\t\tlet queue = this._pendingInvalidations.get(collection);\n\t\tif (!queue) {\n\t\t\tqueue = { events: [] };\n\t\t\tthis._pendingInvalidations.set(collection, queue);\n\t\t}\n\t\tqueue.events.push({ type, documentId });\n\n\t\tconst debounceKey = collection;\n\t\tconst now = Date.now();\n\t\n\t\t// Initialize or get existing timestamp\n\t\tconst firstInvalidationTime = this._invalidationPendingTimestamps.get(debounceKey) || now;\n\t\tthis._invalidationPendingTimestamps.set(debounceKey, firstInvalidationTime);\n\t\n\t\t// Clear any existing timer\n\t\tif (this._invalidationDebounceTimers.has(debounceKey)) {\n\t\t\tclearTimeout(this._invalidationDebounceTimers.get(debounceKey));\n\t\t}\n\t\n\t\t// Check if we've waited too long\n\t\tconst waitedTooLong = (now - firstInvalidationTime) >= this.MAX_WAIT_TIME;\n\t\t\n\t\tif (waitedTooLong) {\n\t\t\t// Immediate execution path\n\t\t\tthis._invalidationPendingTimestamps.delete(debounceKey);\n\t\t\tawait this._executeInvalidation(collection);\n\t\t} else {\n\t\t\t// Normal debounce path\n\t\t\tthis._invalidationDebounceTimers.set(\n\t\t\t\tdebounceKey,\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tthis._invalidationPendingTimestamps.delete(debounceKey);\n\t\t\t\t\tawait this._executeInvalidation(collection);\n\t\t\t\t}, this.DEBOUNCE_DELAY)\n\t\t\t);\n\t\t}\n\t}\n\t\n\tprivate async _executeInvalidation(collection: string) {\n\t\t// Clean up any existing timer (defensive)\n\t\tif (this._invalidationDebounceTimers.has(collection)) {\n\t\t\tclearTimeout(this._invalidationDebounceTimers.get(collection));\n\t\t\tthis._invalidationDebounceTimers.delete(collection);\n\t\t}\n\n\t\tconst queued = this._pendingInvalidations.get(collection);\n\t\tthis._pendingInvalidations.delete(collection);\n\n\t\tif (!queued || !queued.events.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst events = queued.events;\n\t\n\t\t// Original invalidation logic\n\t\tResolveIOServer.getMongoManager().invalidateQueryCache(collection);\n\t\n\t\tconst collSubs = this._subscriptions.filter(a => a.collections.includes(collection));\n\t\n\t\tfor (const sub of collSubs) {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Invalidate Sub', sub.publication, sub.running, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (!(await this.shouldInvalidateSubscriptionForEvents(sub, collection, events))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tif (sub.running) {\n\t\t\t\tsub.runAgain = true;\n\t\t\t\tthis.dependencyDebug('Subscription busy, scheduling rerun', { publication: sub.publication, collection, events: this.summarizeEvents(events) });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tconst batchType = events.length === 1 ? events[0].type : events.map(event => event.type).join(',');\n\n\t\t\tif (this._publications[sub.publication].user_specific) {\n\t\t\t\tthis.dependencyDebug('Triggering user-specific invalidation', { publication: sub.publication, collection, events: this.summarizeEvents(events), clientCount: sub.clients.length });\n\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\tconst ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\tif (ws?.readyState === ws.OPEN) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.sendDataToOneWithRetry(ws, client.messageId, sub, collection, batchType);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch {\n\t\t\t\t\t\t\t// Error handling\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.dependencyDebug('Triggering broadcast invalidation', { publication: sub.publication, collection, events: this.summarizeEvents(events), clientCount: sub.clients.length });\n\t\t\t\tawait this.sendDataToAllWithRetry(sub, collection, batchType);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async delay(ms: number) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tprivate async sendDataToAllWithRetry(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToAll Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToAll(sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToAll Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\n\t\tsub.running = false;\n\t}\n\n\tprivate async sendDataToOneWithRetry(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tsub.running = true;\n\n\t\tdo {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Running sendDataToOne Sub', sub.publication);\n\t\t\t}\n\n\t\t\tsub.runAgain = false;\n\t\t\tawait this.sendDataToOne(ws, messageId, sub, collection, type);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Done sendDataToOne Sub', sub.publication, sub.runAgain);\n\t\t\t}\n\n\t\t\tif (sub.runAgain) {\n\t\t\t\tawait this.delay(500); // delay, adjust as needed\n\t\t\t}\n\t\t} while (sub.runAgain);\n\t\tsub.running = false;\n\t}\n\n\t// Add all files to publications private object\n\tpublic publications(method: SubscriptionModel) {\n\t\tthis._publications = Object.assign(this._publications, method);\n\t}\n\n\t// Throttled `loggedInLatency` method\n\tpublic loggedInLatency(ws: WebSocket) {\n\t\tlet loggedInUser = this._loggedInUsers.find(a => a.id_ws === ws['id_socket']);\n\t\tif (!loggedInUser) return;\n\n\t\tconst now = new Date();\n\t\tconst existingEntry = this.latencyBuffer.get(ws['id_socket']);\n\t\tconst newLatency = ws['latency'];\n\n\t\t// Throttle updates: only update if time threshold has passed or latency has significantly changed\n\t\tif (\n\t\t\t!existingEntry || \n\t\t\t(now.getTime() - existingEntry.lastUpdate.getTime() >= this.LATENCY_UPDATE_THRESHOLD_MS) || \n\t\t\t(Math.abs(newLatency - existingEntry.latency) > 100) // Optional: log only significant changes\n\t\t) {\n\t\t\t// Update in-memory and buffer\n\t\t\tloggedInUser.date = now;\n\t\t\tthis.latencyBuffer.set(ws['id_socket'], { latency: newLatency, lastUpdate: now });\n\t\t}\n\t}\n\n\t// Method to flush buffered latency updates in bulk\n\tprivate async flushThrottledLatencyUpdates() {\n\t\tif (this.latencyBuffer.size === 0) return; // No updates to flush\n\n\t\tconst updates = Array.from(this.latencyBuffer.entries()).map(([id_ws, { latency, lastUpdate }]) => ({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: { id_ws },\n\t\t\t\tupdate: { $set: { latency, date: lastUpdate } }\n\t\t\t}\n\t\t}));\n\n\t\ttry {\n\t\t\tawait LoggedInUsers.bulkWrite(updates);\n\t\t\tthis.latencyBuffer.clear(); // Clear buffer after successful update\n\n\t\t\tif (this.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sub Manager', 'Throttled latency batch update successful', updates.length);\n\t\t\t}\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'Sub Manager', 'Throttled latency batch update failed', error);\n\t\t\t// Optional: implement retry logic or logging for failed updates\n\t\t}\n\t}\n\n\t// Subscribe to publication\n\tpublic async subscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\n\t\tthis._debugSubHits += 1;\n\n\t\tif (!this._debugSubCollections.some(a => a.publication === publication)) {\n\t\t\tthis._debugSubCollections.push({\n\t\t\t\tpublication: publication,\n\t\t\t\thits: 1\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis._debugSubCollections.find(a => a.publication === publication).hits += 1;\n\t\t}\n\n\t\tlet pub = this._publications[publication];\n\n\t\tif (!pub) {\n\t\t\tconsole.error(new Date(), 'No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tif (subscriptionData.length > 1 || subscriptionData[0]) {\n\t\t\t\tif (!pub.check) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Function For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (!pub.check._schema) {\n\t\t\t\t\tconsole.error(new Date(), 'No Check Schema For Pub ' + publication);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet valObj = {};\n\t\t\t\t\tlet valKeys = Object.keys(pub.check._schema);\n\n\t\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\n\t\t\t\t\tfor (let i = 0; i < subscriptionData.length; i++) {\n\t\t\t\t\t\tvalObj[rootKeys[i]] = subscriptionData[i];\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpub.check.validate(valObj);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (errors) {\n\t\t\t\t\t\tif (errors) {\n\t\t\t\t\t\t\tconsole.error(new Date(), 'Error in Pub Check (' + publication + ')', errors);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (messageRoute !== 'Bypass') {\n\t\t\t\tlet urlData = messageRoute.split('/');\n\t\t\t\tlet urlModule = '';\n\t\t\t\tlet urlNext = urlData[0];\n\n\t\t\t\tif (urlData[0] === '') {\n\t\t\t\t\turlModule = '/';\n\t\t\t\t\turlNext = urlData[1];\n\t\t\t\t}\n\n\t\t\t\turlModule += urlNext;\n\n\t\t\t\tif (urlData.length > 1) {\n\t\t\t\t\turlModule += '/';\n\t\t\t\t}\n\n\t\t\t\tlet otherRouteSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_socket === ws['id_socket'] && b.messageRoute !== 'Bypass' && b.messageRoute !== '/' && b.messageRoute !== messageRoute && !b.messageRoute.startsWith(urlModule)));\n\n\t\t\t\tif (otherRouteSubs.length) {\n\t\t\t\t\t// ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Detected Undestroyed Subscription - ' + this.serverConfig['CLIENT_NAME'], 'USER: ' + ws['user'] + ' (Socket: ' + ws['id_socket'] + ') ' + ' is on route: ' + messageRoute + ' but has the following subscriptions on other routes:' + JSON.stringify(otherRouteSubs, null, 2));\n\n\t\t\t\t\totherRouteSubs.forEach(otherSub => {\n\t\t\t\t\t\totherSub.clients.filter(a => a.id_socket === ws['id_socket']).forEach(client => {\n\t\t\t\t\t\t\tthis.unsubscribe(client.messageRoute, new Date(), ws, client.messageId, otherSub.publication, otherSub.subscriptionData);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst normalizedSubscriptionData = Array.isArray(subscriptionData) ? subscriptionData : [];\n\t\t\tconst subscriptionKey = JSON.stringify(normalizedSubscriptionData);\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && a.subscriptionKey === subscriptionKey);\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\tsubscriptionKey: subscriptionKey,\n\t\t\t\t\tsubscriptionData: normalizedSubscriptionData,\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\tcacheId: 0,\n\t\t\t\trunning: false,\n\t\t\t\trunAgain: false,\n\t\t\t\tcollectionDependencies: new Map(),\n\t\t\t\tcollectionFilters: new Map(),\n\t\t\t\twatchAllCollections: new Set(),\n\t\t\t\tcollectionQueryMeta: new Map()\n\t\t\t});\n\t\t}\n\n\t\t\tif (!sub) {\n\t\t\t\tsub = this._subscriptions.find(a => a.publication === publication && a.subscriptionKey === subscriptionKey);\n\t\t\t}\n\n\t\t\tthis.ensureDependencyContainers(sub);\n\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'New Sub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t}\n\n\t\t\t// Immediately send data to the new client\n\t\t\tawait this.processSubscription(sub, ws, messageId);\n\t\t}\n\t}\n\n\tpublic async createLoggedInUser(id_ws: string): Promise<LoggedInUserModel> {\n\t\tlet ws = this._websocketManager.getWebSocket(id_ws);\n\n\t\tif (ws) {\n\t\t\tlet user = {\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t__v: 0,\n\t\t\t\tdate: new Date(),\n\t\t\t\tid_user: ws['id_user'],\n\t\t\t\tuser: ws['user'],\n\t\t\t\tid_ws: ws['id_socket']\n\t\t\t};\n\t\t\t\n\t\t\tthis._loggedInUsers.push(user);\n\t\t\tawait LoggedInUsers.insertOne(user);\n\t\t\t\n\t\t\treturn user;\n\t\t}\n\t\telse {\n\t\t\tthrow new Error('Error in Create Logged In User: No WS');\n\t\t}\n\t}\n\n\t// Unsubscribe from publication \n\tpublic unsubscribe(messageRoute: string, messageDate: Date, ws: WebSocket, messageId: number, publication: string, subscriptionData: any[]) {\t\t\n\t\tthis._debugUnSubHits += 1;\n\n\t\tif (!this._publications[publication]) {\n\t\t\tconsole.log('No Publication: ' + publication);\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\tconst normalizedSubscriptionData = Array.isArray(subscriptionData) ? subscriptionData : [];\n\t\t\tconst subscriptionKey = JSON.stringify(normalizedSubscriptionData);\n\t\t\tlet sub = this._subscriptions.find(a => a.publication === publication && a.subscriptionKey === subscriptionKey);\n\n\t\t\tif (sub) {\n\t\t\t\tfor (let i = sub.clients.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (sub.clients[i].id_user === ws['id_user'] && sub.clients[i].messageId === messageId && sub.clients[i].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Unsub', sub.publication, sub.running, sub.runAgain, sub.clients.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Unsubscribe from publication\n\tpublic async unsubscribeAll(ws: WebSocket) {\n\t\tthis._debugUnSubAllHits += 1;\n\n\t\tif (ws) {\n\t\t\t// Check if WebSocket has already been unsubscribed\n\t\t\tif (ws['isUnsubscribed']) {\n\t\t\t\treturn; // Skip if already unsubscribed\n\t\t\t}\n\t\t\t\n\t\t\t// Mark the WebSocket as unsubscribed to prevent further calls\n\t\t\tws['isUnsubscribed'] = true;\n\t\t\t\n\t\t\tif (this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']) >= 0) {\n\t\t\t\tthis._loggedInUsers.splice(this._loggedInUsers.map(a => a.id_ws).indexOf(ws['id_socket']), 1);\n\t\t\t}\n\t\t\t\n\t\t\tawait LoggedInUsers.deleteOne({ id_ws: ws['id_socket'] });\n\n\t\t\tlet userSubs = this._subscriptions.filter(a => a.clients.some(b => b.id_user === ws['id_user'] && b.id_socket === ws['id_socket']));\n\n\t\t\tfor (let i = userSubs.length - 1; i >= 0; i--) {\n\t\t\t\tlet sub = userSubs[i];\n\n\t\t\t\tfor (let j = sub.clients.length - 1; j >= 0; j--) {\n\t\t\t\t\tif (sub.clients[j].id_socket === ws['id_socket']) {\n\t\t\t\t\t\tsub.clients.splice(j, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._websocketManager.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic getActiveSubscriptions() {\n\t\treturn this._subscriptions;\n\t}\n\n\t// Get publication collection\n\tprivate getPublicationCollections(publication: string) {\n\t\treturn this._publications[publication].collections;\n\t}\n\n\tprivate getWatchedDatabases(): string[] {\n\t\tconst mongoManager = ResolveIOServer.getMongoManager();\n\t\tconst managerDatabases = mongoManager?.getWatchedDatabases() || [];\n\n\t\tif (managerDatabases.length) {\n\t\t\treturn managerDatabases;\n\t\t}\n\n\t\tconst config = this.serverConfig || ResolveIOServer.getServerConfig();\n\t\tconst mainDb = config && typeof config['DATABASE'] === 'string' ? config['DATABASE'] : '';\n\n\t\treturn mainDb ? [mainDb] : [];\n\t}\n\n\t// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)\n\tprivate async tailOpLog(resumeToken?: ResumeToken) {\n\t\tif (this._oplog$ && !this._oplog$.closed) {\n\t\t\tthis._oplog$.removeAllListeners();\n\t\t\tawait this._oplog$.close();\n\t\t\tthis._oplog$ = null;\n\t\t}\n\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\n\t\tif (!this._oplog$ || this._oplog$.closed) {\n\t\t\tthis._oplogRetryCount += 1;\n\n\t\t\tif (this._oplogRetryCount > 5) {\n\t\t\t\tconsole.error('****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst watchDatabases = this.getWatchedDatabases();\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...(watchDatabases.length ? [{ 'ns.db': { $in: watchDatabases } }] : []),\n\t\t\t\t\t\t\t{'ns.coll': { $nin: [\n\t\t\t\t\t\t\t\t'log-method-latencies', \n\t\t\t\t\t\t\t\t'log-subscriptions', \n\t\t\t\t\t\t\t\t'logs', \n\t\t\t\t\t\t\t\t'counters', \n\t\t\t\t\t\t\t\t'cron-job-histories', \n\t\t\t\t\t\t\t\t'email-histories',\n\t\t\t\t\t\t\t\t'qb-soap-request-histories', \n\t\t\t\t\t\t\t\t'qb-soap-request-responses', \n\t\t\t\t\t\t\t\t'qb-soap-requests',\n\t\t\t\t\t\t\t\t'qb-soap-retries'\n\t\t\t\t\t\t\t] }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tlet lastResumeToken: ResumeToken;\n\n\t\t\tif (resumeToken) {\n\t\t\t\tlastResumeToken = resumeToken;\n\t\t\t\ttry {\n\t\t\t\t\tthis._oplog$ = ResolveIOServer.getMongoConnection().watch(pipeline, { resumeAfter: resumeToken });\n\t\t\t\t}\n\t\t\t\tcatch {\n\t\t\t\t\tif (this._oplog$) {\n\t\t\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\t\t\tawait this._oplog$.close();\n\t\t\t\t\t\tthis._oplog$ = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait this.tailOpLog(resumeToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._oplog$ = ResolveIOServer.getMongoConnection().watch(pipeline);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'oplog started');\n\n\t\t\tthis._oplog$.on('change', async (doc: ChangeStreamInsertDocument | ChangeStreamUpdateDocument | ChangeStreamReplaceDocument | ChangeStreamDeleteDocument) => {\n\t\t\t\tif (doc.ns) {\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Oplog Hit', doc.ns);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet collection = doc.ns.coll;\n\n\t\t\t\t\tif (!this._debugOplogCollections.some(a => a.collection === doc.ns.coll && a.type === doc.operationType)) {\n\t\t\t\t\t\tthis._debugOplogCollections.push({\n\t\t\t\t\t\t\tcollection: doc.ns.coll,\n\t\t\t\t\t\t\ttype: doc.operationType,\n\t\t\t\t\t\t\thits: 1\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._debugOplogCollections.find(a => a.collection === doc.ns.coll && a.type === doc.operationType).hits += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection) {\n\t\t\t\t\t\tthis._debugOplogHits += 1;\n\t\t\t\t\t\tconst docId = doc.documentKey && doc.documentKey['_id'] !== undefined ? doc.documentKey['_id'] : (doc['fullDocument'] && doc['fullDocument']['_id'] !== undefined ? doc['fullDocument']['_id'] : null);\n\n\t\t\t\t\t\tif (doc.operationType === 'insert') {\n\t\t\t\t\t\t\tif (collection === 'support-tickets') {\n\t\t\t\t\t\t\t\tif (this.serverConfig['ROOT_URL'] === 'https://resolveio.com') {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'sendSupportTicketEmail', doc.documentKey['_id']);\n\t\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'insert', docId);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'insert', docId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'update' || doc.operationType === 'replace') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'update', docId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (doc.operationType === 'delete') {\n\t\t\t\t\t\t\tif (collection !== 'method-responses') {\n\t\t\t\t\t\t\t\tawait this.invalidatePubsCache(collection, 'delete', docId);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (collection === 'flags') {\n\t\t\t\t\t\tlet flag = await Flags.findOne({ type: 'Enable Debug' });\n\t\t\t\t\t\tlet dependencyFlag = await Flags.findOne({ type: 'Enable Dependency Debug' });\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (flag && flag.value) {\n\t\t\t\t\t\t\tthis._enableDebug = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis._enableDebug = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (dependencyFlag && dependencyFlag.value) {\n\t\t\t\t\t\t\tthis._enableDependencyDebug = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis._enableDependencyDebug = process.env.ENABLE_DEPENDENCY_DEBUG === 'true';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlastResumeToken = doc._id;\n\n\t\t\t\t\tif ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && (process.env.IS_WORKERS_ENABLED === 'false' || (process.env.IS_WORKER_INSTANCE === 'true' && process.env.WORKER_INDEX === '0'))) {\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._oplog$.on('error', async error => {\n\t\t\t\tconsole.log(new Date(), 'oplog error', error);\n\t\t\t\tawait this._oplog$.close();\n\t\t\t});\n\n\t\t\tthis._oplog$.on('end', async () => {\n\t\t\t\tconsole.log(new Date(), 'oplog end');\n\t\t\t\tawait this._oplog$.close();\n\t\t\t});\n\n\t\t\tthis._oplog$.on('close', async () => {\n\t\t\t\tconsole.log(new Date(), 'oplog close');\n\t\t\t\tthis._oplog$.removeAllListeners();\n\t\t\t\tthis._oplog$ = null;\n\t\t\t\tawait this.tailOpLog(lastResumeToken);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async processSubscription(sub: ActiveSubscriptionModel, ws: WebSocket, messageId: number) {\n\t\tif (!this._publications[sub.publication].user_specific) {\t\t\t\n\t\t\tif (sub.cacheId) {\n\t\t\t\ttry {\n\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\tdata: cacheData\n\t\t\t\t\t};\n\n\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Cache', sub.publication);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t}\n\t\t\t\tcatch {\n\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\t\tsub.cacheId = 0;\n\n\t\t\t\t\tawait this.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\tconsole.log(new Date(), 'Process Sub, Non - Cache', sub.publication, sub.running);\n\t\t\t\t}\n\n\t\t\t\tif (sub.running) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait this.sendDataToAllWithRetry(sub, '', 'newSub');\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this._enableDebug) {\n\t\t\t\tconsole.log(new Date(), 'Process Sub Specific, Non - Cache', sub.publication, sub.running);\n\t\t\t}\n\n\t\t\tif (sub.running) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tawait this.sendDataToOneWithRetry(ws, messageId, sub, '', 'newSub');\n\t\t}\n\t}\n\n\tprivate async sendDataToOne(ws: WebSocket, messageId: number, sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('User Specific Publication', sub.publication, '', '', sub.subscriptionData);\n\t\tlet dependencySnapshot: DependencyContextSnapshot;\n\t\tlet res;\n\t\ttry {\n\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\n\t\t\tconst execution = await withDependencyTracking(() => this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ws['id_user'], ...sub.subscriptionData));\n\t\t\tres = execution.result;\n\t\t\tdependencySnapshot = execution.snapshot;\n\t\t\tthis.updateSubscriptionDependencies(sub, dependencySnapshot);\n\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: false,\n\t\t\t\tdata: res\n\t\t\t};\n\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t}\n\t\tcatch (err) {\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: err\n\t\t\t};\n\t\t\t\n\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\n\t\t\tawait ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendDataToOne - WS)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t}\n\t\tfinally {\n\t\t\tawait this._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t}\n\t}\n\n\t// Fetch pub once, send to all clients linked to this pub\n\tprivate async sendDataToAll(sub: ActiveSubscriptionModel, collection: string, type: string) {\n\t\tif (!sub.clients.length) {\n\t\t\tif (sub.cacheId) {\n\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\t\t\t\tsub.cacheId = 0;\n\t\t\t}\n\n\t\t\tlet subIndex = this._subscriptions.findIndex(a => a.publication === sub.publication && a.subscriptionKey === sub.subscriptionKey);\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\t\t\tlet res;\n\t\t\tlet dependencySnapshot: DependencyContextSnapshot;\n\n\t\t\ttry {\n\t\t\t\tif (sub.publication !== 'superadminAPM' && sub.publication !== 'loggedInUsers') {\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethod.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertSubscriptionLog', type, sub.publication, collection, JSON.stringify(sub.subscriptionData));\n\t\t\t\t}\n\n\t\t\t\tconst execution = await withDependencyTracking(() => this._publications[sub.publication].function.call(Object.assign({}, this, SubscriptionManager.prototype), ...sub.subscriptionData));\n\t\t\t\tres = execution.result;\n\t\t\t\tdependencySnapshot = execution.snapshot;\n\t\t\t\tthis.updateSubscriptionDependencies(sub, dependencySnapshot);\n\n\t\t\t\tif (sub.cacheId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet cacheData = JSON.parse(this._nodeCache.get(sub.cacheId), dateReviver);\n\t\n\t\t\t\t\t\tif (JSON.stringify(cacheData) !== JSON.stringify(res)) {\n\t\t\t\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tsub.clients.map(client => {\n\t\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis._nodeCache.del(sub.cacheId);\n\n\t\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\t\tdata: res\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (getBinarySize(JSON.stringify(res)) < 1000000 && \n\t\t\t\t\t\t!sub.collections.includes('logs') &&\n\t\t\t\t\t\t!sub.collections.find(a => a.endsWith('.versions')) &&\n\t\t\t\t\t\t!sub.collections.find(a => a.startsWith('monitor-'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tsub.cacheId = this._cacheId++;\n\t\t\t\t\t\tthis._nodeCache.set(sub.cacheId, JSON.stringify(res));\n\n\t\t\t\t\t\tconst nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\t\t\t\t// Evict cache entries as needed\n\t\t\t\t\t\t\tlet deleteCount = 0;\n\t\t\t\t\t\t\tconst subArr = this._subscriptions.filter(a => a.cacheId && !a.clients.length);\n\t\t\t\t\t\n\t\t\t\t\t\t\tfor (let zz = 0; zz < subArr.length; zz++) {\n\t\t\t\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\t\t\t\tthis._nodeCache.del(subArr[zz].cacheId);\n\t\t\t\t\t\t\t\tsubArr[zz].cacheId = 0;\n\t\t\t\t\t\t\t\tdeleteCount += 1;\n\t\t\t\t\t\t\t\tif (this._nodeCache.getStats().vsize < this._heapLimit * 0.75) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this._enableDebug) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t'Sub Cache: ' +\n\t\t\t\t\t\t\t\t\t'Too Big - ' +\n\t\t\t\t\t\t\t\t\tsub.publication +\n\t\t\t\t\t\t\t\t\t' - Deleted: ' +\n\t\t\t\t\t\t\t\t\tdeleteCount +\n\t\t\t\t\t\t\t\t\t' - ' +\n\t\t\t\t\t\t\t\t\tnodeCacheSize\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tsub.cacheId = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tfor (let client of sub.clients) {\n\t\t\t\t\tlet ws = this._websocketManager.getWebSocket(client.id_socket);\n\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\tmessageId: client.messageId,\n\t\t\t\t\t\t\thasError: true,\n\t\t\t\t\t\t\tdata: err\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.sendWS(ws, serverRes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tawait ResolveIOServer.getMainServer().getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + sub.publication + ' - (sendPubData)\\n\\nData \\n' + JSON.stringify(sub.subscriptionData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\tawait this._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate ensureDependencyContainers(sub: ActiveSubscriptionModel) {\n\t\tif (!sub.collectionDependencies) {\n\t\t\tsub.collectionDependencies = new Map();\n\t\t}\n\n\t\tif (!sub.collectionFilters) {\n\t\t\tsub.collectionFilters = new Map();\n\t\t}\n\n\t\tif (!sub.watchAllCollections) {\n\t\t\tsub.watchAllCollections = new Set();\n\t\t}\n\n\t\tif (!sub.collectionQueryMeta) {\n\t\t\tsub.collectionQueryMeta = new Map();\n\t\t}\n\t}\n\n\tprivate updateSubscriptionDependencies(sub: ActiveSubscriptionModel, snapshot?: DependencyContextSnapshot) {\n\t\tthis.ensureDependencyContainers(sub);\n\n\t\tif (!snapshot) {\n\t\t\tsub.collectionDependencies.clear();\n\t\t\tsub.collectionFilters.clear();\n\t\t\tsub.watchAllCollections.clear();\n\t\t\tsub.collectionQueryMeta.clear();\n\t\t\tthis.dependencyDebug('Cleared dependency snapshot', { publication: sub.publication });\n\t\t\treturn;\n\t\t}\n\n\t\tsub.collectionDependencies = snapshot.dependencies;\n\t\tsub.collectionFilters = snapshot.filters;\n\t\tsub.watchAllCollections = snapshot.watchAllCollections;\n\t\tsub.collectionQueryMeta = snapshot.queryMetadata;\n\t\tthis.logDependencySnapshot(sub, 'Snapshot updated');\n\t}\n\n\tprivate normalizeDocumentId(rawId: any): string {\n\t\tif (rawId === null || rawId === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (typeof rawId === 'string') {\n\t\t\treturn rawId;\n\t\t}\n\n\t\tif (typeof rawId === 'object' && typeof rawId.toHexString === 'function') {\n\t\t\treturn rawId.toHexString();\n\t\t}\n\n\t\tif (typeof rawId?.toString === 'function') {\n\t\t\tconst str = rawId.toString();\n\t\t\tif (str && str !== '[object Object]') {\n\t\t\t\treturn str;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate convertDocumentIdForQuery(documentId: string) {\n\t\tif (!documentId) {\n\t\t\treturn documentId;\n\t\t}\n\n\t\tif (/^[a-fA-F0-9]{24}$/.test(documentId)) {\n\t\t\ttry {\n\t\t\t\treturn new ObjectId(documentId);\n\t\t\t}\n\t\t\tcatch {}\n\t\t}\n\n\t\treturn documentId;\n\t}\n\n\tprivate async documentMatchesFilter(collection: string, documentId: string, filter: any): Promise<boolean> {\n\t\ttry {\n\t\t\tconst db = ResolveIOServer.getMainDB();\n\t\t\tconst filterCopy = deepCopy(filter) || {};\n\t\t\tconst idValue = this.convertDocumentIdForQuery(documentId);\n\t\t\tconst combinedFilter = {\n\t\t\t\t$and: [\n\t\t\t\t\t{ _id: idValue },\n\t\t\t\t\tfilterCopy\n\t\t\t\t]\n\t\t\t};\n\n\t\t\tconst doc = await db.collection(collection).findOne(combinedFilter);\n\t\t\treturn !!doc;\n\t\t}\n\t\tcatch {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate async shouldInvalidateSubscription(sub: ActiveSubscriptionModel, collection: string, type: string, documentId?: string): Promise<boolean> {\n\t\tthis.ensureDependencyContainers(sub);\n\n\t\tif (!documentId) {\n\t\t\tthis.dependencyDebug('Invalidate due to missing documentId', { publication: sub.publication, collection, type });\n\t\t\treturn true;\n\t\t}\n\n\t\tif (sub.watchAllCollections.has(collection)) {\n\t\t\tthis.dependencyDebug('Invalidate due to watch-all collection', { publication: sub.publication, collection, type });\n\t\t\treturn true;\n\t\t}\n\n\t\tconst trackedIds = sub.collectionDependencies.get(collection);\n\n\t\tif (trackedIds && trackedIds.has(documentId)) {\n\t\t\tthis.dependencyDebug('Invalidate due to tracked id', { publication: sub.publication, collection, type, documentId });\n\t\t\treturn true;\n\t\t}\n\n\t\tif (type === 'delete') {\n\t\t\tthis.dependencyDebug('Skip invalidation on delete for unknown id', { publication: sub.publication, collection, type, documentId });\n\t\t\treturn false;\n\t\t}\n\n\t\tconst filters = sub.collectionFilters.get(collection);\n\n\t\tif (filters && filters.length) {\n\t\t\tfor (const filter of filters) {\n\t\t\t\tif (await this.documentMatchesFilter(collection, documentId, filter)) {\n\t\t\t\t\tthis.dependencyDebug('Invalidate due to filter match', { publication: sub.publication, collection, type, documentId, filter });\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.dependencyDebug('Skip invalidation after dependency checks', { publication: sub.publication, collection, type, documentId });\n\t\treturn false;\n\t}\n\n\tprivate async shouldInvalidateSubscriptionForEvents(sub: ActiveSubscriptionModel, collection: string, events: { type: string, documentId?: any }[]): Promise<boolean> {\n\t\tlet sawInsert = false;\n\t\tlet sawDelete = false;\n\n\t\tfor (const event of events) {\n\t\t\tconst normalizedDocumentId = this.normalizeDocumentId(event.documentId);\n\t\t\tif (event.type === 'insert') {\n\t\t\t\tsawInsert = true;\n\t\t\t}\n\t\t\telse if (event.type === 'delete') {\n\t\t\t\tsawDelete = true;\n\t\t\t}\n\t\t\tif (await this.shouldInvalidateSubscription(sub, collection, event.type, normalizedDocumentId)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tconst paginationMeta = this.getPaginationMeta(sub, collection);\n\t\tconst paginationReasons = [];\n\t\tif (sawInsert) {\n\t\t\tpaginationReasons.push('insert');\n\t\t}\n\t\tif (sawDelete) {\n\t\t\tpaginationReasons.push('delete');\n\t\t}\n\n\t\tif (paginationMeta?.length && paginationReasons.length) {\n\t\t\tthis.dependencyDebug('Invalidate due to pagination metadata', {\n\t\t\t\tpublication: sub.publication,\n\t\t\t\tcollection,\n\t\t\t\tevents: this.summarizeEvents(events),\n\t\t\t\treasons: paginationReasons,\n\t\t\t\tqueryMeta: paginationMeta.slice(0, 5)\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate getPaginationMeta(sub: ActiveSubscriptionModel, collection: string): QueryMeta[] {\n\t\tthis.ensureDependencyContainers(sub);\n\t\tconst metaList = sub.collectionQueryMeta?.get(collection);\n\t\tif (!metaList || !metaList.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst relevantMeta = metaList.filter(meta => {\n\t\t\tif (!meta) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst limitUsed = typeof meta.limit === 'number' && meta.limit > 0;\n\t\t\tconst skipUsed = typeof meta.skip === 'number' && meta.skip > 0;\n\t\t\treturn limitUsed || skipUsed;\n\t\t});\n\n\t\treturn relevantMeta.length ? relevantMeta : null;\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\tprivate dependencyDebug(message: string, details?: Record<string, unknown>) {\n\t\tif (!this._enableDependencyDebug) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (details) {\n\t\t\tconsole.log(new Date(), '[Dependency Debug]', message, JSON.stringify(details, null, 2));\n\t\t}\n\t\telse {\n\t\t\tconsole.log(new Date(), '[Dependency Debug]', message);\n\t\t}\n\t}\n\n\tprivate summarizeEvents(events: { type: string, documentId?: any }[]) {\n\t\treturn events.map(event => ({\n\t\t\ttype: event.type,\n\t\t\tdocumentId: this.normalizeDocumentId(event.documentId)\n\t\t}));\n\t}\n\n\tprivate logDependencySnapshot(sub: ActiveSubscriptionModel, context: string) {\n\t\tif (!this._enableDependencyDebug) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst dependencySummary = Array.from(sub.collectionDependencies.entries()).map(([collectionName, ids]) => {\n\t\t\tconst idList = Array.from(ids || []);\n\t\t\treturn {\n\t\t\t\tcollection: collectionName,\n\t\t\t\tcount: idList.length,\n\t\t\t\tsample: idList.slice(0, 10)\n\t\t\t};\n\t\t});\n\n\t\tconst filterSummary = Array.from(sub.collectionFilters.entries()).map(([collectionName, filters]) => ({\n\t\t\tcollection: collectionName,\n\t\t\tcount: filters.length\n\t\t}));\n\n\t\tconst queryMetaSummary = Array.from(sub.collectionQueryMeta.entries()).map(([collectionName, metaList]) => ({\n\t\t\tcollection: collectionName,\n\t\t\tcount: metaList.length,\n\t\t\tmeta: metaList.slice(0, 5)\n\t\t}));\n\n\t\tconst watchAll = Array.from(sub.watchAllCollections || []);\n\n\t\tthis.dependencyDebug('Dependency snapshot updated', {\n\t\t\tcontext,\n\t\t\tpublication: sub.publication,\n\t\t\tdependencies: dependencySummary,\n\t\t\tcollectionsWithFilters: filterSummary,\n\t\t\tcollectionsWithMeta: queryMetaSummary,\n\t\t\twatchAll\n\t\t});\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "20.9.8",
3
+ "version": "20.9.9",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",