var xmlrpc = require('xmlrpc'); var url = require('url'); var math = require('mathjs'); var config; var callbackReport; var max_retry = 2; var sleep_before_retry = 2000; process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; function topupRequest(task, retry) { if (config.globals.requests_count == undefined) { config.globals.requests_count = 1; } else { config.globals.requests_count++; } if (config.globals.active_requests_count == undefined) { config.globals.active_requests_count = 1; } else { config.globals.active_requests_count++; } if (config.globals.max_active_requests_count == undefined) { config.globals.max_active_requests_count = config.globals.active_requests_count; } else { config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); } if (retry === undefined) { retry = max_retry; } var partnerUrl = url.parse(config.h2h_out.partner); var clientOptions = { host: partnerUrl.hostname , port: partnerUrl.port , path: partnerUrl.pathname }; console.log('XMLRPC client options:'); console.log(clientOptions); var client; if (partnerUrl.protocol == 'https:') { console.log('Use SSL'); client = xmlrpc.createSecureClient(clientOptions); } else { console.log('Not using SSL'); client = xmlrpc.createClient(clientOptions); } var methodName = 'topUpRequest'; console.log('methodName: ' + methodName); var params = { MSISDN: config.h2h_out.userid, REQUESTID: task['requestId'], PIN: config.h2h_out.password, NOHP: task['destination'], NOM: task['remoteProduct'] }; console.log('PARAMS:'); console.log(params); client.methodCall(methodName, [ params ], function (error, value) { if (config.globals.active_requests_count == undefined) { config.globals.active_requests_count = 0; } else { config.globals.active_requests_count--; } // Results of the method response if (error) { console.log('XMLRPC Client Error (' + task['requestId'] + '): '); console.log(error); if (retry) { console.log('Retrying topUpRequest (' + retry + ')'); setTimeout(function() { topupRequest(task, retry - 1); }, sleep_before_retry); } else { callbackReport(task['requestId'], '40', 'Gangguan koneksi ke suplier'); } return; } console.log('Method response for \'' + methodName + '\': ') console.log(value); if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; //console.log('Message with SN: ' + value['MESSAGE']); } callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); }); } function createServer() { console.log('Creating XML-RPC server on port ' + config.h2h_out.listen_port); var serverOptions = { port: config.h2h_out.listen_port }; var server = xmlrpc.createServer(serverOptions); server.on('NotFound', function (method, params) { console.log(method + ' is not found on our XML-RPC server'); console.log('params:'); console.log(params); }); server.on('topUpReport', function (err, params, callback) { console.log('RECEIVE topUpReport, params:'); console.log(params); var paramscount = params.length; for (var i = 0; i < paramscount; i++) { var value = params[i]; if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; //console.log('Message with SN: ' + value['MESSAGE']); } callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); } callback(null, 'ACK REPORT OK'); }) } function checkStatus(task) { var partnerUrl = url.parse(config.h2h_out.partner); var clientOptions = { host: partnerUrl.hostname , port: partnerUrl.port , path: partnerUrl.pathname }; console.log('XMLRPC client options:'); console.log(clientOptions); var client; if (partnerUrl.protocol == 'https:') { console.log('Use SSL'); client = xmlrpc.createSecureClient(clientOptions); } else { console.log('Not using SSL'); client = xmlrpc.createClient(clientOptions); } var methodName = 'topUpInquiry'; console.log('methodName: ' + methodName); var params = { MSISDN: config.h2h_out.userid, REQUESTID: task['requestId'], PIN: config.h2h_out.password, NOHP: task['destination'] }; console.log('PARAMS:'); console.log(params); client.methodCall(methodName, [ params ], function (error, value) { // Results of the method response if (error) { console.log('Error: '); console.log(error); return; } console.log('Method response for \'' + methodName + '\': ') console.log(value); callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); }); } function start(_config, _callbackReport) { config = _config; callbackReport = _callbackReport createServer(); } function parseSN(message) { var sn_regex = new RegExp(config.h2h_out.sn_pattern); var sn_match = message.match(sn_regex); //console.log('SN MATCH:'); //console.log(sn_match); if (sn_match <= 0) { console.log('SN Not found: ' + message); return ''; } var sn = sn_match[0]; var sn_remove_patterns = config.h2h_out.sn_remove_patterns.split(config.h2h_out.sn_remove_patterns_separator); //console.log('SN REMOVE PATTERNS:'); //console.log (sn_remove_patterns); var count = sn_remove_patterns.length; for(var i = 0; i < count; i++) { sn = sn.replace(sn_remove_patterns[i], ''); } return sn.trim(); } exports.start = start; exports.topupRequest = topupRequest;