diff --git a/lib/message-handler.js b/lib/message-handler.js index dcd21a1..e4eeeae 100644 --- a/lib/message-handler.js +++ b/lib/message-handler.js @@ -40,6 +40,52 @@ export default async function messageHandler(recipeMap, req, res) { const { logger } = context; + const handleError = async (error) => { + if (error.rejected) { + logger.error( + `Rejected message with correlationId: ${correlationId}. Error: ${error}. Message: ${JSON.stringify(message)}` + ); + await rejectMessage( + { ...message, error: { message: error.extraMessage } }, + { key, correlationId, parentCorrelationId, siblingCount } + ); + metrics.rejectedMessages.inc(); + return 200; + } + if (error.retry) { + logger.warn( + `Retrying message ${messageId} with correlationId: :${correlationId}. Error: ${error}. Message: ${JSON.stringify( + message + )}` + ); + metrics.retriedMessages.inc(); + return 400; + } + if (error.unrecoverable && !key.endsWith(".unrecoverable")) { + try { + // Trigger the unrecoverable handler by publishing a message with the .unrecoverable suffix + await publishMessage( + { ...message, error: { message: error.extraMessage } }, + { key: `${key}.unrecoverable`, correlationId, parentCorrelationId, siblingCount } + ); + return 200; + } catch (publishErr) { + logger.error( + `Unable to handle unrecoverable message with correlationId: ${correlationId}. Error: ${error}. Message: ${JSON.stringify( + message + )}` + ); + return 500; + } + } + if (deliveryAttempt < 10) { + logger.warn(`Unexpected error attempt: ${deliveryAttempt} ${error.message}`); + } else { + logger.error(`Unexpected error ${error.message}`); + } + return null; + }; + if (!key) { logger.error(`Got message without key ${messageId}`); return res.status(400).send(); @@ -124,6 +170,8 @@ export default async function messageHandler(recipeMap, req, res) { { key: `${key}.processed`, correlationId, parentCorrelationId, siblingCount } ); } catch (err) { + const status = await handleError(err); + if (status) return res.status(status).send(); return res.status(500).send(); } @@ -241,48 +289,8 @@ export default async function messageHandler(recipeMap, req, res) { return res.status(200).send(); } catch (error) { - if (error.rejected) { - logger.error( - `Rejected message with correlationId: ${correlationId}. Error: ${error}. Message: ${JSON.stringify(message)}` - ); - await rejectMessage( - { ...message, error: { message: error.extraMessage } }, - { key, correlationId, parentCorrelationId, siblingCount } - ); - metrics.rejectedMessages.inc(); - return res.status(200).send(); - } - if (error.retry) { - logger.warn( - `Retrying message ${messageId} with correlationId: :${correlationId}. Error: ${error}. Message: ${JSON.stringify( - message - )}` - ); - metrics.retriedMessages.inc(); - return res.status(400).send(); - } - if (error.unrecoverable) { - try { - // Trigger the unrecoverable handler by publishing a message with the .unrecoverable suffix - await publishMessage( - { ...message, error: { message: error.extraMessage } }, - { key: `${key}.unrecoverable`, correlationId, parentCorrelationId, siblingCount } - ); - return res.status(200).send(); - } catch (publishErr) { - logger.error( - `Unable to handle unrecoverable message with correlationId: ${correlationId}. Error: ${error}. Message: ${JSON.stringify( - message - )}` - ); - return res.status(500).send(); - } - } - if (deliveryAttempt < 10) { - logger.warn(`Unexpected error attempt: ${deliveryAttempt} ${error.message}`); - } else { - logger.error(`Unexpected error ${error.message}`); - } + const status = await handleError(error); + if (status) return res.status(status).send(); return res.status(500).send(); } } diff --git a/package-lock.json b/package-lock.json index 7a1a542..dbd7e25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bonniernews/b0rker", - "version": "7.1.1", + "version": "7.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bonniernews/b0rker", - "version": "7.1.1", + "version": "7.2.0", "license": "MIT", "dependencies": { "@bonniernews/gcp-push-metrics": "^3.2.1", diff --git a/package.json b/package.json index bf45fb6..028622a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bonniernews/b0rker", - "version": "7.1.1", + "version": "7.2.0", "engines": { "node": ">=16" },