newrelic
Version:
New Relic agent
144 lines (128 loc) • 3.82 kB
JavaScript
/*
* Copyright 2024 New Relic Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
const {
MessageSpec,
params: { QueueMessageParameters }
} = require('../../shim/specs')
const TEMP_RE = /^amq\./
/**
* Wrapper around message handler to pass host/port
*
* @param {object} params to function
* @param {string} params.host hostname
* @param {number} params.port port
* @returns {function} message handler
*/
function describeMessage({ host, port }) {
/**
* Extracts the appropriate messageHandler parameters for the consume method.
*
* @param {Shim} shim instance of shim
* @param {Array} args arguments passed to the consume method
* @returns {object} message params
*/
return function messageHandler(shim, args) {
const [message] = args
if (!message?.properties) {
shim.logger.debug({ message }, 'Failed to find message in consume arguments.')
return null
}
const parameters = getParametersFromMessage({ message, host, port })
let exchangeName = message?.fields?.exchange || 'Default'
if (TEMP_RE.test(exchangeName)) {
exchangeName = null
}
return new MessageSpec({
destinationName: exchangeName,
destinationType: shim.EXCHANGE,
routingKey: message?.fields?.routingKey,
headers: message.properties.headers,
parameters
})
}
}
/**
* Sets the relevant message parameters
*
* @param {object} params to function
* @param {object} params.parameters object used to store the message parameters
* @param {object} params.fields fields from the sendMessage method
* @param {string} params.host hostname
* @param {number} params.port port
* @returns {QueueMessageParameters} parameters updated parameters
*/
function getParameters({ parameters, fields, host, port }) {
if (fields.routingKey) {
parameters.routing_key = fields.routingKey
}
if (fields.correlationId) {
parameters.correlation_id = fields.correlationId
}
if (fields.replyTo) {
parameters.reply_to = fields.replyTo
}
if (host) {
parameters.host = host
}
if (port) {
parameters.port = port
}
return new QueueMessageParameters(parameters)
}
/**
* Sets the QueueMessageParameters from the amqp message
*
* @param {object} params to function
* @param {object} params.message queue message
* @param {string} params.host host
* @param {number} params.port port
* @returns {QueueMessageParameters} parameters from message
*/
function getParametersFromMessage({ message, host, port }) {
const parameters = Object.create(null)
getParameters({ parameters, fields: message.fields, host, port })
getParameters({ parameters, fields: message.properties })
return parameters
}
/**
* Helper to set the appropriate value of the callback property
* in the spec. If it's a promise set to null otherwise set it to `shim.LAST`
*
* @param {Shim} shim instance of shim
* @param {boolean} promiseMode is this promise based?
* @returns {string|null} appropriate value
*/
function setCallback(shim, promiseMode) {
return promiseMode ? null : shim.LAST
}
/**
* Parses the connection args to return host/port
*
* @param {string|object} connArgs connection arguments
* @returns {object} {host, port }
*/
function parseConnectionArgs({ shim, connArgs }) {
const params = {}
if (shim.isString(connArgs)) {
connArgs = new URL(connArgs)
params.host = connArgs.hostname
if (connArgs.port) {
params.port = parseInt(connArgs.port, 10)
}
} else {
params.port = connArgs.port || (connArgs.protocol === 'amqp' ? 5672 : 5671)
params.host = connArgs.hostname
}
return params
}
module.exports = {
describeMessage,
getParameters,
getParametersFromMessage,
parseConnectionArgs,
setCallback,
TEMP_RE
}