Commit d073f46c90718542288846e593a59ab1718655c4
1 parent
76e39b15cc
Exists in
master
resync with others
Showing 2 changed files with 22 additions and 9 deletions Inline Diff
httppulsakita.js
1 | var url = require('url'); | 1 | var url = require('url'); |
2 | var math = require('mathjs'); | 2 | var math = require('mathjs'); |
3 | var request = require('request'); | 3 | var request = require('request'); |
4 | var xml = require("xml2js").parseString; | 4 | var xml = require("xml2js").parseString; |
5 | var winston = require('winston'); | 5 | var winston = require('winston'); |
6 | 6 | ||
7 | var logger; | 7 | var logger; |
8 | var config; | 8 | var config; |
9 | var callbackReport; | 9 | var callbackReport; |
10 | var aaa; | ||
10 | 11 | ||
11 | var max_retry = 15; | 12 | var max_retry = 15; |
12 | var sleep_before_retry = 60 * 1000; | 13 | var sleep_before_retry = 60 * 1000; |
13 | 14 | ||
14 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; | 15 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; |
15 | 16 | ||
16 | function parseSN(message, _config) { | 17 | function parseSN(message, _config) { |
17 | 18 | ||
18 | if (!_config) { | 19 | if (!_config) { |
19 | _config = config; | 20 | _config = config; |
20 | } | 21 | } |
21 | 22 | ||
22 | var sn_regex = new RegExp(_config.h2h_out.sn_pattern); | 23 | var sn_regex = new RegExp(_config.h2h_out.sn_pattern); |
23 | var sn_match = message.match(sn_regex); | 24 | var sn_match = message.match(sn_regex); |
24 | 25 | ||
25 | if (sn_match <= 0) { | 26 | if (sn_match <= 0) { |
26 | logger.info('SN Not found: ' + message); | 27 | logger.info('SN Not found: ' + message); |
27 | return ''; | 28 | return ''; |
28 | } | 29 | } |
29 | 30 | ||
30 | var sn = sn_match[0]; | 31 | var sn = sn_match[0]; |
31 | var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); | 32 | var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); |
32 | 33 | ||
33 | var count = sn_remove_patterns.length; | 34 | var count = sn_remove_patterns.length; |
34 | 35 | ||
35 | for(var i = 0; i < count; i++) { | 36 | for(var i = 0; i < count; i++) { |
36 | sn = sn.replace(sn_remove_patterns[i], ''); | 37 | sn = sn.replace(sn_remove_patterns[i], ''); |
37 | } | 38 | } |
38 | 39 | ||
39 | return sn.trim(); | 40 | return sn.trim(); |
40 | } | 41 | } |
41 | 42 | ||
42 | function topupRequest(task, retry) { | 43 | function topupRequest(task, retry) { |
43 | /* | 44 | /* |
44 | if (config.globals.requests_count == undefined) { | 45 | if (config.globals.requests_count == undefined) { |
45 | config.globals.requests_count = 1; | 46 | config.globals.requests_count = 1; |
46 | } else { | 47 | } else { |
47 | config.globals.requests_count++; | 48 | config.globals.requests_count++; |
48 | } | 49 | } |
49 | 50 | ||
50 | if (config.globals.active_requests_count == undefined) { | 51 | if (config.globals.active_requests_count == undefined) { |
51 | config.globals.active_requests_count = 1; | 52 | config.globals.active_requests_count = 1; |
52 | } else { | 53 | } else { |
53 | config.globals.active_requests_count++; | 54 | config.globals.active_requests_count++; |
54 | } | 55 | } |
55 | 56 | ||
56 | if (config.globals.max_active_requests_count == undefined) { | 57 | if (config.globals.max_active_requests_count == undefined) { |
57 | config.globals.max_active_requests_count = config.globals.active_requests_count; | 58 | config.globals.max_active_requests_count = config.globals.active_requests_count; |
58 | } else { | 59 | } else { |
59 | config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); | 60 | config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); |
60 | } | 61 | } |
61 | */ | 62 | */ |
62 | 63 | ||
63 | 64 | ||
64 | if (retry === undefined) { | 65 | if (retry === undefined) { |
65 | retry = max_retry; | 66 | retry = max_retry; |
66 | } | 67 | } |
67 | 68 | ||
68 | var params = { | 69 | var params = { |
69 | userid: config.h2h_out.userid, | 70 | userid: config.h2h_out.userid, |
70 | pwd: config.h2h_out.password, | 71 | pwd: config.h2h_out.password, |
71 | memberreff: task['requestId'], | 72 | memberreff: task['requestId'], |
72 | produk: task['remoteProduct'], | 73 | produk: task['remoteProduct'], |
73 | tujuan: task['destination'] | 74 | tujuan: task['destination'] |
74 | }; | 75 | }; |
75 | logger.info('Creating http request to gateway', {params: params}); | 76 | logger.info('Creating http request to gateway', {params: params}); |
76 | 77 | ||
77 | request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { | 78 | request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { |
78 | 79 | ||
79 | /* | 80 | /* |
80 | config.globals.active_requests_count--; | 81 | config.globals.active_requests_count--; |
81 | */ | 82 | */ |
82 | 83 | ||
83 | if (err) { | 84 | if (err) { |
84 | logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err); | 85 | logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err); |
85 | 86 | ||
86 | callbackReport(task['requestId'], '89', 'Gangguan koneksi ke suplier'); | 87 | callbackReport(task['requestId'], '89', 'Gangguan koneksi ke suplier'); |
87 | return; | 88 | return; |
88 | } | 89 | } |
89 | 90 | ||
90 | logger.info('Got response from gateway ', {response_body: httpResponseBody}); | 91 | logger.info('Got response from gateway ', {response_body: httpResponseBody}); |
91 | 92 | ||
92 | if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { | 93 | if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { |
93 | callbackReport(task['requestId'], '91', '502 Proxy error'); | 94 | callbackReport(task['requestId'], '91', '502 Proxy error'); |
94 | return; | 95 | return; |
95 | } | 96 | } |
96 | 97 | ||
97 | xml(httpResponseBody, function(err, result) { | 98 | xml(httpResponseBody, function(err, result) { |
98 | if (err) { | 99 | if (err) { |
99 | logger.warn('Gagal parsing XML respon server'); | 100 | logger.warn('Gagal parsing XML respon server'); |
100 | //topupRequest(task, retry - 1); | 101 | //topupRequest(task, retry - 1); |
101 | callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); | 102 | callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); |
102 | return; | 103 | return; |
103 | } | 104 | } |
104 | 105 | ||
105 | logger.info('Response Data:', {result: result}); | 106 | logger.info('Response Data:', {result: result}); |
106 | 107 | ||
107 | var response_code = result.respon.rc[0].replace(/^00/, ''); | 108 | var response_code = result.respon.rc[0].replace(/^00/, ''); |
108 | if (response_code == '54' || response_code == '68') { | 109 | if (response_code == '54' || response_code == '68') { |
109 | if (retry) { | 110 | if (retry) { |
110 | setTimeout(function() { | 111 | setTimeout(function() { |
111 | 112 | ||
112 | logger.info('Sending advice', {task: task}); | 113 | logger.info('Sending advice', {task: task}); |
113 | 114 | ||
114 | task['remoteProduct'] = 'ADVPLN'; | 115 | task['remoteProduct'] = 'ADVPLN'; |
115 | topupRequest(task, retry - 1); | 116 | topupRequest(task, retry - 1); |
116 | 117 | ||
117 | }, sleep_before_retry); | 118 | }, sleep_before_retry); |
118 | 119 | ||
119 | } else { | 120 | } else { |
120 | logger.warn('Max retries exceeded', {task: task}); | 121 | logger.warn('Max retries exceeded', {task: task}); |
121 | callbackReport(task['requestId'], '68', message + '. Max retries exceeded'); | 122 | callbackReport(task['requestId'], '68', message + '. Max retries exceeded'); |
122 | } | 123 | } |
123 | return; | 124 | return; |
124 | } | 125 | } |
125 | 126 | ||
126 | var token = ''; | 127 | var token = ''; |
127 | if (result.respon.token) { | 128 | if (result.respon.token) { |
128 | token = result.respon.token[0]; | 129 | token = result.respon.token[0]; |
129 | } | 130 | } |
130 | 131 | ||
131 | var data_pelanggan = 'NO-DATA'; | 132 | var data_pelanggan = 'NO-DATA'; |
132 | if (result.respon.data) { | 133 | if (result.respon.data) { |
133 | 134 | ||
134 | try { | 135 | try { |
135 | var _data_pelanggan = result.respon.data[0].replace(/ /g, '-'); | 136 | var _data_pelanggan = result.respon.data[0].replace(/ /g, '-'); |
136 | var fields = _data_pelanggan.split('/'); | 137 | var fields = _data_pelanggan.split('/'); |
137 | 138 | ||
138 | data_pelanggan = [ | 139 | data_pelanggan = [ |
139 | fields[0], fields[1], fields[2], fields[3] | 140 | fields[0], fields[1], fields[2], fields[3] |
140 | ].join('/'); | 141 | ].join('/'); |
141 | } | 142 | } |
142 | catch(err) { | 143 | catch(err) { |
143 | logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan}); | 144 | logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan}); |
144 | } | 145 | } |
145 | 146 | ||
146 | 147 | ||
147 | } | 148 | } |
148 | 149 | ||
149 | var message = result.respon.pesan[0].replace(/\n/g, ' '); | 150 | var message = result.respon.pesan[0].replace(/\n/g, ' '); |
150 | 151 | ||
151 | 152 | ||
152 | if (response_code == '00') { | 153 | if (response_code == '00') { |
153 | 154 | ||
154 | var sn = ""; | 155 | var sn = ""; |
155 | 156 | ||
156 | if (config.h2h_out.parse_sn == 'YES') { | 157 | if (config.h2h_out.parse_sn == 'YES') { |
157 | sn = parseSN(message); | 158 | sn = parseSN(message); |
158 | } else if (token && data_pelanggan) { | 159 | } else if (token && data_pelanggan) { |
159 | sn = token + '/' + data_pelanggan; | 160 | sn = token + '/' + data_pelanggan; |
160 | } | 161 | } |
161 | 162 | ||
162 | message = 'SN=' + sn + '; ' + message; | 163 | message = 'SN=' + sn + '; ' + message; |
163 | } | 164 | } |
164 | 165 | ||
165 | callbackReport(task['requestId'], response_code, message); | 166 | callbackReport(task['requestId'], response_code, message); |
166 | 167 | ||
167 | }); | 168 | }); |
168 | }); | 169 | }); |
169 | } | 170 | } |
170 | 171 | ||
171 | function start(_config, _callbackReport, options) { | 172 | function start(_config, _callbackReport, options) { |
172 | config = _config; | 173 | config = _config; |
173 | callbackReport = _callbackReport | 174 | callbackReport = _callbackReport; |
175 | |||
176 | if (options && options.aaa) { | ||
177 | aaa = options.aaa; | ||
178 | } | ||
174 | 179 | ||
175 | if (options && options.logger) { | 180 | if (options && options.logger) { |
176 | logger = options.logger; | 181 | logger = options.logger; |
177 | } else { | 182 | } else { |
178 | logger = new winston.Logger({ | 183 | logger = new winston.Logger({ |
179 | transports: [ | 184 | transports: [ |
180 | new (winston.transports.Console)() | 185 | new (winston.transports.Console)() |
181 | ] | 186 | ] |
182 | }); | 187 | }); |
183 | } | 188 | } |
184 | } | 189 | } |
185 | 190 | ||
186 | function parseResult(message) { | 191 | function parseResult(message) { |
187 | var data; | 192 | var data; |
188 | xml(message, function(err, result) { | 193 | xml(message, function(err, result) { |
189 | data = result; | 194 | data = result; |
190 | }); | 195 | }); |
191 | return data; | 196 | return data; |
192 | } | 197 | } |
193 | 198 | ||
194 | exports.start = start; | 199 | exports.start = start; |
195 | exports.topupRequest = topupRequest; | 200 | exports.topupRequest = topupRequest; |
196 | exports.parseResult = parseResult; | 201 | exports.parseResult = parseResult; |
197 | exports.parseSN = parseSN; | 202 | exports.parseSN = parseSN; |
198 | 203 |
index.js
1 | var fs = require('fs'); | 1 | var fs = require('fs'); |
2 | var ini = require('ini'); | 2 | var ini = require('ini'); |
3 | var expresso = require('sate24-expresso'); | ||
3 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); | 4 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); |
4 | 5 | ||
6 | process.chdir(__dirname); | ||
5 | 7 | ||
6 | var logger = require('sate24/logger.js').start(); | 8 | var logger = require('sate24/logger.js').start(); |
9 | var HttpServer = require('sate24/httpserver.js'); | ||
10 | var aaa = require('sate24/aaa.js'); | ||
11 | var partner = require('./httppulsakita.js'); | ||
7 | 12 | ||
8 | var aaaHost = config.globals.aaa_host; | 13 | var matrix = aaa.prepareMatrix(); |
9 | 14 | ||
10 | HttpServer = require('sate24/httpserver.js'); | 15 | var options = { |
11 | var httpServer = HttpServer.start(config, {logger: logger}); | 16 | 'aaa': aaa, |
17 | 'logger': logger, | ||
18 | 'config': config, | ||
19 | 'matrix': matrix, | ||
20 | } | ||
12 | 21 | ||
13 | var aaa = require('sate24/aaa.js'); | 22 | var httpServer = HttpServer.start(config, options); |
14 | HttpServer.setAaa(aaa); | ||
15 | 23 | ||
16 | var partner = require('./httppulsakita.js'); | 24 | partner.start(config, aaa.callbackReport, options); |
25 | aaa.start(config, partner, options); | ||
26 | expresso.start(options); | ||
17 | 27 |