Добрый день!
Не нашел на сайте раздела для новичков, поэтому пишу сюда.
В общем задача сгенерировать звонок от оператора на астериске.
Взял 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){});
отправку в вебсокет? Фильтры я уж догадаюсь сделать.
Я не понимаю как мне связать эти два разных объекта.
Как правильно это сделать по структуре, объясните пожалуйста.
Я новичок, но не полный нуль.
Спасибо!