var url = require('url');
var math = require('mathjs');
var request = require('request');
var xml = require("xml2js").parseString;
var config;
var callbackReport;
var max_retry = 3;
var sleep_before_retry = 3000;
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 params = {
userid: config.h2h_out.userid,
pwd: config.h2h_out.password,
memberreff: task['requestId'],
produk: task['remoteProduct'],
tujuan: task['destination']
};
console.log('PARAMS:');
console.log(params);
request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) {
if (err) {
console.log('HTTP Request Error (' + task['requestId'] + '): ');
console.log(error);
if (retry) {
console.log('Retrying trx hit (' + retry + ')');
setTimeout(function() {
topupRequest(task, retry - 1);
}, sleep_before_retry);
} else {
callbackReport(task['requestId'], '54', 'Gangguan koneksi ke suplier');
}
return;
}
console.log('Server Response: ');
console.log(httpResponseBody);
xml(httpResponseBody, function(err, result) {
if (err) {
console.log('Gagal parsing XML respon server');
topupRequest(task, retry - 1);
return;
}
console.log('Response Data:');
console.log(result);
var response_code = result.respon.rc.replace(/^00/, '');
var token = result.respon.token;
var data = result.respon.data.replace(/ /g, '-');
var sn = token + '/' + data;
var message = result.respon.pesan.replace(/\n/g, ' ');
message = 'SN=' + sn + '; ' + message;
callbackReport(task['requestId'], response_code, message);
if (response_code == '68') {
setTimeout(function() {
topupRequest(task, 5);
}, 60000);
}
});
});
}
function start(_config, _callbackReport) {
config = _config;
callbackReport = _callbackReport
}
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();
}
function parseResult(message) {
var data;
xml(message, function(err, result) {
data = result;
});
return data;
}
exports.start = start;
exports.topupRequest = topupRequest;
exports.parseResult = parseResult;