UNPKG

3.46 kBJavaScriptView Raw
1'use strict';
2
3var Q = require('q');
4
5function AgiContextPromiseWrapper(context) {
6 this.on = function (eventName) {
7 var defer = Q.defer();
8 context.on(eventName, function (result) {
9 defer.resolve(result);
10 });
11 return defer.promise;
12 };
13 this.answer = function () {
14 var defer = Q.defer();
15 context.answer(function (err) {
16 if (err) {
17 defer.reject(err);
18 } else {
19 defer.resolve();
20 }
21 });
22 return defer.promise;
23 };
24 this.streamFile = function (filename, acceptDigits) {
25 var defer = Q.defer();
26 context.streamFile(filename, acceptDigits, function (err) {
27 if (err) {
28 defer.reject(err);
29 } else {
30 defer.resolve();
31 }
32 });
33 return defer.promise;
34 };
35 this.setVariable = function (varName, value) {
36 var defer = Q.defer();
37 context.setVariable(varName, value, function (err) {
38 if (err) {
39 defer.reject(err);
40 } else {
41 defer.resolve();
42 }
43 });
44 return defer.promise;
45 };
46 this.end = function () {
47 var defer = Q.defer();
48 context.end(function () {
49 defer.resolve();
50 });
51 return defer.promise;
52 }
53}
54
55function Handler(finder, logger, config) {
56
57 var counter = 1;
58
59 var getCallId = function () {
60 var length = 7;
61 //magic from https://gist.github.com/aemkei/1180489#file-index-js
62 var q = function (a, b) {
63 return([1e15]+a).slice(-b)
64 };
65 return q(counter++, length);
66 }
67
68 this.handle = function (context) {
69
70 var number;
71 var callId = getCallId();
72 var contextWrapper = new AgiContextPromiseWrapper(context);
73
74 function extractAgiResultVarName(agiVariables) {
75 number = agiVariables[config.agiParamName];
76 log('number from dialplan', number);
77 };
78
79 function log(message, object) {
80 var module = 'handler';
81 if (object) {
82 logger.info(module, callId, message, object);
83 } else {
84 logger.info(module, callId, message);
85 }
86 };
87
88 function answer() {
89 return contextWrapper.answer()
90 .then(function () {
91 if (config.beep) {
92 return contextWrapper.streamFile('beep', '#');
93 }
94 });
95 };
96
97 function findCode() {
98 return finder.findCodeForNumber(number);
99 };
100
101 function setAgiResultVariable(regionCode) {
102 log('regionCode', regionCode);
103 return contextWrapper.setVariable(
104 config.resultDialPlanVarName, regionCode
105 );
106 };
107
108 function end() {
109 log('end');
110 return contextWrapper.end();
111 };
112
113 function processFail() {
114 log('fail');
115 return contextWrapper.streamFile('invalid', '#')
116 .then(end);
117 };
118
119 return contextWrapper.on('variables')
120 .then(extractAgiResultVarName)
121 .then(answer)
122 .then(findCode)
123 .then(setAgiResultVariable)
124 .then(end)
125 .fail(processFail);
126 };
127
128};
129
130module.exports = Handler;
\No newline at end of file