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