Blame view

matrix-util.js 6.53 KB
93a0e5644   Adhidarma Hadiwinoto   strict mode
1
  'use strict';
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
2
  var moment = require('moment');
5fab10405   Adhidarma Hadiwinoto   accept config on ...
3
4
  
  var config;
9d69d361f   Adhidarma Hadiwinoto   momentFormat
5
  var momentFormat = 'YYYY-MM-DD HH:mm:ss';
5fab10405   Adhidarma Hadiwinoto   accept config on ...
6
  var defaultMaxHealthyWaitMs = 2 * 60 * 1000;
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
7
8
  
  module.exports = MatrixUtil;
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
9
10
11
12
13
14
15
16
17
18
19
20
  function _cleanPartnerId(partnerId) {
      let cleaned = partnerId;
  
      try {
          cleaned = cleaned.toLocaleString();
          cleaned = cleaned.trim().toLowerCase();
      } catch(e) {
          return partnerId;
      }
  
      return cleaned;
  }
5fab10405   Adhidarma Hadiwinoto   accept config on ...
21
  function getMaxHealthyWaitMs() {
1b7b436a1   Adhidarma Hadiwinoto   Number(max_health...
22
23
      if (!config || !config.globals || !Number(config.globals.max_healthy_wait_ms)) { return defaultMaxHealthyWaitMs; }
      return Number(config.globals.max_healthy_wait_ms);
5fab10405   Adhidarma Hadiwinoto   accept config on ...
24
  }
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  function MatrixUtil(options) {
      if (!options) {
          console.trace('Undefined options');
          process.exit(1);
      }
  
      this.matrix = options.matrix;
      if (!this.matrix) {
          console.trace("Matrix not set");
          process.exit(1);
      }
  
      this.logger = options.logger;
      if (!this.logger) {
          console.trace("Logger not set");
          process.exit(1);
      }
5fab10405   Adhidarma Hadiwinoto   accept config on ...
42

dd043a578   Adhidarma Hadiwinoto   config pakai global
43
      config = options.config;
6f6de0248   Adhidarma Hadiwinoto   hapus this dari c...
44
      if (!config) {
5fab10405   Adhidarma Hadiwinoto   accept config on ...
45
46
          console.trace("Config not set");
          process.exit(1);
3fd857e00   Adhidarma Hadiwinoto   hapus promise tak...
47
      };
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
48
49
50
  }
  
  MatrixUtil.prototype.updateBuddyState = function(jid, state, statusText, resource) {
f7594efa6   Adhidarma Hadiwinoto   toLowerCase
51
      if (!jid) {return; }
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
52
      if (jid == 'undefined') {return; }
637ced97f   Adhidarma Hadiwinoto   toLocaleString
53

0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
54
      jid = _cleanPartnerId(jid);
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
55

bd0c80ebf   Adhidarma Hadiwinoto   penanganan undefi...
56
57
58
      if (!resource) {
          resource = 'undefined';
      }
93a0e5644   Adhidarma Hadiwinoto   strict mode
59
60
      let logger = this.logger;
      let matrix = this.matrix;
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  
      logger.verbose('Buddy state change', {jid: jid, state: state, statusText: statusText, resource: resource});
  
      if (!matrix) {
          return;
      }
  
      if (!matrix.buddies) {
          matrix.buddies = {};
      }
  
      if (!matrix.buddies[jid]) {
          matrix.buddies[jid] = {resources: {}};
      }
ab6a15537   Adhidarma Hadiwinoto   tambah try catch ...
75
76
77
78
      try {
          matrix.buddies[jid]['resources'][resource] = {
              state: state,
              statusText: statusText,
9d69d361f   Adhidarma Hadiwinoto   momentFormat
79
              last_update: moment().format(momentFormat)
ab6a15537   Adhidarma Hadiwinoto   tambah try catch ...
80
          }
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
81
      }
ab6a15537   Adhidarma Hadiwinoto   tambah try catch ...
82
83
84
      catch(e) {
          logger.warn('MatrixUtil: Exception on update resources on matrix', {jid: jid, state: state, statusText: statusText, resource: resource});
      }
448f6cf8b   Adhidarma Hadiwinoto   coba perbaikan
85
      if (resource != 'undefined' && matrix.buddies[jid].resources['undefined']) {
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
86
          try {
9ca4bb3b6   Adhidarma Hadiwinoto   hapus kelebihan t...
87
              delete matrix.buddies[jid].resources['undefined'];
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
88
89
          }
          catch(e) {};
ab6a15537   Adhidarma Hadiwinoto   tambah try catch ...
90
          }
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
91
  }
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
92

ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
93
  MatrixUtil.prototype.isPartnerOffline = function(partner) {
f7594efa6   Adhidarma Hadiwinoto   toLowerCase
94
      if (!partner) { return; }
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
95
96
  
      partner = _cleanPartnerId(partner);
f7594efa6   Adhidarma Hadiwinoto   toLowerCase
97

93a0e5644   Adhidarma Hadiwinoto   strict mode
98
99
      let matrix = this.matrix;
      let logger = this.logger;
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
100
101
  
      if (!matrix) { return false; }
0a06547ec   Adhidarma Hadiwinoto   penanganan jika m...
102
      if (!matrix.buddies) { matrix.buddies = {}; }
24071b44e   Adhidarma Hadiwinoto   teman tidak terda...
103
104
      if (!matrix.buddies[partner]) { return true; }
      if (!matrix.buddies[partner].resources) { return true; };
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
105

93a0e5644   Adhidarma Hadiwinoto   strict mode
106
107
      let resources = matrix.buddies[partner].resources;
      for (let key in resources) {
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
108
          if (resources.hasOwnProperty(key)) {
93a0e5644   Adhidarma Hadiwinoto   strict mode
109
              let resource = resources[key];
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
110
111
112
113
114
115
116
117
              if (resources[key].state == 'online') {
                  return false;
              }
          }
      }
      logger.verbose('Offline partner detected: ' + partner);
      return true;
  }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
118

f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
119
  MatrixUtil.prototype._isPartnerHealthy = function(partner) {
66277927b   Adhidarma Hadiwinoto   isPartnerHealthy
120
121
122
123
124
125
126
127
128
129
130
131
132
133
      if (!partner) { return; }
      partner = _cleanPartnerId(partner);
  
      if (this.isPartnerOffline(partner)) {
          return;
      }
  
      let matrix = this.matrix;
      let logger = this.logger;
  
      if (!matrix) { return false; }
  
      if (!matrix.buddies[partner]) { return false; }
      if (!matrix.buddies[partner]['waiting_for_response']) { return true; }
45fd1b886   Adhidarma Hadiwinoto   kesehatan tergant...
134
135
      if (!matrix.buddies[partner]['last_incoming']) { return false; }
      if (!matrix.buddies[partner]['last_incoming']['last_update_ts']) { return false; }
66277927b   Adhidarma Hadiwinoto   isPartnerHealthy
136

45fd1b886   Adhidarma Hadiwinoto   kesehatan tergant...
137
      let delta = Date.now() - Number(matrix.buddies[partner]['last_incoming']['last_update_ts']);
2dbf226fc   Adhidarma Hadiwinoto   getMaxHealthyWaitMs
138
      let isHealthy = delta <= getMaxHealthyWaitMs();
66277927b   Adhidarma Hadiwinoto   isPartnerHealthy
139

2dbf226fc   Adhidarma Hadiwinoto   getMaxHealthyWaitMs
140
      logger.verbose('Partner healthy analized', {partner: partner, isHealthy: isHealthy, delta: delta, maxHealthyWaitMs: getMaxHealthyWaitMs()});
66277927b   Adhidarma Hadiwinoto   isPartnerHealthy
141
142
      return isHealthy;
  }
f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
143
  MatrixUtil.prototype.isPartnerHealthy = function(partner) {
24b73cd86   Adhidarma Hadiwinoto   matrix alias pada...
144
      let matrix = this.matrix;
a86d71b5c   Adhidarma Hadiwinoto   hanya push health...
145

f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
146
147
148
149
150
151
152
      let isHealthy = this._isPartnerHealthy(partner);
  
      if (!matrix.healthy_partners) {
          matrix.healthy_partners = [];
      }
  
      // update matrix
a86d71b5c   Adhidarma Hadiwinoto   hanya push health...
153
      let idx = matrix.healthy_partners.indexOf(partner);
f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
154
      if (isHealthy) {
a86d71b5c   Adhidarma Hadiwinoto   hanya push health...
155
156
157
          if (idx < 0) {
              matrix.healthy_partners.push(partner);
          }
f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
158
159
      }
      else {
f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
160
161
162
163
164
165
166
          if (idx > -1) {
              matrix.healthy_partners.splice(idx, 1);
          }
      }
  
      return isHealthy;
  }
66277927b   Adhidarma Hadiwinoto   isPartnerHealthy
167

94a22ccda   Adhidarma Hadiwinoto   typo
168
  MatrixUtil.prototype._updateLastResponseTime = function(partner) {
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
169
      let matrix = this.matrix;
b748823dd   Adhidarma Hadiwinoto   delta
170
      let logger = this.logger;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
171

285a6d184   Adhidarma Hadiwinoto   last_response_tim...
172
173
      if (!matrix.buddies[partner]['last_outgoing']) {
          logger.verbose('No outgoing yet, skip updateLastResponseTime');
85428dac4   Adhidarma Hadiwinoto   return if Exception
174
          return;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
175
      }
285a6d184   Adhidarma Hadiwinoto   last_response_tim...
176
177
      if (!matrix.buddies[partner]['last_outgoing']['last_update_ts']) {
          logger.verbose('No outgoing timestamp yet, skip updateLastResponseTime');
85428dac4   Adhidarma Hadiwinoto   return if Exception
178
          return;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
179
      }
285a6d184   Adhidarma Hadiwinoto   last_response_tim...
180
181
182
183
184
      if (
          matrix.buddies[partner]['last_incoming']
          && (Number(matrix.buddies[partner]['last_incoming']['last_update_ts']) > Number(matrix.buddies[partner]['last_outgoing']['last_update_ts']))
      ) {
          return;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
185
      }
285a6d184   Adhidarma Hadiwinoto   last_response_tim...
186
      let delta = Date.now() - Number(matrix.buddies[partner]['last_outgoing']['last_update_ts']);
97aef7616   Adhidarma Hadiwinoto   delta.toFixed() i...
187
188
189
      delta = (delta / 1000).toFixed(2);
      logger.verbose('MatrixUtil: Response time in ' + delta + ' seconds', {partner: partner});
      matrix.buddies[partner]['last_response_time_in_secs'] = delta;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
190
  }
b2a87e63e   Adhidarma Hadiwinoto   _updateLastMessage
191
  MatrixUtil.prototype._updateLastMessage = function(partner, msg, direction) {
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
192
193
      if (!partner) { return; }
      partner = _cleanPartnerId(partner);
f7594efa6   Adhidarma Hadiwinoto   toLowerCase
194

93a0e5644   Adhidarma Hadiwinoto   strict mode
195
      let matrix = this.matrix;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
196
      let logger = this.logger;
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
197
198
199
200
201
202
203
204
  
      if (!matrix) {
          return;
      }
  
      if (!matrix.buddies) {
          matrix.buddies = {};
      }
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
205
206
      if (!matrix.buddies[partner]) {
          matrix.buddies[partner] = {};
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
207
      }
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
208
209
      if (direction == 'incoming') {
          try {
6dedd7620   Adhidarma Hadiwinoto   fix forget this
210
              this._updateLastResponseTime(partner);
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
211
212
213
214
215
          }
          catch(e) {
              logger.warn('Exception when updateLastResponseTime', {err: e});
          }
      }
e857c8e69   Adhidarma Hadiwinoto   matrix waiting_fo...
216
      matrix.buddies[partner]['waiting_for_response'] = (direction == 'outgoing');
6a57e07ac   Adhidarma Hadiwinoto   perbaikan salah n...
217
      matrix.buddies[partner]['last_' + direction] = {
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
218
          msg: msg,
9d69d361f   Adhidarma Hadiwinoto   momentFormat
219
220
          last_update: moment().format(momentFormat),
          last_update_ts: Date.now()
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
221
      }
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
222
223
224
225
  
      if (direction == 'outgoing') {
          return;
      }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
226
  }
b2a87e63e   Adhidarma Hadiwinoto   _updateLastMessage
227
228
229
  MatrixUtil.prototype.updateLastIncoming = function(partner, msg) {
      this._updateLastMessage(partner, msg, 'incoming');
  }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
230

b2a87e63e   Adhidarma Hadiwinoto   _updateLastMessage
231
232
  MatrixUtil.prototype.updateLastOutgoing = function(partner, msg) {
      this._updateLastMessage(partner, msg, 'outgoing');
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
233
  }