Blame view
matrix-util.js
6.12 KB
93a0e5644
|
1 |
'use strict'; |
70b9ea66b
|
2 |
var moment = require('moment'); |
9d69d361f
|
3 |
var momentFormat = 'YYYY-MM-DD HH:mm:ss'; |
66277927b
|
4 |
var maxHealthyWaitMs = 60 * 1000; |
70b9ea66b
|
5 6 |
module.exports = MatrixUtil; |
0a0dd5297
|
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
|
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
|
39 |
if (!jid) {return; } |
70b9ea66b
|
40 |
if (jid == 'undefined') {return; } |
637ced97f
|
41 |
|
0a0dd5297
|
42 |
jid = _cleanPartnerId(jid); |
70b9ea66b
|
43 |
|
bd0c80ebf
|
44 45 46 |
if (!resource) { resource = 'undefined'; } |
93a0e5644
|
47 48 |
let logger = this.logger; let matrix = this.matrix; |
70b9ea66b
|
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
|
63 64 65 66 |
try { matrix.buddies[jid]['resources'][resource] = { state: state, statusText: statusText, |
9d69d361f
|
67 |
last_update: moment().format(momentFormat) |
ab6a15537
|
68 |
} |
70b9ea66b
|
69 |
} |
ab6a15537
|
70 71 72 |
catch(e) { logger.warn('MatrixUtil: Exception on update resources on matrix', {jid: jid, state: state, statusText: statusText, resource: resource}); } |
448f6cf8b
|
73 |
if (resource != 'undefined' && matrix.buddies[jid].resources['undefined']) { |
70b9ea66b
|
74 |
try { |
9ca4bb3b6
|
75 |
delete matrix.buddies[jid].resources['undefined']; |
70b9ea66b
|
76 77 |
} catch(e) {}; |
ab6a15537
|
78 |
} |
70b9ea66b
|
79 |
} |
ddffb312f
|
80 |
|
ddffb312f
|
81 |
MatrixUtil.prototype.isPartnerOffline = function(partner) { |
f7594efa6
|
82 |
if (!partner) { return; } |
0a0dd5297
|
83 84 |
partner = _cleanPartnerId(partner); |
f7594efa6
|
85 |
|
93a0e5644
|
86 87 |
let matrix = this.matrix; let logger = this.logger; |
ddffb312f
|
88 89 |
if (!matrix) { return false; } |
24071b44e
|
90 91 |
if (!matrix.buddies[partner]) { return true; } if (!matrix.buddies[partner].resources) { return true; }; |
ddffb312f
|
92 |
|
93a0e5644
|
93 94 |
let resources = matrix.buddies[partner].resources; for (let key in resources) { |
ddffb312f
|
95 |
if (resources.hasOwnProperty(key)) { |
93a0e5644
|
96 |
let resource = resources[key]; |
ddffb312f
|
97 98 99 100 101 102 103 104 |
if (resources[key].state == 'online') { return false; } } } logger.verbose('Offline partner detected: ' + partner); return true; } |
c3f61306a
|
105 |
|
f6e5bd71b
|
106 |
MatrixUtil.prototype._isPartnerHealthy = function(partner) { |
66277927b
|
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
|
130 |
MatrixUtil.prototype.isPartnerHealthy = function(partner) { |
24b73cd86
|
131 |
let matrix = this.matrix; |
a86d71b5c
|
132 |
|
f6e5bd71b
|
133 134 135 136 137 138 139 |
let isHealthy = this._isPartnerHealthy(partner); if (!matrix.healthy_partners) { matrix.healthy_partners = []; } // update matrix |
a86d71b5c
|
140 |
let idx = matrix.healthy_partners.indexOf(partner); |
f6e5bd71b
|
141 |
if (isHealthy) { |
a86d71b5c
|
142 143 144 |
if (idx < 0) { matrix.healthy_partners.push(partner); } |
f6e5bd71b
|
145 146 |
} else { |
f6e5bd71b
|
147 148 149 150 151 152 153 |
if (idx > -1) { matrix.healthy_partners.splice(idx, 1); } } return isHealthy; } |
66277927b
|
154 |
|
94a22ccda
|
155 |
MatrixUtil.prototype._updateLastResponseTime = function(partner) { |
7d5f67170
|
156 |
let matrix = this.matrix; |
b748823dd
|
157 |
let logger = this.logger; |
7d5f67170
|
158 |
|
285a6d184
|
159 160 |
if (!matrix.buddies[partner]['last_outgoing']) { logger.verbose('No outgoing yet, skip updateLastResponseTime'); |
85428dac4
|
161 |
return; |
7d5f67170
|
162 |
} |
285a6d184
|
163 164 |
if (!matrix.buddies[partner]['last_outgoing']['last_update_ts']) { logger.verbose('No outgoing timestamp yet, skip updateLastResponseTime'); |
85428dac4
|
165 |
return; |
7d5f67170
|
166 |
} |
285a6d184
|
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
|
172 |
} |
285a6d184
|
173 |
let delta = Date.now() - Number(matrix.buddies[partner]['last_outgoing']['last_update_ts']); |
97aef7616
|
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
|
177 |
} |
b2a87e63e
|
178 |
MatrixUtil.prototype._updateLastMessage = function(partner, msg, direction) { |
0a0dd5297
|
179 180 |
if (!partner) { return; } partner = _cleanPartnerId(partner); |
f7594efa6
|
181 |
|
93a0e5644
|
182 |
let matrix = this.matrix; |
7d5f67170
|
183 |
let logger = this.logger; |
c3f61306a
|
184 185 186 187 188 189 190 191 |
if (!matrix) { return; } if (!matrix.buddies) { matrix.buddies = {}; } |
0a0dd5297
|
192 193 |
if (!matrix.buddies[partner]) { matrix.buddies[partner] = {}; |
c3f61306a
|
194 |
} |
7d5f67170
|
195 196 |
if (direction == 'incoming') { try { |
6dedd7620
|
197 |
this._updateLastResponseTime(partner); |
7d5f67170
|
198 199 200 201 202 |
} catch(e) { logger.warn('Exception when updateLastResponseTime', {err: e}); } } |
e857c8e69
|
203 |
matrix.buddies[partner]['waiting_for_response'] = (direction == 'outgoing'); |
6a57e07ac
|
204 |
matrix.buddies[partner]['last_' + direction] = { |
c3f61306a
|
205 |
msg: msg, |
9d69d361f
|
206 207 |
last_update: moment().format(momentFormat), last_update_ts: Date.now() |
c3f61306a
|
208 |
} |
7d5f67170
|
209 210 211 212 |
if (direction == 'outgoing') { return; } |
c3f61306a
|
213 |
} |
c3f61306a
|
214 |
|
b2a87e63e
|
215 216 217 |
MatrixUtil.prototype.updateLastIncoming = function(partner, msg) { this._updateLastMessage(partner, msg, 'incoming'); } |
c3f61306a
|
218 |
|
b2a87e63e
|
219 220 |
MatrixUtil.prototype.updateLastOutgoing = function(partner, msg) { this._updateLastMessage(partner, msg, 'outgoing'); |
c3f61306a
|
221 |
} |