diff --git a/lib/smstools-handler/failed.js b/lib/smstools-handler/failed.js index 8e2ddf3..686aa3f 100644 --- a/lib/smstools-handler/failed.js +++ b/lib/smstools-handler/failed.js @@ -1,6 +1,9 @@ const fs = require('fs'); +const path = require('path'); +const moment = require('moment'); const logger = require('komodo-sdk/logger'); const mailparser = require('../mailparser-wrapper'); +const config = require('../../config'); const eventType = 'FAILED'; @@ -30,8 +33,12 @@ module.exports = async (msgFilename) => { const failed = parsedMsg.headers.get('failed'); const { text } = parsedMsg; - const originalTsMatched = msgFilename.match(/komodo\.(\d+)_(d+)/); + const originalTsMatched = msgFilename.match(/komodo\.((\d+)_(\d+))/); + const originalTs = originalTsMatched && originalTsMatched[1]; + const originalTsParsed = originalTs && moment(originalTs, 'YYYYMMDD_HHmmss'); + const deltaTimeMs = originalTsParsed && Number(new Date() - originalTsParsed); + const retry = !!(deltaTimeMs && (deltaTimeMs < (15 * 60 * 1000))); logger.verbose('Sent failed detected', { eventType, @@ -43,6 +50,38 @@ module.exports = async (msgFilename) => { failReason, failed, text, - originalTsMatched, + originalTsParsed, + deltaTimeMs, + retry, }); + + if (!retry) return; + + try { + await fs.promises.unlink(msgFilename); + } catch (e) { + logger.warn(`Can not unlink failed message. ${e.message || e.toString()}`, { + eventType, + msgFile: msgFilename, + }); + return; + } + + const newMessageContent = ` +To: ${to} + +${text} + `.trim(); + + const outboxDir = config.outbox_dir || '/var/spool/sms/outgoing'; + const newFileName = `${outboxDir}/${path.basename(msgFilename)}`; + + try { + fs.promises.writeFile(newFileName, newMessageContent, { mode: 0o660 }); + } catch (e) { + logger.warn(`Can not create retry file. ${e.message || e.toString()}`, { + eventType, + msgFile: msgFilename, + }); + } };