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"