From 66277927bc51526a20630df6b741059f576c0fa0 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Fri, 18 Nov 2016 13:50:42 +0700
Subject: [PATCH] isPartnerHealthy

---
 adaptor-xmpp.js |  4 ++++
 matrix-util.js  | 27 +++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/adaptor-xmpp.js b/adaptor-xmpp.js
index 21752ca..1e3dae8 100644
--- a/adaptor-xmpp.js
+++ b/adaptor-xmpp.js
@@ -54,6 +54,10 @@ function isPartnerOffline(partner) {
     return matrixUtil.isPartnerOffline(partner);
 }
 
+function isPartnerHealthy(partner) {
+    return matrixUtil.isPartnerHealthy(partner);
+}
+
 function init(_username, _password, _logger, _callbacks) {
     username = _username;
     password = _password;
diff --git a/matrix-util.js b/matrix-util.js
index 779806a..1bae060 100644
--- a/matrix-util.js
+++ b/matrix-util.js
@@ -2,6 +2,7 @@
 
 var moment = require('moment');
 var momentFormat = 'YYYY-MM-DD HH:mm:ss';
+var maxHealthyWaitMs = 60 * 1000;
 
 module.exports = MatrixUtil;
 
@@ -109,6 +110,32 @@ MatrixUtil.prototype.isPartnerOffline = function(partner) {
     return true;
 }
 
+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;
+}
+
+
 MatrixUtil.prototype._updateLastResponseTime = function(partner) {
     let matrix = this.matrix;
     let logger = this.logger;
-- 
1.9.0