Blame view
matrix-util.js
6.51 KB
93a0e5644
|
1 |
'use strict'; |
70b9ea66b
|
2 |
var moment = require('moment'); |
5fab10405
|
3 4 |
var config; |
9d69d361f
|
5 |
var momentFormat = 'YYYY-MM-DD HH:mm:ss'; |
5fab10405
|
6 |
var defaultMaxHealthyWaitMs = 2 * 60 * 1000; |
70b9ea66b
|
7 8 |
module.exports = MatrixUtil; |
0a0dd5297
|
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
|
21 22 23 24 |
function getMaxHealthyWaitMs() { if (!config || !config.globals || !config.globals.max_healthy_wait_ms) { return defaultMaxHealthyWaitMs; } return config.globals.max_healthy_wait_ms; } |
70b9ea66b
|
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
|
42 |
|
dd043a578
|
43 |
config = options.config; |
5fab10405
|
44 45 46 47 |
if (!this.config) new Promise(function(resolve, reject) { console.trace("Config not set"); process.exit(1); }); |
70b9ea66b
|
48 49 50 |
} MatrixUtil.prototype.updateBuddyState = function(jid, state, statusText, resource) { |
f7594efa6
|
51 |
if (!jid) {return; } |
70b9ea66b
|
52 |
if (jid == 'undefined') {return; } |
637ced97f
|
53 |
|
0a0dd5297
|
54 |
jid = _cleanPartnerId(jid); |
70b9ea66b
|
55 |
|
bd0c80ebf
|
56 57 58 |
if (!resource) { resource = 'undefined'; } |
93a0e5644
|
59 60 |
let logger = this.logger; let matrix = this.matrix; |
70b9ea66b
|
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
|
75 76 77 78 |
try { matrix.buddies[jid]['resources'][resource] = { state: state, statusText: statusText, |
9d69d361f
|
79 |
last_update: moment().format(momentFormat) |
ab6a15537
|
80 |
} |
70b9ea66b
|
81 |
} |
ab6a15537
|
82 83 84 |
catch(e) { logger.warn('MatrixUtil: Exception on update resources on matrix', {jid: jid, state: state, statusText: statusText, resource: resource}); } |
448f6cf8b
|
85 |
if (resource != 'undefined' && matrix.buddies[jid].resources['undefined']) { |
70b9ea66b
|
86 |
try { |
9ca4bb3b6
|
87 |
delete matrix.buddies[jid].resources['undefined']; |
70b9ea66b
|
88 89 |
} catch(e) {}; |
ab6a15537
|
90 |
} |
70b9ea66b
|
91 |
} |
ddffb312f
|
92 |
|
ddffb312f
|
93 |
MatrixUtil.prototype.isPartnerOffline = function(partner) { |
f7594efa6
|
94 |
if (!partner) { return; } |
0a0dd5297
|
95 96 |
partner = _cleanPartnerId(partner); |
f7594efa6
|
97 |
|
93a0e5644
|
98 99 |
let matrix = this.matrix; let logger = this.logger; |
ddffb312f
|
100 101 |
if (!matrix) { return false; } |
24071b44e
|
102 103 |
if (!matrix.buddies[partner]) { return true; } if (!matrix.buddies[partner].resources) { return true; }; |
ddffb312f
|
104 |
|
93a0e5644
|
105 106 |
let resources = matrix.buddies[partner].resources; for (let key in resources) { |
ddffb312f
|
107 |
if (resources.hasOwnProperty(key)) { |
93a0e5644
|
108 |
let resource = resources[key]; |
ddffb312f
|
109 110 111 112 113 114 115 116 |
if (resources[key].state == 'online') { return false; } } } logger.verbose('Offline partner detected: ' + partner); return true; } |
c3f61306a
|
117 |
|
f6e5bd71b
|
118 |
MatrixUtil.prototype._isPartnerHealthy = function(partner) { |
66277927b
|
119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
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
|
133 134 |
if (!matrix.buddies[partner]['last_incoming']) { return false; } if (!matrix.buddies[partner]['last_incoming']['last_update_ts']) { return false; } |
66277927b
|
135 |
|
45fd1b886
|
136 |
let delta = Date.now() - Number(matrix.buddies[partner]['last_incoming']['last_update_ts']); |
2dbf226fc
|
137 |
let isHealthy = delta <= getMaxHealthyWaitMs(); |
66277927b
|
138 |
|
2dbf226fc
|
139 |
logger.verbose('Partner healthy analized', {partner: partner, isHealthy: isHealthy, delta: delta, maxHealthyWaitMs: getMaxHealthyWaitMs()}); |
66277927b
|
140 141 |
return isHealthy; } |
f6e5bd71b
|
142 |
MatrixUtil.prototype.isPartnerHealthy = function(partner) { |
24b73cd86
|
143 |
let matrix = this.matrix; |
a86d71b5c
|
144 |
|
f6e5bd71b
|
145 146 147 148 149 150 151 |
let isHealthy = this._isPartnerHealthy(partner); if (!matrix.healthy_partners) { matrix.healthy_partners = []; } // update matrix |
a86d71b5c
|
152 |
let idx = matrix.healthy_partners.indexOf(partner); |
f6e5bd71b
|
153 |
if (isHealthy) { |
a86d71b5c
|
154 155 156 |
if (idx < 0) { matrix.healthy_partners.push(partner); } |
f6e5bd71b
|
157 158 |
} else { |
f6e5bd71b
|
159 160 161 162 163 164 165 |
if (idx > -1) { matrix.healthy_partners.splice(idx, 1); } } return isHealthy; } |
66277927b
|
166 |
|
94a22ccda
|
167 |
MatrixUtil.prototype._updateLastResponseTime = function(partner) { |
7d5f67170
|
168 |
let matrix = this.matrix; |
b748823dd
|
169 |
let logger = this.logger; |
7d5f67170
|
170 |
|
285a6d184
|
171 172 |
if (!matrix.buddies[partner]['last_outgoing']) { logger.verbose('No outgoing yet, skip updateLastResponseTime'); |
85428dac4
|
173 |
return; |
7d5f67170
|
174 |
} |
285a6d184
|
175 176 |
if (!matrix.buddies[partner]['last_outgoing']['last_update_ts']) { logger.verbose('No outgoing timestamp yet, skip updateLastResponseTime'); |
85428dac4
|
177 |
return; |
7d5f67170
|
178 |
} |
285a6d184
|
179 180 181 182 183 |
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
|
184 |
} |
285a6d184
|
185 |
let delta = Date.now() - Number(matrix.buddies[partner]['last_outgoing']['last_update_ts']); |
97aef7616
|
186 187 188 |
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
|
189 |
} |
b2a87e63e
|
190 |
MatrixUtil.prototype._updateLastMessage = function(partner, msg, direction) { |
0a0dd5297
|
191 192 |
if (!partner) { return; } partner = _cleanPartnerId(partner); |
f7594efa6
|
193 |
|
93a0e5644
|
194 |
let matrix = this.matrix; |
7d5f67170
|
195 |
let logger = this.logger; |
c3f61306a
|
196 197 198 199 200 201 202 203 |
if (!matrix) { return; } if (!matrix.buddies) { matrix.buddies = {}; } |
0a0dd5297
|
204 205 |
if (!matrix.buddies[partner]) { matrix.buddies[partner] = {}; |
c3f61306a
|
206 |
} |
7d5f67170
|
207 208 |
if (direction == 'incoming') { try { |
6dedd7620
|
209 |
this._updateLastResponseTime(partner); |
7d5f67170
|
210 211 212 213 214 |
} catch(e) { logger.warn('Exception when updateLastResponseTime', {err: e}); } } |
e857c8e69
|
215 |
matrix.buddies[partner]['waiting_for_response'] = (direction == 'outgoing'); |
6a57e07ac
|
216 |
matrix.buddies[partner]['last_' + direction] = { |
c3f61306a
|
217 |
msg: msg, |
9d69d361f
|
218 219 |
last_update: moment().format(momentFormat), last_update_ts: Date.now() |
c3f61306a
|
220 |
} |
7d5f67170
|
221 222 223 224 |
if (direction == 'outgoing') { return; } |
c3f61306a
|
225 |
} |
b2a87e63e
|
226 227 228 |
MatrixUtil.prototype.updateLastIncoming = function(partner, msg) { this._updateLastMessage(partner, msg, 'incoming'); } |
c3f61306a
|
229 |
|
b2a87e63e
|
230 231 |
MatrixUtil.prototype.updateLastOutgoing = function(partner, msg) { this._updateLastMessage(partner, msg, 'outgoing'); |
c3f61306a
|
232 |
} |