Commit afeff1ad3ca06e867dda655c7101ae2ec633ae38

Authored by Adhidarma Hadiwinoto
1 parent a92c3789b9
Exists in master

strip space on createPlainHttpServer

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