Blame view

matrix-util.js 6.12 KB
93a0e5644   Adhidarma Hadiwinoto   strict mode
1
  'use strict';
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
2
  var moment = require('moment');
9d69d361f   Adhidarma Hadiwinoto   momentFormat
3
  var momentFormat = 'YYYY-MM-DD HH:mm:ss';
66277927b   Adhidarma Hadiwinoto   isPartnerHealthy
4
  var maxHealthyWaitMs = 60 * 1000;
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
5
6
  
  module.exports = MatrixUtil;
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
7
8
9
10
11
12
13
14
15
16
17
18
  function _cleanPartnerId(partnerId) {
      let cleaned = partnerId;
  
      try {
          cleaned = cleaned.toLocaleString();
          cleaned = cleaned.trim().toLowerCase();
      } catch(e) {
          return partnerId;
      }
  
      return cleaned;
  }
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  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);
      }
  }
  
  MatrixUtil.prototype.updateBuddyState = function(jid, state, statusText, resource) {
f7594efa6   Adhidarma Hadiwinoto   toLowerCase
39
      if (!jid) {return; }
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
40
      if (jid == 'undefined') {return; }
637ced97f   Adhidarma Hadiwinoto   toLocaleString
41

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

bd0c80ebf   Adhidarma Hadiwinoto   penanganan undefi...
44
45
46
      if (!resource) {
          resource = 'undefined';
      }
93a0e5644   Adhidarma Hadiwinoto   strict mode
47
48
      let logger = this.logger;
      let matrix = this.matrix;
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  
      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 ...
63
64
65
66
      try {
          matrix.buddies[jid]['resources'][resource] = {
              state: state,
              statusText: statusText,
9d69d361f   Adhidarma Hadiwinoto   momentFormat
67
              last_update: moment().format(momentFormat)
ab6a15537   Adhidarma Hadiwinoto   tambah try catch ...
68
          }
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
69
      }
ab6a15537   Adhidarma Hadiwinoto   tambah try catch ...
70
71
72
      catch(e) {
          logger.warn('MatrixUtil: Exception on update resources on matrix', {jid: jid, state: state, statusText: statusText, resource: resource});
      }
448f6cf8b   Adhidarma Hadiwinoto   coba perbaikan
73
      if (resource != 'undefined' && matrix.buddies[jid].resources['undefined']) {
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
74
          try {
9ca4bb3b6   Adhidarma Hadiwinoto   hapus kelebihan t...
75
              delete matrix.buddies[jid].resources['undefined'];
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
76
77
          }
          catch(e) {};
ab6a15537   Adhidarma Hadiwinoto   tambah try catch ...
78
          }
70b9ea66b   Adhidarma Hadiwinoto   coba matrix-util
79
  }
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
80

ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
81
  MatrixUtil.prototype.isPartnerOffline = function(partner) {
f7594efa6   Adhidarma Hadiwinoto   toLowerCase
82
      if (!partner) { return; }
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
83
84
  
      partner = _cleanPartnerId(partner);
f7594efa6   Adhidarma Hadiwinoto   toLowerCase
85

93a0e5644   Adhidarma Hadiwinoto   strict mode
86
87
      let matrix = this.matrix;
      let logger = this.logger;
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
88
89
  
      if (!matrix) { return false; }
24071b44e   Adhidarma Hadiwinoto   teman tidak terda...
90
91
      if (!matrix.buddies[partner]) { return true; }
      if (!matrix.buddies[partner].resources) { return true; };
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
92

93a0e5644   Adhidarma Hadiwinoto   strict mode
93
94
      let resources = matrix.buddies[partner].resources;
      for (let key in resources) {
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
95
          if (resources.hasOwnProperty(key)) {
93a0e5644   Adhidarma Hadiwinoto   strict mode
96
              let resource = resources[key];
ddffb312f   Adhidarma Hadiwinoto   tambah teman jika...
97
98
99
100
101
102
103
104
              if (resources[key].state == 'online') {
                  return false;
              }
          }
      }
      logger.verbose('Offline partner detected: ' + partner);
      return true;
  }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
105

f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
106
  MatrixUtil.prototype._isPartnerHealthy = function(partner) {
66277927b   Adhidarma Hadiwinoto   isPartnerHealthy
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
      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; }
      if (!matrix.buddies[partner]['last_outgoing']) { return true; }
      if (!matrix.buddies[partner]['last_outgoing']['last_update_ts']) { return true; }
  
      let delta = Date.now() - Number(matrix.buddies[partner]['last_outgoing']['last_update_ts']);
      let isHealthy = delta <= maxHealthyWaitMs;
  
      logger.verbose('Partner healthy analized', {partner: partner, isHealthy: isHealthy, delta: delta, maxHealthyWaitMs: maxHealthyWaitMs});
      return isHealthy;
  }
