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'); const modemLocks = require('./modem-locks'); async function sleep(ms) { return new Promise((resolve) => { setTimeout(() => { resolve(); }, ms); }); } async function sendToModem(partner, msg, modem, parentXid, part) { const xid = parentXid || uniqid(); const [msgHead, msgTail] = messageSplitter(msg.trim(), Number(config.max_length) || 140); if (!msgHead) { return; } logger.info('TRANSPORT: Sending message to EVO-CP', { xid, partner, msg: msgHead, msgLength: msgHead.length, tailLength: msgTail.length, part, modem: modem.name, }); await modemLocks.lock(modem.name); try { await axios.get(modem.url || config.sender.url, { params: { to: partner, password: modem.password || config.sender.password, ts: moment().format('YYYY-MM-DD HH:mm:ss'), text: msgHead, modem: modem.name, username: modem.username || config.sender.username, }, }); } catch (e) { logger.warn('TRANSPORT: Exception on sending message to EVO-CP', { xid, partner, msgHead, modem: modem.name, e: e.message, }); } messagingClient.onIncomingMessage({ me: modem.imsi || modem.name, partner, partner_raw: partner, msg: msgHead, origin_label: modem.imsi || modem.name, origin_transport: 'SMS', origin_partner: partner, do_not_forward_to_core: true, is_outgoing: true, }); await sleep(1200); modemLocks.unlock(modem.name); if (msgTail) { await sendToModem(partner, msgTail, modem, part + 1); } } exports.send = async (partner, msg) => { if (typeof partner !== 'string' || !partner.trim()) return; if (typeof msg !== 'string' || !msg.trim()) return; if (msg.trim().search(/PROSES$/) >= 0) return; const xid = uniqid(); logger.info('TRANSPORT: Got CORE message to forward to EVO-CP', { xid, partner, msg, }); const modem = modems.randomModem(); if (!modem) { logger.warn('TRANSPORT: Not sending message to EVO-CP because of no available modem', { xid, partner, msg, }); return; } await sendToModem(partner, msg.trim(), modem, xid, 1); };