@resolveio/server-lib 20.12.49 → 20.12.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fixtures/init.js +1 -126
- package/fixtures/init.js.map +1 -1
- package/managers/mongo.manager.d.ts +1 -0
- package/managers/mongo.manager.js +37 -9
- package/managers/mongo.manager.js.map +1 -1
- package/managers/subscription.manager.d.ts +17 -0
- package/managers/subscription.manager.js +353 -46
- package/managers/subscription.manager.js.map +1 -1
- package/methods/report-builder.js.map +1 -1
- package/methods.ts +1 -1
- package/package.json +1 -1
|
@@ -92,8 +92,8 @@ var user_groups_1 = require("../publications/user-groups");
|
|
|
92
92
|
var user_guides_1 = require("../publications/user-guides");
|
|
93
93
|
var resolveio_server_app_1 = require("../resolveio-server-app");
|
|
94
94
|
var common_1 = require("../util/common");
|
|
95
|
-
var error_tracking_1 = require("../util/error-tracking");
|
|
96
95
|
var error_reporter_1 = require("../util/error-reporter");
|
|
96
|
+
var error_tracking_1 = require("../util/error-tracking");
|
|
97
97
|
var subscription_dependency_context_1 = require("../util/subscription-dependency-context");
|
|
98
98
|
var numCPUs = (0, os_1.cpus)().length;
|
|
99
99
|
var v8 = require('v8');
|
|
@@ -112,6 +112,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
112
112
|
this._publications = {};
|
|
113
113
|
this._subscriptions = [];
|
|
114
114
|
this._loggedInUsers = [];
|
|
115
|
+
this._lastRouteBySocket = new Map();
|
|
115
116
|
this._mongoQueue = [];
|
|
116
117
|
this._mongoQueueId = 0;
|
|
117
118
|
this._cacheId = 1;
|
|
@@ -129,6 +130,14 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
129
130
|
this._debugSendQueueHits = 0;
|
|
130
131
|
this._debugRemoveCacheHits = 0;
|
|
131
132
|
this._oplogRetryCount = 0;
|
|
133
|
+
this._lastResumeToken = null;
|
|
134
|
+
this._lastResumeTokenSaveMs = 0;
|
|
135
|
+
this._resumeTokenSavePromise = null;
|
|
136
|
+
this._resumeTokenSaveForcePending = false;
|
|
137
|
+
this._fullResyncPromise = null;
|
|
138
|
+
this.RESUME_TOKEN_COLLECTION = 'subscription-manager-resume-tokens';
|
|
139
|
+
this.RESUME_TOKEN_DOC_ID = 'oplog';
|
|
140
|
+
this.RESUME_TOKEN_SAVE_INTERVAL_MS = 5000;
|
|
132
141
|
// Buffer to store throttled latency updates with timestamps
|
|
133
142
|
this.latencyBuffer = new Map();
|
|
134
143
|
// Interval to flush latency updates in MongoDB
|
|
@@ -161,7 +170,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
161
170
|
};
|
|
162
171
|
SubscriptionManager.prototype.initialize = function (wss, serverConfig, monitorManagerFunction) {
|
|
163
172
|
return __awaiter(this, void 0, void 0, function () {
|
|
164
|
-
var flag, dependencyFlag;
|
|
173
|
+
var resumeToken, flag, dependencyFlag;
|
|
165
174
|
var _this = this;
|
|
166
175
|
return __generator(this, function (_a) {
|
|
167
176
|
switch (_a.label) {
|
|
@@ -201,8 +210,11 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
201
210
|
(0, user_groups_1.loadUserGroupPublications)(this);
|
|
202
211
|
(0, user_guides_1.loadUserGuidePublications)(this);
|
|
203
212
|
(0, report_builder_dashboard_builders_1.loadReportBuilderDashboardBuilderPublications)(this);
|
|
204
|
-
return [4 /*yield*/, this.
|
|
213
|
+
return [4 /*yield*/, this.loadResumeToken()];
|
|
205
214
|
case 1:
|
|
215
|
+
resumeToken = _a.sent();
|
|
216
|
+
return [4 /*yield*/, this.tailOpLog(resumeToken || undefined)];
|
|
217
|
+
case 2:
|
|
206
218
|
_a.sent();
|
|
207
219
|
setInterval(function () {
|
|
208
220
|
_this._oplogRetryCount = 0;
|
|
@@ -310,10 +322,10 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
310
322
|
});
|
|
311
323
|
}); }, 30000);
|
|
312
324
|
return [4 /*yield*/, flag_collection_1.Flags.findOne({ type: 'Enable Debug' })];
|
|
313
|
-
case
|
|
325
|
+
case 3:
|
|
314
326
|
flag = _a.sent();
|
|
315
327
|
return [4 /*yield*/, flag_collection_1.Flags.findOne({ type: 'Enable Dependency Debug' })];
|
|
316
|
-
case
|
|
328
|
+
case 4:
|
|
317
329
|
dependencyFlag = _a.sent();
|
|
318
330
|
if (flag && flag.value) {
|
|
319
331
|
this._enableDebug = true;
|
|
@@ -523,6 +535,41 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
523
535
|
});
|
|
524
536
|
});
|
|
525
537
|
};
|
|
538
|
+
SubscriptionManager.prototype.getMessageDateMs = function (messageDate) {
|
|
539
|
+
if (messageDate instanceof Date && !isNaN(messageDate.getTime())) {
|
|
540
|
+
return messageDate.getTime();
|
|
541
|
+
}
|
|
542
|
+
if (typeof messageDate === 'string' || typeof messageDate === 'number') {
|
|
543
|
+
var parsed = new Date(messageDate);
|
|
544
|
+
if (!isNaN(parsed.getTime())) {
|
|
545
|
+
return parsed.getTime();
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return Date.now();
|
|
549
|
+
};
|
|
550
|
+
SubscriptionManager.prototype.isStaleRouteMessage = function (ws, messageRoute, messageDate) {
|
|
551
|
+
var socketId = ws ? ws['id_socket'] : '';
|
|
552
|
+
if (!socketId) {
|
|
553
|
+
return false;
|
|
554
|
+
}
|
|
555
|
+
if (!messageRoute || messageRoute === 'Bypass') {
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
var messageDateMs = this.getMessageDateMs(messageDate);
|
|
559
|
+
var lastRoute = this._lastRouteBySocket.get(socketId);
|
|
560
|
+
if (lastRoute && messageDateMs < lastRoute.dateMs) {
|
|
561
|
+
this.dependencyDebug('Skip route cleanup due to stale route message', {
|
|
562
|
+
socketId: socketId,
|
|
563
|
+
messageRoute: messageRoute,
|
|
564
|
+
messageDateMs: messageDateMs,
|
|
565
|
+
lastRoute: lastRoute.route,
|
|
566
|
+
lastRouteDateMs: lastRoute.dateMs
|
|
567
|
+
});
|
|
568
|
+
return true;
|
|
569
|
+
}
|
|
570
|
+
this._lastRouteBySocket.set(socketId, { route: messageRoute, dateMs: messageDateMs });
|
|
571
|
+
return false;
|
|
572
|
+
};
|
|
526
573
|
SubscriptionManager.prototype.sendDataToAllWithRetry = function (sub, collection, type) {
|
|
527
574
|
return __awaiter(this, void 0, void 0, function () {
|
|
528
575
|
return __generator(this, function (_a) {
|
|
@@ -652,7 +699,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
652
699
|
// Subscribe to publication
|
|
653
700
|
SubscriptionManager.prototype.subscribe = function (messageRoute, messageDate, ws, messageId, publication, subscriptionData) {
|
|
654
701
|
return __awaiter(this, void 0, void 0, function () {
|
|
655
|
-
var pub, valObj, valKeys, rootKeys, i, urlData, urlModule_1, urlNext, otherRouteSubs, normalizedSubscriptionData, subscriptionKey_1, sub;
|
|
702
|
+
var pub, valObj, valKeys, rootKeys, i, staleRouteMessage, urlData, urlModule_1, urlNext, otherRouteSubs, normalizedSubscriptionData, subscriptionKey_1, sub;
|
|
656
703
|
var _this = this;
|
|
657
704
|
return __generator(this, function (_a) {
|
|
658
705
|
switch (_a.label) {
|
|
@@ -699,7 +746,8 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
699
746
|
}
|
|
700
747
|
}
|
|
701
748
|
}
|
|
702
|
-
|
|
749
|
+
staleRouteMessage = this.isStaleRouteMessage(ws, messageRoute, messageDate);
|
|
750
|
+
if (messageRoute !== 'Bypass' && messageRoute !== '/' && !staleRouteMessage) {
|
|
703
751
|
urlData = messageRoute.split('/');
|
|
704
752
|
urlModule_1 = '';
|
|
705
753
|
urlNext = urlData[0];
|
|
@@ -833,6 +881,9 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
833
881
|
case 0:
|
|
834
882
|
this._debugUnSubAllHits += 1;
|
|
835
883
|
if (!ws) return [3 /*break*/, 2];
|
|
884
|
+
if (ws['id_socket']) {
|
|
885
|
+
this._lastRouteBySocket.delete(ws['id_socket']);
|
|
886
|
+
}
|
|
836
887
|
// Check if WebSocket has already been unsubscribed
|
|
837
888
|
if (ws['isUnsubscribed']) {
|
|
838
889
|
return [2 /*return*/]; // Skip if already unsubscribed
|
|
@@ -878,27 +929,274 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
878
929
|
var mainDb = config && typeof config['DATABASE'] === 'string' ? config['DATABASE'] : '';
|
|
879
930
|
return mainDb ? [mainDb] : [];
|
|
880
931
|
};
|
|
932
|
+
SubscriptionManager.prototype.loadResumeToken = function () {
|
|
933
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
934
|
+
var db, doc, error_2;
|
|
935
|
+
return __generator(this, function (_a) {
|
|
936
|
+
switch (_a.label) {
|
|
937
|
+
case 0:
|
|
938
|
+
_a.trys.push([0, 2, , 3]);
|
|
939
|
+
db = resolveio_server_app_1.ResolveIOServer.getMainDB();
|
|
940
|
+
if (!db) {
|
|
941
|
+
return [2 /*return*/, null];
|
|
942
|
+
}
|
|
943
|
+
return [4 /*yield*/, db.collection(this.RESUME_TOKEN_COLLECTION).findOne({ _id: this.RESUME_TOKEN_DOC_ID })];
|
|
944
|
+
case 1:
|
|
945
|
+
doc = _a.sent();
|
|
946
|
+
return [2 /*return*/, (doc === null || doc === void 0 ? void 0 : doc.token) || null];
|
|
947
|
+
case 2:
|
|
948
|
+
error_2 = _a.sent();
|
|
949
|
+
console.log(new Date(), 'Sub Manager', 'Failed to load oplog resume token', error_2);
|
|
950
|
+
return [2 /*return*/, null];
|
|
951
|
+
case 3: return [2 /*return*/];
|
|
952
|
+
}
|
|
953
|
+
});
|
|
954
|
+
});
|
|
955
|
+
};
|
|
956
|
+
SubscriptionManager.prototype.saveResumeToken = function (token) {
|
|
957
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
958
|
+
var db, error_3;
|
|
959
|
+
return __generator(this, function (_a) {
|
|
960
|
+
switch (_a.label) {
|
|
961
|
+
case 0:
|
|
962
|
+
if (!token) {
|
|
963
|
+
return [2 /*return*/];
|
|
964
|
+
}
|
|
965
|
+
_a.label = 1;
|
|
966
|
+
case 1:
|
|
967
|
+
_a.trys.push([1, 3, , 4]);
|
|
968
|
+
db = resolveio_server_app_1.ResolveIOServer.getMainDB();
|
|
969
|
+
if (!db) {
|
|
970
|
+
return [2 /*return*/];
|
|
971
|
+
}
|
|
972
|
+
return [4 /*yield*/, db.collection(this.RESUME_TOKEN_COLLECTION).updateOne({ _id: this.RESUME_TOKEN_DOC_ID }, { $set: { token: token, updatedAt: new Date() } }, { upsert: true })];
|
|
973
|
+
case 2:
|
|
974
|
+
_a.sent();
|
|
975
|
+
return [3 /*break*/, 4];
|
|
976
|
+
case 3:
|
|
977
|
+
error_3 = _a.sent();
|
|
978
|
+
console.log(new Date(), 'Sub Manager', 'Failed to persist oplog resume token', error_3);
|
|
979
|
+
return [3 /*break*/, 4];
|
|
980
|
+
case 4: return [2 /*return*/];
|
|
981
|
+
}
|
|
982
|
+
});
|
|
983
|
+
});
|
|
984
|
+
};
|
|
985
|
+
SubscriptionManager.prototype.clearResumeToken = function () {
|
|
986
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
987
|
+
var db, error_4;
|
|
988
|
+
return __generator(this, function (_a) {
|
|
989
|
+
switch (_a.label) {
|
|
990
|
+
case 0:
|
|
991
|
+
_a.trys.push([0, 2, , 3]);
|
|
992
|
+
db = resolveio_server_app_1.ResolveIOServer.getMainDB();
|
|
993
|
+
if (!db) {
|
|
994
|
+
return [2 /*return*/];
|
|
995
|
+
}
|
|
996
|
+
return [4 /*yield*/, db.collection(this.RESUME_TOKEN_COLLECTION).deleteOne({ _id: this.RESUME_TOKEN_DOC_ID })];
|
|
997
|
+
case 1:
|
|
998
|
+
_a.sent();
|
|
999
|
+
return [3 /*break*/, 3];
|
|
1000
|
+
case 2:
|
|
1001
|
+
error_4 = _a.sent();
|
|
1002
|
+
console.log(new Date(), 'Sub Manager', 'Failed to clear oplog resume token', error_4);
|
|
1003
|
+
return [3 /*break*/, 3];
|
|
1004
|
+
case 3: return [2 /*return*/];
|
|
1005
|
+
}
|
|
1006
|
+
});
|
|
1007
|
+
});
|
|
1008
|
+
};
|
|
1009
|
+
SubscriptionManager.prototype.queueResumeTokenSave = function (token, options) {
|
|
1010
|
+
var _this = this;
|
|
1011
|
+
if (!token) {
|
|
1012
|
+
return;
|
|
1013
|
+
}
|
|
1014
|
+
this._lastResumeToken = token;
|
|
1015
|
+
var now = Date.now();
|
|
1016
|
+
var shouldSave = !!(options === null || options === void 0 ? void 0 : options.force) || (now - this._lastResumeTokenSaveMs) >= this.RESUME_TOKEN_SAVE_INTERVAL_MS;
|
|
1017
|
+
if (!shouldSave) {
|
|
1018
|
+
return;
|
|
1019
|
+
}
|
|
1020
|
+
if (this._resumeTokenSavePromise !== null) {
|
|
1021
|
+
if (options === null || options === void 0 ? void 0 : options.force) {
|
|
1022
|
+
this._resumeTokenSaveForcePending = true;
|
|
1023
|
+
}
|
|
1024
|
+
return;
|
|
1025
|
+
}
|
|
1026
|
+
this._lastResumeTokenSaveMs = now;
|
|
1027
|
+
var tokenToSave = this._lastResumeToken;
|
|
1028
|
+
this._resumeTokenSavePromise = (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
1029
|
+
return __generator(this, function (_a) {
|
|
1030
|
+
switch (_a.label) {
|
|
1031
|
+
case 0:
|
|
1032
|
+
_a.trys.push([0, , 2, 3]);
|
|
1033
|
+
return [4 /*yield*/, this.saveResumeToken(tokenToSave)];
|
|
1034
|
+
case 1:
|
|
1035
|
+
_a.sent();
|
|
1036
|
+
return [3 /*break*/, 3];
|
|
1037
|
+
case 2:
|
|
1038
|
+
this._resumeTokenSavePromise = null;
|
|
1039
|
+
if (this._resumeTokenSaveForcePending) {
|
|
1040
|
+
this._resumeTokenSaveForcePending = false;
|
|
1041
|
+
this.queueResumeTokenSave(this._lastResumeToken, { force: true });
|
|
1042
|
+
}
|
|
1043
|
+
return [7 /*endfinally*/];
|
|
1044
|
+
case 3: return [2 /*return*/];
|
|
1045
|
+
}
|
|
1046
|
+
});
|
|
1047
|
+
}); })();
|
|
1048
|
+
};
|
|
1049
|
+
SubscriptionManager.prototype.queueFullResync = function (reason) {
|
|
1050
|
+
var _this = this;
|
|
1051
|
+
if (this._fullResyncPromise !== null) {
|
|
1052
|
+
return;
|
|
1053
|
+
}
|
|
1054
|
+
this._fullResyncPromise = (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
1055
|
+
return __generator(this, function (_a) {
|
|
1056
|
+
switch (_a.label) {
|
|
1057
|
+
case 0:
|
|
1058
|
+
_a.trys.push([0, , 2, 3]);
|
|
1059
|
+
return [4 /*yield*/, this.fullResyncSubscriptions(reason)];
|
|
1060
|
+
case 1:
|
|
1061
|
+
_a.sent();
|
|
1062
|
+
return [3 /*break*/, 3];
|
|
1063
|
+
case 2:
|
|
1064
|
+
this._fullResyncPromise = null;
|
|
1065
|
+
return [7 /*endfinally*/];
|
|
1066
|
+
case 3: return [2 /*return*/];
|
|
1067
|
+
}
|
|
1068
|
+
});
|
|
1069
|
+
}); })();
|
|
1070
|
+
};
|
|
1071
|
+
SubscriptionManager.prototype.fullResyncSubscriptions = function (reason) {
|
|
1072
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1073
|
+
var subs, subs_1, subs_1_1, sub, pub, _a, _b, client, ws, _c, e_3_1, e_4_1, error_5;
|
|
1074
|
+
var e_4, _d, e_3, _e;
|
|
1075
|
+
var _f, _g, _h, _j, _k;
|
|
1076
|
+
return __generator(this, function (_l) {
|
|
1077
|
+
switch (_l.label) {
|
|
1078
|
+
case 0:
|
|
1079
|
+
_l.trys.push([0, 20, , 21]);
|
|
1080
|
+
if (this._enableDebug) {
|
|
1081
|
+
console.log(new Date(), 'Sub Manager', 'Full subscription resync', reason, this._subscriptions.length);
|
|
1082
|
+
}
|
|
1083
|
+
try {
|
|
1084
|
+
(_g = (_f = resolveio_server_app_1.ResolveIOServer.getMongoManager()) === null || _f === void 0 ? void 0 : _f.clearQueryCache) === null || _g === void 0 ? void 0 : _g.call(_f, reason);
|
|
1085
|
+
}
|
|
1086
|
+
catch (_m) {
|
|
1087
|
+
// ignore cache-clear errors
|
|
1088
|
+
}
|
|
1089
|
+
try {
|
|
1090
|
+
(_j = (_h = this._nodeCache) === null || _h === void 0 ? void 0 : _h.flushAll) === null || _j === void 0 ? void 0 : _j.call(_h);
|
|
1091
|
+
}
|
|
1092
|
+
catch (_o) {
|
|
1093
|
+
// ignore cache-clear errors
|
|
1094
|
+
}
|
|
1095
|
+
subs = this._subscriptions.slice();
|
|
1096
|
+
_l.label = 1;
|
|
1097
|
+
case 1:
|
|
1098
|
+
_l.trys.push([1, 17, 18, 19]);
|
|
1099
|
+
subs_1 = __values(subs), subs_1_1 = subs_1.next();
|
|
1100
|
+
_l.label = 2;
|
|
1101
|
+
case 2:
|
|
1102
|
+
if (!!subs_1_1.done) return [3 /*break*/, 16];
|
|
1103
|
+
sub = subs_1_1.value;
|
|
1104
|
+
if (!((_k = sub === null || sub === void 0 ? void 0 : sub.clients) === null || _k === void 0 ? void 0 : _k.length)) {
|
|
1105
|
+
return [3 /*break*/, 15];
|
|
1106
|
+
}
|
|
1107
|
+
pub = this._publications[sub.publication];
|
|
1108
|
+
if (!pub) {
|
|
1109
|
+
return [3 /*break*/, 15];
|
|
1110
|
+
}
|
|
1111
|
+
if (sub.running) {
|
|
1112
|
+
sub.runAgain = true;
|
|
1113
|
+
return [3 /*break*/, 15];
|
|
1114
|
+
}
|
|
1115
|
+
if (!pub.user_specific) return [3 /*break*/, 13];
|
|
1116
|
+
_l.label = 3;
|
|
1117
|
+
case 3:
|
|
1118
|
+
_l.trys.push([3, 10, 11, 12]);
|
|
1119
|
+
_a = (e_3 = void 0, __values(sub.clients)), _b = _a.next();
|
|
1120
|
+
_l.label = 4;
|
|
1121
|
+
case 4:
|
|
1122
|
+
if (!!_b.done) return [3 /*break*/, 9];
|
|
1123
|
+
client = _b.value;
|
|
1124
|
+
ws = this._websocketManager.getWebSocket(client.id_socket);
|
|
1125
|
+
if (!((ws === null || ws === void 0 ? void 0 : ws.readyState) === ws.OPEN)) return [3 /*break*/, 8];
|
|
1126
|
+
_l.label = 5;
|
|
1127
|
+
case 5:
|
|
1128
|
+
_l.trys.push([5, 7, , 8]);
|
|
1129
|
+
return [4 /*yield*/, this.sendDataToOneWithRetry(ws, client.messageId, sub, '', reason)];
|
|
1130
|
+
case 6:
|
|
1131
|
+
_l.sent();
|
|
1132
|
+
return [3 /*break*/, 8];
|
|
1133
|
+
case 7:
|
|
1134
|
+
_c = _l.sent();
|
|
1135
|
+
return [3 /*break*/, 8];
|
|
1136
|
+
case 8:
|
|
1137
|
+
_b = _a.next();
|
|
1138
|
+
return [3 /*break*/, 4];
|
|
1139
|
+
case 9: return [3 /*break*/, 12];
|
|
1140
|
+
case 10:
|
|
1141
|
+
e_3_1 = _l.sent();
|
|
1142
|
+
e_3 = { error: e_3_1 };
|
|
1143
|
+
return [3 /*break*/, 12];
|
|
1144
|
+
case 11:
|
|
1145
|
+
try {
|
|
1146
|
+
if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
|
|
1147
|
+
}
|
|
1148
|
+
finally { if (e_3) throw e_3.error; }
|
|
1149
|
+
return [7 /*endfinally*/];
|
|
1150
|
+
case 12: return [3 /*break*/, 15];
|
|
1151
|
+
case 13: return [4 /*yield*/, this.sendDataToAllWithRetry(sub, '', reason)];
|
|
1152
|
+
case 14:
|
|
1153
|
+
_l.sent();
|
|
1154
|
+
_l.label = 15;
|
|
1155
|
+
case 15:
|
|
1156
|
+
subs_1_1 = subs_1.next();
|
|
1157
|
+
return [3 /*break*/, 2];
|
|
1158
|
+
case 16: return [3 /*break*/, 19];
|
|
1159
|
+
case 17:
|
|
1160
|
+
e_4_1 = _l.sent();
|
|
1161
|
+
e_4 = { error: e_4_1 };
|
|
1162
|
+
return [3 /*break*/, 19];
|
|
1163
|
+
case 18:
|
|
1164
|
+
try {
|
|
1165
|
+
if (subs_1_1 && !subs_1_1.done && (_d = subs_1.return)) _d.call(subs_1);
|
|
1166
|
+
}
|
|
1167
|
+
finally { if (e_4) throw e_4.error; }
|
|
1168
|
+
return [7 /*endfinally*/];
|
|
1169
|
+
case 19: return [3 /*break*/, 21];
|
|
1170
|
+
case 20:
|
|
1171
|
+
error_5 = _l.sent();
|
|
1172
|
+
console.log(new Date(), 'Sub Manager', 'Full resync failed', reason, error_5);
|
|
1173
|
+
return [3 /*break*/, 21];
|
|
1174
|
+
case 21: return [2 /*return*/];
|
|
1175
|
+
}
|
|
1176
|
+
});
|
|
1177
|
+
});
|
|
1178
|
+
};
|
|
881
1179
|
// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)
|
|
882
1180
|
SubscriptionManager.prototype.tailOpLog = function (resumeToken) {
|
|
883
1181
|
return __awaiter(this, void 0, void 0, function () {
|
|
884
|
-
var watchDatabases, pipeline, lastResumeToken_1,
|
|
1182
|
+
var watchDatabases, pipeline, lastResumeToken_1, startedWithResumeToken, error_6;
|
|
885
1183
|
var _this = this;
|
|
886
|
-
return __generator(this, function (
|
|
887
|
-
switch (
|
|
1184
|
+
return __generator(this, function (_a) {
|
|
1185
|
+
switch (_a.label) {
|
|
888
1186
|
case 0:
|
|
889
1187
|
if (!(this._oplog$ && !this._oplog$.closed)) return [3 /*break*/, 2];
|
|
890
1188
|
this._oplog$.removeAllListeners();
|
|
891
1189
|
return [4 /*yield*/, this._oplog$.close()];
|
|
892
1190
|
case 1:
|
|
893
|
-
|
|
1191
|
+
_a.sent();
|
|
894
1192
|
this._oplog$ = null;
|
|
895
|
-
|
|
1193
|
+
_a.label = 2;
|
|
896
1194
|
case 2:
|
|
897
1195
|
// eslint-disable-next-line no-restricted-syntax
|
|
898
1196
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1000); })];
|
|
899
1197
|
case 3:
|
|
900
1198
|
// eslint-disable-next-line no-restricted-syntax
|
|
901
|
-
|
|
1199
|
+
_a.sent();
|
|
902
1200
|
if (!(!this._oplog$ || this._oplog$.closed)) return [3 /*break*/, 12];
|
|
903
1201
|
this._oplogRetryCount += 1;
|
|
904
1202
|
if (this._oplogRetryCount > 5) {
|
|
@@ -928,32 +1226,39 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
928
1226
|
},
|
|
929
1227
|
},
|
|
930
1228
|
];
|
|
1229
|
+
startedWithResumeToken = false;
|
|
931
1230
|
if (!resumeToken) return [3 /*break*/, 10];
|
|
932
1231
|
lastResumeToken_1 = resumeToken;
|
|
933
|
-
|
|
1232
|
+
_a.label = 4;
|
|
934
1233
|
case 4:
|
|
935
|
-
|
|
1234
|
+
_a.trys.push([4, 5, , 9]);
|
|
936
1235
|
this._oplog$ = resolveio_server_app_1.ResolveIOServer.getMongoConnection().watch(pipeline, { resumeAfter: resumeToken });
|
|
1236
|
+
startedWithResumeToken = true;
|
|
937
1237
|
return [3 /*break*/, 9];
|
|
938
1238
|
case 5:
|
|
939
|
-
|
|
1239
|
+
error_6 = _a.sent();
|
|
940
1240
|
if (!this._oplog$) return [3 /*break*/, 7];
|
|
941
1241
|
this._oplog$.removeAllListeners();
|
|
942
1242
|
return [4 /*yield*/, this._oplog$.close()];
|
|
943
1243
|
case 6:
|
|
944
|
-
|
|
1244
|
+
_a.sent();
|
|
945
1245
|
this._oplog$ = null;
|
|
946
|
-
|
|
947
|
-
case 7: return [4 /*yield*/, this.
|
|
1246
|
+
_a.label = 7;
|
|
1247
|
+
case 7: return [4 /*yield*/, this.clearResumeToken()];
|
|
948
1248
|
case 8:
|
|
949
|
-
|
|
950
|
-
|
|
1249
|
+
_a.sent();
|
|
1250
|
+
lastResumeToken_1 = null;
|
|
1251
|
+
console.log(new Date(), 'oplog resumeAfter failed, starting fresh', error_6);
|
|
1252
|
+
this._oplog$ = resolveio_server_app_1.ResolveIOServer.getMongoConnection().watch(pipeline);
|
|
1253
|
+
startedWithResumeToken = false;
|
|
1254
|
+
this.queueFullResync('oplog-resumeAfter-failed');
|
|
1255
|
+
return [3 /*break*/, 9];
|
|
951
1256
|
case 9: return [3 /*break*/, 11];
|
|
952
1257
|
case 10:
|
|
953
1258
|
this._oplog$ = resolveio_server_app_1.ResolveIOServer.getMongoConnection().watch(pipeline);
|
|
954
|
-
|
|
1259
|
+
_a.label = 11;
|
|
955
1260
|
case 11:
|
|
956
|
-
console.log(new Date(), 'oplog started');
|
|
1261
|
+
console.log(new Date(), 'oplog started', startedWithResumeToken ? '(resumeAfter)' : '');
|
|
957
1262
|
this._oplog$.on('change', function (doc) { return __awaiter(_this, void 0, void 0, function () {
|
|
958
1263
|
var collection, docId, flag, dependencyFlag;
|
|
959
1264
|
return __generator(this, function (_a) {
|
|
@@ -1030,6 +1335,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1030
1335
|
_a.label = 13;
|
|
1031
1336
|
case 13:
|
|
1032
1337
|
lastResumeToken_1 = doc._id;
|
|
1338
|
+
this.queueResumeTokenSave(lastResumeToken_1);
|
|
1033
1339
|
if ((!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'))) {
|
|
1034
1340
|
}
|
|
1035
1341
|
_a.label = 14;
|
|
@@ -1066,6 +1372,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1066
1372
|
switch (_a.label) {
|
|
1067
1373
|
case 0:
|
|
1068
1374
|
console.log(new Date(), 'oplog close');
|
|
1375
|
+
this.queueResumeTokenSave(lastResumeToken_1, { force: true });
|
|
1069
1376
|
this._oplog$.removeAllListeners();
|
|
1070
1377
|
this._oplog$ = null;
|
|
1071
1378
|
return [4 /*yield*/, this.tailOpLog(lastResumeToken_1)];
|
|
@@ -1075,7 +1382,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1075
1382
|
}
|
|
1076
1383
|
});
|
|
1077
1384
|
}); });
|
|
1078
|
-
|
|
1385
|
+
_a.label = 12;
|
|
1079
1386
|
case 12: return [2 /*return*/];
|
|
1080
1387
|
}
|
|
1081
1388
|
});
|
|
@@ -1227,7 +1534,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1227
1534
|
SubscriptionManager.prototype.sendDataToAll = function (sub, collection, type) {
|
|
1228
1535
|
return __awaiter(this, void 0, void 0, function () {
|
|
1229
1536
|
var subIndex, monitor, res_1, dependencySnapshot, execution, cacheData, _a, _b, client, ws, serverRes, _c, _d, client, ws, serverRes, nodeCacheSize, deleteCount, subArr, zz, err_2, _e, normalizedError, correlationId, _f, _g, client, ws, serverRes, errorPayload;
|
|
1230
|
-
var
|
|
1537
|
+
var e_5, _h, e_6, _j, e_7, _k;
|
|
1231
1538
|
var _this = this;
|
|
1232
1539
|
var _l;
|
|
1233
1540
|
return __generator(this, function (_m) {
|
|
@@ -1282,12 +1589,12 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1282
1589
|
}
|
|
1283
1590
|
}
|
|
1284
1591
|
}
|
|
1285
|
-
catch (
|
|
1592
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
1286
1593
|
finally {
|
|
1287
1594
|
try {
|
|
1288
1595
|
if (_b && !_b.done && (_h = _a.return)) _h.call(_a);
|
|
1289
1596
|
}
|
|
1290
|
-
finally { if (
|
|
1597
|
+
finally { if (e_5) throw e_5.error; }
|
|
1291
1598
|
}
|
|
1292
1599
|
this._nodeCache.del(sub.cacheId);
|
|
1293
1600
|
if ((0, common_1.getBinarySize)(JSON.stringify(res_1)) < 1000000 &&
|
|
@@ -1340,12 +1647,12 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1340
1647
|
}
|
|
1341
1648
|
}
|
|
1342
1649
|
}
|
|
1343
|
-
catch (
|
|
1650
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
1344
1651
|
finally {
|
|
1345
1652
|
try {
|
|
1346
1653
|
if (_d && !_d.done && (_j = _c.return)) _j.call(_c);
|
|
1347
1654
|
}
|
|
1348
|
-
finally { if (
|
|
1655
|
+
finally { if (e_6) throw e_6.error; }
|
|
1349
1656
|
}
|
|
1350
1657
|
if ((0, common_1.getBinarySize)(JSON.stringify(res_1)) < 1000000 &&
|
|
1351
1658
|
!sub.collections.includes('logs') &&
|
|
@@ -1399,12 +1706,12 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1399
1706
|
}
|
|
1400
1707
|
}
|
|
1401
1708
|
}
|
|
1402
|
-
catch (
|
|
1709
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
1403
1710
|
finally {
|
|
1404
1711
|
try {
|
|
1405
1712
|
if (_g && !_g.done && (_k = _f.return)) _k.call(_f);
|
|
1406
1713
|
}
|
|
1407
|
-
finally { if (
|
|
1714
|
+
finally { if (e_7) throw e_7.error; }
|
|
1408
1715
|
}
|
|
1409
1716
|
errorPayload = {
|
|
1410
1717
|
publication: sub.publication,
|
|
@@ -1527,8 +1834,8 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1527
1834
|
};
|
|
1528
1835
|
SubscriptionManager.prototype.documentMatchesFilter = function (collection, documentId, filter) {
|
|
1529
1836
|
return __awaiter(this, void 0, void 0, function () {
|
|
1530
|
-
var db, filterCopy, idCandidates, idCandidates_1, idCandidates_1_1, idValue, combinedFilter, doc,
|
|
1531
|
-
var
|
|
1837
|
+
var db, filterCopy, idCandidates, idCandidates_1, idCandidates_1_1, idValue, combinedFilter, doc, e_8_1, _a;
|
|
1838
|
+
var e_8, _b;
|
|
1532
1839
|
return __generator(this, function (_c) {
|
|
1533
1840
|
switch (_c.label) {
|
|
1534
1841
|
case 0:
|
|
@@ -1562,14 +1869,14 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1562
1869
|
return [3 /*break*/, 2];
|
|
1563
1870
|
case 5: return [3 /*break*/, 8];
|
|
1564
1871
|
case 6:
|
|
1565
|
-
|
|
1566
|
-
|
|
1872
|
+
e_8_1 = _c.sent();
|
|
1873
|
+
e_8 = { error: e_8_1 };
|
|
1567
1874
|
return [3 /*break*/, 8];
|
|
1568
1875
|
case 7:
|
|
1569
1876
|
try {
|
|
1570
1877
|
if (idCandidates_1_1 && !idCandidates_1_1.done && (_b = idCandidates_1.return)) _b.call(idCandidates_1);
|
|
1571
1878
|
}
|
|
1572
|
-
finally { if (
|
|
1879
|
+
finally { if (e_8) throw e_8.error; }
|
|
1573
1880
|
return [7 /*endfinally*/];
|
|
1574
1881
|
case 8: return [2 /*return*/, false];
|
|
1575
1882
|
case 9:
|
|
@@ -1582,8 +1889,8 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1582
1889
|
};
|
|
1583
1890
|
SubscriptionManager.prototype.shouldInvalidateSubscription = function (sub, collection, type, documentId) {
|
|
1584
1891
|
return __awaiter(this, void 0, void 0, function () {
|
|
1585
|
-
var normalizedDocumentId, hasDependencyData, trackedIds, filters, filters_1, filters_1_1, filter,
|
|
1586
|
-
var
|
|
1892
|
+
var normalizedDocumentId, hasDependencyData, trackedIds, filters, filters_1, filters_1_1, filter, e_9_1;
|
|
1893
|
+
var e_9, _a;
|
|
1587
1894
|
var _b, _c;
|
|
1588
1895
|
return __generator(this, function (_d) {
|
|
1589
1896
|
switch (_d.label) {
|
|
@@ -1640,14 +1947,14 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1640
1947
|
return [3 /*break*/, 2];
|
|
1641
1948
|
case 5: return [3 /*break*/, 8];
|
|
1642
1949
|
case 6:
|
|
1643
|
-
|
|
1644
|
-
|
|
1950
|
+
e_9_1 = _d.sent();
|
|
1951
|
+
e_9 = { error: e_9_1 };
|
|
1645
1952
|
return [3 /*break*/, 8];
|
|
1646
1953
|
case 7:
|
|
1647
1954
|
try {
|
|
1648
1955
|
if (filters_1_1 && !filters_1_1.done && (_a = filters_1.return)) _a.call(filters_1);
|
|
1649
1956
|
}
|
|
1650
|
-
finally { if (
|
|
1957
|
+
finally { if (e_9) throw e_9.error; }
|
|
1651
1958
|
return [7 /*endfinally*/];
|
|
1652
1959
|
case 8:
|
|
1653
1960
|
this.dependencyDebug('Skip invalidation after dependency checks', { publication: sub.publication, collection: collection, type: type, documentId: normalizedDocumentId });
|
|
@@ -1658,8 +1965,8 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1658
1965
|
};
|
|
1659
1966
|
SubscriptionManager.prototype.shouldInvalidateSubscriptionForEvents = function (sub, collection, events) {
|
|
1660
1967
|
return __awaiter(this, void 0, void 0, function () {
|
|
1661
|
-
var sawInsert, sawDelete, events_1, events_1_1, event_1,
|
|
1662
|
-
var
|
|
1968
|
+
var sawInsert, sawDelete, events_1, events_1_1, event_1, e_10_1, paginationMeta, paginationReasons;
|
|
1969
|
+
var e_10, _a;
|
|
1663
1970
|
return __generator(this, function (_b) {
|
|
1664
1971
|
switch (_b.label) {
|
|
1665
1972
|
case 0:
|
|
@@ -1690,14 +1997,14 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1690
1997
|
return [3 /*break*/, 2];
|
|
1691
1998
|
case 5: return [3 /*break*/, 8];
|
|
1692
1999
|
case 6:
|
|
1693
|
-
|
|
1694
|
-
|
|
2000
|
+
e_10_1 = _b.sent();
|
|
2001
|
+
e_10 = { error: e_10_1 };
|
|
1695
2002
|
return [3 /*break*/, 8];
|
|
1696
2003
|
case 7:
|
|
1697
2004
|
try {
|
|
1698
2005
|
if (events_1_1 && !events_1_1.done && (_a = events_1.return)) _a.call(events_1);
|
|
1699
2006
|
}
|
|
1700
|
-
finally { if (
|
|
2007
|
+
finally { if (e_10) throw e_10.error; }
|
|
1701
2008
|
return [7 /*endfinally*/];
|
|
1702
2009
|
case 8:
|
|
1703
2010
|
paginationMeta = this.getPaginationMeta(sub, collection);
|