Commit d5ec362d6fcb037c9bccd7eebad9ccfc0cf79180

Authored by Adhidarma Hadiwinoto
1 parent ffcd4b5664
Exists in master

rc irs

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