Skip to content

Commit da5beaa

Browse files
authored
Merge pull request #264 from konecty/fix/emails
Fix: add timeout to send email
2 parents c3ce75a + 5eaf0ae commit da5beaa

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

src/imports/mailConsumer/index.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import { MetaObject } from '@imports/model/MetaObject';
2020
import { renderTemplate } from '../template';
2121
import { logger } from '../utils/logger';
2222
import { errorReturn, successReturn } from '../utils/return';
23+
import { withTimeout } from '../utils/timeout';
2324

2425
const MAIL_CONSUME_SCHEDULE = process.env.MAIL_CONSUME_SCHEDULE || '*/1 * * * * *';
26+
const SEND_EMAIL_TIMEOUT = Number(process.env.SEND_EMAIL_TIMEOUT ?? 30e3);
2527
const TZ = process.env.TZ || 'America/Sao_Paulo';
2628

2729
const consumeCronJob = new CronJob(MAIL_CONSUME_SCHEDULE, consume, null, false, TZ);
@@ -107,6 +109,7 @@ async function sendEmail(record) {
107109
if (server) {
108110
var serverHost = get(server, 'transporter.options.host');
109111
try {
112+
logger.trace(`🔜 Sending email to ${mail.to} via [${serverHost || record.server}]`);
110113
const response = await server.sendMail(mail);
111114

112115
if (get(response, 'accepted.length') > 0) {
@@ -197,13 +200,26 @@ async function consume() {
197200
}
198201

199202
await BluebirdPromise.each(range(0, mailCount), async () => {
200-
const updatedRecords = await MetaObject.Collections['Message'].findOneAndUpdate(query, update, options);
203+
try {
204+
await withTimeout(
205+
async () => {
206+
const updatedRecords = await MetaObject.Collections['Message'].findOneAndUpdate(query, update, options);
201207

202-
if (updatedRecords == null || updatedRecords._id == null) {
203-
return;
204-
}
208+
if (updatedRecords == null || updatedRecords._id == null) {
209+
return;
210+
}
205211

206-
return send(updatedRecords);
212+
return send(updatedRecords);
213+
},
214+
SEND_EMAIL_TIMEOUT,
215+
'consume->send',
216+
);
217+
} catch (error) {
218+
logger.error(`📧 Email error: ${error.message}`);
219+
await MetaObject.Collections['Message'].updateOne({ _id: record._id }, { $set: { status: 'Falha no Envio', error: err } });
220+
221+
return errorReturn(err);
222+
}
207223
});
208224

209225
return consumeCronJob.start();

src/imports/utils/timeout.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export async function withTimeout<T>(promise: Promise<T> | (() => Promise<T>), timeout: number, operationName: string): Promise<T> {
2+
if (typeof promise === 'function') {
3+
promise = promise();
4+
}
5+
const result = await Promise.race([promise, new Promise((_, reject) => setTimeout(() => reject(new Error(`${operationName} timed out after ${timeout}ms`)), timeout))]);
6+
return result as T;
7+
}

0 commit comments

Comments
 (0)