Skip to content

Commit

Permalink
use ding-dong and promises
Browse files Browse the repository at this point in the history
  • Loading branch information
antirek committed Jun 15, 2015
1 parent 339c38a commit 65a8036
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 167 deletions.
5 changes: 1 addition & 4 deletions examples/config.js
@@ -1,5 +1,5 @@
module.exports = {
port: 3010,
port: 3000,
mongo: {
connectionString: 'mongodb://localhost/regions',
collection: 'regions'
Expand All @@ -14,9 +14,6 @@ module.exports = {
console: {
colorize: true
},
syslog: {
host: 'localhost'
},
file: {
filename: '/var/log/agi-number-archer.log',
json: false
Expand Down
7 changes: 3 additions & 4 deletions index.js
@@ -1,4 +1,4 @@
var dingDong = require('ding-dong');
var AGIServer = require('ding-dong');
var mongoose = require('mongoose');

var ResourceSchema = require('./lib/resource');
Expand All @@ -19,9 +19,8 @@ var Server = function (config) {

mongoose.connect(config.mongo.connectionString);

dingDong
.createServer(handler.handle)
.listen(config.port);
var agiServer = AGIServer(handler.handle);
agiServer.start(config.port);

logger.info("server started");
};
Expand Down
77 changes: 14 additions & 63 deletions lib/handler.js
Expand Up @@ -2,56 +2,6 @@

var Q = require('q');

function AgiContextPromiseWrapper(context) {
this.on = function (eventName) {
var defer = Q.defer();
context.on(eventName, function (result) {
defer.resolve(result);
});
return defer.promise;
};
this.answer = function () {
var defer = Q.defer();
context.answer(function (err) {
if (err) {
defer.reject(err);
} else {
defer.resolve();
}
});
return defer.promise;
};
this.streamFile = function (filename, acceptDigits) {
var defer = Q.defer();
context.streamFile(filename, acceptDigits, function (err) {
if (err) {
defer.reject(err);
} else {
defer.resolve();
}
});
return defer.promise;
};
this.setVariable = function (varName, value) {
var defer = Q.defer();
context.setVariable(varName, value, function (err) {
if (err) {
defer.reject(err);
} else {
defer.resolve();
}
});
return defer.promise;
};
this.end = function () {
var defer = Q.defer();
context.end(function () {
defer.resolve();
});
return defer.promise;
}
}

function Handler(finder, logger, config) {

var counter = 1;
Expand All @@ -69,12 +19,6 @@ function Handler(finder, logger, config) {

var number;
var callId = getCallId();
var contextWrapper = new AgiContextPromiseWrapper(context);

function extractAgiResultVarName(agiVariables) {
number = agiVariables[config.agiParamName];
log('number from dialplan', number);
};

function log(message, object) {
var module = 'handler';
Expand All @@ -84,12 +28,19 @@ function Handler(finder, logger, config) {
logger.info(module, callId, message);
}
};

function extractAgiResultVarName(agiVariables) {

number = agiVariables[config.agiParamName];
log('number from dialplan', number);
return Q.resolve();
};

function answer() {
return contextWrapper.answer()
return context.answer()
.then(function () {
if (config.beep) {
return contextWrapper.streamFile('beep', '#');
return context.streamFile('beep', '#');
}
});
};
Expand All @@ -100,25 +51,25 @@ function Handler(finder, logger, config) {

function setAgiResultVariable(codes) {
log('codes', codes);
return contextWrapper
return context
.setVariable(config.resultDialPlanVarName1, codes[0])
.then(function () {
contextWrapper.setVariable(config.resultDialPlanVarName2, codes[1])
context.setVariable(config.resultDialPlanVarName2, codes[1])
});
};

function end() {
log('end');
return contextWrapper.end();
return context.end();
};

function processFail(err) {
log('fail', err);
return contextWrapper.streamFile('invalid', '#')
return context.streamFile('invalid', '#')
.then(end);
};

contextWrapper.on('variables')
return context.onEvent('variables')
.then(extractAgiResultVarName)
.then(answer)
.then(findCode)
Expand Down
6 changes: 0 additions & 6 deletions lib/logger.js
@@ -1,7 +1,6 @@
'use strict';

var winston = require('winston');
require('winston-syslog').Syslog;

function Logger (config) {
if(!config) config = {};
Expand All @@ -17,11 +16,6 @@ function Logger (config) {
logger.add(winston.transports.Console, config.console);
};

if (config.syslog) {
config.syslog['timestamp'] = config.syslog['timestamp'] || timeformat;
logger.add(winston.transports.Syslog, config.syslog);
};

if (config.file) {
config.file['timestamp'] = config.file['timestamp'] || timeformat;
logger.add(winston.transports.File, config.file);
Expand Down
9 changes: 4 additions & 5 deletions package.json
@@ -1,14 +1,13 @@
{
"name": "agi-number-archer",
"version": "0.0.5",
"version": "0.0.6",
"description": "AGI server for find concordance of number and region code",
"main": "index.js",
"dependencies": {
"ding-dong": "^0.0.8",
"mongoose": "^3.8.23",
"ding-dong": "0.1.1",
"mongoose": "^4.0.3",
"q": "^1.1.2",
"winston": "^0.9.0",
"winston-syslog": "^1.0.0"
"winston": "^0.9.0"
},
"devDependencies": {
"jasmine": "^2.2.1"
Expand Down
117 changes: 32 additions & 85 deletions spec/HandlerSpec.js
Expand Up @@ -29,94 +29,41 @@ describe('Handler', function () {
}
};

beforeEach(function () {
context = {
on: function (eventName, callback) {
callback({agiParam: expectedNumber});
},
answer: function (callback) {
callback();
},
streamFile: function (filename, digits, callback) {
callback();
},
setVariable: function (variableName, value, callback) {
callback();
},
end: function (callback) {
callback();
}
};
handler = new Handler(finder, logger, config);
});
it('should use context "variables" event', function (done) {
context.on = function (eventName) {
expect(eventName).toBe('variables');
done();
};
handler.handle(context);
});
it('should use context answer method', function (done) {
context.answer = function () {
done();
var Context = function() {

var onEvent = function (event) {
expect(event).toBe('variables');
return Q.resolve({agiParam: expectedNumber});
};
handler.handle(context);
});
it('should call context streamFile if beep option is set', function (done) {
config.beep = true;
context.streamFile = function (filename, acceptDigits) {
expect(filename).toBe('beep');
expect(acceptDigits).toBe('#');
done();

var answer = function () {
return Q.resolve();
};
handler.handle(context);
});
it("shouldn't call context streamFile if beep option is not set", function (done) {
config.beep = false;
context.streamFile = function (filename, digits, callback) {
callback();
fail();

var setVariable = function (variable, value) {
expect([24, 5]).toEqual(jasmine.arrayContaining([value]));
return Q.resolve();
};
handler.handle(context).then(function () {
done();
});
});
it('should call context setVariable with expected region code', function (done) {
var expectedAgiVarName = 'testAgiVar';
config.resultDialPlanVarName1 = expectedAgiVarName;
context.setVariable = function (varName, value) {
expect(varName).toBe(expectedAgiVarName);
expect(value).toBe(expectedRegionCode);
done();

var streamFile = function (filename, digits) {
return Q.resolve();
};
handler.handle(context);
});
it('should call context end', function (done) {
context.end = function () {
done();

return {
answer: answer,
onEvent: onEvent,
setVariable: setVariable,
streamFile: streamFile
};
handler.handle(context);
});
describe('on fails', function () {
beforeEach(function () {
context.answer = function (callback) {
callback(new Error('test error'));
}
});
it('should call context streamFile', function (done) {
context.streamFile = function (filename, digits) {
expect(filename).toBe('invalid');
expect(digits).toBe('#');
done();
};
handler.handle(context);
});
it('should call context end', function (done) {
context.end = function () {
done();
};
handler.handle(context);
});
};

it('standard flow', function (done) {

context = new Context();
handler = new Handler(finder, logger, config);

handler.handle(context)
.finally(done);
});
})
;
});

0 comments on commit 65a8036

Please sign in to comment.