Commit 02eefd4ecc2b530f7724237f4af825e92d10ab0c

Authored by Adhidarma Hadiwinoto
1 parent f1b4b5a796
Exists in master

penanganan error connect

Showing 1 changed file with 8 additions and 2 deletions Inline Diff

1 "use strict"; 1 "use strict";
2 2
3 var request = require('request'); 3 var request = require('request');
4 var crypto = require('crypto'); 4 var crypto = require('crypto');
5 var url = require('url'); 5 var url = require('url');
6 var http = require('http'); 6 var http = require('http');
7 7
8 var resendDelay = require('sate24/resend-delay'); 8 var resendDelay = require('sate24/resend-delay');
9 var taskHistory = require('sate24/task-history'); 9 var taskHistory = require('sate24/task-history');
10 var antiSameDayDupe = require('sate24/anti-same-day-dupe'); 10 var antiSameDayDupe = require('sate24/anti-same-day-dupe');
11 11
12 var config; 12 var config;
13 var aaa; 13 var aaa;
14 var logger; 14 var logger;
15 15
16 16
17 function start(options) { 17 function start(options) {
18 if (!options) { 18 if (!options) {
19 console.log('Undefined options, terminating....'); 19 console.log('Undefined options, terminating....');
20 process.exit(1); 20 process.exit(1);
21 } 21 }
22 22
23 if (options.config) { 23 if (options.config) {
24 config = options.config; 24 config = options.config;
25 } else { 25 } else {
26 console.log('Undefined options.config, terminating....') 26 console.log('Undefined options.config, terminating....')
27 process.exit(1); 27 process.exit(1);
28 } 28 }
29 29
30 if (options.aaa) { 30 if (options.aaa) {
31 aaa = options.aaa; 31 aaa = options.aaa;
32 } else { 32 } else {
33 console.log('Undefined options.aaa, terminating....') 33 console.log('Undefined options.aaa, terminating....')
34 process.exit(1); 34 process.exit(1);
35 } 35 }
36 36
37 if (options && options.logger) { 37 if (options && options.logger) {
38 logger = options.logger; 38 logger = options.logger;
39 } else { 39 } else {
40 console.log('Undefined options.logger, terminating....') 40 console.log('Undefined options.logger, terminating....')
41 process.exit(1); 41 process.exit(1);
42 } 42 }
43 43
44 resendDelay.init({ 44 resendDelay.init({
45 config: config, 45 config: config,
46 topupRequest: topupRequest, 46 topupRequest: topupRequest,
47 logger: logger 47 logger: logger
48 }); 48 });
49 49
50 taskHistory.init(options); 50 taskHistory.init(options);
51 antiSameDayDupe.init(options); 51 antiSameDayDupe.init(options);
52 52
53 createReverseHttpServer(); 53 createReverseHttpServer();
54 } 54 }
55 55
56 function callbackReport(requestId, rc, message) { 56 function callbackReport(requestId, rc, message) {
57 if (rc != '68') { 57 if (rc != '68') {
58 resendDelay.cancel(requestId); 58 resendDelay.cancel(requestId);
59 } else { 59 } else {
60 taskHistory.get(requestId, function(err, archivedTask) { 60 taskHistory.get(requestId, function(err, archivedTask) {
61 if (archivedTask) { 61 if (archivedTask) {
62 resendDelay.register(archivedTask); 62 resendDelay.register(archivedTask);
63 } else { 63 } else {
64 logger.warn('Can not find task from history', {request_id: requestId}); 64 logger.warn('Can not find task from history', {request_id: requestId});
65 } 65 }
66 }); 66 });
67 } 67 }
68 68
69 aaa.callbackReportWithPushToMongoDb(requestId, rc, message); 69 aaa.callbackReportWithPushToMongoDb(requestId, rc, message);
70 } 70 }
71 71
72 function topupRequest(task) { 72 function topupRequest(task) {
73 if (!aaa.isTodayTrx(task)) { 73 if (!aaa.isTodayTrx(task)) {
74 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); 74 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan');
75 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); 75 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan');
76 resendDelay.cancel(task); 76 resendDelay.cancel(task);
77 return; 77 return;
78 } 78 }
79 79
80 aaa.insertTaskToMongoDb(task); 80 aaa.insertTaskToMongoDb(task);
81 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, _topupRequest); 81 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, _topupRequest);
82 } 82 }
83 83
84 function _topupRequest(task) { 84 function _topupRequest(task) {
85 taskHistory.put(task, function() { 85 taskHistory.put(task, function() {
86 requestToPartner(task);; 86 requestToPartner(task);;
87 }); 87 });
88 } 88 }
89 89
90 function checkStatus(task) { 90 function checkStatus(task) {
91 taskHistory.put(task, function() { 91 taskHistory.put(task, function() {
92 requestToPartner(task, true); 92 requestToPartner(task, true);
93 }); 93 });
94 } 94 }
95 95
96 function requestToPartner(task, pendingOnErrorConnect) { 96 function requestToPartner(task, pendingOnErrorConnect) {
97 let requestOptions = createRequestOptions(task); 97 let requestOptions = createRequestOptions(task);
98 98
99 logger.info('Requesting to partner', {task: task, request_options: requestOptions}); 99 logger.info('Requesting to partner', {task: task, request_options: requestOptions});
100 100
101 request(requestOptions, function(error, response, body) { 101 request(requestOptions, function(error, response, body) {
102 if (error) { 102 if (error) {
103 logger.warn('Error requesting to partner', {task: task, error: error}); 103 let rc = '68';
104 callbackReport(task.requestId, '68', 'Error requesting to partner. ' + error); 104
105 if (!pendingOnErrorConnect && (error.syscall == 'connect')) {
106 rc = '91';
107 }
108
109 logger.warn('Error requesting to partner', {task: task, rc: rc, error: error});
110 callbackReport(task.requestId, rc, 'Error requesting to partner. ' + error);
105 return; 111 return;
106 } 112 }
107 113
108 if (response.statusCode != 200) { 114 if (response.statusCode != 200) {
109 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode}); 115 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode});
110 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode); 116 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode);
111 return; 117 return;
112 } 118 }
113 119
114 logger.verbose('Got response from partner', {task: task, body: body}); 120 logger.verbose('Got response from partner', {task: task, body: body});
115 121
116 parseMessage(task, body); 122 parseMessage(task, body);
117 }); 123 });
118 } 124 }
119 125
120 function getRequestIdFromTask(task) { 126 function getRequestIdFromTask(task) {
121 if (typeof task == 'string') { 127 if (typeof task == 'string') {
122 return task; 128 return task;
123 } 129 }
124 130
125 try { 131 try {
126 let requestId = task.requestId; 132 let requestId = task.requestId;
127 return requestId; 133 return requestId;
128 } 134 }
129 catch(e) {return}; 135 catch(e) {return};
130 } 136 }
131 137
132 function parseMessage(task, message) { 138 function parseMessage(task, message) {
133 let requestId = getRequestIdFromTask(task); 139 let requestId = getRequestIdFromTask(task);
134 140
135 if (!requestId) { 141 if (!requestId) {
136 logger.warn('Invalid requestId on parseMessage', {task: task, message: message}); 142 logger.warn('Invalid requestId on parseMessage', {task: task, message: message});
137 return; 143 return;
138 } 144 }
139 145
140 let rc = '68'; 146 let rc = '68';
141 147
142 if (message.indexOf('SUKSES') >= 0) { 148 if (message.indexOf('SUKSES') >= 0) {
143 rc = '00'; 149 rc = '00';
144 } 150 }
145 else if (message.indexOf('GAGAL. Nomor tujuan salah') >= 0) { 151 else if (message.indexOf('GAGAL. Nomor tujuan salah') >= 0) {
146 rc = '14'; 152 rc = '14';
147 } 153 }
148 else if (message.indexOf('NO HP TIDAK TERDAFTAR ATAU BUKAN NOMOR PRA-BAYAR') >= 0) { 154 else if (message.indexOf('NO HP TIDAK TERDAFTAR ATAU BUKAN NOMOR PRA-BAYAR') >= 0) {
149 rc = '14'; 155 rc = '14';
150 } 156 }
151 else if (message.indexOf('Gagal.') >= 0) { 157 else if (message.indexOf('Gagal.') >= 0) {
152 rc = '40'; 158 rc = '40';
153 } 159 }
154 else if (message.indexOf('GAGAL') >= 0) { 160 else if (message.indexOf('GAGAL') >= 0) {
155 rc = '40'; 161 rc = '40';
156 } 162 }
157 else if (message.indexOf('gagal, dibatalkan SILAHKAN DICOBA KEMBALI') >= 0) { 163 else if (message.indexOf('gagal, dibatalkan SILAHKAN DICOBA KEMBALI') >= 0) {
158 rc = '40'; 164 rc = '40';
159 } 165 }
160 else if (message.indexOf('Invalid Signature') >= 0) { 166 else if (message.indexOf('Invalid Signature') >= 0) {
161 rc = '40'; 167 rc = '40';
162 } 168 }
163 169
164 if (rc == '00') { 170 if (rc == '00') {
165 let sn = parseSn(message, config.h2h_out.sn_pattern); 171 let sn = parseSn(message, config.h2h_out.sn_pattern);
166 if (sn) { 172 if (sn) {
167 message = "SN=" + sn + ";" + message; 173 message = "SN=" + sn + ";" + message;
168 } 174 }
169 } 175 }
170 176
171 callbackReport(requestId, rc, message); 177 callbackReport(requestId, rc, message);
172 } 178 }
173 179
174 function generateSign(userid, remoteProduct, destination, requestId, pin, password) { 180 function generateSign(userid, remoteProduct, destination, requestId, pin, password) {
175 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|"); 181 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|");
176 //let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex'); 182 //let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex');
177 //let buffer = new Buffer(sha1); 183 //let buffer = new Buffer(sha1);
178 let buffer = crypto.createHash('sha1').update(plain).digest(); 184 let buffer = crypto.createHash('sha1').update(plain).digest();
179 185
180 return buffer.toString('base64').replace(/\//g, '_').replace(/\+/g, '-'); 186 return buffer.toString('base64').replace(/\//g, '_').replace(/\+/g, '-');
181 } 187 }
182 188
183 function createRequestOptions(task) { 189 function createRequestOptions(task) {
184 return { 190 return {
185 url: config.h2h_out.partner, 191 url: config.h2h_out.partner,
186 qs: { 192 qs: {
187 memberID: config.h2h_out.userid, 193 memberID: config.h2h_out.userid,
188 product: task.remoteProduct, 194 product: task.remoteProduct,
189 dest: task.destination, 195 dest: task.destination,
190 refID: task.requestId, 196 refID: task.requestId,
191 sign: generateSign( 197 sign: generateSign(
192 config.h2h_out.userid, 198 config.h2h_out.userid,
193 task.remoteProduct, 199 task.remoteProduct,
194 task.destination, 200 task.destination,
195 task.requestId, 201 task.requestId,
196 config.h2h_out.pin, 202 config.h2h_out.pin,
197 config.h2h_out.password 203 config.h2h_out.password
198 ) 204 )
199 } 205 }
200 }; 206 };
201 } 207 }
202 208
203 function onSameDayDupe(task) { 209 function onSameDayDupe(task) {
204 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama'); 210 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama');
205 } 211 }
206 212
207 function reverseHttpServerServerHandler(request, response) { 213 function reverseHttpServerServerHandler(request, response) {
208 let qs = url.parse(request.url, true).query; 214 let qs = url.parse(request.url, true).query;
209 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs}); 215 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs});
210 216
211 parseMessage(qs.refid, qs.message); 217 parseMessage(qs.refid, qs.message);
212 } 218 }
213 219
214 function createReverseHttpServer() { 220 function createReverseHttpServer() {
215 var httpServer = http.createServer(reverseHttpServerServerHandler); 221 var httpServer = http.createServer(reverseHttpServerServerHandler);
216 222
217 httpServer.listen(config.h2h_out.listen_port, function() { 223 httpServer.listen(config.h2h_out.listen_port, function() {
218 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port); 224 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port);
219 }); 225 });
220 } 226 }
221 227
222 function parseSn(message, pattern) { 228 function parseSn(message, pattern) {
223 229
224 try { 230 try {
225 let sn_regex = new RegExp(pattern); 231 let sn_regex = new RegExp(pattern);
226 let sn_match = message.match(sn_regex); 232 let sn_match = message.match(sn_regex);
227 233
228 return sn_match[1].trim(); 234 return sn_match[1].trim();
229 } 235 }
230 catch(e) { 236 catch(e) {
231 return; 237 return;
232 } 238 }
233 239
234 } 240 }
235 241
236 exports.start = start; 242 exports.start = start;
237 exports.topupRequest = topupRequest; 243 exports.topupRequest = topupRequest;
238 exports.generateSign = generateSign; 244 exports.generateSign = generateSign;
239 exports.parseSn = parseSn; 245 exports.parseSn = parseSn;
240 246