From 2cf4686d2ba94aed463549650d8a492736aa6c59 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Thu, 5 Dec 2019 17:21:51 +0700
Subject: [PATCH] Lock modem for 2 secs

---
 lib/modem-locks.js | 21 +++++++++++++++++++++
 lib/transport.js   | 14 ++++++++++++++
 package-lock.json  |  5 +++++
 package.json       |  1 +
 4 files changed, 41 insertions(+)
 create mode 100644 lib/modem-locks.js

diff --git a/lib/modem-locks.js b/lib/modem-locks.js
new file mode 100644
index 0000000..0df72ce
--- /dev/null
+++ b/lib/modem-locks.js
@@ -0,0 +1,21 @@
+const locks = require('locks');
+
+const mutexes = {};
+
+exports.lock = (name) => new Promise((resolve) => {
+    if (!mutexes[name]) {
+        mutexes[name] = locks.createMutex();
+    }
+
+    mutexes[name].lock(() => {
+        resolve(true);
+    });
+});
+
+exports.unlock = (name) => {
+    try {
+        if (mutexes[name]) mutexes[name].unlock();
+    } catch (e) {
+        //
+    }
+};
diff --git a/lib/transport.js b/lib/transport.js
index c015484..06050e0 100644
--- a/lib/transport.js
+++ b/lib/transport.js
@@ -8,6 +8,15 @@ const messagingClient = require('komodo-center-messaging-client-lib');
 
 const modems = require('./modems');
 const messageSplitter = require('./message-splitter');
+const modemLocks = require('./modem-locks');
+
+async function sleep(ms) {
+    return new Promise((resolve) => {
+        setTimeout(() => {
+            resolve();
+        }, ms);
+    });
+}
 
 async function sendToModem(partner, msg, modem, parentXid) {
     const xid = parentXid || uniqid();
@@ -24,6 +33,8 @@ async function sendToModem(partner, msg, modem, parentXid) {
         modem: modem.name,
     });
 
+    await modemLocks.lock(modem.name);
+
     try {
         await axios.get(config.sender.url, {
             params: {
@@ -56,6 +67,9 @@ async function sendToModem(partner, msg, modem, parentXid) {
         is_outgoing: true,
     });
 
+    await sleep(2000);
+    modemLocks.unlock(modem.name);
+
     if (msgTail) {
         await sendToModem(partner, msgTail, modem);
     }
diff --git a/package-lock.json b/package-lock.json
index d431cb4..f06d11d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2713,6 +2713,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.15",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
diff --git a/package.json b/package.json
index eda1e30..17daa5e 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
     "express": "^4.17.1",
     "komodo-center-messaging-client-lib": "git+http://gitlab.kodesumber.com/komodo/komodo-center-messaging-client-lib.git",
     "komodo-sdk": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git",
+    "locks": "^0.2.2",
     "moment": "^2.24.0",
     "uniqid": "^5.2.0"
   },
-- 
1.9.0