Commit 800050a69524c46f3fce8467d19ee8e7b1c11b6e

Authored by Adhidarma Hadiwinoto
1 parent 56d20726bb
Exists in master

log on error

Showing 1 changed file with 1 additions and 1 deletions Inline Diff

1 var xmlrpc = require('xmlrpc'); 1 var xmlrpc = require('xmlrpc');
2 var url = require('url'); 2 var url = require('url');
3 var math = require('mathjs'); 3 var math = require('mathjs');
4 var winston = require('winston'); 4 var winston = require('winston');
5 var redis = require('redis'); 5 var redis = require('redis');
6 var resendDelay = require('sate24/resend-delay.js'); 6 var resendDelay = require('sate24/resend-delay.js');
7 var LRU = require('lru-cache'); 7 var LRU = require('lru-cache');
8 8
9 var aaa; 9 var aaa;
10 var logger; 10 var logger;
11 var config; 11 var config;
12 var _callbackReport; 12 var _callbackReport;
13 var redisClient; 13 var redisClient;
14 14
15 var taskHistory = LRU({max: 500, maxAge: 1000 * 3600 * 2}); 15 var taskHistory = LRU({max: 500, maxAge: 1000 * 3600 * 2});
16 16
17 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 17 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
18 18
19 function callbackReport(requestId, responseCode, message, dontResendDelay) { 19 function callbackReport(requestId, responseCode, message, dontResendDelay) {
20 if (responseCode != '68' || dontResendDelay) { 20 if (responseCode != '68' || dontResendDelay) {
21 resendDelay.cancel(requestId); 21 resendDelay.cancel(requestId);
22 } else { 22 } else {
23 getTaskFromHistory(requestId, function(err, archivedTask) { 23 getTaskFromHistory(requestId, function(err, archivedTask) {
24 if (archivedTask) { 24 if (archivedTask) {
25 logger.verbose('DEBUG', {archivedTask: archivedTask}); 25 logger.verbose('DEBUG', {archivedTask: archivedTask});
26 resendDelay.register(archivedTask); 26 resendDelay.register(archivedTask);
27 } 27 }
28 }); 28 });
29 } 29 }
30 30
31 _callbackReport(requestId, responseCode, message); 31 _callbackReport(requestId, responseCode, message);
32 } 32 }
33 33
34 function createRedisClient(host, port) { 34 function createRedisClient(host, port) {
35 if (!host && !port) { 35 if (!host && !port) {
36 logger.info('Not creating redis client because unspecified host or port'); 36 logger.info('Not creating redis client because unspecified host or port');
37 return; 37 return;
38 } 38 }
39 39
40 try { 40 try {
41 redisClient = redis.createClient(port, host); 41 redisClient = redis.createClient(port, host);
42 } catch(err) { 42 } catch(err) {
43 logger.warn("Error creating redis client to " + host + ':' + port); 43 logger.warn("Error creating redis client to " + host + ':' + port);
44 } 44 }
45 } 45 }
46 46
47 function topupRequest(task) { 47 function topupRequest(task) {
48 aaa.insertTaskToMongoDb(task); 48 aaa.insertTaskToMongoDb(task);
49 49
50 getTaskFromHistory(task, function(err, archivedTask) { 50 getTaskFromHistory(task, function(err, archivedTask) {
51 putTaskToHistory(task); 51 putTaskToHistory(task);
52 52
53 if (archivedTask) { 53 if (archivedTask) {
54 logger.info('Task has been executed before, going to checkStatus', {task: task, archivedTask: archivedTask}); 54 logger.info('Task has been executed before, going to checkStatus', {task: task, archivedTask: archivedTask});
55 checkStatus(task); 55 checkStatus(task);
56 } else { 56 } else {
57 _topupRequest(task); 57 _topupRequest(task);
58 } 58 }
59 }); 59 });
60 } 60 }
61 61
62 function _topupRequest(task) { 62 function _topupRequest(task) {
63 63
64 if (!aaa.isTodayTrx(task)) { 64 if (!aaa.isTodayTrx(task)) {
65 callbackReport(task.requestId, '68', 'Terdeteksi transaksi beda hari, batal kirim ke supplier. Silahkan cek webreport', true); 65 callbackReport(task.requestId, '68', 'Terdeteksi transaksi beda hari, batal kirim ke supplier. Silahkan cek webreport', true);
66 return; 66 return;
67 } 67 }
68 68
69 var partnerUrl = url.parse(config.h2h_out.partner); 69 var partnerUrl = url.parse(config.h2h_out.partner);
70 var clientOptions = { 70 var clientOptions = {
71 host: partnerUrl.hostname, 71 host: partnerUrl.hostname,
72 port: partnerUrl.port, 72 port: partnerUrl.port,
73 path: partnerUrl.pathname 73 path: partnerUrl.pathname
74 }; 74 };
75 75
76 var client; 76 var client;
77 if (partnerUrl.protocol == 'https:') { 77 if (partnerUrl.protocol == 'https:') {
78 client = xmlrpc.createSecureClient(clientOptions); 78 client = xmlrpc.createSecureClient(clientOptions);
79 } else { 79 } else {
80 client = xmlrpc.createClient(clientOptions); 80 client = xmlrpc.createClient(clientOptions);
81 } 81 }
82 82
83 var params = { 83 var params = {
84 MSISDN: config.h2h_out.userid, 84 MSISDN: config.h2h_out.userid,
85 REQUESTID: task['requestId'], 85 REQUESTID: task['requestId'],
86 PIN: config.h2h_out.password, 86 PIN: config.h2h_out.password,
87 NOHP: task['destination'], 87 NOHP: task['destination'],
88 NOM: task['remoteProduct'] 88 NOM: task['remoteProduct']
89 }; 89 };
90 90
91 var methodName = 'topUpRequest'; 91 var methodName = 'topUpRequest';
92 logger.info('Preparing XMLRPC request', {methodname: methodName, params: params, partnerUrl: partnerUrl.href}); 92 logger.info('Preparing XMLRPC request', {methodname: methodName, params: params, partnerUrl: partnerUrl.href});
93 93
94 client.methodCall(methodName, [ params ], function (error, value) { 94 client.methodCall(methodName, [ params ], function (error, value) {
95 95
96 // Results of the method response 96 // Results of the method response
97 if (error && (error.code == 'ECONNREFUSED' || error.code == 'EHOSTUNREACH')) { 97 if (error && (error.code == 'ECONNREFUSED' || error.code == 'EHOSTUNREACH')) {
98 98
99 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error}); 99 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], err: error});
100 callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier: ' + error); 100 callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier: ' + error);
101 return; 101 return;
102 } 102 }
103 103
104 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value}); 104 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value});
105 105
106 if (value['RESPONSECODE'] == '94') { 106 if (value['RESPONSECODE'] == '94') {
107 logger.info('Change RC 94 to 68'); 107 logger.info('Change RC 94 to 68');
108 value['RESPONSECODE'] = '68'; 108 value['RESPONSECODE'] = '68';
109 } 109 }
110 110
111 if (value['RESPONSECODE'] == '00' && value['SN'] && value['SN'].trim()) { 111 if (value['RESPONSECODE'] == '00' && value['SN'] && value['SN'].trim()) {
112 value['MESSAGE'] = 'SN=' + value['SN'].trim() + '; ' + value['MESSAGE']; 112 value['MESSAGE'] = 'SN=' + value['SN'].trim() + '; ' + value['MESSAGE'];
113 } 113 }
114 else if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 114 else if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
115 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 115 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
116 } 116 }
117 117
118 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 118 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
119 }); 119 });
120 } 120 }
121 121
122 function createServer() { 122 function createServer() {
123 123
124 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port); 124 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
125 var serverOptions = { 125 var serverOptions = {
126 port: config.h2h_out.listen_port 126 port: config.h2h_out.listen_port
127 }; 127 };
128 128
129 var server = xmlrpc.createServer(serverOptions); 129 var server = xmlrpc.createServer(serverOptions);
130 130
131 server.on('NotFound', function (method, params) { 131 server.on('NotFound', function (method, params) {
132 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params}); 132 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
133 }); 133 });
134 134
135 server.on('topUpReport', function (err, params, callback) { 135 server.on('topUpReport', function (err, params, callback) {
136 136
137 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params}); 137 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
138 138
139 var paramscount = params.length; 139 var paramscount = params.length;
140 for (var i = 0; i < paramscount; i++) { 140 for (var i = 0; i < paramscount; i++) {
141 var value = params[i]; 141 var value = params[i];
142 142
143 if (value['RESPONSECODE'] == '94') { 143 if (value['RESPONSECODE'] == '94') {
144 logger.info('Change RC 94 to 68'); 144 logger.info('Change RC 94 to 68');
145 value['RESPONSECODE'] = '68'; 145 value['RESPONSECODE'] = '68';
146 } 146 }
147 147
148 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 148 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
149 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 149 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
150 } 150 }
151 151
152 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 152 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
153 } 153 }
154 154
155 callback(null, 'ACK REPORT OK'); 155 callback(null, 'ACK REPORT OK');
156 }) 156 })
157 157
158 } 158 }
159 159
160 function getBalanceFromMessage(message, balance_regex) { 160 function getBalanceFromMessage(message, balance_regex) {
161 if (!balance_regex) { 161 if (!balance_regex) {
162 if (config && config.globals && config.globals.balance_regex) { 162 if (config && config.globals && config.globals.balance_regex) {
163 balance_regex = config.globals.balance_regex; 163 balance_regex = config.globals.balance_regex;
164 } 164 }
165 } 165 }
166 166
167 if (!balance_regex) { 167 if (!balance_regex) {
168 return; 168 return;
169 } 169 }
170 170
171 try { 171 try {
172 var re = new RegExp(balance_regex); 172 var re = new RegExp(balance_regex);
173 var matches = message.match(re); 173 var matches = message.match(re);
174 174
175 var result = matches[1]; 175 var result = matches[1];
176 result = result.replace(/\./g, ''); 176 result = result.replace(/\./g, '');
177 result = result.replace(/,/g, ''); 177 result = result.replace(/,/g, '');
178 178
179 179
180 return Number(result); 180 return Number(result);
181 } 181 }
182 catch(err) { 182 catch(err) {
183 return; 183 return;
184 } 184 }
185 } 185 }
186 186
187 function updateBalance(message) { 187 function updateBalance(message) {
188 var balance = getBalanceFromMessage(message); 188 var balance = getBalanceFromMessage(message);
189 if (balance) { 189 if (balance) {
190 logger.info('Balance: ' + balance); 190 logger.info('Balance: ' + balance);
191 aaa.updateBalance(balance); 191 aaa.updateBalance(balance);
192 } 192 }
193 } 193 }
194 194
195 function checkStatus(task) { 195 function checkStatus(task) {
196 var partnerUrl = url.parse(config.h2h_out.partner); 196 var partnerUrl = url.parse(config.h2h_out.partner);
197 var clientOptions = { 197 var clientOptions = {
198 host: partnerUrl.hostname 198 host: partnerUrl.hostname
199 , port: partnerUrl.port 199 , port: partnerUrl.port
200 , path: partnerUrl.pathname 200 , path: partnerUrl.pathname
201 }; 201 };
202 logger.info('XMLRPC client options:'); 202 logger.info('XMLRPC client options:');
203 logger.info(clientOptions); 203 logger.info(clientOptions);
204 204
205 var client; 205 var client;
206 if (partnerUrl.protocol == 'https:') { 206 if (partnerUrl.protocol == 'https:') {
207 client = xmlrpc.createSecureClient(clientOptions); 207 client = xmlrpc.createSecureClient(clientOptions);
208 } else { 208 } else {
209 client = xmlrpc.createClient(clientOptions); 209 client = xmlrpc.createClient(clientOptions);
210 } 210 }
211 211
212 var methodName = 'topUpInquiry'; 212 var methodName = 'topUpInquiry';
213 213
214 var params = { 214 var params = {
215 REQUESTID: task['requestId'], 215 REQUESTID: task['requestId'],
216 MSISDN: config.h2h_out.userid, 216 MSISDN: config.h2h_out.userid,
217 PIN: config.h2h_out.password, 217 PIN: config.h2h_out.password,
218 NOHP: task['destination'] 218 NOHP: task['destination']
219 }; 219 };
220 220
221 logger.info('Requesting topUpInquiry', {params: params}); 221 logger.info('Requesting topUpInquiry', {params: params});
222 222
223 client.methodCall(methodName, [ params ], function (error, value) { 223 client.methodCall(methodName, [ params ], function (error, value) {
224 // Results of the method response 224 // Results of the method response
225 if (error) { 225 if (error) {
226 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params}); 226 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params});
227 callbackReport(task.requestId, '68', 'Error requesting topUpInquiry: ' + error); 227 callbackReport(task.requestId, '68', 'Error requesting topUpInquiry: ' + error);
228 return; 228 return;
229 } 229 }
230 logger.info('Method response for \'' + methodName, {response: value}); 230 logger.info('Method response for \'' + methodName, {response: value});
231 231
232 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE']); 232 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE']);
233 }); 233 });
234 } 234 }
235 235
236 function start(options) { 236 function start(options) {
237 if (!options) { 237 if (!options) {
238 console.log('Undefined options, terminating....'); 238 console.log('Undefined options, terminating....');
239 process.exit(1); 239 process.exit(1);
240 } 240 }
241 241
242 if (options.config) { 242 if (options.config) {
243 config = options.config; 243 config = options.config;
244 } else { 244 } else {
245 console.log('Undefined options.config, terminating....') 245 console.log('Undefined options.config, terminating....')
246 process.exit(1); 246 process.exit(1);
247 } 247 }
248 248
249 if (options.aaa) { 249 if (options.aaa) {
250 aaa = options.aaa; 250 aaa = options.aaa;
251 _callbackReport = options.aaa.callbackReportWithPushToMongoDb; 251 _callbackReport = options.aaa.callbackReportWithPushToMongoDb;
252 } else { 252 } else {
253 console.log('Undefined options.aaa, terminating....') 253 console.log('Undefined options.aaa, terminating....')
254 process.exit(1); 254 process.exit(1);
255 } 255 }
256 256
257 if (options && options.logger) { 257 if (options && options.logger) {
258 logger = options.logger; 258 logger = options.logger;
259 } else { 259 } else {
260 logger = new winston.Logger({ 260 logger = new winston.Logger({
261 transports: [ 261 transports: [
262 new (winston.transports.Console)() 262 new (winston.transports.Console)()
263 ] 263 ]
264 }); 264 });
265 } 265 }
266 266
267 createRedisClient(config.globals.redis_host, config.globals.redis_port); 267 createRedisClient(config.globals.redis_host, config.globals.redis_port);
268 createServer(); 268 createServer();
269 269
270 var resendDelayOptions = { 270 var resendDelayOptions = {
271 config: config, 271 config: config,
272 topupRequest: checkStatus, 272 topupRequest: checkStatus,
273 logger: logger 273 logger: logger
274 }; 274 };
275 275
276 if (Number(config.globals.topup_request_on_resend_delay)) { 276 if (Number(config.globals.topup_request_on_resend_delay)) {
277 resendDelayOptions.topupRequest = topupRequest; 277 resendDelayOptions.topupRequest = topupRequest;
278 } 278 }
279 279
280 resendDelay.init(resendDelayOptions); 280 resendDelay.init(resendDelayOptions);
281 } 281 }
282 282
283 function parseSN(message, _config) { 283 function parseSN(message, _config) {
284 284
285 if (!_config) { 285 if (!_config) {
286 _config = config; 286 _config = config;
287 } 287 }
288 288
289 var sn_regex = new RegExp(_config.h2h_out.sn_pattern); 289 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
290 var sn_match = message.match(sn_regex); 290 var sn_match = message.match(sn_regex);
291 291
292 if (sn_match <= 0) { 292 if (sn_match <= 0) {
293 logger.info('SN Not found: ' + message); 293 logger.info('SN Not found: ' + message);
294 return ''; 294 return '';
295 } 295 }
296 296
297 var match_index = 0; 297 var match_index = 0;
298 if (_config.h2h_out.sn_match_index) { 298 if (_config.h2h_out.sn_match_index) {
299 match_index = Number(_config.h2h_out.sn_match_index); 299 match_index = Number(_config.h2h_out.sn_match_index);
300 } 300 }
301 301
302 var sn = sn_match[match_index]; 302 var sn = sn_match[match_index];
303 303
304 if (_config.h2h_out.sn_remove_whitespace) { 304 if (_config.h2h_out.sn_remove_whitespace) {
305 sn = sn.replace(/\s/g, ''); 305 sn = sn.replace(/\s/g, '');
306 } 306 }
307 307
308 var sn_remove_patterns = []; 308 var sn_remove_patterns = [];
309 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) { 309 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) {
310 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); 310 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
311 } 311 }
312 var count = sn_remove_patterns.length; 312 var count = sn_remove_patterns.length;
313 313
314 for(var i = 0; i < count; i++) { 314 for(var i = 0; i < count; i++) {
315 315
316 //sn = sn.replace(sn_remove_patterns[i], ''); 316 //sn = sn.replace(sn_remove_patterns[i], '');
317 317
318 var re = new RegExp(sn_remove_patterns[i], 'g'); 318 var re = new RegExp(sn_remove_patterns[i], 'g');
319 sn = sn.replace(re, ''); 319 sn = sn.replace(re, '');
320 } 320 }
321 321
322 //sn = paddingSN(sn, _config); 322 //sn = paddingSN(sn, _config);
323 323
324 return sn.trim(); 324 return sn.trim();
325 } 325 }
326 326
327 function getTaskKey(task, chipInfo) { 327 function getTaskKey(task, chipInfo) {
328 var requestId; 328 var requestId;
329 329
330 if (typeof task === 'string') { 330 if (typeof task === 'string') {
331 requestId = task; 331 requestId = task;
332 } else { 332 } else {
333 try { 333 try {
334 requestId = task.requestId; 334 requestId = task.requestId;
335 } 335 }
336 catch(e) { 336 catch(e) {
337 logger.warn('Something wrong', {task: task}); 337 logger.warn('Something wrong', {task: task});
338 console.trace('Cekidot'); 338 console.trace('Cekidot');
339 process.exit(1); 339 process.exit(1);
340 } 340 }
341 341
342 } 342 }
343 343
344 if (!chipInfo && config && config.globals && config.globals.gateway_name) { 344 if (!chipInfo && config && config.globals && config.globals.gateway_name) {
345 chipInfo = config.globals.gateway_name; 345 chipInfo = config.globals.gateway_name;
346 } 346 }
347 347
348 return chipInfo + '.hitachi.rid:' + requestId; 348 return chipInfo + '.hitachi.rid:' + requestId;
349 } 349 }
350 350
351 351
352 function putTaskToHistory(task, cb) { 352 function putTaskToHistory(task, cb) {
353 if (Number(config.globals.no_dupe_check)) { 353 if (Number(config.globals.no_dupe_check)) {
354 if (cb) { cb(); } 354 if (cb) { cb(); }
355 return; 355 return;
356 } 356 }
357 var key = getTaskKey(task, config.globals.gateway_name); 357 var key = getTaskKey(task, config.globals.gateway_name);
358 logger.verbose('Saving task to history LRU', {key: key, task: task}); 358 logger.verbose('Saving task to history LRU', {key: key, task: task});
359 359
360 try { 360 try {
361 taskHistory.set(key, JSON.parse(JSON.stringify(task))); 361 taskHistory.set(key, JSON.parse(JSON.stringify(task)));
362 } catch (e) { } 362 } catch (e) { }
363 363
364 putTaskToRedis(task, cb); 364 putTaskToRedis(task, cb);
365 } 365 }
366 366
367 function putTaskToRedis(task, cb) { 367 function putTaskToRedis(task, cb) {
368 if (!redisClient) { 368 if (!redisClient) {
369 logger.verbose('Not saving to redis because of undefined redisClient') 369 logger.verbose('Not saving to redis because of undefined redisClient')
370 if (cb) { cb(); } 370 if (cb) { cb(); }
371 return; 371 return;
372 } 372 }
373 373
374 var key = getTaskKey(task, config.globals.gateway_name); 374 var key = getTaskKey(task, config.globals.gateway_name);
375 logger.verbose('Saving task to redis', {key: key, task: task}); 375 logger.verbose('Saving task to redis', {key: key, task: task});
376 376
377 redisClient.set(key, JSON.stringify(task), function() { 377 redisClient.set(key, JSON.stringify(task), function() {
378 redisClient.expire(key, 3600*24*30); 378 redisClient.expire(key, 3600*24*30);
379 if (cb) { 379 if (cb) {
380 cb(); 380 cb();
381 } 381 }
382 }); 382 });
383 } 383 }
384 384
385 function getTaskFromHistory(task, cb) { 385 function getTaskFromHistory(task, cb) {
386 logger.verbose('Getting task from history', {task: task}); 386 logger.verbose('Getting task from history', {task: task});
387 var key = getTaskKey(task, config.globals.gateway_name); 387 var key = getTaskKey(task, config.globals.gateway_name);
388 var archive = taskHistory.get(key); 388 var archive = taskHistory.get(key);
389 389
390 if (archive) { 390 if (archive) {
391 if (cb) { cb(null, archive); } 391 if (cb) { cb(null, archive); }
392 } 392 }
393 else { 393 else {
394 getTaskFromRedis(task, cb); 394 getTaskFromRedis(task, cb);
395 } 395 }
396 } 396 }
397 397
398 function getTaskFromRedis(task, cb) { 398 function getTaskFromRedis(task, cb) {
399 if (!redisClient) { 399 if (!redisClient) {
400 if (cb) { cb(null, null); } 400 if (cb) { cb(null, null); }
401 return; 401 return;
402 } 402 }
403 403
404 var key = getTaskKey(task, config.globals.gateway_name); 404 var key = getTaskKey(task, config.globals.gateway_name);
405 redisClient.get(key, function(err, result) { 405 redisClient.get(key, function(err, result) {
406 if (err) { 406 if (err) {
407 logger.warn('Error retrieving task from redis', {err: err}); 407 logger.warn('Error retrieving task from redis', {err: err});
408 cb(err, null); 408 cb(err, null);
409 return; 409 return;
410 } 410 }
411 411
412 var task; 412 var task;
413 try { 413 try {
414 task = JSON.parse(result); 414 task = JSON.parse(result);
415 } 415 }
416 catch(e) { 416 catch(e) {
417 logger.warn('Exception on parsing redis result as a json', {err: e}); 417 logger.warn('Exception on parsing redis result as a json', {err: e});
418 } 418 }
419 419
420 cb(null, task); 420 cb(null, task);
421 }) 421 })
422 } 422 }
423 423
424 exports.start = start; 424 exports.start = start;
425 exports.topupRequest = topupRequest; 425 exports.topupRequest = topupRequest;
426 exports.getBalanceFromMessage = getBalanceFromMessage; 426 exports.getBalanceFromMessage = getBalanceFromMessage;
427 exports.checkStatus = checkStatus; 427 exports.checkStatus = checkStatus;
428 428