From ccd4f6b5be0d74ba982f7c902a3f82319b471fc1 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <adhisimon@gmail.com>
Date: Wed, 27 Oct 2021 17:13:50 +0700
Subject: [PATCH] Lock mutex on sending

---
 lib/custom-ping.js | 40 ++++++++++++++++++++++++++++++----------
 package-lock.json  | 11 +++++++++++
 package.json       |  1 +
 3 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/lib/custom-ping.js b/lib/custom-ping.js
index ac5f214..3bcb7e5 100644
--- a/lib/custom-ping.js
+++ b/lib/custom-ping.js
@@ -1,10 +1,12 @@
 const MODULE_NAME = 'CUSTOM-PING';
 
+const locks = require('locks');
 const uniqid = require('uniqid');
 const config = require('komodo-sdk/config');
 const logger = require('tektrans-logger');
 
 let bot;
+const mutex = locks.createMutex();
 
 const allowedFromPartnerList = (
     (config.custom_ping && config.custom_ping.allowed_from_partners) || []
@@ -66,8 +68,15 @@ const sendPong = (xid, partner, pingMessage) => {
 };
 exports.sendPong = sendPong;
 
-const pingSender = () => {
+const sleepMs = (ms) => new Promise((resolve) => {
+    setTimeout(() => {
+        resolve(true);
+    }, ms);
+});
+
+const pingSender = async () => {
     const xid = uniqid();
+
     if (
         !bot
         || !config.custom_ping
@@ -76,18 +85,29 @@ const pingSender = () => {
         || !config.custom_ping.send_to.length
     ) return;
 
-    config.custom_ping.send_to.forEach((partner) => {
+    if (mutex.tryLock()) {
         const msg = `PING ${xid}`;
-        if (config.custom_ping.verbose) {
-            logger.verbose(`${MODULE_NAME} 21358F45: Sending custom ping`, {
-                xid,
-                partner,
-                msg,
-            });
+
+        const partnerCount = config.custom_ping.send_to.length;
+        for (let i = 0; i < partnerCount; i += 1) {
+            const partner = config.custom_ping.send_to[i];
+
+            if (config.custom_ping.verbose) {
+                logger.verbose(`${MODULE_NAME} 21358F45: Sending custom ping`, {
+                    xid,
+                    partner,
+                    msg,
+                });
+            }
+
+            bot.send(partner, msg);
+
+            // eslint-disable-next-line no-await-in-loop
+            await sleepMs(1000);
         }
 
-        bot.send(partner, msg);
-    });
+        mutex.unlock();
+    }
 };
 
 if (config.custom_ping && config.custom_ping.send_to) {
diff --git a/package-lock.json b/package-lock.json
index b31febf..08b6642 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",
+        "locks": "^0.2.2",
         "moment": "^2.29.1",
         "simple-xmpp": "^1.3.1",
         "tektrans-logger": "^1.2.2",
@@ -2313,6 +2314,11 @@
         "node": ">=4"
       }
     },
+    "node_modules/locks": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/locks/-/locks-0.2.2.tgz",
+      "integrity": "sha1-JZkz0TJ8uvD9NmL4//3jaAnYTO0="
+    },
     "node_modules/lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -5807,6 +5813,11 @@
         "path-exists": "^3.0.0"
       }
     },
+    "locks": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/locks/-/locks-0.2.2.tgz",
+      "integrity": "sha1-JZkz0TJ8uvD9NmL4//3jaAnYTO0="
+    },
     "lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
diff --git a/package.json b/package.json
index 124714b..ae607dd 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",
+    "locks": "^0.2.2",
     "moment": "^2.29.1",
     "simple-xmpp": "^1.3.1",
     "tektrans-logger": "^1.2.2",
-- 
1.9.0