@resolveio/server-lib 20.9.11 → 20.10.0
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/mongo.manager.d.ts +5 -0
- package/managers/mongo.manager.js +429 -310
- package/managers/mongo.manager.js.map +1 -1
- package/managers/websocket.manager.d.ts +9 -2
- package/managers/websocket.manager.js +143 -34
- package/managers/websocket.manager.js.map +1 -1
- package/package.json +1 -1
- package/server-app.d.ts +5 -0
- package/server-app.js +120 -99
- package/server-app.js.map +1 -1
package/server-app.js
CHANGED
|
@@ -112,6 +112,9 @@ var ResolveIOMainServer = /** @class */ (function () {
|
|
|
112
112
|
this._isWorkersEnabled = false;
|
|
113
113
|
this._isWorkerInstance = false;
|
|
114
114
|
this._safeShutdown = false;
|
|
115
|
+
this._clientHeartbeatIntervalMs = 20000;
|
|
116
|
+
this._clientHeartbeatInitialDelayMs = 5000;
|
|
117
|
+
this._clientHeartbeatBackpressureBytes = 5 * 1024 * 1024;
|
|
115
118
|
}
|
|
116
119
|
ResolveIOMainServer.create = function () {
|
|
117
120
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -684,30 +687,29 @@ var ResolveIOMainServer = /** @class */ (function () {
|
|
|
684
687
|
return [4 /*yield*/, this._subscriptionManager.createLoggedInUser(ws['id_socket'])];
|
|
685
688
|
case 2:
|
|
686
689
|
_a.sent();
|
|
687
|
-
setTimeout(function () {
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
return [4 /*yield*/, this.unsubscribeWS(ws)];
|
|
698
|
-
case 1:
|
|
699
|
-
_a.sent();
|
|
700
|
-
_a.label = 2;
|
|
701
|
-
case 2: return [2 /*return*/];
|
|
702
|
-
}
|
|
703
|
-
});
|
|
704
|
-
}); });
|
|
705
|
-
}, 5000);
|
|
690
|
+
setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
691
|
+
return __generator(this, function (_a) {
|
|
692
|
+
switch (_a.label) {
|
|
693
|
+
case 0: return [4 /*yield*/, this.triggerClientHeartbeat(ws)];
|
|
694
|
+
case 1:
|
|
695
|
+
_a.sent();
|
|
696
|
+
return [2 /*return*/];
|
|
697
|
+
}
|
|
698
|
+
});
|
|
699
|
+
}); }, this._clientHeartbeatInitialDelayMs);
|
|
706
700
|
if (this.LOGGER === 'DEBUG') {
|
|
707
701
|
console.log('Connection from user: ' + req['user']);
|
|
708
702
|
}
|
|
709
703
|
ws['isAlive'] = true;
|
|
710
704
|
ws['retryCnt'] = 0;
|
|
705
|
+
ws.on('pong', function () {
|
|
706
|
+
ws['isAlive'] = true;
|
|
707
|
+
ws['pongTime'] = new Date();
|
|
708
|
+
if (ws['pingTime']) {
|
|
709
|
+
ws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();
|
|
710
|
+
_this._subscriptionManager.loggedInLatency(ws);
|
|
711
|
+
}
|
|
712
|
+
});
|
|
711
713
|
ws.on('message', function (message) { return __awaiter(_this, void 0, void 0, function () {
|
|
712
714
|
var socketData, usedBinary, bufferPayload, decodeResult, decodeResult, decodeResult, view, decodeResult, e_1;
|
|
713
715
|
return __generator(this, function (_a) {
|
|
@@ -799,100 +801,61 @@ var ResolveIOMainServer = /** @class */ (function () {
|
|
|
799
801
|
}); });
|
|
800
802
|
// Keep alive timer
|
|
801
803
|
setInterval(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
802
|
-
var
|
|
804
|
+
var _a, _b, ws, e_2_1;
|
|
803
805
|
var e_2, _c;
|
|
804
|
-
var _this = this;
|
|
805
806
|
return __generator(this, function (_d) {
|
|
806
807
|
switch (_d.label) {
|
|
807
808
|
case 0:
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
switch (_e.label) {
|
|
811
|
-
case 0:
|
|
812
|
-
if (!(ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= 20000)) return [3 /*break*/, 5];
|
|
813
|
-
if (!(ws['isAlive'] === false)) return [3 /*break*/, 4];
|
|
814
|
-
ws['retryCnt']++;
|
|
815
|
-
if (!(ws['retryCnt'] >= 3)) return [3 /*break*/, 2];
|
|
816
|
-
return [4 /*yield*/, this_1.unsubscribeWS(ws)];
|
|
817
|
-
case 1:
|
|
818
|
-
_e.sent();
|
|
819
|
-
return [3 /*break*/, 3];
|
|
820
|
-
case 2:
|
|
821
|
-
ws['pingTime'] = new Date();
|
|
822
|
-
ws.send('ping', function (error) { return __awaiter(_this, void 0, void 0, function () {
|
|
823
|
-
return __generator(this, function (_a) {
|
|
824
|
-
switch (_a.label) {
|
|
825
|
-
case 0:
|
|
826
|
-
if (!error) return [3 /*break*/, 2];
|
|
827
|
-
if (this._methodManager.getEnableDebug()) {
|
|
828
|
-
console.log(new Date(), 'Server App', 'Error WS Ping');
|
|
829
|
-
}
|
|
830
|
-
return [4 /*yield*/, this.unsubscribeWS(ws)];
|
|
831
|
-
case 1:
|
|
832
|
-
_a.sent();
|
|
833
|
-
_a.label = 2;
|
|
834
|
-
case 2: return [2 /*return*/];
|
|
835
|
-
}
|
|
836
|
-
});
|
|
837
|
-
}); });
|
|
838
|
-
_e.label = 3;
|
|
839
|
-
case 3: return [3 /*break*/, 5];
|
|
840
|
-
case 4:
|
|
841
|
-
ws['retryCnt'] = 0;
|
|
842
|
-
ws['isAlive'] = false;
|
|
843
|
-
ws['pingTime'] = new Date();
|
|
844
|
-
ws.send('ping', function (error) { return __awaiter(_this, void 0, void 0, function () {
|
|
845
|
-
return __generator(this, function (_a) {
|
|
846
|
-
switch (_a.label) {
|
|
847
|
-
case 0:
|
|
848
|
-
if (!error) return [3 /*break*/, 2];
|
|
849
|
-
if (this._methodManager.getEnableDebug()) {
|
|
850
|
-
console.log(new Date(), 'Server App', 'Error WS Ping');
|
|
851
|
-
}
|
|
852
|
-
return [4 /*yield*/, this.unsubscribeWS(ws)];
|
|
853
|
-
case 1:
|
|
854
|
-
_a.sent();
|
|
855
|
-
_a.label = 2;
|
|
856
|
-
case 2: return [2 /*return*/];
|
|
857
|
-
}
|
|
858
|
-
});
|
|
859
|
-
}); });
|
|
860
|
-
_e.label = 5;
|
|
861
|
-
case 5: return [2 /*return*/];
|
|
862
|
-
}
|
|
863
|
-
});
|
|
864
|
-
};
|
|
865
|
-
this_1 = this;
|
|
809
|
+
_d.trys.push([0, 10, 11, 12]);
|
|
810
|
+
_a = __values(this._serverWSS.clients), _b = _a.next();
|
|
866
811
|
_d.label = 1;
|
|
867
812
|
case 1:
|
|
868
|
-
|
|
869
|
-
_a = __values(this._serverWSS.clients), _b = _a.next();
|
|
870
|
-
_d.label = 2;
|
|
871
|
-
case 2:
|
|
872
|
-
if (!!_b.done) return [3 /*break*/, 5];
|
|
813
|
+
if (!!_b.done) return [3 /*break*/, 9];
|
|
873
814
|
ws = _b.value;
|
|
874
|
-
|
|
875
|
-
|
|
815
|
+
if (!(ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= this._clientHeartbeatIntervalMs)) return [3 /*break*/, 8];
|
|
816
|
+
if (this.shouldDeferHeartbeat(ws)) {
|
|
817
|
+
ws['isAlive'] = true;
|
|
818
|
+
ws['retryCnt'] = 0;
|
|
819
|
+
ws['pingTime'] = new Date();
|
|
820
|
+
return [3 /*break*/, 8];
|
|
821
|
+
}
|
|
822
|
+
if (!(ws['isAlive'] === false)) return [3 /*break*/, 6];
|
|
823
|
+
ws['retryCnt']++;
|
|
824
|
+
if (!(ws['retryCnt'] >= 3)) return [3 /*break*/, 3];
|
|
825
|
+
return [4 /*yield*/, this.unsubscribeWS(ws)];
|
|
826
|
+
case 2:
|
|
876
827
|
_d.sent();
|
|
877
|
-
|
|
828
|
+
return [3 /*break*/, 5];
|
|
829
|
+
case 3: return [4 /*yield*/, this.triggerClientHeartbeat(ws)];
|
|
878
830
|
case 4:
|
|
879
|
-
|
|
880
|
-
|
|
831
|
+
_d.sent();
|
|
832
|
+
_d.label = 5;
|
|
881
833
|
case 5: return [3 /*break*/, 8];
|
|
882
834
|
case 6:
|
|
835
|
+
ws['retryCnt'] = 0;
|
|
836
|
+
ws['isAlive'] = false;
|
|
837
|
+
return [4 /*yield*/, this.triggerClientHeartbeat(ws)];
|
|
838
|
+
case 7:
|
|
839
|
+
_d.sent();
|
|
840
|
+
_d.label = 8;
|
|
841
|
+
case 8:
|
|
842
|
+
_b = _a.next();
|
|
843
|
+
return [3 /*break*/, 1];
|
|
844
|
+
case 9: return [3 /*break*/, 12];
|
|
845
|
+
case 10:
|
|
883
846
|
e_2_1 = _d.sent();
|
|
884
847
|
e_2 = { error: e_2_1 };
|
|
885
|
-
return [3 /*break*/,
|
|
886
|
-
case
|
|
848
|
+
return [3 /*break*/, 12];
|
|
849
|
+
case 11:
|
|
887
850
|
try {
|
|
888
851
|
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
889
852
|
}
|
|
890
853
|
finally { if (e_2) throw e_2.error; }
|
|
891
854
|
return [7 /*endfinally*/];
|
|
892
|
-
case
|
|
855
|
+
case 12: return [2 /*return*/];
|
|
893
856
|
}
|
|
894
857
|
});
|
|
895
|
-
}); },
|
|
858
|
+
}); }, this._clientHeartbeatIntervalMs);
|
|
896
859
|
};
|
|
897
860
|
ResolveIOMainServer.prototype.processSocketMessage = function (ws, socketData) {
|
|
898
861
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -994,9 +957,67 @@ var ResolveIOMainServer = /** @class */ (function () {
|
|
|
994
957
|
var first = trimmed[0];
|
|
995
958
|
return first === '[' || first === '{' || first === '"' || first === 'p' || first === 'P';
|
|
996
959
|
};
|
|
960
|
+
ResolveIOMainServer.prototype.triggerClientHeartbeat = function (ws) {
|
|
961
|
+
var _a;
|
|
962
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
963
|
+
var err_1;
|
|
964
|
+
var _this = this;
|
|
965
|
+
return __generator(this, function (_b) {
|
|
966
|
+
switch (_b.label) {
|
|
967
|
+
case 0:
|
|
968
|
+
if (!ws || ws.readyState !== ws.OPEN) {
|
|
969
|
+
return [2 /*return*/];
|
|
970
|
+
}
|
|
971
|
+
ws['pingTime'] = new Date();
|
|
972
|
+
_b.label = 1;
|
|
973
|
+
case 1:
|
|
974
|
+
_b.trys.push([1, 2, , 4]);
|
|
975
|
+
if (typeof ws.ping === 'function') {
|
|
976
|
+
ws.ping();
|
|
977
|
+
}
|
|
978
|
+
return [3 /*break*/, 4];
|
|
979
|
+
case 2:
|
|
980
|
+
err_1 = _b.sent();
|
|
981
|
+
if ((_a = this._methodManager) === null || _a === void 0 ? void 0 : _a.getEnableDebug()) {
|
|
982
|
+
console.log(new Date(), 'Server App', 'Error WS Ping Frame', err_1);
|
|
983
|
+
}
|
|
984
|
+
return [4 /*yield*/, this.unsubscribeWS(ws)];
|
|
985
|
+
case 3:
|
|
986
|
+
_b.sent();
|
|
987
|
+
return [2 /*return*/];
|
|
988
|
+
case 4:
|
|
989
|
+
ws.send('ping', function (error) { return __awaiter(_this, void 0, void 0, function () {
|
|
990
|
+
var _a;
|
|
991
|
+
return __generator(this, function (_b) {
|
|
992
|
+
switch (_b.label) {
|
|
993
|
+
case 0:
|
|
994
|
+
if (!error) return [3 /*break*/, 2];
|
|
995
|
+
if ((_a = this._methodManager) === null || _a === void 0 ? void 0 : _a.getEnableDebug()) {
|
|
996
|
+
console.log(new Date(), 'Server App', 'Error WS Ping');
|
|
997
|
+
}
|
|
998
|
+
return [4 /*yield*/, this.unsubscribeWS(ws)];
|
|
999
|
+
case 1:
|
|
1000
|
+
_b.sent();
|
|
1001
|
+
_b.label = 2;
|
|
1002
|
+
case 2: return [2 /*return*/];
|
|
1003
|
+
}
|
|
1004
|
+
});
|
|
1005
|
+
}); });
|
|
1006
|
+
return [2 /*return*/];
|
|
1007
|
+
}
|
|
1008
|
+
});
|
|
1009
|
+
});
|
|
1010
|
+
};
|
|
1011
|
+
ResolveIOMainServer.prototype.shouldDeferHeartbeat = function (ws) {
|
|
1012
|
+
if (!ws || ws.readyState !== ws.OPEN) {
|
|
1013
|
+
return false;
|
|
1014
|
+
}
|
|
1015
|
+
var bufferedAmount = typeof ws.bufferedAmount === 'number' ? ws.bufferedAmount : 0;
|
|
1016
|
+
return bufferedAmount >= this._clientHeartbeatBackpressureBytes;
|
|
1017
|
+
};
|
|
997
1018
|
ResolveIOMainServer.prototype.handleClientMessage = function (ws, msg) {
|
|
998
1019
|
return __awaiter(this, void 0, void 0, function () {
|
|
999
|
-
var messageRoute, messageDate, messageId, type, subType, pub, serverRes, offlineUpdates, i, update, data, updateRoute, updateDate, updateMessageId, updateType, method, serverResMethod,
|
|
1020
|
+
var messageRoute, messageDate, messageId, type, subType, pub, serverRes, offlineUpdates, i, update, data, updateRoute, updateDate, updateMessageId, updateType, method, serverResMethod, err_2, dataCopy, route, date, msgId, msgType, methodName, ack, method;
|
|
1000
1021
|
var _a;
|
|
1001
1022
|
return __generator(this, function (_b) {
|
|
1002
1023
|
switch (_b.label) {
|
|
@@ -1102,8 +1123,8 @@ var ResolveIOMainServer = /** @class */ (function () {
|
|
|
1102
1123
|
_b.sent();
|
|
1103
1124
|
return [3 /*break*/, 12];
|
|
1104
1125
|
case 11:
|
|
1105
|
-
|
|
1106
|
-
console.log(new Date(), 'Offline Error', JSON.stringify(
|
|
1126
|
+
err_2 = _b.sent();
|
|
1127
|
+
console.log(new Date(), 'Offline Error', JSON.stringify(err_2, null, 2));
|
|
1107
1128
|
return [3 /*break*/, 12];
|
|
1108
1129
|
case 12:
|
|
1109
1130
|
if (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {
|
|
@@ -1223,7 +1244,7 @@ var ResolveIOMainServer = /** @class */ (function () {
|
|
|
1223
1244
|
*/
|
|
1224
1245
|
ResolveIOMainServer.prototype.callMethodLocally = function (ws, messageId, method, params) {
|
|
1225
1246
|
return __awaiter(this, void 0, void 0, function () {
|
|
1226
|
-
var serverRes, result,
|
|
1247
|
+
var serverRes, result, err_3;
|
|
1227
1248
|
var _a;
|
|
1228
1249
|
return __generator(this, function (_b) {
|
|
1229
1250
|
switch (_b.label) {
|
|
@@ -1247,9 +1268,9 @@ var ResolveIOMainServer = /** @class */ (function () {
|
|
|
1247
1268
|
serverRes.data = result;
|
|
1248
1269
|
return [3 /*break*/, 4];
|
|
1249
1270
|
case 3:
|
|
1250
|
-
|
|
1271
|
+
err_3 = _b.sent();
|
|
1251
1272
|
serverRes.hasError = true;
|
|
1252
|
-
serverRes.data =
|
|
1273
|
+
serverRes.data = err_3 || 'Unknown error';
|
|
1253
1274
|
return [3 /*break*/, 4];
|
|
1254
1275
|
case 4:
|
|
1255
1276
|
if (ws && ws.readyState === ws.OPEN) {
|