@resolveio/server-lib 22.2.18 → 22.2.19
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/managers/error-auto-fix.manager.d.ts +1 -0
- package/managers/error-auto-fix.manager.js +70 -15
- package/managers/error-auto-fix.manager.js.map +1 -1
- package/managers/method.manager.js +2 -0
- package/managers/method.manager.js.map +1 -1
- package/managers/mongo.manager.d.ts +3 -0
- package/managers/mongo.manager.js +184 -65
- package/managers/mongo.manager.js.map +1 -1
- package/managers/slow-query-verifier.manager.d.ts +22 -0
- package/managers/slow-query-verifier.manager.js +435 -53
- package/managers/slow-query-verifier.manager.js.map +1 -1
- package/managers/subscription.manager.d.ts +1 -0
- package/managers/subscription.manager.js +57 -21
- package/managers/subscription.manager.js.map +1 -1
- package/methods/ai-terminal.d.ts +4 -0
- package/methods/ai-terminal.js +64 -26
- package/methods/ai-terminal.js.map +1 -1
- package/methods/diagnostics.d.ts +2 -0
- package/methods/diagnostics.js +514 -0
- package/methods/diagnostics.js.map +1 -0
- package/methods.ts +15 -0
- package/package.json +1 -1
- package/resolveio-server-app.d.ts +17 -1
- package/resolveio-server-app.js +293 -25
- package/resolveio-server-app.js.map +1 -1
- package/util/error-reporter.js +26 -126
- package/util/error-reporter.js.map +1 -1
- package/util/slow-query-reporter.d.ts +0 -3
- package/util/slow-query-reporter.js +13 -120
- package/util/slow-query-reporter.js.map +1 -1
|
@@ -252,18 +252,18 @@ var MongoManager = /** @class */ (function () {
|
|
|
252
252
|
attempt = 0;
|
|
253
253
|
maxRetries = 4;
|
|
254
254
|
_loop_1 = function () {
|
|
255
|
-
var session, store, result_1, err_1, jitter,
|
|
256
|
-
return __generator(this, function (
|
|
257
|
-
switch (
|
|
255
|
+
var session, store, result_1, err_1, _b, jitter, _c, activeStore;
|
|
256
|
+
return __generator(this, function (_d) {
|
|
257
|
+
switch (_d.label) {
|
|
258
258
|
case 0:
|
|
259
259
|
session = resolveio_server_app_1.ResolveIOServer.getMongoConnection().startSession();
|
|
260
260
|
store = asyncLocalStorage.getStore();
|
|
261
261
|
if (store) {
|
|
262
262
|
store.session = session;
|
|
263
263
|
}
|
|
264
|
-
|
|
264
|
+
_d.label = 1;
|
|
265
265
|
case 1:
|
|
266
|
-
|
|
266
|
+
_d.trys.push([1, 3, 9, 13]);
|
|
267
267
|
return [4 /*yield*/, session.withTransaction(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
268
268
|
return __generator(this, function (_a) {
|
|
269
269
|
switch (_a.label) {
|
|
@@ -275,35 +275,47 @@ var MongoManager = /** @class */ (function () {
|
|
|
275
275
|
});
|
|
276
276
|
}); })];
|
|
277
277
|
case 2:
|
|
278
|
-
|
|
278
|
+
_d.sent();
|
|
279
279
|
return [2 /*return*/, { value: result_1 }];
|
|
280
280
|
case 3:
|
|
281
|
-
err_1 =
|
|
281
|
+
err_1 = _d.sent();
|
|
282
282
|
if (!this_1.shouldRetryTransactionError(err_1) || attempt >= maxRetries) {
|
|
283
283
|
throw err_1;
|
|
284
284
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
return [4 /*yield*/, this_1.delay((120 * attempt) + jitter)];
|
|
285
|
+
if (!this_1.shouldRetryConnectionError(err_1)) return [3 /*break*/, 7];
|
|
286
|
+
_d.label = 4;
|
|
288
287
|
case 4:
|
|
289
|
-
|
|
290
|
-
return [
|
|
288
|
+
_d.trys.push([4, 6, , 7]);
|
|
289
|
+
return [4 /*yield*/, resolveio_server_app_1.ResolveIOServer.requestMongoReconnect('mongo-transaction-retry', err_1)];
|
|
291
290
|
case 5:
|
|
292
|
-
|
|
293
|
-
return [
|
|
291
|
+
_d.sent();
|
|
292
|
+
return [3 /*break*/, 7];
|
|
294
293
|
case 6:
|
|
295
|
-
|
|
296
|
-
return [3 /*break*/,
|
|
294
|
+
_b = _d.sent();
|
|
295
|
+
return [3 /*break*/, 7];
|
|
297
296
|
case 7:
|
|
298
|
-
|
|
299
|
-
|
|
297
|
+
attempt += 1;
|
|
298
|
+
jitter = Math.floor(Math.random() * 60);
|
|
299
|
+
return [4 /*yield*/, this_1.delay((120 * attempt) + jitter)];
|
|
300
300
|
case 8:
|
|
301
|
+
_d.sent();
|
|
302
|
+
return [3 /*break*/, 13];
|
|
303
|
+
case 9:
|
|
304
|
+
_d.trys.push([9, 11, , 12]);
|
|
305
|
+
return [4 /*yield*/, session.endSession()];
|
|
306
|
+
case 10:
|
|
307
|
+
_d.sent();
|
|
308
|
+
return [3 /*break*/, 12];
|
|
309
|
+
case 11:
|
|
310
|
+
_c = _d.sent();
|
|
311
|
+
return [3 /*break*/, 12];
|
|
312
|
+
case 12:
|
|
301
313
|
activeStore = asyncLocalStorage.getStore();
|
|
302
314
|
if (activeStore) {
|
|
303
315
|
delete activeStore.session;
|
|
304
316
|
}
|
|
305
317
|
return [7 /*endfinally*/];
|
|
306
|
-
case
|
|
318
|
+
case 13: return [2 /*return*/];
|
|
307
319
|
}
|
|
308
320
|
});
|
|
309
321
|
};
|
|
@@ -428,7 +440,7 @@ var MongoManager = /** @class */ (function () {
|
|
|
428
440
|
if (!err) {
|
|
429
441
|
return false;
|
|
430
442
|
}
|
|
431
|
-
if (this.shouldRetryWriteConflict(err) || this.shouldRetryWaitQueueTimeout(err)) {
|
|
443
|
+
if (this.shouldRetryWriteConflict(err) || this.shouldRetryWaitQueueTimeout(err) || this.shouldRetryConnectionError(err)) {
|
|
432
444
|
return true;
|
|
433
445
|
}
|
|
434
446
|
return this.hasMongoErrorLabel(err, 'TransientTransactionError')
|
|
@@ -443,37 +455,72 @@ var MongoManager = /** @class */ (function () {
|
|
|
443
455
|
}
|
|
444
456
|
return typeof err.message === 'string' && err.message.includes('Timed out while checking out a connection from connection pool');
|
|
445
457
|
};
|
|
458
|
+
MongoManager.prototype.shouldRetryConnectionError = function (err) {
|
|
459
|
+
if (!err) {
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
var name = String(err.name || err.codeName || '');
|
|
463
|
+
if (name === 'MongoPoolClearedError'
|
|
464
|
+
|| name === 'MongoNetworkError'
|
|
465
|
+
|| name === 'MongoNetworkTimeoutError'
|
|
466
|
+
|| name === 'MongoServerSelectionError'
|
|
467
|
+
|| name === 'MongoTopologyClosedError'
|
|
468
|
+
|| name === 'MongoNotConnectedError'
|
|
469
|
+
|| name === 'MongoClientClosedError') {
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
var message = String(err.message || '');
|
|
473
|
+
return /connection pool .* was cleared/i.test(message)
|
|
474
|
+
|| /topology is closed/i.test(message)
|
|
475
|
+
|| /client was closed/i.test(message)
|
|
476
|
+
|| /not connected/i.test(message)
|
|
477
|
+
|| /server selection timed out/i.test(message)
|
|
478
|
+
|| /econnrefused|econnreset|etimedout|ehostunreach/i.test(message);
|
|
479
|
+
};
|
|
446
480
|
MongoManager.prototype.retryRead = function (operation, options) {
|
|
447
481
|
return __awaiter(this, void 0, void 0, function () {
|
|
448
|
-
var attempt, maxRetries, err_2;
|
|
449
|
-
return __generator(this, function (
|
|
450
|
-
switch (
|
|
482
|
+
var attempt, maxRetries, err_2, shouldRetry, _a;
|
|
483
|
+
return __generator(this, function (_b) {
|
|
484
|
+
switch (_b.label) {
|
|
451
485
|
case 0:
|
|
452
486
|
if (options && options.session && typeof options.session.inTransaction === 'function' && options.session.inTransaction()) {
|
|
453
487
|
return [2 /*return*/, operation()];
|
|
454
488
|
}
|
|
455
489
|
attempt = 0;
|
|
456
490
|
maxRetries = 2;
|
|
457
|
-
|
|
491
|
+
_b.label = 1;
|
|
458
492
|
case 1:
|
|
459
|
-
if (!true) return [3 /*break*/,
|
|
460
|
-
|
|
493
|
+
if (!true) return [3 /*break*/, 11];
|
|
494
|
+
_b.label = 2;
|
|
461
495
|
case 2:
|
|
462
|
-
|
|
496
|
+
_b.trys.push([2, 4, , 10]);
|
|
463
497
|
return [4 /*yield*/, operation()];
|
|
464
|
-
case 3: return [2 /*return*/,
|
|
498
|
+
case 3: return [2 /*return*/, _b.sent()];
|
|
465
499
|
case 4:
|
|
466
|
-
err_2 =
|
|
467
|
-
|
|
500
|
+
err_2 = _b.sent();
|
|
501
|
+
shouldRetry = this.shouldRetryWaitQueueTimeout(err_2) || this.shouldRetryConnectionError(err_2);
|
|
502
|
+
if (!shouldRetry || attempt >= maxRetries) {
|
|
468
503
|
throw err_2;
|
|
469
504
|
}
|
|
505
|
+
if (!this.shouldRetryConnectionError(err_2)) return [3 /*break*/, 8];
|
|
506
|
+
_b.label = 5;
|
|
507
|
+
case 5:
|
|
508
|
+
_b.trys.push([5, 7, , 8]);
|
|
509
|
+
return [4 /*yield*/, resolveio_server_app_1.ResolveIOServer.requestMongoReconnect('mongo-read-retry', err_2)];
|
|
510
|
+
case 6:
|
|
511
|
+
_b.sent();
|
|
512
|
+
return [3 /*break*/, 8];
|
|
513
|
+
case 7:
|
|
514
|
+
_a = _b.sent();
|
|
515
|
+
return [3 /*break*/, 8];
|
|
516
|
+
case 8:
|
|
470
517
|
attempt += 1;
|
|
471
518
|
return [4 /*yield*/, this.delay(100 * attempt)];
|
|
472
|
-
case
|
|
473
|
-
|
|
474
|
-
return [3 /*break*/,
|
|
475
|
-
case
|
|
476
|
-
case
|
|
519
|
+
case 9:
|
|
520
|
+
_b.sent();
|
|
521
|
+
return [3 /*break*/, 10];
|
|
522
|
+
case 10: return [3 /*break*/, 1];
|
|
523
|
+
case 11: return [2 /*return*/];
|
|
477
524
|
}
|
|
478
525
|
});
|
|
479
526
|
});
|
|
@@ -999,6 +1046,31 @@ var MongoManager = /** @class */ (function () {
|
|
|
999
1046
|
finally { if (e_5) throw e_5.error; }
|
|
1000
1047
|
}
|
|
1001
1048
|
};
|
|
1049
|
+
MongoManager.prototype.handleMongoReconnect = function (reason) {
|
|
1050
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1051
|
+
var error_1;
|
|
1052
|
+
return __generator(this, function (_a) {
|
|
1053
|
+
switch (_a.label) {
|
|
1054
|
+
case 0:
|
|
1055
|
+
this.clearQueryCache("mongo-reconnect:".concat(reason));
|
|
1056
|
+
if (!(this._isWorkersEnabled && this._isWorkerInstance)) return [3 /*break*/, 4];
|
|
1057
|
+
_a.label = 1;
|
|
1058
|
+
case 1:
|
|
1059
|
+
_a.trys.push([1, 3, , 4]);
|
|
1060
|
+
return [4 /*yield*/, this.setupChangeStream()];
|
|
1061
|
+
case 2:
|
|
1062
|
+
_a.sent();
|
|
1063
|
+
return [3 /*break*/, 4];
|
|
1064
|
+
case 3:
|
|
1065
|
+
error_1 = _a.sent();
|
|
1066
|
+
console.log(new Date(), 'Mongo handle reconnect: change stream restart failed', reason, error_1);
|
|
1067
|
+
this.scheduleChangeStreamRestart();
|
|
1068
|
+
return [3 /*break*/, 4];
|
|
1069
|
+
case 4: return [2 /*return*/];
|
|
1070
|
+
}
|
|
1071
|
+
});
|
|
1072
|
+
});
|
|
1073
|
+
};
|
|
1002
1074
|
MongoManager.prototype.setupChangeStream = function () {
|
|
1003
1075
|
return __awaiter(this, void 0, void 0, function () {
|
|
1004
1076
|
var client, watchDatabases, pipeline, changeStream;
|
|
@@ -1314,6 +1386,28 @@ var MongoManagerCollection = /** @class */ (function () {
|
|
|
1314
1386
|
}
|
|
1315
1387
|
return typeof err.message === 'string' && err.message.includes('Timed out while checking out a connection from connection pool');
|
|
1316
1388
|
};
|
|
1389
|
+
MongoManagerCollection.prototype.shouldRetryConnectionError = function (err) {
|
|
1390
|
+
if (!err) {
|
|
1391
|
+
return false;
|
|
1392
|
+
}
|
|
1393
|
+
var name = String(err.name || err.codeName || '');
|
|
1394
|
+
if (name === 'MongoPoolClearedError'
|
|
1395
|
+
|| name === 'MongoNetworkError'
|
|
1396
|
+
|| name === 'MongoNetworkTimeoutError'
|
|
1397
|
+
|| name === 'MongoServerSelectionError'
|
|
1398
|
+
|| name === 'MongoTopologyClosedError'
|
|
1399
|
+
|| name === 'MongoNotConnectedError'
|
|
1400
|
+
|| name === 'MongoClientClosedError') {
|
|
1401
|
+
return true;
|
|
1402
|
+
}
|
|
1403
|
+
var message = String(err.message || '');
|
|
1404
|
+
return /connection pool .* was cleared/i.test(message)
|
|
1405
|
+
|| /topology is closed/i.test(message)
|
|
1406
|
+
|| /client was closed/i.test(message)
|
|
1407
|
+
|| /not connected/i.test(message)
|
|
1408
|
+
|| /server selection timed out/i.test(message)
|
|
1409
|
+
|| /econnrefused|econnreset|etimedout|ehostunreach/i.test(message);
|
|
1410
|
+
};
|
|
1317
1411
|
MongoManagerCollection.prototype.delay = function (ms) {
|
|
1318
1412
|
return __awaiter(this, void 0, void 0, function () {
|
|
1319
1413
|
return __generator(this, function (_a) {
|
|
@@ -1324,9 +1418,9 @@ var MongoManagerCollection = /** @class */ (function () {
|
|
|
1324
1418
|
};
|
|
1325
1419
|
MongoManagerCollection.prototype.retryWrite = function (operation, options) {
|
|
1326
1420
|
return __awaiter(this, void 0, void 0, function () {
|
|
1327
|
-
var attempt, configuredMaxRetries, maxRetries, configuredBaseDelay, baseDelayMs, err_9, shouldRetry, backoff, jitter;
|
|
1328
|
-
return __generator(this, function (
|
|
1329
|
-
switch (
|
|
1421
|
+
var attempt, configuredMaxRetries, maxRetries, configuredBaseDelay, baseDelayMs, err_9, shouldRetry, _a, backoff, jitter;
|
|
1422
|
+
return __generator(this, function (_b) {
|
|
1423
|
+
switch (_b.label) {
|
|
1330
1424
|
case 0:
|
|
1331
1425
|
if (options && options.session && typeof options.session.inTransaction === 'function' && options.session.inTransaction()) {
|
|
1332
1426
|
return [2 /*return*/, operation()];
|
|
@@ -1340,64 +1434,89 @@ var MongoManagerCollection = /** @class */ (function () {
|
|
|
1340
1434
|
baseDelayMs = Number.isFinite(configuredBaseDelay) && configuredBaseDelay > 0
|
|
1341
1435
|
? Math.min(Math.floor(configuredBaseDelay), 5000)
|
|
1342
1436
|
: 120;
|
|
1343
|
-
|
|
1437
|
+
_b.label = 1;
|
|
1344
1438
|
case 1:
|
|
1345
|
-
if (!true) return [3 /*break*/,
|
|
1346
|
-
|
|
1439
|
+
if (!true) return [3 /*break*/, 11];
|
|
1440
|
+
_b.label = 2;
|
|
1347
1441
|
case 2:
|
|
1348
|
-
|
|
1442
|
+
_b.trys.push([2, 4, , 10]);
|
|
1349
1443
|
return [4 /*yield*/, operation()];
|
|
1350
|
-
case 3: return [2 /*return*/,
|
|
1444
|
+
case 3: return [2 /*return*/, _b.sent()];
|
|
1351
1445
|
case 4:
|
|
1352
|
-
err_9 =
|
|
1353
|
-
shouldRetry = this.shouldRetryWriteConflict(err_9) || this.shouldRetryWaitQueueTimeout(err_9);
|
|
1446
|
+
err_9 = _b.sent();
|
|
1447
|
+
shouldRetry = this.shouldRetryWriteConflict(err_9) || this.shouldRetryWaitQueueTimeout(err_9) || this.shouldRetryConnectionError(err_9);
|
|
1354
1448
|
if (!shouldRetry || attempt >= maxRetries) {
|
|
1355
1449
|
throw err_9;
|
|
1356
1450
|
}
|
|
1451
|
+
if (!this.shouldRetryConnectionError(err_9)) return [3 /*break*/, 8];
|
|
1452
|
+
_b.label = 5;
|
|
1453
|
+
case 5:
|
|
1454
|
+
_b.trys.push([5, 7, , 8]);
|
|
1455
|
+
return [4 /*yield*/, resolveio_server_app_1.ResolveIOServer.requestMongoReconnect("mongo-collection-write-retry:".concat(this.collectionName), err_9)];
|
|
1456
|
+
case 6:
|
|
1457
|
+
_b.sent();
|
|
1458
|
+
return [3 /*break*/, 8];
|
|
1459
|
+
case 7:
|
|
1460
|
+
_a = _b.sent();
|
|
1461
|
+
return [3 /*break*/, 8];
|
|
1462
|
+
case 8:
|
|
1357
1463
|
attempt += 1;
|
|
1358
1464
|
backoff = Math.min(5000, baseDelayMs * (Math.pow(2, (attempt - 1))));
|
|
1359
1465
|
jitter = Math.floor(Math.random() * 90);
|
|
1360
1466
|
return [4 /*yield*/, this.delay(backoff + jitter)];
|
|
1361
|
-
case
|
|
1362
|
-
|
|
1363
|
-
return [3 /*break*/,
|
|
1364
|
-
case
|
|
1365
|
-
case
|
|
1467
|
+
case 9:
|
|
1468
|
+
_b.sent();
|
|
1469
|
+
return [3 /*break*/, 10];
|
|
1470
|
+
case 10: return [3 /*break*/, 1];
|
|
1471
|
+
case 11: return [2 /*return*/];
|
|
1366
1472
|
}
|
|
1367
1473
|
});
|
|
1368
1474
|
});
|
|
1369
1475
|
};
|
|
1370
1476
|
MongoManagerCollection.prototype.retryRead = function (operation, options) {
|
|
1371
1477
|
return __awaiter(this, void 0, void 0, function () {
|
|
1372
|
-
var attempt, maxRetries, err_10;
|
|
1373
|
-
return __generator(this, function (
|
|
1374
|
-
switch (
|
|
1478
|
+
var attempt, maxRetries, err_10, shouldRetry, _a;
|
|
1479
|
+
return __generator(this, function (_b) {
|
|
1480
|
+
switch (_b.label) {
|
|
1375
1481
|
case 0:
|
|
1376
1482
|
if (options && options.session && typeof options.session.inTransaction === 'function' && options.session.inTransaction()) {
|
|
1377
1483
|
return [2 /*return*/, operation()];
|
|
1378
1484
|
}
|
|
1379
1485
|
attempt = 0;
|
|
1380
1486
|
maxRetries = 2;
|
|
1381
|
-
|
|
1487
|
+
_b.label = 1;
|
|
1382
1488
|
case 1:
|
|
1383
|
-
if (!true) return [3 /*break*/,
|
|
1384
|
-
|
|
1489
|
+
if (!true) return [3 /*break*/, 11];
|
|
1490
|
+
_b.label = 2;
|
|
1385
1491
|
case 2:
|
|
1386
|
-
|
|
1492
|
+
_b.trys.push([2, 4, , 10]);
|
|
1387
1493
|
return [4 /*yield*/, operation()];
|
|
1388
|
-
case 3: return [2 /*return*/,
|
|
1494
|
+
case 3: return [2 /*return*/, _b.sent()];
|
|
1389
1495
|
case 4:
|
|
1390
|
-
err_10 =
|
|
1391
|
-
|
|
1496
|
+
err_10 = _b.sent();
|
|
1497
|
+
shouldRetry = this.shouldRetryWaitQueueTimeout(err_10) || this.shouldRetryConnectionError(err_10);
|
|
1498
|
+
if (!shouldRetry || attempt >= maxRetries) {
|
|
1392
1499
|
throw err_10;
|
|
1393
1500
|
}
|
|
1501
|
+
if (!this.shouldRetryConnectionError(err_10)) return [3 /*break*/, 8];
|
|
1502
|
+
_b.label = 5;
|
|
1503
|
+
case 5:
|
|
1504
|
+
_b.trys.push([5, 7, , 8]);
|
|
1505
|
+
return [4 /*yield*/, resolveio_server_app_1.ResolveIOServer.requestMongoReconnect("mongo-collection-read-retry:".concat(this.collectionName), err_10)];
|
|
1506
|
+
case 6:
|
|
1507
|
+
_b.sent();
|
|
1508
|
+
return [3 /*break*/, 8];
|
|
1509
|
+
case 7:
|
|
1510
|
+
_a = _b.sent();
|
|
1511
|
+
return [3 /*break*/, 8];
|
|
1512
|
+
case 8:
|
|
1394
1513
|
attempt += 1;
|
|
1395
1514
|
return [4 /*yield*/, this.delay(100 * attempt)];
|
|
1396
|
-
case
|
|
1397
|
-
|
|
1398
|
-
return [3 /*break*/,
|
|
1399
|
-
case
|
|
1400
|
-
case
|
|
1515
|
+
case 9:
|
|
1516
|
+
_b.sent();
|
|
1517
|
+
return [3 /*break*/, 10];
|
|
1518
|
+
case 10: return [3 /*break*/, 1];
|
|
1519
|
+
case 11: return [2 /*return*/];
|
|
1401
1520
|
}
|
|
1402
1521
|
});
|
|
1403
1522
|
});
|