Commit 7273dc2994c23e4511cb7e9c76ee048e65408e15

Authored by Adhidarma Hadiwinoto
1 parent 5c8ba4b52d
Exists in master

simplikasi sn sanitizer

Showing 1 changed file with 4 additions and 3 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': '14',
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 prefixMessageWithSN(data) { 171 function prefixMessageWithSN(data) {
172 172
173 if (data['RESPONSECODE'] != '00') { 173 if (data['RESPONSECODE'] != '00') {
174 return data['MESSAGE']; 174 return data['MESSAGE'];
175 } 175 }
176 176
177 sn = ''; 177 sn = '';
178 178
179 if (data.SN && data.SN.trim()) { 179 if (data.SN && data.SN.trim()) {
180 sn = data['SN'].trim(); 180 sn = data['SN'].trim();
181 } 181 }
182 else if (data['MESSAGE'].search(/^SN=.+;/) == -1) { 182 else if (data['MESSAGE'].search(/^SN=.+;/) == -1) {
183 if (data['SN'] && data['SN'].trim()) { 183 if (data['SN'] && data['SN'].trim()) {
184 sn = data['SN'].trim(); 184 sn = data['SN'].trim();
185 } 185 }
186 else if (config.h2h_out.parse_sn == 'YES') { 186 else if (config.h2h_out.parse_sn == 'YES') {
187 sn = parseSN(data['MESSAGE']); 187 sn = parseSN(data['MESSAGE']);
188 } 188 }
189 } 189 }
190 190
191 if (sn) { 191 if (sn) {
192 sn = sn.replace(/ /g, '-'); 192 //sn = sn.replace(/ /g, '-');
193 sn = sn.replace(/[\()]/g, '-'); 193 //sn = sn.replace(/[\()]/g, '-');
194 sn = sn.replace(/-+/g, '-') 194 sn = sn.replace(/[^A-Z0-9\/]/g, '-');
195 sn = sn.replace(/-+/g, '-');
195 sn = sn.replace(/^-+/, ''); 196 sn = sn.replace(/^-+/, '');
196 sn = sn.replace(/-+$/, ''); 197 sn = sn.replace(/-+$/, '');
197 sn = sn.replace(/;\s*SN=.+?;/, '; '); 198 sn = sn.replace(/;\s*SN=.+?;/, '; ');
198 sn = sn.trim(); 199 sn = sn.trim();
199 return 'SN=' + sn + '; ' + data['MESSAGE']; 200 return 'SN=' + sn + '; ' + data['MESSAGE'];
200 } 201 }
201 202
202 return data['MESSAGE']; 203 return data['MESSAGE'];
203 } 204 }
204 205
205 function createServer() { 206 function createServer() {
206 207
207 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port); 208 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
208 var serverOptions = { 209 var serverOptions = {
209 port: config.h2h_out.listen_port 210 port: config.h2h_out.listen_port
210 }; 211 };
211 212
212 var server = xmlrpc.createServer(serverOptions); 213 var server = xmlrpc.createServer(serverOptions);
213 214
214 server.on('NotFound', function (method, params) { 215 server.on('NotFound', function (method, params) {
215 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params}); 216 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
216 }); 217 });
217 218
218 server.on('topUpReport', function (err, params, callback) { 219 server.on('topUpReport', function (err, params, callback) {
219 220
220 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params}); 221 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
221 222
222 var paramscount = params.length; 223 var paramscount = params.length;
223 for (var i = 0; i < paramscount; i++) { 224 for (var i = 0; i < paramscount; i++) {
224 var value = params[i]; 225 var value = params[i];
225 226
226 if (value['RESPONSECODE'] == '94') { 227 if (value['RESPONSECODE'] == '94') {
227 logger.info('Change RC 94 to 68'); 228 logger.info('Change RC 94 to 68');
228 value['RESPONSECODE'] = '68'; 229 value['RESPONSECODE'] = '68';
229 } 230 }
230 231
231 var msg = prefixMessageWithSN(value); 232 var msg = prefixMessageWithSN(value);
232 233
233 callbackReport( 234 callbackReport(
234 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value}) 235 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value})
235 ); 236 );
236 } 237 }
237 238
238 callback(null, 'ACK REPORT OK'); 239 callback(null, 'ACK REPORT OK');
239 }) 240 })
240 241
241 } 242 }
242 243
243 function createPlainHttpServer() { 244 function createPlainHttpServer() {
244 logger.info('Creating IRS HTTP server on port ' + config.h2h_out.listen_port); 245 logger.info('Creating IRS HTTP server on port ' + config.h2h_out.listen_port);
245 246
246 var httpServer = http.createServer(function(request, response) { 247 var httpServer = http.createServer(function(request, response) {
247 248
248 var qs = url.parse(request.url, true).query; 249 var qs = url.parse(request.url, true).query;
249 logger.info('Got reverse report from gateway', {qs: qs}); 250 logger.info('Got reverse report from gateway', {qs: qs});
250 251
251 var request_id = qs.clientid; 252 var request_id = qs.clientid;
252 253
253 var rc = irsRc[qs.statuscode] || '68'; 254 var rc = irsRc[qs.statuscode] || '68';
254 255
255 var msg = qs.msg + '. STATUSCODE:' + qs.statuscode; 256 var msg = qs.msg + '. STATUSCODE:' + qs.statuscode;
256 257
257 if (rc == '00' && qs.sn) { 258 if (rc == '00' && qs.sn) {
258 msg = 'SN=' + qs.sn.replace(/ /g, '-').trim() + '; ' + msg; 259 msg = 'SN=' + qs.sn.replace(/ /g, '-').trim() + '; ' + msg;
259 } 260 }
260 261
261 response.end('OK'); 262 response.end('OK');
262 263
263 callbackReport(request_id, rc, msg); 264 callbackReport(request_id, rc, msg);
264 265
265 }); 266 });
266 267
267 httpServer.listen(config.h2h_out.listen_port, function() { 268 httpServer.listen(config.h2h_out.listen_port, function() {
268 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 269 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
269 }); 270 });
270 } 271 }
271 272
272 function getBalanceFromMessage(message, balance_regex) { 273 function getBalanceFromMessage(message, balance_regex) {
273 if (!balance_regex) { 274 if (!balance_regex) {
274 if (config && config.globals && config.globals.balance_regex) { 275 if (config && config.globals && config.globals.balance_regex) {
275 balance_regex = config.globals.balance_regex; 276 balance_regex = config.globals.balance_regex;
276 } 277 }
277 } 278 }
278 279
279 if (!balance_regex) { 280 if (!balance_regex) {
280 return; 281 return;
281 } 282 }
282 283
283 try { 284 try {
284 var re = new RegExp(balance_regex); 285 var re = new RegExp(balance_regex);
285 var matches = message.match(re); 286 var matches = message.match(re);
286 287
287 var result = matches[1]; 288 var result = matches[1];
288 result = result.replace(/\./g, ''); 289 result = result.replace(/\./g, '');
289 result = result.replace(/,/g, ''); 290 result = result.replace(/,/g, '');
290 291
291 292
292 return Number(result); 293 return Number(result);
293 } 294 }
294 catch(err) { 295 catch(err) {
295 return; 296 return;
296 } 297 }
297 } 298 }
298 299
299 function updateBalance(message) { 300 function updateBalance(message) {
300 var balance = getBalanceFromMessage(message); 301 var balance = getBalanceFromMessage(message);
301 if (balance) { 302 if (balance) {
302 logger.info('Balance: ' + balance); 303 logger.info('Balance: ' + balance);
303 aaa.updateBalance(balance); 304 aaa.updateBalance(balance);
304 } 305 }
305 } 306 }
306 307
307 function checkStatus(task) { 308 function checkStatus(task) {
308 309
309 if (Number(config.globals.topup_request_on_check_status)) { 310 if (Number(config.globals.topup_request_on_check_status)) {
310 _topupRequest(task, true); 311 _topupRequest(task, true);
311 return; 312 return;
312 } 313 }
313 314
314 var partnerUrl = url.parse(config.h2h_out.partner); 315 var partnerUrl = url.parse(config.h2h_out.partner);
315 var clientOptions = { 316 var clientOptions = {
316 host: partnerUrl.hostname 317 host: partnerUrl.hostname
317 , port: partnerUrl.port 318 , port: partnerUrl.port
318 , path: partnerUrl.pathname 319 , path: partnerUrl.pathname
319 }; 320 };
320 logger.info('XMLRPC client options:'); 321 logger.info('XMLRPC client options:');
321 logger.info(clientOptions); 322 logger.info(clientOptions);
322 323
323 var client; 324 var client;
324 if (partnerUrl.protocol == 'https:') { 325 if (partnerUrl.protocol == 'https:') {
325 client = xmlrpc.createSecureClient(clientOptions); 326 client = xmlrpc.createSecureClient(clientOptions);
326 } else { 327 } else {
327 client = xmlrpc.createClient(clientOptions); 328 client = xmlrpc.createClient(clientOptions);
328 } 329 }
329 330
330 var methodName = 'topUpInquiry'; 331 var methodName = 'topUpInquiry';
331 332
332 var params = { 333 var params = {
333 REQUESTID: task['requestId'], 334 REQUESTID: task['requestId'],
334 MSISDN: config.h2h_out.userid, 335 MSISDN: config.h2h_out.userid,
335 PIN: config.h2h_out.password, 336 PIN: config.h2h_out.password,
336 NOHP: task['destination'] 337 NOHP: task['destination']
337 }; 338 };
338 339
339 logger.info('Requesting topUpInquiry', {params: params}); 340 logger.info('Requesting topUpInquiry', {params: params});
340 341
341 client.methodCall(methodName, [ params ], function (error, value) { 342 client.methodCall(methodName, [ params ], function (error, value) {
342 // Results of the method response 343 // Results of the method response
343 if (error) { 344 if (error) {
344 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params}); 345 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params});
345 callbackReport( 346 callbackReport(
346 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error}) 347 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error})
347 ); 348 );
348 return; 349 return;
349 } 350 }
350 logger.info('Method response for \'' + methodName, {response: value}); 351 logger.info('Method response for \'' + methodName, {response: value});
351 352
352 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value})); 353 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value}));
353 }); 354 });
354 } 355 }
355 356
356 function start(options) { 357 function start(options) {
357 if (!options) { 358 if (!options) {
358 console.log('Undefined options, terminating....'); 359 console.log('Undefined options, terminating....');
359 process.exit(1); 360 process.exit(1);
360 } 361 }
361 362
362 if (options.config) { 363 if (options.config) {
363 config = options.config; 364 config = options.config;
364 } else { 365 } else {
365 console.log('Undefined options.config, terminating....') 366 console.log('Undefined options.config, terminating....')
366 process.exit(1); 367 process.exit(1);
367 } 368 }
368 369
369 if (options.aaa) { 370 if (options.aaa) {
370 aaa = options.aaa; 371 aaa = options.aaa;
371 _callbackReport = options.aaa.callbackReportWithPushToMongoDb; 372 _callbackReport = options.aaa.callbackReportWithPushToMongoDb;
372 } else { 373 } else {
373 console.log('Undefined options.aaa, terminating....') 374 console.log('Undefined options.aaa, terminating....')
374 process.exit(1); 375 process.exit(1);
375 } 376 }
376 377
377 if (options && options.logger) { 378 if (options && options.logger) {
378 logger = options.logger; 379 logger = options.logger;
379 } else { 380 } else {
380 logger = new winston.Logger({ 381 logger = new winston.Logger({
381 transports: [ 382 transports: [
382 new (winston.transports.Console)() 383 new (winston.transports.Console)()
383 ] 384 ]
384 }); 385 });
385 } 386 }
386 387
387 createRedisClient(config.globals.redis_host, config.globals.redis_port); 388 createRedisClient(config.globals.redis_host, config.globals.redis_port);
388 389
389 if (!Number(config.h2h_out.irs_mode)) { 390 if (!Number(config.h2h_out.irs_mode)) {
390 createServer(); 391 createServer();
391 } 392 }
392 else { 393 else {
393 createPlainHttpServer(); 394 createPlainHttpServer();
394 } 395 }
395 396
396 397
397 var resendDelayOptions = { 398 var resendDelayOptions = {
398 config: config, 399 config: config,
399 topupRequest: checkStatus, 400 topupRequest: checkStatus,
400 logger: logger 401 logger: logger
401 }; 402 };
402 403
403 if (Number(config.globals.topup_request_on_resend_delay)) { 404 if (Number(config.globals.topup_request_on_resend_delay)) {
404 resendDelayOptions.topupRequest = topupRequest; 405 resendDelayOptions.topupRequest = topupRequest;
405 } 406 }
406 407
407 resendDelay.init(resendDelayOptions); 408 resendDelay.init(resendDelayOptions);
408 } 409 }
409 410
410 function parseSN(message, _config) { 411 function parseSN(message, _config) {
411 412
412 if (!_config) { 413 if (!_config) {
413 _config = config; 414 _config = config;
414 } 415 }
415 416
416 var sn_regex = new RegExp(_config.h2h_out.sn_pattern); 417 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
417 var sn_match = message.match(sn_regex); 418 var sn_match = message.match(sn_regex);
418 419
419 if (sn_match <= 0) { 420 if (sn_match <= 0) {
420 logger.info('SN Not found: ' + message); 421 logger.info('SN Not found: ' + message);
421 return ''; 422 return '';
422 } 423 }
423 424
424 var match_index = 0; 425 var match_index = 0;
425 if (_config.h2h_out.sn_match_index) { 426 if (_config.h2h_out.sn_match_index) {
426 match_index = Number(_config.h2h_out.sn_match_index); 427 match_index = Number(_config.h2h_out.sn_match_index);
427 } 428 }
428 429
429 var sn = sn_match[match_index]; 430 var sn = sn_match[match_index];
430 431
431 if (_config.h2h_out.sn_remove_whitespace) { 432 if (_config.h2h_out.sn_remove_whitespace) {
432 sn = sn.replace(/\s/g, ''); 433 sn = sn.replace(/\s/g, '');
433 } 434 }
434 435
435 var sn_remove_patterns = []; 436 var sn_remove_patterns = [];
436 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) { 437 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) {
437 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); 438 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
438 } 439 }
439 var count = sn_remove_patterns.length; 440 var count = sn_remove_patterns.length;
440 441
441 for(var i = 0; i < count; i++) { 442 for(var i = 0; i < count; i++) {
442 443
443 //sn = sn.replace(sn_remove_patterns[i], ''); 444 //sn = sn.replace(sn_remove_patterns[i], '');
444 445
445 var re = new RegExp(sn_remove_patterns[i], 'g'); 446 var re = new RegExp(sn_remove_patterns[i], 'g');
446 sn = sn.replace(re, ''); 447 sn = sn.replace(re, '');
447 } 448 }
448 449
449 //sn = paddingSN(sn, _config); 450 //sn = paddingSN(sn, _config);
450 451
451 return sn.trim(); 452 return sn.trim();
452 } 453 }
453 454
454 function getTaskKey(task, chipInfo) { 455 function getTaskKey(task, chipInfo) {
455 var requestId; 456 var requestId;
456 457
457 if (typeof task === 'string') { 458 if (typeof task === 'string') {
458 requestId = task; 459 requestId = task;
459 } else { 460 } else {
460 try { 461 try {
461 requestId = task.requestId; 462 requestId = task.requestId;
462 } 463 }
463 catch(e) { 464 catch(e) {
464 logger.warn('Something wrong', {task: task}); 465 logger.warn('Something wrong', {task: task});
465 console.trace('Cekidot'); 466 console.trace('Cekidot');
466 process.exit(1); 467 process.exit(1);
467 } 468 }
468 469
469 } 470 }
470 471
471 if (!chipInfo && config && config.globals && config.globals.gateway_name) { 472 if (!chipInfo && config && config.globals && config.globals.gateway_name) {
472 chipInfo = config.globals.gateway_name; 473 chipInfo = config.globals.gateway_name;
473 } 474 }
474 475
475 return chipInfo + '.hitachi.rid:' + requestId; 476 return chipInfo + '.hitachi.rid:' + requestId;
476 } 477 }
477 478
478 479
479 function putTaskToHistory(task, cb) { 480 function putTaskToHistory(task, cb) {
480 if (Number(config.globals.no_dupe_check)) { 481 if (Number(config.globals.no_dupe_check)) {
481 if (cb) { cb(); } 482 if (cb) { cb(); }
482 return; 483 return;
483 } 484 }
484 var key = getTaskKey(task, config.globals.gateway_name); 485 var key = getTaskKey(task, config.globals.gateway_name);
485 logger.verbose('Saving task to history LRU', {key: key, task: task}); 486 logger.verbose('Saving task to history LRU', {key: key, task: task});
486 487
487 try { 488 try {
488 taskHistory.set(key, JSON.parse(JSON.stringify(task))); 489 taskHistory.set(key, JSON.parse(JSON.stringify(task)));
489 } catch (e) { } 490 } catch (e) { }
490 491
491 putTaskToRedis(task, cb); 492 putTaskToRedis(task, cb);
492 } 493 }
493 494
494 function putTaskToRedis(task, cb) { 495 function putTaskToRedis(task, cb) {
495 if (!redisClient) { 496 if (!redisClient) {
496 logger.verbose('Not saving to redis because of undefined redisClient') 497 logger.verbose('Not saving to redis because of undefined redisClient')
497 if (cb) { cb(); } 498 if (cb) { cb(); }
498 return; 499 return;
499 } 500 }
500 501
501 var key = getTaskKey(task, config.globals.gateway_name); 502 var key = getTaskKey(task, config.globals.gateway_name);
502 logger.verbose('Saving task to redis', {key: key, task: task}); 503 logger.verbose('Saving task to redis', {key: key, task: task});
503 504
504 redisClient.set(key, JSON.stringify(task), function() { 505 redisClient.set(key, JSON.stringify(task), function() {
505 redisClient.expire(key, 3600*24*30); 506 redisClient.expire(key, 3600*24*30);
506 if (cb) { 507 if (cb) {
507 cb(); 508 cb();
508 } 509 }
509 }); 510 });
510 } 511 }
511 512
512 function getTaskFromHistory(task, cb) { 513 function getTaskFromHistory(task, cb) {
513 logger.verbose('Getting task from history', {task: task}); 514 logger.verbose('Getting task from history', {task: task});
514 var key = getTaskKey(task, config.globals.gateway_name); 515 var key = getTaskKey(task, config.globals.gateway_name);
515 var archive = taskHistory.get(key); 516 var archive = taskHistory.get(key);
516 517
517 if (archive) { 518 if (archive) {
518 if (cb) { cb(null, archive); } 519 if (cb) { cb(null, archive); }
519 } 520 }
520 else { 521 else {
521 getTaskFromRedis(task, cb); 522 getTaskFromRedis(task, cb);
522 } 523 }
523 } 524 }
524 525
525 function getTaskFromRedis(task, cb) { 526 function getTaskFromRedis(task, cb) {
526 if (!redisClient) { 527 if (!redisClient) {
527 if (cb) { cb(null, null); } 528 if (cb) { cb(null, null); }
528 return; 529 return;
529 } 530 }
530 531
531 var key = getTaskKey(task, config.globals.gateway_name); 532 var key = getTaskKey(task, config.globals.gateway_name);
532 redisClient.get(key, function(err, result) { 533 redisClient.get(key, function(err, result) {
533 if (err) { 534 if (err) {
534 logger.warn('Error retrieving task from redis', {err: err}); 535 logger.warn('Error retrieving task from redis', {err: err});
535 cb(err, null); 536 cb(err, null);
536 return; 537 return;
537 } 538 }
538 539
539 var task; 540 var task;
540 try { 541 try {
541 task = JSON.parse(result); 542 task = JSON.parse(result);
542 } 543 }
543 catch(e) { 544 catch(e) {
544 logger.warn('Exception on parsing redis result as a json', {err: e}); 545 logger.warn('Exception on parsing redis result as a json', {err: e});
545 } 546 }
546 547
547 cb(null, task); 548 cb(null, task);
548 }) 549 })
549 } 550 }
550 551
551 exports.start = start; 552 exports.start = start;
552 exports.topupRequest = topupRequest; 553 exports.topupRequest = topupRequest;
553 exports.getBalanceFromMessage = getBalanceFromMessage; 554 exports.getBalanceFromMessage = getBalanceFromMessage;
554 exports.checkStatus = checkStatus; 555 exports.checkStatus = checkStatus;
555 556