BelirafoN/asterisk-ami-event-utils

View on GitHub
lib/rawToObject.js

Summary

Maintainability
A
25 mins
Test Coverage
/**
 * Developer: Alex Voronyansky <belirafon@gmail.com>
 * Date: 14.04.2016
 * Time: 18:32
 */

"use strict";

const bufferToString = require('./rawToString');
const CRLF = '\r\n';
const ROW_SPLITTER = ':';
const COMMAND_END = '--END COMMAND--';

/**
 * 
 * @param buffer
 * @returns {*}
 */
module.exports = function(buffer){
    if(!buffer){ return {}; }

    let rawStr = bufferToString(buffer);

    if(!/^Event|Action:/i.test(rawStr)){
        rawStr = trimHello(rawStr);

        if(!/^Response:/i.test(rawStr)){
            return {
                Response: null,
                $content: rawStr
            };
        }
        return respToObj(rawStr);
    }
    return rawStr.split(CRLF).reduce(rowReducer, {});
};

/**
 *
 * @param rawPackageStr
 * @returns {{}}
 */
function respToObj(rawPackageStr){
    let result = {},
        rows = rawPackageStr.split(CRLF),
        i = 0;

    for(i; i < rows.length; i++){
        if(!/^[a-z\d_-]+?:/i.test(rows[i])){ break; }
        result = rowReducer(result, rows[i]);
    }

    if(i < rows.length){
        let content = rows.slice(i).join(CRLF),
            indexOfEnd = content.indexOf(COMMAND_END);

        if(~indexOfEnd){
            content = bufferToString(content.substr(0, indexOfEnd));
        }
        result['$content'] = content;
    }
    return result;
}

/**
 *
 * @param resultObj
 * @param row
 * @returns {*}
 */
function rowReducer(resultObj, row){
    let pair = row.split(ROW_SPLITTER);

    if(pair.length > 1){
        resultObj[pair[0].trim()] = pair.slice(1).join(ROW_SPLITTER).trim();
    }
    return resultObj;
}

/**
 *
 * @param rawStr
 * @returns {*}
 */
function trimHello(rawStr){
    if(/^Asterisk/i.test(rawStr)){
        return rawStr.replace(/^Asterisk.+?\r\n/i, '', rawStr);
    }
    return rawStr;
}