From 9a71c58a90cd0a77572275576a87ab677f9d53c1 Mon Sep 17 00:00:00 2001 From: Martin <42486612+kriiv@users.noreply.github.com> Date: Sun, 22 Sep 2024 15:57:52 +1000 Subject: [PATCH] config validation & webhook retry --- server.js | 58 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/server.js b/server.js index ed9148a..f1555a0 100644 --- a/server.js +++ b/server.js @@ -25,21 +25,43 @@ const logger = winston.createLogger({ ] }); -const webhookQueue = new Queue(async function (parsed, cb) { - try { - await sendToWebhook(parsed); - logger.info('Successfully sent to webhook'); - cb(null); - } catch (error) { - logger.error('Webhook error:', { message: error.message, stack: error.stack }); - if (error.response) { - logger.error('Webhook response error:', { - status: error.response.status, - data: error.response.data - }); +function validateConfig() { + const requiredKeys = ['PORT', 'SMTP_SECURE', 'WEBHOOK_URL', 'WEBHOOK_CONCURRENCY']; + for (const key of requiredKeys) { + if (!(key in config)) { + throw new Error(`Missing required configuration: ${key}`); } - cb(error); } +} + +const webhookQueue = new Queue(async function (parsed, cb) { + const maxRetries = 3; + let retries = 0; + + const attemptWebhook = async () => { + try { + await sendToWebhook(parsed); + logger.info('Successfully sent to webhook'); + cb(null); + } catch (error) { + logger.error('Webhook error:', { message: error.message, stack: error.stack }); + if (error.response) { + logger.error('Webhook response error:', { + status: error.response.status, + data: error.response.data + }); + } + if (retries < maxRetries) { + retries++; + logger.info(`Retrying webhook (attempt ${retries}/${maxRetries})`); + setTimeout(attemptWebhook, 1000 * retries); + } else { + cb(error); + } + } + }; + + attemptWebhook(); }, { concurrent: config.WEBHOOK_CONCURRENCY || 5 }); const server = new SMTPServer({ @@ -94,4 +116,12 @@ process.on('SIGTERM', () => { process.on('SIGINT', () => { gracefulShutdown('SIGINT signal received'); -}); \ No newline at end of file +}); + +// Add configuration validation at startup +try { + validateConfig(); +} catch (error) { + logger.error('Configuration error:', { message: error.message }); + process.exit(1); +} \ No newline at end of file