transport.js 3.21 KB
"use strict";

const url = require('url');
const request = require('request');
const uuidv4 = require('uuid/v4');
const moment = require('moment');

const config = require('komodo-sdk/config');
const logger = require('komodo-sdk/logger');

const modemSelect = require('./modemSelect');
const modems = require('./modems2');
const partnerLastSeen = require('./partner-last-seen');
const history = require('./history');

function _send(destinationNumber, msg, handlerName) {

    if (msg.length > 160) {
        const newMsg = msg.slice(0, 160);
        const remainingMsg = msg.slice(160);

        _send(destinationNumber, newMsg, handlerName);
        setTimeout(() => {
            _send(destinationNumber, remainingMsg, handlerName);
        }, 2000);

        return;
    }

    const modem = modems.get('name', handlerName);
    if (!modem) {
        logger.warn('Not knowing modem to use. Ignoring message', { destination_number: destinationNumber, msg: msg, handler_name: handlerName });
        return;
    }

    if (!modem.reportIp || !modem.reportPort || !modem.reportApikey) {
        logger.warn('Invalid modem configuration', { modem });
        return;
    }

    const reqId = uuidv4();

    history.push({
        ts: moment().format('YYYY-MM-DD HH:mm:ss'), 
        modem: {
            name: handlerName,
        },
        direction: 'OUTGOING',
        partner: destinationNumber,
        message: msg,
    });

    const requestOptions = {
        url: url.format({
            protocol: 'http',
            hostname: modem.reportIp,
            port: modem.reportPort,
            pathname: modem.reportPathSms,
        }),
        qs: {
            msg: msg,
            number: destinationNumber,
            reqid: reqId,
            apikey: modem.reportApikey,
        }
    }

    logger.info('Sending message to modem handler', { req_id: reqId, destination_number: destinationNumber, msg: msg, msg_length: msg.length, handler_name: handlerName });
    request(requestOptions, function(err, res, body) {
        if (err) {
            logger.warn('Error requesting to modem handler. ' + err.toString(), { req_id: reqId, handler_name: handlerName });
            
        }
        else if (res.statusCode != 200) {
            logger.warn('Modem handler not responding with HTTP status code 200.', { http_status_code: res.statusCode, req_id: reqId, handler_name: handlerName });
        }
        else {
            logger.verbose('Message sent to handler', { req_id: reqId, handler_name: handlerName, response_body: body });
        }
    })

}

async function send(partner, msg) {
    if (!partner) return;

    if (typeof msg !== 'string') {
        logger.warn('Message to send is not a string, ignoring message');
        return;
    }

    msg = msg.trim();
    if (!msg) return;

    const destinationNumber = modemSelect.removeSuffixFromNumber(partner, config);

    // logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin });
    let handlerName = await partnerLastSeen.get(destinationNumber) ;

    if (!handlerName) {
        logger.warn(`Unknown handler for sending message to partner`, { partner, destinationNumber });
        return;
    }

    _send(destinationNumber, msg, handlerName);
}

exports.send = send;