Commit 35d5bfc57e2ef4db6e2cf1d1faea7b6d68764e97

Authored by Adhidarma Hadiwinoto
1 parent 9e6667eac9
Exists in master

exports.cancelResendDelay

Showing 1 changed file with 1 additions and 0 deletions Inline Diff

1 var redis = require('redis'); 1 var redis = require('redis');
2 var moment = require('moment'); 2 var moment = require('moment');
3 var LRU = require('lru-cache'); 3 var LRU = require('lru-cache');
4 4
5 var config; 5 var config;
6 var logger; 6 var logger;
7 var partner; 7 var partner;
8 var imConfig; 8 var imConfig;
9 var redisClient; 9 var redisClient;
10 10
11 var resendHandlers = LRU({max: 2000, maxAge: 1000 * 3600 * 36}); 11 var resendHandlers = LRU({max: 2000, maxAge: 1000 * 3600 * 36});
12 12
13 function init(options) { 13 function init(options) {
14 if (options && options.config) { 14 if (options && options.config) {
15 config = options.config; 15 config = options.config;
16 } 16 }
17 17
18 if (options && options.logger) { 18 if (options && options.logger) {
19 logger = options.logger; 19 logger = options.logger;
20 } 20 }
21 21
22 createRedisClient(config.globals.redis_host, config.globals.redis_port); 22 createRedisClient(config.globals.redis_host, config.globals.redis_port);
23 readImConfig(); 23 readImConfig();
24 } 24 }
25 25
26 function createRedisClient(host, port) { 26 function createRedisClient(host, port) {
27 try { 27 try {
28 redisClient = redis.createClient(port, host); 28 redisClient = redis.createClient(port, host);
29 } catch(err) { 29 } catch(err) {
30 logger.warn("Error creating redis client to " + host + ':' + port); 30 logger.warn("Error creating redis client to " + host + ':' + port);
31 } 31 }
32 } 32 }
33 33
34 function readImConfig(filename) { 34 function readImConfig(filename) {
35 35
36 if (!filename) { 36 if (!filename) {
37 filename = process.cwd() + '/config.im.json'; 37 filename = process.cwd() + '/config.im.json';
38 } 38 }
39 39
40 try { 40 try {
41 imConfig = require(filename); 41 imConfig = require(filename);
42 } 42 }
43 catch(e) { 43 catch(e) {
44 imConfig = {}; 44 imConfig = {};
45 } 45 }
46 46
47 logger.verbose('IM Config', {imConfig: imConfig}); 47 logger.verbose('IM Config', {imConfig: imConfig});
48 return imConfig; 48 return imConfig;
49 } 49 }
50 50
51 function getPatternFromMessage(message, pattern, patternMatchIndex) { 51 function getPatternFromMessage(message, pattern, patternMatchIndex) {
52 var re = new RegExp(pattern); 52 var re = new RegExp(pattern);
53 var matches = message.match(re); 53 var matches = message.match(re);
54 54
55 if (!matches) { 55 if (!matches) {
56 return null; 56 return null;
57 } 57 }
58 58
59 if (patternMatchIndex < matches.length) { 59 if (patternMatchIndex < matches.length) {
60 return matches[patternMatchIndex]; 60 return matches[patternMatchIndex];
61 } else { 61 } else {
62 return null; 62 return null;
63 } 63 }
64 } 64 }
65 65
66 function getPatternsFromMessage(message, patterns) { 66 function getPatternsFromMessage(message, patterns) {
67 var patternCount = patterns.length; 67 var patternCount = patterns.length;
68 for (var i = 0; i < patternCount; i++) { 68 for (var i = 0; i < patternCount; i++) {
69 69
70 var pattern = patterns[i]; 70 var pattern = patterns[i];
71 71
72 var result = getPatternFromMessage(message, pattern.pattern, pattern.matchIndex); 72 var result = getPatternFromMessage(message, pattern.pattern, pattern.matchIndex);
73 if (result) { 73 if (result) {
74 return result; 74 return result;
75 } 75 }
76 } 76 }
77 } 77 }
78 78
79 function getTaskKey(task, chipInfo, today) { 79 function getTaskKey(task, chipInfo, today) {
80 if (!chipInfo && config && config.globals && config.globals.gateway_name) { 80 if (!chipInfo && config && config.globals && config.globals.gateway_name) {
81 chipInfo = config.globals.gateway_name; 81 chipInfo = config.globals.gateway_name;
82 } 82 }
83 83
84 if (task.timestamp && !today) { 84 if (task.timestamp && !today) {
85 today = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYYMMDD'); 85 today = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYYMMDD');
86 } 86 }
87 87
88 return chipInfo + '.trx.date:' + today + '.rProduct:' + task.remoteProduct.toUpperCase() + '.dest:' + task.destination ; 88 return chipInfo + '.trx.date:' + today + '.rProduct:' + task.remoteProduct.toUpperCase() + '.dest:' + task.destination ;
89 } 89 }
90 90
91 function saveTask(task, cb) { 91 function saveTask(task, cb) {
92 var key = getTaskKey(task, config.globals.gateway_name); 92 var key = getTaskKey(task, config.globals.gateway_name);
93 logger.verbose('Saving task', {key: key, task: task}); 93 logger.verbose('Saving task', {key: key, task: task});
94 94
95 redisClient.set(key, JSON.stringify(task), function() { 95 redisClient.set(key, JSON.stringify(task), function() {
96 redisClient.expire(key, 3600*24); 96 redisClient.expire(key, 3600*24);
97 if (cb) { 97 if (cb) {
98 cb(); 98 cb();
99 } 99 }
100 }); 100 });
101 } 101 }
102 102
103 function getTask(remoteProduct, destination, cb) { 103 function getTask(remoteProduct, destination, cb) {
104 var dummyTask = { 104 var dummyTask = {
105 remoteProduct: remoteProduct, 105 remoteProduct: remoteProduct,
106 destination: destination, 106 destination: destination,
107 } 107 }
108 108
109 var key = getTaskKey(dummyTask, config.globals.gateway_name, moment().format('YYYYMMDD')); 109 var key = getTaskKey(dummyTask, config.globals.gateway_name, moment().format('YYYYMMDD'));
110 redisClient.get(key, function(err, result) { 110 redisClient.get(key, function(err, result) {
111 if (err) { 111 if (err) {
112 logger.verbose('getTask: task not found', {key: key, params: dummyTask}); 112 logger.verbose('getTask: task not found', {key: key, params: dummyTask});
113 113
114 cb(err, null); 114 cb(err, null);
115 return; 115 return;
116 } 116 }
117 117
118 var task = {}; 118 var task = {};
119 119
120 try { 120 try {
121 task = JSON.parse(result); 121 task = JSON.parse(result);
122 } 122 }
123 catch(e) { 123 catch(e) {
124 logger.warn('getTask: Can not parse result', {key: key, params: dummyTask, data: result}); 124 logger.warn('getTask: Can not parse result', {key: key, params: dummyTask, data: result});
125 err = "Can not parse result" 125 err = "Can not parse result"
126 } 126 }
127 cb(err, task); 127 cb(err, task);
128 }); 128 });
129 } 129 }
130 130
131 function deleteTask(remoteProduct, destination) { 131 function deleteTask(remoteProduct, destination) {
132 var dummyTask = { 132 var dummyTask = {
133 remoteProduct: remoteProduct, 133 remoteProduct: remoteProduct,
134 destination: destination, 134 destination: destination,
135 } 135 }
136 136
137 var key = getTaskKey(dummyTask, config.globals.gateway_name, moment().format('YYYYMMDD')); 137 var key = getTaskKey(dummyTask, config.globals.gateway_name, moment().format('YYYYMMDD'));
138 138
139 try { 139 try {
140 redisClient.del(key); 140 redisClient.del(key);
141 } 141 }
142 catch(e) {}; 142 catch(e) {};
143 } 143 }
144 144
145 function createMessage(pattern, keywords) { 145 function createMessage(pattern, keywords) {
146 var msg = pattern; 146 var msg = pattern;
147 147
148 for (var key in keywords) { 148 for (var key in keywords) {
149 msg = msg.replace('[' + key + ']', keywords[key]); 149 msg = msg.replace('[' + key + ']', keywords[key]);
150 } 150 }
151 return msg; 151 return msg;
152 } 152 }
153 153
154 function getRemoteProductFromMessage(msg) { 154 function getRemoteProductFromMessage(msg) {
155 return getPatternsFromMessage(msg, imConfig.product_patterns); 155 return getPatternsFromMessage(msg, imConfig.product_patterns);
156 } 156 }
157 157
158 function getDestinationFromMessage(msg) { 158 function getDestinationFromMessage(msg) {
159 return getPatternsFromMessage(msg, imConfig.destination_patterns); 159 return getPatternsFromMessage(msg, imConfig.destination_patterns);
160 } 160 }
161 161
162 function getSnFromMessage(msg) { 162 function getSnFromMessage(msg) {
163 return getPatternsFromMessage(msg, imConfig.sn_patterns); 163 return getPatternsFromMessage(msg, imConfig.sn_patterns);
164 } 164 }
165 165
166 function getRcFromMessage(msg) { 166 function getRcFromMessage(msg) {
167 var rcs = imConfig.response_codes; 167 var rcs = imConfig.response_codes;
168 var rcsCount = rcs.length; 168 var rcsCount = rcs.length;
169 169
170 for (var i = 0; i < rcsCount; i++) { 170 for (var i = 0; i < rcsCount; i++) {
171 171
172 var item = rcs[i]; 172 var item = rcs[i];
173 var re = new RegExp(item.pattern); 173 var re = new RegExp(item.pattern);
174 if (msg.search(re) != -1) { 174 if (msg.search(re) != -1) {
175 return item.rc; 175 return item.rc;
176 } 176 }
177 177
178 } 178 }
179 return '68'; 179 return '68';
180 } 180 }
181 181
182 function isAllowedFrom(sender) { 182 function isAllowedFrom(sender) {
183 if (!config || !config.h2h_out || !config.h2h_out.allowed_response_from) { 183 if (!config || !config.h2h_out || !config.h2h_out.allowed_response_from) {
184 return true; 184 return true;
185 } 185 }
186 186
187 whitelist = config.h2h_out.allowed_response_from.split(','); 187 whitelist = config.h2h_out.allowed_response_from.split(',');
188 whitelistCount = whitelist.length; 188 whitelistCount = whitelist.length;
189 189
190 for(var i=0; i<whitelistCount; i++) { 190 for(var i=0; i<whitelistCount; i++) {
191 if (sender == whitelist[i]) { 191 if (sender == whitelist[i]) {
192 return true; 192 return true;
193 } 193 }
194 } 194 }
195 195
196 return false; 196 return false;
197 } 197 }
198 198
199 function checkForSameDayDuplicate(task, cbNoDupe, cbDupe, cbDupeWithSameReqId) { 199 function checkForSameDayDuplicate(task, cbNoDupe, cbDupe, cbDupeWithSameReqId) {
200 getTask(task.remoteProduct, task.destination, function(err, archivedTask) { 200 getTask(task.remoteProduct, task.destination, function(err, archivedTask) {
201 if (err) { 201 if (err) {
202 logger.warn('Error on checking same day duplicate', {task: task}); 202 logger.warn('Error on checking same day duplicate', {task: task});
203 cbNoDupe(task); 203 cbNoDupe(task);
204 return; 204 return;
205 } 205 }
206 206
207 if (archivedTask && archivedTask.requestId) { 207 if (archivedTask && archivedTask.requestId) {
208 if (cbDupeWithSameReqId && task.requestId == archivedTask.requestId) { 208 if (cbDupeWithSameReqId && task.requestId == archivedTask.requestId) {
209 logger.verbose('Duplicate trx on same day with same requestId', {task: task}); 209 logger.verbose('Duplicate trx on same day with same requestId', {task: task});
210 cbDupeWithSameReqId(task, archivedTask); 210 cbDupeWithSameReqId(task, archivedTask);
211 return; 211 return;
212 } 212 }
213 213
214 logger.verbose('Duplicate trx on same day', {task: task, archivedTask: archivedTask}); 214 logger.verbose('Duplicate trx on same day', {task: task, archivedTask: archivedTask});
215 cbDupe(task, archivedTask); 215 cbDupe(task, archivedTask);
216 return; 216 return;
217 } 217 }
218 218
219 cbNoDupe(task); 219 cbNoDupe(task);
220 }); 220 });
221 } 221 }
222 222
223 function registerResendDelay(task) { 223 function registerResendDelay(task) {
224 if (!task.requestId) { 224 if (!task.requestId) {
225 logger.warn('Invalid task on resendDelay') 225 logger.warn('Invalid task on resendDelay')
226 return; 226 return;
227 } 227 }
228 228
229 if (!config || !config.globals || !config.globals.auto_resend_on_delay_secs) { 229 if (!config || !config.globals || !config.globals.auto_resend_on_delay_secs) {
230 return; 230 return;
231 } 231 }
232 232
233 if (!partner || !partner.topupRequest) { 233 if (!partner || !partner.topupRequest) {
234 logger.warn('Skip request resend delay because partner.topupRequest is not exists'); 234 logger.warn('Skip request resend delay because partner.topupRequest is not exists');
235 return; 235 return;
236 } 236 }
237 237
238 var retry = 10; 238 var retry = 10;
239 var oldHandler = resendHandlers.get(task.requestId); 239 var oldHandler = resendHandlers.get(task.requestId);
240 if (oldHandler) { 240 if (oldHandler) {
241 retry = oldHandler.retry - 1; 241 retry = oldHandler.retry - 1;
242 } 242 }
243 243
244 if (retry <= 0) { 244 if (retry <= 0) {
245 logger.verbose('Resend delay retry exceeded', {task: task}); 245 logger.verbose('Resend delay retry exceeded', {task: task});
246 cancelResendDelay(task); 246 cancelResendDelay(task);
247 return; 247 return;
248 } 248 }
249 249
250 logger.info('Resending task request', {task: task}); 250 logger.info('Resending task request', {task: task});
251 var handlerData = { 251 var handlerData = {
252 handler: setTimeout(partner.topupRequest, config.globals.auto_resend_on_delay_secs, task), 252 handler: setTimeout(partner.topupRequest, config.globals.auto_resend_on_delay_secs, task),
253 task: task, 253 task: task,
254 retry: retry 254 retry: retry
255 } 255 }
256 256
257 resendHandlers.set(task.requestId, handlerData); 257 resendHandlers.set(task.requestId, handlerData);
258 } 258 }
259 259
260 function cancelResendDelay(task) { 260 function cancelResendDelay(task) {
261 if (!task || !task.requestId) { 261 if (!task || !task.requestId) {
262 logger.warn('Invalid task on cancelResendDelay'); 262 logger.warn('Invalid task on cancelResendDelay');
263 return; 263 return;
264 } 264 }
265 265
266 var oldHandler = resendHandlers.get(task.requestId); 266 var oldHandler = resendHandlers.get(task.requestId);
267 if (!oldHandler) { 267 if (!oldHandler) {
268 return; 268 return;
269 } 269 }
270 270
271 logger.verbose('Canceling resend delay', {task: task}); 271 logger.verbose('Canceling resend delay', {task: task});
272 272
273 try { 273 try {
274 if (oldHandler.handler) { 274 if (oldHandler.handler) {
275 clearTimeout(oldHandler.handler); 275 clearTimeout(oldHandler.handler);
276 } 276 }
277 } 277 }
278 catch(e) {}; 278 catch(e) {};
279 279
280 try { 280 try {
281 resendHandlers.del(task.requestId); 281 resendHandlers.del(task.requestId);
282 } 282 }
283 catch(e) {}; 283 catch(e) {};
284 } 284 }
285 285
286 exports.init = init; 286 exports.init = init;
287 exports.start = init; 287 exports.start = init;
288 exports.getPatternFromMessage = getPatternFromMessage; 288 exports.getPatternFromMessage = getPatternFromMessage;
289 exports.getPatternsFromMessage = getPatternsFromMessage; 289 exports.getPatternsFromMessage = getPatternsFromMessage;
290 exports.saveTask = saveTask; 290 exports.saveTask = saveTask;
291 exports.getTask = getTask; 291 exports.getTask = getTask;
292 exports.readImConfig = readImConfig; 292 exports.readImConfig = readImConfig;
293 exports.createMessage = createMessage; 293 exports.createMessage = createMessage;
294 exports.getRemoteProductFromMessage = getRemoteProductFromMessage; 294 exports.getRemoteProductFromMessage = getRemoteProductFromMessage;
295 exports.getDestinationFromMessage = getDestinationFromMessage; 295 exports.getDestinationFromMessage = getDestinationFromMessage;
296 exports.getRcFromMessage = getRcFromMessage; 296 exports.getRcFromMessage = getRcFromMessage;
297 exports.getSnFromMessage = getSnFromMessage; 297 exports.getSnFromMessage = getSnFromMessage;
298 exports.isAllowedFrom = isAllowedFrom; 298 exports.isAllowedFrom = isAllowedFrom;
299 exports.checkForSameDayDuplicate = checkForSameDayDuplicate; 299 exports.checkForSameDayDuplicate = checkForSameDayDuplicate;
300 exports.deleteTask = deleteTask; 300 exports.deleteTask = deleteTask;
301 exports.registerResendDelay = registerResendDelay; 301 exports.registerResendDelay = registerResendDelay;
302 exports.cancelResendDelay = cancelResendDelay;
302 303