Commit d1de058a94a7972ba4779e06f484ea5604b168d0

Authored by Adhidarma Hadiwinoto
1 parent 56c6f0e5be
Exists in master

irs rc 2 jadi 40

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

1 var http = require('http'); 1 var http = require('http');
2 var xmlrpc = require('xmlrpc'); 2 var xmlrpc = require('xmlrpc');
3 var url = require('url'); 3 var url = require('url');
4 var math = require('mathjs'); 4 var math = require('mathjs');
5 var winston = require('winston'); 5 var winston = require('winston');
6 var redis = require('redis'); 6 var redis = require('redis');
7 var resendDelay = require('sate24/resend-delay.js'); 7 var resendDelay = require('sate24/resend-delay.js');
8 var LRU = require('lru-cache'); 8 var LRU = require('lru-cache');
9 9
10 var aaa; 10 var aaa;
11 var logger; 11 var logger;
12 var config; 12 var config;
13 var _callbackReport; 13 var _callbackReport;
14 var redisClient; 14 var redisClient;
15 15
16 var taskHistory = LRU({max: 500, maxAge: 1000 * 3600 * 2}); 16 var taskHistory = LRU({max: 500, maxAge: 1000 * 3600 * 2});
17 17
18 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 18 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
19 http.globalAgent.maxSockets = Infinity; 19 http.globalAgent.maxSockets = Infinity;
20 20
21 var irsRc = { 21 var irsRc = {
22 '0': '00', 22 '0': '00',
23 '00': '00', 23 '00': '00',
24 '1': '00', 24 '1': '00',
25 '2': '14', 25 '2': '40',
26 '17': '40', 26 '17': '40',
27 '63': '40', 27 '63': '40',
28 '89': '40', 28 '89': '40',
29 '68': '68', 29 '68': '68',
30 '94': '68', 30 '94': '68',
31 '05': '40', 31 '05': '40',
32 '30': '40', 32 '30': '40',
33 '51': '40', 33 '51': '40',
34 '13': '40', 34 '13': '40',
35 '14': '14', 35 '14': '14',
36 '91': '40', 36 '91': '40',
37 '40': '40', 37 '40': '40',
38 '49': '40', 38 '49': '40',
39 '53': '40', 39 '53': '40',
40 '54': '40', 40 '54': '40',
41 '914': '55', 41 '914': '55',
42 '55': '55', 42 '55': '55',
43 '06': '40', 43 '06': '40',
44 '92': '40' 44 '92': '40'
45 } 45 }
46 46
47 function callbackReport(requestId, responseCode, message, dontResendDelay, raw) { 47 function callbackReport(requestId, responseCode, message, dontResendDelay, raw) {
48 var responseToSave = { 48 var responseToSave = {
49 parsed: { 49 parsed: {
50 MESSAGE: message, 50 MESSAGE: message,
51 } 51 }
52 }; 52 };
53 53
54 if (raw) { 54 if (raw) {
55 responseToSave.raw = raw; 55 responseToSave.raw = raw;
56 } else { 56 } else {
57 responseToSave.raw = message; 57 responseToSave.raw = message;
58 } 58 }
59 59
60 if (responseCode != '68' || dontResendDelay) { 60 if (responseCode != '68' || dontResendDelay) {
61 resendDelay.cancel(requestId); 61 resendDelay.cancel(requestId);
62 } else { 62 } else {
63 getTaskFromHistory(requestId, function(err, archivedTask) { 63 getTaskFromHistory(requestId, function(err, archivedTask) {
64 if (archivedTask) { 64 if (archivedTask) {
65 logger.verbose('DEBUG', {archivedTask: archivedTask}); 65 logger.verbose('DEBUG', {archivedTask: archivedTask});
66 resendDelay.register(archivedTask); 66 resendDelay.register(archivedTask);
67 } 67 }
68 }); 68 });
69 } 69 }
70 70
71 _callbackReport(requestId, responseCode, message, null, responseToSave); 71 _callbackReport(requestId, responseCode, message, null, responseToSave);
72 } 72 }
73 73
74 function createRedisClient(host, port) { 74 function createRedisClient(host, port) {
75 if (!host && !port) { 75 if (!host && !port) {
76 logger.info('Not creating redis client because unspecified host or port'); 76 logger.info('Not creating redis client because unspecified host or port');
77 return; 77 return;
78 } 78 }
79 79
80 try { 80 try {
81 redisClient = redis.createClient(port, host); 81 redisClient = redis.createClient(port, host);
82 } catch(err) { 82 } catch(err) {
83 logger.warn("Error creating redis client to " + host + ':' + port); 83 logger.warn("Error creating redis client to " + host + ':' + port);
84 } 84 }
85 } 85 }
86 86
87 function topupRequest(task) { 87 function topupRequest(task) {
88 aaa.insertTaskToMongoDb(task); 88 aaa.insertTaskToMongoDb(task);
89 89
90 getTaskFromHistory(task, function(err, archivedTask) { 90 getTaskFromHistory(task, function(err, archivedTask) {
91 putTaskToHistory(task); 91 putTaskToHistory(task);
92 92
93 if (archivedTask) { 93 if (archivedTask) {
94 logger.info('Task has been executed before, going to checkStatus', {task: task, archivedTask: archivedTask}); 94 logger.info('Task has been executed before, going to checkStatus', {task: task, archivedTask: archivedTask});
95 checkStatus(task); 95 checkStatus(task);
96 } else { 96 } else {
97 _topupRequest(task); 97 _topupRequest(task);
98 } 98 }
99 }); 99 });
100 } 100 }
101 101
102 function _topupRequest(task, pendingOnConnectError) { 102 function _topupRequest(task, pendingOnConnectError) {
103 103
104 if (!aaa.isTodayTrx(task)) { 104 if (!aaa.isTodayTrx(task)) {
105 callbackReport(task.requestId, '68', 'Terdeteksi transaksi beda hari, batal kirim ke supplier. Silahkan cek webreport', true); 105 callbackReport(task.requestId, '68', 'Terdeteksi transaksi beda hari, batal kirim ke supplier. Silahkan cek webreport', true);
106 return; 106 return;
107 } 107 }
108 108
109 var partnerUrl = url.parse(config.h2h_out.partner); 109 var partnerUrl = url.parse(config.h2h_out.partner);
110 var clientOptions = { 110 var clientOptions = {
111 host: partnerUrl.hostname, 111 host: partnerUrl.hostname,
112 port: partnerUrl.port, 112 port: partnerUrl.port,
113 path: partnerUrl.pathname 113 path: partnerUrl.pathname
114 }; 114 };
115 115
116 var client; 116 var client;
117 if (partnerUrl.protocol == 'https:') { 117 if (partnerUrl.protocol == 'https:') {
118 client = xmlrpc.createSecureClient(clientOptions); 118 client = xmlrpc.createSecureClient(clientOptions);
119 } else { 119 } else {
120 client = xmlrpc.createClient(clientOptions); 120 client = xmlrpc.createClient(clientOptions);
121 } 121 }
122 122
123 var params = { 123 var params = {
124 MSISDN: config.h2h_out.userid, 124 MSISDN: config.h2h_out.userid,
125 REQUESTID: task['requestId'], 125 REQUESTID: task['requestId'],
126 PIN: config.h2h_out.password, 126 PIN: config.h2h_out.password,
127 NOHP: task['destination'], 127 NOHP: task['destination'],
128 NOM: task['remoteProduct'] 128 NOM: task['remoteProduct']
129 }; 129 };
130 130
131 var methodName = 'topUpRequest'; 131 var methodName = 'topUpRequest';
132 logger.info('Preparing XMLRPC request', {methodname: methodName, params: params, partnerUrl: partnerUrl.href}); 132 logger.info('Preparing XMLRPC request', {methodname: methodName, params: params, partnerUrl: partnerUrl.href});
133 133
134 client.methodCall(methodName, [ params ], function (error, value) { 134 client.methodCall(methodName, [ params ], function (error, value) {
135 135
136 // Results of the method response 136 // Results of the method response
137 137
138 if (error) { 138 if (error) {
139 var rc = '68'; 139 var rc = '68';
140 var msg = 'XMLRPC Client Error: ' + error; 140 var msg = 'XMLRPC Client Error: ' + error;
141 141
142 if (!pendingOnConnectError && (error.code == 'ECONNREFUSED' || error.code == 'EHOSTUNREACH')) { 142 if (!pendingOnConnectError && (error.code == 'ECONNREFUSED' || error.code == 'EHOSTUNREACH')) {
143 rc = '91'; 143 rc = '91';
144 msg = 'XMLRPC Client Error on connecting'; 144 msg = 'XMLRPC Client Error on connecting';
145 } else if (!pendingOnConnectError && error.code == 'ETIMEDOUT' && error.syscall == "connect") { 145 } else if (!pendingOnConnectError && error.code == 'ETIMEDOUT' && error.syscall == "connect") {
146 rc = '91'; 146 rc = '91';
147 msg = 'XMLRPC Client Error on connecting'; 147 msg = 'XMLRPC Client Error on connecting';
148 } 148 }
149 149
150 logger.warn('XMLRPC Client Error', {methodName: methodName, task: task, err:error}); 150 logger.warn('XMLRPC Client Error', {methodName: methodName, task: task, err:error});
151 151
152 callbackReport(task['requestId'], rc, msg, null, JSON.stringify({methodName: methodName, error: error.toString(), body: error.body})); 152 callbackReport(task['requestId'], rc, msg, null, JSON.stringify({methodName: methodName, error: error.toString(), body: error.body}));
153 return; 153 return;
154 } 154 }
155 155
156 logger.info('Got XMLRPC response from partner for', {methodName: methodName, response_message: value}); 156 logger.info('Got XMLRPC response from partner for', {methodName: methodName, response_message: value});
157 157
158 if (value['RESPONSECODE'] == '94') { 158 if (value['RESPONSECODE'] == '94') {
159 logger.info('Change RC 94 to 68'); 159 logger.info('Change RC 94 to 68');
160 value['RESPONSECODE'] = '68'; 160 value['RESPONSECODE'] = '68';
161 } 161 }
162 162
163 var msg = prefixMessageWithSN(value); 163 var msg = prefixMessageWithSN(value);
164 164
165 callbackReport( 165 callbackReport(
166 task.requestId, value['RESPONSECODE'], msg, null, JSON.stringify({methodName: methodName, response: value}) 166 task.requestId, value['RESPONSECODE'], msg, null, JSON.stringify({methodName: methodName, response: value})
167 ); 167 );
168 }); 168 });
169 } 169 }
170 170
171 function snSanitizer(sn) { 171 function snSanitizer(sn) {
172 if (!sn && typeof sn === 'string') { 172 if (!sn && typeof sn === 'string') {
173 return; 173 return;
174 } 174 }
175 175
176 sn = sn.replace(/[^A-Z0-9\/]/g, '-'); 176 sn = sn.replace(/[^A-Z0-9\/]/g, '-');
177 sn = sn.replace(/-+/g, '-'); 177 sn = sn.replace(/-+/g, '-');
178 sn = sn.replace(/^-+/, ''); 178 sn = sn.replace(/^-+/, '');
179 sn = sn.replace(/-+$/, ''); 179 sn = sn.replace(/-+$/, '');
180 sn = sn.trim(); 180 sn = sn.trim();
181 181
182 return sn; 182 return sn;
183 } 183 }
184 184
185 function msgSanitizer(msg) { 185 function msgSanitizer(msg) {
186 return msg.replace(/;\s*SN=.+?;/, '; ').trim(); 186 return msg.replace(/;\s*SN=.+?;/, '; ').trim();
187 } 187 }
188 188
189 function prefixMessageWithSN(data) { 189 function prefixMessageWithSN(data) {
190 190
191 if (data['RESPONSECODE'] != '00') { 191 if (data['RESPONSECODE'] != '00') {
192 return data['MESSAGE']; 192 return data['MESSAGE'];
193 } 193 }
194 194
195 sn = ''; 195 sn = '';
196 196
197 if (data.SN && data.SN.trim()) { 197 if (data.SN && data.SN.trim()) {
198 sn = data['SN'].trim(); 198 sn = data['SN'].trim();
199 } 199 }
200 else if (data['MESSAGE'].search(/^SN=.+;/) == -1) { 200 else if (data['MESSAGE'].search(/^SN=.+;/) == -1) {
201 if (data['SN'] && data['SN'].trim()) { 201 if (data['SN'] && data['SN'].trim()) {
202 sn = data['SN'].trim(); 202 sn = data['SN'].trim();
203 } 203 }
204 else if (config.h2h_out.parse_sn == 'YES') { 204 else if (config.h2h_out.parse_sn == 'YES') {
205 sn = parseSN(data['MESSAGE']); 205 sn = parseSN(data['MESSAGE']);
206 } 206 }
207 } 207 }
208 208
209 sn = snSanitizer(sn); 209 sn = snSanitizer(sn);
210 210
211 if (sn) { 211 if (sn) {
212 msg = 'SN=' + sn + '; ' + data['MESSAGE']; 212 msg = 'SN=' + sn + '; ' + data['MESSAGE'];
213 return msgSanitizer(msg); 213 return msgSanitizer(msg);
214 } 214 }
215 215
216 return data['MESSAGE']; 216 return data['MESSAGE'];
217 } 217 }
218 218
219 function createServer() { 219 function createServer() {
220 220
221 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port); 221 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
222 var serverOptions = { 222 var serverOptions = {
223 port: config.h2h_out.listen_port 223 port: config.h2h_out.listen_port
224 }; 224 };
225 225
226 var server = xmlrpc.createServer(serverOptions); 226 var server = xmlrpc.createServer(serverOptions);
227 227
228 server.on('NotFound', function (method, params) { 228 server.on('NotFound', function (method, params) {
229 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params}); 229 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
230 }); 230 });
231 231
232 server.on('topUpReport', function (err, params, callback) { 232 server.on('topUpReport', function (err, params, callback) {
233 233
234 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params}); 234 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
235 235
236 var paramscount = params.length; 236 var paramscount = params.length;
237 for (var i = 0; i < paramscount; i++) { 237 for (var i = 0; i < paramscount; i++) {
238 var value = params[i]; 238 var value = params[i];
239 239
240 if (value['RESPONSECODE'] == '94') { 240 if (value['RESPONSECODE'] == '94') {
241 logger.info('Change RC 94 to 68'); 241 logger.info('Change RC 94 to 68');
242 value['RESPONSECODE'] = '68'; 242 value['RESPONSECODE'] = '68';
243 } 243 }
244 244
245 var msg = prefixMessageWithSN(value); 245 var msg = prefixMessageWithSN(value);
246 246
247 callbackReport( 247 callbackReport(
248 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value}) 248 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value})
249 ); 249 );
250 } 250 }
251 251
252 callback(null, 'ACK REPORT OK'); 252 callback(null, 'ACK REPORT OK');
253 }) 253 })
254 254
255 } 255 }
256 256
257 function createPlainHttpServer() { 257 function createPlainHttpServer() {
258 logger.info('Creating IRS HTTP server on port ' + config.h2h_out.listen_port); 258 logger.info('Creating IRS HTTP server on port ' + config.h2h_out.listen_port);
259 259
260 var httpServer = http.createServer(function(request, response) { 260 var httpServer = http.createServer(function(request, response) {
261 261
262 var qs = url.parse(request.url, true).query; 262 var qs = url.parse(request.url, true).query;
263 logger.info('Got reverse report from gateway', {qs: qs}); 263 logger.info('Got reverse report from gateway', {qs: qs});
264 264
265 var request_id = qs.clientid; 265 var request_id = qs.clientid;
266 266
267 var rc = irsRc[qs.statuscode] || '68'; 267 var rc = irsRc[qs.statuscode] || '68';
268 268
269 var msg = qs.msg + '. STATUSCODE:' + qs.statuscode; 269 var msg = qs.msg + '. STATUSCODE:' + qs.statuscode;
270 270
271 if (rc == '00' && qs.sn) { 271 if (rc == '00' && qs.sn) {
272 msg = 'SN=' + qs.sn.replace(/ /g, '-').trim() + '; ' + msg; 272 msg = 'SN=' + qs.sn.replace(/ /g, '-').trim() + '; ' + msg;
273 } 273 }
274 274
275 response.end('OK'); 275 response.end('OK');
276 276
277 callbackReport(request_id, rc, msg); 277 callbackReport(request_id, rc, msg);
278 278
279 }); 279 });
280 280
281 httpServer.listen(config.h2h_out.listen_port, function() { 281 httpServer.listen(config.h2h_out.listen_port, function() {
282 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 282 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
283 }); 283 });
284 } 284 }
285 285
286 function getBalanceFromMessage(message, balance_regex) { 286 function getBalanceFromMessage(message, balance_regex) {
287 if (!balance_regex) { 287 if (!balance_regex) {
288 if (config && config.globals && config.globals.balance_regex) { 288 if (config && config.globals && config.globals.balance_regex) {
289 balance_regex = config.globals.balance_regex; 289 balance_regex = config.globals.balance_regex;
290 } 290 }
291 } 291 }
292 292
293 if (!balance_regex) { 293 if (!balance_regex) {
294 return; 294 return;
295 } 295 }
296 296
297 try { 297 try {
298 var re = new RegExp(balance_regex); 298 var re = new RegExp(balance_regex);
299 var matches = message.match(re); 299 var matches = message.match(re);
300 300
301 var result = matches[1]; 301 var result = matches[1];
302 result = result.replace(/\./g, ''); 302 result = result.replace(/\./g, '');
303 result = result.replace(/,/g, ''); 303 result = result.replace(/,/g, '');
304 304
305 305
306 return Number(result); 306 return Number(result);
307 } 307 }
308 catch(err) { 308 catch(err) {
309 return; 309 return;
310 } 310 }
311 } 311 }
312 312
313 function updateBalance(message) { 313 function updateBalance(message) {
314 var balance = getBalanceFromMessage(message); 314 var balance = getBalanceFromMessage(message);
315 if (balance) { 315 if (balance) {
316 logger.info('Balance: ' + balance); 316 logger.info('Balance: ' + balance);
317 aaa.updateBalance(balance); 317 aaa.updateBalance(balance);
318 } 318 }
319 } 319 }
320 320
321 function checkStatus(task) { 321 function checkStatus(task) {
322 322
323 if (Number(config.globals.topup_request_on_check_status)) { 323 if (Number(config.globals.topup_request_on_check_status)) {
324 _topupRequest(task, true); 324 _topupRequest(task, true);
325 return; 325 return;
326 } 326 }
327 327
328 var partnerUrl = url.parse(config.h2h_out.partner); 328 var partnerUrl = url.parse(config.h2h_out.partner);
329 var clientOptions = { 329 var clientOptions = {
330 host: partnerUrl.hostname 330 host: partnerUrl.hostname
331 , port: partnerUrl.port 331 , port: partnerUrl.port
332 , path: partnerUrl.pathname 332 , path: partnerUrl.pathname
333 }; 333 };
334 logger.info('XMLRPC client options:'); 334 logger.info('XMLRPC client options:');
335 logger.info(clientOptions); 335 logger.info(clientOptions);
336 336
337 var client; 337 var client;
338 if (partnerUrl.protocol == 'https:') { 338 if (partnerUrl.protocol == 'https:') {
339 client = xmlrpc.createSecureClient(clientOptions); 339 client = xmlrpc.createSecureClient(clientOptions);
340 } else { 340 } else {
341 client = xmlrpc.createClient(clientOptions); 341 client = xmlrpc.createClient(clientOptions);
342 } 342 }
343 343
344 var methodName = 'topUpInquiry'; 344 var methodName = 'topUpInquiry';
345 345
346 var params = { 346 var params = {
347 REQUESTID: task['requestId'], 347 REQUESTID: task['requestId'],
348 MSISDN: config.h2h_out.userid, 348 MSISDN: config.h2h_out.userid,
349 PIN: config.h2h_out.password, 349 PIN: config.h2h_out.password,
350 NOHP: task['destination'] 350 NOHP: task['destination']
351 }; 351 };
352 352
353 logger.info('Requesting topUpInquiry', {params: params}); 353 logger.info('Requesting topUpInquiry', {params: params});
354 354
355 client.methodCall(methodName, [ params ], function (error, value) { 355 client.methodCall(methodName, [ params ], function (error, value) {
356 // Results of the method response 356 // Results of the method response
357 if (error) { 357 if (error) {
358 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params}); 358 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params});
359 callbackReport( 359 callbackReport(
360 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error}) 360 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error})
361 ); 361 );
362 return; 362 return;
363 } 363 }
364 logger.info('Method response for \'' + methodName, {response: value}); 364 logger.info('Method response for \'' + methodName, {response: value});
365 365
366 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value})); 366 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value}));
367 }); 367 });
368 } 368 }
369 369
370 function start(options) { 370 function start(options) {
371 if (!options) { 371 if (!options) {
372 console.log('Undefined options, terminating....'); 372 console.log('Undefined options, terminating....');
373 process.exit(1); 373 process.exit(1);
374 } 374 }
375 375
376 if (options.config) { 376 if (options.config) {
377 config = options.config; 377 config = options.config;
378 } else { 378 } else {
379 console.log('Undefined options.config, terminating....') 379 console.log('Undefined options.config, terminating....')
380 process.exit(1); 380 process.exit(1);
381 } 381 }
382 382
383 if (options.aaa) { 383 if (options.aaa) {
384 aaa = options.aaa; 384 aaa = options.aaa;
385 _callbackReport = options.aaa.callbackReportWithPushToMongoDb; 385 _callbackReport = options.aaa.callbackReportWithPushToMongoDb;
386 } else { 386 } else {
387 console.log('Undefined options.aaa, terminating....') 387 console.log('Undefined options.aaa, terminating....')
388 process.exit(1); 388 process.exit(1);
389 } 389 }
390 390
391 if (options && options.logger) { 391 if (options && options.logger) {
392 logger = options.logger; 392 logger = options.logger;
393 } else { 393 } else {
394 logger = new winston.Logger({ 394 logger = new winston.Logger({
395 transports: [ 395 transports: [
396 new (winston.transports.Console)() 396 new (winston.transports.Console)()
397 ] 397 ]
398 }); 398 });
399 } 399 }
400 400
401 createRedisClient(config.globals.redis_host, config.globals.redis_port); 401 createRedisClient(config.globals.redis_host, config.globals.redis_port);
402 402
403 if (!Number(config.h2h_out.irs_mode)) { 403 if (!Number(config.h2h_out.irs_mode)) {
404 createServer(); 404 createServer();
405 } 405 }
406 else { 406 else {
407 createPlainHttpServer(); 407 createPlainHttpServer();
408 } 408 }
409 409
410 410
411 var resendDelayOptions = { 411 var resendDelayOptions = {
412 config: config, 412 config: config,
413 topupRequest: checkStatus, 413 topupRequest: checkStatus,
414 logger: logger 414 logger: logger
415 }; 415 };
416 416
417 if (Number(config.globals.topup_request_on_resend_delay)) { 417 if (Number(config.globals.topup_request_on_resend_delay)) {
418 resendDelayOptions.topupRequest = topupRequest; 418 resendDelayOptions.topupRequest = topupRequest;
419 } 419 }
420 420
421 resendDelay.init(resendDelayOptions); 421 resendDelay.init(resendDelayOptions);
422 } 422 }
423 423
424 function parseSN(message, _config) { 424 function parseSN(message, _config) {
425 425
426 if (!_config) { 426 if (!_config) {
427 _config = config; 427 _config = config;
428 } 428 }
429 429
430 var sn_regex = new RegExp(_config.h2h_out.sn_pattern); 430 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
431 var sn_match = message.match(sn_regex); 431 var sn_match = message.match(sn_regex);
432 432
433 if (sn_match <= 0) { 433 if (sn_match <= 0) {
434 logger.info('SN Not found: ' + message); 434 logger.info('SN Not found: ' + message);
435 return ''; 435 return '';
436 } 436 }
437 437
438 var match_index = 0; 438 var match_index = 0;
439 if (_config.h2h_out.sn_match_index) { 439 if (_config.h2h_out.sn_match_index) {
440 match_index = Number(_config.h2h_out.sn_match_index); 440 match_index = Number(_config.h2h_out.sn_match_index);
441 } 441 }
442 442
443 var sn = sn_match[match_index]; 443 var sn = sn_match[match_index];
444 444
445 if (_config.h2h_out.sn_remove_whitespace) { 445 if (_config.h2h_out.sn_remove_whitespace) {
446 sn = sn.replace(/\s/g, ''); 446 sn = sn.replace(/\s/g, '');
447 } 447 }
448 448
449 var sn_remove_patterns = []; 449 var sn_remove_patterns = [];
450 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) { 450 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) {
451 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); 451 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
452 } 452 }
453 var count = sn_remove_patterns.length; 453 var count = sn_remove_patterns.length;
454 454
455 for(var i = 0; i < count; i++) { 455 for(var i = 0; i < count; i++) {
456 456
457 //sn = sn.replace(sn_remove_patterns[i], ''); 457 //sn = sn.replace(sn_remove_patterns[i], '');
458 458
459 var re = new RegExp(sn_remove_patterns[i], 'g'); 459 var re = new RegExp(sn_remove_patterns[i], 'g');
460 sn = sn.replace(re, ''); 460 sn = sn.replace(re, '');
461 } 461 }
462 462
463 //sn = paddingSN(sn, _config); 463 //sn = paddingSN(sn, _config);
464 464
465 return sn.trim(); 465 return sn.trim();
466 } 466 }
467 467
468 function getTaskKey(task, chipInfo) { 468 function getTaskKey(task, chipInfo) {
469 var requestId; 469 var requestId;
470 470
471 if (typeof task === 'string') { 471 if (typeof task === 'string') {
472 requestId = task; 472 requestId = task;
473 } else { 473 } else {
474 try { 474 try {
475 requestId = task.requestId; 475 requestId = task.requestId;
476 } 476 }
477 catch(e) { 477 catch(e) {
478 logger.warn('Something wrong', {task: task}); 478 logger.warn('Something wrong', {task: task});
479 console.trace('Cekidot'); 479 console.trace('Cekidot');
480 process.exit(1); 480 process.exit(1);
481 } 481 }
482 482
483 } 483 }
484 484
485 if (!chipInfo && config && config.globals && config.globals.gateway_name) { 485 if (!chipInfo && config && config.globals && config.globals.gateway_name) {
486 chipInfo = config.globals.gateway_name; 486 chipInfo = config.globals.gateway_name;
487 } 487 }
488 488
489 return chipInfo + '.hitachi.rid:' + requestId; 489 return chipInfo + '.hitachi.rid:' + requestId;
490 } 490 }
491 491
492 492
493 function putTaskToHistory(task, cb) { 493 function putTaskToHistory(task, cb) {
494 if (Number(config.globals.no_dupe_check)) { 494 if (Number(config.globals.no_dupe_check)) {
495 if (cb) { cb(); } 495 if (cb) { cb(); }
496 return; 496 return;
497 } 497 }
498 var key = getTaskKey(task, config.globals.gateway_name); 498 var key = getTaskKey(task, config.globals.gateway_name);
499 logger.verbose('Saving task to history LRU', {key: key, task: task}); 499 logger.verbose('Saving task to history LRU', {key: key, task: task});
500 500
501 try { 501 try {
502 taskHistory.set(key, JSON.parse(JSON.stringify(task))); 502 taskHistory.set(key, JSON.parse(JSON.stringify(task)));
503 } catch (e) { } 503 } catch (e) { }
504 504
505 putTaskToRedis(task, cb); 505 putTaskToRedis(task, cb);
506 } 506 }
507 507
508 function putTaskToRedis(task, cb) { 508 function putTaskToRedis(task, cb) {
509 if (!redisClient) { 509 if (!redisClient) {
510 logger.verbose('Not saving to redis because of undefined redisClient') 510 logger.verbose('Not saving to redis because of undefined redisClient')
511 if (cb) { cb(); } 511 if (cb) { cb(); }
512 return; 512 return;
513 } 513 }
514 514
515 var key = getTaskKey(task, config.globals.gateway_name); 515 var key = getTaskKey(task, config.globals.gateway_name);
516 logger.verbose('Saving task to redis', {key: key, task: task}); 516 logger.verbose('Saving task to redis', {key: key, task: task});
517 517
518 redisClient.set(key, JSON.stringify(task), function() { 518 redisClient.set(key, JSON.stringify(task), function() {
519 redisClient.expire(key, 3600*24*30); 519 redisClient.expire(key, 3600*24*30);
520 if (cb) { 520 if (cb) {
521 cb(); 521 cb();
522 } 522 }
523 }); 523 });
524 } 524 }
525 525
526 function getTaskFromHistory(task, cb) { 526 function getTaskFromHistory(task, cb) {
527 logger.verbose('Getting task from history', {task: task}); 527 logger.verbose('Getting task from history', {task: task});
528 var key = getTaskKey(task, config.globals.gateway_name); 528 var key = getTaskKey(task, config.globals.gateway_name);
529 var archive = taskHistory.get(key); 529 var archive = taskHistory.get(key);
530 530
531 if (archive) { 531 if (archive) {
532 if (cb) { cb(null, archive); } 532 if (cb) { cb(null, archive); }
533 } 533 }
534 else { 534 else {
535 getTaskFromRedis(task, cb); 535 getTaskFromRedis(task, cb);
536 } 536 }
537 } 537 }
538 538
539 function getTaskFromRedis(task, cb) { 539 function getTaskFromRedis(task, cb) {
540 if (!redisClient) { 540 if (!redisClient) {
541 if (cb) { cb(null, null); } 541 if (cb) { cb(null, null); }
542 return; 542 return;
543 } 543 }
544 544
545 var key = getTaskKey(task, config.globals.gateway_name); 545 var key = getTaskKey(task, config.globals.gateway_name);
546 redisClient.get(key, function(err, result) { 546 redisClient.get(key, function(err, result) {
547 if (err) { 547 if (err) {
548 logger.warn('Error retrieving task from redis', {err: err}); 548 logger.warn('Error retrieving task from redis', {err: err});
549 cb(err, null); 549 cb(err, null);
550 return; 550 return;
551 } 551 }
552 552
553 var task; 553 var task;
554 try { 554 try {
555 task = JSON.parse(result); 555 task = JSON.parse(result);
556 } 556 }
557 catch(e) { 557 catch(e) {
558 logger.warn('Exception on parsing redis result as a json', {err: e}); 558 logger.warn('Exception on parsing redis result as a json', {err: e});
559 } 559 }
560 560
561 cb(null, task); 561 cb(null, task);
562 }) 562 })
563 } 563 }
564 564
565 exports.start = start; 565 exports.start = start;
566 exports.topupRequest = topupRequest; 566 exports.topupRequest = topupRequest;
567 exports.getBalanceFromMessage = getBalanceFromMessage; 567 exports.getBalanceFromMessage = getBalanceFromMessage;
568 exports.checkStatus = checkStatus; 568 exports.checkStatus = checkStatus;
569 569