@cumulus/message
Version:
Utilities for building and parsing Cumulus messages
194 lines • 7.62 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generatePdrApiRecordFromMessage = exports.getPdrPercentCompletion = exports.getMessagePdrStats = exports.getMessagePdrFailedExecutions = exports.getMessagePdrCompletedExecutions = exports.getMessagePdrRunningExecutions = exports.getMessagePdrName = exports.getMessagePdrPANMessage = exports.getMessagePdrPANSent = exports.messageHasPdr = exports.getMessagePdr = void 0;
const errors_1 = require("@cumulus/errors");
const logger_1 = __importDefault(require("@cumulus/logger"));
const Collections_1 = require("./Collections");
const Executions_1 = require("./Executions");
const Providers_1 = require("./Providers");
const workflows_1 = require("./workflows");
const logger = new logger_1.default({ sender: '@cumulus/message/PDRs' });
/**
* Get the PDR object from a workflow message, if any.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message object
* @returns {undefined|Object} The PDR object
*
* @alias module:PDRs
*/
const getMessagePdr = (message) => message.payload?.pdr;
exports.getMessagePdr = getMessagePdr;
/**
* Determine if message has a PDR.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message object
* @returns {boolean} true if message has a PDR
*
* @alias module:PDRs
*/
const messageHasPdr = (message) => (0, exports.getMessagePdr)(message) !== undefined;
exports.messageHasPdr = messageHasPdr;
/**
* Get the PAN sent status from a workflow message, if any.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message
* @returns {boolean} The PAN sent status
*
* @alias module:PDRs
*/
const getMessagePdrPANSent = (message) => (0, exports.getMessagePdr)(message)?.PANSent ?? false;
exports.getMessagePdrPANSent = getMessagePdrPANSent;
/**
* Get the PAN message status from a workflow message, if any.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message
* @returns {string} The PAN message
*
* @alias module:PDRs
*/
const getMessagePdrPANMessage = (message) => (0, exports.getMessagePdr)(message)?.PANmessage ?? 'N/A';
exports.getMessagePdrPANMessage = getMessagePdrPANMessage;
/**
* Get the PDR name from a workflow message, if any.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message
* @returns {string} The PDR name
*
* @alias module:PDRs
*/
const getMessagePdrName = (message) => (0, exports.getMessagePdr)(message)?.name;
exports.getMessagePdrName = getMessagePdrName;
/**
* Get the number of running executions for a PDR, if any.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message
* @returns {number} Number of running executions
*
* @alias module:PDRs
*/
const getMessagePdrRunningExecutions = (message) => (message.payload.running ?? []).length;
exports.getMessagePdrRunningExecutions = getMessagePdrRunningExecutions;
/**
* Get the number of completed executions for a PDR, if any.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message
* @returns {number} Number of completed executions
*
* @alias module:PDRs
*/
const getMessagePdrCompletedExecutions = (message) => (message.payload.completed ?? []).length;
exports.getMessagePdrCompletedExecutions = getMessagePdrCompletedExecutions;
/**
* Get the number of failed executions for a PDR, if any.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message
* @returns {number} Number of failed executions
*
* @alias module:PDRs
*/
const getMessagePdrFailedExecutions = (message) => (message.payload.failed ?? []).length;
exports.getMessagePdrFailedExecutions = getMessagePdrFailedExecutions;
/**
* Get the PDR stats from a workflow message, if any.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message
* @returns {PdrStats}
* Object tracking the status of executions triggered by the PDR
*
* @alias module:PDRs
*/
const getMessagePdrStats = (message) => {
const processing = (0, exports.getMessagePdrRunningExecutions)(message);
const completed = (0, exports.getMessagePdrCompletedExecutions)(message);
const failed = (0, exports.getMessagePdrFailedExecutions)(message);
const stats = {
processing,
completed,
failed,
total: processing + completed + failed,
};
return stats;
};
exports.getMessagePdrStats = getMessagePdrStats;
/**
* Get the percent completion of PDR executions
*
* @param {PdrStats} stats - Stats tracking PDR executions
* @returns {number} Percent completion of PDR executions
*
* @alias module:PDRs
*/
const getPdrPercentCompletion = (stats) => {
let progress = 0;
if (stats.processing > 0 && stats.total > 0) {
progress = ((stats.total - stats.processing) / stats.total) * 100;
}
else if (stats.processing === 0 && stats.total > 0) {
progress = 100;
}
return progress;
};
exports.getPdrPercentCompletion = getPdrPercentCompletion;
/**
* Generate a PDR record for the API from the message.
*
* @param {MessageWithOptionalPayloadPdr} message - A workflow message object
* @param {string} [updatedAt] - Optional updated timestamp to apply to record
* @returns {ApiPdr} An PDR API record
*
* @alias module:Executions
*/
const generatePdrApiRecordFromMessage = (message, updatedAt = Date.now()) => {
const pdr = (0, exports.getMessagePdr)(message);
// We got a message with no PDR (OK)
if (!pdr) {
logger.info('No PDRs to process on the message');
return undefined;
}
// We got a message with a PDR but no name to identify it (Not OK)
if (!pdr.name) {
throw new errors_1.CumulusMessageError(`Could not find name on PDR object ${JSON.stringify(pdr)}`);
}
const collectionId = (0, Collections_1.getCollectionIdFromMessage)(message);
if (!collectionId) {
throw new errors_1.CumulusMessageError('meta.collection required to generate a PDR record');
}
const providerId = (0, Providers_1.getMessageProviderId)(message);
if (!providerId) {
throw new errors_1.CumulusMessageError('meta.provider required to generate a PDR record');
}
const status = (0, workflows_1.getMetaStatus)(message);
if (!status) {
throw new errors_1.CumulusMessageError('meta.status required to generate a PDR record');
}
const arn = (0, Executions_1.getMessageExecutionArn)(message);
if (!arn) {
throw new errors_1.CumulusMessageError('cumulus_meta.state_machine and cumulus_meta.execution_name required to generate a PDR record');
}
const execution = (0, Executions_1.getExecutionUrlFromArn)(arn);
const stats = (0, exports.getMessagePdrStats)(message);
const progress = (0, exports.getPdrPercentCompletion)(stats);
const now = Date.now();
const workflowStartTime = (0, workflows_1.getMessageWorkflowStartTime)(message);
const record = {
pdrName: pdr.name,
collectionId,
status,
provider: providerId,
progress,
execution,
PANSent: (0, exports.getMessagePdrPANSent)(message),
PANmessage: (0, exports.getMessagePdrPANMessage)(message),
stats,
createdAt: (0, workflows_1.getMessageWorkflowStartTime)(message),
timestamp: now,
updatedAt,
duration: (0, workflows_1.getWorkflowDuration)(workflowStartTime, now),
};
return record;
};
exports.generatePdrApiRecordFromMessage = generatePdrApiRecordFromMessage;
//# sourceMappingURL=PDRs.js.map