Показать сообщение отдельно
  #1 (permalink)  
Старый 29.03.2016, 07:50
Новичок на форуме
Отправить личное сообщение для stonecone Посмотреть профиль Найти все сообщения от stonecone
 
Регистрация: 29.03.2016
Сообщений: 3

помогите с асинхронными событиями nodejs+websockets+библиотечка nami
Добрый день!
Не нашел на сайте раздела для новичков, поэтому пишу сюда.
В общем задача сгенерировать звонок от оператора на астериске.
Взял nodejs + websockets + nami (https://github.com/marcelog/Nami

т.е. структура такая:

[WS-Client] --- [Node.js + WS + NAMI] --- [Asterisk AMI]

я склепал тестовый myserver.js для node и вот тут столкнулся с так сказать архитектурной проблемой
код прилагаю
var logger = require(__dirname + "/node_modules/nami/node_modules/log4js").getLogger('Nami.App');
var http = require('http');
var WebSocketServer = require('ws');
var namiLib = require(__dirname + '/node_modules/nami/src/nami.js');
var call = require('./call');
var clients = {};

var namiConfig = {
    host: '192.168.1.2',
    port: '5038',
    username: 'amiuser',
    secret: 'amipass'
};

var nami = new namiLib.Nami(namiConfig);

nami.logger.setLevel("OFF");
process.on('SIGINT', function() {
    nami.close();
    process.exit();
});

nami.on('namiConnectionClose', function (data) {
    logger.debug('Reconnecting...');
    setTimeout(function () { nami.open(); }, 5000);
});

nami.on('namiLoginIncorrect', function () {
    logger.fatal("Invalid Credentials");
    process.exit();
});

nami.on('namiEvent', function (event) {
    //logger.debug('Got Event: ' + util.inspect(event));
    //if (event.get("ActionID") !== undefined) {
        logger.debug(util.inspect(event));
    //}
    //logger.debug("hehe");
});
nami.on('namiInvalidPeer', function (data) {
    logger.fatal("Invalid AMI Salute. Not an AMI?");
    process.exit();
});

nami.on('namiConnected', function(event){
    console.log("nami connected");
});
nami.open();

var webSocketServer = new WebSocketServer.Server({
    port: 8081
});

webSocketServer.on('connection', function (ws) {
    ws.on('message', function (message) {
        msg = JSON.parse(message);
        var newcall = new call.Call(ws);
        clients[newcall.actionid] = newcall;
        if ( msg.action === "call" && phoneIsValid(msg.phonenumber) && opNumIsValid(msg.operatornumber) ) {
            var action = new namiLib.Actions.Originate();
            action.channel = "Local/" + msg.operatornumber + "@local-calls";
            action.callerid = msg.phonenumber;
            action.priority = "1";
            action.timeout = "30000";
            action.context = "callcenter";
            action.exten = msg.phonenumber;
            action.ActionID = newcall.actionid;
            action.async = "yes";
            nami.send(action, function (response) {

            });
            respmsg = {
                type: "status",
                status: "Calling " + msg.phonenumber
            };
            ws.send(JSON.stringify(respmsg));
        }
        ws.on('close', function() {
            delete clients[newcall.actionid];
        });
    });
});

var server = http.createServer(function (request, response){
    var headers = request.headers;
    var method = request.method;
    var url = request.url;
    var body = [];
    request.on('error', function (err) {
        console.error(err);
    }).on('data', function (chunk) {
        body.push(chunk);
    }).on('end', function () {
        body = Buffer.concat(body).toString();
    });

    response.on('error', function(err){
        console.error(err);
    });

    response.statusCode = 200;
    response.setHeader('Content-Type', 'application/json');

    var responseBody = {
        headers: headers,
        method: method,
        url: url,
        body: body
    };

    response.write(JSON.stringify(responseBody));
    response.end();

}).listen(8085);

function phoneIsValid(phone) {
    if ( phone ) {
        regex = /^89\d{9}$/;
        return phone.match(regex);
    }
    return false;
}

// operator number must be 1XX or 2XX
function opNumIsValid(phone) {
    if ( phone ) {
        return phone.match(/^[12]{1}[0-9]{2}$/);
    }
    return false;
}

в общем я не пойму следующее - у меня есть
webSocketServer.on('connection', function (ws) {});

и внутри я навешиваю на события действия. Прекрасно.
Также есть всевозможные
nami.on({});

в них я навешиваю действия при получении чего-то от астериска.
А как мне навешать в nami.on передать что-то в вебсокет, ведь вебсокет в отдельном объекте. В общем я похоже даже не могу правильно словами выразить )))
Как мне повешать в
nami.on('namiEvent', function(event){});

отправку в вебсокет? Фильтры я уж догадаюсь сделать.
Я не понимаю как мне связать эти два разных объекта.
Как правильно это сделать по структуре, объясните пожалуйста.
Я новичок, но не полный нуль.
Спасибо!
Ответить с цитированием