f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
130
  MatrixUtil.prototype.isPartnerHealthy = function(partner) {
24b73cd86   Adhidarma Hadiwinoto   matrix alias pada...
131
      let matrix = this.matrix;
a86d71b5c   Adhidarma Hadiwinoto   hanya push health...
132

f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
133
134
135
136
137
138
139
      let isHealthy = this._isPartnerHealthy(partner);
  
      if (!matrix.healthy_partners) {
          matrix.healthy_partners = [];
      }
  
      // update matrix
a86d71b5c   Adhidarma Hadiwinoto   hanya push health...
140
      let idx = matrix.healthy_partners.indexOf(partner);
f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
141
      if (isHealthy) {
a86d71b5c   Adhidarma Hadiwinoto   hanya push health...
142
143
144
          if (idx < 0) {
              matrix.healthy_partners.push(partner);
          }
f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
145
146
      }
      else {
f6e5bd71b   Adhidarma Hadiwinoto   isPartnerHealthy ...
147
148
149
150
151
152
153
          if (idx > -1) {
              matrix.healthy_partners.splice(idx, 1);
          }
      }
  
      return isHealthy;
  }
66277927b   Adhidarma Hadiwinoto   isPartnerHealthy
154

94a22ccda   Adhidarma Hadiwinoto   typo
155
  MatrixUtil.prototype._updateLastResponseTime = function(partner) {
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
156
      let matrix = this.matrix;
b748823dd   Adhidarma Hadiwinoto   delta
157
      let logger = this.logger;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
158

285a6d184   Adhidarma Hadiwinoto   last_response_tim...
159
160
      if (!matrix.buddies[partner]['last_outgoing']) {
          logger.verbose('No outgoing yet, skip updateLastResponseTime');
85428dac4   Adhidarma Hadiwinoto   return if Exception
161
          return;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
162
      }
285a6d184   Adhidarma Hadiwinoto   last_response_tim...
163
164
      if (!matrix.buddies[partner]['last_outgoing']['last_update_ts']) {
          logger.verbose('No outgoing timestamp yet, skip updateLastResponseTime');
85428dac4   Adhidarma Hadiwinoto   return if Exception
165
          return;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
166
      }
285a6d184   Adhidarma Hadiwinoto   last_response_tim...
167
168
169
170
171
      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...
172
      }
285a6d184   Adhidarma Hadiwinoto   last_response_tim...
173
      let delta = Date.now() - Number(matrix.buddies[partner]['last_outgoing']['last_update_ts']);
97aef7616   Adhidarma Hadiwinoto   delta.toFixed() i...
174
175
176
      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...
177
  }
b2a87e63e   Adhidarma Hadiwinoto   _updateLastMessage
178
  MatrixUtil.prototype._updateLastMessage = function(partner, msg, direction) {
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
179
180
      if (!partner) { return; }
      partner = _cleanPartnerId(partner);
f7594efa6   Adhidarma Hadiwinoto   toLowerCase
181

93a0e5644   Adhidarma Hadiwinoto   strict mode
182
      let matrix = this.matrix;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
183
      let logger = this.logger;
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
184
185
186
187
188
189
190
191
  
      if (!matrix) {
          return;
      }
  
      if (!matrix.buddies) {
          matrix.buddies = {};
      }
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
192
193
      if (!matrix.buddies[partner]) {
          matrix.buddies[partner] = {};
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
194
      }
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
195
196
      if (direction == 'incoming') {
          try {
6dedd7620   Adhidarma Hadiwinoto   fix forget this
197
              this._updateLastResponseTime(partner);
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
198
199
200
201
202
          }
          catch(e) {
              logger.warn('Exception when updateLastResponseTime', {err: e});
          }
      }
e857c8e69   Adhidarma Hadiwinoto   matrix waiting_fo...
203
      matrix.buddies[partner]['waiting_for_response'] = (direction == 'outgoing');
6a57e07ac   Adhidarma Hadiwinoto   perbaikan salah n...
204
      matrix.buddies[partner]['last_' + direction] = {
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
205
          msg: msg,
9d69d361f   Adhidarma Hadiwinoto   momentFormat
206
207
          last_update: moment().format(momentFormat),
          last_update_ts: Date.now()
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
208
      }
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
209
210
211
212
  
      if (direction == 'outgoing') {
          return;
      }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
213
  }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
214

b2a87e63e   Adhidarma Hadiwinoto   _updateLastMessage
215
216
217
  MatrixUtil.prototype.updateLastIncoming = function(partner, msg) {
      this._updateLastMessage(partner, msg, 'incoming');
  }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
218

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