@resolveio/server-lib 22.2.19 → 22.2.21

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.
@@ -122,6 +122,7 @@ export declare class SubscriptionManager {
122
122
  private parsePositiveFloat;
123
123
  private isChangeStreamUnsupported;
124
124
  private isResumeTokenInvalid;
125
+ private isChangeStreamDocumentTooLarge;
125
126
  private enableLocalOplogFallback;
126
127
  getUseLocalOplog(): boolean;
127
128
  handleMongoReconnect(reason: string): Promise<void>;
@@ -674,6 +674,9 @@ var SubscriptionManager = /** @class */ (function () {
674
674
  if (!dispatcher || !dispatcher.hasWorkers()) {
675
675
  return false;
676
676
  }
677
+ if (typeof dispatcher.hasWorkersForMethod === 'function' && !dispatcher.hasWorkersForMethod('runPublication')) {
678
+ return false;
679
+ }
677
680
  if (this._publicationWorkerQueueLimit > 0) {
678
681
  var snapshot = dispatcher.getQueueSnapshot();
679
682
  if (snapshot.queueDepth >= this._publicationWorkerQueueLimit) {
@@ -1533,6 +1536,21 @@ var SubscriptionManager = /** @class */ (function () {
1533
1536
  }
1534
1537
  return false;
1535
1538
  };
1539
+ SubscriptionManager.prototype.isChangeStreamDocumentTooLarge = function (error) {
1540
+ var code = typeof (error === null || error === void 0 ? void 0 : error.code) === 'number' ? error.code : null;
1541
+ var codeName = typeof (error === null || error === void 0 ? void 0 : error.codeName) === 'string' ? error.codeName.toLowerCase() : '';
1542
+ var message = typeof (error === null || error === void 0 ? void 0 : error.message) === 'string' ? error.message.toLowerCase() : '';
1543
+ if (code === 10334) {
1544
+ return true;
1545
+ }
1546
+ if (codeName.includes('bsonobjecttoolarge')) {
1547
+ return true;
1548
+ }
1549
+ if (message.includes('bsonobj size') && message.includes('16mb')) {
1550
+ return true;
1551
+ }
1552
+ return false;
1553
+ };
1536
1554
  SubscriptionManager.prototype.enableLocalOplogFallback = function (reason, error) {
1537
1555
  return __awaiter(this, void 0, void 0, function () {
1538
1556
  var _a, message;
@@ -1987,7 +2005,7 @@ var SubscriptionManager = /** @class */ (function () {
1987
2005
  case 3:
1988
2006
  // eslint-disable-next-line no-restricted-syntax
1989
2007
  _a.sent();
1990
- if (!(!this._oplog$ || this._oplog$.closed)) return [3 /*break*/, 22];
2008
+ if (!(!this._oplog$ || this._oplog$.closed)) return [3 /*break*/, 27];
1991
2009
  this._oplogRetryCount += 1;
1992
2010
  if (this._oplogRetryCount > 5) {
1993
2011
  console.error('****************** TAIL OPLOG ERROR, RETRYING A BUNCH OF TIMES, KILLING PROCESS **************************');
@@ -2018,14 +2036,14 @@ var SubscriptionManager = /** @class */ (function () {
2018
2036
  },
2019
2037
  ];
2020
2038
  startedWithResumeToken = false;
2021
- if (!resumeToken) return [3 /*break*/, 17];
2039
+ if (!resumeToken) return [3 /*break*/, 20];
2022
2040
  lastResumeToken_1 = resumeToken;
2023
2041
  _a.label = 4;
2024
2042
  case 4:
2025
- _a.trys.push([4, 5, , 16]);
2043
+ _a.trys.push([4, 5, , 19]);
2026
2044
  this._oplog$ = resolveio_server_app_1.ResolveIOServer.getMongoConnection().watch(pipeline, { resumeAfter: resumeToken, fullDocument: 'updateLookup' });
2027
2045
  startedWithResumeToken = true;
2028
- return [3 /*break*/, 16];
2046
+ return [3 /*break*/, 19];
2029
2047
  case 5:
2030
2048
  error_8 = _a.sent();
2031
2049
  if (!this.isChangeStreamUnsupported(error_8)) return [3 /*break*/, 7];
@@ -2034,49 +2052,66 @@ var SubscriptionManager = /** @class */ (function () {
2034
2052
  _a.sent();
2035
2053
  return [2 /*return*/];
2036
2054
  case 7:
2037
- if (!this._oplog$) return [3 /*break*/, 9];
2055
+ if (!this.isChangeStreamDocumentTooLarge(error_8)) return [3 /*break*/, 10];
2056
+ return [4 /*yield*/, this.clearResumeToken()];
2057
+ case 8:
2058
+ _a.sent();
2059
+ lastResumeToken_1 = null;
2060
+ this.queueFullResync('oplog-change-stream-document-too-large');
2061
+ return [4 /*yield*/, this.enableLocalOplogFallback('change-stream-document-too-large', error_8)];
2062
+ case 9:
2063
+ _a.sent();
2064
+ return [2 /*return*/];
2065
+ case 10:
2066
+ if (!this._oplog$) return [3 /*break*/, 12];
2038
2067
  this._oplog$.removeAllListeners();
2039
2068
  return [4 /*yield*/, this._oplog$.close()];
2040
- case 8:
2069
+ case 11:
2041
2070
  _a.sent();
2042
2071
  this._oplog$ = null;
2043
- _a.label = 9;
2044
- case 9: return [4 /*yield*/, this.clearResumeToken()];
2045
- case 10:
2072
+ _a.label = 12;
2073
+ case 12: return [4 /*yield*/, this.clearResumeToken()];
2074
+ case 13:
2046
2075
  _a.sent();
2047
2076
  lastResumeToken_1 = null;
2048
2077
  console.log(new Date(), 'oplog resumeAfter failed, starting fresh', error_8);
2049
- _a.label = 11;
2050
- case 11:
2051
- _a.trys.push([11, 12, , 15]);
2078
+ _a.label = 14;
2079
+ case 14:
2080
+ _a.trys.push([14, 15, , 18]);
2052
2081
  this._oplog$ = resolveio_server_app_1.ResolveIOServer.getMongoConnection().watch(pipeline, { fullDocument: 'updateLookup' });
2053
2082
  startedWithResumeToken = false;
2054
- return [3 /*break*/, 15];
2055
- case 12:
2083
+ return [3 /*break*/, 18];
2084
+ case 15:
2056
2085
  innerError_1 = _a.sent();
2057
- if (!this.isChangeStreamUnsupported(innerError_1)) return [3 /*break*/, 14];
2086
+ if (!this.isChangeStreamUnsupported(innerError_1)) return [3 /*break*/, 17];
2058
2087
  return [4 /*yield*/, this.enableLocalOplogFallback('change-stream-unsupported', innerError_1)];
2059
- case 13:
2088
+ case 16:
2060
2089
  _a.sent();
2061
2090
  return [2 /*return*/];
2062
- case 14: throw innerError_1;
2063
- case 15:
2091
+ case 17: throw innerError_1;
2092
+ case 18:
2064
2093
  this.queueFullResync('oplog-resumeAfter-failed');
2065
- return [3 /*break*/, 16];
2066
- case 16: return [3 /*break*/, 21];
2067
- case 17:
2068
- _a.trys.push([17, 18, , 21]);
2094
+ return [3 /*break*/, 19];
2095
+ case 19: return [3 /*break*/, 26];
2096
+ case 20:
2097
+ _a.trys.push([20, 21, , 26]);
2069
2098
  this._oplog$ = resolveio_server_app_1.ResolveIOServer.getMongoConnection().watch(pipeline, { fullDocument: 'updateLookup' });
2070
- return [3 /*break*/, 21];
2071
- case 18:
2099
+ return [3 /*break*/, 26];
2100
+ case 21:
2072
2101
  error_9 = _a.sent();
2073
- if (!this.isChangeStreamUnsupported(error_9)) return [3 /*break*/, 20];
2102
+ if (!this.isChangeStreamUnsupported(error_9)) return [3 /*break*/, 23];
2074
2103
  return [4 /*yield*/, this.enableLocalOplogFallback('change-stream-unsupported', error_9)];
2075
- case 19:
2104
+ case 22:
2076
2105
  _a.sent();
2077
2106
  return [2 /*return*/];
2078
- case 20: throw error_9;
2079
- case 21:
2107
+ case 23:
2108
+ if (!this.isChangeStreamDocumentTooLarge(error_9)) return [3 /*break*/, 25];
2109
+ return [4 /*yield*/, this.enableLocalOplogFallback('change-stream-document-too-large', error_9)];
2110
+ case 24:
2111
+ _a.sent();
2112
+ return [2 /*return*/];
2113
+ case 25: throw error_9;
2114
+ case 26:
2080
2115
  console.log(new Date(), 'oplog started', startedWithResumeToken ? '(resumeAfter)' : '');
2081
2116
  this._oplog$.on('change', function (doc) { return __awaiter(_this, void 0, void 0, function () {
2082
2117
  var collection, fullDocument, docId, flag, dependencyFlag;
@@ -2174,15 +2209,26 @@ var SubscriptionManager = /** @class */ (function () {
2174
2209
  _a.sent();
2175
2210
  return [2 /*return*/];
2176
2211
  case 2:
2177
- if (!this.isResumeTokenInvalid(error)) return [3 /*break*/, 4];
2212
+ if (!this.isChangeStreamDocumentTooLarge(error)) return [3 /*break*/, 5];
2178
2213
  return [4 /*yield*/, this.clearResumeToken()];
2179
2214
  case 3:
2180
2215
  _a.sent();
2181
2216
  lastResumeToken_1 = null;
2182
- this.queueFullResync('oplog-resume-token-invalid');
2183
- _a.label = 4;
2184
- case 4: return [4 /*yield*/, this._oplog$.close()];
2217
+ this.queueFullResync('oplog-change-stream-document-too-large');
2218
+ return [4 /*yield*/, this.enableLocalOplogFallback('change-stream-document-too-large', error)];
2219
+ case 4:
2220
+ _a.sent();
2221
+ return [2 /*return*/];
2185
2222
  case 5:
2223
+ if (!this.isResumeTokenInvalid(error)) return [3 /*break*/, 7];
2224
+ return [4 /*yield*/, this.clearResumeToken()];
2225
+ case 6:
2226
+ _a.sent();
2227
+ lastResumeToken_1 = null;
2228
+ this.queueFullResync('oplog-resume-token-invalid');
2229
+ _a.label = 7;
2230
+ case 7: return [4 /*yield*/, this._oplog$.close()];
2231
+ case 8:
2186
2232
  _a.sent();
2187
2233
  return [2 /*return*/];
2188
2234
  }
@@ -2215,8 +2261,8 @@ var SubscriptionManager = /** @class */ (function () {
2215
2261
  }
2216
2262
  });
2217
2263
  }); });
2218
- _a.label = 22;
2219
- case 22: return [2 /*return*/];
2264
+ _a.label = 27;
2265
+ case 27: return [2 /*return*/];
2220
2266
  }
2221
2267
  });
2222
2268
  });