Blame view

matrix-util.js 5.59 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

66277927b   Adhidarma Hadiwinoto   isPartnerHealthy
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  MatrixUtil.prototype.isPartnerHealthy = function(partner) {
      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;
  }
94a22ccda   Adhidarma Hadiwinoto   typo
130
  MatrixUtil.prototype._updateLastResponseTime = function(partner) {
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
131
      let matrix = this.matrix;
b748823dd   Adhidarma Hadiwinoto   delta
132
      let logger = this.logger;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
133

285a6d184   Adhidarma Hadiwinoto   last_response_tim...
134
135
      if (!matrix.buddies[partner]['last_outgoing']) {
          logger.verbose('No outgoing yet, skip updateLastResponseTime');
85428dac4   Adhidarma Hadiwinoto   return if Exception
136
          return;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
137
      }
285a6d184   Adhidarma Hadiwinoto   last_response_tim...
138
139
      if (!matrix.buddies[partner]['last_outgoing']['last_update_ts']) {
          logger.verbose('No outgoing timestamp yet, skip updateLastResponseTime');
85428dac4   Adhidarma Hadiwinoto   return if Exception
140
          return;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
141
      }
285a6d184   Adhidarma Hadiwinoto   last_response_tim...
142
143
144
145
146
      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...
147
      }
285a6d184   Adhidarma Hadiwinoto   last_response_tim...
148
      let delta = Date.now() - Number(matrix.buddies[partner]['last_outgoing']['last_update_ts']);
97aef7616   Adhidarma Hadiwinoto   delta.toFixed() i...
149
150
151
      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...
152
  }
b2a87e63e   Adhidarma Hadiwinoto   _updateLastMessage
153
  MatrixUtil.prototype._updateLastMessage = function(partner, msg, direction) {
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
154
155
      if (!partner) { return; }
      partner = _cleanPartnerId(partner);
f7594efa6   Adhidarma Hadiwinoto   toLowerCase
156

93a0e5644   Adhidarma Hadiwinoto   strict mode
157
      let matrix = this.matrix;
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
158
      let logger = this.logger;
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
159
160
161
162
163
164
165
166
  
      if (!matrix) {
          return;
      }
  
      if (!matrix.buddies) {
          matrix.buddies = {};
      }
0a0dd5297   Adhidarma Hadiwinoto   _cleanPartnerId
167
168
      if (!matrix.buddies[partner]) {
          matrix.buddies[partner] = {};
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
169
      }
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
170
171
      if (direction == 'incoming') {
          try {
6dedd7620   Adhidarma Hadiwinoto   fix forget this
172
              this._updateLastResponseTime(partner);
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
173
174
175
176
177
          }
          catch(e) {
              logger.warn('Exception when updateLastResponseTime', {err: e});
          }
      }
e857c8e69   Adhidarma Hadiwinoto   matrix waiting_fo...
178
      matrix.buddies[partner]['waiting_for_response'] = (direction == 'outgoing');
6a57e07ac   Adhidarma Hadiwinoto   perbaikan salah n...
179
      matrix.buddies[partner]['last_' + direction] = {
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
180
          msg: msg,
9d69d361f   Adhidarma Hadiwinoto   momentFormat
181
182
          last_update: moment().format(momentFormat),
          last_update_ts: Date.now()
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
183
      }
7d5f67170   Adhidarma Hadiwinoto   updateLastRespons...
184
185
186
187
  
      if (direction == 'outgoing') {
          return;
      }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
188
  }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
189

b2a87e63e   Adhidarma Hadiwinoto   _updateLastMessage
190
191
192
  MatrixUtil.prototype.updateLastIncoming = function(partner, msg) {
      this._updateLastMessage(partner, msg, 'incoming');
  }
c3f61306a   Adhidarma Hadiwinoto   migrate matrix to...
193

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