From d9749b74e38bd25853e92f123f28e2cff1bd1bc8 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <adhisimon@gmail.com>
Date: Wed, 27 Oct 2021 13:56:06 +0700
Subject: [PATCH] Add kill-on-idle

---
 config.sample.json  |  4 ++++
 lib/kill-on-idle.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/transport.js    |  7 +++++++
 package-lock.json   |  1 +
 package.json        |  1 +
 5 files changed, 63 insertions(+)
 create mode 100644 lib/kill-on-idle.js

diff --git a/config.sample.json b/config.sample.json
index 688d065..d6d6aed 100644
--- a/config.sample.json
+++ b/config.sample.json
@@ -14,5 +14,9 @@
         "allowed_from_partners": [],
         "interval_ms": 25000,
         "send_to": []
+    },
+    "kill_on_idle": {
+        "disable": false,
+        "max_idle_ms": 6000
     }
 }
diff --git a/lib/kill-on-idle.js b/lib/kill-on-idle.js
new file mode 100644
index 0000000..c614ef7
--- /dev/null
+++ b/lib/kill-on-idle.js
@@ -0,0 +1,50 @@
+const MODULE_NAME = 'KILL-ON-IDLE';
+
+const moment = require('moment');
+const config = require('komodo-sdk/config');
+const logger = require('tektrans-logger');
+
+const maxIdleMs = (config.kill_on_idle && config.kill_on_idle.max_idle_ms) || 60 * 1000;
+
+let lastIncomingTs = new Date();
+
+const touch = () => {
+    lastIncomingTs = new Date();
+};
+exports.touch = touch;
+
+const getDisabled = () => !config.kill_on_idle || config.kill_on_idle.disable;
+exports.getDisabled = getDisabled;
+
+const killOnIdle = () => {
+    if (getDisabled()) {
+        return;
+    }
+
+    const ageMs = new Date() - lastIncomingTs;
+
+    if (ageMs > maxIdleMs) {
+        logger.warn(`${MODULE_NAME} 74A43DF4: Idle deadline exceeded. Terminating`, {
+            lastIncomingTs: moment(lastIncomingTs).format('YYYY-MM-DD HH:mm:ss'),
+            ageMs,
+            maxIdleMs,
+        });
+    }
+
+    process.exit(1);
+};
+
+const init = () => {
+    if (getDisabled()) {
+        return;
+    }
+
+    logger.verbose(`${MODULE_NAME} CF75F9CE: Registering kill on idle checker`, {
+        maxIdleMs,
+    });
+
+    setInterval(() => {
+        killOnIdle();
+    }, 2 * 1000);
+};
+exports.init = init;
diff --git a/lib/transport.js b/lib/transport.js
index 794b9ef..56cee8b 100644
--- a/lib/transport.js
+++ b/lib/transport.js
@@ -8,6 +8,7 @@ const messagingService = require('komodo-center-messaging-client-lib');
 const uniqid = require('uniqid');
 
 const customPing = require('./custom-ping');
+const killOnIdle = require('./kill-on-idle');
 
 let isReady;
 
@@ -18,6 +19,10 @@ bot.on('online', (data) => {
         customPing.setBot(bot);
     }
 
+    if (!killOnIdle.getDisabled()) {
+        killOnIdle.init();
+    }
+
     bot.getRoster();
 
     setTimeout(
@@ -46,6 +51,8 @@ bot.on('chat', (partner, msg) => {
         return;
     }
 
+    killOnIdle.touch();
+
     const xid = uniqid();
 
     if (customPing.isPongMessage(msg)) {
diff --git a/package-lock.json b/package-lock.json
index c5e0ebe..1a2f17c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,6 +11,7 @@
       "dependencies": {
         "komodo-center-messaging-client-lib": "git+https://gitlab.kodesumber.com/komodo/komodo-center-messaging-client-lib.git",
         "komodo-sdk": "^1.43.8",
+        "moment": "^2.29.1",
         "simple-xmpp": "^1.3.1",
         "tektrans-logger": "^1.2.2",
         "uniqid": "^5.4.0"
diff --git a/package.json b/package.json
index edbcf6f..0583a5b 100644
--- a/package.json
+++ b/package.json
@@ -28,6 +28,7 @@
   "dependencies": {
     "komodo-center-messaging-client-lib": "git+https://gitlab.kodesumber.com/komodo/komodo-center-messaging-client-lib.git",
     "komodo-sdk": "^1.43.8",
+    "moment": "^2.29.1",
     "simple-xmpp": "^1.3.1",
     "tektrans-logger": "^1.2.2",
     "uniqid": "^5.4.0"
-- 
1.9.0