@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/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
- ws['pingTime'] = new Date();
689
- ws.send('ping', function (error) { return __awaiter(_this, void 0, void 0, function () {
690
- return __generator(this, function (_a) {
691
- switch (_a.label) {
692
- case 0:
693
- if (!error) return [3 /*break*/, 2];
694
- if (this._methodManager.getEnableDebug()) {
695
- console.log(new Date(), 'Server App', 'Error WS Ping');
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 _loop_1, this_1, _a, _b, ws, e_2_1;
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
- _loop_1 = function (ws) {
809
- return __generator(this, function (_e) {
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
- _d.trys.push([1, 6, 7, 8]);
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
- return [5 /*yield**/, _loop_1(ws)];
875
- case 3:
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
- _d.label = 4;
828
+ return [3 /*break*/, 5];
829
+ case 3: return [4 /*yield*/, this.triggerClientHeartbeat(ws)];
878
830
  case 4:
879
- _b = _a.next();
880
- return [3 /*break*/, 2];
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*/, 8];
886
- case 7:
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 8: return [2 /*return*/];
855
+ case 12: return [2 /*return*/];
893
856
  }
894
857
  });
895
- }); }, 20000);
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, err_1, dataCopy, route, date, msgId, msgType, methodName, ack, method;
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
- err_1 = _b.sent();
1106
- console.log(new Date(), 'Offline Error', JSON.stringify(err_1, null, 2));
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, err_2;
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
- err_2 = _b.sent();
1271
+ err_3 = _b.sent();
1251
1272
  serverRes.hasError = true;
1252
- serverRes.data = err_2 || 'Unknown error';
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) {