evo-im.js 2.52 KB
var strftime = require('strftime');
var request = require('request');
var xmlparser = require('xml2js').parseString;
var http = require('http');
var url = require('url');

var config;
var logger;
var sendMessage;

function start(options) {
    try {
        sendMessage = options.sendMessage;
    }
    catch(e) {
        console.log('undefined send message. Exiting');
        process.exit(2);
    }

    if (options && options.config) {
        config = options.config;
    }

    if (options && options.logger) {
        logger = options.logger;
    }



    createHttpServer();
}

function formatTimestamp(ms) {
    return strftime('%F %T', new Date(ms));
}

function onMessage(sender, message, ts) {
    var opts = {
        url: config.evo_url,
        qs: {
            msg: message,
            msisdn: sender,
            smsc: config.smsc,
            ts: formatTimestamp(ts)
        }
    };

    logger.verbose("Forwarding message to evo", {request_opts: opts});
    request(opts, function(err, response, body) {
        if (err) {
            logger.warn('Error forwarding to evo: ' + err);
            return;
        }

        if (response.statusCode != 200) {
            logger.warn('HTTP Status from evo: ' + response.statusCode, {status: response.statusCode, body: body});
            return;
        }

        logger.verbose('Got response from evo', {body: body});

        xmlparser(body, function(xmlerr, parsedResponse) {
            if (xmlerr) {
                logger.verbose('Evo response not in xml format');
                return;
            }

            return;

            logger.info('Evo response in xml format', {response: parsedResponse});
            if (parsedResponse.response.text) {
                sendMessage(sender, parsedResponse.response.text[0].trim());
            }
        });
    });
}

function onHttpIncomingMessage(request, response) {
    var qs = url.parse(request.url, true).query;
    logger.verbose("onHttpIncomingMessage()", {qs: qs});

    //var destination = qs.to.replace(config.msisdn_suffix, '');
    logger.info('Sending message to ' + qs.to + ': ' + (qs.msg || qs.text));
    sendMessage(qs.to, qs.msg || qs.text);
    response.end('OK');
}

function createHttpServer() {
    logger.verbose('createHttpServer()');

    var httpServer = http.createServer(onHttpIncomingMessage);
    httpServer.listen(config.listen_port, function(){
        logger.info("HTTP server listening on " + config.listen_port);
    });
}

exports.start = start;
exports.formatTimestamp = formatTimestamp;
exports.onMessage = onMessage;