From 173e452e529aec2ed4692dfbbccd0b97f3e464eb Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Thu, 5 Dec 2019 16:45:14 +0700
Subject: [PATCH] Autosplit

---
 lib/message-splitter.js |  4 ++++
 lib/transport.js        | 48 +++++++++++++++++++++++++++++++++++-------------
 package-lock.json       | 19 +++++++++++++------
 package.json            |  3 ++-
 4 files changed, 54 insertions(+), 20 deletions(-)
 create mode 100644 lib/message-splitter.js

diff --git a/lib/message-splitter.js b/lib/message-splitter.js
new file mode 100644
index 0000000..d28140c
--- /dev/null
+++ b/lib/message-splitter.js
@@ -0,0 +1,4 @@
+module.exports = (msg, maxLength) => [
+    msg.trim().slice(0, maxLength).trim(),
+    msg.trim().slice(maxLength).trim(),
+];
diff --git a/lib/transport.js b/lib/transport.js
index 07679e1..a4bb4ee 100644
--- a/lib/transport.js
+++ b/lib/transport.js
@@ -1,28 +1,26 @@
 const axios = require('axios');
 const moment = require('moment');
+const uniqid = require('uniqid');
 
 const config = require('komodo-sdk/config');
 const logger = require('komodo-sdk/logger');
 const messagingClient = require('komodo-center-messaging-client-lib');
 
 const modems = require('./modems');
+const messageSplitter = require('./message-splitter');
 
-exports.send = async (partner, msg) => {
-    if (typeof partner !== 'string' || !partner.trim()) return;
-    if (typeof msg !== 'string' || !msg.trim()) return;
+async function sendToModem(partner, msg, modem, parentXid) {
+    const xid = parentXid || uniqid();
 
-    const modem = modems.randomModem();
-    if (!modem) {
-        logger.warn('TRANSPORT: Not sending message to EVO-CP because of no available modem', {
-            partner,
-            msg,
-        });
+    const [msgHead, msgTail] = messageSplitter(msg.trim(), 160);
+    if (msgHead) {
         return;
     }
 
     logger.info('TRANSPORT: Sending message to EVO-CP', {
+        xid,
         partner,
-        msg,
+        msgHead,
         modem: modem.name,
     });
 
@@ -32,15 +30,16 @@ exports.send = async (partner, msg) => {
                 to: partner,
                 password: config.sender.password,
                 ts: moment().format('YYYY-MM-DD HH:mm:ss'),
-                text: msg.trim(),
+                text: msgHead,
                 modem: modem.name,
                 username: config.sender.username,
             },
         });
     } catch (e) {
         logger.warn('TRANSPORT: Exception on sending message to EVO-CP', {
+            xid,
             partner,
-            msg,
+            msgHead,
             e: e.message,
         });
     }
@@ -49,11 +48,34 @@ exports.send = async (partner, msg) => {
         me: modem.imsi || modem.name,
         partner,
         partner_raw: partner,
-        msg: msg.trim(),
+        msg: msgHead,
         origin_label: modem.imsi || modem.name,
         origin_transport: 'SMS',
         origin_partner: partner,
         do_not_forward_to_core: true,
         is_outgoing: true,
     });
+
+    if (msgTail) {
+        sendToModem(partner, msgTail, modem);
+    }
+}
+
+exports.send = async (partner, msg) => {
+    if (typeof partner !== 'string' || !partner.trim()) return;
+    if (typeof msg !== 'string' || !msg.trim()) return;
+
+    const xid = uniqid();
+
+    const modem = modems.randomModem();
+    if (!modem) {
+        logger.warn('TRANSPORT: Not sending message to EVO-CP because of no available modem', {
+            xid,
+            partner,
+            msg,
+        });
+        return;
+    }
+
+    sendToModem(partner, msg.trim(), modem, xid);
 };
diff --git a/package-lock.json b/package-lock.json
index b6ac25a..d431cb4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2653,6 +2653,16 @@
         "winston": "^3.2.1",
         "winston-circular-buffer": "^1.0.0",
         "winston-daily-rotate-file": "^3.10.0"
+      },
+      "dependencies": {
+        "uniqid": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz",
+          "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=",
+          "requires": {
+            "macaddress": "^0.2.8"
+          }
+        }
       }
     },
     "kuler": {
@@ -4547,12 +4557,9 @@
       }
     },
     "uniqid": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz",
-      "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=",
-      "requires": {
-        "macaddress": "^0.2.8"
-      }
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.2.0.tgz",
+      "integrity": "sha512-LH8zsvwJ/GL6YtNfSOmMCrI9piraAUjBfw2MCvleNE6a4pVKJwXjG2+HWhkVeFcSg+nmaPKbMrMOoxwQluZ1Mg=="
     },
     "unpipe": {
       "version": "1.0.0",
diff --git a/package.json b/package.json
index a6b6165..eda1e30 100644
--- a/package.json
+++ b/package.json
@@ -24,7 +24,8 @@
     "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",
-    "moment": "^2.24.0"
+    "moment": "^2.24.0",
+    "uniqid": "^5.2.0"
   },
   "devDependencies": {
     "eslint": "^6.7.2",
-- 
1.9.0