Commit adeaa884bb9ff8a6d40939794c4c7ef38fb8cc57

Authored by Adhidarma Hadiwinoto
1 parent db8d24625a
Exists in master

Retry in 15 minutes on failed

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

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