Commit dc7544b9d9a836cb461f89fd864d3869dfa69b51

Authored by Adhidarma Hadiwinoto
1 parent 800050a695
Exists in master

penanganan error

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