Commit 22b2e217b4f8daaef4446974beba392969ccca30

Authored by Adhidarma Hadiwinoto
1 parent 12f4a793da
Exists in master

failed handler retry max 300 secs

Showing 1 changed file with 7 additions and 9 deletions Inline Diff

lib/smstools-handler/failed.js
1 const fs = require('fs'); 1 const fs = require('fs');
2 const path = require('path'); 2 const path = require('path');
3 const moment = require('moment'); 3 const moment = require('moment');
4 const logger = require('komodo-sdk/logger'); 4 const logger = require('komodo-sdk/logger');
5 const mailparser = require('../mailparser-wrapper'); 5 const mailparser = require('../mailparser-wrapper');
6 const config = require('../../config'); 6 const config = require('../../config');
7 7
8 const eventType = 'FAILED'; 8 const eventType = 'FAILED';
9 const maxSecondsToRetry = 5 * 60;
9 10
10 module.exports = async (msgFilename) => { 11 module.exports = async (msgFilename) => {
11 const msg = await fs.promises.readFile(msgFilename); 12 const msg = await fs.promises.readFile(msgFilename);
12 13
13 if (!msg) { 14 if (!msg) {
14 logger.warn('Sent failed detected but we can not read message file', { eventType, msgFile: msgFilename }); 15 logger.warn('Sent failed detected but we can not read message file', { eventType, msgFile: msgFilename });
15 return; 16 return;
16 } 17 }
17 18
18 const parsedMsg = await mailparser(msg); 19 const parsedMsg = await mailparser(msg);
19 if (!parsedMsg || !parsedMsg.headers) { 20 if (!parsedMsg || !parsedMsg.headers) {
20 logger.warn('Sent failed detected and we can not parsed message file', { 21 logger.warn('Sent failed detected and we can not parsed message file', {
21 eventType, 22 eventType,
22 msgFile: msgFilename, 23 msgFile: msgFilename,
23 msgFileContent: (msg || '').toString(), 24 msgFileContent: (msg || '').toString(),
24 }); 25 });
25 return; 26 return;
26 } 27 }
27 28
28 const to = parsedMsg.headers.get('to').text; 29 const to = parsedMsg.headers.get('to').text;
29 const modem = parsedMsg.headers.get('modem'); 30 const modem = parsedMsg.headers.get('modem');
30 const imsi = parsedMsg.headers.get('imsi'); 31 const imsi = parsedMsg.headers.get('imsi');
31 const imei = parsedMsg.headers.get('imei'); 32 const imei = parsedMsg.headers.get('imei');
32 const failReason = parsedMsg.headers.get('fail_reason'); 33 const failReason = parsedMsg.headers.get('fail_reason');
33 const failed = parsedMsg.headers.get('failed'); 34 const failed = parsedMsg.headers.get('failed');
34 const { text } = parsedMsg; 35 const { text } = parsedMsg;
35 36
36 const originalTsMatched = msgFilename.match(/komodo\.((\d+)_(\d+))/); 37 const originalTsMatched = msgFilename.match(/komodo\.((\d+)_(\d+))/);
37 const originalTs = originalTsMatched && originalTsMatched[1]; 38 const originalTs = originalTsMatched && originalTsMatched[1];
38 const originalTsParsed = originalTs && moment(originalTs, 'YYYYMMDD_HHmmss'); 39 const originalTsParsed = originalTs && moment(originalTs, 'YYYYMMDD_HHmmss');
39 40
40 const deltaTimeMs = originalTsParsed && Number(new Date() - originalTsParsed); 41 const deltaTimeMs = originalTsParsed && Number(new Date() - originalTsParsed);
41 const retry = (deltaTimeMs && (deltaTimeMs < (15 * 60 * 1000))) 42 const retry = (deltaTimeMs && (deltaTimeMs < (maxSecondsToRetry * 1000)))
42 && !config.smstools_disable_retry_on_failed; 43 && !config.smstools_disable_retry_on_failed;
43 44
44 logger.verbose('Sent failed detected', { 45 logger.verbose('Sent failed detected', {
45 eventType, 46 eventType,
46 msgFile: msgFilename, 47 msgFile: msgFilename,
47 to, 48 to,
48 modem, 49 modem,
49 imsi, 50 imsi,
50 imei, 51 imei,
51 failReason, 52 failReason,
52 failed, 53 failed,
53 text,
54 originalTsParsed, 54 originalTsParsed,
55 deltaTimeMs, 55 deltaTimeMs,
56 maxSecondsToRetry,
57 configAllowRetry: config.smstools_disable_retry_on_failed,
56 retry, 58 retry,
59 text,
60 textLength: text.length,
57 }); 61 });
58 62
59 if (!retry) { 63 if (!retry) {
60 logger.verbose('Not retry because of expired message', {
61 eventType,
62 msgFile: msgFilename,
63 to,
64 text,
65 });
66 return; 64 return;
67 } 65 }
68 66
69 try { 67 try {
70 await fs.promises.unlink(msgFilename); 68 await fs.promises.unlink(msgFilename);
71 } catch (e) { 69 } catch (e) {
72 logger.warn(`Can not unlink failed message. ${e.message || e.toString()}`, { 70 logger.warn(`Can not unlink failed message for send retry. ${e.message || e.toString()}`, {
73 eventType, 71 eventType,
74 msgFile: msgFilename, 72 msgFile: msgFilename,
75 to, 73 to,
76 text, 74 text,
77 }); 75 });
78 return; 76 return;
79 } 77 }
80 78
81 const newMessageContent = ` 79 const newMessageContent = `
82 To: ${to} 80 To: ${to}
83 81
84 ${text} 82 ${text}
85 `.trim(); 83 `.trim();
86 84
87 const outboxDir = config.outbox_dir || '/var/spool/sms/outgoing'; 85 const outboxDir = config.outbox_dir || '/var/spool/sms/outgoing';
88 const newFileName = `${outboxDir}/${path.basename(msgFilename)}`; 86 const newFileName = `${outboxDir}/${path.basename(msgFilename)}`;
89 87
90 try { 88 try {
91 fs.promises.writeFile(newFileName, newMessageContent, { mode: 0o660 }); 89 fs.promises.writeFile(newFileName, newMessageContent, { mode: 0o660 });
92 } catch (e) { 90 } catch (e) {
93 logger.warn(`Can not create retry file. ${e.message || e.toString()}`, { 91 logger.warn(`Can not create retry file. ${e.message || e.toString()}`, {
94 eventType, 92 eventType,
95 msgFile: msgFilename, 93 msgFile: msgFilename,
96 newFileName, 94 newFileName,
97 to, 95 to,
98 text, 96 text,
99 }); 97 });
100 98
101 return; 99 return;
102 } 100 }
103 101
104 logger.info('Retry file written', { 102 logger.info('Retry file written', {
105 eventType, 103 eventType,
106 msgFile: msgFilename, 104 msgFile: msgFilename,
107 newFileName, 105 newFileName,
108 to, 106 to,